From 123d217fecd10ddbc0ce14d83e9f4bca045bf27b Mon Sep 17 00:00:00 2001 From: shusir <497819738@qq.com> Date: Wed, 11 Mar 2026 17:56:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E7=89=A9=E6=96=99=E7=BB=BC=E5=90=88?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=B9=B6=E8=B0=83=E6=95=B4=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/vo/MaterialBatchPageReqVO.java | 3 + .../controller/vo/MaterialBatchRespVO.java | 9 ++ .../vo/query/MaterialProductQueryVO.java | 1 + .../enums/MaterialBatchBusinessType.java | 16 +++ .../enums/MaterialBatchOperationType.java | 2 +- .../service/MaterialBatchServiceImpl.java | 100 ++++++++++++------ .../MaterialInventoryInboundServiceImpl.java | 7 +- .../service/MaterialLifecycleServiceImpl.java | 10 +- .../service/MaterialProductService.java | 16 +++ .../service/MaterialProductServiceImpl.java | 47 +++++++- .../service/MaterialUseRecordServiceImpl.java | 1 + 11 files changed, 171 insertions(+), 41 deletions(-) create mode 100644 zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchBusinessType.java diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchPageReqVO.java index bd9d19a8..fd7b3ac0 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchPageReqVO.java @@ -16,6 +16,9 @@ import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH @Data public class MaterialBatchPageReqVO extends PageParam { + @Schema(description = "分类其他配置") + private String categoryCustomConfig; + @Schema(description = "物料大类id", example = "9381") private Long productId; 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 be7005fd..eaa294d8 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 @@ -1,5 +1,6 @@ package com.zt.plat.module.qms.resource.material.controller.vo; +import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -29,6 +30,10 @@ public class MaterialBatchRespVO { @ExcelProperty("物料大类id") private Long productId; + @Schema(description = "分类自定义配置") + @ExcelProperty("分类自定义配置") + private JSONObject categoryCustomConfig; + @Schema(description = "物料大类名称") @ExcelProperty("物料大类名称") private String productName; @@ -73,6 +78,10 @@ public class MaterialBatchRespVO { @ExcelProperty("已入库数量") private BigDecimal inboundEndQuantity; + @Schema(description = "检定/校准数量") + @ExcelProperty("检定/校准数量") + private BigDecimal verificationQuantity; + @Schema(description = "锁定数量") @ExcelProperty("锁定数量") private BigDecimal lockQuantity; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/query/MaterialProductQueryVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/query/MaterialProductQueryVO.java index bf9cd7ee..422460ef 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/query/MaterialProductQueryVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/query/MaterialProductQueryVO.java @@ -1,5 +1,6 @@ package com.zt.plat.module.qms.resource.material.controller.vo.query; +import cn.hutool.json.JSONObject; import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchBusinessType.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchBusinessType.java new file mode 100644 index 00000000..03414b8b --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchBusinessType.java @@ -0,0 +1,16 @@ +package com.zt.plat.module.qms.resource.material.enums; + +/** + * 物料批次业务类型 + * + */ +public enum MaterialBatchBusinessType { + /** + * 拆分到工段 + */ + batch_assign_gong, + /** + * 检定 + */ + verify, +} diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchOperationType.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchOperationType.java index 51f26210..a2eeb46f 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchOperationType.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchOperationType.java @@ -1,7 +1,7 @@ package com.zt.plat.module.qms.resource.material.enums; /** - * 物料批次工段枚举 + * 物料批次操作类型 * */ public enum MaterialBatchOperationType { 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 dbe83f6f..376afb53 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 @@ -3,6 +3,8 @@ package com.zt.plat.module.qms.resource.material.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; +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; @@ -12,12 +14,15 @@ import com.zt.plat.module.bpm.api.task.BpmProcessInstanceApi; import com.zt.plat.module.bpm.api.task.dto.BpmProcessInstanceRespDTO; import com.zt.plat.module.bpm.api.task.dto.UserSimpleDTO; import com.zt.plat.module.qms.core.code.SequenceUtil; +import com.zt.plat.module.qms.core.constant.DataTypeConstant; import com.zt.plat.module.qms.enums.AdjustType; import com.zt.plat.module.qms.enums.LockType; import com.zt.plat.module.qms.resource.material.constant.MaterialConstants; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchPageReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchRespVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchSaveReqVO; +import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductRespVO; +import com.zt.plat.module.qms.resource.material.controller.vo.query.MaterialProductQueryVO; 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; @@ -222,18 +227,25 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { MaterialBatchDO batchDO = materialBatchMapper.selectById(id); if (batchDO == null) throw exception(MATERIAL_BATCH_NOT_EXISTS); if (batchDO.getSubmitStatus() == 1) throw new ServiceException(1_032_160_000, "批次已经提交过"); - List gongduans = this.getGongduanListByBatIds(Collections.singletonList(id)); - if (CollUtil.isEmpty(gongduans)) throw new ServiceException(1_032_160_000, "批次还未拆分,不可提交"); - // 批次存在锁定数量时不可提交 - if (batchDO.getLockQuantity().compareTo(BigDecimal.ZERO) > 0) - throw new ServiceException(1_032_160_000, String.format("批次存在锁定数量【%s】,不可提交", batchDO.getLockQuantity())); - // 批次可用数量可能存在变更,需要再次校验数量一致性 - BigDecimal gongTotalInbQuantity = BigDecimal.ZERO; - for (MaterialBatchDO gongduan : gongduans) { - gongTotalInbQuantity = gongTotalInbQuantity.add(gongduan.getInboundQuantity()); + // 检查是否属于检定批次 + Boolean isVerify = materialProductService.checkIsVerifyCategoryByPdtId(batchDO.getProductId()); + if (!isVerify) { + + List gongduans = this.getGongduanListByBatIds(Collections.singletonList(id)); + if (CollUtil.isEmpty(gongduans)) throw new ServiceException(1_032_160_000, "批次还未拆分,不可提交"); + // 批次存在锁定数量时不可提交 + if (batchDO.getLockQuantity().compareTo(BigDecimal.ZERO) > 0) + throw new ServiceException(1_032_160_000, String.format("批次存在锁定数量【%s】,不可提交", batchDO.getLockQuantity())); + // 批次可用数量可能存在变更,需要再次校验数量一致性 + BigDecimal gongTotalInbQuantity = BigDecimal.ZERO; + for (MaterialBatchDO gongduan : gongduans) { + gongTotalInbQuantity = gongTotalInbQuantity.add(gongduan.getInboundQuantity()); + } + if (batchDO.getRemaineQuantity().compareTo(gongTotalInbQuantity) != 0) + throw exception(GONGDUAN_QUANTITY_MATERIAL_BATCH_AVAILABLE_QUANTITY_NOT_EQUAL); + } - if (batchDO.getRemaineQuantity().compareTo(gongTotalInbQuantity) != 0) - throw exception(GONGDUAN_QUANTITY_MATERIAL_BATCH_AVAILABLE_QUANTITY_NOT_EQUAL); + batchDO.setSubmitStatus(1).setSubmitDate(LocalDateTime.now()); materialBatchMapper.updateById(batchDO); // 提交工段 @@ -357,10 +369,10 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { public PageResult getBatchGongPageWithPdtInfo(MaterialBatchPageReqVO pageReqVO) { // 分为 批次分页、验收、入库、退换货 Long pdtId = pageReqVO.getProductId(); - PageResult pageResult; - if (pdtId == null) { - pageResult = materialBatchMapper.selectPageWithPdtInfo(pageReqVO, List.of()); - } else { + PageResult pageResult = new PageResult<>(); + + String categoryCustomConfig = pageReqVO.getCategoryCustomConfig(); + if (pdtId != null){ List mtrlDos = materialProductService.getMaterialProductsByLikeIdPath(pdtId); if (CollUtil.isEmpty(mtrlDos)) { pageResult = materialBatchMapper.selectPageWithPdtInfo(pageReqVO, List.of()); @@ -368,7 +380,18 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { List pdtIds = mtrlDos.stream().map(MaterialProductDO::getId).toList(); pageResult = materialBatchMapper.selectPageWithPdtInfo(pageReqVO, pdtIds); } + } else if (StrUtil.isNotEmpty(categoryCustomConfig)) { + List categoryAndData = materialProductService.getCategoryAndData(new MaterialProductQueryVO().setCategoryCustomConfig(categoryCustomConfig)); + if (CollUtil.isNotEmpty(categoryAndData)) { + List pdtIds = categoryAndData.stream() + .filter(p -> DataTypeConstant.DATA_TYPE_DATA.equals(p.getNodeType())) + .map(MaterialProductRespVO::getId).toList(); + pageResult = materialBatchMapper.selectPageWithPdtInfo(pageReqVO, pdtIds); + } + } else { + pageResult = materialBatchMapper.selectPageWithPdtInfo(pageReqVO, List.of()); } + // 查全部 if (StrUtil.isEmpty(pageReqVO.getDataType())) { List respVOS = pageResult.getList(); @@ -384,18 +407,32 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { } } + if (StrUtil.isEmpty(pageReqVO.getDataType()) || MaterialBatchGongType.batch.name().equals(pageReqVO.getDataType())) { + List batches = pageResult.getList(); + if (CollUtil.isNotEmpty(batches)) { + List pdtIds = batches.stream().map(MaterialBatchRespVO::getProductId).toList(); + List pdts = materialProductService.getMaterialProductListByPdtIds(pdtIds); + Map productDOMapById = pdts.stream().collect(Collectors.toMap(MaterialProductDO::getId, Function.identity())); + List topCategories = materialProductService.getTopCategoriesByPdtIds(pdtIds); + batches.forEach(batch -> { + Long productId = batch.getProductId(); + MaterialProductDO productDO = productDOMapById.get(productId); + for (MaterialProductDO topCategory : topCategories) { + if (productDO.getIdPath().contains("/" + topCategory.getId() + "/")) { + batch.setCategoryCustomConfig(JSONUtil.parseObj(topCategory.getCustomConfig())); + } + } + + }); + pageResult.setList(batches); + } + } + // 需要组装children if (!MaterialBatchGongType.gong.name().equals(pageReqVO.getDataType()) && pageReqVO.getChildren()) { List voList = pageResult.getList(); if (CollUtil.isNotEmpty(voList)) { List treeVos = this.listTransTree(voList, 0L); - for (MaterialBatchRespVO batch : treeVos) { - List children = batch.getChildren(); - if (CollUtil.isEmpty(children)) continue; - children.forEach(child -> - batch.setInboundEndQuantity(batch.getInboundEndQuantity().add(child.getInboundEndQuantity())) - ); - } pageResult.setList(treeVos); } } @@ -432,14 +469,16 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { for (MaterialBatchDO batchDO : batchDOS) { MaterialLifecycleDetailDO detailDO = lifecycleDetailDOMapByBatchId.get(batchDO.getId()); BigDecimal influenceCount = detailDO.getInfluenceCount(); + BigDecimal oriVerificationQuantity = batchDO.getVerificationQuantity(); + BigDecimal oriRemaineQuantity = batchDO.getRemaineQuantity(); switch (adjustType) { case add -> { - batchDO.setVerificationQuantity(batchDO.getVerificationQuantity().add(influenceCount)); - batchDO.setRemaineQuantity(batchDO.getRemaineQuantity().subtract(influenceCount)); + batchDO.setVerificationQuantity(oriVerificationQuantity.add(influenceCount)); + batchDO.setRemaineQuantity(oriRemaineQuantity.subtract(influenceCount)); } case subtract -> { - batchDO.setVerificationQuantity(batchDO.getVerificationQuantity().subtract(influenceCount)); - batchDO.setRemaineQuantity(batchDO.getRemaineQuantity().add(influenceCount)); + batchDO.setVerificationQuantity(oriVerificationQuantity.subtract(influenceCount)); + batchDO.setRemaineQuantity(oriRemaineQuantity.add(influenceCount)); } } } @@ -459,7 +498,6 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { UserSimpleDTO startUser = instanceData.getStartUser(); List batIds = lifecycleDetailDOs.stream().map(MaterialLifecycleDetailDO::getBatchId).toList(); List batchDOS = this.getBatchListByBatchIds(batIds); - LocalDateTime submitDate = LocalDateTime.now(); Map batchDOMap = batchDOS.stream().collect(Collectors.toMap(MaterialBatchDO::getId, Function.identity())); List gongs = lifecycleDetailDOs.stream().map(detailDO -> { MaterialBatchDO batchDO = batchDOMap.get(detailDO.getBatchId()); @@ -473,13 +511,11 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { .setBatchNo(batchDO.getBatchNo()) .setRemaineQuantity(detailDO.getQualifiedCount()) .setAcceptanceStatus(MaterialAcceptStatus.accepted.name()) - .setSubmitStatus(1).setSubmitDate(submitDate) - .setRemark(String.format("发起人:%s,发起时间:%s,检定生成的批次拆分", startUser.getNickname(), instanceData.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))); + .setSubmitStatus(1).setSubmitDate(batchDO.getSubmitDate()) + .setRemark(String.format("【%s】于%s发起检定,检定数量:%s,合格数量:%s", startUser.getNickname(), instanceData.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), + detailDO.getInfluenceCount(), detailDO.getQualifiedCount())); }).toList(); materialBatchMapper.insertBatch(gongs); - MaterialBatchDO batchUpdate = new MaterialBatchDO().setSubmitStatus(1).setSubmitDate(submitDate); - materialBatchMapper.update(batchUpdate, Wrappers.lambdaQuery(MaterialBatchDO.class) - .in(MaterialBatchDO::getId, batIds)); } private void lockBatchOrGongReturnExchangeCount(LockType lockType, List batchOrGongDOS, Map lifecycleDetailDOMapByBatOrGongId) { diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryInboundServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryInboundServiceImpl.java index f1942a08..563ee746 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryInboundServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryInboundServiceImpl.java @@ -92,13 +92,18 @@ public class MaterialInventoryInboundServiceImpl implements MaterialInventoryInb List infomationDOS = materialInfomationService.saveMaterialInfomationsByBatInb(locationId, reqQuantity, gongduanId, product, batch); // 5.保存入库明细 materialInventoryInboundDetailService.saveInboundDetails(infomationDOS, inbound, batchId, gongduanId); + // 是否为检定入库 + Boolean isVerify = materialProductService.checkIsVerifyCategoryByPdtId(batch.getProductId()); // 更新工段已入库数量和可用数量 gongDO.setInboundEndQuantity(gongDO.getInboundEndQuantity().add(reqQuantity)); gongDO.setRemaineQuantity(gongDO.getRemaineQuantity().subtract(reqQuantity)); materialBatchService.updateById(gongDO); // 更新批次已入库数量和可用数量 batch.setInboundEndQuantity(batch.getInboundEndQuantity().add(reqQuantity)); - batch.setRemaineQuantity(batch.getRemaineQuantity().subtract(reqQuantity)); + if (!isVerify) { + // 检定业务 检定流程提交时已经扣减过可用数量 + batch.setRemaineQuantity(batch.getRemaineQuantity().subtract(reqQuantity)); + } materialBatchService.updateById(batch); // 更新物料大类预警级别 materialProductService.updateMaterialProductAlarmLevel(Collections.singletonList(productId)); 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 afc8c125..4852fe12 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 @@ -310,13 +310,19 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , List batches = materialBatchService.getBatchListByBatchIds(batIds); if (CollUtil.isEmpty(batches) || batches.size() != batIds.size()) throw new ServiceException(1_032_160_000, "批次不存在或与传入的批次数量不匹配"); - // 检定数量检验 + for (MaterialBatchDO batch : batches) { + if (batch.getSubmitStatus() != 1) + throw new ServiceException(1_032_160_000, String.format("批次【%s】未提交,不可检定", batch.getBatchNo())); + } + // 检定数量校验 Map batchDOMapById = batches.stream().collect(Collectors.toMap(MaterialBatchDO::getId, Function.identity())); for (MaterialLifecycleDetailSaveReqVO reqDetail : reqDetails) { MaterialBatchDO batchDO = batchDOMapById.get(reqDetail.getBatchId()); - // 可用数量 BigDecimal remaineQuantity = batchDO.getRemaineQuantity(); + if (reqDetail.getInfluenceCount().compareTo(BigDecimal.ZERO) <= 0) + throw new ServiceException(1_032_160_000, "检定数量不能小于等于0"); if (reqDetail.getInfluenceCount().compareTo(remaineQuantity) > 0) + // 可用数量 throw new ServiceException(1_032_160_000, String.format("检定数量超过了批次【%s】可用数量【%s】", batchDO.getBatchNo(), remaineQuantity)); if (reqDetail.getQualifiedCount().compareTo(reqDetail.getInfluenceCount()) > 0) throw new ServiceException(1_032_160_000, "合格数量超过了检定数量"); 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 9d4ae049..45d9222a 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 @@ -132,4 +132,20 @@ public interface MaterialProductService { * @return 物料数据 */ MaterialProductRespVO getMaterialProductInfoWithFiles(Long id); + + /** + * 获取顶级分类 + * + * @param pdtIds 大类ids + * @return 顶级分类 + */ + List getTopCategoriesByPdtIds(List pdtIds); + + /** + * 检查是否是检定的分类 + * + * @param productId 大类id + * @return 是否是审核的分类 + */ + Boolean checkIsVerifyCategoryByPdtId(Long productId); } \ 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 ad89d246..f79571bc 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 @@ -11,9 +11,11 @@ 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.framework.mybatis.core.query.MPJLambdaWrapperX; 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.enums.QmsCommonConstant; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductPageReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductRespVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductSaveReqVO; @@ -22,6 +24,7 @@ import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialProductDO 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 lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -39,6 +42,7 @@ import static com.zt.plat.module.qms.enums.ErrorCodeConstants.*; * * @author 后台管理 */ +@Slf4j @Service @Validated public class MaterialProductServiceImpl implements MaterialProductService { @@ -355,15 +359,21 @@ public class MaterialProductServiceImpl implements MaterialProductService { .eqIfPresent(MaterialProductDO::getStandardSolutionFlag, queryVO.getStandardSolutionFlag()) .eqIfPresent(MaterialProductDO::getStandardMaterialFlag, queryVO.getStandardMaterialFlag()) .likeIfPresent(MaterialProductDO::getName, queryVO.getName()) - .and(StrUtil.isNotEmpty(queryVO.getCategoryCustomConfig()), - wrapper -> - wrapper.eq(MaterialProductDO::getNodeType, DataTypeConstant.DATA_TYPE_CATEGORY) - .like(MaterialProductDO::getCustomConfig, queryVO.getCategoryCustomConfig())); + .and(StrUtil.isNotEmpty(queryVO.getCategoryCustomConfig()),wrapper -> + wrapper.eq(MaterialProductDO::getNodeType, DataTypeConstant.DATA_TYPE_CATEGORY) + .like(MaterialProductDO::getCustomConfig, queryVO.getCategoryCustomConfig())); List mtrlDos = materialProductMapper.selectList(wrapperX); if (CollUtil.isEmpty(mtrlDos)) return List.of(); - return mtrlDos.stream().map(m -> BeanUtils.toBean(m, MaterialProductRespVO.class)).toList(); + if (StrUtil.isNotEmpty(queryVO.getCategoryCustomConfig()) && StrUtil.isEmpty(queryVO.getNodeType())) { + List ctgIds = mtrlDos.stream().map(MaterialProductDO::getId).toList(); + List pdts = materialProductMapper.selectList(Wrappers.lambdaQuery(MaterialProductDO.class) + .in(MaterialProductDO::getParentId, ctgIds)); + mtrlDos.addAll(pdts); + } + + return BeanUtils.toBean(mtrlDos, MaterialProductRespVO.class); } @Override @@ -441,4 +451,31 @@ public class MaterialProductServiceImpl implements MaterialProductService { return respVO; } + @Override + public List getTopCategoriesByPdtIds(List pdtIds) { + List productDOS = materialProductMapper.selectByIds(pdtIds); + // 获取顶级分类ids ipPath格式:/0/2015987059211448321/2018922665117827074/2018932101769150466/ + Set topCategoryIds = productDOS.stream() + .map(MaterialProductDO::getIdPath) + .filter(StrUtil::isNotEmpty) + .map(path -> path.split("/")) + .filter(segments -> segments.length > 2) + .map(segments -> segments[2]) + .map(Long::parseLong) + .collect(Collectors.toSet()); + return materialProductMapper.selectByIds(topCategoryIds); + } + + @Override + public Boolean checkIsVerifyCategoryByPdtId(Long productId) { + + List topCategories = this.getTopCategoriesByPdtIds(Collections.singletonList(productId)); + if (CollUtil.isEmpty(topCategories)) return false; + MaterialProductDO topCtg = topCategories.get(0); + JSONObject customConfig = JSONUtil.parseObj(topCtg.getCustomConfig()); + Object verifyCalibrateFlag = customConfig.get("verifyCalibrateFlag"); + if (verifyCalibrateFlag == null) return false; + return "1".equals(verifyCalibrateFlag); + } + } \ 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/MaterialUseRecordServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseRecordServiceImpl.java index 211a1c73..51adce40 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseRecordServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseRecordServiceImpl.java @@ -55,6 +55,7 @@ public class MaterialUseRecordServiceImpl implements MaterialUseRecordService { BigDecimal operationQuantity = createReqVO.getOperationQuantity(); MaterialInfomationDO infomationDO = materialInfomationService.getMaterialInfomation(infomationId); if (infomationDO == null) throw new ServiceException(1_032_160_000, "物料实例不存在"); + if (infomationDO.getUseEndFlag() == 1) throw new ServiceException(1_032_160_000, "物料已用完"); // 使用量不能大于剩余量 BigDecimal remainingVolume = infomationDO.getRemainingVolume();