| | |
| | | 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.MesWmProductIssueLineReturnableRespVO; |
| | | 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.mdm.MesMdmItemDO; |
| | | 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.dataobject.wm.returnissue.MesWmReturnIssueLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.productissue.MesWmProductIssueLineMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductIssueStatusEnum; |
| | | 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.mdm.MesMdmItemService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.productissue.MesWmProductIssueDetailService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.productissue.MesWmProductIssueLineService; |
| | |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import cn.iocoder.yudao.framework.common.exception.ServiceException; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; |
| | |
| | | @Lazy |
| | | private MesWmProductIssueService issueService; |
| | | @Resource |
| | | private MesMdItemService mdmItemService; |
| | | private MesMdmItemService mdmItemService; |
| | | @Resource |
| | | @Lazy |
| | | private MesWmReturnIssueLineService returnIssueLineService; |
| | |
| | | private void validateProductIssueLineSaveData(MesWmProductIssueLineSaveReqVO reqVO) { |
| | | // 校验父数据存在 + 草稿状态才允许新增/修改行 |
| | | issueService.validateProductIssueExistsAndPrepare(reqVO.getIssueId()); |
| | | // 校验物料存在且启用(itemId 口径为 MDM 物料主数据 mdm_item.id) |
| | | validateIssueItemExistsAndEnable(reqVO.getItemId()); |
| | | // 校验物料在工单 BOM 中 |
| | | validateItemInWorkOrderBom(reqVO.getIssueId(), reqVO.getItemId()); |
| | | // 校验物料存在 |
| | | mdmItemService.validateItemExists(reqVO.getItemId()); |
| | | } |
| | | |
| | | /** |
| | | * 校验领料物料在 MDM 物料主数据中存在且已启用 |
| | | * |
| | | * 分别给出「查不到该物料」「物料已停用」两种具体原因,并带上物料的业务标识与下一步动作, |
| | | * 避免统一抛出笼统的“物料不存在”让用户无从判断。 |
| | | */ |
| | | private void validateIssueItemExistsAndEnable(Long itemId) { |
| | | MesMdmItemDO item = mdmItemService.getItem(itemId); |
| | | if (item == null) { |
| | | throw new ServiceException(MD_ITEM_NOT_EXISTS.getCode(), |
| | | "领料出库单行物料不存在:提交的物料编号[ID=" + itemId + "]在 MDM 物料主数据中查不到。" |
| | | + "请重新选择物料;若该物料已被删除,请改选其它物料。"); |
| | | } |
| | | if (item.getStatus() != null && item.getStatus() == 1) { |
| | | throw new ServiceException(MD_ITEM_IS_DISABLE.getCode(), |
| | | "领料出库单行物料已停用:物料[" + item.getCode() + " " + item.getName() + "]当前为停用状态,不能领料出库。" |
| | | + "请先在「基础数据 - MDM 物料」中启用该物料,或改选其它已启用的物料。"); |
| | | } |
| | | } |
| | | |
| | | private void validateItemInWorkOrderBom(Long issueId, Long itemId) { |
| | |
| | | } |
| | | |
| | | // 4. 批量查询物料和单位信息 |
| | | Map<Long, MesMdItemDO> itemMap = mdmItemService.getItemMap( |
| | | Map<Long, MesMdmItemDO> itemMap = mdmItemService.getItemMap( |
| | | CollectionUtils.convertSet(lines, MesWmProductIssueLineDO::getItemId)); |
| | | Map<Long, MesMdUnitMeasureDO> unitMap = unitMeasureService.getUnitMeasureMap( |
| | | CollectionUtils.convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); |
| | | CollectionUtils.convertSet(itemMap.values(), MesMdmItemDO::getUnitMeasureId)); |
| | | |
| | | // 5. 组装结果,过滤可退数量 > 0 的行 |
| | | List<MesWmProductIssueLineReturnableRespVO> result = new ArrayList<>(); |
| | |
| | | vo.setQuantity(returnableQty); |
| | | |
| | | // 填充物料信息 |
| | | MesMdItemDO item = itemMap.get(line.getItemId()); |
| | | MesMdmItemDO item = itemMap.get(line.getItemId()); |
| | | if (item != null) { |
| | | vo.setItemCode(item.getCode()); |
| | | vo.setItemName(item.getName()); |