diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/SampleAnalysisServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/SampleAnalysisServiceImpl.java index a694e172..35074ad5 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/SampleAnalysisServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/SampleAnalysisServiceImpl.java @@ -1329,6 +1329,9 @@ public class SampleAnalysisServiceImpl implements SampleAnalysisService { ConfigSubSampleMethodConfPoint source = configSubSampleMethodConfItem.getSource(); String project = source.getProject(); BusinessAssayProjectDataExtendRespVO currentBusinessAssayProjectData = businessAssayProjectDataExtendList.stream().filter(f -> f.getBusinessAssayTaskDataId().equals(businessAssayTaskData.getId()) && project.equals(f.getSimpleName())).findFirst().orElse(null); + if (currentBusinessAssayProjectData == null) { + continue; + } ConfigSubSampleMethodConfPoint target = configSubSampleMethodConfItem.getTarget(); for (BusinessAssayTaskDataDO targetBusinessAssayTaskData : targetBusinessAssayTaskDataList) { List targetProjectList = Arrays.asList(target.getProject().split(",")); @@ -1360,6 +1363,9 @@ public class SampleAnalysisServiceImpl implements SampleAnalysisService { ConfigSubSampleMethodConfPoint source = configSubSampleMethodConfItem.getSource(); String project = source.getProject(); BusinessAssayProjectDataExtendRespVO currentBusinessAssayProjectData = businessAssayProjectDataExtendList.stream().filter(f -> f.getBusinessAssayTaskDataId().equals(businessAssayTaskData.getId()) && project.equals(f.getSimpleName())).findFirst().orElse(null); + if (currentBusinessAssayProjectData == null) { + continue; + } ConfigSubSampleMethodConfPoint target = configSubSampleMethodConfItem.getTarget(); for (BusinessAssayTaskDataDO targetBusinessAssayTaskData : targetBusinessAssayTaskDataList) { List targetProjectList = Arrays.asList(target.getProject().split(",")); @@ -1391,6 +1397,9 @@ public class SampleAnalysisServiceImpl implements SampleAnalysisService { ConfigSubSampleMethodConfPoint source = configSubSampleMethodConfItem.getSource(); String project = source.getProject(); BusinessAssayProjectDataExtendRespVO currentBusinessAssayProjectData = businessAssayProjectDataExtendList.stream().filter(f -> f.getBusinessAssayTaskDataId().equals(businessAssayTaskData.getId()) && project.equals(f.getSimpleName())).findFirst().orElse(null); + if (currentBusinessAssayProjectData == null) { + continue; + } ConfigSubSampleMethodConfPoint target = configSubSampleMethodConfItem.getTarget(); for (BusinessAssayTaskDataDO targetBusinessAssayTaskData : targetBusinessAssayTaskDataList) { List targetProjectList = Arrays.asList(target.getProject().split(",")); diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialProductController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialProductController.java index 03e86d54..dcb8d6a0 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialProductController.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialProductController.java @@ -37,7 +37,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success; @RestController @RequestMapping("/qms/resource/material-product") @Validated -@FileUploadController(source = "resource.materialproduct") +@FileUploadController(source = "resource.materialproduct", codeKey = "data.fileUploadBusinessCode") @DeptDataPermissionIgnore(enable = "true") public class MaterialProductController extends AbstractFileUploadController implements BusinessControllerMarker{ @@ -134,8 +134,8 @@ public class MaterialProductController extends AbstractFileUploadController impl @Parameter(name = "id", description = "编号", required = true, example = "1024") // @PreAuthorize("@ss.hasPermission('qms:material-product:query')") public CommonResult getMaterialProduct(@RequestParam("id") Long id) { - MaterialProductDO materialProduct = materialProductService.getMaterialProductInfo(id); - return success(BeanUtils.toBean(materialProduct, MaterialProductRespVO.class)); + MaterialProductRespVO materialProduct = materialProductService.getMaterialProductInfoWithFiles(id); + return success(materialProduct); } @GetMapping("/export-excel") 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 f7f82911..b5b3a07b 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 @@ -41,6 +41,10 @@ public class MaterialBatchRespVO { @ExcelProperty("物料大类型号") private String productModelNo; + @Schema(description = "标签模板key") + @ExcelProperty("标签模板key") + private String labelTemplateKey; + @Schema(description = "批次编号") @ExcelProperty("批次编号") private String batchNo; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryInboundDetailPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryInboundDetailPageReqVO.java index 7db35e04..bfe97359 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryInboundDetailPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryInboundDetailPageReqVO.java @@ -16,6 +16,9 @@ public class MaterialInventoryInboundDetailPageReqVO extends PageParam { @Schema(description = "入库单ID", example = "30205") private Long inboundId; + @Schema(description = "物料大类id", example = "30205") + private Long productId; + @Schema(description = "批次id", example = "16666") private Long batchId; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryInboundRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryInboundRespVO.java index 401e77cd..d5df9b70 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryInboundRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryInboundRespVO.java @@ -7,6 +7,7 @@ import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; @Schema(description = "管理后台 - 入库 Response VO") @Data @@ -93,4 +94,8 @@ public class MaterialInventoryInboundRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "入库明细") + @ExcelProperty("入库明细") + private List detailList; + } \ 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/controller/vo/MaterialProductRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialProductRespVO.java index cf8d8a97..10418545 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialProductRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialProductRespVO.java @@ -3,6 +3,8 @@ 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 com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.module.infra.api.businessfile.dto.BusinessFileWithUrlRespDTO; import com.zt.plat.module.qms.core.aspect.annotation.Dict; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -163,4 +165,11 @@ public class MaterialProductRespVO { @Schema(description = "子物料分类") private List children; + @Schema(description = "附件上传code") + private String fileUploadBusinessCode = "qms_resource_material_product"; + + @Schema(description = "附件对象") + private List businessFileRet; + + } \ 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/controller/vo/MaterialProductSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialProductSaveReqVO.java index e9e9ae35..99572bf7 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialProductSaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialProductSaveReqVO.java @@ -9,6 +9,8 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Null; import lombok.Data; +import java.util.List; + @Schema(description = "管理后台 - 物料大类新增/修改 Request VO") @Data public class MaterialProductSaveReqVO { @@ -102,4 +104,7 @@ public class MaterialProductSaveReqVO { @Schema(description = "备注") private String remark; + @Schema(description = "删除的文件id") + private List deleteFileIdList; + } \ 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/MaterialBatchMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialBatchMapper.java index 0dbfc50e..96972a6a 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialBatchMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialBatchMapper.java @@ -117,6 +117,7 @@ public interface MaterialBatchMapper extends BaseMapperX { .selectAs(MaterialProductDO::getName, MaterialBatchRespVO::getProductName) .selectAs(MaterialProductDO::getCode, MaterialBatchRespVO::getProductCode) .selectAs(MaterialProductDO::getModelNo, MaterialBatchRespVO::getProductModelNo) + .selectAs(MaterialProductDO::getLabelTemplateKey, MaterialBatchRespVO::getLabelTemplateKey) .selectAs("batch.MFR_DT", MaterialBatchDO::getManufacturerDate) .selectAs("batch.DUE_DT", MaterialBatchDO::getDueDate) .leftJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialBatchDO::getProductId) @@ -124,7 +125,6 @@ public interface MaterialBatchMapper extends BaseMapperX { // 只查询工段 .ne(MaterialBatchDO::getParentId, 0) .eq(MaterialBatchDO::getSubmitStatus, 1) - .eq(MaterialBatchDO::getAcceptanceStatus, reqVO.getAcceptanceStatus()) .in(CollUtil.isNotEmpty(pdtIds), MaterialBatchDO::getProductId, pdtIds) .eq(CollUtil.isEmpty(pdtIds) && reqVO.getProductId() != null, MaterialBatchDO::getProductId, reqVO.getProductId()) .likeIfExists(MaterialBatchDO::getBatchNo, reqVO.getBatchNo()) @@ -140,10 +140,10 @@ public interface MaterialBatchMapper extends BaseMapperX { .eqIfExists(MaterialBatchDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode()) .eqIfExists(MaterialBatchDO::getRemark, reqVO.getRemark()) // 已处理 - .le(reqVO.getTreatment(), MaterialBatchDO::getInboundQuantity, MaterialBatchDO::getInboundEndQuantity) + .apply(reqVO.getTreatment(), "t.INB_END_QTY >= t.INB_QTY") // 未处理 - .gt(!reqVO.getTreatment(), MaterialBatchDO::getInboundQuantity, MaterialBatchDO::getInboundEndQuantity) - .orderByDesc(MaterialBatchDO::getParentId); + .apply(!reqVO.getTreatment(), "t.INB_END_QTY < t.INB_QTY") + .orderByDesc(MaterialBatchDO::getId); if (reqVO.getCreateTime() != null && reqVO.getCreateTime().length == 2) { wrapper.between(MaterialBatchDO::getCreateTime, reqVO.getCreateTime()[0], reqVO.getCreateTime()[1]); } diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInventoryInboundDetailMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInventoryInboundDetailMapper.java index 11501339..91f904e8 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInventoryInboundDetailMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInventoryInboundDetailMapper.java @@ -52,6 +52,7 @@ public interface MaterialInventoryInboundDetailMapper extends BaseMapperX getMadeCountMapByDetailIds(List detailIds) { + + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .select(MaterialLifecycleDetailDO::getId) + .selectCount(MaterialStandardSolutionDO::getId, "quantity") + .leftJoin(MaterialStandardSolutionDO.class, MaterialStandardSolutionDO::getDetailId, MaterialLifecycleDetailDO::getId) + .in(MaterialLifecycleDetailDO::getId, detailIds) + .groupBy(MaterialLifecycleDetailDO::getId); + + List> maps = selectJoinMaps(wrapper); + if (CollUtil.isEmpty(maps)) return new HashMap<>(); + + return maps.stream().collect(Collectors.toMap( + map -> (Long) map.get("ID"), + map -> (Long) map.get("QUANTITY") + )); + } } \ 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/MaterialProductMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialProductMapper.java index 3256d451..9a35b8e3 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialProductMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialProductMapper.java @@ -1,16 +1,20 @@ package com.zt.plat.module.qms.resource.material.dal.mapper; +import cn.hutool.core.collection.CollUtil; +import com.github.yulichang.wrapper.MPJLambdaWrapper; 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.core.constant.DataTypeConstant; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductPageReqVO; -import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialBatchDO; -import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialProductDO; +import com.zt.plat.module.qms.resource.material.dal.dataobject.*; import org.apache.ibatis.annotations.Mapper; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 物料大类 Mapper @@ -57,17 +61,39 @@ public interface MaterialProductMapper extends BaseMapperX { .orderByDesc(MaterialProductDO::getId)); } - default boolean checkIsExistsBatchByPdt(Long id){ + default boolean checkIsExistsBatchByPdt(List ids){ MPJLambdaWrapperX wrapperX = new MPJLambdaWrapperX() - .leftJoin(MaterialBatchDO.class, MaterialBatchDO::getProductId, MaterialProductDO::getId) - .eq(MaterialBatchDO::getProductId, id); + .innerJoin(MaterialBatchDO.class, MaterialBatchDO::getProductId, MaterialProductDO::getId) + .in(MaterialProductDO::getId, ids); return this.exists(wrapperX); } - default boolean checkIsExistsDataByPdts(List ids){ - MPJLambdaWrapperX wrapperX = new MPJLambdaWrapperX() - .leftJoin(MaterialBatchDO.class, MaterialBatchDO::getProductId, MaterialProductDO::getId) - .in(MaterialBatchDO::getProductId, ids); - return this.exists(wrapperX); + default Map getStockQuantityByPdtIds(List mtrlIds) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .select(MaterialProductDO::getId) + .selectCount(MaterialInfomationDO::getId, "quantity") + .leftJoin(MaterialInfomationDO.class, MaterialInfomationDO::getProductId, MaterialProductDO::getId) + .in(MaterialProductDO::getId, mtrlIds) + .eq(MaterialInfomationDO::getUsageStatus, 0) + .groupBy(MaterialProductDO::getId); + + List> maps = selectJoinMaps(wrapper); + if (CollUtil.isEmpty(maps)) return new HashMap<>(); + + return maps.stream().collect(Collectors.toMap( + map -> (Long) map.get("ID"), + map -> (Long) map.get("QUANTITY") + )); + } + + default boolean checkIsExistsSolutionByPdt(List ids) { + MPJLambdaWrapperX wrapperXMakeApply = new MPJLambdaWrapperX() + .innerJoin(MaterialLifecycleDetailDO.class, MaterialLifecycleDetailDO::getProductId, MaterialProductDO::getId) + .in(MaterialProductDO::getId, ids); + MPJLambdaWrapperX wrapperXMake = new MPJLambdaWrapperX() + .innerJoin(MaterialInfomationDO.class, MaterialInfomationDO::getProductId, MaterialProductDO::getId) + .innerJoin(MaterialStandardSolutionDO.class, MaterialStandardSolutionDO::getInfomationId, MaterialInfomationDO::getId) + .in(MaterialProductDO::getId, ids); + return this.exists(wrapperXMakeApply) || this.exists(wrapperXMake); } } \ 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/MaterialStandardSolutionMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialStandardSolutionMapper.java index 20089d9f..ffece6c2 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialStandardSolutionMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialStandardSolutionMapper.java @@ -4,6 +4,7 @@ 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.device.dal.dataobject.DeviceInfomationDO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialStandardSolutionPageReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialStandardSolutionRespVO; import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInfomationDO; @@ -46,8 +47,10 @@ public interface MaterialStandardSolutionMapper extends BaseMapperX detailRespVOList = + materialInventoryInboundDetailService.getMaterialInfoListByInboundId(inbound.getId()); + respVO.setDetailList(detailRespVOList); + return respVO; } @Override 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 9af6622a..5af85cd5 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 @@ -26,6 +26,8 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; +import java.util.Set; +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_INVENTORY_OUTBOUND_NOT_EXISTS; @@ -51,6 +53,8 @@ public class MaterialInventoryOutboundServiceImpl implements MaterialInventoryOu private MaterialInfomationService materialInfomationService; @Autowired private MaterialInventoryOutboundDetailService materialInventoryOutboundDetailService; + @Autowired + private MaterialProductService materialProductService; @Transactional @Override @@ -91,6 +95,9 @@ public class MaterialInventoryOutboundServiceImpl implements MaterialInventoryOu .setManagerUserId(outboundDO.getApplyUserId()).setManagerUserName(outboundDO.getApplyUser()) .setManagerDepartmentId(outboundDO.getApplyDepartmentId()).setManagerDepartmentName(outboundDO.getApplyDepartment()); materialInfomationService.updateInfomationByInfIds(infomationUpdate, infIds); + // 更新大类预警级别 + List pdtIds = infs.stream().map(MaterialInfomationDO::getProductId).collect(Collectors.toSet()).stream().toList(); + materialProductService.updateMaterialProductAlarmLevel(pdtIds); return BeanUtils.toBean(outboundDO, MaterialInventoryOutboundRespVO.class); } diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialLifecycleDetailServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialLifecycleDetailServiceImpl.java index 06bfdf56..5c380040 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialLifecycleDetailServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialLifecycleDetailServiceImpl.java @@ -38,9 +38,6 @@ public class MaterialLifecycleDetailServiceImpl implements MaterialLifecycleDeta @Resource private MaterialLifecycleDetailMapper materialLifecycleDetailMapper; - @Autowired - private MaterialStandardSolutionService materialStandardSolutionService; - @Override public MaterialLifecycleDetailRespVO createMaterialLifecycleDetail(MaterialLifecycleDetailSaveReqVO createReqVO) { // 插入 @@ -160,7 +157,7 @@ public class MaterialLifecycleDetailServiceImpl implements MaterialLifecycleDeta @Override public Map getMadeCountMapByDetailIds(List detailIds) { - return materialStandardSolutionService.getMadeCountMapByDetailIds(detailIds); + return materialLifecycleDetailMapper.getMadeCountMapByDetailIds(detailIds); } } \ 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/MaterialProductService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductService.java index 138761c7..9d4ae049 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductService.java @@ -9,6 +9,7 @@ import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialProductDO import jakarta.validation.Valid; import java.util.List; +import java.util.Set; /** * 物料大类 Service 接口 @@ -116,4 +117,19 @@ public interface MaterialProductService { * @return 物料数据 */ List getMaterialProductListByPdtIds(List pdtIds); + + /** + * 更新物料大类库存预警等级 + * + * @param pdtIds ids + */ + void updateMaterialProductAlarmLevel(List pdtIds); + + /** + * 获取物料大类详情 + * + * @param id id + * @return 物料数据 + */ + MaterialProductRespVO getMaterialProductInfoWithFiles(Long id); } \ 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/MaterialProductServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductServiceImpl.java index c411739a..383d23ca 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialProductServiceImpl.java @@ -6,9 +6,12 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zt.plat.framework.common.exception.ServiceException; +import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zt.plat.module.infra.api.businessfile.dto.BusinessFileWithUrlRespDTO; +import com.zt.plat.module.qms.common.service.BusinessFileService; import com.zt.plat.module.qms.core.constant.DataTypeConstant; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductPageReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductRespVO; @@ -19,15 +22,12 @@ import com.zt.plat.module.qms.resource.material.dal.mapper.MaterialProductMapper import com.zt.plat.module.qms.resource.material.enums.MaterialInventoryAlarmLevel; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -46,7 +46,7 @@ public class MaterialProductServiceImpl implements MaterialProductService { private MaterialProductMapper materialProductMapper; @Autowired - private MaterialInfomationService materialInfomationService; + private BusinessFileService businessFileService; /** * 保存分类 @@ -180,6 +180,7 @@ public class MaterialProductServiceImpl implements MaterialProductService { return parentMtrlVOs; } + @Transactional @Override public MaterialProductRespVO saveMaterialProduct(MaterialProductSaveReqVO createReqVO) { Long reqId = createReqVO.getId(); @@ -198,7 +199,8 @@ public class MaterialProductServiceImpl implements MaterialProductService { if (prnCtg != null) { mtrl.setHazardous(prnCtg.getHazardous()) .setStandardMaterialFlag(prnCtg.getStandardMaterialFlag()) - .setStandardSolutionFlag(prnCtg.getStandardSolutionFlag()); + .setStandardSolutionFlag(prnCtg.getStandardSolutionFlag()) + .setInventoryAlarmLevel(MaterialInventoryAlarmLevel.danger.name()); } materialProductMapper.insert(mtrl); // 更新 idPath @@ -216,6 +218,7 @@ public class MaterialProductServiceImpl implements MaterialProductService { materialProductMapper.updateById(mtrl); return BeanUtils.toBean(mtrl, MaterialProductRespVO.class); } + businessFileService.deleteBusinessFileList(createReqVO.getDeleteFileIdList()); // 父节点有变更时更新 idPath } String newIdPath = getIdPath(mtrl); @@ -246,14 +249,21 @@ public class MaterialProductServiceImpl implements MaterialProductService { } // 大类 else { - // 大类下有批次时不可删除 - // TODO 以及其他不可删除的情况,如库存记录、物料实例、使用记录等 - boolean exists = materialProductMapper.checkIsExistsBatchByPdt(id); - if (exists) throw exception(MATERIAL_PRODUCT_EXISTS_BATCH); + checkIsDelete(Collections.singletonList(id)); } materialProductMapper.deleteById(id); } + private void checkIsDelete(List pdtIds) { + // 大类下有批次时不可删除 + boolean existsBatch = materialProductMapper.checkIsExistsBatchByPdt(pdtIds); + if (existsBatch) throw exception(MATERIAL_PRODUCT_EXISTS_BATCH); + // 大类下有溶液配置申请或溶液配置时不可删除 + boolean existsSolution = materialProductMapper.checkIsExistsSolutionByPdt(pdtIds); + if (existsSolution) throw new ServiceException(1_032_160_000, "大类下有溶液配置申请或已配置的溶液, 不可删除"); + // TODO 以及其他不可删除的情况,如库存记录、物料实例、使用记录等 + } + @Override public void deleteMaterialProductListByIds(List ids) { // 校验存在 @@ -265,9 +275,7 @@ public class MaterialProductServiceImpl implements MaterialProductService { List mtCtgList = list.stream().filter(m -> DataTypeConstant.DATA_TYPE_CATEGORY.equals(m.getNodeType())).toList(); if (CollUtil.isNotEmpty(mtCtgList)) throw exception(MATERIAL_PRODUCTS_EXISTS_CATEGORY); // 检查是否可删除 大类下有批次时不可删除 - // TODO 以及其他不可删除的情况,如库存记录、物料实例、使用记录等 - boolean exists = materialProductMapper.checkIsExistsDataByPdts(ids); - if (exists) throw exception(MATERIAL_PRODUCT_EXISTS_BATCH); + checkIsDelete(ids); // 删除 materialProductMapper.deleteByIds(ids); } @@ -328,12 +336,12 @@ public class MaterialProductServiceImpl implements MaterialProductService { List mtrlIds = mtrlDos.stream().map(MaterialProductDO::getId).toList(); List voList = mtrlDos.stream().map(m -> BeanUtils.toBean(m, MaterialProductRespVO.class)).toList(); // 一次性获取大类下的库存数量 - Map stockQuantityMap = materialInfomationService.getStockQuantityByPdtIds(mtrlIds); + Map stockQuantityMap = materialProductMapper.getStockQuantityByPdtIds(mtrlIds); if (CollUtil.isNotEmpty(stockQuantityMap)) { for (MaterialProductRespVO vo : voList) { Long val = stockQuantityMap.get(vo.getId()); vo.setInventoryQuantity(BigDecimal.valueOf(val == null ? 0L : val)); - vo.setInventoryAlarmLevel(getAlarmLevel(vo)); + // vo.setInventoryAlarmLevel(getAlarmLevel(vo)); } } @@ -376,4 +384,45 @@ public class MaterialProductServiceImpl implements MaterialProductService { return materialProductMapper.selectByIds(pdtIds); } + @Transactional + @Override + public void updateMaterialProductAlarmLevel(List pdtIds) { + if (CollUtil.isEmpty(pdtIds)) return; + List pdtDOs = materialProductMapper.selectByIds(pdtIds); + if (CollUtil.isEmpty(pdtDOs)) return; + Map stockQuantityMap = materialProductMapper.getStockQuantityByPdtIds(pdtIds); + List updateAlarmLevelPdts = pdtDOs.stream().map(m -> { + String customConfig = m.getCustomConfig(); + String alarmLevel = null; + if (StrUtil.isNotEmpty(customConfig)) { + JSONObject alarmRange = JSONUtil.parseObj(customConfig).getJSONObject("alarmRange"); + if (alarmRange != null) { + // BigDecimal[] safeRange = (BigDecimal[]) alarmRange.get(MaterialInventoryAlarmLevel.safe.name()); + List dangerRange = alarmRange.getJSONArray(MaterialInventoryAlarmLevel.danger.name()).toList(BigDecimal.class); + List warnRange = alarmRange.getJSONArray(MaterialInventoryAlarmLevel.warn.name()).toList(BigDecimal.class); + BigDecimal inventoryQuantity = BigDecimal.valueOf(stockQuantityMap.get(m.getId())); + if (inventoryQuantity.compareTo(dangerRange.get(1)) <= 0) { + alarmLevel = MaterialInventoryAlarmLevel.danger.name(); + } else if (inventoryQuantity.compareTo(warnRange.get(1)) <= 0) { + alarmLevel = MaterialInventoryAlarmLevel.warn.name(); + } else { + alarmLevel = MaterialInventoryAlarmLevel.safe.name(); + } + } + } + return new MaterialProductDO().setId(m.getId()).setInventoryAlarmLevel(alarmLevel); + }).toList(); + + materialProductMapper.updateBatch(updateAlarmLevelPdts); + } + + @Override + public MaterialProductRespVO getMaterialProductInfoWithFiles(Long id) { + MaterialProductDO productDO = materialProductMapper.selectById(id); + MaterialProductRespVO respVO = BeanUtils.toBean(productDO, MaterialProductRespVO.class); + CommonResult> result = businessFileService.getBusinessFileList(id); + respVO.setBusinessFileRet(result.getData()); + return respVO; + } + } \ 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/MaterialStandardSolutionServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialStandardSolutionServiceImpl.java index 5344f99e..ed249daa 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 @@ -21,13 +21,13 @@ import com.zt.plat.module.qms.resource.material.dal.mapper.MaterialStandardSolut import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -49,11 +49,9 @@ public class MaterialStandardSolutionServiceImpl implements MaterialStandardSolu @Resource private MaterialStandardSolutionMapper materialStandardSolutionMapper; - @Lazy @Autowired private MaterialLifecycleDetailService materialLifecycleDetailService; - @Lazy @Autowired private MaterialLifecycleService materialLifecycleService; @@ -86,6 +84,10 @@ public class MaterialStandardSolutionServiceImpl implements MaterialStandardSolu MaterialLifecycleRespVO lifecycle = materialLifecycleService.getMaterialLifecycle(lifecycleDetail.getLifecycleId()); if (lifecycle == null) throw new ServiceException(1_032_160_000, "配置申请不存在"); 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())) + 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/thirdpartyapi/service/XRFDataServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/thirdpartyapi/service/XRFDataServiceImpl.java index e4a228e6..2f643b6c 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/thirdpartyapi/service/XRFDataServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/thirdpartyapi/service/XRFDataServiceImpl.java @@ -399,6 +399,9 @@ public class XRFDataServiceImpl implements XRFDataService { ConfigSubSampleMethodConfPoint source = configSubSampleMethodConfItem.getSource(); String project = source.getProject(); BusinessAssayProjectDataExtendRespVO currentBusinessAssayProjectData = tempBusElementValueList.stream().filter(f -> f.getBusinessAssayTaskDataId().equals(businessAssayTaskData.getId()) && project.equals(f.getSimpleName())).findFirst().orElse(null); + if (currentBusinessAssayProjectData == null) { + continue; + } ConfigSubSampleMethodConfPoint target = configSubSampleMethodConfItem.getTarget(); for (BusinessAssayTaskDataDO targetBusinessAssayTaskData : targetBusinessAssayTaskDataList) { List targetProjectList = Arrays.asList(target.getProject().split(",")); @@ -430,6 +433,9 @@ public class XRFDataServiceImpl implements XRFDataService { ConfigSubSampleMethodConfPoint source = configSubSampleMethodConfItem.getSource(); String project = source.getProject(); BusinessAssayProjectDataExtendRespVO currentBusinessAssayProjectData = tempBusElementValueList.stream().filter(f -> f.getBusinessAssayTaskDataId().equals(businessAssayTaskData.getId()) && project.equals(f.getSimpleName())).findFirst().orElse(null); + if (currentBusinessAssayProjectData == null) { + continue; + } ConfigSubSampleMethodConfPoint target = configSubSampleMethodConfItem.getTarget(); for (BusinessAssayTaskDataDO targetBusinessAssayTaskData : targetBusinessAssayTaskDataList) { List targetProjectList = Arrays.asList(target.getProject().split(",")); @@ -461,6 +467,9 @@ public class XRFDataServiceImpl implements XRFDataService { ConfigSubSampleMethodConfPoint source = configSubSampleMethodConfItem.getSource(); String project = source.getProject(); BusinessAssayProjectDataExtendRespVO currentBusinessAssayProjectData = tempBusElementValueList.stream().filter(f -> f.getBusinessAssayTaskDataId().equals(businessAssayTaskData.getId()) && project.equals(f.getSimpleName())).findFirst().orElse(null); + if (currentBusinessAssayProjectData == null) { + continue; + } ConfigSubSampleMethodConfPoint target = configSubSampleMethodConfItem.getTarget(); for (BusinessAssayTaskDataDO targetBusinessAssayTaskData : targetBusinessAssayTaskDataList) { List targetProjectList = Arrays.asList(target.getProject().split(","));