| | |
| | | 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.detail.MesWmProductIssueDetailSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO; |
| | | 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.MesWmProductIssueDetailMapper; |
| | | 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.mdm.MesMdmItemService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.List; |
| | | |
| | | 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.*; |
| | |
| | | @Resource |
| | | private MesWmMaterialStockService materialStockService; |
| | | @Resource |
| | | private MesMdItemService mesMdItemService; |
| | | private MesMdmItemService mdmItemService; |
| | | |
| | | @Override |
| | | public Long createProductIssueDetail(MesWmProductIssueDetailSaveReqVO createReqVO) { |
| | |
| | | private void validateProductIssueDetailSaveData(MesWmProductIssueDetailSaveReqVO reqVO) { |
| | | // 校验父数据存在 |
| | | MesWmProductIssueLineDO line = issueLineService.validateProductIssueLineExists(reqVO.getLineId()); |
| | | MesMdItemDO item = mesMdItemService.getItem(line.getItemId()); |
| | | if (ObjUtil.notEqual(line.getIssueId(), reqVO.getIssueId())) { |
| | | throw exception(WM_PRODUCT_ISSUE_DETAIL_LINE_NOT_MATCH); |
| | | } |
| | |
| | | if (ObjUtil.notEqual(MesWmProductIssueStatusEnum.APPROVING.getStatus(), issue.getStatus())) { |
| | | throw exception(WM_PRODUCT_ISSUE_STATUS_INVALID); |
| | | } |
| | | // 校验物料匹配(明细 itemId 必须与行 itemId 一致) |
| | | validateDetailItemMatch(reqVO.getItemId(), item.getMdmItemId()); |
| | | // 校验物料匹配(明细 itemId 必须与行 itemId 一致,两者都是 MDM 物料主数据 mdm_item.id) |
| | | validateDetailItemMatch(reqVO.getItemId(), line.getItemId()); |
| | | // 校验仓库、库区、库位的关联关系 |
| | | warehouseAreaService.validateWarehouseAreaExists( |
| | | reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId()); |
| | |
| | | */ |
| | | private void validateDetailItemMatch(Long detailItemId, Long lineItemId) { |
| | | if (ObjUtil.notEqual(detailItemId, lineItemId)) { |
| | | throw exception(WM_PRODUCT_ISSUE_DETAIL_ITEM_MISMATCH); |
| | | // 名称解析放在异常分支,避免正常保存时多查表 |
| | | throw new ServiceException(WM_PRODUCT_ISSUE_DETAIL_ITEM_MISMATCH.getCode(), |
| | | "拣货明细的物料与领料出库单行的物料不一致:明细物料[" + describeItem(detailItemId) |
| | | + "],单据行物料[" + describeItem(lineItemId) + "]。" |
| | | + "请重新选择该行的物料后重试,或删除本条明细后重新添加。"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 描述物料,用于异常提示:优先给出「编码 名称」,查不到时回退为物料编号 |
| | | */ |
| | | private String describeItem(Long itemId) { |
| | | if (itemId == null) { |
| | | return "未选择"; |
| | | } |
| | | MesMdmItemDO item = mdmItemService.getItem(itemId); |
| | | return item != null ? item.getCode() + " " + item.getName() : "物料编号 ID=" + itemId; |
| | | } |
| | | |
| | | } |