From 194d4b834b521f77d27437c5c0d7efec369db806 Mon Sep 17 00:00:00 2001 From: shusir <497819738@qq.com> Date: Sat, 28 Feb 2026 18:04:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=89=A9=E6=96=99=E9=80=80=E6=8D=A2?= =?UTF-8?q?=E8=B4=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zt/plat/module/qms/enums/AdjustType.java | 6 + .../admin/MaterialBatchController.java | 3 +- .../admin/MaterialUseEndReuseController.java | 2 +- .../controller/vo/MaterialBatchRespVO.java | 8 + .../vo/MaterialLifecycleDetailSaveReqVO.java | 4 +- .../vo/MaterialLifecycleSaveReqVO.java | 9 - .../vo/MaterialUseEndReuseRespVO.java | 4 + .../dal/dataobject/MaterialBatchDO.java | 10 + .../dataobject/MaterialLifecycleDetailDO.java | 5 +- .../dal/dataobject/MaterialUseEndReuseDO.java | 6 + .../MaterialUseEndReuseDetailMapper.java | 17 ++ .../dal/mapper/MaterialUseEndReuseMapper.java | 16 +- .../material/enums/MaterialFlowType.java | 6 +- .../service/MaterialBatchService.java | 30 ++- .../service/MaterialBatchServiceImpl.java | 61 +++++- .../service/MaterialInfomationService.java | 14 +- .../MaterialInfomationServiceImpl.java | 18 ++ .../service/MaterialLifecycleServiceImpl.java | 206 +++++++++++++++--- .../MaterialStandardSolutionServiceImpl.java | 2 +- .../MaterialUseEndReuseDetailService.java | 22 ++ .../MaterialUseEndReuseDetailServiceImpl.java | 16 ++ .../MaterialUseEndReuseServiceImpl.java | 51 ++++- 22 files changed, 452 insertions(+), 64 deletions(-) create mode 100644 zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/AdjustType.java diff --git a/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/AdjustType.java b/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/AdjustType.java new file mode 100644 index 00000000..c13d41d1 --- /dev/null +++ b/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/AdjustType.java @@ -0,0 +1,6 @@ +package com.zt.plat.module.qms.enums; + +public enum AdjustType { + add, + subtract, +} diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialBatchController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialBatchController.java index 6084480c..8991f500 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialBatchController.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialBatchController.java @@ -18,7 +18,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Operation; -import jakarta.validation.constraints.*; import jakarta.validation.*; import jakarta.servlet.http.*; import java.util.*; @@ -134,7 +133,7 @@ public class MaterialBatchController implements BusinessControllerMarker { @Operation(summary = "获取工段列表") @Parameter(name = "id", description = "物料批次 id", required = true, example = "1054") public CommonResult> getMaterialBatchGongduanList(@RequestParam("id") Long id) { - List list = materialBatchService.getMaterialBatchGongduanList(id); + List list = materialBatchService.getGongduanListByBatIds(Collections.singletonList(id)); return success(BeanUtils.toBean(list, MaterialBatchRespVO.class)); } diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialUseEndReuseController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialUseEndReuseController.java index 6f5f83ab..02ecc88e 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialUseEndReuseController.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialUseEndReuseController.java @@ -55,7 +55,7 @@ public class MaterialUseEndReuseController extends AbstractFileUploadController return success(materialUseEndReuseService.createMaterialUseEndReuse(createReqVO)); } - @PutMapping("/update") +// @PutMapping("/update") @Operation(summary = "更新物料用完标记或清洗回收") @PreAuthorize("@ss.hasPermission('qms:material-use-end-reuse:update')") public CommonResult updateMaterialUseEndReuse(@Valid @RequestBody MaterialUseEndReuseSaveReqVO updateReqVO) { diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchRespVO.java index b5b3a07b..323c76fa 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchRespVO.java @@ -53,6 +53,14 @@ public class MaterialBatchRespVO { @ExcelProperty("总数量") private BigDecimal inboundQuantity; + @Schema(description = "退货数量") + @ExcelProperty("退货数量") + private BigDecimal returnQuantity; + + @Schema(description = "换货数量") + @ExcelProperty("换货数量") + private BigDecimal replaceQuantity; + @Schema(description = "已入库数量") @ExcelProperty("已入库数量") private BigDecimal inboundEndQuantity; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleDetailSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleDetailSaveReqVO.java index 678217a2..59cbe1b6 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleDetailSaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleDetailSaveReqVO.java @@ -3,6 +3,8 @@ package com.zt.plat.module.qms.resource.material.controller.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.math.BigDecimal; + @Schema(description = "管理后台 - 物料通用流程明细新增/修改 Request VO") @Data public class MaterialLifecycleDetailSaveReqVO { @@ -29,7 +31,7 @@ public class MaterialLifecycleDetailSaveReqVO { private Long infomationId; @Schema(description = "影响数量", example = "15772") - private String influenceCount; + private BigDecimal influenceCount; @Schema(description = "明细操作类型,【字典】【jy_material_lifecycle_detail_bsn_type】", example = "1") private String businessType; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleSaveReqVO.java index b709d0e9..290f5998 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleSaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleSaveReqVO.java @@ -47,15 +47,6 @@ public class MaterialLifecycleSaveReqVO { @Schema(description = "表单数据,表单数据") private String formData; -// @Schema(description = "流程实例id", example = "12151") -// private String flowInstanceId; - -// @Schema(description = "提交状态,提交状态,0-未提交,1-已提交", example = "1") -// private Integer submitStatus; - -// @Schema(description = "流程审批状态", example = "1") -// private String flowStatus; - @Schema(description = "所属部门") private String systemDepartmentCode; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialUseEndReuseRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialUseEndReuseRespVO.java index 1de50809..57c23dfb 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialUseEndReuseRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialUseEndReuseRespVO.java @@ -37,6 +37,10 @@ public class MaterialUseEndReuseRespVO { @ExcelProperty("所属部门") private String systemDepartmentCode; + @Schema(description = "部门") + @ExcelProperty("部门") + private String departmentName; + @Schema(description = "备注") @ExcelProperty("备注") private String remark; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialBatchDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialBatchDO.java index a543a437..f0cfed59 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialBatchDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialBatchDO.java @@ -53,6 +53,16 @@ public class MaterialBatchDO extends BusinessBaseDO { @TableField("INB_QTY") private BigDecimal inboundQuantity; /** + * 退货数量 + */ + @TableField("RTN_QTY") + private BigDecimal returnQuantity; + /** + * 换货数量 + */ + @TableField("REP_QTY") + private BigDecimal replaceQuantity; + /** * 已入库数量 */ @TableField("INB_END_QTY") diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialLifecycleDetailDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialLifecycleDetailDO.java index 0fbc808b..f9bc34ec 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialLifecycleDetailDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialLifecycleDetailDO.java @@ -3,6 +3,9 @@ package com.zt.plat.module.qms.resource.material.dal.dataobject; import com.baomidou.mybatisplus.annotation.*; import com.zt.plat.framework.mybatis.core.dataobject.BusinessBaseDO; import lombok.*; + +import java.math.BigDecimal; + /** * 物料通用流程明细 DO * @@ -62,7 +65,7 @@ public class MaterialLifecycleDetailDO extends BusinessBaseDO { * 影响数量 */ @TableField("INFL_CNT") - private String influenceCount; + private BigDecimal influenceCount; /** * 明细操作类型,【字典】【jy_material_lifecycle_detail_bsn_type】 */ diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialUseEndReuseDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialUseEndReuseDO.java index 6fef51d0..fe49b3b2 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialUseEndReuseDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialUseEndReuseDO.java @@ -55,6 +55,12 @@ public class MaterialUseEndReuseDO extends BusinessBaseDO { */ @TableField("SYS_DEPT_CD") private String systemDepartmentCode; + + /** + * 所属部门 + */ + @TableField("DEPT_NAME") + private String departmentName; /** * 备注 */ diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialUseEndReuseDetailMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialUseEndReuseDetailMapper.java index daa1b6f8..ce7c27c7 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialUseEndReuseDetailMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialUseEndReuseDetailMapper.java @@ -60,4 +60,21 @@ public interface MaterialUseEndReuseDetailMapper extends BaseMapperX selectListWithParentInfoAndMaterialInfoByParentIds(List parentIds) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapperX() + .select(MaterialUseEndReuseDetailDO::getId, MaterialUseEndReuseDetailDO::getCreateTime, + MaterialUseEndReuseDetailDO::getParentId, MaterialUseEndReuseDetailDO::getInfomationId) + .select(MaterialUseEndReuseDO::getBusinessType, MaterialUseEndReuseDO::getOperator, MaterialUseEndReuseDO::getOperatorId, + MaterialUseEndReuseDO::getOperatorDate, MaterialUseEndReuseDO::getRemark) + .selectAs(MaterialInfomationDO::getCode, MaterialUseEndReuseDetailRespVO::getInfomationCode) + .select(MaterialProductDO::getModelNo) + .selectAs(MaterialProductDO::getName, MaterialUseEndReuseDetailRespVO::getInfomationName) + .leftJoin(MaterialUseEndReuseDO.class, MaterialUseEndReuseDO::getId, MaterialUseEndReuseDetailDO::getParentId) + .leftJoin(MaterialInfomationDO.class, MaterialInfomationDO::getId, MaterialUseEndReuseDetailDO::getInfomationId) + .leftJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialInfomationDO::getProductId) + .in(MaterialUseEndReuseDetailDO::getParentId, parentIds); + + return selectJoinList(MaterialUseEndReuseDetailRespVO.class, wrapper); + } } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialUseEndReuseMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialUseEndReuseMapper.java index 5e2ba4d0..b44bdc5a 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialUseEndReuseMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialUseEndReuseMapper.java @@ -3,8 +3,12 @@ package com.zt.plat.module.qms.resource.material.dal.mapper; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zt.plat.framework.mybatis.core.query.MPJLambdaWrapperX; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialUseEndReusePageReqVO; +import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInfomationDO; +import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialProductDO; import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialUseEndReuseDO; +import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialUseEndReuseDetailDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -30,7 +34,13 @@ public interface MaterialUseEndReuseMapper extends BaseMapperX selectPage(MaterialUseEndReusePageReqVO reqVO, List pdtIds) { - return selectPage(reqVO, new LambdaQueryWrapperX() + + MPJLambdaWrapperX wrapper = new MPJLambdaWrapperX() + .selectAll(MaterialUseEndReuseDO.class) + .leftJoin(MaterialUseEndReuseDetailDO.class, MaterialUseEndReuseDetailDO::getParentId, MaterialUseEndReuseDO::getId) + .leftJoin(MaterialInfomationDO.class, MaterialInfomationDO::getId, MaterialUseEndReuseDetailDO::getInfomationId) + .leftJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialInfomationDO::getProductId) + .in(MaterialProductDO::getId, pdtIds) .eqIfPresent(MaterialUseEndReuseDO::getBusinessType, reqVO.getBusinessType()) .eqIfPresent(MaterialUseEndReuseDO::getOperator, reqVO.getOperator()) .eqIfPresent(MaterialUseEndReuseDO::getOperatorId, reqVO.getOperatorId()) @@ -38,7 +48,9 @@ public interface MaterialUseEndReuseMapper extends BaseMapperX getMaterialBatchGongduanList(Long batId); + List getGongduanListByBatIds(List batIds); /** * 提交物料批次 @@ -139,4 +141,28 @@ public interface MaterialBatchService { * @param status 验收状态 */ void updateMaterialBatchAcceptStatusByLfcId(Long lfcId, String status); + + /** + * 根据批次id 获取批次信息 + * + * @param batchIds 批次id + * @return 批次信息 + */ + List getBatchListByBatchIds(List batchIds); + + /** + * 更新批次退换数量 + * + * @param batches 批次信息 + * @param adjustType 调整类型 + */ + void updateBatchReturnExchangeCount(List batches, AdjustType adjustType); + + /** + * 更新工段退换数量 + * + * @param gongs 工段信息 + * @param adjustType 调整类型 + */ + void updateGongduanReturnExchangeCount(List gongs, AdjustType adjustType); } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialBatchServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialBatchServiceImpl.java index 5b9198a3..9f549db5 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialBatchServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialBatchServiceImpl.java @@ -6,6 +6,7 @@ import com.zt.plat.framework.common.exception.ServiceException; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.module.qms.core.code.SequenceUtil; +import com.zt.plat.module.qms.enums.AdjustType; import com.zt.plat.module.qms.enums.QmsCommonConstant; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchPageReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchRespVO; @@ -15,6 +16,7 @@ import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialLifecycle import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialProductDO; import com.zt.plat.module.qms.resource.material.dal.mapper.MaterialBatchMapper; import com.zt.plat.module.qms.resource.material.enums.MaterialAcceptStatus; +import com.zt.plat.module.qms.resource.material.enums.MaterialFlowType; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -23,7 +25,9 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -243,10 +247,10 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { @Override - public List getMaterialBatchGongduanList(Long batId) { + public List getGongduanListByBatIds(List batIds) { return materialBatchMapper.selectList(Wrappers.lambdaQuery(MaterialBatchDO.class) - .eq(MaterialBatchDO::getParentId, batId) + .in(MaterialBatchDO::getParentId, batIds) .ne(MaterialBatchDO::getParentId, 0)); } @@ -321,6 +325,59 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { .in(MaterialBatchDO::getId, gongIds)); } + @Override + public List getBatchListByBatchIds(List batchIds) { + + return materialBatchMapper.selectList(Wrappers.lambdaQuery(MaterialBatchDO.class) + .in(MaterialBatchDO::getId, batchIds) + .eq(MaterialBatchDO::getParentId, 0)); + } + + @Override + public void updateBatchReturnExchangeCount(List batches, AdjustType adjustType) { + List batIds = batches.stream().map(MaterialLifecycleDetailDO::getBatchId).toList(); + List batchDOS = getBatchListByBatchIds(batIds); + Map lifecycleDetailDOMapByBatchId = batches.stream().collect(Collectors.toMap(MaterialLifecycleDetailDO::getBatchId, Function.identity())); + for (MaterialBatchDO batchDO : batchDOS) { + MaterialLifecycleDetailDO detailDO = lifecycleDetailDOMapByBatchId.get(batchDO.getId()); + String businessType = detailDO.getBusinessType(); + BigDecimal influenceCount = detailDO.getInfluenceCount(); + if (MaterialFlowType.return_material.getName().equals(businessType)) { + BigDecimal returnQuantity = adjustType == AdjustType.add ? batchDO.getReturnQuantity().add(influenceCount) + : batchDO.getReturnQuantity().subtract(influenceCount); + batchDO.setReturnQuantity(returnQuantity); + } else if (MaterialFlowType.exchange_material.getName().equals(businessType)) { + BigDecimal replaceQuantity = adjustType == AdjustType.add ? batchDO.getReplaceQuantity().add(influenceCount) + : batchDO.getReplaceQuantity().subtract(influenceCount); + batchDO.setReplaceQuantity(replaceQuantity); + } + + } + materialBatchMapper.updateBatch(batchDOS); + } + + @Override + public void updateGongduanReturnExchangeCount(List gongs, AdjustType adjustType) { + List gongIds = gongs.stream().map(MaterialLifecycleDetailDO::getBatchId).toList(); + List gongDOS = getGongduanListByGongIds(gongIds); + Map lifecycleDetailDOMapByGongId = gongs.stream().collect(Collectors.toMap(MaterialLifecycleDetailDO::getBatchGongduanId, Function.identity())); + for (MaterialBatchDO gongDO : gongDOS) { + MaterialLifecycleDetailDO detailDO = lifecycleDetailDOMapByGongId.get(gongDO.getId()); + String businessType = detailDO.getBusinessType(); + BigDecimal influenceCount = detailDO.getInfluenceCount(); + if (MaterialFlowType.return_material.getName().equals(businessType)) { + BigDecimal returnQuantity = adjustType == AdjustType.add ? gongDO.getReturnQuantity().add(influenceCount) + : gongDO.getReturnQuantity().subtract(influenceCount); + gongDO.setReturnQuantity(returnQuantity); + } else if (MaterialFlowType.exchange_material.getName().equals(businessType)) { + BigDecimal replaceQuantity = adjustType == AdjustType.add ? gongDO.getReplaceQuantity().add(influenceCount) + : gongDO.getReplaceQuantity().subtract(influenceCount); + gongDO.setReplaceQuantity(replaceQuantity); + } + } + materialBatchMapper.updateBatch(gongDOS); + } + /** * 组装物料批次树 * diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationService.java index 8a7ad0de..f9eb7ba6 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationService.java @@ -3,14 +3,12 @@ package com.zt.plat.module.qms.resource.material.service; import java.math.BigDecimal; import java.util.*; +import com.zt.plat.module.qms.enums.AdjustType; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInfomationPageReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInfomationRespVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInfomationSaveReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.query.MaterialInfomationQueryVO; -import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialBatchDO; -import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInfomationDO; -import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialProductDO; -import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialStandardSolutionDO; +import com.zt.plat.module.qms.resource.material.dal.dataobject.*; import jakarta.validation.*; import com.zt.plat.framework.common.pojo.PageResult; @@ -180,4 +178,12 @@ public interface MaterialInfomationService { * @param materialInfomationDO 批量更新 */ void updateByIds(List infomationIds, MaterialInfomationDO materialInfomationDO); + + /** + * 批量更新物料信息 - 入库/出库 + * + * @param infomations 物料信息 + * @param adjustType 入库/出库 + */ + void updateInfomationInbOrOutbStatus(List infomations, AdjustType adjustType); } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationServiceImpl.java index 5aa42266..257412ed 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationServiceImpl.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.module.qms.core.code.SequenceUtil; +import com.zt.plat.module.qms.enums.AdjustType; import com.zt.plat.module.qms.resource.material.constant.MaterialConstants; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInfomationPageReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInfomationRespVO; @@ -246,4 +247,21 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService .in(MaterialInfomationDO::getId, infomationIds)); } + @Override + public void updateInfomationInbOrOutbStatus(List infomations, AdjustType adjustType) { + List infIds = infomations.stream().map(MaterialLifecycleDetailDO::getInfomationId).toList(); + List infomationDOS = getMaterialInfomationsByIds(infIds); + for (MaterialInfomationDO infomationDO : infomationDOS) { + switch (adjustType) { + case add: + infomationDO.setUsageStatus(1); + break; + case subtract: + infomationDO.setUsageStatus(0); + break; + } + } + this.updateBatch(infomationDOS); + } + } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialLifecycleServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialLifecycleServiceImpl.java index d41bb57d..80811772 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialLifecycleServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialLifecycleServiceImpl.java @@ -23,14 +23,12 @@ import com.zt.plat.module.qms.common.data.service.DataKeyCheckService; import com.zt.plat.module.qms.common.dic.dal.dataobject.DictionaryBusinessDO; import com.zt.plat.module.qms.common.dic.service.DictionaryBusinessService; import com.zt.plat.module.qms.common.service.BusinessFileService; +import com.zt.plat.module.qms.enums.AdjustType; import com.zt.plat.module.qms.enums.QmsBpmConstant; import com.zt.plat.module.qms.enums.QmsCommonConstant; import com.zt.plat.module.qms.resource.material.constant.MaterialConstants; import com.zt.plat.module.qms.resource.material.controller.vo.*; -import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialBatchDO; -import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialLifecycleDO; -import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialLifecycleDetailDO; -import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialProductDO; +import com.zt.plat.module.qms.resource.material.dal.dataobject.*; import com.zt.plat.module.qms.resource.material.dal.mapper.MaterialLifecycleMapper; import com.zt.plat.module.qms.resource.material.enums.MaterialAcceptStatus; import com.zt.plat.module.qms.resource.material.enums.MaterialFlowType; @@ -41,12 +39,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.time.LocalDateTime; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -90,11 +86,13 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , private MaterialProductService materialProductService; @Autowired private BusinessFileService businessFileService; + @Autowired + private MaterialInfomationService materialInfomationService; @Transactional @Override public MaterialLifecycleRespVO createMaterialLifecycle(MaterialLifecycleSaveReqVO createReqVO) { - // 插入 + MaterialLifecycleDO mtrlLfc = BeanUtils.toBean(createReqVO, MaterialLifecycleDO.class); mtrlLfc.setSubmitStatus(0); String loginUserNickname = SecurityFrameworkUtils.getLoginUserNickname(); @@ -106,30 +104,60 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , .setApplyDepartmentId(loginUser.getVisitDeptId()) .setApplyTime(LocalDateTime.now()); mtrlLfc.setFlowStatus(QmsCommonConstant.NOT_START); + // 插入 materialLifecycleMapper.insert(mtrlLfc); List detailList = createReqVO.getDetailList(); if (CollUtil.isEmpty(detailList)) return BeanUtils.toBean(mtrlLfc, MaterialLifecycleRespVO.class); - List detailDOS = List.of(); - if (MaterialFlowType.acceptance.getName().equals(mtrlLfc.getBusinessType())) { - // 保存工段明细 - detailDOS = getMaterialGongsLifecycleDetailDOS(detailList, mtrlLfc); - } else if (MaterialFlowType.config_apply.getName().equals(mtrlLfc.getBusinessType())) { - // 保存物料大类明细 - detailDOS = getMaterialProductsLifecycleDetailDOS(detailList, mtrlLfc); - } + + // 根据业务类型组装明细 + List detailDOS = getLifecycleDetailDOSByBusinessType(detailList, mtrlLfc); materialLifecycleDetailService.saveBatch(detailDOS); + + // 如果有退换货,更新相关数据的退换货数量 + if (MaterialFlowType.return_material.getName().equals(mtrlLfc.getBusinessType()) + || MaterialFlowType.exchange_material.getName().equals(mtrlLfc.getBusinessType())) { + updateReturnExchangeCount(detailDOS, AdjustType.add); + } return BeanUtils.toBean(mtrlLfc, MaterialLifecycleRespVO.class); } + private void updateReturnExchangeCount(List detailDOS, AdjustType adjustType) { + // 批次 + List batches = detailDOS.stream().filter(detail -> detail.getBatchId() != null).toList(); + // 工段 + List gongs = detailDOS.stream().filter(detail -> detail.getBatchGongduanId() != null).toList(); + // 实例 + List infomations = detailDOS.stream().filter(detail -> detail.getInfomationId() != null).toList(); + if (CollUtil.isNotEmpty(batches)) { + materialBatchService.updateBatchReturnExchangeCount(batches, adjustType); + } + if (CollUtil.isNotEmpty(gongs)) { + materialBatchService.updateGongduanReturnExchangeCount(gongs, adjustType); + } + if (CollUtil.isNotEmpty(infomations)) { + materialInfomationService.updateInfomationInbOrOutbStatus(infomations, adjustType); + } + } + + private List getLifecycleDetailDOSByBusinessType(List detailList, MaterialLifecycleDO mtrlLfc) { + MaterialFlowType type = MaterialFlowType.fromName(mtrlLfc.getBusinessType()); + + return switch (type) { + case acceptance -> getLifecycleDetailDOSByAcceptance(detailList, mtrlLfc); + case make_apply -> getLifecycleDetailDOSByMakeApply(detailList, mtrlLfc); + case return_material, + exchange_material -> + getLifecycleDetailDOSByReturnExchangeMaterial(detailList, mtrlLfc); + }; + } + /** * 工段列表转流程明细列表 * */ - private List getLifecycleDetailDOsByGongs(List gongs, List gongIds, MaterialLifecycleDO mtrlLfc) { - Map gongsMap = gongs.stream().collect(Collectors.toMap(MaterialBatchDO::getId, Function.identity())); - return gongIds.stream().map(id -> { - MaterialBatchDO gong = gongsMap.get(id); + private List getLifecycleDetailDOsByGongs(List gongs, MaterialLifecycleDO mtrlLfc) { + return gongs.stream().map(gong -> { MaterialLifecycleDetailDO detailDO = new MaterialLifecycleDetailDO(); detailDO.setLifecycleId(mtrlLfc.getId()) .setProductId(gong.getProductId()).setBatchId(gong.getParentId()) @@ -156,19 +184,22 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , } // 删除原来的明细 materialLifecycleDetailService.deleteLifecycleDetailListByLfcId(reqId); - List detailDOS = List.of(); - if (MaterialFlowType.acceptance.getName().equals(mtrlLfc.getBusinessType())) { - detailDOS = getMaterialGongsLifecycleDetailDOS(detailList, mtrlLfc); - } else if (MaterialFlowType.config_apply.getName().equals(mtrlLfc.getBusinessType())) { - // 保存物料大类明细 - detailDOS = getMaterialProductsLifecycleDetailDOS(detailList, mtrlLfc); + List oriDetailList = materialLifecycleDetailService.getDetailListByLfcId(reqId); + if (MaterialFlowType.return_material.getName().equals(mtrlLfc.getBusinessType()) + || MaterialFlowType.exchange_material.getName().equals(mtrlLfc.getBusinessType())) { + updateReturnExchangeCount(oriDetailList, AdjustType.subtract); } + List detailDOS = getLifecycleDetailDOSByBusinessType(detailList, mtrlLfc); // 保存新的明细 materialLifecycleDetailService.saveBatch(detailDOS); + if (MaterialFlowType.return_material.getName().equals(mtrlLfc.getBusinessType()) + || MaterialFlowType.exchange_material.getName().equals(mtrlLfc.getBusinessType())) { + updateReturnExchangeCount(detailDOS, AdjustType.add); + } materialLifecycleMapper.updateById(mtrlLfc); } - private List getMaterialGongsLifecycleDetailDOS(List detailList, MaterialLifecycleDO mtrlLfc) { + private List getLifecycleDetailDOSByAcceptance(List detailList, MaterialLifecycleDO mtrlLfc) { List gongIds = detailList.stream().map(MaterialLifecycleDetailSaveReqVO::getBatchGongduanId).toList(); Map gongAssayMap = detailList.stream().collect(Collectors.toMap( @@ -180,10 +211,10 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , gong.setAssayFlag(gongAssayMap.get(gong.getId())); } - return getLifecycleDetailDOsByGongs(gongs, gongIds, mtrlLfc); + return getLifecycleDetailDOsByGongs(gongs, mtrlLfc); } - private List getMaterialProductsLifecycleDetailDOS(List detailList, MaterialLifecycleDO mtrlLfc) { + private List getLifecycleDetailDOSByMakeApply(List detailList, MaterialLifecycleDO mtrlLfc) { List pdtIds = detailList.stream().map(MaterialLifecycleDetailSaveReqVO::getProductId).toList(); List products = materialProductService.getMaterialProductListByPdtIds(pdtIds); if (CollUtil.isEmpty(products) || products.size() != pdtIds.size()) @@ -201,6 +232,119 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , }).toList(); } + private List getLifecycleDetailDOSByReturnExchangeMaterial(List detailList, MaterialLifecycleDO mtrlLfc) { + // 批次 + List reqBatches = detailList.stream().filter(detail -> detail.getBatchId() != null).toList(); + // 工段 + List reqGongs = detailList.stream().filter(detail -> detail.getBatchGongduanId() != null).toList(); + // 实例 + List reqInfomations = detailList.stream().filter(detail -> detail.getInfomationId() != null).toList(); + + if (reqBatches.size() + reqGongs.size() + reqInfomations.size() != detailList.size()) + throw new ServiceException(1_032_160_000, "批次、工段、实例数量之和与传入的明细数量不匹配"); + List totalDetailDOS = new ArrayList<>(); + if (CollUtil.isNotEmpty(reqBatches)) { + validBatchReturnExchangeMaterial(reqBatches); + List detailDOS = getLifecycleDetailDOSByReturnExchangeMaterial(mtrlLfc, reqBatches); + totalDetailDOS.addAll(detailDOS); + } + if (CollUtil.isNotEmpty(reqGongs)) { + validGongReturnExchangeMaterial(reqGongs); + List detailDOS = getLifecycleDetailDOSByReturnExchangeMaterial(mtrlLfc, reqGongs); + + totalDetailDOS.addAll(detailDOS); + } + if (CollUtil.isNotEmpty(reqInfomations)) { + validInfomationReturnExchangeMaterial(reqInfomations); + List detailDOS = getLifecycleDetailDOSByReturnExchangeMaterial(mtrlLfc, reqInfomations); + totalDetailDOS.addAll(detailDOS); + } + return totalDetailDOS; + } + + /** + * 校验物料退换货 + * + */ + private void validInfomationReturnExchangeMaterial(List reqInfomations) { + List infomationIds = reqInfomations.stream().map(MaterialLifecycleDetailSaveReqVO::getInfomationId).toList(); + List infomations = materialInfomationService.getMaterialInfomationsByIds(infomationIds); + if (CollUtil.isEmpty(infomations) || infomations.size() != infomationIds.size()) + throw new ServiceException(1_032_160_000, "物料信息不存在或与传入的物料信息数量不匹配"); + // 已出库的物料不可退换货 + for (MaterialInfomationDO infomation : infomations) { + if (infomation.getUsageStatus() == 1) + throw new ServiceException(1_032_160_000, String.format("物料【%s】已出库,不可退换货", infomation.getCode())); + } + } + + /** + * 校验工段退换货 + * + */ + private void validGongReturnExchangeMaterial(List reqGongs) { + List gongIds = reqGongs.stream().map(MaterialLifecycleDetailSaveReqVO::getBatchGongduanId).toList(); + List gongs = materialBatchService.getGongduanListByGongIds(gongIds); + if (CollUtil.isEmpty(gongs) || gongs.size() != gongIds.size()) + throw new ServiceException(1_032_160_000, "工段不存在或与传入的工段数量不匹配"); + // 退换货量不大于剩余量 + Map gongsMapById = gongs.stream().collect(Collectors.toMap(MaterialBatchDO::getId, Function.identity())); + for (MaterialLifecycleDetailSaveReqVO reqGong : reqGongs) { + MaterialBatchDO gong = gongsMapById.get(reqGong.getBatchGongduanId()); + BigDecimal inboundQuantity = gong.getInboundQuantity(); + BigDecimal returnQuantity = gong.getReturnQuantity(); + BigDecimal replaceQuantity = gong.getReplaceQuantity(); + BigDecimal inboundEndQuantity = gong.getInboundEndQuantity(); + BigDecimal remaine = inboundQuantity.subtract(returnQuantity).subtract(replaceQuantity).subtract(inboundEndQuantity); + + if (reqGong.getInfluenceCount().compareTo(remaine) > 0) + throw new ServiceException(1_032_160_000, String.format("退换货数量超过了批次工段【%s-%s】剩余量", + gongsMapById.get(reqGong.getBatchGongduanId()).getBatchNo(), + gongsMapById.get(reqGong.getBatchGongduanId()).getAssignDepartmentName())); + } + } + + /** + * 校验批次退换货 + * + */ + private void validBatchReturnExchangeMaterial(List reqBatches) { + List batchIds = reqBatches.stream().map(MaterialLifecycleDetailSaveReqVO::getBatchId).toList(); + List batches = materialBatchService.getBatchListByBatchIds(batchIds); + if (CollUtil.isEmpty(batches) || batches.size() != batchIds.size()) + throw new ServiceException(1_032_160_000, "批次不存在或与传入的批次数量不匹配"); + // 已拆分的批次不可退换货 + List gongs = materialBatchService.getGongduanListByBatIds(batchIds); + if (CollUtil.isNotEmpty(gongs)) { + Map> gongsMapByBatId = gongs.stream().collect(Collectors.groupingBy(MaterialBatchDO::getParentId)); + for (MaterialBatchDO batch : batches) { + if (gongsMapByBatId.containsKey(batch.getId())) + throw new ServiceException(1_032_160_000, String.format("批次【%s】已拆分,不可退换货", batch.getBatchNo())); + } + } + Map batchesMapById = batches.stream().collect(Collectors.toMap(MaterialBatchDO::getId, Function.identity())); + for (MaterialLifecycleDetailSaveReqVO reqBatch : reqBatches) { + BigDecimal inboundQuantity = batchesMapById.get(reqBatch.getBatchId()).getInboundQuantity(); + if (reqBatch.getInfluenceCount().compareTo(inboundQuantity) > 0) + throw new ServiceException(1_032_160_000, String.format("退换货数量超过了批次【%s】数量", batchesMapById.get(reqBatch.getBatchId()).getBatchNo())); + } + } + + private List getLifecycleDetailDOSByReturnExchangeMaterial(MaterialLifecycleDO mtrlLfc, List detailList) { + return detailList.stream().map(detail -> { + MaterialLifecycleDetailDO detailDO = new MaterialLifecycleDetailDO(); + detailDO.setLifecycleId(mtrlLfc.getId()) + .setBatchId(detail.getBatchId()) + .setBatchGongduanId(detail.getBatchGongduanId()) + .setInfomationId(detail.getInfomationId()) + .setInfluenceCount(detail.getInfluenceCount()) + .setBusinessType(mtrlLfc.getBusinessType()) + .setTreatmentStatus(0) + .setRemark(detail.getRemark()); + return detailDO; + }).toList(); + } + @Transactional @Override public void deleteMaterialLifecycle(Long id) { @@ -297,7 +441,7 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , List lifecycleDOS = lifecyclePage.getList(); PageResult respVOPageResult = BeanUtils.toBean(lifecyclePage, MaterialLifecycleRespVO.class); if (CollUtil.isEmpty(lifecycleDOS)) return respVOPageResult; - if (MaterialFlowType.config_apply.getName().equals(pageReqVO.getBusinessType())) { + if (MaterialFlowType.make_apply.getName().equals(pageReqVO.getBusinessType())) { List lifecycleRespVOS = respVOPageResult.getList(); // 组装明细 List lfcIds = lifecycleRespVOS.stream().map(MaterialLifecycleRespVO::getId).toList(); diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialStandardSolutionServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialStandardSolutionServiceImpl.java index 68c09bfa..67dcc729 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialStandardSolutionServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialStandardSolutionServiceImpl.java @@ -88,7 +88,7 @@ public class MaterialStandardSolutionServiceImpl implements MaterialStandardSolu if (lifecycle.getSubmitStatus() != 1) throw new ServiceException(1_032_160_000, "配置申请未提交"); // 已配置数量不大于申请数量 Map madeCountMap = materialLifecycleDetailService.getMadeCountMapByDetailIds(Collections.singletonList(detailId)); - if (madeCountMap.getOrDefault(detailId, 0L) >= Long.parseLong(lifecycleDetail.getInfluenceCount())) + if (madeCountMap.getOrDefault(detailId, 0L) >= lifecycleDetail.getInfluenceCount().intValue()) throw new ServiceException(1_032_160_000, "已配置数量不小于申请数量"); mtrlStandSol.setDetailId(detailId); } diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseDetailService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseDetailService.java index 19b31891..ffd72b0d 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseDetailService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseDetailService.java @@ -75,4 +75,26 @@ public interface MaterialUseEndReuseDetailService { * @return 物料用完标记或清洗回收明细分页 */ PageResult getDetailPageWithParentInfoAndMaterialInfo(@Valid MaterialUseEndReuseDetailPageReqVO pageReqVO); + + /** + * 获得物料用完标记或清洗回收明细 - 带父级信息和物料信息 + * + * @param parentIds 用完标记或清洗回收的编号 + * @return 物料用完标记或清洗回收明细 + */ + List getDetailRespVOSByParentIds(List parentIds); + + /** + * 根据主表id删除物料用完标记或清洗回收明细 + * + * @param id 用完标记或清洗回收的编号 + */ + void deleteDetailListByParentId(Long id); + + /** + * 根据主表ids批量删除物料用完标记或清洗回收明细 + * + * @param parentIds 用完标记或清洗回收的编号 + */ + void deleteDetailListByParentIds(List parentIds); } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseDetailServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseDetailServiceImpl.java index 3211d62c..77f5c415 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseDetailServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseDetailServiceImpl.java @@ -1,6 +1,7 @@ package com.zt.plat.module.qms.resource.material.service; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialUseEndReuseDetailPageReqVO; @@ -112,4 +113,19 @@ public class MaterialUseEndReuseDetailServiceImpl implements MaterialUseEndReuse return pageResult; } + @Override + public List getDetailRespVOSByParentIds(List parentIds) { + return materialUseEndReuseDetailMapper.selectListWithParentInfoAndMaterialInfoByParentIds(parentIds); + } + + @Override + public void deleteDetailListByParentId(Long id) { + materialUseEndReuseDetailMapper.delete(MaterialUseEndReuseDetailDO::getParentId, id); + } + + @Override + public void deleteDetailListByParentIds(List parentIds) { + materialUseEndReuseDetailMapper.deleteBatch(MaterialUseEndReuseDetailDO::getParentId, parentIds); + } + } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseServiceImpl.java index 57f80e21..e527bdde 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseServiceImpl.java @@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollUtil; import com.zt.plat.framework.common.exception.ServiceException; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.object.BeanUtils; +import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; +import com.zt.plat.module.qms.resource.material.controller.vo.MaterialUseEndReuseDetailRespVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialUseEndReusePageReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialUseEndReuseRespVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialUseEndReuseSaveReqVO; @@ -19,7 +21,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zt.plat.module.qms.enums.ErrorCodeConstants.MATERIAL_USE_END_REUSE_NOT_EXISTS; @@ -53,7 +58,11 @@ public class MaterialUseEndReuseServiceImpl implements MaterialUseEndReuseServic // 插入 MaterialUseEndReuseDO useEndReuseDO = BeanUtils.toBean(createReqVO, MaterialUseEndReuseDO.class); - // TODO 操作人信息 + Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); + String loginUserNickname = SecurityFrameworkUtils.getLoginUserNickname(); + + useEndReuseDO.setOperatorId(loginUserId).setOperator(loginUserNickname) + .setOperatorDate(LocalDateTime.now()); materialUseEndReuseMapper.insert(useEndReuseDO); @@ -79,18 +88,35 @@ public class MaterialUseEndReuseServiceImpl implements MaterialUseEndReuseServic materialUseEndReuseMapper.updateById(updateObj); } + @Transactional @Override public void deleteMaterialUseEndReuse(Long id) { - // 校验存在 - validateMaterialUseEndReuseExists(id); + MaterialUseEndReuseDO useEndReuseDO = materialUseEndReuseMapper.selectById(id); + if (useEndReuseDO == null) throw exception(MATERIAL_USE_END_REUSE_NOT_EXISTS); + // 用完标记不可删除 + if (MaterialNormalOperationType.usedMark.getName().equals(useEndReuseDO.getBusinessType())) + throw new ServiceException(1_032_160_000, "用完标记记录不可删除"); + // 删除明细 + materialUseEndReuseDetailService.deleteDetailListByParentId(id); // 删除 materialUseEndReuseMapper.deleteById(id); } + @Transactional @Override public void deleteMaterialUseEndReuseListByIds(List ids) { - // 校验存在 - validateMaterialUseEndReuseExists(ids); + List useEndReuseDOS = materialUseEndReuseMapper.selectByIds(ids); + if (CollUtil.isEmpty(useEndReuseDOS) || useEndReuseDOS.size() != ids.size()) { + throw exception(MATERIAL_USE_END_REUSE_NOT_EXISTS); + } + for (MaterialUseEndReuseDO useEndReuseDO : useEndReuseDOS) { + // 用完标记不可删除 + if (MaterialNormalOperationType.usedMark.getName().equals(useEndReuseDO.getBusinessType())) + throw new ServiceException(1_032_160_000, "用完标记记录不可删除"); + } + // 删除明细 + List useIds = useEndReuseDOS.stream().map(MaterialUseEndReuseDO::getId).toList(); + materialUseEndReuseDetailService.deleteDetailListByParentIds(useIds); // 删除 materialUseEndReuseMapper.deleteByIds(ids); } @@ -133,8 +159,21 @@ public class MaterialUseEndReuseServiceImpl implements MaterialUseEndReuseServic pageResult = materialUseEndReuseMapper.selectPage(pageReqVO, pdtIds); } } + List useEndReuseDOS = pageResult.getList(); + if (CollUtil.isEmpty(useEndReuseDOS)) return PageResult.empty(); + List useIds = useEndReuseDOS.stream().map(MaterialUseEndReuseDO::getId).toList(); - return null; + PageResult respVOPageResult = BeanUtils.toBean(pageResult, MaterialUseEndReuseRespVO.class); + + List detailRespVOS = materialUseEndReuseDetailService.getDetailRespVOSByParentIds(useIds); + if (CollUtil.isEmpty(detailRespVOS)) return respVOPageResult; + Map> detailRespVOMapByParentId = detailRespVOS.stream().collect(Collectors.groupingBy(MaterialUseEndReuseDetailRespVO::getParentId)); + List list = respVOPageResult.getList(); + for (MaterialUseEndReuseRespVO useEndReuseRespVO : list) { + useEndReuseRespVO.setChildren(detailRespVOMapByParentId.get(useEndReuseRespVO.getId())); + } + respVOPageResult.setList(list); + return respVOPageResult; } } \ No newline at end of file