From 32cc7a4f65acdeb808282c4201d444dbb2024402 Mon Sep 17 00:00:00 2001 From: furongxin <419481438@qq.com> Date: Tue, 20 May 2025 14:29:37 +0800 Subject: [PATCH] =?UTF-8?q?feat(smartfactory):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=90=AC=E8=BF=90=E7=BB=84=E8=96=AA=E8=B5=84=E7=A1=AE=E8=AE=A4?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加确认搬运组薪资的接口和实现逻辑 - 新增相关的数据结构和枚举定义 - 实现薪资确认后的数据处理和插入员工薪资表 - 优化错误处理和数据校验 --- .../enums/ErrorCodeConstants.java | 2 +- ...ngGroupAmountSpecificationsController.java | 7 +- .../HandlingGroupUserAmountController.java | 9 ++ .../vo/HandlingGroupUserAmountItemVO.java | 4 +- .../vo/HandlingGroupUserAmountRespVO.java | 12 +- .../HandlingGroupUserAmountDO.java | 5 +- .../HandlingGroupUserAmountMapper.java | 5 +- .../HandlingGroupUserAmountService.java | 7 ++ .../HandlingGroupUserAmountServiceImpl.java | 103 ++++++++++++++++++ .../HandlingGroupUserAmountMapper.xml | 31 ++++++ 10 files changed, 170 insertions(+), 15 deletions(-) diff --git a/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ErrorCodeConstants.java b/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ErrorCodeConstants.java index be5fd4ab..0c11893e 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ErrorCodeConstants.java +++ b/zn-module-smartfactory/zn-module-smartfactory-api/src/main/java/cn/iocoder/yudao/module/smartfactory/enums/ErrorCodeConstants.java @@ -40,6 +40,6 @@ public interface ErrorCodeConstants { // ========== 搬运模块 1_000_005_000 ========== ErrorCode CANNOT_FIND_THE_CORRESPONDING_FACTORY_HANDLING_SPECIFICATION = new ErrorCode(1_000_005_001, "找不到对应的工厂搬运规格"); ErrorCode FACTORY_HANDLING_SPECIFICATION_EXISTS = new ErrorCode(1_000_005_002, "工厂搬运规格已存在"); - + ErrorCode SPECIFICATION_USER_AMOUNT_NOT_EXISTS = new ErrorCode(1_000_005_003, "工厂当前月份存在未分配人员数据!"); } diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupamountspecifications/HandlingGroupAmountSpecificationsController.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupamountspecifications/HandlingGroupAmountSpecificationsController.java index f45017c3..3776454d 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupamountspecifications/HandlingGroupAmountSpecificationsController.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupamountspecifications/HandlingGroupAmountSpecificationsController.java @@ -12,10 +12,8 @@ import cn.iocoder.yudao.module.smartfactory.controller.admin.handlinggroupamount import cn.iocoder.yudao.module.smartfactory.controller.admin.handlinggroupuseramount.vo.HandlingGroupUserAmountItemVO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.handlinggroupamountspecifications.HandlingGroupAmountSpecificationsDO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.handlinggroupuseramount.HandlingGroupUserAmountDO; -import cn.iocoder.yudao.module.smartfactory.service.factoryinfo.FactoryInfoService; import cn.iocoder.yudao.module.smartfactory.service.handlinggroupamountspecifications.HandlingGroupAmountSpecificationsService; import cn.iocoder.yudao.module.smartfactory.service.handlinggroupuseramount.HandlingGroupUserAmountService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -47,9 +45,6 @@ public class HandlingGroupAmountSpecificationsController { @Resource private HandlingGroupUserAmountService handlingGroupUserAmountService; - @Resource - private FactoryInfoService factoryInfoService; - @PostMapping("/batchCreate") @Operation(summary = "批量创建搬运组工资规格关联") public CommonResult batchCreate(@Valid @RequestBody HandlingGroupAmountSpecificationsBatchCreateVO vo) { @@ -119,7 +114,7 @@ public class HandlingGroupAmountSpecificationsController { List items = handlingGroupUserAmountMap.get(handlingGroupAmountSpecificationsDO.getId()); if (CollUtil.isNotEmpty(items)) { List handlingGroupUserAmountItemVOS = BeanUtils.toBean(items, HandlingGroupUserAmountItemVO.class); - handlingGroupAmountSpecificationsDO.setHandlingGroupUserAmountItemVOS(handlingGroupUserAmountItemVOS); + handlingGroupAmountSpecificationsDO.setHandlingGroupUserAmountItemVOS(handlingGroupUserAmountItemVOS); } } return success(result); diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupuseramount/HandlingGroupUserAmountController.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupuseramount/HandlingGroupUserAmountController.java index 085de002..f4aca4f8 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupuseramount/HandlingGroupUserAmountController.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupuseramount/HandlingGroupUserAmountController.java @@ -99,6 +99,15 @@ public class HandlingGroupUserAmountController { return success(pageResult); } + @GetMapping("/confirm") + @Operation(summary = "确认搬运组薪资") + public CommonResult confirmHandlingGroupUserAmount(@RequestParam("factoryId") Long factoryId, + @RequestParam("month") String month) { + + handlingGroupUserAmountService.confirmHandlingGroupUserAmount(factoryId, month); + return success(true); + } + @GetMapping("/export-excel") @Operation(summary = "导出搬运组每日个人工资记录 Excel") @OperateLog(type = EXPORT) diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupuseramount/vo/HandlingGroupUserAmountItemVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupuseramount/vo/HandlingGroupUserAmountItemVO.java index 5fac8463..1a9dda46 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupuseramount/vo/HandlingGroupUserAmountItemVO.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupuseramount/vo/HandlingGroupUserAmountItemVO.java @@ -6,7 +6,6 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.math.BigDecimal; -import java.time.LocalDateTime; @Data @ExcelIgnoreUnannotated @@ -22,4 +21,7 @@ public class HandlingGroupUserAmountItemVO { @Schema(description = "搬运组每日个人工资") @ExcelProperty("搬运组每日个人工资") private BigDecimal amount; + + @Schema(description = "状态 0未确认 1已确认") + private Integer status; } diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupuseramount/vo/HandlingGroupUserAmountRespVO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupuseramount/vo/HandlingGroupUserAmountRespVO.java index b0643c52..c4dc4301 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupuseramount/vo/HandlingGroupUserAmountRespVO.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/controller/admin/handlinggroupuseramount/vo/HandlingGroupUserAmountRespVO.java @@ -1,13 +1,12 @@ package cn.iocoder.yudao.module.smartfactory.controller.admin.handlinggroupuseramount.vo; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -import java.util.*; +import lombok.Data; + import java.math.BigDecimal; -import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; -import com.alibaba.excel.annotation.*; @Schema(description = "管理后台 - 搬运组每日个人工资记录 Response VO") @Data @@ -38,6 +37,9 @@ public class HandlingGroupUserAmountRespVO { @ExcelProperty("搬运组每日个人工资") private BigDecimal amount; + @Schema(description = "状态 0.未确认 1.已确认") + private Integer status; + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") private LocalDateTime createTime; diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/dataobject/handlinggroupuseramount/HandlingGroupUserAmountDO.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/dataobject/handlinggroupuseramount/HandlingGroupUserAmountDO.java index 77d7a8b8..b40f7de6 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/dataobject/handlinggroupuseramount/HandlingGroupUserAmountDO.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/dataobject/handlinggroupuseramount/HandlingGroupUserAmountDO.java @@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.math.BigDecimal; @@ -64,4 +63,8 @@ public class HandlingGroupUserAmountDO extends BaseDO { */ private BigDecimal amount; + /** + * 状态 1未确认 2已确认 + */ + private Integer status; } diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/handlinggroupuseramount/HandlingGroupUserAmountMapper.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/handlinggroupuseramount/HandlingGroupUserAmountMapper.java index 5a2057d7..5155c2c3 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/handlinggroupuseramount/HandlingGroupUserAmountMapper.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/dal/mysql/handlinggroupuseramount/HandlingGroupUserAmountMapper.java @@ -14,7 +14,6 @@ import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; -import java.util.TreeMap; /** * 搬运组每日个人工资记录 Mapper @@ -72,4 +71,8 @@ public interface HandlingGroupUserAmountMapper extends BaseMapperX getByHandlingGroupAmountSpecificationsId(@Param("handlingGroupAmountSpecificationsIds") List handlingGroupAmountSpecificationsIds); + + List selectAmountSum(@Param("factoryId") Long factoryId, @Param("month") String month); + + Long selectIsExists(@Param("factoryId") Long factoryId, @Param("month") String month); } diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/handlinggroupuseramount/HandlingGroupUserAmountService.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/handlinggroupuseramount/HandlingGroupUserAmountService.java index 11b875ef..7df2ab95 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/handlinggroupuseramount/HandlingGroupUserAmountService.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/handlinggroupuseramount/HandlingGroupUserAmountService.java @@ -95,4 +95,11 @@ public interface HandlingGroupUserAmountService extends IService getByHandlingGroupAmountSpecificationsId(List handlingGroupAmountSpecificationsIds); + + /** + * 确认搬运工组薪资,确认后添加至员工薪资表 + * @param factoryId + * @param month + */ + void confirmHandlingGroupUserAmount(Long factoryId, String month); } diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/handlinggroupuseramount/HandlingGroupUserAmountServiceImpl.java b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/handlinggroupuseramount/HandlingGroupUserAmountServiceImpl.java index d8a81842..60044ec1 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/handlinggroupuseramount/HandlingGroupUserAmountServiceImpl.java +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/java/cn/iocoder/yudao/module/smartfactory/service/handlinggroupuseramount/HandlingGroupUserAmountServiceImpl.java @@ -1,15 +1,27 @@ package cn.iocoder.yudao.module.smartfactory.service.handlinggroupuseramount; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; +import cn.iocoder.yudao.module.bpm.api.oa.BpmOALoanApi; +import cn.iocoder.yudao.module.bpm.api.oa.vo.loan.BpmOALoanSumDTO; import cn.iocoder.yudao.module.smartfactory.controller.admin.handlinggroupuseramount.dto.StaffWagesPageDTO; import cn.iocoder.yudao.module.smartfactory.controller.admin.handlinggroupuseramount.vo.*; +import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.DeductionItemsVO; +import cn.iocoder.yudao.module.smartfactory.controller.admin.staffsalary.vo.SalarySubjectItemsVO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.handlinggroupamountspecifications.HandlingGroupAmountSpecificationsDO; import cn.iocoder.yudao.module.smartfactory.dal.dataobject.handlinggroupuseramount.HandlingGroupUserAmountDO; +import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staff.StaffDO; +import cn.iocoder.yudao.module.smartfactory.dal.dataobject.staffsalary.StaffSalaryDO; import cn.iocoder.yudao.module.smartfactory.dal.mysql.handlinggroupamountspecifications.HandlingGroupAmountSpecificationsMapper; import cn.iocoder.yudao.module.smartfactory.dal.mysql.handlinggroupuseramount.HandlingGroupUserAmountMapper; +import cn.iocoder.yudao.module.smartfactory.dal.mysql.staffsalary.StaffSalaryMapper; +import cn.iocoder.yudao.module.smartfactory.service.staff.StaffService; +import cn.iocoder.yudao.module.system.api.loan.LoanApi; +import cn.iocoder.yudao.module.system.api.loan.dto.LoanDTO; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @@ -17,8 +29,15 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.*; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.module.smartfactory.enums.ErrorCodeConstants.SPECIFICATION_USER_AMOUNT_NOT_EXISTS; /** * 搬运组每日个人工资记录 Service 实现类 @@ -33,6 +52,19 @@ public class HandlingGroupUserAmountServiceImpl extends ServiceImpl userAmountSums = handlingGroupUserAmountMapper.selectAmountSum(factoryId, month); + if (CollUtil.isEmpty(userAmountSums)) { + throw exception(SPECIFICATION_USER_AMOUNT_NOT_EXISTS); + } + + // 校验 工厂当前月份是否存在未分配搬运工数据 + Long count = handlingGroupUserAmountMapper.selectIsExists(factoryId, month); + if (count > 0L) { + throw exception(SPECIFICATION_USER_AMOUNT_NOT_EXISTS); + } + + // 更新搬运组薪资 状态 + handlingGroupUserAmountMapper.update(null, new LambdaUpdateWrapper() + .set(HandlingGroupUserAmountDO::getStatus, 1) + .eq(HandlingGroupUserAmountDO::getFactoryId, factoryId) + .like(HandlingGroupUserAmountDO::getDateStr, month)); + + // 获取厂区得员工信息 + Set staffIds = convertSet(userAmountSums, HandlingGroupUserAmountDO::getUserId); + List staffDOS = staffService.getList(staffIds); + Map staffMap = convertMap(staffDOS, StaffDO::getId); + + // 获取员工借支记录 + List loanDOS = bpmOALoanApi.getListByStaffId(staffIds, month).getCheckedData(); + Map loanMap = loanDOS.stream() + .collect(Collectors.toMap( + BpmOALoanSumDTO::getSfUserId, + BpmOALoanSumDTO::getTotalAmount, + BigDecimal::add + )); + + // 获取员工剩余的 工资借支金额 + List sysLoanDOS = loanApi.getListByMonth(staffIds, month).getCheckedData(); + Map sysLoanMap = new HashMap<>(); + if (CollUtil.isNotEmpty(sysLoanDOS)) { + sysLoanMap = sysLoanDOS.stream() + .collect(Collectors.toMap(LoanDTO::getUserId, LoanDTO::getRemainingAmount)); + } + + Map finalSysLoanMap = sysLoanMap; + List salaryDOS = userAmountSums.stream().map(item -> { + StaffSalaryDO salaryDO = new StaffSalaryDO() + .setStaffId(item.getUserId()) + .setFactoryId(item.getFactoryId()) + .setMonth(month) + .setPayableAmount(item.getAmount()) + .setReturnAmount(loanMap.getOrDefault(item.getUserId(), BigDecimal.ZERO) + .add(finalSysLoanMap.getOrDefault(item.getUserId(), BigDecimal.ZERO))) + .setDeductionItems(Collections.singletonList( + new DeductionItemsVO() + .setKey("insurance") + .setValue("50"))); + // 设置实发工资 + salaryDO.setRealAmount(salaryDO.getPayableAmount().subtract(salaryDO.getReturnAmount())); + // 设置薪资主体数据 + if (staffMap.get(item.getUserId()).getSalarySubject() != null) { + salaryDO.setSalarySubjectItems(Collections.singletonList( + new SalarySubjectItemsVO() + .setSalarySubjectId(staffMap.get(item.getUserId()).getSalarySubject()) + .setAmount(salaryDO.getPayableAmount()) + )); + } + return salaryDO; + }).collect(Collectors.toList()); + + // 插入工资记录 + staffSalaryMapper.insertBatch(salaryDOS); + } } diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/handlinggroupuseramount/HandlingGroupUserAmountMapper.xml b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/handlinggroupuseramount/HandlingGroupUserAmountMapper.xml index 1a2a9722..c3c2b635 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/handlinggroupuseramount/HandlingGroupUserAmountMapper.xml +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/mapper/handlinggroupuseramount/HandlingGroupUserAmountMapper.xml @@ -149,4 +149,35 @@ + + + +