diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryOutboundRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryOutboundRespVO.java index 49ab8f70..25f0e293 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryOutboundRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryOutboundRespVO.java @@ -37,9 +37,13 @@ public class MaterialInventoryOutboundRespVO { private LocalDateTime applyTime; @Schema(description = "物料名称", example = "硫酸") - @ExcelProperty("试剂名称") + @ExcelProperty("物料名称") private String productName; + @Schema(description = "物料编码") + @ExcelProperty("物料编码") + private String productCode; + @Schema(description = "申请部门") @ExcelProperty("消耗部门") private String applyDepartment; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleDetailRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleDetailRespVO.java index bdb65cbc..c3b49c49 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleDetailRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialLifecycleDetailRespVO.java @@ -2,6 +2,7 @@ package com.zt.plat.module.qms.resource.material.controller.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -121,6 +122,14 @@ public class MaterialLifecycleDetailRespVO { @ExcelProperty("已完成数量") private Long finishedCount; + @Schema(description = "合格/通过数量", example = "15772") + @ExcelProperty("合格/通过数量") + private BigDecimal qualifiedCount; + + @Schema(description = "不合格/拒绝数量", example = "15772") + @ExcelProperty("不合格/拒绝数量") + private BigDecimal unqualifiedCount; + @Schema(description = "明细操作类型,【字典】【jy_material_lifecycle_detail_bsn_type】", example = "1") @ExcelProperty("明细操作类型,【字典】【jy_material_lifecycle_detail_bsn_type】") 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/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 59cbe1b6..f2451c6c 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 @@ -1,5 +1,6 @@ package com.zt.plat.module.qms.resource.material.controller.vo; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -33,6 +34,12 @@ public class MaterialLifecycleDetailSaveReqVO { @Schema(description = "影响数量", example = "15772") private BigDecimal influenceCount; + @Schema(description = "合格/通过数量", example = "15772") + private BigDecimal qualifiedCount; + + @Schema(description = "不合格/拒绝数量", example = "15772") + private BigDecimal unqualifiedCount; + @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/export/MaterialConsumeStatisticsExportVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/export/MaterialConsumeStatisticsExportVO.java index a2e10979..4d91f6b6 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/export/MaterialConsumeStatisticsExportVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/export/MaterialConsumeStatisticsExportVO.java @@ -20,14 +20,18 @@ public class MaterialConsumeStatisticsExportVO { @ExcelProperty("日期") private LocalDate applyTime; - @Schema(description = "物料名称", example = "硫酸") - @ExcelProperty("试剂名称") - private String productName; - @Schema(description = "申请部门") @ExcelProperty("消耗部门") private String applyDepartment; + @Schema(description = "物料名称", example = "硫酸") + @ExcelProperty("物料试剂名称") + private String productName; + + @Schema(description = "物料编码") + @ExcelProperty("物料试剂编码") + private String productCode; + @Schema(description = "申请部门id", example = "845") private Long applyDepartmentId; 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 f9bc34ec..eeb03744 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 @@ -66,6 +66,16 @@ public class MaterialLifecycleDetailDO extends BusinessBaseDO { */ @TableField("INFL_CNT") private BigDecimal influenceCount; + /** + * 合格/通过数量 + */ + @TableField("QLFD_CNT") + private BigDecimal qualifiedCount; + /** + * 不合格/拒绝数量 + */ + @TableField("UNQ_CNT") + private BigDecimal unqualifiedCount; /** * 明细操作类型,【字典】【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/mapper/MaterialInventoryOutboundMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInventoryOutboundMapper.java index 139d5225..928bac35 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInventoryOutboundMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInventoryOutboundMapper.java @@ -17,6 +17,7 @@ import com.zt.plat.module.qms.resource.material.enums.MaterialOutboundType; import org.apache.ibatis.annotations.Mapper; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -64,6 +65,8 @@ public interface MaterialInventoryOutboundMapper extends BaseMapperX> statisticsMaps = selectJoinMaps(wrapper); if (CollUtil.isEmpty(statisticsMaps)) return List.of(); diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialFlowType.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialFlowType.java index 7735ad24..f159fd52 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialFlowType.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialFlowType.java @@ -11,7 +11,10 @@ public enum MaterialFlowType { exchange_material("换货"), - make_apply("配置申请"); + make_apply("配置申请"), + + verify_calibrate("检定校准") + ; private final String name; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/job/MaterialJob.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/job/MaterialJob.java index c8a82a60..4fa56f45 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/job/MaterialJob.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/job/MaterialJob.java @@ -1,5 +1,6 @@ package com.zt.plat.module.qms.resource.material.job; +import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import com.zt.plat.framework.tenant.core.job.TenantJob; import com.zt.plat.module.qms.resource.material.service.MaterialInfomationService; @@ -20,15 +21,16 @@ public class MaterialJob { /** * 更新物料过期状态定时任务 * 每天执行一次,检查并更新已过期的物料状态 + * */ @XxlJob("updateMaterialExpiredStatusJob") - @TenantJob public void updateMaterialExpiredStatusJob() { log.info("[updateMaterialExpiredStatusJob] 开始执行物料过期状态更新任务"); try { Integer updateCount = materialInfomationService.updateExpiredMaterialStatus(); log.info("[updateMaterialExpiredStatusJob] 任务执行成功,共更新 {} 个物料", updateCount); + XxlJobHelper.handleSuccess(String.format("任务执行成功,共更新 %d 个物料", updateCount)); } catch (Exception e) { log.error("[updateMaterialExpiredStatusJob] 任务执行失败:{}", e.getMessage(), e); throw e; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialBatchService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialBatchService.java index 30728fec..d3f2aa76 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialBatchService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialBatchService.java @@ -166,4 +166,12 @@ public interface MaterialBatchService { * @return 分页数据 */ PageResult getBatchGongPageWithPdtInfo(@Valid MaterialBatchPageReqVO pageReqVO); + + /** + * 锁定批次校准数量 + * + * @param batches 批次信息 + * @param lockType 锁定类型 + */ + void lockBatchVerifyCalibrateCount(List batches, LockType lockType); } \ 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 4ea1a21f..e3c84e83 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 @@ -384,6 +384,27 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { return pageResult; } + @Override + public void lockBatchVerifyCalibrateCount(List batches, LockType lockType) { + 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()); + BigDecimal influenceCount = detailDO.getInfluenceCount(); + switch (lockType) { + case lock -> { + BigDecimal lockQuantity = batchDO.getLockQuantity().add(influenceCount); + if (lockQuantity.compareTo(batchDO.getInboundQuantity()) > 0) + throw new ServiceException(1_032_160_000, "检定数量大于可用数量"); + batchDO.setLockQuantity(lockQuantity); + } + case unlock -> batchDO.setLockQuantity(batchDO.getLockQuantity().subtract(influenceCount)); + } + } + materialBatchMapper.updateBatch(batchDOS); + } + private void lockBatchOrGongReturnExchangeCount(LockType lockType, List batchOrGongDOS, Map lifecycleDetailDOMapByBatOrGongId) { for (MaterialBatchDO batOrGong : batchOrGongDOS) { MaterialLifecycleDetailDO detailDO = lifecycleDetailDOMapByBatOrGongId.get(batOrGong.getId()); diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryOutboundServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryOutboundServiceImpl.java index db5e8464..3caf7642 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryOutboundServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryOutboundServiceImpl.java @@ -3,6 +3,7 @@ package com.zt.plat.module.qms.resource.material.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.zt.plat.framework.common.exception.ServiceException; import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.framework.common.pojo.PageResult; @@ -179,7 +180,7 @@ public class MaterialInventoryOutboundServiceImpl implements MaterialInventoryOu String outboundType = switch (flowType) { case return_material -> MaterialOutboundType.return_outbound.getName(); case exchange_material -> MaterialOutboundType.replace_outbound.getName(); - case acceptance, make_apply -> null; + case acceptance, make_apply, verify_calibrate -> null; }; MaterialInventoryOutboundDO outboundDO = new MaterialInventoryOutboundDO(); outboundDO.setApplyUserId(lifecycleDO.getApplyUserId()) @@ -206,16 +207,18 @@ public class MaterialInventoryOutboundServiceImpl implements MaterialInventoryOu Map productMapById = products.stream().collect(Collectors.toMap(MaterialProductDO::getId, Function.identity())); for (MaterialInventoryOutboundRespVO outboundRespVO : outboundRespVOS) { MaterialProductDO productDO = productMapById.get(outboundRespVO.getProductId()); - outboundRespVO.setProductName(productDO.getName()).setProductModelNo(productDO.getModelNo()).setUnit(productDO.getUnit()); + outboundRespVO.setProductName(productDO.getName()).setProductCode(productDO.getCode()) + .setProductModelNo(productDO.getModelNo()).setUnit(productDO.getUnit()); } List deptIds = outboundRespVOS.stream().map(MaterialInventoryOutboundRespVO::getApplyDepartmentId).toList(); - List> maxIdMaps = materialInventoryOutboundMapper.selectMaps( - new MPJLambdaWrapperX() - .select(MaterialInventoryOutboundDO::getApplyDepartmentId) - .select("MAX(t.ID) as ID") - .in(MaterialInventoryOutboundDO::getApplyDepartmentId, deptIds) - .groupBy(MaterialInventoryOutboundDO::getApplyDepartmentId) - ); + MPJLambdaWrapper wrapper = new MPJLambdaWrapperX() + .select(MaterialInventoryOutboundDO::getApplyDepartmentId) + .select("MAX(t.ID) as ID") + .in(MaterialInventoryOutboundDO::getApplyDepartmentId, deptIds) + .groupBy(MaterialInventoryOutboundDO::getApplyDepartmentId); + if (reqVO.getApplyTime() != null && reqVO.getApplyTime().length == 2) + wrapper.between(MaterialInventoryOutboundDO::getApplyTime, reqVO.getApplyTime()[0], reqVO.getApplyTime()[1]); + List> maxIdMaps = materialInventoryOutboundMapper.selectMaps(wrapper); if (CollUtil.isEmpty(maxIdMaps)) return outboundRespVOS; // 提取每个部门的最大 ID 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 237d1d55..79cb9055 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 @@ -122,9 +122,21 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , || MaterialFlowType.exchange_material.getName().equals(mtrlLfc.getBusinessType())) { lockReturnExchangeResources(detailDOS, LockType.lock); } + // 如果有物料检定,需要锁定检定数量 + if (MaterialFlowType.verify_calibrate.getName().equals(mtrlLfc.getBusinessType())) { + lockVerifyCalibrateResources(detailDOS, LockType.lock); + } return BeanUtils.toBean(mtrlLfc, MaterialLifecycleRespVO.class); } + private void lockVerifyCalibrateResources(List detailDOS, LockType lockType) { + // 批次 + List batches = detailDOS.stream().filter(detail -> detail.getBatchId() != null).toList(); + if (CollUtil.isNotEmpty(batches)) { + materialBatchService.lockBatchVerifyCalibrateCount(batches, lockType); + } + } + private void lockReturnExchangeResources(List detailDOS, LockType lockType) { // 批次 List batches = detailDOS.stream().filter(detail -> detail.getBatchId() != null).toList(); @@ -170,6 +182,7 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , case return_material, exchange_material -> getLifecycleDetailDOSByReturnExchangeMaterial(detailList, mtrlLfc); + case verify_calibrate -> getLifecycleDetailDOSByVerifyCalibrate(detailList, mtrlLfc); }; } @@ -206,14 +219,19 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , // 删除原来的明细 materialLifecycleDetailService.deleteLifecycleDetailListByLfcId(reqId); List oriDetailList = materialLifecycleDetailService.getDetailListByLfcId(reqId); + // 退换货 boolean isReturnExchangeMaterial = MaterialFlowType.return_material.getName().equals(mtrlLfc.getBusinessType()) || MaterialFlowType.exchange_material.getName().equals(mtrlLfc.getBusinessType()); if (isReturnExchangeMaterial) lockReturnExchangeResources(oriDetailList, LockType.unlock); + // 物料检定 + boolean isVerifyCalibrate = MaterialFlowType.verify_calibrate.getName().equals(mtrlLfc.getBusinessType()); + if (isVerifyCalibrate) lockVerifyCalibrateResources(oriDetailList, LockType.unlock); List detailDOS = getLifecycleDetailDOSByBusinessType(detailList, mtrlLfc); // 保存新的明细 materialLifecycleDetailService.saveBatch(detailDOS); if (isReturnExchangeMaterial) lockReturnExchangeResources(detailDOS, LockType.lock); + if (isVerifyCalibrate) lockVerifyCalibrateResources(oriDetailList, LockType.lock); materialLifecycleMapper.updateById(mtrlLfc); } @@ -280,6 +298,36 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , return totalDetailDOS; } + private List getLifecycleDetailDOSByVerifyCalibrate(List detailList, MaterialLifecycleDO mtrlLfc) { + List reqDetails = detailList.stream().filter(detail -> detail.getBatchId() != null).toList(); + if (CollUtil.isEmpty(reqDetails) || reqDetails.size() != detailList.size()) + throw new ServiceException(1_032_160_000, "批次数量与传入的明细数量不匹配"); + List batIds = reqDetails.stream().map(MaterialLifecycleDetailSaveReqVO::getBatchId).toList(); + List batches = materialBatchService.getBatchListByBatchIds(batIds); + if (CollUtil.isEmpty(batches) || batches.size() != batIds.size()) + throw new ServiceException(1_032_160_000, "批次不存在或与传入的批次数量不匹配"); + // 检定数量检验 + Map batchDOMapById = batches.stream().collect(Collectors.toMap(MaterialBatchDO::getId, Function.identity())); + for (MaterialLifecycleDetailSaveReqVO reqDetail : reqDetails) { + MaterialBatchDO batchDO = batchDOMapById.get(reqDetail.getBatchId()); + // 可用数量 + BigDecimal availableQuantity = batchDO.getInboundQuantity().subtract(batchDO.getLockQuantity()); + if (reqDetail.getInfluenceCount().compareTo(availableQuantity) > 0) + throw new ServiceException(1_032_160_000, String.format("检定数量超过了批次【%s】可用数量【%s】", batchDO.getBatchNo(), availableQuantity)); + } + + return reqDetails.stream().map(detail -> { + MaterialLifecycleDetailDO detailDO = new MaterialLifecycleDetailDO(); + detailDO.setLifecycleId(mtrlLfc.getId()) + .setBatchId(detail.getBatchId()) + .setInfluenceCount(detail.getInfluenceCount()) + .setBusinessType(mtrlLfc.getBusinessType()) + .setTreatmentStatus(0) + .setRemark(detail.getRemark()); + return detailDO; + }).toList(); + } + /** * 校验物料退换货 * @@ -373,15 +421,18 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , if (lifecycleDO == null) throw exception(MATERIAL_LIFECYCLE_NOT_EXISTS); // 已提交的流程不允许删除 if (lifecycleDO.getSubmitStatus() == 1) throw new ServiceException(1_032_160_000, "流程已提交,不可删除"); - // 删除明细 - materialLifecycleDetailService.deleteLifecycleDetailListByLfcId(id); + boolean isReturnExchangeMaterial = MaterialFlowType.return_material.getName().equals(lifecycleDO.getBusinessType()) || MaterialFlowType.exchange_material.getName().equals(lifecycleDO.getBusinessType()); - if (isReturnExchangeMaterial) { + boolean isVerifyCalibrate = MaterialFlowType.verify_calibrate.getName().equals(lifecycleDO.getBusinessType()); + + if (isReturnExchangeMaterial || isVerifyCalibrate) { List detailList = materialLifecycleDetailService.getDetailListByLfcId(id); - this.lockReturnExchangeResources(detailList, LockType.unlock); + if (isReturnExchangeMaterial) this.lockReturnExchangeResources(detailList, LockType.unlock); + if (isVerifyCalibrate) this.lockVerifyCalibrateResources(detailList, LockType.unlock); } - + // 删除明细 + materialLifecycleDetailService.deleteLifecycleDetailListByLfcId(id); // 删除流程 materialLifecycleMapper.deleteById(id); } @@ -398,8 +449,7 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , if (lifecycle.getSubmitStatus() == 1) throw new ServiceException(1_032_160_000, "存在已提交的流程,不可删除"); } - // 删除明细 - materialLifecycleDetailService.deleteLifecycleDetailListByLfcIds(ids); + // 释放退换货锁定资源 List rtnRepLifecycleDOS = list.stream().filter(lifecycleDO -> MaterialFlowType.return_material.getName().equals(lifecycleDO.getBusinessType()) || MaterialFlowType.exchange_material.getName().equals(lifecycleDO.getBusinessType())).toList(); @@ -408,6 +458,16 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , List detailList = materialLifecycleDetailService.getDetailListByLfcIds(rtnRepIds); this.lockReturnExchangeResources(detailList, LockType.unlock); } + // 释放检定锁定资源 + List verifyCalibrateLifecycleDOS = list.stream().filter(lifecycleDO -> + MaterialFlowType.verify_calibrate.getName().equals(lifecycleDO.getBusinessType())).toList(); + if (CollUtil.isNotEmpty(verifyCalibrateLifecycleDOS)) { + List verifyCalibrateIds = verifyCalibrateLifecycleDOS.stream().map(MaterialLifecycleDO::getId).toList(); + List detailList = materialLifecycleDetailService.getDetailListByLfcIds(verifyCalibrateIds); + this.lockVerifyCalibrateResources(detailList, LockType.unlock); + } + // 删除明细 + materialLifecycleDetailService.deleteLifecycleDetailListByLfcIds(ids); // 删除流程 materialLifecycleMapper.deleteByIds(ids); } @@ -462,17 +522,28 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , Integer submitStatus = lifecycleDO.getSubmitStatus(); if (submitStatus == 1) throw new ServiceException(1_032_160_000, "申请已经提交过"); lifecycleDO.setApplyTime(LocalDateTime.now()); - if (MaterialFlowType.acceptance.getName().equals(lifecycleDO.getBusinessType())) { - // 如果是验收需要发起流程 - this.createProcessInstance(lifecycleDO); - } else if (MaterialFlowType.return_material.getName().equals(lifecycleDO.getBusinessType()) - || MaterialFlowType.exchange_material.getName().equals(lifecycleDO.getBusinessType())) { - // 如果是退换货需要释放锁定的资源并更新退换货数量或更新实例状态 - List detailList = materialLifecycleDetailService.getDetailListByLfcId(id); - this.lockReturnExchangeResources(detailList, LockType.unlock); - this.updateReturnExchangeResources(detailList, AdjustType.add); - // 添加退换货出库记录 - materialInventoryOutboundService.addMaterialInventoryOutboundsByLfc(lifecycleDO); + MaterialFlowType flowType = MaterialFlowType.fromName(lifecycleDO.getBusinessType()); + switch (flowType) { + case acceptance -> + // 验收需要发起流程 + this.createProcessInstance(lifecycleDO); + case return_material, exchange_material -> { + // 退换货需要释放锁定的资源并更新退换货数量或更新实例状态 + List detailList = materialLifecycleDetailService.getDetailListByLfcId(id); + this.lockReturnExchangeResources(detailList, LockType.unlock); + this.updateReturnExchangeResources(detailList, AdjustType.add); + // 添加退换货出库记录 + materialInventoryOutboundService.addMaterialInventoryOutboundsByLfc(lifecycleDO); + } + case verify_calibrate -> { + // 检定需要发起检定流程 + this.createProcessInstance(lifecycleDO); + // TODO 释放锁定的资源 + List detailList = materialLifecycleDetailService.getDetailListByLfcId(id); + this.lockVerifyCalibrateResources(detailList, LockType.unlock); + // TODO 更新批次数量 + // this.updateVerifyCalibrateResources(detailList, AdjustType.add); + } } lifecycleDO.setSubmitStatus(1); 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 91f3e7f2..c05595a1 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 @@ -73,6 +73,11 @@ public class MaterialUseEndReuseServiceImpl implements MaterialUseEndReuseServic useEndReuseDO.setOperatorId(loginUserId).setOperator(loginUserNickname) .setOperatorDate(LocalDateTime.now()); + if (MaterialNormalOperationType.open_seal.equals(operationType)) { + // 开封时间从前端传 + useEndReuseDO.setOperatorDate(createReqVO.getOperatorDate()); + } + materialUseEndReuseMapper.insert(useEndReuseDO); // 保存明细