From 0d164c660e89c6cc39ccc0fb24fff1bdf8076d84 Mon Sep 17 00:00:00 2001 From: shusir <497819738@qq.com> Date: Mon, 26 Jan 2026 18:05:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=96=B0=E5=A2=9E=E7=89=A9=E6=96=99?= =?UTF-8?q?=E6=89=B9=E6=AC=A1=E6=8E=A5=E5=8F=A3=E5=8F=8A=E6=89=B9=E6=AC=A1?= =?UTF-8?q?=E6=8B=86=E5=88=86=E5=8F=8A=E6=8E=A5=E5=8F=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/qms/enums/ErrorCodeConstants.java | 35 ++++--- .../admin/MaterialBatchController.java | 27 ++++-- .../admin/MaterialProductController.java | 19 ++-- .../controller/vo/MaterialBatchPageReqVO.java | 16 +++- .../controller/vo/MaterialBatchRespVO.java | 15 ++- .../controller/vo/MaterialBatchSaveReqVO.java | 42 ++++++--- .../dal/dataobject/MaterialBatchDO.java | 18 +++- .../dal/mapper/MaterialBatchMapper.java | 9 +- .../service/MaterialBatchService.java | 7 ++ .../service/MaterialBatchServiceImpl.java | 91 ++++++++++++++++++- .../service/MaterialProductServiceImpl.java | 44 ++++++--- 11 files changed, 251 insertions(+), 72 deletions(-) diff --git a/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/ErrorCodeConstants.java b/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/ErrorCodeConstants.java index 578ffce..61ebab4 100644 --- a/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/ErrorCodeConstants.java +++ b/zt-module-qms/zt-module-qms-api/src/main/java/com/zt/plat/module/qms/enums/ErrorCodeConstants.java @@ -171,25 +171,30 @@ public interface ErrorCodeConstants { ErrorCode DEVICE_CONFIG_FLOW_NOT_EXISTS = new ErrorCode(1_032_150_000, "设备通用流程配置不存在"); // -------------物料试剂------------- - ErrorCode MATERIAL_INFOMATION_NOT_EXISTS = new ErrorCode(1_032_150_000, "试剂耗材不存在"); - ErrorCode MATERIAL_PRODUCT_NOT_EXISTS = new ErrorCode(1_032_160_000, "物料大类不存在"); + ErrorCode MATERIAL_INFOMATION_NOT_EXISTS = new ErrorCode(1_032_160_000, "试剂耗材不存在"); + ErrorCode MATERIAL_PRODUCT_NOT_EXISTS = new ErrorCode(1_032_160_000, "物料分类/大类不存在"); ErrorCode MATERIAL_PRODUCT_CODE_EXISTED = new ErrorCode(1_032_160_000, "物料大类编码重复"); - ErrorCode MATERIAL_LIFECYCLE_DETAIL_NOT_EXISTS = new ErrorCode(1_032_150_000, "物料通用流程明细不存在"); - ErrorCode MATERIAL_LIFECYCLE_NOT_EXISTS = new ErrorCode(1_032_150_000, "物料通用流程不存在"); + ErrorCode MATERIAL_CATEGORY_EXISTS_CHILDREN = new ErrorCode(1_032_160_000, "分类下含有子分类或物料大类,不可删除"); + ErrorCode MATERIAL_LIFECYCLE_DETAIL_NOT_EXISTS = new ErrorCode(1_032_160_000, "物料通用流程明细不存在"); + ErrorCode MATERIAL_LIFECYCLE_NOT_EXISTS = new ErrorCode(1_032_160_000, "物料通用流程不存在"); - ErrorCode MATERIAL_BATCH_NOT_EXISTS = new ErrorCode(1_032_150_000, "物料批次不存在"); - ErrorCode MATERIAL_BATCH_ASSIGN_NOT_EXISTS = new ErrorCode(1_032_150_000, "物料批次分发不存在"); - ErrorCode MATERIAL_INVENTORY_INBOUND_NOT_EXISTS = new ErrorCode(1_032_150_000, "入库,出库不存在"); - ErrorCode MATERIAL_INVENTORY_INBOUND_DETAIL_NOT_EXISTS = new ErrorCode(1_032_150_000, "入库明细,出库明细等不存在"); + ErrorCode MATERIAL_BATCH_NOT_EXISTS = new ErrorCode(1_032_160_000, "物料批次不存在"); + ErrorCode MATERIAL_BATCH_ASSIGN_END = new ErrorCode(1_032_160_000, "物料批次已拆分,不可操作"); + ErrorCode GONGDUAN_BELONG_MATERIAL_BATCH_NOT_EQUAL = new ErrorCode(1_032_160_000, "工段所属的物料批次不一致"); + ErrorCode GONGDUAN_QUANTITY_MATERIAL_BATCH_NOT_EQUAL = new ErrorCode(1_032_160_000, "工段累加数量和批次数量不一致"); - ErrorCode SYSTEM_VERSION_MANAGEMENT_NOT_EXISTS = new ErrorCode(1_032_150_000, "客户端版本管理不存在"); + ErrorCode MATERIAL_BATCH_ASSIGN_NOT_EXISTS = new ErrorCode(1_032_160_000, "物料批次分发不存在"); + ErrorCode MATERIAL_INVENTORY_INBOUND_NOT_EXISTS = new ErrorCode(1_032_160_000, "入库,出库不存在"); + ErrorCode MATERIAL_INVENTORY_INBOUND_DETAIL_NOT_EXISTS = new ErrorCode(1_032_160_000, "入库明细,出库明细等不存在"); - ErrorCode MATERIAL_LOCATION_NOT_EXISTS = new ErrorCode(1_032_150_000, "存放位置不存在"); - ErrorCode MATERIAL_INVENTORY_CHECK_NOT_EXISTS = new ErrorCode(1_032_150_000, "库存盘点不存在"); - ErrorCode MATERIAL_INVENTORY_CHECK_BATCH_NOT_EXISTS = new ErrorCode(1_032_150_000, "库存盘点项不存在"); - ErrorCode MATERIAL_INVENTORY_CHECK_DETAIL_NOT_EXISTS = new ErrorCode(1_032_150_000, "库存盘点明细不存在"); - ErrorCode MATERIAL_INVENTORY_OUTBOUND_NOT_EXISTS = new ErrorCode(1_032_150_000, "出库不存在"); - ErrorCode MATERIAL_INVENTORY_OUTBOUND_DETAIL_NOT_EXISTS = new ErrorCode(1_032_150_000, "出库明细,出库明细,含领用出库、退货出库、盘亏出库、销毁出库等不存在"); + ErrorCode SYSTEM_VERSION_MANAGEMENT_NOT_EXISTS = new ErrorCode(1_032_160_000, "客户端版本管理不存在"); + + ErrorCode MATERIAL_LOCATION_NOT_EXISTS = new ErrorCode(1_032_160_000, "存放位置不存在"); + ErrorCode MATERIAL_INVENTORY_CHECK_NOT_EXISTS = new ErrorCode(1_032_160_000, "库存盘点不存在"); + ErrorCode MATERIAL_INVENTORY_CHECK_BATCH_NOT_EXISTS = new ErrorCode(1_032_160_000, "库存盘点项不存在"); + ErrorCode MATERIAL_INVENTORY_CHECK_DETAIL_NOT_EXISTS = new ErrorCode(1_032_160_000, "库存盘点明细不存在"); + ErrorCode MATERIAL_INVENTORY_OUTBOUND_NOT_EXISTS = new ErrorCode(1_032_160_000, "出库不存在"); + ErrorCode MATERIAL_INVENTORY_OUTBOUND_DETAIL_NOT_EXISTS = new ErrorCode(1_032_160_000, "出库明细,出库明细,含领用出库、退货出库、盘亏出库、销毁出库等不存在"); 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 8f568e1..81edf2b 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 @@ -5,6 +5,8 @@ import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchRespV import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchSaveReqVO; import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialBatchDO; import com.zt.plat.module.qms.resource.material.service.MaterialBatchService; +import com.zt.plat.module.qms.resource.material.valid.AddGroup; +import com.zt.plat.module.qms.resource.material.valid.UpdateGroup; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -35,7 +37,7 @@ import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.*; @Tag(name = "管理后台 - 物料批次") @RestController -@RequestMapping("/qms/material-batch") +@RequestMapping("/qms/resource/material-batch") @Validated public class MaterialBatchController implements BusinessControllerMarker { @@ -45,15 +47,15 @@ public class MaterialBatchController implements BusinessControllerMarker { @PostMapping("/create") @Operation(summary = "创建物料批次") - @PreAuthorize("@ss.hasPermission('qms:material-batch:create')") - public CommonResult createMaterialBatch(@Valid @RequestBody MaterialBatchSaveReqVO createReqVO) { +// @PreAuthorize("@ss.hasPermission('qms:material-batch:create')") + public CommonResult createMaterialBatch(@Validated(AddGroup.class) @RequestBody MaterialBatchSaveReqVO createReqVO) { return success(materialBatchService.createMaterialBatch(createReqVO)); } @PutMapping("/update") @Operation(summary = "更新物料批次") - @PreAuthorize("@ss.hasPermission('qms:material-batch:update')") - public CommonResult updateMaterialBatch(@Valid @RequestBody MaterialBatchSaveReqVO updateReqVO) { +// @PreAuthorize("@ss.hasPermission('qms:material-batch:update')") + public CommonResult updateMaterialBatch(@Validated(UpdateGroup.class) @RequestBody MaterialBatchSaveReqVO updateReqVO) { materialBatchService.updateMaterialBatch(updateReqVO); return success(true); } @@ -61,7 +63,7 @@ public class MaterialBatchController implements BusinessControllerMarker { @DeleteMapping("/delete") @Operation(summary = "删除物料批次") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('qms:material-batch:delete')") +// @PreAuthorize("@ss.hasPermission('qms:material-batch:delete')") public CommonResult deleteMaterialBatch(@RequestParam("id") Long id) { materialBatchService.deleteMaterialBatch(id); return success(true); @@ -70,7 +72,7 @@ public class MaterialBatchController implements BusinessControllerMarker { @DeleteMapping("/delete-list") @Parameter(name = "ids", description = "编号", required = true) @Operation(summary = "批量删除物料批次") - @PreAuthorize("@ss.hasPermission('qms:material-batch:delete')") +// @PreAuthorize("@ss.hasPermission('qms:material-batch:delete')") public CommonResult deleteMaterialBatchList(@RequestBody BatchDeleteReqVO req) { materialBatchService.deleteMaterialBatchListByIds(req.getIds()); return success(true); @@ -79,7 +81,7 @@ public class MaterialBatchController implements BusinessControllerMarker { @GetMapping("/get") @Operation(summary = "获得物料批次") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('qms:material-batch:query')") +// @PreAuthorize("@ss.hasPermission('qms:material-batch:query')") public CommonResult getMaterialBatch(@RequestParam("id") Long id) { MaterialBatchDO materialBatch = materialBatchService.getMaterialBatch(id); return success(BeanUtils.toBean(materialBatch, MaterialBatchRespVO.class)); @@ -87,7 +89,7 @@ public class MaterialBatchController implements BusinessControllerMarker { @GetMapping("/page") @Operation(summary = "获得物料批次分页") - @PreAuthorize("@ss.hasPermission('qms:material-batch:query')") +// @PreAuthorize("@ss.hasPermission('qms:material-batch:query')") public CommonResult> getMaterialBatchPage(@Valid MaterialBatchPageReqVO pageReqVO) { PageResult pageResult = materialBatchService.getMaterialBatchPage(pageReqVO); return success(BeanUtils.toBean(pageResult, MaterialBatchRespVO.class)); @@ -106,4 +108,11 @@ public class MaterialBatchController implements BusinessControllerMarker { BeanUtils.toBean(list, MaterialBatchRespVO.class)); } + @PostMapping("/assign-gongduan") + @Operation(summary = "批次工段拆分") +// @PreAuthorize("@ss.hasPermission('qms:material-batch:create')") + public CommonResult> assignMaterialBatchGongduan(@Valid @RequestBody List createReqVOs) { + return success(materialBatchService.assignMaterialBatchGongduan(createReqVOs)); + } + } \ 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/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 3483059..da687cb 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 @@ -62,6 +62,7 @@ public class MaterialProductController extends AbstractFileUploadController impl return success(materialProductService.getMaterialCategoryTree()); } + // TODO @GetMapping("/orig-material/{code}") @Operation(summary = "根据物料编码获取外部系统原始物料") public CommonResult getOriginalMaterial(@PathVariable String code) { @@ -84,18 +85,18 @@ public class MaterialProductController extends AbstractFileUploadController impl } - @PutMapping("/update") - @Operation(summary = "更新物料") - @PreAuthorize("@ss.hasPermission('qms:material-product:update')") - public CommonResult updateMaterialProduct(@Valid @RequestBody MaterialProductSaveReqVO updateReqVO) { - materialProductService.updateMaterialProduct(updateReqVO); - return success(true); - } +// @PutMapping("/update") +// @Operation(summary = "更新物料") +// @PreAuthorize("@ss.hasPermission('qms:material-product:update')") +// public CommonResult updateMaterialProduct(@Valid @RequestBody MaterialProductSaveReqVO updateReqVO) { +// materialProductService.updateMaterialProduct(updateReqVO); +// return success(true); +// } @DeleteMapping("/delete") - @Operation(summary = "删除物料") + @Operation(summary = "删除物料分类或大类") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('qms:material-product:delete')") +// @PreAuthorize("@ss.hasPermission('qms:material-product:delete')") public CommonResult deleteMaterialProduct(@RequestParam("id") Long id) { materialProductService.deleteMaterialProduct(id); return success(true); 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 51d2fdd..f163611 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 @@ -1,10 +1,12 @@ package com.zt.plat.module.qms.resource.material.controller.vo; +import com.alibaba.excel.annotation.ExcelProperty; import lombok.*; import io.swagger.v3.oas.annotations.media.Schema; import com.zt.plat.framework.common.pojo.PageParam; import org.springframework.format.annotation.DateTimeFormat; +import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; @@ -20,8 +22,8 @@ public class MaterialBatchPageReqVO extends PageParam { @Schema(description = "批次编号") private String batchNo; - @Schema(description = "总数量") - private String inboundQuantity; +// @Schema(description = "总数量") +// private BigDecimal inboundQuantity; @Schema(description = "存放位置描述") private String location; @@ -37,6 +39,12 @@ public class MaterialBatchPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDate[] dueDate; + @Schema(description = "分配部门id") + private Long assignDepartmentId; + + @Schema(description = "分配部门名称") + private String assignDepartmentName; + @Schema(description = "验收状态", example = "1") private String acceptanceStatus; @@ -46,8 +54,8 @@ public class MaterialBatchPageReqVO extends PageParam { @Schema(description = "检化验状态,NOT_STARTED-未开始,IN_PROGRESS-进行中,PASSED-通过,NOT_PASSED-未通过", example = "2") private String assayStatus; - @Schema(description = "检化验结果") - private String assayResult; +// @Schema(description = "检化验结果") +// private String assayResult; @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/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 3de390a..25a1ef3 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 @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import org.springframework.format.annotation.DateTimeFormat; +import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import com.alibaba.excel.annotation.*; @@ -17,6 +18,10 @@ public class MaterialBatchRespVO { @ExcelProperty("主键") private Long id; + @Schema(description = "父id,为0时是批次,不为0时是工段", example = "1035") + @ExcelProperty("父id,为0时是批次,不为0时是工段") + private Long parentId; + @Schema(description = "物料大类id", example = "9381") @ExcelProperty("物料大类id") private Long productId; @@ -27,7 +32,7 @@ public class MaterialBatchRespVO { @Schema(description = "总数量") @ExcelProperty("总数量") - private String inboundQuantity; + private BigDecimal inboundQuantity; @Schema(description = "存放位置描述") @ExcelProperty("存放位置描述") @@ -45,6 +50,14 @@ public class MaterialBatchRespVO { @ExcelProperty("到期日期") private LocalDate dueDate; + @Schema(description = "分配部门id") + @ExcelProperty("分配部门id") + private Long assignDepartmentId; + + @Schema(description = "分配部门名称") + @ExcelProperty("分配部门名称") + private String assignDepartmentName; + @Schema(description = "验收状态", example = "1") @ExcelProperty("验收状态") private String acceptanceStatus; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchSaveReqVO.java index ffb5ca6..d799a42 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchSaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/controller/vo/MaterialBatchSaveReqVO.java @@ -1,26 +1,39 @@ package com.zt.plat.module.qms.resource.material.controller.vo; +import com.zt.plat.module.qms.resource.material.valid.AddGroup; +import com.zt.plat.module.qms.resource.material.valid.UpdateGroup; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import jakarta.validation.constraints.*; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import lombok.Data; +import java.math.BigDecimal; import java.time.LocalDate; @Schema(description = "管理后台 - 物料批次新增/修改 Request VO") @Data public class MaterialBatchSaveReqVO { + @Null(groups = AddGroup.class, message = "新增数据 ID 必须为空") + @NotNull(groups = UpdateGroup.class, message = "修改数据 ID 不能为空") @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "9716") private Long id; + @Schema(description = "父id,为0时是批次,不为0时是工段", example = "1035") + private Long parentId; + @Schema(description = "物料大类id", example = "9381") + @NotNull(groups = AddGroup.class, message = "物料大类 ID 不能为空") private Long productId; - @Schema(description = "批次编号") - private String batchNo; +// @Schema(description = "批次编号") +// private String batchNo; @Schema(description = "总数量") - private String inboundQuantity; + @NotNull(groups = AddGroup.class, message = "总数量不能为空") + @Min(value = 0, message = "总数量不能小于0") + private BigDecimal inboundQuantity; @Schema(description = "存放位置描述") private String location; @@ -29,22 +42,29 @@ public class MaterialBatchSaveReqVO { private Long supplierId; @Schema(description = "生产日期") + @NotNull(groups = AddGroup.class, message = "生产日期不能为空") private LocalDate manufacturerDate; @Schema(description = "到期日期") private LocalDate dueDate; - @Schema(description = "验收状态", example = "1") - private String acceptanceStatus; + @Schema(description = "分配部门id") + private Long assignDepartmentId; + + @Schema(description = "分配部门名称") + private String assignDepartmentName; + +// @Schema(description = "验收状态", example = "1") +// private String acceptanceStatus; @Schema(description = "是否检化验,1-是,0-否") private Integer assayFlag; - @Schema(description = "检化验状态,NOT_STARTED-未开始,IN_PROGRESS-进行中,PASSED-通过,NOT_PASSED-未通过", example = "2") - private String assayStatus; +// @Schema(description = "检化验状态,NOT_STARTED-未开始,IN_PROGRESS-进行中,PASSED-通过,NOT_PASSED-未通过", example = "IN_PROGRESS") +// private String assayStatus; - @Schema(description = "检化验结果") - private String assayResult; +// @Schema(description = "检化验结果") +// private String assayResult; @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/dal/dataobject/MaterialBatchDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialBatchDO.java index 7583491..2fed0b7 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialBatchDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/resource/material/dal/dataobject/MaterialBatchDO.java @@ -4,6 +4,7 @@ import lombok.*; import com.baomidou.mybatisplus.annotation.*; import com.zt.plat.framework.mybatis.core.dataobject.BusinessBaseDO; +import java.math.BigDecimal; import java.time.LocalDate; /** @@ -31,6 +32,11 @@ public class MaterialBatchDO extends BusinessBaseDO { */ @TableId(type = IdType.ASSIGN_ID) private Long id; + /** + * 父id,为0时是批次,不为0时是工段 + */ + @TableField("PRN_ID") + private Long parentId; /** * 物料大类id */ @@ -45,7 +51,7 @@ public class MaterialBatchDO extends BusinessBaseDO { * 总数量 */ @TableField("INB_QTY") - private String inboundQuantity; + private BigDecimal inboundQuantity; /** * 存放位置描述 */ @@ -66,6 +72,16 @@ public class MaterialBatchDO extends BusinessBaseDO { */ @TableField("DUE_DT") private LocalDate dueDate; + /** + * 分配部门id + */ + @TableField("ASN_DEPT_ID") + private Long assignDepartmentId; + /** + * 分配部门名称 + */ + @TableField("ASN_DEPT_NAME") + private String assignDepartmentName; /** * 验收状态 */ 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 aef04e6..be6576a 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 @@ -18,16 +18,17 @@ public interface MaterialBatchMapper extends BaseMapperX { default PageResult selectPage(MaterialBatchPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(MaterialBatchDO::getProductId, reqVO.getProductId()) - .eqIfPresent(MaterialBatchDO::getBatchNo, reqVO.getBatchNo()) - .eqIfPresent(MaterialBatchDO::getInboundQuantity, reqVO.getInboundQuantity()) - .eqIfPresent(MaterialBatchDO::getLocation, reqVO.getLocation()) + .likeIfPresent(MaterialBatchDO::getBatchNo, reqVO.getBatchNo()) + .likeIfPresent(MaterialBatchDO::getLocation, reqVO.getLocation()) .eqIfPresent(MaterialBatchDO::getSupplierId, reqVO.getSupplierId()) .betweenIfPresent(MaterialBatchDO::getManufacturerDate, reqVO.getManufacturerDate()) .betweenIfPresent(MaterialBatchDO::getDueDate, reqVO.getDueDate()) + .eqIfPresent(MaterialBatchDO::getAssignDepartmentId, reqVO.getAssignDepartmentId()) + .likeIfPresent(MaterialBatchDO::getAssignDepartmentName, reqVO.getAssignDepartmentName()) .eqIfPresent(MaterialBatchDO::getAcceptanceStatus, reqVO.getAcceptanceStatus()) .eqIfPresent(MaterialBatchDO::getAssayFlag, reqVO.getAssayFlag()) .eqIfPresent(MaterialBatchDO::getAssayStatus, reqVO.getAssayStatus()) - .eqIfPresent(MaterialBatchDO::getAssayResult, reqVO.getAssayResult()) + //.eqIfPresent(MaterialBatchDO::getAssayResult, reqVO.getAssayResult()) .eqIfPresent(MaterialBatchDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode()) .eqIfPresent(MaterialBatchDO::getRemark, reqVO.getRemark()) .betweenIfPresent(MaterialBatchDO::getCreateTime, reqVO.getCreateTime()) 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 ad71bf5..97d3035 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 @@ -61,4 +61,11 @@ public interface MaterialBatchService { */ PageResult getMaterialBatchPage(MaterialBatchPageReqVO pageReqVO); + /** + * 批次工段拆分 + * + * @param createReqVOs 创建信息 + * @return 工段编号 + */ + List assignMaterialBatchGongduan(@Valid List createReqVOs); } \ 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 f60f9f9..ddb2518 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,18 +1,31 @@ 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.google.protobuf.ServiceException; +import com.zt.plat.framework.common.exception.ErrorCode; import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.util.object.BeanUtils; +import com.zt.plat.module.qms.core.code.SequenceUtil; 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.dal.dataobject.MaterialBatchDO; +import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInfomationDO; +import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialProductDO; import com.zt.plat.module.qms.resource.material.dal.mapper.MaterialBatchMapper; import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Calendar; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zt.plat.module.qms.enums.ErrorCodeConstants.*; @@ -28,20 +41,39 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { @Resource private MaterialBatchMapper materialBatchMapper; + @Autowired + private SequenceUtil sequenceUtil; + @Autowired + private MaterialProductService materialProductService; + + private final String sequenceKey = "QMS_MATERIAL_BATCH_NO"; @Override public MaterialBatchRespVO createMaterialBatch(MaterialBatchSaveReqVO createReqVO) { // 插入 - MaterialBatchDO materialBatch = BeanUtils.toBean(createReqVO, MaterialBatchDO.class); - materialBatchMapper.insert(materialBatch); + MaterialBatchDO mtrlBat = BeanUtils.toBean(createReqVO, MaterialBatchDO.class); + + // 批次编号 + mtrlBat.setBatchNo(sequenceUtil.genCode(sequenceKey)); + + mtrlBat.setParentId(0L); + materialBatchMapper.insert(mtrlBat); + // 返回 - return BeanUtils.toBean(materialBatch, MaterialBatchRespVO.class); + return BeanUtils.toBean(mtrlBat, MaterialBatchRespVO.class); } @Override public void updateMaterialBatch(MaterialBatchSaveReqVO updateReqVO) { // 校验存在 - validateMaterialBatchExists(updateReqVO.getId()); + Long reqId = updateReqVO.getId(); + validateMaterialBatchExists(reqId); + + // 已经拆分工段的不可编辑 + List asnDOs = materialBatchMapper.selectList(Wrappers.lambdaQuery(MaterialBatchDO.class) + .eq(MaterialBatchDO::getParentId, reqId)); + if (CollUtil.isNotEmpty(asnDOs)) throw exception(MATERIAL_BATCH_ASSIGN_END); + // 更新 MaterialBatchDO updateObj = BeanUtils.toBean(updateReqVO, MaterialBatchDO.class); materialBatchMapper.updateById(updateObj); @@ -51,6 +83,12 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { public void deleteMaterialBatch(Long id) { // 校验存在 validateMaterialBatchExists(id); + + // 已经拆分的批次不可删除 + List asnDOs = materialBatchMapper.selectList(Wrappers.lambdaQuery(MaterialBatchDO.class) + .eq(MaterialBatchDO::getParentId, id)); + if (CollUtil.isNotEmpty(asnDOs)) throw exception(MATERIAL_BATCH_ASSIGN_END); + // 删除 materialBatchMapper.deleteById(id); } @@ -59,6 +97,10 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { public void deleteMaterialBatchListByIds(List ids) { // 校验存在 validateMaterialBatchExists(ids); + // 已经拆分的批次不可删除 + List asnDOs = materialBatchMapper.selectList(Wrappers.lambdaQuery(MaterialBatchDO.class) + .in(MaterialBatchDO::getParentId, ids)); + if (CollUtil.isNotEmpty(asnDOs)) throw exception(MATERIAL_BATCH_ASSIGN_END); // 删除 materialBatchMapper.deleteByIds(ids); } @@ -86,4 +128,45 @@ public class MaterialBatchServiceImpl implements MaterialBatchService { return materialBatchMapper.selectPage(pageReqVO); } + /** + * 批次工段拆分 + * + */ + @Override + public List assignMaterialBatchGongduan(List createReqVOs) { + // 是否已经拆分过 + Long batId = createReqVOs.get(0).getParentId(); + List asnDOs = materialBatchMapper.selectList(Wrappers.lambdaQuery(MaterialBatchDO.class) + .eq(MaterialBatchDO::getParentId, batId)); + // 1. 所属的批次需要是同一个 + Set pIds = createReqVOs.stream().map(MaterialBatchSaveReqVO::getParentId).collect(Collectors.toSet()); + if (pIds.size() > 1) throw exception(GONGDUAN_BELONG_MATERIAL_BATCH_NOT_EQUAL); + + // 2. 拆分后的数量要相等 + MaterialBatchDO mtrlBat = materialBatchMapper.selectById(batId); + if (mtrlBat == null) throw exception(MATERIAL_BATCH_NOT_EXISTS); + + BigDecimal total = BigDecimal.valueOf(0); + for (MaterialBatchSaveReqVO batAsn : createReqVOs) { + total = total.add(batAsn.getInboundQuantity()); + } + if (!total.equals(mtrlBat.getInboundQuantity())) + throw exception(GONGDUAN_QUANTITY_MATERIAL_BATCH_NOT_EQUAL); + // 修改工段 + if (CollUtil.isNotEmpty(asnDOs)) { + // 删除之前的拆分数据,TODO 需要检查是否可以删除 + materialBatchMapper.delete(Wrappers.lambdaQuery(MaterialBatchDO.class) + .eq(MaterialBatchDO::getParentId, batId)); + } + + // 3. 保存工段 + List gongEts = createReqVOs.stream().map( + batAsn -> BeanUtils.toBean(batAsn, MaterialBatchDO.class)).toList(); + materialBatchMapper.insertBatch(gongEts); + + return gongEts.stream().map( + gong -> BeanUtils.toBean(gong, MaterialBatchRespVO.class) + ).toList(); + } + } \ 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 6e301cc..e400602 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 @@ -14,6 +14,7 @@ import com.zt.plat.module.qms.resource.material.controller.vo.MaterialProductSav import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialProductDO; import com.zt.plat.module.qms.resource.material.dal.mapper.MaterialProductMapper; import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -180,19 +181,20 @@ public class MaterialProductServiceImpl implements MaterialProductService { .setStandardMaterialFlag(prnCtg.getStandardMaterialFlag()) .setStandardSolutionFlag(prnCtg.getStandardSolutionFlag()); } - materialProductMapper.insert(mtrl); - return BeanUtils.toBean(mtrl, MaterialProductRespVO.class); + // 更新 idPath + + } else { + // 修改 + MaterialProductDO origDO = materialProductMapper.selectById(reqId); + if (origDO == null) throw exception(MATERIAL_PRODUCT_NOT_EXISTS); + Long newParentId = createReqVO.getParentId(); + if (origDO.getParentId().equals(newParentId)) { + materialProductMapper.updateById(mtrl); + return BeanUtils.toBean(mtrl, MaterialProductRespVO.class); + } + // 父节点有变更时更新 idPath } - // 修改 - MaterialProductDO origDO = materialProductMapper.selectById(reqId); - if (origDO == null) throw exception(MATERIAL_PRODUCT_NOT_EXISTS); - Long newParentId = createReqVO.getParentId(); - if (origDO.getParentId().equals(newParentId)) { - materialProductMapper.updateById(mtrl); - return BeanUtils.toBean(mtrl, MaterialProductRespVO.class); - } - // 父节点有变更时更新 idPath String newIdPath = getIdPath(mtrl); mtrl.setIdPath(newIdPath); materialProductMapper.updateById(mtrl); @@ -210,9 +212,23 @@ public class MaterialProductServiceImpl implements MaterialProductService { @Override public void deleteMaterialProduct(Long id) { - // 校验存在 - validateMaterialProductExists(id); - // 删除 + MaterialProductDO pdtDo = materialProductMapper.selectById(id); + if (pdtDo == null) throw exception(MATERIAL_PRODUCT_NOT_EXISTS); + // 分类 + if (DataTypeConstant.DATA_TYPE_CATEGORY.equals(pdtDo.getNodeType())) { + // 分类下有子分类或大类时不可删除 +// boolean exists = materialProductMapper.exists(Wrappers.lambdaQuery(MaterialProductDO.class) +// .like(MaterialProductDO::getIdPath, id) +// .ne(MaterialProductDO::getId, id)); + boolean exists = materialProductMapper.exists(Wrappers.lambdaQuery(MaterialProductDO.class) + .eq(MaterialProductDO::getParentId, id)); + if (exists) throw exception(MATERIAL_CATEGORY_EXISTS_CHILDREN); + } + // 大类 + else { + // 大类下批次时不可删除 TODO 以及其他不可删除的情况 + + } materialProductMapper.deleteById(id); }