诚发五金:入库/调整/移库/调拨/退料/盘点不再要求手选库区库位,后端自动落到仓库默认库区库位
- 新增 MesWmWarehouseDefaultService:按仓库自动创建/复用「默认库区」「默认库位」
- 入库事务、库存调整、移库未指定库区库位时自动补齐默认值
- 杂项入库行、调拨移入明细、销售退货明细、生产退料明细去掉库区/库位必填,保存时按仓库兜底
- 盘点结果新增不再强制要求库区/库位:选中盘点清单时从清单补齐,未选时按仓库取默认
- 修正同一物料同一库位存在多条盘点清单行时 selectOne 抛异常的兜底逻辑
Co-Authored-By: Claude Code <noreply@anthropic.com>
| | |
| | | @NotNull(message = "ä»åºIDä¸è½ä¸ºç©º") |
| | | private Long warehouseId; |
| | | |
| | | @Schema(description = "åºåºID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "åºåºIDä¸è½ä¸ºç©º") |
| | | @Schema(description = "åºåºIDï¼å¯éï¼æªä¼ æ¶è½å°ä»åºçé»è®¤åºåºï¼", example = "1") |
| | | private Long locationId; |
| | | |
| | | @Schema(description = "åºä½ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "åºä½IDä¸è½ä¸ºç©º") |
| | | @Schema(description = "åºä½IDï¼å¯éï¼æªä¼ æ¶è½å°ä»åºçé»è®¤åºä½ï¼", example = "1") |
| | | private Long areaId; |
| | | |
| | | // ========== æ¹æ¬¡ç¸å
³å段 ========== |
| | |
| | | @NotNull(message = "ç®æ ä»åºä¸è½ä¸ºç©º") |
| | | private Long toWarehouseId; |
| | | |
| | | @Schema(description = "ç®æ åºåºID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "ç®æ åºåºä¸è½ä¸ºç©º") |
| | | @Schema(description = "ç®æ åºåºIDï¼å¯éï¼æªä¼ æ¶è½å°ç®æ ä»åºçé»è®¤åºåºï¼", example = "1") |
| | | private Long toLocationId; |
| | | |
| | | @Schema(description = "ç®æ åºä½ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "ç®æ åºä½ä¸è½ä¸ºç©º") |
| | | @Schema(description = "ç®æ åºä½IDï¼å¯éï¼æªä¼ æ¶è½å°ç®æ ä»åºçé»è®¤åºä½ï¼", example = "1") |
| | | private Long toAreaId; |
| | | |
| | | @Schema(description = "ç§»åºæ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") |
| | |
| | | @NotNull(message = "ä»åºä¸è½ä¸ºç©º") |
| | | private Long warehouseId; |
| | | |
| | | @Schema(description = "åºåºç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "åºåºä¸è½ä¸ºç©º") |
| | | @Schema(description = "åºåºç¼å·ï¼ä¸ä¼ æ¶ä½¿ç¨ä»åºçé»è®¤åºåºï¼", example = "1") |
| | | private Long locationId; |
| | | |
| | | @Schema(description = "åºä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "åºä½ä¸è½ä¸ºç©º") |
| | | @Schema(description = "åºä½ç¼å·ï¼ä¸ä¼ æ¶ä½¿ç¨ä»åºçé»è®¤åºä½ï¼", example = "1") |
| | | private Long areaId; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | |
| | | @NotNull(message = "ä»åºç¼å·ä¸è½ä¸ºç©º") |
| | | private Long warehouseId; |
| | | |
| | | @Schema(description = "åºåºç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "åºåºç¼å·ä¸è½ä¸ºç©º") |
| | | @Schema(description = "åºåºç¼å·ï¼ä¸ä¼ æ¶ä½¿ç¨ä»åºçé»è®¤åºåºï¼", example = "1") |
| | | private Long locationId; |
| | | |
| | | @Schema(description = "åºä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "åºä½ç¼å·ä¸è½ä¸ºç©º") |
| | | @Schema(description = "åºä½ç¼å·ï¼ä¸ä¼ æ¶ä½¿ç¨ä»åºçé»è®¤åºä½ï¼", example = "1") |
| | | private Long areaId; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | |
| | | @NotNull(message = "ä»åºIDä¸è½ä¸ºç©º") |
| | | private Long warehouseId; |
| | | |
| | | @Schema(description = "åºåºID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "åºåºIDä¸è½ä¸ºç©º") |
| | | @Schema(description = "åºåºIDï¼ä¸ä¼ æ¶ä½¿ç¨ä»åºçé»è®¤åºåºï¼", example = "1") |
| | | private Long locationId; |
| | | |
| | | @Schema(description = "åºä½ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "åºä½IDä¸è½ä¸ºç©º") |
| | | @Schema(description = "åºä½IDï¼ä¸ä¼ æ¶ä½¿ç¨ä»åºçé»è®¤åºä½ï¼", example = "1") |
| | | private Long areaId; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | |
| | | @NotNull(message = "ä»åº ID ä¸è½ä¸ºç©º") |
| | | private Long warehouseId; |
| | | |
| | | @Schema(description = "åºåº ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "åºåº ID ä¸è½ä¸ºç©º") |
| | | @Schema(description = "åºåº IDï¼ä¸ä¼ æ¶ä½¿ç¨ä»åºçé»è®¤åºåºï¼", example = "1") |
| | | private Long locationId; |
| | | |
| | | @Schema(description = "åºä½ ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "åºä½ ID ä¸è½ä¸ºç©º") |
| | | @Schema(description = "åºä½ IDï¼ä¸ä¼ æ¶ä½¿ç¨ä»åºçé»è®¤åºä½ï¼", example = "1") |
| | | private Long areaId; |
| | | |
| | | @Schema(description = "çç¹æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.000000") |
| | |
| | | @NotNull(message = "ç§»å
¥ä»åºç¼å·ä¸è½ä¸ºç©º") |
| | | private Long toWarehouseId; |
| | | |
| | | @Schema(description = "ç§»å
¥åºåºç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "ç§»å
¥åºåºç¼å·ä¸è½ä¸ºç©º") |
| | | @Schema(description = "ç§»å
¥åºåºç¼å·ï¼ä¸ä¼ æ¶ä½¿ç¨ç§»å
¥ä»åºçé»è®¤åºåºï¼", example = "1") |
| | | private Long toLocationId; |
| | | |
| | | @Schema(description = "ç§»å
¥åºä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "ç§»å
¥åºä½ç¼å·ä¸è½ä¸ºç©º") |
| | | @Schema(description = "ç§»å
¥åºä½ç¼å·ï¼ä¸ä¼ æ¶ä½¿ç¨ç§»å
¥ä»åºçé»è®¤åºä½ï¼", example = "1") |
| | | private Long toAreaId; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | |
| | | .orderByAsc(MesWmStockTakingTaskLineDO::getId)); |
| | | } |
| | | |
| | | /** |
| | | * æ ä»»å¡ + ç©æ + åºä½ æ¥è¯¢çç¹æ¸
åè¡ |
| | | * |
| | | * åä¸ç©æå¨åä¸åºä½å¯è½å æ¹æ¬¡/ä¾åºåä¸ååå¨å¤è¡ï¼æ¤æ¶åææ©çæçä¸è¡ï¼ |
| | | * é¿å
selectOne å å¤è¡ç´æ¥æå¼å¸¸ï¼ç¨æ·æªéæ©çç¹æ¸
åæ¶èµ°è¯¥å
åºé»è¾ï¼ã |
| | | */ |
| | | default MesWmStockTakingTaskLineDO selectByTaskIdAndItemIdAndAreaId(Long taskId, Long itemId, Long areaId) { |
| | | return selectOne(new LambdaQueryWrapperX<MesWmStockTakingTaskLineDO>() |
| | | List<MesWmStockTakingTaskLineDO> list = selectList(new LambdaQueryWrapperX<MesWmStockTakingTaskLineDO>() |
| | | .eq(MesWmStockTakingTaskLineDO::getTaskId, taskId) |
| | | .eq(MesWmStockTakingTaskLineDO::getItemId, itemId) |
| | | .eqIfPresent(MesWmStockTakingTaskLineDO::getAreaId, areaId)); |
| | | .eqIfPresent(MesWmStockTakingTaskLineDO::getAreaId, areaId) |
| | | .orderByAsc(MesWmStockTakingTaskLineDO::getId)); |
| | | return list.isEmpty() ? null : list.get(0); |
| | | } |
| | | |
| | | } |
| | |
| | | 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.MesWmWarehouseDefaultService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; |
| | | import com.mzt.logapi.starter.annotation.LogRecord; |
| | |
| | | @Resource |
| | | @Lazy |
| | | private MesWmWarehouseService warehouseService; |
| | | @Resource |
| | | @Lazy |
| | | private MesWmWarehouseDefaultService warehouseDefaultService; |
| | | @Resource |
| | | @Lazy |
| | | private MesWmTransactionService wmTransactionService; |
| | |
| | | |
| | | @Override |
| | | public void checkAreaMixingRule(Long areaId, Long itemId, Long batchId) { |
| | | // æªæå®åºä½ï¼å®¢æ·æªå¯ç¨åºåº/åºä½ç®¡çï¼æ¶ä¸æ ¡éªæ··æ¾ï¼åç»å
¥åºäºå¡ä¼è½å°ä»åºé»è®¤åºä½ |
| | | if (areaId == null) { |
| | | return; |
| | | } |
| | | // 1.1 æ ¡éªåºä½å¿
é¡»åå¨ |
| | | MesWmWarehouseAreaDO area = areaService.validateWarehouseAreaExists(areaId); |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | // 3. æ ¡éªåºä½æ··æ¾è§å |
| | | // 3. æªæå®åºåº/åºä½æ¶ï¼è½å°ä»åºé»è®¤åºåº/åºä½ï¼å®¢æ·æªå¯ç¨åºåº/åºä½ç®¡çï¼ |
| | | if (reqVO.getWarehouseId() != null |
| | | && (reqVO.getLocationId() == null || reqVO.getAreaId() == null)) { |
| | | MesWmWarehouseAreaDO defaultArea = warehouseDefaultService.getOrCreateDefaultArea(reqVO.getWarehouseId()); |
| | | reqVO.setLocationId(defaultArea.getLocationId()); |
| | | reqVO.setAreaId(defaultArea.getId()); |
| | | } |
| | | // 3.1 æ ¡éªåºä½æ··æ¾è§å |
| | | checkAreaMixingRule(reqVO.getAreaId(), reqVO.getItemId(), batchId); |
| | | |
| | | // 4. è·åæå建åºåè®°å½ |
| | |
| | | throw exception(WM_MATERIAL_STOCK_FROZEN); |
| | | } |
| | | |
| | | // 4. æ ¡éªç®æ åºä½æ··æ¾è§å |
| | | // 4. ç®æ åºåº/åºä½æªæå®æ¶ï¼è½å°ç®æ ä»åºçé»è®¤åºåº/åºä½ï¼å®¢æ·æªå¯ç¨åºåº/åºä½ç®¡çï¼ |
| | | if (reqVO.getToWarehouseId() == null) { |
| | | reqVO.setToWarehouseId(sourceStock.getWarehouseId()); |
| | | } |
| | | if ((reqVO.getToLocationId() == null || reqVO.getToAreaId() == null)) { |
| | | MesWmWarehouseAreaDO defaultArea = warehouseDefaultService.getOrCreateDefaultArea(reqVO.getToWarehouseId()); |
| | | reqVO.setToLocationId(defaultArea.getLocationId()); |
| | | reqVO.setToAreaId(defaultArea.getId()); |
| | | } |
| | | // 4.1 æ ¡éªç®æ åºä½æ··æ¾è§å |
| | | checkAreaMixingRule(reqVO.getToAreaId(), sourceStock.getItemId(), sourceStock.getBatchId()); |
| | | |
| | | // 5. çæç§»åºåå· |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.line.MesWmMiscReceiptLinePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.miscreceipt.vo.line.MesWmMiscReceiptLineSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt.MesWmMiscReceiptLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.miscreceipt.MesWmMiscReceiptLineMapper; |
| | | import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseDefaultService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | private MesMdmItemService mdmItemService; |
| | | @Resource |
| | | private MesWmWarehouseAreaService warehouseAreaService; |
| | | @Resource |
| | | private MesWmWarehouseDefaultService warehouseDefaultService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | // 1. æ ¡éª |
| | | MesWmMiscReceiptLineDO line = validateMiscReceiptLineExists(updateReqVO.getId()); |
| | | updateReqVO.setReceiptId(line.getReceiptId()); |
| | | // æªæå®åºåº/åºä½æ¶ï¼è½å°ä»åºé»è®¤åºåº/åºä½ï¼å®¢æ·æªå¯ç¨åºåº/åºä½ç®¡çï¼ |
| | | fillDefaultLocationAndArea(updateReqVO); |
| | | |
| | | // 2. æ´æ°è¡ |
| | | MesWmMiscReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmMiscReceiptLineDO.class); |
| | |
| | | miscReceiptService.validateMiscReceiptEditable(reqVO.getReceiptId()); |
| | | // æ ¡éªç©æåå¨ |
| | | mdmItemService.validateItemExistsAndEnable(reqVO.getItemId()); |
| | | // æªæå®åºåº/åºä½æ¶ï¼è½å°ä»åºé»è®¤åºåº/åºä½ï¼å®¢æ·æªå¯ç¨åºåº/åºä½ç®¡çï¼ |
| | | fillDefaultLocationAndArea(reqVO); |
| | | // æ ¡éªä»åºå±çº§å
³ç³»ï¼ä»åº - åºä½ - åºåºï¼ |
| | | warehouseAreaService.validateWarehouseAreaExists(reqVO.getWarehouseId(), |
| | | reqVO.getLocationId(), reqVO.getAreaId()); |
| | | } |
| | | |
| | | /** |
| | | * æªæå®åºåº/åºä½æ¶ï¼è½å°ä»åºé»è®¤åºåº/åºä½ |
| | | */ |
| | | private void fillDefaultLocationAndArea(MesWmMiscReceiptLineSaveReqVO reqVO) { |
| | | if (reqVO.getWarehouseId() == null |
| | | || (reqVO.getLocationId() != null && reqVO.getAreaId() != null)) { |
| | | return; |
| | | } |
| | | MesWmWarehouseAreaDO defaultArea = warehouseDefaultService.getOrCreateDefaultArea(reqVO.getWarehouseId()); |
| | | reqVO.setLocationId(defaultArea.getLocationId()); |
| | | reqVO.setAreaId(defaultArea.getId()); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueDetailDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO; |
| | | 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.mysql.wm.returnissue.MesWmReturnIssueDetailMapper; |
| | | import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseDefaultService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | private MesWmReturnIssueLineService issueLineService; |
| | | @Resource |
| | | private MesWmWarehouseAreaService warehouseAreaService; |
| | | @Resource |
| | | private MesWmWarehouseDefaultService warehouseDefaultService; |
| | | @Resource |
| | | @Lazy |
| | | private MesWmMaterialStockService materialStockService; |
| | |
| | | if (ObjUtil.notEqual(line.getItemId(), reqVO.getItemId())) { |
| | | throw exception(WM_RETURN_ISSUE_DETAIL_ITEM_MISMATCH); |
| | | } |
| | | // æªæå®ä¸æ¶ç®æ åºåº/åºä½æ¶ï¼è½å°ä»åºé»è®¤åºåº/åºä½ï¼å®¢æ·æªå¯ç¨åºåº/åºä½ç®¡çï¼ |
| | | if (reqVO.getWarehouseId() != null |
| | | && (reqVO.getLocationId() == null || reqVO.getAreaId() == null)) { |
| | | MesWmWarehouseAreaDO defaultArea = |
| | | warehouseDefaultService.getOrCreateDefaultArea(reqVO.getWarehouseId()); |
| | | reqVO.setLocationId(defaultArea.getLocationId()); |
| | | reqVO.setAreaId(defaultArea.getId()); |
| | | } |
| | | // æ ¡éªä¸æ¶ç®æ ä»åºãåºåºãåºä½çå
³èå
³ç³» |
| | | warehouseAreaService.validateWarehouseAreaExists( |
| | | reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId()); |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesDetailMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseDefaultService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | private MesWmReturnSalesService returnSalesService; |
| | | @Resource |
| | | private MesWmWarehouseAreaService warehouseAreaService; |
| | | @Resource |
| | | private MesWmWarehouseDefaultService warehouseDefaultService; |
| | | @Resource |
| | | private MesWmBatchService batchService; |
| | | @Resource |
| | |
| | | MesWmReturnSalesLineDO line = returnSalesLineService.validateReturnSalesLineExists(reqVO.getLineId()); |
| | | // æ ¡éªéè´§å为å¾
䏿¶ç¶æ |
| | | validateReturnSalesStatusApproved(line.getReturnId()); |
| | | // æªæå®åºåº/åºä½æ¶ï¼è½å°ä»åºé»è®¤åºåº/åºä½ï¼å®¢æ·æªå¯ç¨åºåº/åºä½ç®¡çï¼ |
| | | if (reqVO.getWarehouseId() != null |
| | | && (reqVO.getLocationId() == null || reqVO.getAreaId() == null)) { |
| | | MesWmWarehouseAreaDO defaultArea = |
| | | warehouseDefaultService.getOrCreateDefaultArea(reqVO.getWarehouseId()); |
| | | reqVO.setLocationId(defaultArea.getLocationId()); |
| | | reqVO.setAreaId(defaultArea.getId()); |
| | | } |
| | | // æ ¡éªä»åºãåºåºãåºä½çå
³èå
³ç³» |
| | | warehouseAreaService.validateWarehouseAreaExists( |
| | | reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId()); |
| | |
| | | package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task; |
| | | |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | 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.stocktaking.task.vo.result.MesWmStockTakingTaskResultPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.result.MesWmStockTakingTaskResultSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskResultDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskResultMapper; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseDefaultService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | private MesWmStockTakingTaskLineService stockTakingTaskLineService; |
| | | @Resource |
| | | private MesWmStockTakingTaskService stockTakingTaskService; |
| | | @Resource |
| | | private MesWmWarehouseDefaultService warehouseDefaultService; |
| | | |
| | | @Override |
| | | public PageResult<MesWmStockTakingTaskResultDO> getStockTakingTaskResultPage( |
| | |
| | | // 2. ç¡®å® lineId åè´¦é¢æ°é |
| | | Long lineId = createReqVO.getLineId(); |
| | | MesWmStockTakingTaskLineDO existingLine = null; |
| | | if (lineId != null) { |
| | | // 2.1 å¦æä¼ éäº lineIdï¼ä» line ä¸è·å quantityï¼å¹¶è¡¥é½ä»åº/åºåº/åºä½/æ¹æ¬¡ |
| | | existingLine = stockTakingTaskLineService.validateStockTakingTaskLineExists(lineId); |
| | | if (createReqVO.getWarehouseId() == null) { |
| | | createReqVO.setWarehouseId(existingLine.getWarehouseId()); |
| | | } |
| | | if (createReqVO.getLocationId() == null) { |
| | | createReqVO.setLocationId(existingLine.getLocationId()); |
| | | } |
| | | if (createReqVO.getAreaId() == null) { |
| | | createReqVO.setAreaId(existingLine.getAreaId()); |
| | | } |
| | | if (createReqVO.getBatchId() == null) { |
| | | createReqVO.setBatchId(existingLine.getBatchId()); |
| | | } |
| | | if (StrUtil.isEmpty(createReqVO.getBatchCode())) { |
| | | createReqVO.setBatchCode(existingLine.getBatchCode()); |
| | | } |
| | | } |
| | | // 2.2 æªæå®åºåº/åºä½æ¶ï¼è½å°ä»åºé»è®¤åºåº/åºä½ï¼å®¢æ·æªå¯ç¨åºåº/åºä½ç®¡çï¼ |
| | | if (createReqVO.getWarehouseId() != null |
| | | && (createReqVO.getLocationId() == null || createReqVO.getAreaId() == null)) { |
| | | MesWmWarehouseAreaDO defaultArea = |
| | | warehouseDefaultService.getOrCreateDefaultArea(createReqVO.getWarehouseId()); |
| | | createReqVO.setLocationId(defaultArea.getLocationId()); |
| | | createReqVO.setAreaId(defaultArea.getId()); |
| | | } |
| | | if (lineId == null) { |
| | | // 2.1 åºäº taskId + itemId + areaId æ¥è¯¢å·²åå¨ç line |
| | | // 2.3 åºäº taskId + itemId + areaId æ¥è¯¢å·²åå¨ç line |
| | | existingLine = stockTakingTaskLineService.getStockTakingTaskLine( |
| | | createReqVO.getTaskId(), createReqVO.getItemId(), createReqVO.getAreaId()); |
| | | if (existingLine != null) { |
| | | lineId = existingLine.getId(); |
| | | } else { |
| | | // 2.2 å建æ°ç lineï¼æ³¨æï¼å½çç¹ç»ææ²¡æå¯¹åºççç¹æ¸
åè¡æ¶ï¼ä¼èªå¨å建ä¸ä¸ªæ°ççç¹ä»»å¡è¡ï¼ |
| | | // 2.4 å建æ°ç lineï¼æ³¨æï¼å½çç¹ç»ææ²¡æå¯¹åºççç¹æ¸
åè¡æ¶ï¼ä¼èªå¨å建ä¸ä¸ªæ°ççç¹ä»»å¡è¡ï¼ |
| | | lineId = stockTakingTaskLineService.createStockTakingTaskLine(createReqVO); |
| | | } |
| | | } else { |
| | | // 2.3 å¦æä¼ éäº lineIdï¼ä» line ä¸è·å quantity |
| | | existingLine = stockTakingTaskLineService.validateStockTakingTaskLineExists(lineId); |
| | | } |
| | | if (existingLine != null |
| | | && existingLine.getTakingQuantity() != null |
| | |
| | | import cn.iocoder.yudao.module.mes.service.wm.stockwarning.MesWmStockWarningService; |
| | | 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.MesWmWarehouseDefaultService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; |
| | | import jakarta.annotation.Resource; |
| | |
| | | @Resource |
| | | private MesWmWarehouseAreaService areaService; |
| | | @Resource |
| | | private MesWmWarehouseDefaultService warehouseDefaultService; |
| | | @Resource |
| | | private MesWmStockWarningService stockWarningService; |
| | | |
| | | @Override |
| | |
| | | checkQuantity(reqDTO, inbound); |
| | | // 1.3 å
¥åºäºå¡ï¼æ¹æ¬¡å·æ ¡éª + batchId/batchCode äºè¡¥ |
| | | checkBatch(reqDTO, inbound); |
| | | // 1.3.1 å
¥åºäºå¡æªæå®åºåº/åºä½æ¶ï¼èªå¨è½å°ä»åºé»è®¤åºåº/åºä½ï¼å®¢æ·æªå¯ç¨åºåº/åºä½ç®¡çï¼ |
| | | if (inbound) { |
| | | fillDefaultLocationAndArea(reqDTO); |
| | | } |
| | | // 1.4 å
¥åºäºå¡ï¼åºä½æ··æ¾è§åæ ¡éª |
| | | if (inbound) { |
| | | materialStockService.checkAreaMixingRule(reqDTO.getAreaId(), reqDTO.getItemId(), reqDTO.getBatchId()); |
| | |
| | | // ==================== ç§ææ ¡éªæ¹æ³ ==================== |
| | | |
| | | /** |
| | | * å
¥åºäºå¡æªæå®åºåº/åºä½æ¶ï¼èªå¨ä½¿ç¨ä»åºçé»è®¤åºåº/é»è®¤åºä½ |
| | | * |
| | | * å®¢æ·æªå¯ç¨åºåº/åºä½ç®¡çï¼å端ä¸åè®©ç¨æ·éæ©ï¼åºåä»éè¦å®æ´çä»åº-åºåº-åºä½ç»´åº¦ã |
| | | */ |
| | | private void fillDefaultLocationAndArea(MesWmTransactionSaveReqDTO reqDTO) { |
| | | if (reqDTO.getWarehouseId() == null |
| | | || (reqDTO.getLocationId() != null && reqDTO.getAreaId() != null)) { |
| | | return; |
| | | } |
| | | MesWmWarehouseAreaDO defaultArea = warehouseDefaultService.getOrCreateDefaultArea(reqDTO.getWarehouseId()); |
| | | reqDTO.setLocationId(defaultArea.getLocationId()); |
| | | reqDTO.setAreaId(defaultArea.getId()); |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªæ°éæ£è´å·ä¸äºå¡æ¹åä¸è´ |
| | | */ |
| | | private void checkQuantity(MesWmTransactionSaveReqDTO reqDTO, boolean inbound) { |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.detail.MesWmTransferDetailSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferDetailDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.transfer.MesWmTransferDetailMapper; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseDefaultService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | private MesWmTransferLineService transferLineService; |
| | | @Resource |
| | | private MesWmWarehouseAreaService warehouseAreaService; |
| | | @Resource |
| | | private MesWmWarehouseDefaultService warehouseDefaultService; |
| | | |
| | | @Override |
| | | public Long createTransferDetail(MesWmTransferDetailSaveReqVO createReqVO) { |
| | |
| | | private void validateDetailSaveData(MesWmTransferDetailSaveReqVO reqVO, Long excludeDetailId) { |
| | | // æ ¡éªç¶æ°æ®åå¨ |
| | | MesWmTransferLineDO line = transferLineService.validateTransferLineExists(reqVO.getLineId()); |
| | | // æªæå®ç§»å
¥åºåº/åºä½æ¶ï¼è½å°ç§»å
¥ä»åºé»è®¤åºåº/åºä½ï¼å®¢æ·æªå¯ç¨åºåº/åºä½ç®¡çï¼ |
| | | if (reqVO.getToWarehouseId() != null |
| | | && (reqVO.getToLocationId() == null || reqVO.getToAreaId() == null)) { |
| | | MesWmWarehouseAreaDO defaultArea = |
| | | warehouseDefaultService.getOrCreateDefaultArea(reqVO.getToWarehouseId()); |
| | | reqVO.setToLocationId(defaultArea.getLocationId()); |
| | | reqVO.setToAreaId(defaultArea.getId()); |
| | | } |
| | | // æ ¡éªä»åºãåºåºãåºä½çå
³èå
³ç³» |
| | | warehouseAreaService.validateWarehouseAreaExists( |
| | | reqVO.getToWarehouseId(), reqVO.getToLocationId(), reqVO.getToAreaId()); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.wm.warehouse; |
| | | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; |
| | | |
| | | /** |
| | | * ä»åºé»è®¤åºåº/åºä½ Service |
| | | * |
| | | * å®¢æ·æªå¯ç¨åºåº/åºä½ç®¡çæ¶ï¼ä¸å¡åæ®ä¸åè¦æ±ç¨æ·éæ©åºåº/åºä½ï¼ |
| | | * ç±ç³»ç»æä»åºèªå¨è½å°ãé»è®¤åºåº / é»è®¤åºä½ãï¼ä¸å卿¶èªå¨å建ï¼ï¼ |
| | | * ä¿è¯åºåè®°å½ä»å
·å¤å®æ´çä»åº-åºåº-åºä½ç»´åº¦ã |
| | | */ |
| | | public interface MesWmWarehouseDefaultService { |
| | | |
| | | /** |
| | | * è·åä»åºçé»è®¤åºåºï¼ä¸å卿¶èªå¨å建 |
| | | * |
| | | * @param warehouseId ä»åºç¼å· |
| | | * @return é»è®¤åºåº |
| | | */ |
| | | MesWmWarehouseLocationDO getOrCreateDefaultLocation(Long warehouseId); |
| | | |
| | | /** |
| | | * è·åä»åºçé»è®¤åºä½ï¼ä¸å卿¶èªå¨å建ï¼åæ¶ç¡®ä¿é»è®¤åºåºåå¨ï¼ |
| | | * |
| | | * @param warehouseId ä»åºç¼å· |
| | | * @return é»è®¤åºä½ |
| | | */ |
| | | MesWmWarehouseAreaDO getOrCreateDefaultArea(Long warehouseId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.wm.warehouse; |
| | | |
| | | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| | | import cn.iocoder.yudao.framework.common.exception.ServiceException; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | /** |
| | | * ä»åºé»è®¤åºåº/åºä½ Service å®ç°ç±» |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class MesWmWarehouseDefaultServiceImpl implements MesWmWarehouseDefaultService { |
| | | |
| | | /** é»è®¤åºåºç¼ç åç¼ï¼æä»åºé离ï¼ä¿è¯ç¼ç å
¨å±å¯ä¸ï¼ */ |
| | | private static final String DEFAULT_LOCATION_CODE_PREFIX = "DEFAULT_KQ_"; |
| | | private static final String DEFAULT_LOCATION_NAME = "é»è®¤åºåº"; |
| | | /** é»è®¤åºä½ç¼ç åç¼ */ |
| | | private static final String DEFAULT_AREA_CODE_PREFIX = "DEFAULT_KW_"; |
| | | private static final String DEFAULT_AREA_NAME = "é»è®¤åºä½"; |
| | | |
| | | @Resource |
| | | private MesWmWarehouseLocationService locationService; |
| | | @Resource |
| | | private MesWmWarehouseAreaService areaService; |
| | | @Resource |
| | | private MesWmWarehouseService warehouseService; |
| | | |
| | | @Override |
| | | public MesWmWarehouseLocationDO getOrCreateDefaultLocation(Long warehouseId) { |
| | | String code = DEFAULT_LOCATION_CODE_PREFIX + warehouseId; |
| | | MesWmWarehouseLocationDO location = locationService.getWarehouseLocationByCode(code); |
| | | if (location != null) { |
| | | return location; |
| | | } |
| | | // ä»åºä¸å卿¶ç»åºæç¡®æç¤ºï¼é¿å
å»ºåºæ²¡æå½å±çåºåº |
| | | warehouseService.validateWarehouseExists(warehouseId); |
| | | |
| | | MesWmWarehouseLocationSaveReqVO createReqVO = new MesWmWarehouseLocationSaveReqVO(); |
| | | createReqVO.setWarehouseId(warehouseId); |
| | | createReqVO.setCode(code); |
| | | createReqVO.setName(DEFAULT_LOCATION_NAME); |
| | | createReqVO.setFrozen(false); |
| | | try { |
| | | Long id = locationService.createWarehouseLocation(createReqVO); |
| | | return locationService.getWarehouseLocation(id); |
| | | } catch (ServiceException ex) { |
| | | // å¹¶å馿¬¡ä½¿ç¨æ¶å¯è½å·²è¢«å
¶ä»è¯·æ±å建ï¼åæ¥ä¸æ¬¡ |
| | | MesWmWarehouseLocationDO created = locationService.getWarehouseLocationByCode(code); |
| | | if (created != null) { |
| | | return created; |
| | | } |
| | | throw ex; |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public MesWmWarehouseAreaDO getOrCreateDefaultArea(Long warehouseId) { |
| | | String code = DEFAULT_AREA_CODE_PREFIX + warehouseId; |
| | | MesWmWarehouseAreaDO area = areaService.getWarehouseAreaByCode(code); |
| | | if (area != null) { |
| | | return area; |
| | | } |
| | | MesWmWarehouseLocationDO location = getOrCreateDefaultLocation(warehouseId); |
| | | |
| | | MesWmWarehouseAreaSaveReqVO createReqVO = new MesWmWarehouseAreaSaveReqVO(); |
| | | createReqVO.setCode(code); |
| | | createReqVO.setName(DEFAULT_AREA_NAME); |
| | | createReqVO.setLocationId(location.getId()); |
| | | createReqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); |
| | | createReqVO.setFrozen(false); |
| | | // é»è®¤åºä½éå
¼å®¹ææç©æ/æ¹æ¬¡ï¼é¿å
卿 åºä½ç®¡ççåºæ¯ä¸è§¦åæ··æ¾æ ¡éª |
| | | createReqVO.setAllowItemMixing(true); |
| | | createReqVO.setAllowBatchMixing(true); |
| | | try { |
| | | Long id = areaService.createWarehouseArea(createReqVO); |
| | | return areaService.getWarehouseArea(id); |
| | | } catch (ServiceException ex) { |
| | | MesWmWarehouseAreaDO created = areaService.getWarehouseAreaByCode(code); |
| | | if (created != null) { |
| | | return created; |
| | | } |
| | | throw ex; |
| | | } |
| | | } |
| | | |
| | | } |