| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # çäº§éæ - å端èè°æ¹æ¡ |
| | | |
| | | ## é®é¢èæ¯ |
| | | |
| | | éææç»ï¼detailï¼ç `warehouseId`/`locationId`/`areaId` è¯ä¹åæ´ï¼ |
| | | - **åæ´å**ï¼æ¥æºä»åºï¼ä»åºåè®°å½å¸¦å
¥ï¼å³èæçº¿è¾¹åºï¼ |
| | | - **åæ´å**ï¼ä¸æ¶ç®æ ä»åºï¼éæè¦æ¾åçå®é
ä»åºï¼ |
| | | |
| | | åç«¯ä¼ èæçº¿è¾¹åºä¿¡æ¯ â å端å
¥åºä¹å
¥èæåº â å®é
ä»åºåºå没æ¢å¤ã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ç产éæå - æç»æ°å¢/ç¼è¾å¼¹çª |
| | | - ç产éæå - 䏿¶æä½é¡µé¢ |
| | | |
| | | ## æ ¸å¿åæ´ |
| | | |
| | | ### éææç»çä»åºå段è¯ä¹ |
| | | |
| | | | åæ®µ | åæ´åè¯ä¹ | åæ´åè¯ä¹ | 说æ | |
| | | |------|-----------|-----------|------| |
| | | | `materialStockId` | èæçº¿è¾¹åºåºåè®°å½ ID | ä¸å | ç¨äºä»èæçº¿è¾¹åºåºåº | |
| | | | `warehouseId` | æ¥æºä»åºï¼èæåºï¼ | **䏿¶ç®æ ä»åºï¼å®é
ä»åºï¼** | éæå
¥åºçç®æ ä»åº | |
| | | | `locationId` | æ¥æºåºåº | **䏿¶ç®æ åºåº** | éæå
¥åºçç®æ åºåº | |
| | | | `areaId` | æ¥æºåºä½ | **䏿¶ç®æ åºä½** | éæå
¥åºçç®æ åºä½ | |
| | | |
| | | ### å端已åçå
¼å®¹ |
| | | |
| | | å端 `createTransactionList` å·²åå
åºï¼ |
| | | - 妿 detail ç `warehouseId` 仿¯èæçº¿è¾¹åºï¼æ§æ°æ®/åç«¯æªæ¹ï¼ï¼ä¼èªå¨éè¿äºå¡æµæ°´åæ¥åå§ä»åº |
| | | - å端æ¹å®åï¼ç´æ¥ä½¿ç¨ detail çä»åºä¿¡æ¯ä½ä¸ºå
¥åºç®æ ï¼ä¸åèµ°åæ¥ |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. æç»æ°å¢/ç¼è¾å¼¹çª - ä»åºéæ©é»è¾ |
| | | |
| | | **å½åé»è¾**ï¼éæ©èæçº¿è¾¹åºåºåè®°å½åï¼èªå¨å¸¦å
¥è¯¥åºåè®°å½ç warehouseId/locationId/areaIdï¼èæåºï¼ |
| | | |
| | | **æ¹ä¸º**ï¼ |
| | | - `materialStockId`ï¼ä»ä»èæçº¿è¾¹åºåºåè®°å½è·åï¼ç¨äºæ è¯ä»åªä¸ªåºååºï¼ |
| | | - `warehouseId`/`locationId`/`areaId`ï¼**æ¹ä¸ºè®©ç¨æ·éæ©ä¸æ¶ç®æ åºä½**ï¼å®é
ä»åºçåºä½ï¼ï¼ä¸åèªå¨ä»åºåè®°å½å¸¦å
¥ |
| | | |
| | | #### éæ©åºåè®°å½æ¶ |
| | | |
| | | ``` |
| | | éæ©åºåè®°å½ â èªå¨å¸¦å
¥ï¼itemId, batchId, batchCode, materialStockId |
| | | ä¸å带å
¥ï¼warehouseId, locationId, areaId |
| | | ``` |
| | | |
| | | #### 䏿¶ç®æ åºä½éæ© |
| | | |
| | | æ°å¢ä¸ä¸ªåºä½éæ©å¨ï¼è®©ç¨æ·éæ©éæè¦æ¾åçå®é
ä»åºåºä½ï¼ |
| | | - ä»åºä¸æï¼è¿æ»¤æèæçº¿è¾¹ä»åºï¼code = `WIP_VIRTUAL_WAREHOUSE`ï¼ |
| | | - åºåºä¸æï¼èå¨ä»åº |
| | | - åºä½ä¸æï¼èå¨åºåº |
| | | |
| | | ### 2. æ°æ®å¸¦å
¥è¯´æ |
| | | |
| | | | åºæ¯ | ä»åªå¸¦å
¥ | åæ®µ | |
| | | |------|---------|------| |
| | | | éæ©åºåè®°å½ | èæçº¿è¾¹åºåºå | materialStockId, itemId, batchId, batchCode | |
| | | | 鿩䏿¶åºä½ | ç¨æ·æå¨éæ© | warehouseId, locationId, areaId | |
| | | | é»è®¤ä¸æ¶åºä½ | 颿åºåºæ¶çåå§ä»åº | warehouseId, locationId, areaId | |
| | | |
| | | **建议**ï¼éæ©åºåè®°å½åï¼èªå¨æ¥è¯¢è¯¥ç©æç颿åºåºè®°å½ï¼å°åå§åºåºä»åºä½ä¸ºé»è®¤ä¸æ¶ç®æ åºä½ï¼ç¨æ·å¯ä¿®æ¹ã |
| | | |
| | | ### 3. API 说æ |
| | | |
| | | ä¿åæç»çæ¥å£ä¸åï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /mes/wm-return-issue-detail/create | æ°å¢æç» | |
| | | | PUT | /mes/wm-return-issue-detail/update | ä¿®æ¹æç» | |
| | | |
| | | **请æ±åæ°ï¼åä¹åï¼ä½è¯ä¹åæ´ï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | materialStockId | Long | å¦ | èæçº¿è¾¹åºåºåè®°å½ IDï¼æ¥æºï¼ | |
| | | | warehouseId | Long | æ¯ | **䏿¶ç®æ ä»åº ID**ï¼ä¸åæ¯æ¥æºä»åºï¼ | |
| | | | locationId | Long | æ¯ | **䏿¶ç®æ åºåº ID** | |
| | | | areaId | Long | æ¯ | **䏿¶ç®æ åºä½ ID** | |
| | | |
| | | ### 4. åç«¯æ ¡éªåæ´ |
| | | |
| | | åç«¯æ ¡éªå·²è°æ´ï¼ |
| | | - â
æ ¡éª `materialStockId` 对åºçåºåè®°å½åå¨ãç©æä¸è´ãåºåå
è¶³ |
| | | - â ä¸åæ ¡éª `materialStockId` çä»åºä¸ `warehouseId` ä¸è´ï¼å ä¸ºæ¥æºæ¯èæåºï¼ç®æ æ¯å®é
åºï¼ |
| | | - â
æ ¡éªä¸æ¶ç®æ åºä½çæ··æ¾è§å |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | éæåºåº | ä»èæçº¿è¾¹åºæ£åï¼checkFlag=falseï¼å
许è´åºåï¼ | |
| | | | éæå
¥åº | å
¥å°ç¨æ·éæ©çå®é
ä»åºåºä½ | |
| | | | é»è®¤ä¸æ¶åºä½ | 建议é»è®¤å¡«å
¥é¢æåºåºæ¶çåå§ä»åºåºä½ | |
| | | | ä»åºè¿æ»¤ | 䏿¶ç®æ ä»åºä¸æåºæé¤èæçº¿è¾¹ä»åº | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - å端已åå
¼å®¹ï¼å¦æåç«¯ææ¶ä¸æ¹ï¼æ§æ°æ®ï¼warehouseId=èæåºï¼ä»è½éè¿äºå¡æµæ°´åæ¥åå§ä»åºï¼ä¸ä¼æ¥é |
| | | - å端æ¹å®åï¼æ°çéæå detail åºä¼ å®é
ä»åºçåºä½ï¼é»è¾æ´æ¸
æ° |
| | | - å·²åå¨çæ§éææ°æ®ä¸åå½±åï¼åæ¥å
åºï¼ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # å·¥èºè·¯çº¿å·¥åº - 产åºäº§ååæ®µ - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - å·¥èºè·¯çº¿ - å·¥åºé
ç½®é¡µï¼æ°å¢/ç¼è¾å·¥åºæ¶éæ©äº§åºäº§åï¼ |
| | | - æäº§ - 任塿°å¢é¡µï¼èªå¨å¸¦å
¥äº§åºäº§åï¼ |
| | | - BOM é
置页ï¼å·¥åºäº§åºäº§ååæ´åï¼BOM ç产ååæ®µèå¨ï¼ |
| | | |
| | | ## ä¸å¡èæ¯ |
| | | |
| | | **é®é¢**ï¼å½åææå·¥åºç产åºé½æ¯æç»æåï¼æ æ³åºåä¸é´å·¥åºçåæå产åºãä¾å¦ï¼ |
| | | - å·¥åº1ï¼æä¸ â 产åº"éæ"ï¼åæåï¼ï¼ä¸æ¯"é¢è¯éç»çº¿" |
| | | - å·¥åº2ï¼ç»çº¿ â 产åº"é¢è¯éç»çº¿"ï¼æç»æåï¼ |
| | | |
| | | **è§£å³**ï¼å·¥èºè·¯çº¿å·¥åºæ°å¢"产åºäº§å"åæ®µï¼æäº§æ¶èªå¨å¸¦å
¥ä»»å¡çç©æã |
| | | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | 1. **å·¥èºè·¯çº¿é
ç½®** â æ¯éå·¥åºéæ©äº§åºäº§åï¼åæå/æåï¼ |
| | | 2. **æäº§** â 鿩工åºåï¼èªå¨ä»å·¥åºå¸¦åº `outputItemId` ä½ä¸ºä»»å¡ç `itemId` |
| | | 3. **æ¥å·¥äº§åº** â ä»ä»»å¡åä½ `itemId`ï¼å¯è½æ¯åæåï¼ï¼äº§åºåååºåèªå¨æ£ç¡® |
| | | 4. **å岿£æ** â BOM æ¥è¯¢æå·¥åº+产åºäº§åå¹é
ï¼èªå¨æ£ç¡® |
| | | |
| | | ## API |
| | | |
| | | ### å·¥åºä¿åæ¥å£ï¼åæ´ï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /mes/pro/route-process/create | åå»ºå·¥åº | |
| | | | PUT | /mes/pro/route-process/update | æ´æ°å·¥åº | |
| | | |
| | | **请æ±åæ°æ°å¢ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | outputItemId | Long | å¦ | 产åºäº§åç©æç¼å·ï¼ä¸ºç©ºæ¶é»è®¤ç¨å·¥åæåï¼ | |
| | | |
| | | **请æ±ç¤ºä¾ï¼æ°å¢å段ï¼ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "routeId": 7, |
| | | "processId": 10, |
| | | "sort": 1, |
| | | "keyFlag": false, |
| | | "checkFlag": false, |
| | | "backflushFlag": true, |
| | | "outputItemId": 31 |
| | | } |
| | | ``` |
| | | |
| | | ### å·¥åºæ¥è¯¢æ¥å£ï¼åæ´ï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /mes/pro/route-process/list-by-route | æå·¥èºè·¯çº¿æ¥å·¥åºå表 | |
| | | | GET | /mes/pro/route-process/get-by-route-and-process | æè·¯çº¿+å·¥åºæ¥é
ç½® | |
| | | | GET | /mes/pro/route-process/get | è·ååä¸ªå·¥åº | |
| | | |
| | | **ååºå段æ°å¢ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | outputItemId | Long | 产åºäº§åç©æç¼å· | |
| | | | outputItemCode | String | 产åºäº§åç©æç¼ç | |
| | | | outputItemName | String | 产åºäº§åç©æåç§° | |
| | | |
| | | **ååºç¤ºä¾ï¼æ°å¢å段ï¼ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "id": 1, |
| | | "routeId": 7, |
| | | "processId": 10, |
| | | "processCode": "PROC_001", |
| | | "processName": "æä¸", |
| | | "sort": 1, |
| | | "keyFlag": false, |
| | | "checkFlag": false, |
| | | "backflushFlag": true, |
| | | "outputItemId": 31, |
| | | "outputItemCode": "ITEM_20260716004", |
| | | "outputItemName": "éæ" |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | outputItemId | å·¥åºé
置表å | ç©æéæ©å¨ï¼å¯éåæåææå | |
| | | | outputItemCode | å·¥åºå表ãå·¥åºè¯¦æ
| åªè¯»å±ç¤º | |
| | | | outputItemName | å·¥åºå表ãå·¥åºè¯¦æ
| åªè¯»å±ç¤º | |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. å·¥èºè·¯çº¿ - å·¥åºé
ç½® |
| | | |
| | | å¨"æ¯å¦åå²"å¼å
³ä¹åï¼æ°å¢"产åºäº§å"éæ©å¨ï¼ |
| | | |
| | | - 使ç¨ç©æéæ©ç»ä»¶ï¼çéèå´ä¸å·¥å产åéæ©å¨ä¸è´ |
| | | - éæåå·¥åºï¼éæ©è¯¥å·¥åºäº§åºçåæå |
| | | - æåä¸éå·¥åºï¼å¯ç空ï¼é»è®¤ä¸ºå·¥åæåï¼ï¼ä¹å¯æ¾å¼éæ©æç»æå |
| | | - ä¿åæ¶å° `outputItemId` æäº¤å°å端 |
| | | |
| | | ### 2. æäº§ - 任塿°å¢ |
| | | |
| | | - å½ç¨æ·éæ©å·¥å + å·¥èºè·¯çº¿ + å·¥åºåï¼è°ç¨ `/mes/pro/route-process/get-by-route-and-process` è·åå·¥åºé
ç½® |
| | | - 妿工åºé
ç½®äº `outputItemId`ï¼èªå¨å¡«å
¥ä»»å¡çç©æåæ®µï¼å±ç¤º `outputItemName`ï¼ |
| | | - å¦æå·¥åºæªé
ç½® `outputItemId`ï¼èªå¨åéå·¥åçæå |
| | | - ç¨æ·å¯ä»¥æå¨ä¿®æ¹ä»»å¡çç©æï¼è¦çèªå¨å¡«å
¥å¼ï¼ |
| | | |
| | | ### 3. BOM é
ç½® |
| | | |
| | | å½å·¥åºé
ç½®äº `outputItemId` åï¼ |
| | | - 该工åºç BOM è®°å½ç"产å"åæ®µåºèªå¨å
³èå° `outputItemId` |
| | | - å³ BOM 表 `mes_pro_route_product_bom.product_id` åºä¸å·¥åºç `outputItemId` ä¸è´ |
| | | - **注æ**ï¼ç°æ BOM æ°æ®ç `product_id` å
¨é¨æ¯æç»æå IDï¼é
置工åºäº§åºäº§ååééæ°è°æ´ BOM |
| | | |
| | | ### 4. å·¥åºå表å±ç¤º |
| | | |
| | | å·¥åºåè¡¨ä¸æ°å¢"产åºäº§å"åï¼å±ç¤º `outputItemName`ï¼æªé
ç½®æ¶æ¾ç¤º"é»è®¤ï¼å·¥åæåï¼"ã |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | outputItemId 为空 | æäº§æ¶ä»»å¡ç itemId é»è®¤ç¨å·¥åç productIdï¼ååå
¼å®¹ï¼ | |
| | | | outputItemId ä¸ä¸ºç©º | æäº§æ¶ä»»å¡ç itemId èªå¨ç¨å·¥åºç outputItemId | |
| | | | æåä¸éå·¥åº | 建议ä¸å¡« outputItemIdï¼æå¡«æç»æåï¼ææä¸æ · | |
| | | | éæåå·¥åº | 建议填ååæåï¼è¿æ ·æ¥å·¥äº§åºæ¶å
¥çº¿è¾¹åºçæ¯åæå | |
| | | | å端æ¾å¼ä¼ itemId | å端ä¼å
使ç¨åç«¯ä¼ å
¥å¼ï¼ååå
¼å®¹ç°ææäº§é»è¾ï¼ | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - ç°æå·¥èºæ¯çº¿æ°æ®ä¸éè¦è¿ç§»ï¼`outputItemId` 为空æ¶è¡ä¸ºä¸ä¹åå®å
¨ä¸è´ |
| | | - é
ç½®äº `outputItemId` åï¼éåæ¥è°æ´è¯¥å·¥åºç BOM é
ç½®ï¼`product_id` æ¹ä¸ºåæå IDï¼ |
| | | - åæå产åºåä¼å
¥çº¿è¾¹åºï¼WIPï¼ï¼ä¸ä¸éå·¥åºæ¶èæ¶éè¿ BOM å岿æå·¥æææ£å |
| | | - æ¥å·¥é¡µé¢ç"产åç©æ"åæ®µå¯è½æ¾ç¤ºåæåï¼è¿æ¯æ£ç¡®çï¼ä¸è¦è¯¯ä»¥ä¸ºæ¯æ°æ®é误 |
| | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.process.MesProRouteProcessRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.process.MesProRouteProcessSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | |
| | | private MesProRouteProcessService routeProcessService; |
| | | @Resource |
| | | private MesProProcessService processService; |
| | | @Resource |
| | | private MesMdItemService mdItemService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建工èºè·¯çº¿å·¥åº") |
| | |
| | | list.forEach(item -> { if (item.getNextProcessId() != null) processIds.add(item.getNextProcessId()); }); |
| | | Map<Long, MesProProcessDO> processMap = convertMap( |
| | | processService.getProcessList(new ArrayList<>(processIds)), MesProProcessDO::getId); |
| | | // 2. æ¼æ¥ VO |
| | | // 2. æ¹éè·å产åºäº§åç©æä¿¡æ¯ |
| | | Set<Long> outputItemIds = convertSet(list, MesProRouteProcessDO::getOutputItemId); |
| | | outputItemIds.remove(null); |
| | | Map<Long, MesMdItemDO> outputItemMap = outputItemIds.isEmpty() |
| | | ? Collections.emptyMap() |
| | | : mdItemService.getItemMap(outputItemIds); |
| | | // 3. æ¼æ¥ VO |
| | | return BeanUtils.toBean(list, MesProRouteProcessRespVO.class, vo -> { |
| | | MapUtils.findAndThen(processMap, vo.getProcessId(), |
| | | process -> vo.setProcessCode(process.getCode()).setProcessName(process.getName())); |
| | | MapUtils.findAndThen(processMap, vo.getNextProcessId(), |
| | | nextProcess -> vo.setNextProcessName(nextProcess.getName())); |
| | | MapUtils.findAndThen(outputItemMap, vo.getOutputItemId(), |
| | | item -> vo.setOutputItemCode(item.getCode()).setOutputItemName(item.getName())); |
| | | }); |
| | | } |
| | | |
| | |
| | | @Schema(description = "æ¯å¦åå²ï¼true=æ¥å·¥æ¶æBOMèªå¨æ£æï¼false=ä¸èªå¨æ£æï¼", example = "true") |
| | | private Boolean backflushFlag; |
| | | |
| | | @Schema(description = "产åºäº§åç©æç¼å·", example = "100") |
| | | private Long outputItemId; |
| | | |
| | | @Schema(description = "产åºäº§åç©æç¼ç ") |
| | | private String outputItemCode; |
| | | |
| | | @Schema(description = "产åºäº§åç©æåç§°") |
| | | private String outputItemName; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | |
| | | @Schema(description = "æ¯å¦åå²ï¼true=æ¥å·¥æ¶æBOMèªå¨æ£æï¼false=ä¸èªå¨æ£æï¼", example = "true") |
| | | private Boolean backflushFlag; |
| | | |
| | | @Schema(description = "产åºäº§åç©æç¼å·ï¼ä¸ºç©ºæ¶é»è®¤ç¨å·¥åæåï¼", example = "100") |
| | | private Long outputItemId; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.item.MesQcTemplateItemPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.item.MesQcTemplateItemRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.item.MesQcTemplateItemSaveReqVO; |
| | | 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.md.unitmeasure.MesMdUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO; |
| | | 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.md.unitmeasure.MesMdUnitMeasureService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | |
| | | @Resource |
| | | private MesQcTemplateItemService templateItemService; |
| | | @Resource |
| | | private MesMdItemService mdItemService; |
| | | private MesMdmItemService mdmItemService; |
| | | @Resource |
| | | private MesMdUnitMeasureService unitMeasureService; |
| | | |
| | |
| | | if (list.isEmpty()) { |
| | | return Collections.emptyList(); |
| | | } |
| | | // æ¹éæ¥è¯¢ç©æ |
| | | Map<Long, MesMdItemDO> itemMap = mdItemService.getItemMap( |
| | | // æ¹éæ¥è¯¢ç©æï¼itemId åçæ¯ mdm_item_idï¼å
³è mdm_item è¡¨ï¼ |
| | | Map<Long, MesMdmItemDO> itemMap = mdmItemService.getItemMap( |
| | | convertSet(list, MesQcTemplateItemDO::getItemId)); |
| | | // æ¹éæ¥è¯¢è®¡éåä½ |
| | | Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap( |
| | | convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); |
| | | convertSet(itemMap.values(), MesMdmItemDO::getUnitMeasureId)); |
| | | // æ¼è£
VO |
| | | return BeanUtils.toBean(list, MesQcTemplateItemRespVO.class, vo -> { |
| | | findAndThen(itemMap, vo.getItemId(), item -> { |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLinePageVO; |
| | | 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.pro.task.MesProTaskService; |
| | |
| | | @PreAuthorize("@ss.hasPermission('mes:wm-return-issue:query')") |
| | | public CommonResult<PageResult<MesWmReturnIssueLineRespVO>> getReturnIssueLinePage( |
| | | @Valid MesWmReturnIssueLinePageReqVO pageReqVO) { |
| | | PageResult<MesWmReturnIssueLineDO> pageResult = issueLineService.getReturnIssueLinePage(pageReqVO); |
| | | return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); |
| | | PageResult<MesWmReturnIssueLinePageVO> pageResult = issueLineService.getReturnIssueLinePage(pageReqVO); |
| | | return success(new PageResult<>(buildRespVOListFromPageVO(pageResult.getList()), pageResult.getTotal())); |
| | | } |
| | | |
| | | @GetMapping("/list-by-issue") |
| | |
| | | |
| | | // ==================== æ¼æ¥ VO ==================== |
| | | |
| | | /** |
| | | * å页æ¥è¯¢ç»ææå»º RespVOï¼SQL å·²å
³è mdm_itemï¼code/name/specification ç´æ¥ä» PageVO åï¼ |
| | | */ |
| | | private List<MesWmReturnIssueLineRespVO> buildRespVOListFromPageVO(List<MesWmReturnIssueLinePageVO> list) { |
| | | if (CollUtil.isEmpty(list)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | // 1. è·å¾å
³èæ°æ®ï¼è®¡éåä½ãç产任å¡ï¼ |
| | | Map<Long, MesMdItemDO> itemMap = mdmItemService.getItemMap( |
| | | convertSet(list, MesWmReturnIssueLinePageVO::getItemId)); |
| | | Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap( |
| | | convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); |
| | | Map<Long, MesProTaskDO> taskMap = taskService.getTaskMap( |
| | | convertSet(list, MesWmReturnIssueLinePageVO::getTaskId)); |
| | | // 2. æå»ºç»æ |
| | | return BeanUtils.toBean(list, MesWmReturnIssueLineRespVO.class, vo -> { |
| | | // code/name/specification ä» PageVO ç´æ¥æ å°ï¼å段åä¸åéæå¨èµå¼ï¼ |
| | | list.stream() |
| | | .filter(v -> java.util.Objects.equals(v.getId(), vo.getId())) |
| | | .findFirst() |
| | | .ifPresent(pageVO -> { |
| | | vo.setItemCode(pageVO.getCode()); |
| | | vo.setItemName(pageVO.getName()); |
| | | vo.setSpecification(pageVO.getSpecification()); |
| | | }); |
| | | // 计éåä½ä»éä» itemMap è·å |
| | | MapUtils.findAndThen(itemMap, vo.getItemId(), item -> |
| | | MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), |
| | | unit -> vo.setUnitMeasureName(unit.getName()))); |
| | | MapUtils.findAndThen(taskMap, vo.getTaskId(), task -> |
| | | vo.setTaskCode(task.getCode()).setTaskName(task.getName())); |
| | | }); |
| | | } |
| | | |
| | | private List<MesWmReturnIssueLineRespVO> buildRespVOList(List<MesWmReturnIssueLineDO> list) { |
| | | if (CollUtil.isEmpty(list)) { |
| | | return Collections.emptyList(); |
| | |
| | | @NotBlank(message = "éæååç§°ä¸è½ä¸ºç©º") |
| | | private String name; |
| | | |
| | | @Schema(description = "çäº§ä»»å¡ ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "çäº§ä»»å¡ ID ä¸è½ä¸ºç©º") |
| | | @Schema(description = "çäº§ä»»å¡ IDï¼éå¿
å¡«ï¼ä¸å
³è任塿¶ä¼ 空ï¼", example = "1") |
| | | private Long taskId; |
| | | |
| | | @Schema(description = "ç产工å ID", example = "1") |
| | |
| | | */ |
| | | private Boolean backflushFlag; |
| | | /** |
| | | * 产åºäº§åç©æç¼å· |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO#getId()} |
| | | * 为空æ¶é»è®¤ç¨å·¥åçæå |
| | | */ |
| | | private Long outputItemId; |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue; |
| | | |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * MES ç产éæåè¡ å页æ¥è¯¢ VOï¼å
³è mdm_item ç code/name/specificationï¼ |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class MesWmReturnIssueLinePageVO extends MesWmReturnIssueLineDO { |
| | | |
| | | /** |
| | | * ç©æç¼ç |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO#getCode()} |
| | | */ |
| | | private String code; |
| | | |
| | | /** |
| | | * ç©æåç§° |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO#getName()} |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * è§æ ¼åå· |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO#getSpecification()} |
| | | */ |
| | | private String specification; |
| | | |
| | | } |
| | |
| | | |
| | | 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.returnissue.vo.line.MesWmReturnIssueLinePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLinePageVO; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.util.List; |
| | | |
| | |
| | | @Mapper |
| | | public interface MesWmReturnIssueLineMapper extends BaseMapperX<MesWmReturnIssueLineDO> { |
| | | |
| | | default PageResult<MesWmReturnIssueLineDO> selectPage(MesWmReturnIssueLinePageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesWmReturnIssueLineDO>() |
| | | .eqIfPresent(MesWmReturnIssueLineDO::getIssueId, reqVO.getIssueId()) |
| | | .orderByDesc(MesWmReturnIssueLineDO::getId)); |
| | | IPage<MesWmReturnIssueLinePageVO> selectPageByReqVO(Page<MesWmReturnIssueLinePageVO> page, |
| | | @Param("reqVO") MesWmReturnIssueLinePageReqVO reqVO); |
| | | |
| | | default PageResult<MesWmReturnIssueLinePageVO> selectPage(MesWmReturnIssueLinePageReqVO reqVO) { |
| | | Page<MesWmReturnIssueLinePageVO> mpPage = new Page<>(reqVO.getPageNo(), reqVO.getPageSize()); |
| | | IPage<MesWmReturnIssueLinePageVO> result = selectPageByReqVO(mpPage, reqVO); |
| | | return new PageResult<>(result.getRecords(), result.getTotal()); |
| | | } |
| | | |
| | | default List<MesWmReturnIssueLineDO> selectListByIssueId(Long issueId) { |
| | |
| | | .orderByDesc(MesWmTransactionDO::getTransactionTime)); |
| | | } |
| | | |
| | | /** |
| | | * æ¥æ¾èæçº¿è¾¹åºåºåè®°å½å¯¹åºçåå§åºåºä»åºä¿¡æ¯ |
| | | * <p> |
| | | * éè¿èæçº¿è¾¹åºç materialStockIdï¼æ¾å°é¦æ¬¡å
¥åºäºå¡ï¼INï¼ï¼ |
| | | * åéè¿ relatedTransactionId æ¾å°å
³èçåºåºäºå¡ï¼OUTï¼ï¼ |
| | | * è·åç©æä»åªä¸ªå®é
ä»åºåºåºè¿å
¥èæçº¿è¾¹åºçã |
| | | * |
| | | * @param materialStockId èæçº¿è¾¹åºåºåè®°å½ ID |
| | | * @return åå§åºåºäºå¡ï¼å
å« warehouseId/locationId/areaIdï¼ï¼ä¸åå¨è¿å null |
| | | */ |
| | | default MesWmTransactionDO selectOriginalOutTransaction(Long materialStockId) { |
| | | // 1. æ¾å°è¯¥åºåè®°å½ç馿¬¡å
¥åºäºå¡ |
| | | MesWmTransactionDO firstInTransaction = selectOne(new LambdaQueryWrapperX<MesWmTransactionDO>() |
| | | .eq(MesWmTransactionDO::getMaterialStockId, materialStockId) |
| | | .eq(MesWmTransactionDO::getType, 1) // IN |
| | | .orderByAsc(MesWmTransactionDO::getId) |
| | | .last("LIMIT 1")); |
| | | if (firstInTransaction == null || firstInTransaction.getRelatedTransactionId() == null) { |
| | | return null; |
| | | } |
| | | // 2. éè¿ relatedTransactionId æ¾å°åå§åºåºäºå¡ |
| | | return selectById(firstInTransaction.getRelatedTransactionId()); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; |
| | | import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; |
| | | import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; |
| | | import jakarta.annotation.Resource; |
| | |
| | | @Resource |
| | | private MesProRouteService routeService; |
| | | @Resource |
| | | @Lazy |
| | | private MesProRouteProcessService routeProcessService; |
| | | @Resource |
| | | private MesMdAutoCodeRecordService autoCodeRecordService; |
| | | |
| | | @Override |
| | |
| | | workstationService.validateWorkstationExists(createReqVO.getWorkstationId()); |
| | | routeService.validateRouteExists(createReqVO.getRouteId()); |
| | | processService.validateProcessExistsAndEnable(createReqVO.getProcessId()); |
| | | MesMdItemDO item = itemService.validateItemExists(createReqVO.getItemId()); |
| | | |
| | | // 2.1 æå»ºä»»å¡ DOï¼èªå¨å¡«å
客æ·ä¿¡æ¯ |
| | | // 2. èªå¨ç¡®å® itemIdï¼ä¼å
åç«¯ä¼ å
¥ â å·¥èºè·¯çº¿å·¥åºç产åºäº§å â å·¥åæå |
| | | Long itemId = createReqVO.getItemId(); |
| | | if (itemId == null) { |
| | | MesProRouteProcessDO routeProcess = routeProcessService |
| | | .getRouteProcessByRouteIdAndProcessId(createReqVO.getRouteId(), createReqVO.getProcessId()); |
| | | if (routeProcess != null && routeProcess.getOutputItemId() != null) { |
| | | itemId = routeProcess.getOutputItemId(); |
| | | } else { |
| | | itemId = workOrder.getProductId(); |
| | | } |
| | | } |
| | | MesMdItemDO item = itemService.validateItemExists(itemId); |
| | | |
| | | // 3.1 æå»ºä»»å¡ DOï¼èªå¨å¡«å
客æ·ä¿¡æ¯ |
| | | MesProTaskDO task = BeanUtils.toBean(createReqVO, MesProTaskDO.class) |
| | | .setItemId(itemId) // ç¡®ä¿ä½¿ç¨è®¡ç®åç itemId |
| | | .setName(buildTaskName(item, createReqVO.getQuantity())) |
| | | .setCode(autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.PRO_TASK_CODE.getCode())) |
| | | .setStatus(MesProTaskStatusEnum.PREPARE.getStatus()); |
| | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.item.MesQcTemplateItemPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.qc.template.vo.item.MesQcTemplateItemSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.qc.template.MesQcTemplateItemMapper; |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | @Resource |
| | | @Lazy |
| | | private MesQcTemplateService templateService; |
| | | @Resource |
| | | private MesMdItemService mesMdItemService; |
| | | |
| | | @Override |
| | | public Long createTemplateItem(MesQcTemplateItemSaveReqVO createReqVO) { |
| | |
| | | @Override |
| | | public MesQcTemplateItemDO getRequiredTemplateByItemIdAndType(Long itemId, Integer qcType) { |
| | | // 1. æ¥åº itemId å
³èçææ templateItem |
| | | List<MesQcTemplateItemDO> templateItems = templateItemMapper.selectListByItemId(itemId); |
| | | MesMdItemDO item1 = mesMdItemService.getItem(itemId); |
| | | List<MesQcTemplateItemDO> templateItems = templateItemMapper.selectListByItemId(item1.getMdmItemId()); |
| | | if (CollUtil.isEmpty(templateItems)) { |
| | | throw exception(QC_NO_TEMPLATE); |
| | | } |
| | |
| | | Long batchId, String batchCode, Long vendorId, LocalDateTime receiptTime); |
| | | |
| | | /** |
| | | * æç»å鮿¥æ¾åºåè®°å½ï¼åªæ¥ä¸åå»ºï¼ |
| | | * |
| | | * @param itemId ç©æç¼å· |
| | | * @param warehouseId ä»åºç¼å· |
| | | * @param locationId åºåºç¼å· |
| | | * @param areaId åºä½ç¼å· |
| | | * @param batchId æ¹æ¬¡ç¼å· |
| | | * @param vendorId ä¾åºåç¼å· |
| | | * @return åºåè®°å½ï¼ä¸åå¨è¿å nullï¼ |
| | | */ |
| | | MesWmMaterialStockDO getMaterialStockByCompositeKey(Long itemId, Long warehouseId, Long locationId, Long areaId, |
| | | Long batchId, Long vendorId); |
| | | |
| | | /** |
| | | * æ´æ°åºåæ°é |
| | | * |
| | | * @param id åºåè®°å½ç¼å· |
| | |
| | | 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.MesWmMaterialStockPageReqVO; |
| | | 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.md.item.MesMdItemTypeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; |
| | | 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.md.item.MesMdItemTypeService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; |
| | |
| | | |
| | | @Resource |
| | | private MesMdmItemService mdmItemService; |
| | | @Resource |
| | | private MesMdItemService mdItemService; |
| | | @Resource |
| | | private MesMdItemTypeService itemTypeService; |
| | | @Resource |
| | |
| | | List<MesMdItemTypeDO> children = itemTypeService.getItemTypeChildrenList(pageReqVO.getItemTypeId()); |
| | | itemTypeIds.addAll(convertSet(children, MesMdItemTypeDO::getId)); |
| | | } |
| | | // 1.2 è§£æ itemId |
| | | // 1.2 è§£æ itemIdï¼åç«¯ä¼ çæ¯ mes_md_item.idï¼åºå表åçæ¯ mdm_item_idï¼éè¦è½¬æ¢ |
| | | Set<Long> itemIds = null; |
| | | if (pageReqVO.getItemId() != null) { |
| | | itemIds = SetUtils.asSet(pageReqVO.getItemId()); |
| | | MesMdItemDO item = mdItemService.getItem(pageReqVO.getItemId()); |
| | | if (item != null && item.getMdmItemId() != null) { |
| | | itemIds = SetUtils.asSet(item.getMdmItemId()); |
| | | } |
| | | } |
| | | // 1.3 è§£æ virtualFilterï¼è½¬æ¢ä¸ºèæä» warehouseId |
| | | Long virtualWarehouseId = null; |
| | |
| | | .frozen(false) |
| | | .build(); |
| | | materialStockMapper.insert(newStock); |
| | | return newStock; |
| | | // 3. éæ°æ¥è¯¢ï¼ç¡®ä¿æ¿å°æ°æ®åºçæç宿´è®°å½ï¼idãcreateTime çï¼ |
| | | MesWmMaterialStockDO inserted = materialStockMapper.selectById(newStock.getId()); |
| | | return inserted != null ? inserted : newStock; |
| | | } |
| | | |
| | | @Override |
| | | public MesWmMaterialStockDO getMaterialStockByCompositeKey(Long itemId, Long warehouseId, Long locationId, Long areaId, |
| | | Long batchId, Long vendorId) { |
| | | return materialStockMapper.selectByCompositeKey(itemId, warehouseId, locationId, areaId, batchId, vendorId); |
| | | } |
| | | |
| | | @Override |
| | |
| | | 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.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; |
| | |
| | | private MesWmWarehouseAreaService warehouseAreaService; |
| | | @Resource |
| | | private MesWmMaterialStockService materialStockService; |
| | | @Resource |
| | | private MesMdItemService mesMdItemService; |
| | | |
| | | @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); |
| | | } |
| | |
| | | throw exception(WM_PRODUCT_ISSUE_STATUS_INVALID); |
| | | } |
| | | // æ ¡éªç©æå¹é
ï¼æç» itemId å¿
é¡»ä¸è¡ itemId ä¸è´ï¼ |
| | | validateDetailItemMatch(reqVO.getItemId(), line.getItemId()); |
| | | validateDetailItemMatch(reqVO.getItemId(), item.getMdmItemId()); |
| | | // æ ¡éªä»åºãåºåºãåºä½çå
³èå
³ç³» |
| | | warehouseAreaService.validateWarehouseAreaExists( |
| | | reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId()); |
| | |
| | | Long outTransactionId = wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO() |
| | | .setType(MesWmTransactionTypeEnum.OUT.getType()).setItemId(detail.getItemId()) |
| | | .setQuantity(detail.getQuantity().negate()) // åºååå° |
| | | .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) |
| | | .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()).setMaterialStockId(detail.getMaterialStockId()) |
| | | .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) |
| | | .setBizType(MesBizTypeConstants.WM_ISSUE).setBizId(issue.getId()) |
| | | .setBizCode(issue.getCode()).setBizLineId(detail.getLineId())); |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.detail.MesWmReturnIssueDetailSaveReqVO; |
| | | 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.mysql.wm.returnissue.MesWmReturnIssueDetailMapper; |
| | | import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; |
| | |
| | | if (ObjUtil.notEqual(line.getItemId(), reqVO.getItemId())) { |
| | | throw exception(WM_RETURN_ISSUE_DETAIL_ITEM_MISMATCH); |
| | | } |
| | | // æ ¡éªä»åºãåºåºãåºä½çå
³èå
³ç³» |
| | | // æ ¡éªä¸æ¶ç®æ ä»åºãåºåºãåºä½çå
³èå
³ç³» |
| | | warehouseAreaService.validateWarehouseAreaExists( |
| | | reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId()); |
| | | // æ ¡éªåºä½ç©æ/æ¹æ¬¡æ··æ¾è§å |
| | | // æ ¡éªä¸æ¶ç®æ åºä½çç©æ/æ¹æ¬¡æ··æ¾è§å |
| | | materialStockService.checkAreaMixingRule(reqVO.getAreaId(), reqVO.getItemId(), reqVO.getBatchId()); |
| | | // æ ¡éªåºåè®°å½ |
| | | materialStockService.validateSelectedStock( |
| | | reqVO.getMaterialStockId(), reqVO.getItemId(), reqVO.getBatchId(), reqVO.getBatchCode(), |
| | | reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId(), reqVO.getQuantity()); |
| | | // æ ¡éªæ¥æºåºåè®°å½ï¼materialStockId æåèæçº¿è¾¹åºï¼warehouseId æ¯ä¸æ¶ç®æ ä»åºï¼ä¸¤è
ä»åºä¸åæ¯æ£å¸¸çï¼ |
| | | if (reqVO.getMaterialStockId() != null) { |
| | | MesWmMaterialStockDO stock = materialStockService.getMaterialStock(reqVO.getMaterialStockId()); |
| | | if (stock == null) { |
| | | throw exception(WM_MATERIAL_STOCK_NOT_EXISTS); |
| | | } |
| | | // æ ¡éªç©æåæ¹æ¬¡ä¸è´ |
| | | if (ObjUtil.notEqual(stock.getItemId(), reqVO.getItemId())) { |
| | | throw exception(WM_MATERIAL_STOCK_SELECTION_MISMATCH); |
| | | } |
| | | // æ ¡éªåºåæ°éå
è¶³ |
| | | if (reqVO.getQuantity() != null && stock.getQuantity() != null |
| | | && stock.getQuantity().compareTo(reqVO.getQuantity()) < 0) { |
| | | throw exception(WM_MATERIAL_STOCK_INSUFFICIENT); |
| | | } |
| | | } |
| | | // æ ¡éªæç»æ»æ°éä¸è¶
è¿è¡æ°éï¼æé¤èªèº«ï¼ |
| | | validateDetailQuantityNotExceed(reqVO.getLineId(), reqVO.getQuantity(), reqVO.getId(), line); |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.line.MesWmReturnIssueLinePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.line.MesWmReturnIssueLineSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLinePageVO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.math.BigDecimal; |
| | |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return ç产éæåè¡å页 |
| | | */ |
| | | PageResult<MesWmReturnIssueLineDO> getReturnIssueLinePage(MesWmReturnIssueLinePageReqVO pageReqVO); |
| | | PageResult<MesWmReturnIssueLinePageVO> getReturnIssueLinePage(MesWmReturnIssueLinePageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * æ ¹æ®éæå ID è·åè¡å表 |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnissue.vo.line.MesWmReturnIssueLineSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLinePageVO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnissue.MesWmReturnIssueLineMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnIssueStatusEnum; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<MesWmReturnIssueLineDO> getReturnIssueLinePage(MesWmReturnIssueLinePageReqVO pageReqVO) { |
| | | public PageResult<MesWmReturnIssueLinePageVO> getReturnIssueLinePage(MesWmReturnIssueLinePageReqVO pageReqVO) { |
| | | return issueLineMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | |
| | | 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.dal.dataobject.wm.transaction.MesWmTransactionDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.transaction.MesWmTransactionMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | private MesWmWarehouseLocationService locationService; |
| | | @Resource |
| | | private MesWmWarehouseAreaService areaService; |
| | | @Resource |
| | | private MesWmTransactionMapper transactionMapper; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | // 1. æ ¡éªå
³èæ°æ® |
| | | validateReturnIssueSaveData(createReqVO); |
| | | |
| | | // 2. ä» task èªå¨å¸¦å
¥ workOrderId å workstationId |
| | | MesProTaskDO task = taskService.validateTaskExists(createReqVO.getTaskId()); |
| | | if (createReqVO.getWorkOrderId() == null) { |
| | | createReqVO.setWorkOrderId(task.getWorkOrderId()); |
| | | } |
| | | if (createReqVO.getWorkstationId() == null) { |
| | | createReqVO.setWorkstationId(task.getWorkstationId()); |
| | | // 2. ä» task èªå¨å¸¦å
¥ workOrderId å workstationIdï¼taskId éå¿
å¡«ï¼ |
| | | if (createReqVO.getTaskId() != null) { |
| | | MesProTaskDO task = taskService.validateTaskExists(createReqVO.getTaskId()); |
| | | if (createReqVO.getWorkOrderId() == null) { |
| | | createReqVO.setWorkOrderId(task.getWorkOrderId()); |
| | | } |
| | | if (createReqVO.getWorkstationId() == null) { |
| | | createReqVO.setWorkstationId(task.getWorkstationId()); |
| | | } |
| | | } |
| | | |
| | | // 3. æå
¥ä¸»è¡¨ |
| | |
| | | // 1.2 æ ¡éªå
³èæ°æ® |
| | | validateReturnIssueSaveData(updateReqVO); |
| | | |
| | | // 2. ä» task èªå¨å¸¦å
¥ workOrderId å workstationId |
| | | MesProTaskDO task = taskService.validateTaskExists(updateReqVO.getTaskId()); |
| | | if (updateReqVO.getWorkOrderId() == null) { |
| | | updateReqVO.setWorkOrderId(task.getWorkOrderId()); |
| | | } |
| | | if (updateReqVO.getWorkstationId() == null) { |
| | | updateReqVO.setWorkstationId(task.getWorkstationId()); |
| | | // 2. ä» task èªå¨å¸¦å
¥ workOrderId å workstationIdï¼taskId éå¿
å¡«ï¼ |
| | | if (updateReqVO.getTaskId() != null) { |
| | | MesProTaskDO task = taskService.validateTaskExists(updateReqVO.getTaskId()); |
| | | if (updateReqVO.getWorkOrderId() == null) { |
| | | updateReqVO.setWorkOrderId(task.getWorkOrderId()); |
| | | } |
| | | if (updateReqVO.getWorkstationId() == null) { |
| | | updateReqVO.setWorkstationId(task.getWorkstationId()); |
| | | } |
| | | } |
| | | |
| | | // 3. æ´æ°ä¸»è¡¨ |
| | |
| | | MesWmWarehouseLocationDO virtualLocation = locationService.getWarehouseLocationByCode(MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION); |
| | | MesWmWarehouseAreaDO virtualArea = areaService.getWarehouseAreaByCode(MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA); |
| | | |
| | | // 2. éåæç»ï¼æ¯æ¡æç»äº§ç OUTï¼èæçº¿è¾¹åºæ£åï¼+ INï¼å®é
ä»åºå¢å ï¼ |
| | | // 2. éåæç»ï¼æ¯æ¡æç»äº§ç OUTï¼èæçº¿è¾¹åºæ£åï¼+ INï¼ä¸æ¶ç®æ ä»åºå¢å ï¼ |
| | | List<MesWmReturnIssueDetailDO> details = issueDetailService.getReturnIssueDetailListByIssueId(issue.getId()); |
| | | for (MesWmReturnIssueDetailDO detail : details) { |
| | | // 2.1 å
ä»èæçº¿è¾¹åºåºåºï¼åºååå°ï¼ |
| | |
| | | .setQuantity(detail.getQuantity().negate()) // åºååå° |
| | | .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) |
| | | .setWarehouseId(virtualWarehouse.getId()).setLocationId(virtualLocation.getId()).setAreaId(virtualArea.getId()) |
| | | .setMaterialStockId(detail.getMaterialStockId()) // æå®èæçº¿è¾¹åºåºåè®°å½ |
| | | .setCheckFlag(false) // 线边åºå
许è´åºå |
| | | .setBizType(MesBizTypeConstants.WM_RETURN_ISSUE).setBizId(issue.getId()) |
| | | .setBizCode(issue.getCode()).setBizLineId(detail.getLineId())); |
| | | // 2.2 åå
¥å®é
ä»åºï¼åºåå¢å ï¼ |
| | | |
| | | // 2.2 ç¡®å®ä¸æ¶ç®æ ä»åºï¼detail ç warehouseId/locationId/areaId æ¯ä¸æ¶ç®æ ï¼å®é
ä»åºï¼ |
| | | // 妿å端ä»ä¼ äºèæçº¿è¾¹åºï¼å
¼å®¹æ§æ°æ®ï¼ï¼åéè¿äºå¡æµæ°´åæ¥åå§ä»åº |
| | | Long targetWarehouseId = detail.getWarehouseId(); |
| | | Long targetLocationId = detail.getLocationId(); |
| | | Long targetAreaId = detail.getAreaId(); |
| | | if (virtualWarehouse.getId().equals(targetWarehouseId) && detail.getMaterialStockId() != null) { |
| | | MesWmTransactionDO originalOutTx = transactionMapper.selectOriginalOutTransaction(detail.getMaterialStockId()); |
| | | if (originalOutTx != null) { |
| | | targetWarehouseId = originalOutTx.getWarehouseId(); |
| | | targetLocationId = originalOutTx.getLocationId(); |
| | | targetAreaId = originalOutTx.getAreaId(); |
| | | } |
| | | } |
| | | |
| | | // 2.3 å
¥ä¸æ¶ç®æ ä»åºï¼åºåå¢å ï¼ |
| | | wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO() |
| | | .setType(MesWmTransactionTypeEnum.IN.getType()).setItemId(detail.getItemId()) |
| | | .setQuantity(detail.getQuantity()) // åºåå¢å ï¼éæåä»ï¼ |
| | | .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) |
| | | .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) |
| | | .setWarehouseId(targetWarehouseId).setLocationId(targetLocationId).setAreaId(targetAreaId) |
| | | .setBizType(MesBizTypeConstants.WM_RETURN_ISSUE).setBizId(issue.getId()) |
| | | .setBizCode(issue.getCode()).setBizLineId(detail.getLineId()) |
| | | .setRelatedTransactionId(outTransactionId)); // å
³èåºåºäºå¡ |
| | |
| | | */ |
| | | private void validateReturnIssueSaveData(MesWmReturnIssueSaveReqVO reqVO) { |
| | | validateCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | // æ ¡éª task åå¨ |
| | | MesProTaskDO task = taskService.validateTaskExists(reqVO.getTaskId()); |
| | | // æ ¡éª task å
³èçå·¥å已确认 |
| | | Long workOrderId = reqVO.getWorkOrderId() != null ? reqVO.getWorkOrderId() : task.getWorkOrderId(); |
| | | if (workOrderId != null) { |
| | | workOrderService.validateWorkOrderConfirmed(workOrderId); |
| | | // æ ¡éª task åå¨ï¼taskId éå¿
å¡«ï¼ä¼ äºææ ¡éªï¼ |
| | | if (reqVO.getTaskId() != null) { |
| | | MesProTaskDO task = taskService.validateTaskExists(reqVO.getTaskId()); |
| | | // æ ¡éª task å
³èçå·¥å已确认 |
| | | Long workOrderId = reqVO.getWorkOrderId() != null ? reqVO.getWorkOrderId() : task.getWorkOrderId(); |
| | | if (workOrderId != null) { |
| | | workOrderService.validateWorkOrderConfirmed(workOrderId); |
| | | } |
| | | } else if (reqVO.getWorkOrderId() != null) { |
| | | // æ²¡ä¼ taskId ä½ä¼ äº workOrderIdï¼æ ¡éªå·¥å已确认 |
| | | workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); |
| | | } |
| | | if (reqVO.getWorkstationId() != null) { |
| | | workstationService.validateWorkstationExistsAndEnable(reqVO.getWorkstationId()); |
| | |
| | | // 1.5 å
³èäºå¡æ ¡éª |
| | | checkRelatedTransaction(reqDTO); |
| | | |
| | | // 2.1 è·åæå建åºåè®°å½ï¼å¦æä¼ å
¥äº materialStockId åç´æ¥ä½¿ç¨ï¼é¿å
éæ°å¹é
ï¼ |
| | | // 2.1 è·ååºåè®°å½ |
| | | MesWmMaterialStockDO materialStock; |
| | | MesWmTransactionTypeEnum transactionType = MesWmTransactionTypeEnum.valueOf(reqDTO.getType()); |
| | | boolean isInbound = transactionType != null && transactionType.isInbound(); |
| | | if (reqDTO.getMaterialStockId() != null) { |
| | | // ä¼ å
¥äº materialStockIdï¼ç´æ¥ä½¿ç¨ |
| | | materialStock = materialStockService.getMaterialStock(reqDTO.getMaterialStockId()); |
| | | if (materialStock == null) { |
| | | throw exception(WM_MATERIAL_STOCK_NOT_EXISTS); |
| | |
| | | || ObjUtil.notEqual(materialStock.getAreaId(), reqDTO.getAreaId())) { |
| | | throw exception(WM_MATERIAL_STOCK_SELECTION_MISMATCH); |
| | | } |
| | | } else { |
| | | } else if (isInbound) { |
| | | // å
¥åºäºå¡ï¼æ¾ä¸å°åèªå¨å建åºåè®°å½ |
| | | materialStock = materialStockService.getOrCreateMaterialStock( |
| | | reqDTO.getItemId(), reqDTO.getWarehouseId(), reqDTO.getLocationId(), reqDTO.getAreaId(), |
| | | reqDTO.getBatchId(), reqDTO.getBatchCode(), reqDTO.getVendorId(), reqDTO.getReceiptTime()); |
| | | } else { |
| | | // åºåºäºå¡ï¼åºåè®°å½å¿
须已åå¨ï¼ä¸å
许èªå¨å建 |
| | | materialStock = materialStockService.getMaterialStockByCompositeKey( |
| | | reqDTO.getItemId(), reqDTO.getWarehouseId(), reqDTO.getLocationId(), reqDTO.getAreaId(), |
| | | reqDTO.getBatchId(), reqDTO.getVendorId()); |
| | | if (materialStock == null) { |
| | | throw exception(WM_MATERIAL_STOCK_NOT_EXISTS); |
| | | } |
| | | } |
| | | if (materialStock == null || materialStock.getId() == null) { |
| | | throw exception(WM_MATERIAL_STOCK_NOT_EXISTS); |
| | | } |
| | | // 2.2 å»ç»æ ¡éªï¼ä»åºãåºåºãåºä½ãåºåè®°å½ï¼ |
| | | checkFrozen(reqDTO, materialStock); |
| | |
| | | ppl.item_id AS itemId, |
| | | ppl.quantity AS quantity, |
| | | NULL AS vendorId, |
| | | pp.work_order_id AS workOrderId, |
| | | pp.workstation_id AS workstationId, |
| | | pp.task_id AS taskId, |
| | | pf.work_order_id AS workOrderId, |
| | | pf.workstation_id AS workstationId, |
| | | pf.task_id AS taskId, |
| | | NULL AS clientId |
| | | FROM mes_wm_product_produce_line ppl |
| | | JOIN mes_wm_product_produce pp ON ppl.produce_id = pp.id |
| | |
| | | NULL AS vendorId, |
| | | ri.work_order_id AS workOrderId, |
| | | ri.workstation_id AS workstationId, |
| | | NULL AS taskId, |
| | | ri.task_id AS taskId, |
| | | NULL AS clientId |
| | | FROM mes_wm_return_issue ri |
| | | JOIN mes_wm_return_issue_line ril ON ri.id = ril.issue_id |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="cn.iocoder.yudao.module.mes.dal.mysql.wm.returnissue.MesWmReturnIssueLineMapper"> |
| | | |
| | | <select id="selectPageByReqVO" resultType="cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLinePageVO"> |
| | | SELECT t1.*, t2.code, t2.name, t2.specification |
| | | FROM mes_wm_return_issue_line t1 |
| | | LEFT JOIN mdm_item t2 ON t1.item_id = t2.id AND t2.deleted = 0 |
| | | WHERE t1.deleted = 0 |
| | | <if test="reqVO.issueId != null"> |
| | | AND t1.issue_id = #{reqVO.issueId} |
| | | </if> |
| | | ORDER BY t1.id DESC |
| | | </select> |
| | | |
| | | </mapper> |