From cbe4854fda6c1db9646fcb19c9df067b56bfc6a4 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 23 Mar 2026 21:32:18 +0800 Subject: [PATCH] ✨ feat(mes): 重命名生产领料出库相关类和接口,统一为产品领料出库命名 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueController.java | 175 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueDetailController.java | 140 -------------------------------------------------------------------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueLineController.java | 124 ---------------------------------------------------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssuePageReqVO.java | 43 ------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueRespVO.java | 54 ------------------------------------------------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueSaveReqVO.java | 39 --------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailRespVO.java | 73 ------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java | 50 -------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLinePageReqVO.java | 20 -------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineRespVO.java | 46 ---------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java | 36 ------------------------------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueController.java | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueDetailController.java | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssuePageReqVO.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueRespVO.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueSaveReqVO.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailRespVO.java | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailSaveReqVO.java | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLinePageReqVO.java | 20 ++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineRespVO.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineSaveReqVO.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDO.java | 80 -------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDetailDO.java | 93 --------------------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueLineDO.java | 55 ------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDO.java | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDetailDO.java | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueLineDO.java | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueDetailMapper.java | 27 --------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueLineMapper.java | 32 -------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueMapper.java | 27 --------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueDetailMapper.java | 27 +++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueLineMapper.java | 32 ++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueMapper.java | 27 +++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 20 ++++++++++---------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java | 2 +- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductIssueStatusEnum.java | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductProduceStatusEnum.java | 2 +- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductionIssueStatusEnum.java | 68 -------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java | 2 +- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java | 4 ++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailService.java | 67 ------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailServiceImpl.java | 88 ---------------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineService.java | 77 ----------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java | 122 -------------------------------------------------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueService.java | 96 ------------------------------------------------------------------------------------------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueServiceImpl.java | 248 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailService.java | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailServiceImpl.java | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineService.java | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueService.java | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java | 248 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml | 16 ++++++++-------- 54 files changed, 1903 insertions(+), 1903 deletions(-) delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueController.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueDetailController.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueLineController.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssuePageReqVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueRespVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueSaveReqVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailRespVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLinePageReqVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineRespVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueDetailController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssuePageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLinePageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineSaveReqVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDetailDO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueLineDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDetailDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueLineDO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueDetailMapper.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueLineMapper.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueDetailMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueLineMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductIssueStatusEnum.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductionIssueStatusEnum.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailService.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailServiceImpl.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineService.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueService.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueController.java deleted file mode 100644 index 9f8d383..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueController.java +++ /dev/null @@ -1,175 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssuePageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssueRespVO; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssueSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDO; -import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; -import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; -import cn.iocoder.yudao.module.mes.service.wm.productionissue.MesWmProductionIssueService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - MES 领料出库单") -@RestController -@RequestMapping("/mes/wm/production-issue") -@Validated -public class MesWmProductionIssueController { - - @Resource - private MesWmProductionIssueService issueService; - @Resource - private MesMdWorkstationService workstationService; - @Resource - private MesProWorkOrderService workOrderService; - - @PostMapping("/create") - @Operation(summary = "创建领料出库单") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:create')") - public CommonResult createProductionIssue(@Valid @RequestBody MesWmProductionIssueSaveReqVO createReqVO) { - return success(issueService.createProductionIssue(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "修改领料出库单") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:update')") - public CommonResult updateProductionIssue(@Valid @RequestBody MesWmProductionIssueSaveReqVO updateReqVO) { - issueService.updateProductionIssue(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除领料出库单") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:delete')") - public CommonResult deleteProductionIssue(@RequestParam("id") Long id) { - issueService.deleteProductionIssue(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得领料出库单") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") - public CommonResult getProductionIssue(@RequestParam("id") Long id) { - MesWmProductionIssueDO issue = issueService.getProductionIssue(id); - if (issue == null) { - return success(null); - } - return success(buildRespVOList(Collections.singletonList(issue)).get(0)); - } - - @GetMapping("/page") - @Operation(summary = "获得领料出库单分页") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") - public CommonResult> getProductionIssuePage( - @Valid MesWmProductionIssuePageReqVO pageReqVO) { - PageResult pageResult = issueService.getProductionIssuePage(pageReqVO); - return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出领料出库单 Excel") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:export')") - @ApiAccessLog(operateType = EXPORT) - public void exportProductionIssueExcel(@Valid MesWmProductionIssuePageReqVO pageReqVO, - HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - PageResult pageResult = issueService.getProductionIssuePage(pageReqVO); - ExcelUtils.write(response, "领料出库单.xls", "数据", MesWmProductionIssueRespVO.class, - buildRespVOList(pageResult.getList())); - } - - @PutMapping("/finish") - @Operation(summary = "完成领料出库单") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:finish')") - public CommonResult finishProductionIssue(@RequestParam("id") Long id) { - issueService.finishProductionIssue(id); - return success(true); - } - - @PutMapping("/submit") - @Operation(summary = "提交领料出库单") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:update')") - public CommonResult submitProductionIssue(@RequestParam("id") Long id) { - issueService.submitProductionIssue(id); - return success(true); - } - - @PutMapping("/stock") - @Operation(summary = "执行拣货") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:update')") - public CommonResult stockProductionIssue(@RequestParam("id") Long id) { - issueService.stockProductionIssue(id); - return success(true); - } - - @PutMapping("/cancel") - @Operation(summary = "取消领料出库单") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:update')") - public CommonResult cancelProductionIssue(@RequestParam("id") Long id) { - issueService.cancelProductionIssue(id); - return success(true); - } - - @GetMapping("/check-quantity") - @Operation(summary = "校验领料出库单数量", description = "校验每行明细数量之和是否等于行领料数量") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") - public CommonResult checkProductionIssueQuantity(@RequestParam("id") Long id) { - return success(issueService.checkProductionIssueQuantity(id)); - } - - // ==================== 拼接 VO ==================== - - private List buildRespVOList(List list) { - if (CollUtil.isEmpty(list)) { - return Collections.emptyList(); - } - // 1. 获得关联数据 - Map workstationMap = workstationService.getWorkstationMap( - convertSet(list, MesWmProductionIssueDO::getWorkstationId)); - Map workOrderMap = workOrderService.getWorkOrderMap( - convertSet(list, MesWmProductionIssueDO::getWorkOrderId)); - // 2. 构建结果 - return BeanUtils.toBean(list, MesWmProductionIssueRespVO.class, vo -> { - // 2.1 填充工作站名称 - MapUtils.findAndThen(workstationMap, vo.getWorkstationId(), - workstation -> vo.setWorkstationName(workstation.getName())); - // 2.2 填充工单编号 - MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(), - workOrder -> vo.setWorkOrderCode(workOrder.getCode())); - }); - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueDetailController.java deleted file mode 100644 index fab15b1..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueDetailController.java +++ /dev/null @@ -1,140 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.detail.MesWmProductionIssueDetailRespVO; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.detail.MesWmProductionIssueDetailSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDetailDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; -import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; -import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; -import cn.iocoder.yudao.module.mes.service.wm.productionissue.MesWmProductionIssueDetailService; -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - MES 领料出库明细") -@RestController -@RequestMapping("/mes/wm/production-issue-detail") -@Validated -public class MesWmProductionIssueDetailController { - - @Resource - private MesWmProductionIssueDetailService issueDetailService; - - @Resource - private MesMdItemService itemService; - - @Resource - private MesMdUnitMeasureService unitMeasureService; - - @Resource - private MesWmWarehouseService warehouseService; - - @Resource - private MesWmWarehouseLocationService locationService; - - @Resource - private MesWmWarehouseAreaService areaService; - - @PostMapping("/create") - @Operation(summary = "创建领料出库明细") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:create')") - public CommonResult createProductionIssueDetail(@Valid @RequestBody MesWmProductionIssueDetailSaveReqVO createReqVO) { - return success(issueDetailService.createProductionIssueDetail(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "修改领料出库明细") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:update')") - public CommonResult updateProductionIssueDetail(@Valid @RequestBody MesWmProductionIssueDetailSaveReqVO updateReqVO) { - issueDetailService.updateProductionIssueDetail(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除领料出库明细") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:delete')") - public CommonResult deleteProductionIssueDetail(@RequestParam("id") Long id) { - issueDetailService.deleteProductionIssueDetail(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得领料出库明细") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") - public CommonResult getProductionIssueDetail(@RequestParam("id") Long id) { - MesWmProductionIssueDetailDO detail = issueDetailService.getProductionIssueDetail(id); - if (detail == null) { - return success(null); - } - return success(buildRespVOList(Collections.singletonList(detail)).get(0)); - } - - @GetMapping("/list-by-line") - @Operation(summary = "获得领料出库明细列表(按行编号)") - @Parameter(name = "lineId", description = "行编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") - public CommonResult> getProductionIssueDetailListByLineId( - @RequestParam("lineId") Long lineId) { - List list = issueDetailService.getProductionIssueDetailListByLineId(lineId); - return success(buildRespVOList(list)); - } - - // ==================== 拼接 VO ==================== - - private List buildRespVOList(List list) { - if (CollUtil.isEmpty(list)) { - return Collections.emptyList(); - } - // 1. 获得关联数据 - Map itemMap = itemService.getItemMap( - convertSet(list, MesWmProductionIssueDetailDO::getItemId)); - Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( - convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); - Map warehouseMap = warehouseService.getWarehouseMap( - convertSet(list, MesWmProductionIssueDetailDO::getWarehouseId)); - Map locationMap = locationService.getWarehouseLocationMap( - convertSet(list, MesWmProductionIssueDetailDO::getLocationId)); - Map areaMap = areaService.getWarehouseAreaMap( - convertSet(list, MesWmProductionIssueDetailDO::getAreaId)); - // 2. 构建结果 - return BeanUtils.toBean(list, MesWmProductionIssueDetailRespVO.class, vo -> { - MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { - vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); - MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), - unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); - }); - MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), - warehouse -> vo.setWarehouseName(warehouse.getName())); - MapUtils.findAndThen(locationMap, vo.getLocationId(), - location -> vo.setLocationName(location.getName())); - MapUtils.findAndThen(areaMap, vo.getAreaId(), - area -> vo.setAreaName(area.getName())); - }); - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueLineController.java deleted file mode 100644 index 295ae58..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/MesWmProductionIssueLineController.java +++ /dev/null @@ -1,124 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLinePageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLineRespVO; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLineSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; -import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; -import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; -import cn.iocoder.yudao.module.mes.service.wm.productionissue.MesWmProductionIssueLineService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; - -@Tag(name = "管理后台 - MES 领料出库单行") -@RestController -@RequestMapping("/mes/wm/production-issue-line") -@Validated -public class MesWmProductionIssueLineController { - - @Resource - private MesWmProductionIssueLineService issueLineService; - - @Resource - private MesMdItemService itemService; - - @Resource - private MesMdUnitMeasureService unitMeasureService; - - @PostMapping("/create") - @Operation(summary = "创建领料出库单行") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:create')") - public CommonResult createProductionIssueLine(@Valid @RequestBody MesWmProductionIssueLineSaveReqVO createReqVO) { - return success(issueLineService.createProductionIssueLine(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "修改领料出库单行") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:update')") - public CommonResult updateProductionIssueLine(@Valid @RequestBody MesWmProductionIssueLineSaveReqVO updateReqVO) { - issueLineService.updateProductionIssueLine(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除领料出库单行") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:delete')") - public CommonResult deleteProductionIssueLine(@RequestParam("id") Long id) { - issueLineService.deleteProductionIssueLine(id); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得领料出库单行") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") - public CommonResult getProductionIssueLine(@RequestParam("id") Long id) { - MesWmProductionIssueLineDO line = issueLineService.getProductionIssueLine(id); - if (line == null) { - return success(null); - } - return success(buildRespVOList(Collections.singletonList(line)).get(0)); - } - - @GetMapping("/page") - @Operation(summary = "获得领料出库单行分页") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") - public CommonResult> getProductionIssueLinePage( - @Valid MesWmProductionIssueLinePageReqVO pageReqVO) { - PageResult pageResult = issueLineService.getProductionIssueLinePage(pageReqVO); - return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); - } - - @GetMapping("/list-by-issue") - @Operation(summary = "获得领料出库单行列表(按领料单编号)") - @Parameter(name = "issueId", description = "领料单编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mes:wm-production-issue:query')") - public CommonResult> getProductionIssueLineListByIssueId( - @RequestParam("issueId") Long issueId) { - List list = issueLineService.getProductionIssueLineListByIssueId(issueId); - return success(buildRespVOList(list)); - } - - // ==================== 拼接 VO ==================== - - private List buildRespVOList(List list) { - if (CollUtil.isEmpty(list)) { - return Collections.emptyList(); - } - // 1. 获得关联数据 - Map itemMap = itemService.getItemMap( - convertSet(list, MesWmProductionIssueLineDO::getItemId)); - Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( - convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); - // 2. 构建结果 - return BeanUtils.toBean(list, MesWmProductionIssueLineRespVO.class, vo -> { - MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { - vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); - MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), - unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); - }); - }); - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssuePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssuePageReqVO.java deleted file mode 100644 index 2c1b64f..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssuePageReqVO.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - MES 领料出库单分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -public class MesWmProductionIssuePageReqVO extends PageParam { - - @Schema(description = "领料单编号", example = "ISSUE20250226001") - private String code; - - @Schema(description = "领料单名称", example = "生产领料") - private String name; - - @Schema(description = "工作站ID", example = "1") - private Long workstationId; - - @Schema(description = "生产工单ID", example = "1") - private Long workOrderId; - - @Schema(description = "生产任务ID", example = "1") - private Long taskId; - - @Schema(description = "客户ID", example = "1") - private Long clientId; - - @Schema(description = "状态", example = "10") - private Integer status; - - @Schema(description = "领料日期范围") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] issueDate; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueRespVO.java deleted file mode 100644 index 570ba2b..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueRespVO.java +++ /dev/null @@ -1,54 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - MES 领料出库单 Response VO") -@Data -public class MesWmProductionIssueRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "领料单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "ISSUE20250226001") - private String code; - - @Schema(description = "领料单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "生产领料") - private String name; - - @Schema(description = "生产工单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long workOrderId; - - @Schema(description = "生产工单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "WO20250226001") - private String workOrderCode; - - @Schema(description = "工作站 ID", example = "1") - private Long workstationId; - - @Schema(description = "工作站名称", example = "装配工作站") - private String workstationName; - - @Schema(description = "生产任务 ID", example = "1") - private Long taskId; - - @Schema(description = "客户 ID", example = "1") - private Long clientId; - - @Schema(description = "领料日期") - private LocalDateTime issueDate; - - @Schema(description = "需求时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime requiredTime; - - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer status; - - @Schema(description = "备注", example = "备注") - private String remark; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueSaveReqVO.java deleted file mode 100644 index b71d65c..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/MesWmProductionIssueSaveReqVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - MES 领料出库单新增/修改 Request VO") -@Data -public class MesWmProductionIssueSaveReqVO { - - @Schema(description = "编号", example = "1024") - private Long id; - - @Schema(description = "领料单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "ISSUE20250226001") - @NotBlank(message = "领料单编号不能为空") - private String code; - - @Schema(description = "领料单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "生产领料") - @NotBlank(message = "领料单名称不能为空") - private String name; - - @Schema(description = "生产工单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "生产工单 ID 不能为空") - private Long workOrderId; - - @Schema(description = "工作站 ID", example = "1") - private Long workstationId; - - @Schema(description = "需求时间", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "需求时间不能为空") - private LocalDateTime requiredTime; - - @Schema(description = "备注", example = "备注") - private String remark; - - } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailRespVO.java deleted file mode 100644 index a31fdf1..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailRespVO.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.detail; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - MES 领料出库明细 Response VO") -@Data -public class MesWmProductionIssueDetailRespVO { - - @Schema(description = "编号", example = "1") - private Long id; - - @Schema(description = "领料单编号", example = "1") - private Long issueId; - - @Schema(description = "行编号", example = "1") - private Long lineId; - - @Schema(description = "库存记录编号", example = "1") - private Long materialStockId; - - @Schema(description = "物料编号", example = "1") - private Long itemId; - - @Schema(description = "物料编码", example = "ITEM001") - private String itemCode; - - @Schema(description = "物料名称", example = "螺丝") - private String itemName; - - @Schema(description = "规格型号", example = "M8*20") - private String specification; - - @Schema(description = "计量单位名称", example = "个") - private String unitMeasureName; - - @Schema(description = "领料数量", example = "300.00") - private BigDecimal quantity; - - @Schema(description = "批次编号", example = "1") - private Long batchId; - - @Schema(description = "批次号", example = "BATCH20260101001") - private String batchCode; - - @Schema(description = "仓库编号", example = "1") - private Long warehouseId; - - @Schema(description = "仓库名称", example = "原材料仓库") - private String warehouseName; - - @Schema(description = "库区编号", example = "1") - private Long locationId; - - @Schema(description = "库区名称", example = "A区") - private String locationName; - - @Schema(description = "库位编号", example = "1") - private Long areaId; - - @Schema(description = "库位名称", example = "A01") - private String areaName; - - @Schema(description = "备注", example = "备注") - private String remark; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java deleted file mode 100644 index 2b3c983..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/detail/MesWmProductionIssueDetailSaveReqVO.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.detail; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.math.BigDecimal; - -@Schema(description = "管理后台 - MES 领料出库明细新增/修改 Request VO") -@Data -public class MesWmProductionIssueDetailSaveReqVO { - - @Schema(description = "编号", example = "1024") - private Long id; - - @Schema(description = "领料单行编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "领料单行编号不能为空") - private Long lineId; - - @Schema(description = "领料单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "领料单编号不能为空") - private Long issueId; - - @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "物料编号不能为空") - private Long itemId; - - @Schema(description = "领料数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "300.00") - @NotNull(message = "领料数量不能为空") - private BigDecimal quantity; - - @Schema(description = "批次编号", example = "1") - private Long batchId; - - @Schema(description = "批次号", example = "BATCH20260101001") - private String batchCode; - - @Schema(description = "仓库编号", example = "1") - private Long warehouseId; - - @Schema(description = "库区编号", example = "1") - private Long locationId; - - @Schema(description = "库位编号", example = "1") - private Long areaId; - - @Schema(description = "备注", example = "备注") - private String remark; - - } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLinePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLinePageReqVO.java deleted file mode 100644 index 480710f..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLinePageReqVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "管理后台 - MES 领料出库单行分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MesWmProductionIssueLinePageReqVO extends PageParam { - - @Schema(description = "领料单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "领料单编号不能为空") - private Long issueId; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineRespVO.java deleted file mode 100644 index 2403cf2..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineRespVO.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - MES 领料出库单行 Response VO") -@Data -public class MesWmProductionIssueLineRespVO { - - @Schema(description = "行ID", example = "1") - private Long id; - - @Schema(description = "领料单ID", example = "1") - private Long issueId; - - @Schema(description = "物料ID", example = "1") - private Long itemId; - - @Schema(description = "物料编码", example = "M001") - private String itemCode; - - @Schema(description = "物料名称", example = "钢板") - private String itemName; - - @Schema(description = "规格型号", example = "10mm*100mm") - private String specification; - - @Schema(description = "计量单位名称", example = "千克") - private String unitMeasureName; - - @Schema(description = "领料数量", example = "100.00") - private BigDecimal quantity; - - @Schema(description = "批次ID", example = "1") - private Long batchId; - - @Schema(description = "备注", example = "备注") - private String remark; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java deleted file mode 100644 index 0188767..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productionissue/vo/line/MesWmProductionIssueLineSaveReqVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.DecimalMin; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.math.BigDecimal; - -@Schema(description = "管理后台 - MES 领料出库单行 Save Request VO") -@Data -public class MesWmProductionIssueLineSaveReqVO { - - @Schema(description = "行ID", example = "1") - private Long id; - - @Schema(description = "领料单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "领料单ID不能为空") - private Long issueId; - - @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "物料ID不能为空") - private Long itemId; - - @Schema(description = "领料数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") - @NotNull(message = "领料数量不能为空") - @DecimalMin(value = "0", inclusive = false, message = "领料数量必须大于 0") - private BigDecimal quantity; - - @Schema(description = "批次ID", example = "1") - private Long batchId; - - @Schema(description = "备注", example = "备注") - private String remark; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueController.java new file mode 100644 index 0000000..09e5a4b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueController.java @@ -0,0 +1,175 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productissue; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.MesWmProductIssuePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.MesWmProductIssueRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.MesWmProductIssueSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDO; +import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; +import cn.iocoder.yudao.module.mes.service.wm.productissue.MesWmProductIssueService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Tag(name = "管理后台 - MES 领料出库单") +@RestController +@RequestMapping("/mes/wm/product-issue") +@Validated +public class MesWmProductIssueController { + + @Resource + private MesWmProductIssueService issueService; + @Resource + private MesMdWorkstationService workstationService; + @Resource + private MesProWorkOrderService workOrderService; + + @PostMapping("/create") + @Operation(summary = "创建领料出库单") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:create')") + public CommonResult createProductIssue(@Valid @RequestBody MesWmProductIssueSaveReqVO createReqVO) { + return success(issueService.createProductIssue(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改领料出库单") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:update')") + public CommonResult updateProductIssue(@Valid @RequestBody MesWmProductIssueSaveReqVO updateReqVO) { + issueService.updateProductIssue(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除领料出库单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:delete')") + public CommonResult deleteProductIssue(@RequestParam("id") Long id) { + issueService.deleteProductIssue(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得领料出库单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')") + public CommonResult getProductIssue(@RequestParam("id") Long id) { + MesWmProductIssueDO issue = issueService.getProductIssue(id); + if (issue == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(issue)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得领料出库单分页") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')") + public CommonResult> getProductIssuePage( + @Valid MesWmProductIssuePageReqVO pageReqVO) { + PageResult pageResult = issueService.getProductIssuePage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出领料出库单 Excel") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportProductIssueExcel(@Valid MesWmProductIssuePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + PageResult pageResult = issueService.getProductIssuePage(pageReqVO); + ExcelUtils.write(response, "领料出库单.xls", "数据", MesWmProductIssueRespVO.class, + buildRespVOList(pageResult.getList())); + } + + @PutMapping("/finish") + @Operation(summary = "完成领料出库单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:finish')") + public CommonResult finishProductIssue(@RequestParam("id") Long id) { + issueService.finishProductIssue(id); + return success(true); + } + + @PutMapping("/submit") + @Operation(summary = "提交领料出库单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:update')") + public CommonResult submitProductIssue(@RequestParam("id") Long id) { + issueService.submitProductIssue(id); + return success(true); + } + + @PutMapping("/stock") + @Operation(summary = "执行拣货") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:update')") + public CommonResult stockProductIssue(@RequestParam("id") Long id) { + issueService.stockProductIssue(id); + return success(true); + } + + @PutMapping("/cancel") + @Operation(summary = "取消领料出库单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:update')") + public CommonResult cancelProductIssue(@RequestParam("id") Long id) { + issueService.cancelProductIssue(id); + return success(true); + } + + @GetMapping("/check-quantity") + @Operation(summary = "校验领料出库单数量", description = "校验每行明细数量之和是否等于行领料数量") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')") + public CommonResult checkProductIssueQuantity(@RequestParam("id") Long id) { + return success(issueService.checkProductIssueQuantity(id)); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 获得关联数据 + Map workstationMap = workstationService.getWorkstationMap( + convertSet(list, MesWmProductIssueDO::getWorkstationId)); + Map workOrderMap = workOrderService.getWorkOrderMap( + convertSet(list, MesWmProductIssueDO::getWorkOrderId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmProductIssueRespVO.class, vo -> { + // 2.1 填充工作站名称 + MapUtils.findAndThen(workstationMap, vo.getWorkstationId(), + workstation -> vo.setWorkstationName(workstation.getName())); + // 2.2 填充工单编号 + MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(), + workOrder -> vo.setWorkOrderCode(workOrder.getCode())); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueDetailController.java new file mode 100644 index 0000000..0d7a1aa --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueDetailController.java @@ -0,0 +1,140 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productissue; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.detail.MesWmProductIssueDetailRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.detail.MesWmProductIssueDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import cn.iocoder.yudao.module.mes.service.wm.productissue.MesWmProductIssueDetailService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Tag(name = "管理后台 - MES 领料出库明细") +@RestController +@RequestMapping("/mes/wm/product-issue-detail") +@Validated +public class MesWmProductIssueDetailController { + + @Resource + private MesWmProductIssueDetailService issueDetailService; + + @Resource + private MesMdItemService itemService; + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @Resource + private MesWmWarehouseService warehouseService; + + @Resource + private MesWmWarehouseLocationService locationService; + + @Resource + private MesWmWarehouseAreaService areaService; + + @PostMapping("/create") + @Operation(summary = "创建领料出库明细") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:create')") + public CommonResult createProductIssueDetail(@Valid @RequestBody MesWmProductIssueDetailSaveReqVO createReqVO) { + return success(issueDetailService.createProductIssueDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改领料出库明细") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:update')") + public CommonResult updateProductIssueDetail(@Valid @RequestBody MesWmProductIssueDetailSaveReqVO updateReqVO) { + issueDetailService.updateProductIssueDetail(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除领料出库明细") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:delete')") + public CommonResult deleteProductIssueDetail(@RequestParam("id") Long id) { + issueDetailService.deleteProductIssueDetail(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得领料出库明细") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')") + public CommonResult getProductIssueDetail(@RequestParam("id") Long id) { + MesWmProductIssueDetailDO detail = issueDetailService.getProductIssueDetail(id); + if (detail == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(detail)).get(0)); + } + + @GetMapping("/list-by-line") + @Operation(summary = "获得领料出库明细列表(按行编号)") + @Parameter(name = "lineId", description = "行编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')") + public CommonResult> getProductIssueDetailListByLineId( + @RequestParam("lineId") Long lineId) { + List list = issueDetailService.getProductIssueDetailListByLineId(lineId); + return success(buildRespVOList(list)); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 获得关联数据 + Map itemMap = itemService.getItemMap( + convertSet(list, MesWmProductIssueDetailDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + Map warehouseMap = warehouseService.getWarehouseMap( + convertSet(list, MesWmProductIssueDetailDO::getWarehouseId)); + Map locationMap = locationService.getWarehouseLocationMap( + convertSet(list, MesWmProductIssueDetailDO::getLocationId)); + Map areaMap = areaService.getWarehouseAreaMap( + convertSet(list, MesWmProductIssueDetailDO::getAreaId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmProductIssueDetailRespVO.class, vo -> { + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + }); + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), + warehouse -> vo.setWarehouseName(warehouse.getName())); + MapUtils.findAndThen(locationMap, vo.getLocationId(), + location -> vo.setLocationName(location.getName())); + MapUtils.findAndThen(areaMap, vo.getAreaId(), + area -> vo.setAreaName(area.getName())); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java new file mode 100644 index 0000000..e9b01d0 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/MesWmProductIssueLineController.java @@ -0,0 +1,124 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productissue; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueLineDO; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import cn.iocoder.yudao.module.mes.service.wm.productissue.MesWmProductIssueLineService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; + +@Tag(name = "管理后台 - MES 领料出库单行") +@RestController +@RequestMapping("/mes/wm/product-issue-line") +@Validated +public class MesWmProductIssueLineController { + + @Resource + private MesWmProductIssueLineService issueLineService; + + @Resource + private MesMdItemService itemService; + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @PostMapping("/create") + @Operation(summary = "创建领料出库单行") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:create')") + public CommonResult createProductIssueLine(@Valid @RequestBody MesWmProductIssueLineSaveReqVO createReqVO) { + return success(issueLineService.createProductIssueLine(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "修改领料出库单行") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:update')") + public CommonResult updateProductIssueLine(@Valid @RequestBody MesWmProductIssueLineSaveReqVO updateReqVO) { + issueLineService.updateProductIssueLine(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除领料出库单行") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:delete')") + public CommonResult deleteProductIssueLine(@RequestParam("id") Long id) { + issueLineService.deleteProductIssueLine(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得领料出库单行") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')") + public CommonResult getProductIssueLine(@RequestParam("id") Long id) { + MesWmProductIssueLineDO line = issueLineService.getProductIssueLine(id); + if (line == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(line)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得领料出库单行分页") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')") + public CommonResult> getProductIssueLinePage( + @Valid MesWmProductIssueLinePageReqVO pageReqVO) { + PageResult pageResult = issueLineService.getProductIssueLinePage(pageReqVO); + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/list-by-issue") + @Operation(summary = "获得领料出库单行列表(按领料单编号)") + @Parameter(name = "issueId", description = "领料单编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-product-issue:query')") + public CommonResult> getProductIssueLineListByIssueId( + @RequestParam("issueId") Long issueId) { + List list = issueLineService.getProductIssueLineListByIssueId(issueId); + return success(buildRespVOList(list)); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 获得关联数据 + Map itemMap = itemService.getItemMap( + convertSet(list, MesWmProductIssueLineDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + // 2. 构建结果 + return BeanUtils.toBean(list, MesWmProductIssueLineRespVO.class, vo -> { + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + }); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssuePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssuePageReqVO.java new file mode 100644 index 0000000..4fafa97 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssuePageReqVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - MES 领料出库单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class MesWmProductIssuePageReqVO extends PageParam { + + @Schema(description = "领料单编号", example = "ISSUE20250226001") + private String code; + + @Schema(description = "领料单名称", example = "生产领料") + private String name; + + @Schema(description = "工作站ID", example = "1") + private Long workstationId; + + @Schema(description = "生产工单ID", example = "1") + private Long workOrderId; + + @Schema(description = "生产任务ID", example = "1") + private Long taskId; + + @Schema(description = "客户ID", example = "1") + private Long clientId; + + @Schema(description = "状态", example = "10") + private Integer status; + + @Schema(description = "领料日期范围") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] issueDate; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueRespVO.java new file mode 100644 index 0000000..b93084b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueRespVO.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 领料出库单 Response VO") +@Data +public class MesWmProductIssueRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "领料单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "ISSUE20250226001") + private String code; + + @Schema(description = "领料单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "生产领料") + private String name; + + @Schema(description = "生产工单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long workOrderId; + + @Schema(description = "生产工单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "WO20250226001") + private String workOrderCode; + + @Schema(description = "工作站 ID", example = "1") + private Long workstationId; + + @Schema(description = "工作站名称", example = "装配工作站") + private String workstationName; + + @Schema(description = "生产任务 ID", example = "1") + private Long taskId; + + @Schema(description = "客户 ID", example = "1") + private Long clientId; + + @Schema(description = "领料日期") + private LocalDateTime issueDate; + + @Schema(description = "需求时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime requiredTime; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + private Integer status; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueSaveReqVO.java new file mode 100644 index 0000000..7dbec27 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/MesWmProductIssueSaveReqVO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 领料出库单新增/修改 Request VO") +@Data +public class MesWmProductIssueSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "领料单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "ISSUE20250226001") + @NotBlank(message = "领料单编号不能为空") + private String code; + + @Schema(description = "领料单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "生产领料") + @NotBlank(message = "领料单名称不能为空") + private String name; + + @Schema(description = "生产工单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "生产工单 ID 不能为空") + private Long workOrderId; + + @Schema(description = "工作站 ID", example = "1") + private Long workstationId; + + @Schema(description = "需求时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "需求时间不能为空") + private LocalDateTime requiredTime; + + @Schema(description = "备注", example = "备注") + private String remark; + + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailRespVO.java new file mode 100644 index 0000000..601d393 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailRespVO.java @@ -0,0 +1,73 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.detail; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 领料出库明细 Response VO") +@Data +public class MesWmProductIssueDetailRespVO { + + @Schema(description = "编号", example = "1") + private Long id; + + @Schema(description = "领料单编号", example = "1") + private Long issueId; + + @Schema(description = "行编号", example = "1") + private Long lineId; + + @Schema(description = "库存记录编号", example = "1") + private Long materialStockId; + + @Schema(description = "物料编号", example = "1") + private Long itemId; + + @Schema(description = "物料编码", example = "ITEM001") + private String itemCode; + + @Schema(description = "物料名称", example = "螺丝") + private String itemName; + + @Schema(description = "规格型号", example = "M8*20") + private String specification; + + @Schema(description = "计量单位名称", example = "个") + private String unitMeasureName; + + @Schema(description = "领料数量", example = "300.00") + private BigDecimal quantity; + + @Schema(description = "批次编号", example = "1") + private Long batchId; + + @Schema(description = "批次号", example = "BATCH20260101001") + private String batchCode; + + @Schema(description = "仓库编号", example = "1") + private Long warehouseId; + + @Schema(description = "仓库名称", example = "原材料仓库") + private String warehouseName; + + @Schema(description = "库区编号", example = "1") + private Long locationId; + + @Schema(description = "库区名称", example = "A区") + private String locationName; + + @Schema(description = "库位编号", example = "1") + private Long areaId; + + @Schema(description = "库位名称", example = "A01") + private String areaName; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailSaveReqVO.java new file mode 100644 index 0000000..96e8c69 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/detail/MesWmProductIssueDetailSaveReqVO.java @@ -0,0 +1,50 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.detail; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 领料出库明细新增/修改 Request VO") +@Data +public class MesWmProductIssueDetailSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "领料单行编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "领料单行编号不能为空") + private Long lineId; + + @Schema(description = "领料单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "领料单编号不能为空") + private Long issueId; + + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "物料编号不能为空") + private Long itemId; + + @Schema(description = "领料数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "300.00") + @NotNull(message = "领料数量不能为空") + private BigDecimal quantity; + + @Schema(description = "批次编号", example = "1") + private Long batchId; + + @Schema(description = "批次号", example = "BATCH20260101001") + private String batchCode; + + @Schema(description = "仓库编号", example = "1") + private Long warehouseId; + + @Schema(description = "库区编号", example = "1") + private Long locationId; + + @Schema(description = "库位编号", example = "1") + private Long areaId; + + @Schema(description = "备注", example = "备注") + private String remark; + + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLinePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLinePageReqVO.java new file mode 100644 index 0000000..c5ca6c5 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLinePageReqVO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - MES 领料出库单行分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesWmProductIssueLinePageReqVO extends PageParam { + + @Schema(description = "领料单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "领料单编号不能为空") + private Long issueId; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineRespVO.java new file mode 100644 index 0000000..f21b4b7 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineRespVO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 领料出库单行 Response VO") +@Data +public class MesWmProductIssueLineRespVO { + + @Schema(description = "行ID", example = "1") + private Long id; + + @Schema(description = "领料单ID", example = "1") + private Long issueId; + + @Schema(description = "物料ID", example = "1") + private Long itemId; + + @Schema(description = "物料编码", example = "M001") + private String itemCode; + + @Schema(description = "物料名称", example = "钢板") + private String itemName; + + @Schema(description = "规格型号", example = "10mm*100mm") + private String specification; + + @Schema(description = "计量单位名称", example = "千克") + private String unitMeasureName; + + @Schema(description = "领料数量", example = "100.00") + private BigDecimal quantity; + + @Schema(description = "批次ID", example = "1") + private Long batchId; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineSaveReqVO.java new file mode 100644 index 0000000..314b2b4 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productissue/vo/line/MesWmProductIssueLineSaveReqVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 领料出库单行 Save Request VO") +@Data +public class MesWmProductIssueLineSaveReqVO { + + @Schema(description = "行ID", example = "1") + private Long id; + + @Schema(description = "领料单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "领料单ID不能为空") + private Long issueId; + + @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "物料ID不能为空") + private Long itemId; + + @Schema(description = "领料数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") + @NotNull(message = "领料数量不能为空") + @DecimalMin(value = "0", inclusive = false, message = "领料数量必须大于 0") + private BigDecimal quantity; + + @Schema(description = "批次ID", example = "1") + private Long batchId; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDO.java deleted file mode 100644 index 47481a1..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDO.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; -import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductionIssueStatusEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.time.LocalDateTime; - -/** - * MES 领料出库单 DO - */ -@TableName("mes_wm_production_issue") -@KeySequence("mes_wm_production_issue_seq") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MesWmProductionIssueDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 领料单编号 - */ - private String code; - /** - * 领料单名称 - */ - private String name; - /** - * 工作站 ID - * - * 关联 {@link MesMdWorkstationDO#getId()} - */ - private Long workstationId; - /** - * 生产工单 ID - * - * 关联 {@link MesProWorkOrderDO#getId()} - */ - private Long workOrderId; - // TODO @芋艿:【疑问,不要动】这个字段的来源? - /** - * 生产任务 ID - * - * 关联 {@link MesProTaskDO#getId()} - */ - private Long taskId; - // TODO @芋艿:【疑问,不要动】这个字段的更新时间; - /** - * 领料日期 - */ - private LocalDateTime issueDate; - /** - * 需求时间 - */ - private LocalDateTime requiredTime; - /** - * 状态 - * - * 枚举 {@link MesWmProductionIssueStatusEnum} - */ - private Integer status; - /** - * 备注 - */ - private String remark; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDetailDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDetailDO.java deleted file mode 100644 index c22ee0c..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueDetailDO.java +++ /dev/null @@ -1,93 +0,0 @@ -package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.math.BigDecimal; - -/** - * MES 领料出库明细 DO - */ -@TableName("mes_wm_production_issue_detail") -@KeySequence("mes_wm_production_issue_detail_seq") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MesWmProductionIssueDetailDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 领料单ID - * - * 关联 {@link MesWmProductionIssueDO#getId()} - */ - private Long issueId; - /** - * 行ID - * - * 关联 {@link MesWmProductionIssueLineDO#getId()} - */ - private Long lineId; - /** - * 库存记录ID - * - * 关联 {@link MesWmMaterialStockDO#getId()} - */ - private Long materialStockId; - /** - * 物料ID - * - * 关联 {@link MesMdItemDO#getId()} - */ - private Long itemId; - /** - * 领料数量 - */ - private BigDecimal quantity; - /** - * 批次ID - */ - private Long batchId; - /** - * 批次号 - */ - private String batchCode; - /** - * 仓库ID - * - * 关联 {@link MesWmWarehouseDO#getId()} - */ - private Long warehouseId; - /** - * 库区ID - * - * 关联 {@link MesWmWarehouseLocationDO#getId()} - */ - private Long locationId; - /** - * 库位ID - * - * 关联 {@link MesWmWarehouseAreaDO#getId()} - */ - private Long areaId; - /** - * 备注 - */ - private String remark; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueLineDO.java deleted file mode 100644 index b0cf524..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productionissue/MesWmProductionIssueLineDO.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue; - -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; - -import java.math.BigDecimal; - -/** - * MES 领料出库单行 DO - */ -@TableName("mes_wm_production_issue_line") -@KeySequence("mes_wm_production_issue_line_seq") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MesWmProductionIssueLineDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 领料单 ID - * - * 关联 {@link MesWmProductionIssueDO#getId()} - */ - private Long issueId; - /** - * 物料 ID - * - * 关联 {@link MesMdItemDO#getId()} - */ - private Long itemId; - /** - * 领料数量 - */ - private BigDecimal quantity; - /** - * 批次 ID - */ - private Long batchId; - /** - * 备注 - */ - private String remark; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDO.java new file mode 100644 index 0000000..83f414c --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDO.java @@ -0,0 +1,80 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductIssueStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * MES 领料出库单 DO + */ +@TableName("mes_wm_product_issue") +@KeySequence("mes_wm_product_issue_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmProductIssueDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 领料单编号 + */ + private String code; + /** + * 领料单名称 + */ + private String name; + /** + * 工作站 ID + * + * 关联 {@link MesMdWorkstationDO#getId()} + */ + private Long workstationId; + /** + * 生产工单 ID + * + * 关联 {@link MesProWorkOrderDO#getId()} + */ + private Long workOrderId; + // TODO @芋艿:【疑问,不要动】这个字段的来源? + /** + * 生产任务 ID + * + * 关联 {@link MesProTaskDO#getId()} + */ + private Long taskId; + // TODO @芋艿:【疑问,不要动】这个字段的更新时间; + /** + * 领料日期 + */ + private LocalDateTime issueDate; + /** + * 需求时间 + */ + private LocalDateTime requiredTime; + /** + * 状态 + * + * 枚举 {@link MesWmProductIssueStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDetailDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDetailDO.java new file mode 100644 index 0000000..6690dbf --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueDetailDO.java @@ -0,0 +1,93 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * MES 领料出库明细 DO + */ +@TableName("mes_wm_product_issue_detail") +@KeySequence("mes_wm_product_issue_detail_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmProductIssueDetailDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 领料单ID + * + * 关联 {@link MesWmProductIssueDO#getId()} + */ + private Long issueId; + /** + * 行ID + * + * 关联 {@link MesWmProductIssueLineDO#getId()} + */ + private Long lineId; + /** + * 库存记录ID + * + * 关联 {@link MesWmMaterialStockDO#getId()} + */ + private Long materialStockId; + /** + * 物料ID + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 领料数量 + */ + private BigDecimal quantity; + /** + * 批次ID + */ + private Long batchId; + /** + * 批次号 + */ + private String batchCode; + /** + * 仓库ID + * + * 关联 {@link MesWmWarehouseDO#getId()} + */ + private Long warehouseId; + /** + * 库区ID + * + * 关联 {@link MesWmWarehouseLocationDO#getId()} + */ + private Long locationId; + /** + * 库位ID + * + * 关联 {@link MesWmWarehouseAreaDO#getId()} + */ + private Long areaId; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueLineDO.java new file mode 100644 index 0000000..89d8d6a --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productissue/MesWmProductIssueLineDO.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * MES 领料出库单行 DO + */ +@TableName("mes_wm_product_issue_line") +@KeySequence("mes_wm_product_issue_line_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmProductIssueLineDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 领料单 ID + * + * 关联 {@link MesWmProductIssueDO#getId()} + */ + private Long issueId; + /** + * 物料 ID + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 领料数量 + */ + private BigDecimal quantity; + /** + * 批次 ID + */ + private Long batchId; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueDetailMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueDetailMapper.java deleted file mode 100644 index c67bb74..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueDetailMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue; - -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDetailDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * MES 领料出库明细 Mapper - */ -@Mapper -public interface MesWmProductionIssueDetailMapper extends BaseMapperX { - - default List selectListByLineId(Long lineId) { - return selectList(MesWmProductionIssueDetailDO::getLineId, lineId); - } - - default List selectListByIssueId(Long issueId) { - return selectList(MesWmProductionIssueDetailDO::getIssueId, issueId); - } - - default void deleteByIssueId(Long issueId) { - delete(MesWmProductionIssueDetailDO::getIssueId, issueId); - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueLineMapper.java deleted file mode 100644 index e203071..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueLineMapper.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLinePageReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * MES 领料出库单行 Mapper - */ -@Mapper -public interface MesWmProductionIssueLineMapper extends BaseMapperX { - - default PageResult selectPage(MesWmProductionIssueLinePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(MesWmProductionIssueLineDO::getIssueId, reqVO.getIssueId()) - .orderByDesc(MesWmProductionIssueLineDO::getId)); - } - - default List selectListByIssueId(Long issueId) { - return selectList(MesWmProductionIssueLineDO::getIssueId, issueId); - } - - default void deleteByIssueId(Long issueId) { - delete(MesWmProductionIssueLineDO::getIssueId, issueId); - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueMapper.java deleted file mode 100644 index 0f0060d..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productionissue/MesWmProductionIssueMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssuePageReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * MES 领料出库单 Mapper - */ -@Mapper -public interface MesWmProductionIssueMapper extends BaseMapperX { - - default PageResult selectPage(MesWmProductionIssuePageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .likeIfPresent(MesWmProductionIssueDO::getCode, reqVO.getCode()) - .likeIfPresent(MesWmProductionIssueDO::getName, reqVO.getName()) - .eqIfPresent(MesWmProductionIssueDO::getWorkstationId, reqVO.getWorkstationId()) - .eqIfPresent(MesWmProductionIssueDO::getWorkOrderId, reqVO.getWorkOrderId()) - .eqIfPresent(MesWmProductionIssueDO::getStatus, reqVO.getStatus()) - .betweenIfPresent(MesWmProductionIssueDO::getIssueDate, reqVO.getIssueDate()) - .orderByDesc(MesWmProductionIssueDO::getId)); - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueDetailMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueDetailMapper.java new file mode 100644 index 0000000..76f5498 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueDetailMapper.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.productissue; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDetailDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 领料出库明细 Mapper + */ +@Mapper +public interface MesWmProductIssueDetailMapper extends BaseMapperX { + + default List selectListByLineId(Long lineId) { + return selectList(MesWmProductIssueDetailDO::getLineId, lineId); + } + + default List selectListByIssueId(Long issueId) { + return selectList(MesWmProductIssueDetailDO::getIssueId, issueId); + } + + default void deleteByIssueId(Long issueId) { + delete(MesWmProductIssueDetailDO::getIssueId, issueId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueLineMapper.java new file mode 100644 index 0000000..265e21e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueLineMapper.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.productissue; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLinePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueLineDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 领料出库单行 Mapper + */ +@Mapper +public interface MesWmProductIssueLineMapper extends BaseMapperX { + + default PageResult selectPage(MesWmProductIssueLinePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesWmProductIssueLineDO::getIssueId, reqVO.getIssueId()) + .orderByDesc(MesWmProductIssueLineDO::getId)); + } + + default List selectListByIssueId(Long issueId) { + return selectList(MesWmProductIssueLineDO::getIssueId, issueId); + } + + default void deleteByIssueId(Long issueId) { + delete(MesWmProductIssueLineDO::getIssueId, issueId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueMapper.java new file mode 100644 index 0000000..569cbb7 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/productissue/MesWmProductIssueMapper.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.productissue; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.MesWmProductIssuePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * MES 领料出库单 Mapper + */ +@Mapper +public interface MesWmProductIssueMapper extends BaseMapperX { + + default PageResult selectPage(MesWmProductIssuePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesWmProductIssueDO::getCode, reqVO.getCode()) + .likeIfPresent(MesWmProductIssueDO::getName, reqVO.getName()) + .eqIfPresent(MesWmProductIssueDO::getWorkstationId, reqVO.getWorkstationId()) + .eqIfPresent(MesWmProductIssueDO::getWorkOrderId, reqVO.getWorkOrderId()) + .eqIfPresent(MesWmProductIssueDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(MesWmProductIssueDO::getIssueDate, reqVO.getIssueDate()) + .orderByDesc(MesWmProductIssueDO::getId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 731ed73..a144abe 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -409,16 +409,16 @@ public interface ErrorCodeConstants { ErrorCode WM_OUTSOURCE_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_707_200, "外协发料单明细不存在"); // ========== MES 仓库管理-生产领料出库单(1-040-708-000) ========== - ErrorCode WM_PRODUCTION_ISSUE_NOT_EXISTS = new ErrorCode(1_040_708_000, "生产领料出库单不存在"); - ErrorCode WM_PRODUCTION_ISSUE_STATUS_INVALID = new ErrorCode(1_040_708_001, "生产领料出库单状态不正确,无法执行该操作"); - ErrorCode WM_PRODUCTION_ISSUE_NO_LINE = new ErrorCode(1_040_708_002, "生产领料出库单至少需要一条行数据"); - ErrorCode WM_PRODUCTION_ISSUE_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_708_003, "领料出库单行数量与明细数量不一致"); - ErrorCode WM_PRODUCTION_ISSUE_WORKORDER_NOT_EXISTS = new ErrorCode(1_040_708_004, "生产工单不存在"); - ErrorCode WM_PRODUCTION_ISSUE_WORKSTATION_NOT_EXISTS = new ErrorCode(1_040_708_005, "工作站不存在"); - ErrorCode WM_PRODUCTION_ISSUE_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_708_006, "生产领料出库单已完成或已取消,无法取消"); - ErrorCode WM_PRODUCTION_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_708_100, "生产领料出库单行不存在"); - ErrorCode WM_PRODUCTION_ISSUE_LINE_ITEM_NOT_IN_BOM = new ErrorCode(1_040_708_101, "当前物料不在生产工单的 BOM 物料清单中"); - ErrorCode WM_PRODUCTION_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_708_200, "生产领料出库单明细不存在"); + ErrorCode WM_PRODUCT_ISSUE_NOT_EXISTS = new ErrorCode(1_040_708_000, "生产领料出库单不存在"); + ErrorCode WM_PRODUCT_ISSUE_STATUS_INVALID = new ErrorCode(1_040_708_001, "生产领料出库单状态不正确,无法执行该操作"); + ErrorCode WM_PRODUCT_ISSUE_NO_LINE = new ErrorCode(1_040_708_002, "生产领料出库单至少需要一条行数据"); + ErrorCode WM_PRODUCT_ISSUE_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_708_003, "领料出库单行数量与明细数量不一致"); + ErrorCode WM_PRODUCT_ISSUE_WORKORDER_NOT_EXISTS = new ErrorCode(1_040_708_004, "生产工单不存在"); + ErrorCode WM_PRODUCT_ISSUE_WORKSTATION_NOT_EXISTS = new ErrorCode(1_040_708_005, "工作站不存在"); + ErrorCode WM_PRODUCT_ISSUE_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_708_006, "生产领料出库单已完成或已取消,无法取消"); + ErrorCode WM_PRODUCT_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_708_100, "生产领料出库单行不存在"); + ErrorCode WM_PRODUCT_ISSUE_LINE_ITEM_NOT_IN_BOM = new ErrorCode(1_040_708_101, "当前物料不在生产工单的 BOM 物料清单中"); + ErrorCode WM_PRODUCT_ISSUE_DETAIL_NOT_EXISTS = new ErrorCode(1_040_708_200, "生产领料出库单明细不存在"); // ========== MES 仓库管理-生产入库单(1-040-709-000) ========== ErrorCode WM_PRODUCT_PRODUCE_NOT_EXISTS = new ErrorCode(1_040_709_000, "生产入库单不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java index 3de5c9c..b0e0d47 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java @@ -35,7 +35,7 @@ public final class MesBizTypeConstants { public static final int WM_TRANSFER_IN = 112; // 调拨入库:MesWmTransferDO public static final int WM_MISC_ISSUE = 113; // 其他出库:MesWmMiscIssueDO public static final int WM_MISC_RECPT = 114; // 其他入库:MesWmMiscReceiptDO - public static final int WM_ISSUE = 115; // 生产领料:MesWmProductionIssueDO + public static final int WM_ISSUE = 115; // 生产领料:MesWmProductIssueDO public static final int WM_RETURN_ISSUE = 116; // 生产退料:MesWmReturnIssueDO public static final int WM_PRODUCT_RECPT = 117; // 生产入库:MesWmProductReceiptDO public static final int WM_PRODUCT_SALES = 118; // 销售出库:MesWmProductSalesDO diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductIssueStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductIssueStatusEnum.java new file mode 100644 index 0000000..7e583ea --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductIssueStatusEnum.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.MesWmProductIssueSaveReqVO; +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; +import cn.iocoder.yudao.module.mes.service.wm.productissue.MesWmProductIssueService; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * MES 领料出库单状态枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum MesWmProductIssueStatusEnum implements ArrayValuable { + + /** + * 草稿 + * + * 对应方法:{@link MesWmProductIssueService#createProductIssue(MesWmProductIssueSaveReqVO)} + */ + PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), + /** + * 待拣货 + * + * 对应方法:{@link MesWmProductIssueService#submitProductIssue(Long)} + */ + APPROVING(MesOrderStatusConstants.APPROVING, "待拣货"), + /** + * 待执行领出 + * + * 对应方法:{@link MesWmProductIssueService#stockProductIssue(Long)} + */ + APPROVED(MesOrderStatusConstants.APPROVED, "待执行领出"), + /** + * 已完成 + * + * 对应方法:{@link MesWmProductIssueService#finishProductIssue(Long)} + */ + FINISHED(MesOrderStatusConstants.FINISHED, "已完成"), + /** + * 已取消 + * + * 对应方法:{@link MesWmProductIssueService#cancelProductIssue(Long)} + */ + CANCELED(MesOrderStatusConstants.CANCELLED, "已取消"); + + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmProductIssueStatusEnum::getStatus).toArray(Integer[]::new); + + /** + * 状态值 + */ + private final Integer status; + /** + * 状态名 + */ + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductProduceStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductProduceStatusEnum.java index e425410..c9a278d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductProduceStatusEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductProduceStatusEnum.java @@ -16,7 +16,7 @@ import java.util.Arrays; @AllArgsConstructor public enum MesWmProductProduceStatusEnum implements ArrayValuable { - // TODO @AI:对应的方法;参考别的 MesWmProductionIssueStatusEnum + // TODO @AI:对应的方法;参考别的 MesWmProductIssueStatusEnum /** * 草稿 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductionIssueStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductionIssueStatusEnum.java deleted file mode 100644 index a0f7bd6..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmProductionIssueStatusEnum.java +++ /dev/null @@ -1,68 +0,0 @@ -package cn.iocoder.yudao.module.mes.enums.wm; - -import cn.iocoder.yudao.framework.common.core.ArrayValuable; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssueSaveReqVO; -import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; -import cn.iocoder.yudao.module.mes.service.wm.productionissue.MesWmProductionIssueService; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * MES 领料出库单状态枚举 - * - * @author 芋道源码 - */ -@Getter -@AllArgsConstructor -public enum MesWmProductionIssueStatusEnum implements ArrayValuable { - - /** - * 草稿 - * - * 对应方法:{@link MesWmProductionIssueService#createProductionIssue(MesWmProductionIssueSaveReqVO)} - */ - PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), - /** - * 待拣货 - * - * 对应方法:{@link MesWmProductionIssueService#submitProductionIssue(Long)} - */ - APPROVING(MesOrderStatusConstants.APPROVING, "待拣货"), - /** - * 待执行领出 - * - * 对应方法:{@link MesWmProductionIssueService#stockProductionIssue(Long)} - */ - APPROVED(MesOrderStatusConstants.APPROVED, "待执行领出"), - /** - * 已完成 - * - * 对应方法:{@link MesWmProductionIssueService#finishProductionIssue(Long)} - */ - FINISHED(MesOrderStatusConstants.FINISHED, "已完成"), - /** - * 已取消 - * - * 对应方法:{@link MesWmProductionIssueService#cancelProductionIssue(Long)} - */ - CANCELED(MesOrderStatusConstants.CANCELLED, "已取消"); - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmProductionIssueStatusEnum::getStatus).toArray(Integer[]::new); - - /** - * 状态值 - */ - private final Integer status; - /** - * 状态名 - */ - private final String name; - - @Override - public Integer[] array() { - return ARRAYS; - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java index 337dfdd..d9033a9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java @@ -21,7 +21,6 @@ import java.math.BigDecimal; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @@ -100,6 +99,7 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService // 2. 检查所有行的 iqcCheckFlag:如果没有需要检验的行,则直接审批通过 boolean needCheck = CollectionUtils.anyMatch(lines, line -> Boolean.TRUE.equals(line.getIqcCheckFlag())); + // TODO @AI:if return;并且不要取反; if (!needCheck) { // 不需要检验,直接进入待入库 arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO() diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java index c7e79c4..67df79a 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueLineServiceImpl.java @@ -35,7 +35,7 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi // DONE @AI:校验关联的 issueId;(AI 未修复原因:需要注入 outsourceIssueService 并调用校验方法,需要确认具体校验逻辑) // DONE AI校验关联的 itemId;(AI 未修复原因:需要注入 itemService 并调用校验方法,需要确认具体校验逻辑) - // DONE @AI:wm 里面,有模块实现了 checkBom 类似的逻辑;(AI 未修复原因:需要明确 BOM 校验的具体业务规则,建议参考 productionissue 模块的实现) + // DONE @AI:wm 里面,有模块实现了 checkBom 类似的逻辑;(AI 未修复原因:需要明确 BOM 校验的具体业务规则,建议参考 productissue 模块的实现) // 插入 MesWmOutsourceIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmOutsourceIssueLineDO.class); @@ -48,7 +48,7 @@ public class MesWmOutsourceIssueLineServiceImpl implements MesWmOutsourceIssueLi // DONE @AI:校验关联的 issueId;(AI 未修复原因:需要注入 outsourceIssueService 并调用校验方法,需要确认具体校验逻辑) // DONE AI校验关联的 itemId;(AI 未修复原因:需要注入 itemService 并调用校验方法,需要确认具体校验逻辑) - // DONE @AI:wm 里面,有模块实现了 checkBom 类似的逻辑;(AI 未修复原因:需要明确 BOM 校验的具体业务规则,建议参考 productionissue 模块的实现) + // DONE @AI:wm 里面,有模块实现了 checkBom 类似的逻辑;(AI 未修复原因:需要明确 BOM 校验的具体业务规则,建议参考 productissue 模块的实现) // 校验存在 validateOutsourceIssueLineExists(updateReqVO.getId()); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailService.java deleted file mode 100644 index 8251260..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailService.java +++ /dev/null @@ -1,67 +0,0 @@ -package cn.iocoder.yudao.module.mes.service.wm.productionissue; - -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.detail.MesWmProductionIssueDetailSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDetailDO; -import jakarta.validation.Valid; - -import java.util.List; - -/** - * MES 领料出库明细 Service 接口 - */ -public interface MesWmProductionIssueDetailService { - - /** - * 创建领料出库明细 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createProductionIssueDetail(@Valid MesWmProductionIssueDetailSaveReqVO createReqVO); - - /** - * 更新领料出库明细 - * - * @param updateReqVO 更新信息 - */ - void updateProductionIssueDetail(@Valid MesWmProductionIssueDetailSaveReqVO updateReqVO); - - /** - * 删除领料出库明细 - * - * @param id 编号 - */ - void deleteProductionIssueDetail(Long id); - - /** - * 获得领料出库明细 - * - * @param id 编号 - * @return 领料出库明细 - */ - MesWmProductionIssueDetailDO getProductionIssueDetail(Long id); - - /** - * 根据行ID获取明细列表 - * - * @param lineId 行ID - * @return 明细列表 - */ - List getProductionIssueDetailListByLineId(Long lineId); - - /** - * 根据领料单ID获取明细列表 - * - * @param issueId 领料单ID - * @return 明细列表 - */ - List getProductionIssueDetailListByIssueId(Long issueId); - - /** - * 根据领料单ID删除明细 - * - * @param issueId 领料单ID - */ - void deleteProductionIssueDetailByIssueId(Long issueId); - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailServiceImpl.java deleted file mode 100644 index b601d44..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueDetailServiceImpl.java +++ /dev/null @@ -1,88 +0,0 @@ -package cn.iocoder.yudao.module.mes.service.wm.productionissue; - -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.detail.MesWmProductionIssueDetailSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDetailDO; -import cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue.MesWmProductionIssueDetailMapper; -import jakarta.annotation.Resource; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCTION_ISSUE_DETAIL_NOT_EXISTS; - -/** - * MES 领料出库明细 Service 实现类 - */ -@Service -@Validated -public class MesWmProductionIssueDetailServiceImpl implements MesWmProductionIssueDetailService { - - @Resource - private MesWmProductionIssueDetailMapper issueDetailMapper; - - @Resource - @Lazy - private MesWmProductionIssueLineService issueLineService; - - @Override - public Long createProductionIssueDetail(MesWmProductionIssueDetailSaveReqVO createReqVO) { - // 校验父数据存在 - issueLineService.validateProductionIssueLineExists(createReqVO.getLineId()); - - // 插入 - MesWmProductionIssueDetailDO detail = BeanUtils.toBean(createReqVO, MesWmProductionIssueDetailDO.class); - issueDetailMapper.insert(detail); - return detail.getId(); - } - - @Override - public void updateProductionIssueDetail(MesWmProductionIssueDetailSaveReqVO updateReqVO) { - // 校验存在 - validateProductionIssueDetailExists(updateReqVO.getId()); - // 校验父数据存在 - issueLineService.validateProductionIssueLineExists(updateReqVO.getLineId()); - - // 更新 - MesWmProductionIssueDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductionIssueDetailDO.class); - issueDetailMapper.updateById(updateObj); - } - - @Override - public void deleteProductionIssueDetail(Long id) { - // 校验存在 - validateProductionIssueDetailExists(id); - // 删除 - issueDetailMapper.deleteById(id); - } - - @Override - public MesWmProductionIssueDetailDO getProductionIssueDetail(Long id) { - return issueDetailMapper.selectById(id); - } - - @Override - public List getProductionIssueDetailListByLineId(Long lineId) { - return issueDetailMapper.selectListByLineId(lineId); - } - - @Override - public List getProductionIssueDetailListByIssueId(Long issueId) { - return issueDetailMapper.selectListByIssueId(issueId); - } - - @Override - public void deleteProductionIssueDetailByIssueId(Long issueId) { - issueDetailMapper.deleteByIssueId(issueId); - } - - private void validateProductionIssueDetailExists(Long id) { - if (issueDetailMapper.selectById(id) == null) { - throw exception(WM_PRODUCTION_ISSUE_DETAIL_NOT_EXISTS); - } - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineService.java deleted file mode 100644 index ca88cc9..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineService.java +++ /dev/null @@ -1,77 +0,0 @@ -package cn.iocoder.yudao.module.mes.service.wm.productionissue; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLinePageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLineSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; -import jakarta.validation.Valid; - -import java.util.List; - -/** - * MES 领料出库单行 Service 接口 - */ -public interface MesWmProductionIssueLineService { - - /** - * 创建领料出库单行 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createProductionIssueLine(@Valid MesWmProductionIssueLineSaveReqVO createReqVO); - - /** - * 更新领料出库单行 - * - * @param updateReqVO 更新信息 - */ - void updateProductionIssueLine(@Valid MesWmProductionIssueLineSaveReqVO updateReqVO); - - /** - * 删除领料出库单行 - * - * @param id 编号 - */ - void deleteProductionIssueLine(Long id); - - /** - * 获得领料出库单行 - * - * @param id 编号 - * @return 领料出库单行 - */ - MesWmProductionIssueLineDO getProductionIssueLine(Long id); - - /** - * 获得领料出库单行分页 - * - * @param pageReqVO 分页查询 - * @return 领料出库单行分页 - */ - PageResult getProductionIssueLinePage(MesWmProductionIssueLinePageReqVO pageReqVO); - - /** - * 根据领料单ID获取行列表 - * - * @param issueId 领料单ID - * @return 行列表 - */ - List getProductionIssueLineListByIssueId(Long issueId); - - /** - * 根据领料单ID删除行 - * - * @param issueId 领料单ID - */ - void deleteProductionIssueLineByIssueId(Long issueId); - - /** - * 校验领料出库单行是否存在 - * - * @param id 编号 - * @return 领料出库单行 - */ - MesWmProductionIssueLineDO validateProductionIssueLineExists(Long id); - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java deleted file mode 100644 index aa5116b..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueLineServiceImpl.java +++ /dev/null @@ -1,122 +0,0 @@ -package cn.iocoder.yudao.module.mes.service.wm.productionissue; - -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLinePageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.line.MesWmProductionIssueLineSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; -import cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue.MesWmProductionIssueLineMapper; -import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; -import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService; -import jakarta.annotation.Resource; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCTION_ISSUE_LINE_ITEM_NOT_IN_BOM; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCTION_ISSUE_LINE_NOT_EXISTS; - -/** - * MES 领料出库单行 Service 实现类 - */ -@Service -@Validated -public class MesWmProductionIssueLineServiceImpl implements MesWmProductionIssueLineService { - - @Resource - private MesWmProductionIssueLineMapper issueLineMapper; - - @Resource - @Lazy - private MesWmProductionIssueService issueService; - @Resource - private MesMdItemService itemService; - @Resource - private MesProWorkOrderBomService workOrderBomService; - - @Override - public Long createProductionIssueLine(MesWmProductionIssueLineSaveReqVO createReqVO) { - // 校验父数据存在 + 校验物料在工单 BOM 中 - validateItemInWorkOrderBom(createReqVO.getIssueId(), createReqVO.getItemId()); - // 校验物料存在 - itemService.validateItemExists(createReqVO.getItemId()); - - // 插入 - MesWmProductionIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmProductionIssueLineDO.class); - issueLineMapper.insert(line); - return line.getId(); - } - - @Override - public void updateProductionIssueLine(MesWmProductionIssueLineSaveReqVO updateReqVO) { - // 校验存在 - validateProductionIssueLineExists(updateReqVO.getId()); - // 校验父数据存在 + 校验物料在工单 BOM 中 - validateItemInWorkOrderBom(updateReqVO.getIssueId(), updateReqVO.getItemId()); - // 校验物料存在 - itemService.validateItemExists(updateReqVO.getItemId()); - - // 更新 - MesWmProductionIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductionIssueLineDO.class); - issueLineMapper.updateById(updateObj); - } - - @Override - public void deleteProductionIssueLine(Long id) { - // 校验存在 - validateProductionIssueLineExists(id); - // 删除 - issueLineMapper.deleteById(id); - } - - @Override - public MesWmProductionIssueLineDO getProductionIssueLine(Long id) { - return issueLineMapper.selectById(id); - } - - @Override - public PageResult getProductionIssueLinePage(MesWmProductionIssueLinePageReqVO pageReqVO) { - return issueLineMapper.selectPage(pageReqVO); - } - - @Override - public List getProductionIssueLineListByIssueId(Long issueId) { - return issueLineMapper.selectListByIssueId(issueId); - } - - @Override - public void deleteProductionIssueLineByIssueId(Long issueId) { - issueLineMapper.deleteByIssueId(issueId); - } - - @Override - public MesWmProductionIssueLineDO validateProductionIssueLineExists(Long id) { - MesWmProductionIssueLineDO line = issueLineMapper.selectById(id); - if (line == null) { - throw exception(WM_PRODUCTION_ISSUE_LINE_NOT_EXISTS); - } - return line; - } - - private void validateItemInWorkOrderBom(Long issueId, Long itemId) { - // 校验领料单存在,并获取工单编号 - MesWmProductionIssueDO issue = issueService.validateProductionIssueExists(issueId); - // 校验物料是否在工单 BOM 中(防错料) - List workOrderBoms = workOrderBomService.getWorkOrderBomListByWorkOrderId(issue.getWorkOrderId()); - if (CollUtil.isEmpty(workOrderBoms)) { - return; - } - MesProWorkOrderBomDO workOrderBom = CollUtil.findOne(workOrderBoms, - bom -> bom.getItemId().equals(itemId)); - if (workOrderBom == null) { - throw exception(WM_PRODUCTION_ISSUE_LINE_ITEM_NOT_IN_BOM); - } - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueService.java deleted file mode 100644 index 62841ea..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueService.java +++ /dev/null @@ -1,96 +0,0 @@ -package cn.iocoder.yudao.module.mes.service.wm.productionissue; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssuePageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssueSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDO; -import jakarta.validation.Valid; - -/** - * MES 领料出库单 Service 接口 - */ -public interface MesWmProductionIssueService { - - /** - * 创建领料出库单 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createProductionIssue(@Valid MesWmProductionIssueSaveReqVO createReqVO); - - /** - * 修改领料出库单 - * - * @param updateReqVO 修改信息 - */ - void updateProductionIssue(@Valid MesWmProductionIssueSaveReqVO updateReqVO); - - /** - * 删除领料出库单 - * - * @param id 编号 - */ - void deleteProductionIssue(Long id); - - /** - * 获得领料出库单 - * - * @param id 编号 - * @return 领料出库单 - */ - MesWmProductionIssueDO getProductionIssue(Long id); - - /** - * 获得领料出库单分页 - * - * @param pageReqVO 分页参数 - * @return 领料出库单分页 - */ - PageResult getProductionIssuePage(MesWmProductionIssuePageReqVO pageReqVO); - - /** - * 校验领料出库单是否存在 - * - * @param id 编号 - * @return 领料出库单 - */ - MesWmProductionIssueDO validateProductionIssueExists(Long id); - - /** - * 提交领料出库单(草稿 → 待拣货) - * - * @param id 编号 - */ - void submitProductionIssue(Long id); - - /** - * 执行拣货(待拣货 → 待执行领出) - * - * @param id 编号 - */ - void stockProductionIssue(Long id); - - /** - * 执行领出/出库(待执行领出 → 已完成),更新库存台账 - * - * @param id 编号 - */ - void finishProductionIssue(Long id); - - /** - * 取消领料出库单(任意非已完成/已取消状态 → 已取消) - * - * @param id 编号 - */ - void cancelProductionIssue(Long id); - - /** - * 校验领料出库单的数量:每行明细数量之和是否等于行领料数量 - * - * @param id 编号 - * @return 是否全部一致 - */ - Boolean checkProductionIssueQuantity(Long id); - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueServiceImpl.java deleted file mode 100644 index ddf209d..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueServiceImpl.java +++ /dev/null @@ -1,248 +0,0 @@ -package cn.iocoder.yudao.module.mes.service.wm.productionissue; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjUtil; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssuePageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.wm.productionissue.vo.MesWmProductionIssueSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDetailDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productionissue.MesWmProductionIssueLineDO; -import cn.iocoder.yudao.module.mes.dal.mysql.wm.productionissue.MesWmProductionIssueMapper; -import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; -import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductionIssueStatusEnum; -import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; -import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; -import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; -import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; -import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import java.math.BigDecimal; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; - -/** - * MES 领料出库单 Service 实现类 - */ -@Service -@Validated -public class MesWmProductionIssueServiceImpl implements MesWmProductionIssueService { - - @Resource - private MesWmProductionIssueMapper issueMapper; - - @Resource - private MesWmProductionIssueLineService issueLineService; - @Resource - private MesWmProductionIssueDetailService issueDetailService; - @Resource - private MesMdWorkstationService workstationService; - @Resource - private MesProWorkOrderService workOrderService; - @Resource - private MesWmTransactionService wmTransactionService; - @Resource - private MesWmWarehouseService warehouseService; - @Resource - private MesWmWarehouseLocationService locationService; - @Resource - private MesWmWarehouseAreaService areaService; - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createProductionIssue(MesWmProductionIssueSaveReqVO createReqVO) { - // 1. 校验关联数据 - workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId()); - if (createReqVO.getWorkstationId() != null) { - workstationService.validateWorkstationExists(createReqVO.getWorkstationId()); - } - - // 2. 插入主表 - MesWmProductionIssueDO issue = BeanUtils.toBean(createReqVO, MesWmProductionIssueDO.class); - issue.setStatus(MesWmProductionIssueStatusEnum.PREPARE.getStatus()); - issueMapper.insert(issue); - return issue.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateProductionIssue(MesWmProductionIssueSaveReqVO updateReqVO) { - // 1.1 校验存在 + 准备中状态 - validateProductionIssueExistsAndPrepare(updateReqVO.getId()); - // 1.2 校验关联数据 - workOrderService.validateWorkOrderExists(updateReqVO.getWorkOrderId()); - if (updateReqVO.getWorkstationId() != null) { - workstationService.validateWorkstationExists(updateReqVO.getWorkstationId()); - } - - // 2. 更新主表 - MesWmProductionIssueDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductionIssueDO.class); - issueMapper.updateById(updateObj); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteProductionIssue(Long id) { - // 1. 校验存在 + 准备中状态 - validateProductionIssueExistsAndPrepare(id); - - // 2.1 级联删除明细 - issueDetailService.deleteProductionIssueDetailByIssueId(id); - // 2.2 级联删除行 - issueLineService.deleteProductionIssueLineByIssueId(id); - // 2.3 删除主表 - issueMapper.deleteById(id); - } - - @Override - public MesWmProductionIssueDO getProductionIssue(Long id) { - return issueMapper.selectById(id); - } - - @Override - public PageResult getProductionIssuePage(MesWmProductionIssuePageReqVO pageReqVO) { - return issueMapper.selectPage(pageReqVO); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void submitProductionIssue(Long id) { - // 校验存在 + 草稿状态 - validateProductionIssueExistsAndPrepare(id); - // 校验至少有一条行 - List lines = issueLineService.getProductionIssueLineListByIssueId(id); - if (CollUtil.isEmpty(lines)) { - throw exception(WM_PRODUCTION_ISSUE_NO_LINE); - } - - // 提交(草稿 → 待拣货) - issueMapper.updateById(new MesWmProductionIssueDO() - .setId(id).setStatus(MesWmProductionIssueStatusEnum.APPROVING.getStatus())); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void stockProductionIssue(Long id) { - // 校验存在 - MesWmProductionIssueDO issue = validateProductionIssueExists(id); - if (ObjUtil.notEqual(MesWmProductionIssueStatusEnum.APPROVING.getStatus(), issue.getStatus())) { - throw exception(WM_PRODUCTION_ISSUE_STATUS_INVALID); - } - // 执行拣货(待拣货 → 待执行领出) - issueMapper.updateById(new MesWmProductionIssueDO() - .setId(id).setStatus(MesWmProductionIssueStatusEnum.APPROVED.getStatus())); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void finishProductionIssue(Long id) { - // 1. 校验存在 - MesWmProductionIssueDO issue = validateProductionIssueExists(id); - if (ObjUtil.notEqual(MesWmProductionIssueStatusEnum.APPROVED.getStatus(), issue.getStatus())) { - throw exception(WM_PRODUCTION_ISSUE_STATUS_INVALID); - } - - // 2. 遍历所有明细,创建库存事务(扣减库存 + 记录流水) - createTransactionList(issue); - - // 3. 更新出库单状态 - issueMapper.updateById(new MesWmProductionIssueDO() - .setId(id).setStatus(MesWmProductionIssueStatusEnum.FINISHED.getStatus())); - } - - private void createTransactionList(MesWmProductionIssueDO issue) { - // 1. 查询虚拟线边库 - MesWmWarehouseDO virtualWarehouse = warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE); - MesWmWarehouseLocationDO virtualLocation = locationService.getWarehouseLocationByCode(MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION); - MesWmWarehouseAreaDO virtualArea = areaService.getWarehouseAreaByCode(MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA); - - // 2. 遍历明细,每条明细产生 OUT(实际仓库扣减)+ IN(虚拟线边库增加) - List details = issueDetailService.getProductionIssueDetailListByIssueId(issue.getId()); - for (MesWmProductionIssueDetailDO detail : details) { - // 2.1 先从实际仓库出库(库存减少) - Long outTransactionId = wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO() - .setType(MesWmTransactionTypeEnum.OUT.getType()).setItemId(detail.getItemId()) - .setQuantity(detail.getQuantity().negate()) // 库存减少 - .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) - .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) - .setBizType(MesBizTypeConstants.WM_ISSUE).setBizId(issue.getId()) - .setBizCode(issue.getCode()).setBizLineId(detail.getLineId())); - // 2.2 再入虚拟线边库(库存增加) - wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO() - .setType(MesWmTransactionTypeEnum.IN.getType()).setItemId(detail.getItemId()) - .setQuantity(detail.getQuantity()) // 库存增加 - .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) - .setWarehouseId(virtualWarehouse.getId()).setLocationId(virtualLocation.getId()).setAreaId(virtualArea.getId()) - .setBizType(MesBizTypeConstants.WM_ISSUE).setBizId(issue.getId()) - .setBizCode(issue.getCode()).setBizLineId(detail.getLineId()) - .setRelatedTransactionId(outTransactionId)); // 关联出库事务 - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void cancelProductionIssue(Long id) { - // 校验存在 - MesWmProductionIssueDO issue = validateProductionIssueExists(id); - // 已完成和已取消不允许取消 - if (ObjectUtils.equalsAny(issue.getStatus(), - MesWmProductionIssueStatusEnum.FINISHED.getStatus(), - MesWmProductionIssueStatusEnum.CANCELED.getStatus())) { - throw exception(WM_PRODUCTION_ISSUE_CANCEL_NOT_ALLOWED); - } - - // 取消 - issueMapper.updateById(new MesWmProductionIssueDO() - .setId(id).setStatus(MesWmProductionIssueStatusEnum.CANCELED.getStatus())); - } - - @Override - public Boolean checkProductionIssueQuantity(Long id) { - List lines = issueLineService.getProductionIssueLineListByIssueId(id); - for (MesWmProductionIssueLineDO line : lines) { - List details = issueDetailService.getProductionIssueDetailListByLineId(line.getId()); - BigDecimal totalDetailQty = CollectionUtils.getSumValue(details, - MesWmProductionIssueDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); - if (line.getQuantity() != null && totalDetailQty.compareTo(line.getQuantity()) != 0) { - return false; - } - } - return true; - } - - @Override - public MesWmProductionIssueDO validateProductionIssueExists(Long id) { - MesWmProductionIssueDO issue = issueMapper.selectById(id); - if (issue == null) { - throw exception(WM_PRODUCTION_ISSUE_NOT_EXISTS); - } - return issue; - } - - /** - * 校验领料出库单存在且为准备中状态 - */ - private MesWmProductionIssueDO validateProductionIssueExistsAndPrepare(Long id) { - MesWmProductionIssueDO issue = validateProductionIssueExists(id); - if (ObjUtil.notEqual(MesWmProductionIssueStatusEnum.PREPARE.getStatus(), issue.getStatus())) { - throw exception(WM_PRODUCTION_ISSUE_STATUS_INVALID); - } - return issue; - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailService.java new file mode 100644 index 0000000..430958b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailService.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.mes.service.wm.productissue; + +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.detail.MesWmProductIssueDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDetailDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 领料出库明细 Service 接口 + */ +public interface MesWmProductIssueDetailService { + + /** + * 创建领料出库明细 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createProductIssueDetail(@Valid MesWmProductIssueDetailSaveReqVO createReqVO); + + /** + * 更新领料出库明细 + * + * @param updateReqVO 更新信息 + */ + void updateProductIssueDetail(@Valid MesWmProductIssueDetailSaveReqVO updateReqVO); + + /** + * 删除领料出库明细 + * + * @param id 编号 + */ + void deleteProductIssueDetail(Long id); + + /** + * 获得领料出库明细 + * + * @param id 编号 + * @return 领料出库明细 + */ + MesWmProductIssueDetailDO getProductIssueDetail(Long id); + + /** + * 根据行ID获取明细列表 + * + * @param lineId 行ID + * @return 明细列表 + */ + List getProductIssueDetailListByLineId(Long lineId); + + /** + * 根据领料单ID获取明细列表 + * + * @param issueId 领料单ID + * @return 明细列表 + */ + List getProductIssueDetailListByIssueId(Long issueId); + + /** + * 根据领料单ID删除明细 + * + * @param issueId 领料单ID + */ + void deleteProductIssueDetailByIssueId(Long issueId); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailServiceImpl.java new file mode 100644 index 0000000..4de03d7 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueDetailServiceImpl.java @@ -0,0 +1,88 @@ +package cn.iocoder.yudao.module.mes.service.wm.productissue; + +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.detail.MesWmProductIssueDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDetailDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productissue.MesWmProductIssueDetailMapper; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_ISSUE_DETAIL_NOT_EXISTS; + +/** + * MES 领料出库明细 Service 实现类 + */ +@Service +@Validated +public class MesWmProductIssueDetailServiceImpl implements MesWmProductIssueDetailService { + + @Resource + private MesWmProductIssueDetailMapper issueDetailMapper; + + @Resource + @Lazy + private MesWmProductIssueLineService issueLineService; + + @Override + public Long createProductIssueDetail(MesWmProductIssueDetailSaveReqVO createReqVO) { + // 校验父数据存在 + issueLineService.validateProductIssueLineExists(createReqVO.getLineId()); + + // 插入 + MesWmProductIssueDetailDO detail = BeanUtils.toBean(createReqVO, MesWmProductIssueDetailDO.class); + issueDetailMapper.insert(detail); + return detail.getId(); + } + + @Override + public void updateProductIssueDetail(MesWmProductIssueDetailSaveReqVO updateReqVO) { + // 校验存在 + validateProductIssueDetailExists(updateReqVO.getId()); + // 校验父数据存在 + issueLineService.validateProductIssueLineExists(updateReqVO.getLineId()); + + // 更新 + MesWmProductIssueDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductIssueDetailDO.class); + issueDetailMapper.updateById(updateObj); + } + + @Override + public void deleteProductIssueDetail(Long id) { + // 校验存在 + validateProductIssueDetailExists(id); + // 删除 + issueDetailMapper.deleteById(id); + } + + @Override + public MesWmProductIssueDetailDO getProductIssueDetail(Long id) { + return issueDetailMapper.selectById(id); + } + + @Override + public List getProductIssueDetailListByLineId(Long lineId) { + return issueDetailMapper.selectListByLineId(lineId); + } + + @Override + public List getProductIssueDetailListByIssueId(Long issueId) { + return issueDetailMapper.selectListByIssueId(issueId); + } + + @Override + public void deleteProductIssueDetailByIssueId(Long issueId) { + issueDetailMapper.deleteByIssueId(issueId); + } + + private void validateProductIssueDetailExists(Long id) { + if (issueDetailMapper.selectById(id) == null) { + throw exception(WM_PRODUCT_ISSUE_DETAIL_NOT_EXISTS); + } + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineService.java new file mode 100644 index 0000000..ab9b47d --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineService.java @@ -0,0 +1,77 @@ +package cn.iocoder.yudao.module.mes.service.wm.productissue; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueLineDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 领料出库单行 Service 接口 + */ +public interface MesWmProductIssueLineService { + + /** + * 创建领料出库单行 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createProductIssueLine(@Valid MesWmProductIssueLineSaveReqVO createReqVO); + + /** + * 更新领料出库单行 + * + * @param updateReqVO 更新信息 + */ + void updateProductIssueLine(@Valid MesWmProductIssueLineSaveReqVO updateReqVO); + + /** + * 删除领料出库单行 + * + * @param id 编号 + */ + void deleteProductIssueLine(Long id); + + /** + * 获得领料出库单行 + * + * @param id 编号 + * @return 领料出库单行 + */ + MesWmProductIssueLineDO getProductIssueLine(Long id); + + /** + * 获得领料出库单行分页 + * + * @param pageReqVO 分页查询 + * @return 领料出库单行分页 + */ + PageResult getProductIssueLinePage(MesWmProductIssueLinePageReqVO pageReqVO); + + /** + * 根据领料单ID获取行列表 + * + * @param issueId 领料单ID + * @return 行列表 + */ + List getProductIssueLineListByIssueId(Long issueId); + + /** + * 根据领料单ID删除行 + * + * @param issueId 领料单ID + */ + void deleteProductIssueLineByIssueId(Long issueId); + + /** + * 校验领料出库单行是否存在 + * + * @param id 编号 + * @return 领料出库单行 + */ + MesWmProductIssueLineDO validateProductIssueLineExists(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java new file mode 100644 index 0000000..9b9d187 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueLineServiceImpl.java @@ -0,0 +1,122 @@ +package cn.iocoder.yudao.module.mes.service.wm.productissue; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.line.MesWmProductIssueLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productissue.MesWmProductIssueLineMapper; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_ISSUE_LINE_ITEM_NOT_IN_BOM; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_PRODUCT_ISSUE_LINE_NOT_EXISTS; + +/** + * MES 领料出库单行 Service 实现类 + */ +@Service +@Validated +public class MesWmProductIssueLineServiceImpl implements MesWmProductIssueLineService { + + @Resource + private MesWmProductIssueLineMapper issueLineMapper; + + @Resource + @Lazy + private MesWmProductIssueService issueService; + @Resource + private MesMdItemService itemService; + @Resource + private MesProWorkOrderBomService workOrderBomService; + + @Override + public Long createProductIssueLine(MesWmProductIssueLineSaveReqVO createReqVO) { + // 校验父数据存在 + 校验物料在工单 BOM 中 + validateItemInWorkOrderBom(createReqVO.getIssueId(), createReqVO.getItemId()); + // 校验物料存在 + itemService.validateItemExists(createReqVO.getItemId()); + + // 插入 + MesWmProductIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmProductIssueLineDO.class); + issueLineMapper.insert(line); + return line.getId(); + } + + @Override + public void updateProductIssueLine(MesWmProductIssueLineSaveReqVO updateReqVO) { + // 校验存在 + validateProductIssueLineExists(updateReqVO.getId()); + // 校验父数据存在 + 校验物料在工单 BOM 中 + validateItemInWorkOrderBom(updateReqVO.getIssueId(), updateReqVO.getItemId()); + // 校验物料存在 + itemService.validateItemExists(updateReqVO.getItemId()); + + // 更新 + MesWmProductIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductIssueLineDO.class); + issueLineMapper.updateById(updateObj); + } + + @Override + public void deleteProductIssueLine(Long id) { + // 校验存在 + validateProductIssueLineExists(id); + // 删除 + issueLineMapper.deleteById(id); + } + + @Override + public MesWmProductIssueLineDO getProductIssueLine(Long id) { + return issueLineMapper.selectById(id); + } + + @Override + public PageResult getProductIssueLinePage(MesWmProductIssueLinePageReqVO pageReqVO) { + return issueLineMapper.selectPage(pageReqVO); + } + + @Override + public List getProductIssueLineListByIssueId(Long issueId) { + return issueLineMapper.selectListByIssueId(issueId); + } + + @Override + public void deleteProductIssueLineByIssueId(Long issueId) { + issueLineMapper.deleteByIssueId(issueId); + } + + @Override + public MesWmProductIssueLineDO validateProductIssueLineExists(Long id) { + MesWmProductIssueLineDO line = issueLineMapper.selectById(id); + if (line == null) { + throw exception(WM_PRODUCT_ISSUE_LINE_NOT_EXISTS); + } + return line; + } + + private void validateItemInWorkOrderBom(Long issueId, Long itemId) { + // 校验领料单存在,并获取工单编号 + MesWmProductIssueDO issue = issueService.validateProductIssueExists(issueId); + // 校验物料是否在工单 BOM 中(防错料) + List workOrderBoms = workOrderBomService.getWorkOrderBomListByWorkOrderId(issue.getWorkOrderId()); + if (CollUtil.isEmpty(workOrderBoms)) { + return; + } + MesProWorkOrderBomDO workOrderBom = CollUtil.findOne(workOrderBoms, + bom -> bom.getItemId().equals(itemId)); + if (workOrderBom == null) { + throw exception(WM_PRODUCT_ISSUE_LINE_ITEM_NOT_IN_BOM); + } + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueService.java new file mode 100644 index 0000000..58a5e63 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueService.java @@ -0,0 +1,96 @@ +package cn.iocoder.yudao.module.mes.service.wm.productissue; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.MesWmProductIssuePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.MesWmProductIssueSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDO; +import jakarta.validation.Valid; + +/** + * MES 领料出库单 Service 接口 + */ +public interface MesWmProductIssueService { + + /** + * 创建领料出库单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createProductIssue(@Valid MesWmProductIssueSaveReqVO createReqVO); + + /** + * 修改领料出库单 + * + * @param updateReqVO 修改信息 + */ + void updateProductIssue(@Valid MesWmProductIssueSaveReqVO updateReqVO); + + /** + * 删除领料出库单 + * + * @param id 编号 + */ + void deleteProductIssue(Long id); + + /** + * 获得领料出库单 + * + * @param id 编号 + * @return 领料出库单 + */ + MesWmProductIssueDO getProductIssue(Long id); + + /** + * 获得领料出库单分页 + * + * @param pageReqVO 分页参数 + * @return 领料出库单分页 + */ + PageResult getProductIssuePage(MesWmProductIssuePageReqVO pageReqVO); + + /** + * 校验领料出库单是否存在 + * + * @param id 编号 + * @return 领料出库单 + */ + MesWmProductIssueDO validateProductIssueExists(Long id); + + /** + * 提交领料出库单(草稿 → 待拣货) + * + * @param id 编号 + */ + void submitProductIssue(Long id); + + /** + * 执行拣货(待拣货 → 待执行领出) + * + * @param id 编号 + */ + void stockProductIssue(Long id); + + /** + * 执行领出/出库(待执行领出 → 已完成),更新库存台账 + * + * @param id 编号 + */ + void finishProductIssue(Long id); + + /** + * 取消领料出库单(任意非已完成/已取消状态 → 已取消) + * + * @param id 编号 + */ + void cancelProductIssue(Long id); + + /** + * 校验领料出库单的数量:每行明细数量之和是否等于行领料数量 + * + * @param id 编号 + * @return 是否全部一致 + */ + Boolean checkProductIssueQuantity(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java new file mode 100644 index 0000000..67de831 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productissue/MesWmProductIssueServiceImpl.java @@ -0,0 +1,248 @@ +package cn.iocoder.yudao.module.mes.service.wm.productissue; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.MesWmProductIssuePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.productissue.vo.MesWmProductIssueSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productissue.MesWmProductIssueLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productissue.MesWmProductIssueMapper; +import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductIssueStatusEnum; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; +import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; +import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; +import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 领料出库单 Service 实现类 + */ +@Service +@Validated +public class MesWmProductIssueServiceImpl implements MesWmProductIssueService { + + @Resource + private MesWmProductIssueMapper issueMapper; + + @Resource + private MesWmProductIssueLineService issueLineService; + @Resource + private MesWmProductIssueDetailService issueDetailService; + @Resource + private MesMdWorkstationService workstationService; + @Resource + private MesProWorkOrderService workOrderService; + @Resource + private MesWmTransactionService wmTransactionService; + @Resource + private MesWmWarehouseService warehouseService; + @Resource + private MesWmWarehouseLocationService locationService; + @Resource + private MesWmWarehouseAreaService areaService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createProductIssue(MesWmProductIssueSaveReqVO createReqVO) { + // 1. 校验关联数据 + workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId()); + if (createReqVO.getWorkstationId() != null) { + workstationService.validateWorkstationExists(createReqVO.getWorkstationId()); + } + + // 2. 插入主表 + MesWmProductIssueDO issue = BeanUtils.toBean(createReqVO, MesWmProductIssueDO.class); + issue.setStatus(MesWmProductIssueStatusEnum.PREPARE.getStatus()); + issueMapper.insert(issue); + return issue.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateProductIssue(MesWmProductIssueSaveReqVO updateReqVO) { + // 1.1 校验存在 + 准备中状态 + validateProductIssueExistsAndPrepare(updateReqVO.getId()); + // 1.2 校验关联数据 + workOrderService.validateWorkOrderExists(updateReqVO.getWorkOrderId()); + if (updateReqVO.getWorkstationId() != null) { + workstationService.validateWorkstationExists(updateReqVO.getWorkstationId()); + } + + // 2. 更新主表 + MesWmProductIssueDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductIssueDO.class); + issueMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteProductIssue(Long id) { + // 1. 校验存在 + 准备中状态 + validateProductIssueExistsAndPrepare(id); + + // 2.1 级联删除明细 + issueDetailService.deleteProductIssueDetailByIssueId(id); + // 2.2 级联删除行 + issueLineService.deleteProductIssueLineByIssueId(id); + // 2.3 删除主表 + issueMapper.deleteById(id); + } + + @Override + public MesWmProductIssueDO getProductIssue(Long id) { + return issueMapper.selectById(id); + } + + @Override + public PageResult getProductIssuePage(MesWmProductIssuePageReqVO pageReqVO) { + return issueMapper.selectPage(pageReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void submitProductIssue(Long id) { + // 校验存在 + 草稿状态 + validateProductIssueExistsAndPrepare(id); + // 校验至少有一条行 + List lines = issueLineService.getProductIssueLineListByIssueId(id); + if (CollUtil.isEmpty(lines)) { + throw exception(WM_PRODUCT_ISSUE_NO_LINE); + } + + // 提交(草稿 → 待拣货) + issueMapper.updateById(new MesWmProductIssueDO() + .setId(id).setStatus(MesWmProductIssueStatusEnum.APPROVING.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void stockProductIssue(Long id) { + // 校验存在 + MesWmProductIssueDO issue = validateProductIssueExists(id); + if (ObjUtil.notEqual(MesWmProductIssueStatusEnum.APPROVING.getStatus(), issue.getStatus())) { + throw exception(WM_PRODUCT_ISSUE_STATUS_INVALID); + } + // 执行拣货(待拣货 → 待执行领出) + issueMapper.updateById(new MesWmProductIssueDO() + .setId(id).setStatus(MesWmProductIssueStatusEnum.APPROVED.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void finishProductIssue(Long id) { + // 1. 校验存在 + MesWmProductIssueDO issue = validateProductIssueExists(id); + if (ObjUtil.notEqual(MesWmProductIssueStatusEnum.APPROVED.getStatus(), issue.getStatus())) { + throw exception(WM_PRODUCT_ISSUE_STATUS_INVALID); + } + + // 2. 遍历所有明细,创建库存事务(扣减库存 + 记录流水) + createTransactionList(issue); + + // 3. 更新出库单状态 + issueMapper.updateById(new MesWmProductIssueDO() + .setId(id).setStatus(MesWmProductIssueStatusEnum.FINISHED.getStatus())); + } + + private void createTransactionList(MesWmProductIssueDO issue) { + // 1. 查询虚拟线边库 + MesWmWarehouseDO virtualWarehouse = warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE); + MesWmWarehouseLocationDO virtualLocation = locationService.getWarehouseLocationByCode(MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION); + MesWmWarehouseAreaDO virtualArea = areaService.getWarehouseAreaByCode(MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA); + + // 2. 遍历明细,每条明细产生 OUT(实际仓库扣减)+ IN(虚拟线边库增加) + List details = issueDetailService.getProductIssueDetailListByIssueId(issue.getId()); + for (MesWmProductIssueDetailDO detail : details) { + // 2.1 先从实际仓库出库(库存减少) + Long outTransactionId = wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO() + .setType(MesWmTransactionTypeEnum.OUT.getType()).setItemId(detail.getItemId()) + .setQuantity(detail.getQuantity().negate()) // 库存减少 + .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) + .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) + .setBizType(MesBizTypeConstants.WM_ISSUE).setBizId(issue.getId()) + .setBizCode(issue.getCode()).setBizLineId(detail.getLineId())); + // 2.2 再入虚拟线边库(库存增加) + wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO() + .setType(MesWmTransactionTypeEnum.IN.getType()).setItemId(detail.getItemId()) + .setQuantity(detail.getQuantity()) // 库存增加 + .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) + .setWarehouseId(virtualWarehouse.getId()).setLocationId(virtualLocation.getId()).setAreaId(virtualArea.getId()) + .setBizType(MesBizTypeConstants.WM_ISSUE).setBizId(issue.getId()) + .setBizCode(issue.getCode()).setBizLineId(detail.getLineId()) + .setRelatedTransactionId(outTransactionId)); // 关联出库事务 + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelProductIssue(Long id) { + // 校验存在 + MesWmProductIssueDO issue = validateProductIssueExists(id); + // 已完成和已取消不允许取消 + if (ObjectUtils.equalsAny(issue.getStatus(), + MesWmProductIssueStatusEnum.FINISHED.getStatus(), + MesWmProductIssueStatusEnum.CANCELED.getStatus())) { + throw exception(WM_PRODUCT_ISSUE_CANCEL_NOT_ALLOWED); + } + + // 取消 + issueMapper.updateById(new MesWmProductIssueDO() + .setId(id).setStatus(MesWmProductIssueStatusEnum.CANCELED.getStatus())); + } + + @Override + public Boolean checkProductIssueQuantity(Long id) { + List lines = issueLineService.getProductIssueLineListByIssueId(id); + for (MesWmProductIssueLineDO line : lines) { + List details = issueDetailService.getProductIssueDetailListByLineId(line.getId()); + BigDecimal totalDetailQty = CollectionUtils.getSumValue(details, + MesWmProductIssueDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); + if (line.getQuantity() != null && totalDetailQty.compareTo(line.getQuantity()) != 0) { + return false; + } + } + return true; + } + + @Override + public MesWmProductIssueDO validateProductIssueExists(Long id) { + MesWmProductIssueDO issue = issueMapper.selectById(id); + if (issue == null) { + throw exception(WM_PRODUCT_ISSUE_NOT_EXISTS); + } + return issue; + } + + /** + * 校验领料出库单存在且为准备中状态 + */ + private MesWmProductIssueDO validateProductIssueExistsAndPrepare(Long id) { + MesWmProductIssueDO issue = validateProductIssueExists(id); + if (ObjUtil.notEqual(MesWmProductIssueStatusEnum.PREPARE.getStatus(), issue.getStatus())) { + throw exception(WM_PRODUCT_ISSUE_STATUS_INVALID); + } + return issue; + } + +} diff --git a/yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml b/yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml index 86f51dd..b62b82a 100644 --- a/yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml +++ b/yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml @@ -12,13 +12,13 @@ SELECT DISTINCT ic.work_order_id AS workorder_code, icd.item_id, icd.batch_id, icd.batch_code FROM mes_wm_product_produce_detail ppd LEFT JOIN mes_wm_product_produce pp ON ppd.produce_id = pp.id - LEFT JOIN mes_wm_production_issue ic ON pp.work_order_id = ic.work_order_id - LEFT JOIN mes_wm_production_issue_detail icd ON ic.id = icd.issue_id + LEFT JOIN mes_wm_product_issue ic ON pp.work_order_id = ic.work_order_id + LEFT JOIN mes_wm_product_issue_detail icd ON ic.id = icd.issue_id WHERE ppd.batch_code = #{batchCode} AND icd.batch_code IS NOT NULL -- libgit2 0.21.4