From 835b3cab83809bc79f2e4c365cef4dea15578ed6 Mon Sep 17 00:00:00 2001 From: shusir <497819738@qq.com> Date: Thu, 5 Mar 2026 18:05:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E7=89=A9=E6=96=99=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=8C=E5=BC=80=E5=B0=81=E3=80=81=E5=88=B0?= =?UTF-8?q?=E6=9C=9F=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MaterialInventoryOutboundController.java | 20 +++++++ .../controller/vo/MaterialBatchPageReqVO.java | 3 + .../controller/vo/MaterialBatchRespVO.java | 4 ++ .../vo/MaterialInfomationPageReqVO.java | 9 +++ .../MaterialInventoryOutboundPageReqVO.java | 3 + .../vo/MaterialInventoryOutboundRespVO.java | 42 +++++++++---- .../MaterialConsumeStatisticsExportVO.java | 53 +++++++++++++++++ .../vo/query/MaterialInfomationQueryVO.java | 4 ++ .../dal/mapper/MaterialBatchMapper.java | 7 ++- .../dal/mapper/MaterialInfomationMapper.java | 7 ++- .../MaterialInventoryOutboundMapper.java | 51 ++++++++++++++++ .../dal/mapper/MaterialProductMapper.java | 8 +++ .../enums/MaterialBatchOperationType.java | 24 ++++++++ .../material/enums/MaterialInboundType.java | 4 +- .../enums/MaterialInfomationOrigin.java | 6 +- .../enums/MaterialNormalOperationType.java | 2 + .../resource/material/job/MaterialJob.java | 38 ++++++++++++ .../service/MaterialBatchServiceImpl.java | 49 ++++++++------- .../service/MaterialInfomationService.java | 15 +++++ .../MaterialInfomationServiceImpl.java | 59 +++++++++++++++++-- .../MaterialInventoryOutboundService.java | 8 +++ .../MaterialInventoryOutboundServiceImpl.java | 48 +++++++++++++-- .../service/MaterialLifecycleServiceImpl.java | 9 --- .../service/MaterialProductServiceImpl.java | 4 +- .../MaterialUseEndReuseServiceImpl.java | 10 +++- 25 files changed, 424 insertions(+), 63 deletions(-) create mode 100644 zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/export/MaterialConsumeStatisticsExportVO.java create mode 100644 zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchOperationType.java create mode 100644 zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/job/MaterialJob.java diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialInventoryOutboundController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialInventoryOutboundController.java index 8ee92d69..e90f5576 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialInventoryOutboundController.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/admin/MaterialInventoryOutboundController.java @@ -14,6 +14,7 @@ import com.zt.plat.framework.excel.core.util.ExcelUtils; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryOutboundPageReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryOutboundRespVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryOutboundSaveReqVO; +import com.zt.plat.module.qms.resource.material.controller.vo.export.MaterialConsumeStatisticsExportVO; import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInventoryOutboundDO; import com.zt.plat.module.qms.resource.material.service.MaterialInventoryOutboundService; import io.swagger.v3.oas.annotations.Operation; @@ -113,4 +114,23 @@ public class MaterialInventoryOutboundController extends AbstractFileUploadContr BeanUtils.toBean(list, MaterialInventoryOutboundRespVO.class)); } + @GetMapping("/consume-statistics") + @Operation(summary = "按部门消耗统计") + public CommonResult> getUsageOutboundStatisticsByDept(@Valid MaterialInventoryOutboundPageReqVO reqVO) { + List outboundRespVOS = materialInventoryOutboundService.getUsageOutboundStatisticsByDept(reqVO); + return success(outboundRespVOS); + } + + @GetMapping("/consume-statistics/export-excel") + @Operation(summary = "导出按部门消耗统计 Excel") + @ApiAccessLog(operateType = EXPORT) + public void exportUsageOutboundStatisticsExcel(@Valid MaterialInventoryOutboundPageReqVO reqVO, + HttpServletResponse response) throws IOException { + List list = materialInventoryOutboundService.getUsageOutboundStatisticsByDept(reqVO); + // 导出 Excel + ExcelUtils.write(response, "物料消耗统计.xls", "数据", MaterialConsumeStatisticsExportVO.class, + BeanUtils.toBean(list, MaterialConsumeStatisticsExportVO.class)); + + } + } \ 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/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 fb4f52c4..bd9d19a8 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 @@ -19,6 +19,9 @@ public class MaterialBatchPageReqVO extends PageParam { @Schema(description = "物料大类id", example = "9381") private Long productId; + @Schema(description = "功能操作类型 batch_manage-批次管理,acceptance-验收,inbound-入库,return_exchange-退换货") + private String operationType; + @Schema(description = "是否需要组装 children") private Boolean children = false; 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 5c19c536..ee0acb8e 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 = "额定容量") + @ExcelProperty("额定容量") + private BigDecimal standardCapacity; + @Schema(description = "标签模板key") @ExcelProperty("标签模板key") private String labelTemplateKey; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInfomationPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInfomationPageReqVO.java index 61a2943b..4632de6b 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInfomationPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInfomationPageReqVO.java @@ -83,6 +83,15 @@ public class MaterialInfomationPageReqVO extends PageParam { @Schema(description = "用完标记,0-未标记,1-已用完标记") private Integer useEndFlag; + @Schema(description = "是否危险品,1-是,0-否") + private Integer hazardous; + + @Schema(description = "是否标准溶液,1-是,0-否") + private Integer standardSolutionFlag; + + @Schema(description = "是否标准物质,1-是,0-否") + private Integer standardMaterialFlag; + @Schema(description = "所属部门") private String systemDepartmentCode; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryOutboundPageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryOutboundPageReqVO.java index bff344b0..1b3a1f32 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryOutboundPageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryOutboundPageReqVO.java @@ -35,6 +35,9 @@ public class MaterialInventoryOutboundPageReqVO extends PageParam { @Schema(description = "申请部门id", example = "845") private Long applyDepartmentId; + @Schema(description = "物料名称") + private String productName; + @Schema(description = "申请时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] applyTime; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryOutboundRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryOutboundRespVO.java index 229eff06..49ab8f70 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryOutboundRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialInventoryOutboundRespVO.java @@ -28,6 +28,34 @@ public class MaterialInventoryOutboundRespVO { @ExcelProperty("业务类型编码") private String businessTypeCode; + @Schema(description = "物料 ID") + @ExcelProperty("物料 ID") + private Long productId; + + @Schema(description = "申请时间") + @ExcelProperty("日期") + private LocalDateTime applyTime; + + @Schema(description = "物料名称", example = "硫酸") + @ExcelProperty("试剂名称") + private String productName; + + @Schema(description = "申请部门") + @ExcelProperty("消耗部门") + private String applyDepartment; + + @Schema(description = "申请部门id", example = "845") + @ExcelProperty("消耗部门id") + private Long applyDepartmentId; + + @Schema(description = "物料型号", example = "AR 500ml") + @ExcelProperty("规格型号") + private String productModelNo; + + @Schema(description = "物料单位", example = "瓶") + @ExcelProperty("单位") + private String unit; + @Schema(description = "申请人") @ExcelProperty("申请人") private String applyUser; @@ -36,17 +64,9 @@ public class MaterialInventoryOutboundRespVO { @ExcelProperty("申请人id") private Long applyUserId; - @Schema(description = "申请部门") - @ExcelProperty("申请部门") - private String applyDepartment; - - @Schema(description = "申请部门id", example = "845") - @ExcelProperty("申请部门id") - private Long applyDepartmentId; - - @Schema(description = "申请时间") - @ExcelProperty("申请时间") - private LocalDateTime applyTime; + @Schema(description = "消耗量-按部门") + @ExcelProperty("消耗量-按部门") + private String usageQuantity; @Schema(description = "监督人") @ExcelProperty("监督人") diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/export/MaterialConsumeStatisticsExportVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/export/MaterialConsumeStatisticsExportVO.java new file mode 100644 index 00000000..a2e10979 --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/export/MaterialConsumeStatisticsExportVO.java @@ -0,0 +1,53 @@ +package com.zt.plat.module.qms.resource.material.controller.vo.export; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 物料消耗统计导出VO") +@Data +@ExcelIgnoreUnannotated +public class MaterialConsumeStatisticsExportVO { + + @Schema(description = "物料 ID") + private Long productId; + + @Schema(description = "申请时间") + @ExcelProperty("日期") + private LocalDate applyTime; + + @Schema(description = "物料名称", example = "硫酸") + @ExcelProperty("试剂名称") + private String productName; + + @Schema(description = "申请部门") + @ExcelProperty("消耗部门") + private String applyDepartment; + + @Schema(description = "申请部门id", example = "845") + private Long applyDepartmentId; + + @Schema(description = "物料型号", example = "AR 500ml") + @ExcelProperty("规格型号") + private String productModelNo; + + @Schema(description = "物料单位", example = "瓶") + @ExcelProperty("单位") + private String unit; + + @Schema(description = "消耗量-按部门") + @ExcelProperty("消耗量") + private String usageQuantity; + + @Schema(description = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} \ 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/query/MaterialInfomationQueryVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/query/MaterialInfomationQueryVO.java index 2f23bb0d..b108a5dc 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/query/MaterialInfomationQueryVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/query/MaterialInfomationQueryVO.java @@ -1,5 +1,6 @@ package com.zt.plat.module.qms.resource.material.controller.vo.query; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; @@ -55,6 +56,9 @@ public class MaterialInfomationQueryVO { @Schema(description = "负责人", example = "张三") private String managerUserName; + @Schema(description = "开封后保质期是否变化,1-是,0-否") + private Integer openDueFlag; + @Schema(description = "开封状态,0-未开封,1-已开封", example = "2") private Integer openStatus; 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 6fe6bbba..72b581d5 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 @@ -55,6 +55,7 @@ public interface MaterialBatchMapper extends BaseMapperX { .selectAll(MaterialBatchDO.class) .selectAs(MaterialProductDO::getName, MaterialBatchRespVO::getProductName) .selectAs(MaterialProductDO::getCode, MaterialBatchRespVO::getProductCode) + .selectAs(MaterialProductDO::getStandardCapacity, MaterialBatchRespVO::getStandardCapacity) .selectAs(MaterialProductDO::getModelNo, MaterialBatchRespVO::getProductModelNo) // 标签模板,用于入库 .selectAs(MaterialProductDO::getLabelTemplateKey, MaterialBatchRespVO::getLabelTemplateKey) @@ -68,7 +69,7 @@ public interface MaterialBatchMapper extends BaseMapperX { // 只要工段 .ne(MaterialBatchGongType.gong.name().equals(reqVO.getDataType()), MaterialBatchDO::getParentId, 0) // 用于批次分页 - .eq(StrUtil.isBlank(reqVO.getDataType()) && reqVO.getChildren(), MaterialBatchDO::getParentId, 0) + .eq(StrUtil.isBlank(reqVO.getDataType()), MaterialBatchDO::getParentId, 0) // 用于退换货(已提交) .eqIfExists(MaterialBatchDO::getSubmitStatus, reqVO.getSubmitStatus()) // 用于验收(提交且未验收) @@ -79,10 +80,10 @@ public interface MaterialBatchMapper extends BaseMapperX { "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()) + .apply(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()) + .apply(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()) diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInfomationMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInfomationMapper.java index 1c40503f..b2457869 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInfomationMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/mapper/MaterialInfomationMapper.java @@ -83,6 +83,9 @@ public interface MaterialInfomationMapper extends BaseMapperX selectListUsageStatisticsMainDataByDept(MaterialInventoryOutboundPageReqVO reqVO) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapperX() + .select(MaterialInfomationDO::getProductId) + .select(MaterialInventoryOutboundDO::getApplyDepartmentId) + .selectCount(MaterialInventoryOutboundDetailDO::getId, "USAGE_QUANTITY") + .leftJoin(MaterialInventoryOutboundDetailDO.class, MaterialInventoryOutboundDetailDO::getOutboundId, MaterialInventoryOutboundDO::getId) + .leftJoin(MaterialInfomationDO.class, MaterialInfomationDO::getId, MaterialInventoryOutboundDetailDO::getInfomationId) + .leftJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialInfomationDO::getProductId) + .eq(MaterialInventoryOutboundDO::getBusinessType, MaterialOutboundType.receive_outbound.getName()) + .eqIfExists(MaterialInventoryOutboundDO::getApplyDepartmentId, reqVO.getApplyDepartmentId()) + .likeIfExists(MaterialInventoryOutboundDO::getApplyDepartment, reqVO.getApplyDepartment()) + .likeIfExists(MaterialProductDO::getName, reqVO.getProductName()) + .groupBy(MaterialInfomationDO::getProductId) + .groupBy(MaterialInventoryOutboundDO::getApplyDepartmentId) + ; + List> statisticsMaps = selectJoinMaps(wrapper); + if (CollUtil.isEmpty(statisticsMaps)) return List.of(); + + // 2. 将 Map 转换为 MaterialInventoryOutboundRespVO + List result = new ArrayList<>(); + for (Map statMap : statisticsMaps) { + MaterialInventoryOutboundRespVO respVO = new MaterialInventoryOutboundRespVO(); + + // 从 Map 中提取数据并设置到 VO 中 + Long productId = MapUtil.getLong(statMap, "PDT_ID"); + Long departmentId = MapUtil.getLong(statMap, "APL_DEPT_ID"); + String usageQuantity = MapUtil.getStr(statMap, "USAGE_QUANTITY"); + + // 设置基础统计信息 + respVO.setProductId(productId); + respVO.setApplyDepartmentId(departmentId); + respVO.setUsageQuantity(usageQuantity); + + result.add(respVO); + } + + return result; + } } \ 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 9a35b8e3..04a9b143 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 @@ -96,4 +96,12 @@ public interface MaterialProductMapper extends BaseMapperX { .in(MaterialProductDO::getId, ids); return this.exists(wrapperXMakeApply) || this.exists(wrapperXMake); } + + + default boolean checkIsExistsInfByPdt(List pdtIds) { + MPJLambdaWrapperX wrapperX = new MPJLambdaWrapperX() + .innerJoin(MaterialInfomationDO.class, MaterialInfomationDO::getProductId, MaterialProductDO::getId) + .in(MaterialProductDO::getId, pdtIds); + return this.exists(wrapperX); + } } \ 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/enums/MaterialBatchOperationType.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchOperationType.java new file mode 100644 index 00000000..51f26210 --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialBatchOperationType.java @@ -0,0 +1,24 @@ +package com.zt.plat.module.qms.resource.material.enums; + +/** + * 物料批次工段枚举 + * + */ +public enum MaterialBatchOperationType { + /** + * 批次管理 + */ + batch_manage, + /** + * 验收 + */ + acceptance, + /** + * 入库 + */ + inbound, + /** + * 退换货 + */ + return_exchange +} diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialInboundType.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialInboundType.java index 5e1aadef..1472629d 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialInboundType.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialInboundType.java @@ -7,9 +7,9 @@ import lombok.Getter; */ @Getter public enum MaterialInboundType { - acceptanceInbound("验收入库"), + acceptance_inbound("验收入库"), - checkOverInbound("盘盈入库"); + check_over_inbound("盘盈入库"); private final String name; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialInfomationOrigin.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialInfomationOrigin.java index ff555b9d..5c099923 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialInfomationOrigin.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialInfomationOrigin.java @@ -7,11 +7,11 @@ import lombok.Getter; */ @Getter public enum MaterialInfomationOrigin { - batchInbound("批次入库"), + batch_inbound("批次入库"), - standardSolutionMake("标液配置"), + standard_solution_make("标液配置"), - hazardousMaterialMake("危化品配置") + hazardous_material_make("危化品配置") ; private final String name; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialNormalOperationType.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialNormalOperationType.java index 7a6ca45e..360d2cb9 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialNormalOperationType.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/enums/MaterialNormalOperationType.java @@ -12,6 +12,8 @@ public enum MaterialNormalOperationType { clean_recycle("清洗回收"), + open_seal("开封"), + ; private final String name; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/job/MaterialJob.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/job/MaterialJob.java new file mode 100644 index 00000000..c8a82a60 --- /dev/null +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/job/MaterialJob.java @@ -0,0 +1,38 @@ +package com.zt.plat.module.qms.resource.material.job; + +import com.xxl.job.core.handler.annotation.XxlJob; +import com.zt.plat.framework.tenant.core.job.TenantJob; +import com.zt.plat.module.qms.resource.material.service.MaterialInfomationService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 物料相关定时任务 + */ +@Component +@Slf4j +public class MaterialJob { + + @Autowired + private MaterialInfomationService materialInfomationService; + + /** + * 更新物料过期状态定时任务 + * 每天执行一次,检查并更新已过期的物料状态 + */ + @XxlJob("updateMaterialExpiredStatusJob") + @TenantJob + public void updateMaterialExpiredStatusJob() { + log.info("[updateMaterialExpiredStatusJob] 开始执行物料过期状态更新任务"); + + try { + Integer updateCount = materialInfomationService.updateExpiredMaterialStatus(); + log.info("[updateMaterialExpiredStatusJob] 任务执行成功,共更新 {} 个物料", updateCount); + } catch (Exception e) { + log.error("[updateMaterialExpiredStatusJob] 任务执行失败:{}", e.getMessage(), e); + throw e; + } + } + +} diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialBatchServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialBatchServiceImpl.java index f6a8e8de..4ea1a21f 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 @@ -18,6 +18,7 @@ import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialLifecycle import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialProductDO; import com.zt.plat.module.qms.resource.material.dal.mapper.MaterialBatchMapper; import com.zt.plat.module.qms.resource.material.enums.MaterialAcceptStatus; +import com.zt.plat.module.qms.resource.material.enums.MaterialBatchGongType; import com.zt.plat.module.qms.resource.material.enums.MaterialFlowType; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; @@ -349,33 +350,37 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { 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); + // 查全部 + if (StrUtil.isEmpty(pageReqVO.getDataType())) { + List respVOS = pageResult.getList(); + if (CollUtil.isNotEmpty(respVOS)) { + List batIds = respVOS.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(); + respVOS.addAll(gongRespVOs); + pageResult.setList(respVOS); + } } } - 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())) - ); + // 需要组装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); } - pageResult.setList(treeVos); } + return pageResult; } diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationService.java index 300bf87d..2db4942c 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationService.java @@ -195,4 +195,19 @@ public interface MaterialInfomationService { * @param lockType 入库/出库 */ void lockInfomationInbOrOutbStatus(List infomations, LockType lockType); + + /** + * 批量开封处理 + * + * @param infomationIds id集合 + * @param openInfo 开封信息 + */ + void openSealTreatment(List infomationIds, MaterialUseEndReuseDO openInfo); + + /** + * 更新过期物料状态 + * + * @return 更新的物料数量 + */ + Integer updateExpiredMaterialStatus(); } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationServiceImpl.java index 11061be2..8a4e0cf0 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInfomationServiceImpl.java @@ -20,15 +20,15 @@ import com.zt.plat.module.qms.resource.material.enums.MaterialInfomationOrigin; import groovy.util.logging.Slf4j; 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.validation.annotation.Validated; import java.math.BigDecimal; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.Stream; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zt.plat.module.qms.enums.ErrorCodeConstants.MATERIAL_INFOMATION_NOT_EXISTS; @@ -48,6 +48,8 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService private MaterialInfomationMapper materialInfomationMapper; @Autowired private SequenceUtil sequenceUtil; + @Autowired + private MaterialProductService materialProductService; @Override public MaterialInfomationRespVO createMaterialInfomation(MaterialInfomationSaveReqVO createReqVO) { @@ -193,7 +195,7 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService .setExpirationDate(LocalDate.now().plusDays(product.getDue())) .setUsageStatus(0) .setUseEndFlag(0) - .setOrigin(MaterialInfomationOrigin.hazardousMaterialMake.name()); + .setOrigin(MaterialInfomationOrigin.hazardous_material_make.name()); this.save(infomationDO); return infomationDO; } @@ -208,7 +210,7 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService .setExpirationDate(LocalDate.from(mtrlStandSol.getDueDate())) .setUsageStatus(0) .setUseEndFlag(0) - .setOrigin(MaterialInfomationOrigin.standardSolutionMake.name()); + .setOrigin(MaterialInfomationOrigin.standard_solution_make.name()); this.save(infomationDO); return infomationDO; } @@ -233,7 +235,7 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService .setManufacturerDate(batch.getManufacturerDate()).setExpirationDate(batch.getDueDate()) .setInitialVolume(product.getStandardCapacity()) .setRemainingVolume(product.getStandardCapacity()) - .setOrigin(MaterialInfomationOrigin.batchInbound.name()); + .setOrigin(MaterialInfomationOrigin.batch_inbound.name()); // 生成编号 String code = sequenceUtil.genCode(MaterialConstants.SEQUENCE_INF_KEY); infomationDO.setCode(code); @@ -286,4 +288,51 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService this.updateBatch(infomationDOS); } + @Override + public void openSealTreatment(List infomationIds, MaterialUseEndReuseDO openInfo) { + List infomations = this.getMaterialInfomationsByIds(infomationIds); + if (CollUtil.isEmpty(infomations)) return; + List productIds = infomations.stream().map(MaterialInfomationDO::getProductId).toList(); + List products = materialProductService.getMaterialProductListByPdtIds(productIds); + if (CollUtil.isEmpty(products)) return; + Map productByIdMap = products.stream().collect(Collectors.toMap(MaterialProductDO::getId, Function.identity())); + for (MaterialInfomationDO infomation : infomations) { + // 批次入库的且开封后保质期变化的才有开封操作 + MaterialProductDO product = productByIdMap.get(infomation.getProductId()); + if (!MaterialInfomationOrigin.batch_inbound.name().equals(infomation.getOrigin()) + || product.getOpenDueFlag() == 0) throw new ServiceException(1_032_160_000, String.format("物料【%s】无开封操作", infomation.getCode())); + infomation.setOpenDate(openInfo.getOperatorDate()).setOpenStatus(1) + .setOpenUserId(openInfo.getOperatorId()).setOpenUserName(openInfo.getOperator()); + Integer openDueAfter = product.getOpenDueAfter(); + infomation.setExpirationDate(infomation.getManufacturerDate().plusDays(openDueAfter)); + } + this.updateBatch(infomations); + } + + @Override + public Integer updateExpiredMaterialStatus() { + LocalDate today = LocalDate.now(); + + // 查询所有已过期的物料 + List expiredMaterials = materialInfomationMapper.selectList( + Wrappers.lambdaQuery(MaterialInfomationDO.class) + .eq(MaterialInfomationDO::getExpirationFlag, "0") + .lt(MaterialInfomationDO::getExpirationDate, today) + ); + + if (CollUtil.isEmpty(expiredMaterials)) { + log.info("[updateExpiredMaterialStatus] 今日 ({}) 没有发现过期的物料", today); + return 0; + } + + // 批量更新过期状态 + List updateList = expiredMaterials.stream().peek( + material -> material.setExpirationFlag("1")).toList(); + + this.updateBatch(updateList); + + log.info("[updateExpiredMaterialStatus] 今日 ({}) 更新了 {} 个物料的过期状态", today, updateList.size()); + return updateList.size(); + } + } \ 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/MaterialInventoryOutboundService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryOutboundService.java index 32770ef9..80f9d0b6 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryOutboundService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryOutboundService.java @@ -68,4 +68,12 @@ public interface MaterialInventoryOutboundService { * @param lifecycleDO 物料退换货记录 */ void addMaterialInventoryOutboundsByLfc(MaterialLifecycleDO lifecycleDO); + + /** + * 按部门消耗统计 + * + * @param reqVO 查询条件 + * @return 统计结果 + */ + List getUsageOutboundStatisticsByDept(@Valid MaterialInventoryOutboundPageReqVO reqVO); } \ 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/MaterialInventoryOutboundServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialInventoryOutboundServiceImpl.java index e2b33bb6..db5e8464 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 @@ -1,11 +1,13 @@ package com.zt.plat.module.qms.resource.material.service; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.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.security.core.util.SecurityFrameworkUtils; +import com.zt.plat.framework.mybatis.core.query.MPJLambdaWrapperX; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryOutboundPageReqVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryOutboundRespVO; import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryOutboundSaveReqVO; @@ -27,9 +29,7 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -196,4 +196,44 @@ public class MaterialInventoryOutboundServiceImpl implements MaterialInventoryOu materialInventoryOutboundDetailService.saveBatch(outboundDetailDOS); } + @Override + public List getUsageOutboundStatisticsByDept(MaterialInventoryOutboundPageReqVO reqVO) { + List outboundRespVOS = materialInventoryOutboundMapper.selectListUsageStatisticsMainDataByDept(reqVO); + if (CollUtil.isEmpty(outboundRespVOS)) return outboundRespVOS; + List pdtIds = outboundRespVOS.stream().map(MaterialInventoryOutboundRespVO::getProductId).toList(); + List products = materialProductService.getMaterialProductListByPdtIds(pdtIds); + if (CollUtil.isEmpty(products)) return outboundRespVOS; + Map productMapById = products.stream().collect(Collectors.toMap(MaterialProductDO::getId, Function.identity())); + for (MaterialInventoryOutboundRespVO outboundRespVO : outboundRespVOS) { + MaterialProductDO productDO = productMapById.get(outboundRespVO.getProductId()); + outboundRespVO.setProductName(productDO.getName()).setProductModelNo(productDO.getModelNo()).setUnit(productDO.getUnit()); + } + List deptIds = outboundRespVOS.stream().map(MaterialInventoryOutboundRespVO::getApplyDepartmentId).toList(); + List> maxIdMaps = materialInventoryOutboundMapper.selectMaps( + new MPJLambdaWrapperX() + .select(MaterialInventoryOutboundDO::getApplyDepartmentId) + .select("MAX(t.ID) as ID") + .in(MaterialInventoryOutboundDO::getApplyDepartmentId, deptIds) + .groupBy(MaterialInventoryOutboundDO::getApplyDepartmentId) + ); + + if (CollUtil.isEmpty(maxIdMaps)) return outboundRespVOS; + // 提取每个部门的最大 ID + List maxIds = maxIdMaps.stream() + .map(map -> MapUtil.getLong(map, "ID")) + .filter(Objects::nonNull) + .toList(); + + // 批量查询这些最新记录 + List outboundDOS = materialInventoryOutboundMapper.selectByIds(maxIds); + Map outboundMapByDeptId = outboundDOS.stream() + .collect(Collectors.toMap(MaterialInventoryOutboundDO::getApplyDepartmentId, Function.identity())); + for (MaterialInventoryOutboundRespVO outboundRespVO : outboundRespVOS) { + MaterialInventoryOutboundDO outboundDO = outboundMapByDeptId.get(outboundRespVO.getApplyDepartmentId()); + outboundRespVO.setApplyUser(outboundDO.getApplyUser()).setApplyDepartment(outboundDO.getApplyDepartment()) + .setApplyTime(outboundDO.getApplyTime()).setRemark(outboundDO.getRemark()); + } + return outboundRespVOS; + } + } \ No newline at end of file diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialLifecycleServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialLifecycleServiceImpl.java index f8c0637e..237d1d55 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 @@ -338,15 +338,6 @@ public class MaterialLifecycleServiceImpl implements MaterialLifecycleService , List batches = materialBatchService.getBatchListByBatchIds(batchIds); if (CollUtil.isEmpty(batches) || batches.size() != batchIds.size()) throw new ServiceException(1_032_160_000, "批次不存在或与传入的批次数量不匹配"); - /*// 已拆分的批次不可退换货 - List gongs = materialBatchService.getGongduanListByBatIds(batchIds); - if (CollUtil.isNotEmpty(gongs)) { - Map> gongsMapByBatId = gongs.stream().collect(Collectors.groupingBy(MaterialBatchDO::getParentId)); - for (MaterialBatchDO batch : batches) { - if (gongsMapByBatId.containsKey(batch.getId())) - throw new ServiceException(1_032_160_000, String.format("批次【%s】已拆分,不可退换货", batch.getBatchNo())); - } - }*/ // 已提交的批次不可退换货 for (MaterialBatchDO batch : batches) { if (batch.getSubmitStatus() == 1) 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 c4d9f17d..4a9e6ba7 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 @@ -280,7 +280,9 @@ public class MaterialProductServiceImpl implements MaterialProductService { // 大类下有溶液配置申请或溶液配置时不可删除 boolean existsSolution = materialProductMapper.checkIsExistsSolutionByPdt(pdtIds); if (existsSolution) throw new ServiceException(1_032_160_000, "大类下有溶液配置申请或已配置的溶液, 不可删除"); - // TODO 以及其他不可删除的情况,如库存记录、物料实例、使用记录等 + // 大类下有物料实例后不可删除(主要争对危化品配置) + boolean existsInf = materialProductMapper.checkIsExistsInfByPdt(pdtIds); + if (existsInf) throw new ServiceException(1_032_160_000, "大类下已有物料实例, 暂不可删除"); } @Override diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseServiceImpl.java index a07646e7..91f3e7f2 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/service/MaterialUseEndReuseServiceImpl.java @@ -55,8 +55,10 @@ public class MaterialUseEndReuseServiceImpl implements MaterialUseEndReuseServic List infomationIds = detailList.stream().map(MaterialUseEndReuseDetailSaveReqVO::getInfomationId) .filter(Objects::nonNull).toList(); - if (MaterialNormalOperationType.used_mark.equals(operationType)) { - if (CollUtil.isEmpty(infomationIds)) throw new ServiceException(1_032_160_000, "用完标记请选择物料实例"); + // 用完标记 开封 + if (MaterialNormalOperationType.used_mark.equals(operationType) || MaterialNormalOperationType.open_seal.equals(operationType)) { + if (CollUtil.isEmpty(infomationIds)) throw new ServiceException(1_032_160_000, + String.format("【%s】的物料实例不能为空", MaterialNormalOperationType.used_mark == operationType ? "用完标记" : "开封")); List infomations = materialInfomationService.getMaterialInfomationsByIds(infomationIds); if (CollUtil.isEmpty(infomations) || infomations.size() != infomationIds.size()) throw new ServiceException(1_032_160_000, "物料实例不存在或与传入的数量不匹配"); @@ -85,6 +87,10 @@ public class MaterialUseEndReuseServiceImpl implements MaterialUseEndReuseServic if (MaterialNormalOperationType.used_mark.equals(operationType) && CollUtil.isNotEmpty(infomationIds)) { materialInfomationService.updateByIds(infomationIds, new MaterialInfomationDO().setUseEndFlag(1)); } + // 开封处理 + if (MaterialNormalOperationType.open_seal.equals(operationType)) { + materialInfomationService.openSealTreatment(infomationIds, useEndReuseDO); + } // 返回 return BeanUtils.toBean(useEndReuseDO, MaterialUseEndReuseRespVO.class); }