docs/material_stock_move.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,120 @@ # åºåç§»åº - å端èè°æ¹æ¡ ## æ¶åé¡µé¢ - åºåå°è´¦é¡µé¢ï¼/mes/wm/material-stockï¼ ## ä¸å¡åºæ¯ å¨åºåå°è´¦é¡µé¢ï¼ç¨æ·å¯ä»¥éæ©ä¸æ¡åºåè®°å½ï¼ç¹å»"ç§»åº"æé®ï¼å°è¯¥åºåä»å½ååºä½ç§»å¨å°ç®æ åºä½ãç§»åºæä½ä¼çæä¸¤æ¡æå¯¹çåºåäºå¡æµæ°´ï¼è°æ¨ç§»åº + è°æ¨ç§»å ¥ï¼ï¼ç¡®ä¿åºååå¨å¯è¿½æº¯ã ## æ°å¢ API ### åºåç§»åº | æ¹æ³ | è·¯å¾ | 说æ | |------|------|------| | POST | /mes/wm/material-stock/move | åºåç§»åº | **请æ±åæ°ï¼** | åæ° | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | materialStockId | Long | æ¯ | åºåè®°å½ID | | toWarehouseId | Long | æ¯ | ç®æ ä»åºID | | toLocationId | Long | æ¯ | ç®æ åºåºID | | toAreaId | Long | æ¯ | ç®æ åºä½ID | | quantity | BigDecimal | æ¯ | ç§»åºæ°é | | remark | String | å¦ | 夿³¨ | **请æ±ç¤ºä¾ï¼** ```json { "materialStockId": 1024, "toWarehouseId": 1, "toLocationId": 2, "toAreaId": 3, "quantity": 100, "remark": "åºä½è°æ´" } ``` **ååºï¼** ```json { "code": 0, "msg": "æä½æå", "data": true } ``` ## å端修æ¹ç¹ ### 1. åºåå°è´¦å表页 - 卿ä½åæ·»å "ç§»åº"æé® - ç¹å»åæå¼ç§»åºå¼¹çª ### 2. ç§»åºå¼¹çª **表ååæ®µï¼** | åæ®µ | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | ç©æç¼ç | ææ¬ | - | åªè¯»ï¼ä»éä¸è¡å¸¦å ¥ | | ç©æåç§° | ææ¬ | - | åªè¯»ï¼ä»éä¸è¡å¸¦å ¥ | | æ¹æ¬¡å· | ææ¬ | - | åªè¯»ï¼ä»éä¸è¡å¸¦å ¥ | | å½åä»åº | ææ¬ | - | åªè¯»ï¼ä»éä¸è¡å¸¦å ¥ | | å½ååºåº | ææ¬ | - | åªè¯»ï¼ä»éä¸è¡å¸¦å ¥ | | å½ååºä½ | ææ¬ | - | åªè¯»ï¼ä»éä¸è¡å¸¦å ¥ | | å½åæ°é | æ°å | - | åªè¯»ï¼ä»éä¸è¡å¸¦å ¥ | | ç®æ ä»åº | 䏿 | æ¯ | éæ©ç®æ ä»åº | | ç®æ åºåº | 䏿 | æ¯ | æ ¹æ®ç®æ ä»åºèå¨ | | ç®æ åºä½ | 䏿 | æ¯ | æ ¹æ®ç®æ åºåºèå¨ | | ç§»åºæ°é | æ°å | æ¯ | è¾å ¥ç§»åºæ°éï¼ä¸è½è¶ è¿å½åæ°é | | 夿³¨ | ææ¬ | å¦ | 夿³¨ä¿¡æ¯ | **èå¨é»è¾ï¼** 1. éæ©ç®æ ä»åºåï¼å 载该ä»åºä¸çåºåºå表 2. éæ©ç®æ åºåºåï¼å 载该åºåºä¸çåºä½å表 **æäº¤é»è¾ï¼** 1. æ ¡éªç§»åºæ°éä¸è½è¶ è¿å½ååºåæ°é 2. æ ¡éªç§»åºæ°éä¸è½è¶ è¿å¯ç¨éï¼å½åæ°é - å»ç»æ°é - å ç¨éï¼ 3. è°ç¨ç§»åºæ¥å£ 4. æååå ³éå¼¹çªï¼å·æ°å表 ## ä¸å¡è§å说æ | åºæ¯ | è§å | |------|------| | åºåæ°éæ ¡éª | ç§»åºæ°éä¸è½è¶ è¿å¯ç¨éï¼å¨åºæ°é - å»ç»æ°é - å ç¨éï¼ | | å»ç»æ ¡éª | åºåè®°å½å·²å»ç»æ¶ï¼ä¸å è®¸ç§»åº | | åºä½æ··æ¾è§å | ç®æ åºä½é满足混æ¾è§åï¼ç©ææ··æ¾ãæ¹æ¬¡æ··æ¾ï¼ | | ååºä½ç§»åº | æºåºä½åç®æ åºä½ç¸åæ¶ï¼ä¸å è®¸ç§»åº | ## åºåäºå¡æµæ°´ ç§»åºæä½ä¼çæä¸¤æ¡æå¯¹çåºåäºå¡æµæ°´ï¼ | åæ®µ | è°æ¨ç§»åº | è°æ¨ç§»å ¥ | |------|----------|----------| | type | 3 (MOVE_OUT) | 4 (MOVE_IN) | | bizType | 112 (WM_TRANSFER_OUT) | 113 (WM_TRANSFER_IN) | | bizCode | MOVE_xxx | MOVE_xxxï¼ç¸åï¼ | | quantity | è´æ°ï¼å¦ -100ï¼ | æ£æ°ï¼å¦ 100ï¼ | | warehouseId | æºä»åº | ç®æ ä»åº | | locationId | æºåºåº | ç®æ åºåº | | areaId | æºåºä½ | ç®æ åºä½ | | relatedTransactionId | null | ç§»åºäºå¡ID | ## 注æäºé¡¹ 1. **æéè¦æ±**ï¼éè¦ `mes:wm-material-stock:move` æé 2. **äºå¡ä¸è´æ§**ï¼ç§»åºæä½å¨äºå¡ä¸æ§è¡ï¼ç¡®ä¿åºåºåå ¥åºæä½çååæ§ 3. **æ¹æ¬¡ä¿ç**ï¼ç§»åºæ¶æ¹æ¬¡ä¿¡æ¯ä¿çï¼ä¸ä¼æ¹åæ¹æ¬¡å±æ§ 4. **ä¾åºåä¿ç**ï¼ç§»åºæ¶ä¾åºåä¿¡æ¯ä¿ç docs/sale_order_production_status.md
@@ -74,7 +74,7 @@ | çäº§ç¶æåå§å¼ | éå®è®¢åå®¡æ ¸éè¿æ¶ï¼productionStatus é»è®¤ä¸º 0ï¼æªå®æï¼ | | çäº§ç¶ææ´æ°æ¶æº | 彿æå ³èçç产订å宿æ¶ï¼ç³»ç»èªå¨æ´æ°ä¸º 1ï¼å·²å®æï¼ | | çäº§å®æå¤æ | å·²ç产æ°é >= è®¡åæ°é ä¸ æææ¥å·¥å已宿ï¼å«è´¨æ£å®æï¼ | | åè´§éç¥åçæ | å½ productionStatus=1 æ¶ï¼canCreateSalesNotice 为 true | | åè´§éç¥åçæ | å½ productionStatus=1 䏿ªçæåè´§éç¥åæ¶ï¼canCreateSalesNotice 为 true | ## å±ç¤ºé»è¾è¯´æ @@ -99,7 +99,9 @@ ## 注æäºé¡¹ 1. **ç¶æèå¨**ï¼`productionStatus` ä¸ `canCreateSalesNotice` å ³èï¼ç产æªå®ææ¶æ æ³çæåè´§éç¥å 1. **ç¶æèå¨**ï¼`canCreateSalesNotice` éåæ¶æ»¡è¶³ä¸¤ä¸ªæ¡ä»¶ï¼çäº§å·²å®æï¼productionStatus=1ï¼ä¸æªçæåè´§éç¥åï¼hasSalesNotice=falseï¼ 2. **å·²çæåè´§éç¥å**ï¼å½ `hasSalesNotice=true` æ¶ï¼ä¸æ¾ç¤º"çæåè´§éç¥å"æé® 2. **æ éç产ç订å**ï¼`needProduction !== 1` ç订åï¼`productionStatus` åæ®µä¸º nullï¼åç«¯åºæ¾ç¤º"æ éç产"æä¸æ¾ç¤º yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpSaleOrderController.java
@@ -218,8 +218,8 @@ MapUtils.findAndThen(userMap, Long.parseLong(saleOrder.getCreator()), user -> saleOrder.setCreatorName(user.getNickname())); // 设置æ¯å¦å·²çæåè´§éç¥å saleOrder.setHasSalesNotice(salesNoticeMap.getOrDefault(saleOrder.getId(), false)); // 设置æ¯å¦å¯ä»¥çæåè´§éç¥å saleOrder.setCanCreateSalesNotice(canCreateSalesNoticeMap.getOrDefault(saleOrder.getId(), true)); // 设置æ¯å¦å¯ä»¥çæåè´§éç¥åï¼å·²çæåè´§éç¥åæ¶ä¸æ¾ç¤ºæé® saleOrder.setCanCreateSalesNotice(!saleOrder.getHasSalesNotice() && canCreateSalesNoticeMap.getOrDefault(saleOrder.getId(), true)); // 设置æ¯å¦æéè¦ç产çæç» boolean hasNeedProduction = saleOrder.getItems().stream() .anyMatch(item -> item.getNeedProduction() != null && item.getNeedProduction() == 1); yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/MesWmMaterialStockController.java
@@ -9,9 +9,10 @@ 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.materialstock.vo.MesWmMaterialStockAdjustReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockMoveReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockRespVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO; import cn.iocoder.yudao.module.erp.api.purchase.ErpSupplierApi; import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpSupplierRespDTO; import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; @@ -114,6 +115,14 @@ return success(materialStockService.adjustMaterialStockOut(reqVO)); } @PostMapping("/move") @Operation(summary = "åºåç§»åº") @PreAuthorize("@ss.hasPermission('mes:wm-material-stock:update')") public CommonResult<Boolean> moveMaterialStock(@Valid @RequestBody MesWmMaterialStockMoveReqVO reqVO) { materialStockService.moveMaterialStock(reqVO); return success(true); } @GetMapping("/export-excel") @Operation(summary = "导åºåºåå°è´¦ Excel") @PreAuthorize("@ss.hasPermission('mes:wm-material-stock:export')") yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockMoveReqVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,36 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.Data; import java.math.BigDecimal; @Schema(description = "管çåå° - åºåç§»åº Request VO") @Data public class MesWmMaterialStockMoveReqVO { @Schema(description = "åºåè®°å½ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @NotNull(message = "åºåè®°å½IDä¸è½ä¸ºç©º") private Long materialStockId; @Schema(description = "ç®æ ä»åºID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "ç®æ ä»åºä¸è½ä¸ºç©º") private Long toWarehouseId; @Schema(description = "ç®æ åºåºID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "ç®æ åºåºä¸è½ä¸ºç©º") private Long toLocationId; @Schema(description = "ç®æ åºä½ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "ç®æ åºä½ä¸è½ä¸ºç©º") private Long toAreaId; @Schema(description = "ç§»åºæ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") @NotNull(message = "ç§»åºæ°éä¸è½ä¸ºç©º") private BigDecimal quantity; @Schema(description = "夿³¨", example = "åºä½è°æ´") private String remark; } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java
@@ -146,6 +146,28 @@ return selectOne(wrapper); } /** * æç»å鮿¥è¯¢åºåè®°å½ï¼å¿½ç¥ä¾åºåç»´åº¦ï¼ * * ç¨äºç§»åºåºæ¯ï¼ç§»åºæ¶å°åºååå¹¶å°ç®æ åºä½å·²æåºåï¼ä¸åºåä¾åºå */ default MesWmMaterialStockDO selectByCompositeKeyIgnoreVendor(Long itemId, Long warehouseId, Long locationId, Long areaId, Long batchId) { LambdaQueryWrapperX<MesWmMaterialStockDO> wrapper = new LambdaQueryWrapperX<MesWmMaterialStockDO>() .eq(MesWmMaterialStockDO::getItemId, itemId) .eq(MesWmMaterialStockDO::getWarehouseId, warehouseId) .eq(MesWmMaterialStockDO::getLocationId, locationId) .eq(MesWmMaterialStockDO::getAreaId, areaId); // batchId=null æ¶ç²¾ç¡®å¹é is null if (batchId != null) { wrapper.eq(MesWmMaterialStockDO::getBatchId, batchId); } else { wrapper.isNull(MesWmMaterialStockDO::getBatchId); } wrapper.last("LIMIT 1"); return selectOne(wrapper); } default List<MesWmMaterialStockDO> selectList(MesWmMaterialStockListReqVO reqVO) { return selectList(new LambdaQueryWrapperX<MesWmMaterialStockDO>() .eqIfPresent(MesWmMaterialStockDO::getWarehouseId, reqVO.getWarehouseId()) yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -460,6 +460,7 @@ ErrorCode WM_MATERIAL_STOCK_REQUIRED = new ErrorCode(1_040_703_013, "åºåè®°å½ä¸è½ä¸ºç©º"); ErrorCode WM_MATERIAL_STOCK_SELECTION_MISMATCH = new ErrorCode(1_040_703_014, "åºåè®°å½ä¸æäº¤çç©æãæ¹æ¬¡æåºä½ä¿¡æ¯ä¸ä¸è´"); ErrorCode WM_MATERIAL_STOCK_QUANTITY_INVALID = new ErrorCode(1_040_703_015, "è°æ´æ°éä¸è½ä¸ºç©ºæé¶"); ErrorCode WM_MATERIAL_STOCK_FROZEN = new ErrorCode(1_040_703_016, "åºåè®°å½å·²å»ç»ï¼æ æ³ç§»åº"); // ========== MES ä»åºç®¡ç-å°è´§éç¥åï¼1-040-704-000ï¼ ========== ErrorCode WM_ARRIVAL_NOTICE_NOT_EXISTS = new ErrorCode(1_040_704_000, "å°è´§éç¥åä¸åå¨"); yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java
@@ -4,6 +4,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockAdjustReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockMoveReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; import jakarta.validation.Valid; @@ -179,4 +180,11 @@ */ Long adjustMaterialStockOut(@Valid MesWmMaterialStockAdjustReqVO reqVO); /** * åºåç§»åº * * @param reqVO ç§»åºè¯·æ± */ void moveMaterialStock(@Valid MesWmMaterialStockMoveReqVO reqVO); } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockAdjustReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockFreezeReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockMoveReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO; @@ -415,4 +416,82 @@ throw new IllegalArgumentException("æ æçè´¨éç¶æç±»å: " + qualityStatus.getClass().getName()); } @Override @Transactional(rollbackFor = Exception.class) public void moveMaterialStock(MesWmMaterialStockMoveReqVO reqVO) { // 1. æ¥è¯¢ååºåè®°å½ MesWmMaterialStockDO sourceStock = validateMaterialStockExists(reqVO.getMaterialStockId()); // 2. æ ¡éªåºåæ°éå è¶³ï¼å¯ç¨é = å¨åºæ°é - å»ç»æ°é - å ç¨éï¼ BigDecimal availableQty = sourceStock.getQuantity() != null ? sourceStock.getQuantity() : BigDecimal.ZERO; if (sourceStock.getFrozenQuantity() != null) { availableQty = availableQty.subtract(sourceStock.getFrozenQuantity()); } if (sourceStock.getReservedQuantity() != null) { availableQty = availableQty.subtract(sourceStock.getReservedQuantity()); } if (availableQty.compareTo(reqVO.getQuantity()) < 0) { throw exception(WM_MATERIAL_STOCK_INSUFFICIENT); } // 3. æ ¡éªåºåæªå»ç» if (Boolean.TRUE.equals(sourceStock.getFrozen())) { throw exception(WM_MATERIAL_STOCK_FROZEN); } // 4. æ ¡éªç®æ åºä½æ··æ¾è§å checkAreaMixingRule(reqVO.getToAreaId(), sourceStock.getItemId(), sourceStock.getBatchId()); // 5. çæç§»åºåå· String moveCode = "MOVE_" + System.currentTimeMillis(); // 6. åå»ºè°æ¨ç§»åºäºå¡ï¼è´æ°ï¼ MesWmTransactionSaveReqDTO outTransaction = new MesWmTransactionSaveReqDTO() .setType(MesWmTransactionTypeEnum.MOVE_OUT.getType()) .setBizType(MesBizTypeConstants.WM_TRANSFER_OUT) .setBizId(sourceStock.getId()) .setBizCode(moveCode) .setBizLineId(sourceStock.getId()) .setItemId(sourceStock.getItemId()) .setQuantity(reqVO.getQuantity().negate()) .setBatchId(sourceStock.getBatchId()) .setBatchCode(sourceStock.getBatchCode()) .setWarehouseId(sourceStock.getWarehouseId()) .setLocationId(sourceStock.getLocationId()) .setAreaId(sourceStock.getAreaId()) .setVendorId(sourceStock.getVendorId()) .setMaterialStockId(sourceStock.getId()) .setCheckFlag(true); Long outTransactionId = wmTransactionService.createTransaction(outTransaction); // 7. æ¥æ¾ç®æ åºä½çåºåè®°å½ï¼å¿½ç¥ä¾åºåï¼ï¼ç¨äºåå¹¶åºå MesWmMaterialStockDO targetStock = materialStockMapper.selectByCompositeKeyIgnoreVendor( sourceStock.getItemId(), reqVO.getToWarehouseId(), reqVO.getToLocationId(), reqVO.getToAreaId(), sourceStock.getBatchId() ); // 8. åå»ºè°æ¨ç§»å ¥äºå¡ï¼æ£æ°ï¼ï¼å ³èåºåºäºå¡ // 使ç¨ç®æ åºä½å·²æåºåè®°å½ç vendorIdï¼å¦ææï¼ï¼å¦åä¸ä¼ MesWmTransactionSaveReqDTO inTransaction = new MesWmTransactionSaveReqDTO() .setType(MesWmTransactionTypeEnum.MOVE_IN.getType()) .setBizType(MesBizTypeConstants.WM_TRANSFER_IN) .setBizId(sourceStock.getId()) .setBizCode(moveCode) .setBizLineId(sourceStock.getId()) .setItemId(sourceStock.getItemId()) .setQuantity(reqVO.getQuantity()) .setBatchId(sourceStock.getBatchId()) .setBatchCode(sourceStock.getBatchCode()) .setWarehouseId(reqVO.getToWarehouseId()) .setLocationId(reqVO.getToLocationId()) .setAreaId(reqVO.getToAreaId()) .setVendorId(targetStock != null ? targetStock.getVendorId() : null) .setRelatedTransactionId(outTransactionId) .setCheckFlag(false); wmTransactionService.createTransaction(inTransaction); } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferServiceImpl.java
@@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferDO; 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.materialstock.MesWmMaterialStockDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.transfer.MesWmTransferMapper; import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; @@ -189,20 +190,33 @@ // 2. éåè¡å对åºçæç»ï¼å建äºå¡ for (MesWmTransferLineDO line : lines) { List<MesWmTransferDetailDO> details = detailMap.getOrDefault(line.getId(), Collections.emptyList()); // ä» materialStockId è·åæºåºåä¿¡æ¯ï¼å æ¬ vendor_id, batch_id çï¼ Long vendorId = null; String batchCode = null; if (line.getMaterialStockId() != null) { MesWmMaterialStockDO sourceStock = materialStockService.getMaterialStock(line.getMaterialStockId()); if (sourceStock != null) { vendorId = sourceStock.getVendorId(); batchCode = sourceStock.getBatchCode(); } } for (MesWmTransferDetailDO detail : details) { // 2.1 å æ§è¡åºåºï¼è°æ¨ç§»åºï¼ä»æºä»åºæ£ååºåï¼ï¼åºåºæ°éåºäºå½åæç»çæ°é Long outTransactionId = wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO() .setType(MesWmTransactionTypeEnum.MOVE_OUT.getType()).setItemId(line.getItemId()) .setQuantity(detail.getQuantity().negate()) // åºååå°ï¼æ detail çæ°éåºï¼ .setBatchId(line.getBatchId()) .setBatchId(line.getBatchId()).setBatchCode(batchCode) .setVendorId(vendorId) .setMaterialStockId(line.getMaterialStockId()) .setWarehouseId(line.getFromWarehouseId()).setLocationId(line.getFromLocationId()).setAreaId(line.getFromAreaId()) .setBizType(MesBizTypeConstants.WM_TRANSFER_OUT).setBizId(transfer.getId()) .setBizCode(transfer.getCode()).setBizLineId(line.getId())); // 2.2 åæ§è¡å ¥åºï¼è°æ¨ç§»å ¥ï¼åç®æ ä»åºå¢å åºåï¼ï¼å ¥åºæ°éçäºç¸åæç»çæ°é // 注æï¼å ¥åºæ¶ä¸ä¼ vendorIdï¼ä»¥å¿½ç¥ä¾åºå维度ï¼åå¹¶å°ç®æ åºä½å·²æåºå wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO() .setType(MesWmTransactionTypeEnum.MOVE_IN.getType()).setItemId(line.getItemId()) // ç©æä¿¡æ¯æ¥èª line .setQuantity(detail.getQuantity()) // åºåå¢å ï¼æ detail çæ°éå ¥ï¼ .setBatchId(line.getBatchId()) // æ¹æ¬¡ä¿¡æ¯æ¥èª line .setBatchId(line.getBatchId()).setBatchCode(batchCode) // æ¹æ¬¡ä¿¡æ¯æ¥èª line .setWarehouseId(detail.getToWarehouseId()).setLocationId(detail.getToLocationId()).setAreaId(detail.getToAreaId()) .setBizType(MesBizTypeConstants.WM_TRANSFER_IN).setBizId(transfer.getId()) .setBizCode(transfer.getCode()).setBizLineId(line.getId()) yudao-server/src/main/java/cn/iocoder/yudao/server/controller/DefaultController.java
@@ -58,11 +58,12 @@ "[CRM 模å yudao-module-crm - å·²ç¦ç¨][åè https://doc.iocoder.cn/crm/build/ å¼å¯]"); } @RequestMapping(value = { "/admin-api/mes/**"}) public CommonResult<Boolean> mes404() { return CommonResult.error(NOT_IMPLEMENTED.getCode(), "[MES ç³»ç» yudao-module-mes - å·²ç¦ç¨][åè https://doc.iocoder.cn/mes/build/ å¼å¯]"); } // MES 模åå·²å¯ç¨ï¼ç§»é¤å åºæ å° // @RequestMapping(value = { "/admin-api/mes/**"}) // public CommonResult<Boolean> mes404() { // return CommonResult.error(NOT_IMPLEMENTED.getCode(), // "[MES ç³»ç» yudao-module-mes - å·²ç¦ç¨][åè https://doc.iocoder.cn/mes/build/ å¼å¯]"); // } @RequestMapping(value = { "/admin-api/im/**"}) public CommonResult<Boolean> im404() {