diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/constant/MaterialConstants.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/constant/MaterialConstants.java index 2f2045fd..08673862 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/constant/MaterialConstants.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/constant/MaterialConstants.java @@ -9,6 +9,7 @@ public class MaterialConstants { public static final String DICT_MATERIAL_INBOUND_QUANTITY_LIMIT = "materialInboundQuantityLimit"; // 序列号 + public static final String SEQUENCE_BATCH_KEY = "QMS_MATERIAL_BATCH_NO"; public static final String SEQUENCE_INF_KEY = "QMS_MATERIAL_INF_NO"; // 外部模块 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 8991f500..2e4b5730 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 @@ -92,12 +92,7 @@ public class MaterialBatchController implements BusinessControllerMarker { @Operation(summary = "获得物料批次分页") // @PreAuthorize("@ss.hasPermission('qms:material-batch:query')") public CommonResult> getMaterialBatchPage(@Valid MaterialBatchPageReqVO pageReqVO) { - PageResult pageResult; - if (!pageReqVO.getOnlyGong()) { - pageResult = materialBatchService.getMaterialBatchPageWithPdtInfo(pageReqVO); - } else { - pageResult = materialBatchService.getMaterialBatchGongPageWithPdtInfo(pageReqVO); - } + PageResult pageResult = materialBatchService.getBatchGongPageWithPdtInfo(pageReqVO); return success(pageResult); } 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 dcb8d6a0..a455185e 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 @@ -65,14 +65,6 @@ public class MaterialProductController extends AbstractFileUploadController impl return success(materialProductService.getMaterialCategoryTree()); } - // TODO 后边再对接 - @GetMapping("/orig-material/{code}") - @Operation(summary = "根据物料编码获取外部系统原始物料") - public CommonResult getOriginalMaterial(@PathVariable String code) { - - return success(new MaterialProductRespVO().setCode(code).setName("测试物料")); - } - @PostMapping("/save-material") @Operation(summary = "保存物料大类") // @PreAuthorize("@ss.hasPermission('qms:material-product:create')") 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 f0301b7e..fb4f52c4 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 @@ -22,8 +22,8 @@ public class MaterialBatchPageReqVO extends PageParam { @Schema(description = "是否需要组装 children") private Boolean children = false; - @Schema(description = "是否只需要工段") - private Boolean onlyGong = false; + @Schema(description = "数据类型 batch-批次,gong-工段,空-全部") + private String dataType; @Schema(description = "true-已处理,false-未处理") private Boolean treatment = false; @@ -31,9 +31,6 @@ public class MaterialBatchPageReqVO extends PageParam { @Schema(description = "批次编号") private String batchNo; -// @Schema(description = "总数量") -// private BigDecimal inboundQuantity; - @Schema(description = "存放位置描述") private String location; @@ -57,7 +54,7 @@ public class MaterialBatchPageReqVO extends PageParam { @Schema(description = "提交状态,0-未提交,1-已提交", example = "1") private Integer submitStatus; - @Schema(description = "验收状态", example = "1") + @Schema(description = "验收状态 accepted-已验收,not_accepted-未验收") private String acceptanceStatus; @Schema(description = "是否检化验,1-是,0-否") 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 b00a5fc1..cf626edd 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 @@ -15,6 +15,9 @@ public class MaterialProductQueryVO { @Schema(description = "category-分类,data-大类sku,空-全部数据") private String nodeType; + @Schema(description = "名称", example = "ZT") + private String name; + @Schema(description = "允许按量领取,1-领用时输入量,按量领取;0-领用时不能输入量,整个领走") private Integer enablePartial; 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 c4634773..6fe6bbba 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 @@ -1,6 +1,7 @@ package com.zt.plat.module.qms.resource.material.dal.mapper; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; @@ -15,6 +16,7 @@ import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchRespV 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.enums.MaterialAcceptStatus; +import com.zt.plat.module.qms.resource.material.enums.MaterialBatchGongType; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -46,6 +48,7 @@ public interface MaterialBatchMapper extends BaseMapperX { .orderByDesc(MaterialBatchDO::getId)); } + // @QmsPermission(deptDataRoleCodes = "ytjyDeptAndSub", moduleDataRoleCodes = "qms_material_manager") default PageResult selectPageWithPdtInfo(MaterialBatchPageReqVO reqVO, List pdtIds) { MPJLambdaWrapper wrapper = new MPJLambdaWrapperX() @@ -53,86 +56,39 @@ public interface MaterialBatchMapper extends BaseMapperX { .selectAs(MaterialProductDO::getName, MaterialBatchRespVO::getProductName) .selectAs(MaterialProductDO::getCode, MaterialBatchRespVO::getProductCode) .selectAs(MaterialProductDO::getModelNo, MaterialBatchRespVO::getProductModelNo) - .leftJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialBatchDO::getProductId) - // 只查询批次 - .eq(MaterialBatchDO::getParentId, 0) - .in(CollUtil.isNotEmpty(pdtIds), MaterialBatchDO::getProductId, pdtIds) - .eq(CollUtil.isEmpty(pdtIds) && reqVO.getProductId() != null, MaterialBatchDO::getProductId, reqVO.getProductId()) - .eqIfExists(MaterialBatchDO::getSubmitStatus, reqVO.getSubmitStatus()) - .likeIfExists(MaterialBatchDO::getBatchNo, reqVO.getBatchNo()) - .likeIfExists(MaterialBatchDO::getLocation, reqVO.getLocation()) - .likeIfExists(MaterialBatchDO::getSupplierId, reqVO.getSupplierId()) -// .betweenIfPresent(MaterialBatchDO::getManufacturerDate, reqVO.getManufacturerDate()) -// .betweenIfPresent(MaterialBatchDO::getDueDate, reqVO.getDueDate()) - .eqIfExists(MaterialBatchDO::getAssignDepartmentId, reqVO.getAssignDepartmentId()) - .likeIfExists(MaterialBatchDO::getAssignDepartmentName, reqVO.getAssignDepartmentName()) - .eqIfExists(MaterialBatchDO::getAcceptanceStatus, reqVO.getAcceptanceStatus()) - .eqIfExists(MaterialBatchDO::getAssayFlag, reqVO.getAssayFlag()) - .eqIfExists(MaterialBatchDO::getAssayStatus, reqVO.getAssayStatus()) - .eqIfExists(MaterialBatchDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode()) - .eqIfExists(MaterialBatchDO::getRemark, reqVO.getRemark()) -// .betweenIfPresent(MaterialBatchDO::getCreateTime, reqVO.getCreateTime()) - .orderByDesc(MaterialBatchDO::getId); - return selectJoinPage(reqVO, MaterialBatchRespVO.class, wrapper); - } - - @QmsPermission(deptDataRoleCodes = "ytjyDeptAndSub", moduleDataRoleCodes = "qms_material_manager") - default PageResult selectGongPage(MaterialBatchPageReqVO reqVO, List pdtIds) { - - MPJLambdaWrapper wrapper = new MPJLambdaWrapperX() - .selectAll(MaterialBatchDO.class) - .selectAs(MaterialProductDO::getName, MaterialBatchRespVO::getProductName) - .selectAs(MaterialProductDO::getCode, MaterialBatchRespVO::getProductCode) - .selectAs(MaterialProductDO::getModelNo, MaterialBatchRespVO::getProductModelNo) - .selectAs("batch.MFR_DT", MaterialBatchDO::getManufacturerDate) - .selectAs("batch.DUE_DT", MaterialBatchDO::getDueDate) - .leftJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialBatchDO::getProductId) - .leftJoin(MaterialBatchDO.class, "batch", MaterialBatchDO::getId, MaterialBatchDO::getParentId) - // 只查询工段 - .ne(MaterialBatchDO::getParentId, 0) - .eq(MaterialBatchDO::getSubmitStatus, 1) - .ne(MaterialBatchDO::getAcceptanceStatus, MaterialAcceptStatus.accepted.name()) - // 未处理的不允许再次选择 - .notExists("SELECT 1 FROM t_mtrl_lfc_dtl ld WHERE ld.BAT_GONG_ID = t.ID AND ld.TMT_STS = 0 AND ld.DELETED = 0") - .in(CollUtil.isNotEmpty(pdtIds), MaterialBatchDO::getProductId, pdtIds) - .eq(CollUtil.isEmpty(pdtIds) && reqVO.getProductId() != null, MaterialBatchDO::getProductId, reqVO.getProductId()) - .likeIfExists(MaterialBatchDO::getBatchNo, reqVO.getBatchNo()) - .likeIfExists(MaterialBatchDO::getLocation, reqVO.getLocation()) - .likeIfExists(MaterialBatchDO::getSupplierId, reqVO.getSupplierId()) - .eqIfExists(MaterialBatchDO::getAssignDepartmentId, reqVO.getAssignDepartmentId()) - .likeIfExists(MaterialBatchDO::getAssignDepartmentName, reqVO.getAssignDepartmentName()) - .eqIfExists(MaterialBatchDO::getAcceptanceStatus, reqVO.getAcceptanceStatus()) - .eqIfExists(MaterialBatchDO::getAssayFlag, reqVO.getAssayFlag()) - .eqIfExists(MaterialBatchDO::getAssayStatus, reqVO.getAssayStatus()) - .eqIfExists(MaterialBatchDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode()) - .eqIfExists(MaterialBatchDO::getRemark, reqVO.getRemark()) - .orderByDesc(MaterialBatchDO::getParentId); - return selectJoinPage(reqVO, MaterialBatchRespVO.class, wrapper); - } - - @QmsPermission(deptDataRoleCodes = "ytjyDeptAndSub", moduleDataRoleCodes = "qms_material_manager") - default PageResult selectAcceptedGongPage(MaterialBatchPageReqVO reqVO, List pdtIds) { - - MPJLambdaWrapper wrapper = new MPJLambdaWrapperX() - .selectAll(MaterialBatchDO.class) - .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) .leftJoin(MaterialBatchDO.class, "batch", MaterialBatchDO::getId, MaterialBatchDO::getParentId) - // 只查询工段 - .ne(MaterialBatchDO::getParentId, 0) - .eq(MaterialBatchDO::getSubmitStatus, 1) + // 只要批次 + .eq(MaterialBatchGongType.batch.name().equals(reqVO.getDataType()), MaterialBatchDO::getParentId, 0) + // 只要工段 + .ne(MaterialBatchGongType.gong.name().equals(reqVO.getDataType()), MaterialBatchDO::getParentId, 0) + // 用于批次分页 + .eq(StrUtil.isBlank(reqVO.getDataType()) && reqVO.getChildren(), MaterialBatchDO::getParentId, 0) + // 用于退换货(已提交) + .eqIfExists(MaterialBatchDO::getSubmitStatus, reqVO.getSubmitStatus()) + // 用于验收(提交且未验收) + // 用于入库(提交且已验收) + .eqIfExists(MaterialBatchDO::getAcceptanceStatus, reqVO.getAcceptanceStatus()) + // 用于验收 + .notExists(reqVO.getSubmitStatus() != null && reqVO.getSubmitStatus() == 1 && MaterialAcceptStatus.not_accepted.name().equals(reqVO.getAcceptanceStatus()), + "SELECT 1 FROM t_mtrl_lfc_dtl ld WHERE ld.BAT_GONG_ID = t.ID AND ld.TMT_STS = 0 AND ld.DELETED = 0") + // 用于入库(分已处理和未处理) + // 已处理 + .apply(reqVO.getSubmitStatus() != null && reqVO.getSubmitStatus() == 1 && MaterialAcceptStatus.accepted.name().equals(reqVO.getAcceptanceStatus()) + && reqVO.getTreatment(), "t.INB_END_QTY >= t.INB_QTY") + // 未处理 + .apply(reqVO.getSubmitStatus() != null && reqVO.getSubmitStatus() == 1 && MaterialAcceptStatus.accepted.name().equals(reqVO.getAcceptanceStatus()) + && !reqVO.getTreatment(), "t.INB_END_QTY < t.INB_QTY") .in(CollUtil.isNotEmpty(pdtIds), MaterialBatchDO::getProductId, pdtIds) .eq(CollUtil.isEmpty(pdtIds) && reqVO.getProductId() != null, MaterialBatchDO::getProductId, reqVO.getProductId()) .likeIfExists(MaterialBatchDO::getBatchNo, reqVO.getBatchNo()) .likeIfExists(MaterialBatchDO::getLocation, reqVO.getLocation()) .likeIfExists(MaterialBatchDO::getSupplierId, reqVO.getSupplierId()) - // .betweenIfPresent(MaterialBatchDO::getManufacturerDate, reqVO.getManufacturerDate()) - // .betweenIfPresent(MaterialBatchDO::getDueDate, reqVO.getDueDate()) .eqIfExists(MaterialBatchDO::getAssignDepartmentId, reqVO.getAssignDepartmentId()) .likeIfExists(MaterialBatchDO::getAssignDepartmentName, reqVO.getAssignDepartmentName()) .eqIfExists(MaterialBatchDO::getAcceptanceStatus, reqVO.getAcceptanceStatus()) @@ -140,10 +96,6 @@ public interface MaterialBatchMapper extends BaseMapperX { .eqIfExists(MaterialBatchDO::getAssayStatus, reqVO.getAssayStatus()) .eqIfExists(MaterialBatchDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode()) .eqIfExists(MaterialBatchDO::getRemark, reqVO.getRemark()) - // 已处理 - .apply(reqVO.getTreatment(), "t.INB_END_QTY >= t.INB_QTY") - // 未处理 - .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/MaterialUseRecordMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialUseRecordMapper.java index 1ce80d1f..ea085cc1 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialUseRecordMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialUseRecordMapper.java @@ -44,6 +44,8 @@ public interface MaterialUseRecordMapper extends BaseMapperX wrapperX = new MPJLambdaWrapperX() .selectAll(MaterialUseRecordDO.class) .selectAs(MaterialInfomationDO::getCode, MaterialUseRecordRespVO::getInfomationCode) + .selectAs(MaterialProductDO::getName, MaterialUseRecordRespVO::getInfomationName) + .selectAs(MaterialProductDO::getModelNo, MaterialUseRecordRespVO::getModelNo) .leftJoin(MaterialInfomationDO.class, MaterialInfomationDO::getId, MaterialUseRecordDO::getInfomationId) .innerJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialInfomationDO::getProductId) .eqIfPresent(MaterialProductDO::getId, reqVO.getProductId()) diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialAcceptStatus.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialAcceptStatus.java index c6cc688a..4264f53b 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialAcceptStatus.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialAcceptStatus.java @@ -12,9 +12,9 @@ public enum MaterialAcceptStatus { /** * 部分验收 */ - partAccepted, + part_accepted, /** * 未验收 */ - notAccepted + not_accepted } diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchGongType.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchGongType.java new file mode 100644 index 00000000..5b4f685f --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchGongType.java @@ -0,0 +1,16 @@ +package com.zt.plat.module.qms.resource.material.enums; + +/** + * 物料批次工段枚举 + * + */ +public enum MaterialBatchGongType { + /** + * 批次 + */ + batch, + /** + * 工段 + */ + gong +} 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 56a9c106..30728fec 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 @@ -64,14 +64,6 @@ public interface MaterialBatchService { */ PageResult getMaterialBatchPage(MaterialBatchPageReqVO pageReqVO); - /** - * 获得物料批次分页-可根据物料分类和大类级联查询 - * - * @param pageReqVO 分页查询 - * @return 物料批次分页 - */ - PageResult getMaterialBatchPageWithPdtInfo(MaterialBatchPageReqVO pageReqVO); - /** * 批次工段拆分 * @@ -80,22 +72,6 @@ public interface MaterialBatchService { */ List assignMaterialBatchGongduan(@Valid List createReqVOs); - /** - * 检查物料大类下是否有物料批次 - * - * @param pdtId id - * @return 存在与否 - */ - boolean checkIsExistsDataByPdt(Long pdtId); - - /** - * 检查物料大类下是否有物料批次 - * - * @param ids id 集合 - * @return 存在与否 - */ - boolean checkIsExistsDataByPdts(List ids); - /** * 获取工段列表 * @@ -120,14 +96,6 @@ public interface MaterialBatchService { */ List getGongduanListByGongIds(List gongIds); - /** - * 获得批次工段分页 - 需要可以层级穿透查询及返回物料信息 - * - * @param pageReqVO 分页请求参数 - * @return 分页数据 - */ - PageResult getMaterialBatchGongPageWithPdtInfo(@Valid MaterialBatchPageReqVO pageReqVO); - /** * 更新批次工段入库数量 * @@ -190,4 +158,12 @@ public interface MaterialBatchService { * @param lockType 锁定类型 */ void lockGongduanReturnExchangeCount(List gongs, LockType lockType); + + /** + * 获得批次工段分页 - 需要可以层级穿透查询及返回物料信息 + * + * @param pageReqVO 分页请求参数 + * @return 分页数据 + */ + PageResult getBatchGongPageWithPdtInfo(@Valid MaterialBatchPageReqVO pageReqVO); } \ 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 5d6bef82..f6a8e8de 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 @@ -1,6 +1,7 @@ package com.zt.plat.module.qms.resource.material.service; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zt.plat.framework.common.exception.ServiceException; import com.zt.plat.framework.common.pojo.PageResult; @@ -8,6 +9,7 @@ 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.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; @@ -25,6 +27,7 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; @@ -54,15 +57,13 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { @Autowired private MaterialLifecycleDetailService materialLifecycleDetailService; - private final String batchSequenceKey = "QMS_MATERIAL_BATCH_NO"; - @Override public MaterialBatchRespVO createMaterialBatch(MaterialBatchSaveReqVO createReqVO) { // 插入 MaterialBatchDO mtrlBat = BeanUtils.toBean(createReqVO, MaterialBatchDO.class); - mtrlBat.setAcceptanceStatus(MaterialAcceptStatus.notAccepted.name()); + mtrlBat.setAcceptanceStatus(MaterialAcceptStatus.not_accepted.name()); // 批次编号 - mtrlBat.setBatchNo(sequenceUtil.genCode(batchSequenceKey)); + mtrlBat.setBatchNo(sequenceUtil.genCode(MaterialConstants.SEQUENCE_BATCH_KEY)); mtrlBat.setParentId(0L); mtrlBat.setInitialQuantity(mtrlBat.getInboundQuantity()); @@ -138,50 +139,6 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { return materialBatchMapper.selectPage(pageReqVO); } - @Override - public PageResult getMaterialBatchPageWithPdtInfo(MaterialBatchPageReqVO pageReqVO) { - Long pdtId = pageReqVO.getProductId(); - PageResult pageResult; - if (pdtId == null) { - pageResult = materialBatchMapper.selectPageWithPdtInfo(pageReqVO, List.of()); - } else { - List mtrlDos = materialProductService.getMaterialProductsByLikeIdPath(pdtId); - if (CollUtil.isEmpty(mtrlDos)) { - pageResult = materialBatchMapper.selectPageWithPdtInfo(pageReqVO, List.of()); - } else { - List pdtIds = mtrlDos.stream().map(MaterialProductDO::getId).toList(); - pageResult = materialBatchMapper.selectPageWithPdtInfo(pageReqVO, pdtIds); - } - } - // 如果获取是批次分页,再根据批次ids获取工段 - List batches = pageResult.getList(); - if (CollUtil.isNotEmpty(batches)) { - List batIds = batches.stream().map(MaterialBatchRespVO::getId).toList(); - List gongs = materialBatchMapper.selectList(Wrappers.lambdaQuery(MaterialBatchDO.class) - .in(MaterialBatchDO::getParentId, batIds)); - if (CollUtil.isNotEmpty(gongs)) { - List gongRespVOs = gongs.stream().map(gong -> BeanUtils.toBean(gong, MaterialBatchRespVO.class)).toList(); - batches.addAll(gongRespVOs); - pageResult.setList(batches); - } - } - if (!pageReqVO.getChildren()) return pageResult; - 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); - } - - return pageResult; - } - /** * 批次工段拆分 * @@ -220,7 +177,7 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { MaterialBatchDO bean = BeanUtils.toBean(batAsn, MaterialBatchDO.class); bean.setProductId(mtrlBat.getProductId()).setBatchNo(mtrlBat.getBatchNo()) .setInitialQuantity(bean.getInboundQuantity()) - .setAcceptanceStatus(MaterialAcceptStatus.notAccepted.name()); + .setAcceptanceStatus(MaterialAcceptStatus.not_accepted.name()); return bean; }).toList(); materialBatchMapper.insertBatch(gongEts); @@ -231,24 +188,6 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { } - @Override - public boolean checkIsExistsDataByPdt(Long pdtId) { - - return materialBatchMapper.exists(Wrappers.lambdaQuery(MaterialBatchDO.class) - .eq(MaterialBatchDO::getProductId, pdtId) - .eq(MaterialBatchDO::getParentId, 0)); - } - - - @Override - public boolean checkIsExistsDataByPdts(List ids) { - - return materialBatchMapper.exists(Wrappers.lambdaQuery(MaterialBatchDO.class) - .in(MaterialBatchDO::getProductId, ids) - .eq(MaterialBatchDO::getParentId, 0)); - } - - @Override public List getGongduanListByBatIds(List batIds) { @@ -263,9 +202,18 @@ 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, "批次已经提交过"); - boolean exists = materialBatchMapper.exists(Wrappers.lambdaQuery(MaterialBatchDO.class) - .eq(MaterialBatchDO::getParentId, id)); - if (!exists) 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()); + } + if (batchDO.getInboundQuantity().compareTo(gongTotalInbQuantity) != 0) + throw exception(GONGDUAN_QUANTITY_MATERIAL_BATCH_NOT_EQUAL); batchDO.setSubmitStatus(1).setSubmitDate(LocalDateTime.now()); materialBatchMapper.updateById(batchDO); // 提交工段 @@ -283,35 +231,6 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { .ne(MaterialBatchDO::getParentId, 0)); } - - @Override - public PageResult getMaterialBatchGongPageWithPdtInfo(MaterialBatchPageReqVO pageReqVO) { - Long pdtId = pageReqVO.getProductId(); - if (MaterialAcceptStatus.accepted.name().equals(pageReqVO.getAcceptanceStatus())) { - // 用于入库 - if (pdtId == null) { - return materialBatchMapper.selectAcceptedGongPage(pageReqVO, List.of()); - } - List mtrlDos = materialProductService.getMaterialProductsByLikeIdPath(pdtId); - if (CollUtil.isEmpty(mtrlDos)) { - return materialBatchMapper.selectAcceptedGongPage(pageReqVO, List.of()); - } - List pdtIds = mtrlDos.stream().map(MaterialProductDO::getId).toList(); - return materialBatchMapper.selectAcceptedGongPage(pageReqVO, pdtIds); - } - // 用于验收 - // 需要排除已经被选择的工段 - if (pdtId == null) { - return materialBatchMapper.selectGongPage(pageReqVO, List.of()); - } - List mtrlDos = materialProductService.getMaterialProductsByLikeIdPath(pdtId); - if (CollUtil.isEmpty(mtrlDos)) { - return materialBatchMapper.selectGongPage(pageReqVO, List.of()); - } - List pdtIds = mtrlDos.stream().map(MaterialProductDO::getId).toList(); - return materialBatchMapper.selectGongPage(pageReqVO, pdtIds); - } - @Override public void updateMaterialBatchInbEndQty(MaterialBatchDO gongDO) { materialBatchMapper.updateById(gongDO); @@ -414,6 +333,52 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { materialBatchMapper.updateBatch(batDOS); } + @Override + public PageResult getBatchGongPageWithPdtInfo(MaterialBatchPageReqVO pageReqVO) { + // 分为 批次分页、验收、入库、退换货 + Long pdtId = pageReqVO.getProductId(); + PageResult pageResult; + if (pdtId == null) { + pageResult = materialBatchMapper.selectPageWithPdtInfo(pageReqVO, List.of()); + } else { + List mtrlDos = materialProductService.getMaterialProductsByLikeIdPath(pdtId); + if (CollUtil.isEmpty(mtrlDos)) { + pageResult = materialBatchMapper.selectPageWithPdtInfo(pageReqVO, List.of()); + } else { + List pdtIds = mtrlDos.stream().map(MaterialProductDO::getId).toList(); + pageResult = materialBatchMapper.selectPageWithPdtInfo(pageReqVO, pdtIds); + } + } + // 需要 children + if (StrUtil.isNotEmpty(pageReqVO.getDataType()) || !pageReqVO.getChildren()) + return pageResult; + List batches = pageResult.getList(); + if (CollUtil.isNotEmpty(batches)) { + List batIds = batches.stream().map(MaterialBatchRespVO::getId).toList(); + List gongs = materialBatchMapper.selectList(Wrappers.lambdaQuery(MaterialBatchDO.class) + .in(MaterialBatchDO::getParentId, batIds)); + if (CollUtil.isNotEmpty(gongs)) { + List gongRespVOs = gongs.stream().map(gong -> BeanUtils.toBean(gong, MaterialBatchRespVO.class)).toList(); + batches.addAll(gongRespVOs); + pageResult.setList(batches); + } + } + + 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); + } + return pageResult; + } + 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/MaterialInventoryInboundServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryInboundServiceImpl.java index 9c5daa40..1fefa803 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 @@ -89,20 +89,27 @@ public class MaterialInventoryInboundServiceImpl implements MaterialInventoryInb if (!MaterialAcceptStatus.accepted.name().equals(gongDO.getAcceptanceStatus())) throw new ServiceException(1_032_160_000, "工段未验收,不能入库"); - // 2.入库数量不大于批次工段数量 - // TODO 这儿应该调整为去物料实例统计出此工段的入库数量 + // 2. 计算已入库总量并校验 List inboundDOS = materialInventoryInboundMapper.selectList(Wrappers.lambdaQuery(MaterialInventoryInboundDO.class) - .eq(MaterialInventoryInboundDO::getGongduanId, gongduanId)); - if (CollUtil.isNotEmpty(inboundDOS)) { - BigDecimal totalQuantity = reqQuantity; - for (MaterialInventoryInboundDO inboundDO : inboundDOS) { - totalQuantity = totalQuantity.add(inboundDO.getQuantity()); - } - if (totalQuantity.compareTo(gongDO.getInboundQuantity()) > 0) - throw new ServiceException(1_032_160_000, "入库数量不能大于批次工段未入库数量"); - } else if (reqQuantity.compareTo(gongDO.getInboundQuantity()) > 0) { - throw new ServiceException(1_032_160_000, "入库数量不能大于批次工段数量"); + .eq(MaterialInventoryInboundDO::getGongduanId, gongduanId)); + BigDecimal existingQuantity = inboundDOS.stream() + .map(MaterialInventoryInboundDO::getQuantity) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal totalQuantity = existingQuantity.add(reqQuantity); + + // 校验入库数量不超过工段未入库数量 + if (totalQuantity.compareTo(gongDO.getInboundQuantity()) > 0) { + throw new ServiceException(1_032_160_000, "入库数量不能大于批次工段未入库数量"); } + + // 校验入库数量不超过工段可用数量(考虑锁定数量) + if (gongDO.getLockQuantity().compareTo(BigDecimal.ZERO) > 0) { + BigDecimal availableQuantity = gongDO.getInboundQuantity().subtract(gongDO.getLockQuantity()); + if (totalQuantity.compareTo(availableQuantity) > 0) { + throw new ServiceException(1_032_160_000, "入库数量不能大于批次工段可用数量"); + } + } + // 3.保存入库记录 MaterialInventoryInboundDO inbound = saveInbound(createReqVO, gongDO); // 4.生成物料实例 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 804c3b6c..c4d9f17d 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 @@ -187,8 +187,10 @@ public class MaterialProductServiceImpl implements MaterialProductService { MaterialProductDO mtrl = BeanUtils.toBean(createReqVO, MaterialProductDO.class); mtrl.setNodeType(DataTypeConstant.DATA_TYPE_DATA); + // 编码 + 型号 做重复检查条件 LambdaQueryWrapperX queryWrapperX = new LambdaQueryWrapperX() .eqIfPresent(MaterialProductDO::getCode, createReqVO.getCode()) + .eqIfPresent(MaterialProductDO::getModelNo, createReqVO.getModelNo()) .eqIfPresent(MaterialProductDO::getNodeType, DataTypeConstant.DATA_TYPE_DATA); // 新增 if (reqId == null) { @@ -210,10 +212,9 @@ public class MaterialProductServiceImpl implements MaterialProductService { // 修改 MaterialProductDO origDO = materialProductMapper.selectById(reqId); if (origDO == null) throw exception(MATERIAL_PRODUCT_NOT_EXISTS); - if (mtrl.getCode() != null && !mtrl.getCode().equals(origDO.getCode())) { - boolean exists = materialProductMapper.exists(queryWrapperX); - if (exists) throw exception(MATERIAL_PRODUCT_CODE_EXISTED); - } + queryWrapperX.neIfPresent(MaterialProductDO::getId, reqId); + boolean exists = materialProductMapper.exists(queryWrapperX); + if (exists) throw exception(MATERIAL_PRODUCT_CODE_EXISTED); businessFileService.deleteBusinessFileList(createReqVO.getDeleteFileIdList()); @@ -338,7 +339,8 @@ public class MaterialProductServiceImpl implements MaterialProductService { .eqIfPresent(MaterialProductDO::getNodeType, queryVO.getNodeType()) .eqIfPresent(MaterialProductDO::getHazardous, queryVO.getHazardous()) .eqIfPresent(MaterialProductDO::getStandardSolutionFlag, queryVO.getStandardSolutionFlag()) - .eqIfPresent(MaterialProductDO::getStandardMaterialFlag, queryVO.getStandardMaterialFlag()); + .eqIfPresent(MaterialProductDO::getStandardMaterialFlag, queryVO.getStandardMaterialFlag()) + .likeIfPresent(MaterialProductDO::getName, queryVO.getName()); List mtrlDos = materialProductMapper.selectList(wrapperX); if (CollUtil.isEmpty(mtrlDos)) return List.of();