1.仓储物流-批次号优化覆盖数据
2.仓储物流-新增自定义出入库流水查询
3.采购管理-清理无用代码和表
4.销售管理-清理无用代码和表
5.销售流程状态字段数据回游
已添加18个文件
已重命名1个文件
已修改47个文件
已删除20个文件
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ERP 客æ·ç¸å
³æä»¶å é¤èæ¬ |
| | | # è¯·å¨ PowerShell 䏿§è¡ä»¥ä¸å½ä»¤ï¼ |
| | | |
| | | Remove-Item -Force "yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/ErpCustomerController.java" |
| | | Remove-Item -Recurse -Force "yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/sale/vo/customer" |
| | | Remove-Item -Force "yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpCustomerService.java" |
| | | Remove-Item -Force "yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpCustomerServiceImpl.java" |
| | | Remove-Item -Force "yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/sale/ErpCustomerDO.java" |
| | | Remove-Item -Force "yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/sale/ErpCustomerMapper.java" |
| | | Remove-Item -Force "yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpSaleOrderOutStatusEnum.java" |
| | | |
| | | Write-Host "ERP Customer files deleted successfully!" |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | @echo off |
| | | chcp 65001 |
| | | echo æ£å¨å é¤ ERP éè´ç³è¯·ç¸å
³ä»£ç æä»¶... |
| | | |
| | | REM å é¤ Controller |
| | | del /f "yudao-module-erp\src\main\java\cn\iocoder\yudao\module\erp\controller\admin\purchase\ErpPurchaseRequestController.java" |
| | | |
| | | REM å é¤ VO ç®å½ |
| | | rd /s /q "yudao-module-erp\src\main\java\cn\iocoder\yudao\module\erp\controller\admin\purchase\vo\request" |
| | | |
| | | REM å é¤ Service |
| | | del /f "yudao-module-erp\src\main\java\cn\iocoder\yudao\module\erp\service\purchase\ErpPurchaseRequestService.java" |
| | | del /f "yudao-module-erp\src\main\java\cn\iocoder\yudao\module\erp\service\purchase\ErpPurchaseRequestServiceImpl.java" |
| | | |
| | | REM å é¤ Listener |
| | | del /f "yudao-module-erp\src\main\java\cn\iocoder\yudao\module\erp\service\purchase\listener\ErpPurchaseRequestStatusListener.java" |
| | | |
| | | REM å é¤ DO |
| | | del /f "yudao-module-erp\src\main\java\cn\iocoder\yudao\module\erp\dal\dataobject\purchase\ErpPurchaseRequestDO.java" |
| | | del /f "yudao-module-erp\src\main\java\cn\iocoder\yudao\module\erp\dal\dataobject\purchase\ErpPurchaseRequestItemDO.java" |
| | | |
| | | REM å é¤ Mapper |
| | | del /f "yudao-module-erp\src\main\java\cn\iocoder\yudao\module\erp\dal\mysql\purchase\ErpPurchaseRequestMapper.java" |
| | | del /f "yudao-module-erp\src\main\java\cn\iocoder\yudao\module\erp\dal\mysql\purchase\ErpPurchaseRequestItemMapper.java" |
| | | |
| | | REM å é¤ Enum |
| | | del /f "yudao-module-erp\src\main\java\cn\iocoder\yudao\module\erp\enums\ErpPurchaseRequestStatusEnum.java" |
| | | |
| | | echo æä»¶å é¤å®æï¼ |
| | | pause |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ERP éå®è®¢ååºåºç¶æå®æ¶åé¦ - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ERP éå®è®¢åå表页 |
| | | - ERP éå®è®¢å详æ
页 |
| | | - MES åè´§éç¥å管ç页 |
| | | - MES éå®åºåºå管ç页 |
| | | |
| | | ## ä¸å¡æµç¨ä¸ç¶æåå |
| | | |
| | | ### ç¶ææä¸¾è¯´æ |
| | | |
| | | | ç¶æå¼ | ç¶æåç§° | 说æ | |
| | | |--------|----------|------| |
| | | | 0 | æªåºåº | éå®è®¢ååå§ç¶æï¼æªå¼å§åºåºæµç¨ | |
| | | | 1 | å·²é¢ç | åè´§éç¥åå®¡æ ¸éè¿ï¼åºåå·²é¢ç | |
| | | | 2 | é¨ååºåº | éå®åºåºåå·²æ£è´§/å ç¨åºå | |
| | | | 3 | å
¨é¨åºåº | éå®åºåºå已宿åºåº | |
| | | |
| | | ### ç¶æååæ¶æº |
| | | |
| | | | æ¥éª¤ | æä½ | ç¶æåå | 触åä½ç½® | |
| | | |------|------|----------|----------| |
| | | | 1 | åè´§éç¥åå®¡æ ¸éè¿ | 0 â 1ï¼æªåºåº â å·²é¢çï¼ | MES åè´§éç¥åæäº¤å®¡æ ¸ | |
| | | | 2 | éå®åºåºåæ£è´§ | 1 â 2ï¼å·²é¢ç â é¨ååºåºï¼ | MES éå®åºåºåæ£è´§ç¡®è®¤ | |
| | | | 3 | éå®åºåºå宿 | 2 â 3ï¼é¨ååºåº â å
¨é¨åºåºï¼ | MES éå®åºåºå宿åºåº | |
| | | |
| | | ## API åæ´ |
| | | |
| | | ### æ°å¢ API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | PUT | /rpc-api/erp/sale-order/updateOrderOutStatusTo | æ´æ°éå®è®¢ååºåºç¶æä¸ºæå®å¼ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | orderId | Long | æ¯ | éå®è®¢åç¼å· | |
| | | | outStatus | Integer | æ¯ | åºåºç¶æï¼0-3ï¼ | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": true, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ### ååºåæ®µåæ´ |
| | | |
| | | **ErpSaleOrderRespDTO æ°å¢å段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | outStatus | Integer | åºåºç¶æï¼0-3ï¼ | |
| | | | outCount | BigDecimal | å·²åºåºæ°é | |
| | | |
| | | **ErpSaleOrderItemRespDTO æ°å¢å段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | outCount | BigDecimal | å·²åºåºæ°é | |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | ### éå®è®¢åå表 |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | åºåºç¶æ | å表 | ä½¿ç¨ Tag æ ç¾å±ç¤ºï¼ä¸åç¶æä¸åé¢è² | |
| | | | å·²åºåºæ°é | å表 | æ ¼å¼ï¼`å·²åºåºæ°é/æ»æ°é` | |
| | | |
| | | ### éå®è®¢å详æ
|
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | åºåºç¶æ | åºæ¬ä¿¡æ¯åº | ä½¿ç¨ Tag æ ç¾å±ç¤º | |
| | | | å·²åºåºæ°é | åºæ¬ä¿¡æ¯åº | æ°å¼å±ç¤º | |
| | | | 订åæç»-å·²åºåºæ°é | æç»è¡¨æ ¼ | æ¯è¡æ¾ç¤ºè¯¥é¡¹çå·²åºåºæ°é | |
| | | |
| | | ### åºåºç¶æé¢è²å»ºè®® |
| | | |
| | | | ç¶æ | é¢è² | Tag ç±»å | |
| | | |------|------|----------| |
| | | | æªåºåº | ç°è² | info | |
| | | | å·²é¢ç | èè² | primary | |
| | | | é¨ååºåº | æ©è² | warning | |
| | | | å
¨é¨åºåº | ç»¿è² | success | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | åè´§éç¥åå®¡æ ¸ | å®¡æ ¸éè¿æ¶èªå¨æ´æ°å
³èéå®è®¢åç¶æä¸º"å·²é¢ç" | |
| | | | éå®åºåºåæ£è´§ | æ£è´§ç¡®è®¤æ¶èªå¨æ´æ°å
³èéå®è®¢åç¶æä¸º"é¨ååºåº" | |
| | | | éå®åºåºå宿 | åºåºå®ææ¶èªå¨æ´æ°å
³èéå®è®¢åç¶æä¸º"å
¨é¨åºåº"ï¼å¹¶ç´¯è®¡åºåºæ°é | |
| | | | åæ¶åè´§éç¥å | 妿忶ï¼éè¦å°éå®è®¢åç¶æåé | |
| | | | åæ¶éå®åºåºå | 妿忶ï¼éè¦å°éå®è®¢åç¶æåé | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **ç¶æå®æ¶æ§**ï¼MES 模åæä½åç«å³åå ERP éå®è®¢åç¶æï¼åç«¯å·æ°å³å¯çå°ææ°ç¶æ |
| | | 2. **å¤åæ®å
³è**ï¼ä¸ä¸ªéå®è®¢åå¯è½å¯¹åºå¤ä¸ªåè´§éç¥ååéå®åºåºåï¼ç¶æä¼ææµç¨æ¨è¿ |
| | | 3. **ç¶æåé**ï¼ç®åä»
å®ç°ç¶ææ¨è¿ï¼æä¸æ¯æç¶æåéï¼å¦åæ¶åç¶ææ¢å¤ï¼ |
| | | 4. **åºåºæ°é累计**ï¼åªæéå®åºåºåå®ææ¶æä¼ç´¯è®¡åºåºæ°éï¼æ£è´§é¶æ®µä»
æ´æ°ç¶æ |
| | | 5. **å¹¶åæ§å¶**ï¼ç¶ææ´æ°æäºå¡ä¿è¯ï¼é¿å
å¹¶åæ´æ°å¯¼è´ç¶æä¸ä¸è´ |
| | |
| | | # ç©æåç±»ç»ä¸ä½¿ç¨ mes_md_item_type - å端èè°æ¹æ¡ |
| | | # ç©æåç±»ç»ä¸ä½¿ç¨ mdm_item_category - å端èè°æ¹æ¡ |
| | | |
| | | ## åæ´è¯´æ |
| | | |
| | | ç©æåç±»å·²ä» MES 模åè¿ç§»å° MDM 模åç»ä¸ç®¡çï¼ |
| | | - å MES å类表 `mes_md_item_type` ä¿çä½ä¸åç»´æ¤ |
| | | - ç»ä¸ä½¿ç¨ MDM å类表 `mdm_item_category` |
| | | - MES 模åéè¿å
¼å®¹å±è¯»å MDM åç±»æ°æ® |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - MDM ç©æç®¡ç页é¢ï¼æ°å¢/ç¼è¾ç©æï¼ |
| | | - MES ç©æç®¡ç页é¢ï¼æ°å¢/ç¼è¾ç©æï¼ |
| | | - MDM ç©æå类管ç页é¢ï¼ä¸»è¦ç»´æ¤å
¥å£ï¼ |
| | | - MDM ç©æç®¡ç页é¢ï¼æ°å¢/ç¼è¾ç©æéæ©åç±»ï¼ |
| | | - MES ç©æç®¡ç页é¢ï¼æ°å¢/ç¼è¾ç©æéæ©åç±»ï¼ |
| | | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | 1. ç©æåç±»ç»ä¸ä½¿ç¨ `mes_md_item_type` 表ï¼MDM å MES 模åå
±ç¨åä¸å¥åç±»æ°æ® |
| | | 2. ç©æç±»ååæ®µ `itemType` ç¨äºå¿«ééæ©ï¼1åæã2åæåã3æåã4è¾
æ |
| | | 3. å½éæ© `categoryId` æ¶ï¼ç´æ¥å
³èåç±» IDï¼å½åªéæ© `itemType` æ¶ï¼ç³»ç»èªå¨å¹é
对åºåç§°çåç±» |
| | | 1. ç©æåç±»ç»ä¸ä½¿ç¨ `mdm_item_category` 表ï¼MDM å MES 模åå
±ç¨åä¸å¥åç±»æ°æ® |
| | | 2. åç±»æ°å¢ `itemOrProduct` åæ®µå
¼å®¹ MES ç ITEM/PRODUCT æ è¯ |
| | | 3. ç©æç±»ååæ®µ `itemType` ç¨äºå¿«ééæ©ï¼1åæã2åæåã3æåã4è¾
æ |
| | | |
| | | ## åæ®µæ å° |
| | | |
| | | | MDM åæ®µ (mdm_item_category) | MES åæ®µ (mes_md_item_type) | 说æ | |
| | | |------------------------------|----------------------------|------| |
| | | | id | id | åç±»ç¼å· | |
| | | | code | code | åç±»ç¼ç | |
| | | | name | name | åç±»åç§° | |
| | | | parentId | parentId | ç¶åç±»ç¼å· | |
| | | | itemType (Integer) | itemOrProduct (String) | ç±»åæ è¯ | |
| | | | sort | sort | æåº | |
| | | | status | status | ç¶æ | |
| | | | remark | remark | 夿³¨ | |
| | | |
| | | ### itemType ä¸ itemOrProduct æ å°å
³ç³» |
| | | |
| | | | itemType | 说æ | itemOrProduct | |
| | | |----------|------|---------------| |
| | | | 1 | ç©æ | ITEM | |
| | | | 2 | 产å | PRODUCT | |
| | | | 3 | åæå | ITEM | |
| | | | NULL | å
¨é¨ | - | |
| | | |
| | | ## API |
| | | |
| | | ### è·åç©æåç±»å表 |
| | | ### MDM å类管çï¼ä¸»è¦æ¥å£ï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /admin-api/mes/md/item-type/list | è·åç©æåç±»å表 | |
| | | | POST | /admin-api/mdm/category/create | åå»ºç©æåç±» | |
| | | | PUT | /admin-api/mdm/category/update | æ´æ°ç©æåç±» | |
| | | | DELETE | /admin-api/mdm/category/delete | å é¤ç©æåç±» | |
| | | | GET | /admin-api/mdm/category/get | è·åå个åç±» | |
| | | | GET | /admin-api/mdm/category/list | è·ååç±»å表 | |
| | | | GET | /admin-api/mdm/category/list-all-simple | è·åå¯ç¨çåç±»å表ï¼ä¸ææ¡ï¼ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | **请æ±åæ°ï¼MdmItemCategorySaveReqVOï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | status | Integer | å¦ | ç¶æçé | |
| | | |
| | | **ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | Long | åç±»ç¼å· | |
| | | | code | String | åç±»ç¼ç | |
| | | | name | String | åç±»åç§° | |
| | | | parentId | Long | ç¶åç±»ç¼å· | |
| | | | itemOrProduct | String | ç©æ/äº§åæ è¯ | |
| | | | sort | Integer | æåº | |
| | | | status | Integer | ç¶æ | |
| | | | id | Long | å¦ | åç±»ç¼å·ï¼æ´æ°æ¶å¿
å¡«ï¼ | |
| | | | parentId | Long | å¦ | ç¶åç±»ç¼å· | |
| | | | code | String | æ¯ | åç±»ç¼ç | |
| | | | name | String | æ¯ | åç±»åç§° | |
| | | | itemType | Integer | å¦ | éç¨ç©æç±»åï¼1ç©æã2产åã3åæåãNULLå
¨é¨ | |
| | | | itemOrProduct | String | å¦ | ç©æ/äº§åæ è¯ï¼ITEMãPRODUCTï¼å
¼å®¹MESï¼ | |
| | | | sort | Integer | å¦ | æåº | |
| | | | status | Integer | æ¯ | ç¶æï¼0å¯ç¨ã1ç¦ç¨ | |
| | | | remark | String | å¦ | 夿³¨ | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": [ |
| | | { |
| | | "id": 1, |
| | | "code": "RAW001", |
| | | "name": "åæ", |
| | | "parentId": 0, |
| | | "itemOrProduct": "1", |
| | | "sort": 1, |
| | | "status": 0 |
| | | } |
| | | ] |
| | | "data": { |
| | | "id": 1, |
| | | "parentId": 0, |
| | | "code": "RAW001", |
| | | "name": "åæ", |
| | | "itemType": 1, |
| | | "itemOrProduct": "ITEM", |
| | | "sort": 0, |
| | | "status": 0 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### è·åç©æå类详æ
|
| | | ### MES åç±»æ¥å£ï¼å
¼å®¹ä¿çï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /admin-api/mes/md/item-type/get | è·åç©æå类详æ
| |
| | | | GET | /admin-api/mes/md/item-type/list | è·åç©æåç±»å表 | |
| | | | GET | /admin-api/mes/md/item-type/simple-list | è·åç²¾ç®å表ï¼ä¸ææ¡ï¼ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | åç±»ç¼å· | |
| | | |
| | | ### ä¿åç©æåç±» |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /admin-api/mes/md/item-type/create | åå»ºç©æåç±» | |
| | | | PUT | /admin-api/mes/md/item-type/update | æ´æ°ç©æåç±» | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | å¦ | åç±»ç¼å·ï¼æ´æ°æ¶å¿
å¡«ï¼ | |
| | | | code | String | æ¯ | åç±»ç¼ç | |
| | | | name | String | æ¯ | åç±»åç§° | |
| | | | parentId | Long | å¦ | ç¶åç±»ç¼å· | |
| | | | itemOrProduct | String | å¦ | ç©æ/äº§åæ è¯ | |
| | | | sort | Integer | å¦ | æåº | |
| | | | status | Integer | å¦ | ç¶æ | |
| | | > 注æï¼MES åç±»æ¥å£åºå±å·²æ¹ä¸ºè¯»å MDM åç±»æ°æ®ï¼å»ºè®®å端ç»ä¸ä½¿ç¨ MDM åç±»æ¥å£ã |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | categoryId | æ°å¢/ç¼è¾è¡¨å | ç©æåç±»ä¸ææ¡ï¼æ°æ®æ¥æºï¼mes_md_item_type | |
| | | | categoryId / itemTypeId | æ°å¢/ç¼è¾è¡¨å | ç©æåç±»ä¸ææ¡ï¼æ°æ®æ¥æºï¼mdm_item_category | |
| | | | itemType | æ°å¢/ç¼è¾è¡¨å | ç©æç±»åå¿«æ·éæ©ï¼1åæã2åæåã3æåã4è¾
æ | |
| | | | itemOrProduct | å类表å | ç©æ/äº§åæ è¯ï¼ç¨äº MES å
¼å®¹ | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | ç©æåç±»éæ© | ä½¿ç¨ `mes_md_item_type` 表ï¼MDM å MES å
±ç¨åä¸å¥åç±»æ°æ® | |
| | | | itemType ä¸ categoryId å
³ç³» | å½ categoryId 为空æ¶ï¼å¯æ ¹æ® itemType èªå¨å¹é
对åºåç§°çåç±» | |
| | | | itemType æ å° | 1âåæï¼2âåæåï¼3âæåï¼4âè¾
æ | |
| | | | åç±»æ ¡éª | ä¿åç©ææ¶ï¼ä¼éè¿ RPC API æ ¡éªåç±»æ¯å¦åå¨ | |
| | | | å类管ç | ç»ä¸å¨ MDM 模å管çï¼MES 模ååªè¯» | |
| | | | åç±»å é¤ | æååç±»ææç©æå¼ç¨æ¶ä¸å¯å é¤ | |
| | | | ç©æåæ¥ | MDM ç©æåæ¥å° MES æ¶ï¼åç±» ID ä¿æä¸è´ | |
| | | | å
¼å®¹æ§ | MES åç±»æå¡ä¼å
ä» MDM è·åï¼æ¬å°è¡¨ä½ä¸ºåé | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - ç©æåç±»æ°æ®å¨ MES 模å管çï¼MDM 模åéè¿ RPC API è°ç¨è·å |
| | | - `itemType` æ¯å¿«æ·éæ©åæ®µï¼æç»ä¼è½¬æ¢ä¸ºå¯¹åºçåç±»ç¼ç |
| | | - å¦æåæ¶è®¾ç½®äº `categoryId` å `itemType`ï¼ä¼å
ä½¿ç¨ `categoryId` |
| | | - åç±»æ¯ææ å½¢ç»æï¼å¯éè¿ `parentId` æå»ºå±çº§å
³ç³» |
| | | 1. **èååæ´**ï¼MES ç"ç©æäº§ååç±»"èåå·²ç¦ç¨ï¼ç»ä¸ä½¿ç¨ MDM ç"ç©æåç±»"èå |
| | | 2. **æ°æ®ä¸è´æ§**ï¼ä¸¤è¡¨æ°æ®å·²åæ¥ï¼åç»ç»´æ¤åªéæä½ MDM åç±» |
| | | 3. **API å
¼å®¹**ï¼MES åç±»æ¥å£ä¿çï¼åºå±è¯»å MDM æ°æ®ï¼å端å¯ç»§ç»ä½¿ç¨ |
| | | 4. **åæ®µè½¬æ¢**ï¼å端å±ç¤ºæ¶ï¼`itemOrProduct` å¼é转æ¢ä¸ºä¸æï¼ITEM=ç©æï¼PRODUCT=产åï¼ |
| | |
| | | | warehouseId | Long | æ¯ | ä»åºID | |
| | | | locationId | Long | æ¯ | åºåºID | |
| | | | areaId | Long | æ¯ | åºä½ID | |
| | | | batchId | Long | å¦ | æ¹æ¬¡ID | |
| | | | batchCode | String | å¦ | æ¹æ¬¡å· | |
| | | | batchId | Long | å¦ | æ¹æ¬¡IDï¼éæ©å·²ææ¹æ¬¡æ¶ä¼ å
¥ï¼ | |
| | | | batchCode | String | å¦ | æ¹æ¬¡å·ï¼æ°å»ºæ¹æ¬¡æ¶ä¼ å
¥ï¼ | |
| | | | produceDate | DateTime | å¦ | çäº§æ¥æï¼æ°å»ºæ¹æ¬¡æ¶ä¼ å
¥ï¼ | |
| | | | expireDate | DateTime | å¦ | æææï¼æ°å»ºæ¹æ¬¡æ¶ä¼ å
¥ï¼ | |
| | | | vendorId | Long | å¦ | ä¾åºåID | |
| | | | quantity | BigDecimal | æ¯ | å
¥åºæ°éï¼å¿
须大äº0ï¼ | |
| | | | reason | String | å¦ | å
¥åºåå | |
| | |
| | | | warehouseId | Long | æ¯ | ä»åºID | |
| | | | locationId | Long | æ¯ | åºåºID | |
| | | | areaId | Long | æ¯ | åºä½ID | |
| | | | batchId | Long | å¦ | æ¹æ¬¡ID | |
| | | | batchId | Long | å¦ | æ¹æ¬¡IDï¼åºåºæ¶æ ¡éªæ¹æ¬¡åå¨ï¼ | |
| | | | batchCode | String | å¦ | æ¹æ¬¡å· | |
| | | | vendorId | Long | å¦ | ä¾åºåID | |
| | | | quantity | BigDecimal | æ¯ | åºåºæ°éï¼å¿
须大äº0ï¼ | |
| | |
| | | | bizId | åºåè®°å½ID | åºåè®°å½ID | |
| | | | bizCode | STOCK_ADJUST_{åºåID} | STOCK_ADJUST_{åºåID} | |
| | | |
| | | ## æ¹æ¬¡å¤çè§å |
| | | |
| | | èªå®ä¹å
¥åºæ¶ï¼ç³»ç»ä¼æ ¹æ®ç©ææ¹æ¬¡é
ç½®èªå¨å¤çæ¹æ¬¡ï¼ |
| | | |
| | | > **æ¹æ¬¡é
ç½®æ¥æº**ï¼åºç¡æ°æ®ï¼MDMï¼ç©æä¸»æ°æ®çæ¹æ¬¡å±æ§é
ç½®ï¼å¨ç©æè¯¦æ
页维æ¤ã |
| | | |
| | | ### å
¥åºæ¹æ¬¡å¤çé»è¾ |
| | | |
| | | | æ
åµ | å¤çæ¹å¼ | |
| | | |------|---------| |
| | | | ç©ææªå¯ç¨æ¹æ¬¡ç®¡ç | ä¸å
³èæ¹æ¬¡ | |
| | | | ä¼ å
¥ batchId | æ ¡éªæ¹æ¬¡åå¨ä¸å½å±æ£ç¡®ï¼ä½¿ç¨å·²ææ¹æ¬¡ | |
| | | | æªä¼ batchIdï¼ç©æå¯ç¨æ¹æ¬¡ç®¡çï¼ | æ ¹æ®åæ°èªå¨åå»ºæ¹æ¬¡è®°å½ | |
| | | |
| | | ### æ°å»ºæ¹æ¬¡æ¶çåæ° |
| | | |
| | | å½ç©æå¯ç¨æ¹æ¬¡ç®¡ç䏿ªä¼ å
¥ batchId æ¶ï¼å¯ä¼ å
¥ä»¥ä¸åæ°ç¨äºåå»ºæ¹æ¬¡ï¼ |
| | | |
| | | | åæ° | 说æ | |
| | | |------|------| |
| | | | batchCode | æ¹æ¬¡å·ï¼å¯éï¼ä¸ä¼ åç³»ç»èªå¨çæï¼ | |
| | | | produceDate | çäº§æ¥æ | |
| | | | expireDate | æææ | |
| | | | vendorId | ä¾åºåID | |
| | | |
| | | > ç³»ç»ä¼æ ¹æ®ç©æçæ¹æ¬¡é
ç½®æ ¡éªå¿
å¡«åæ°ï¼å¦çäº§æ¥æãæææçï¼ |
| | | |
| | | ### åºåºæ¹æ¬¡å¤çé»è¾ |
| | | |
| | | | æ
åµ | å¤çæ¹å¼ | |
| | | |------|---------| |
| | | | ç©ææªå¯ç¨æ¹æ¬¡ç®¡ç | 䏿 ¡éªæ¹æ¬¡ | |
| | | | ä¼ å
¥ batchId | æ ¡éªæ¹æ¬¡åå¨ä¸ä¸ç©æå¹é
| |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - å
¥åºæ°é/åºåºæ°éå¿
须大äº0 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # MDM ç©ææ¹æ¬¡å±æ§é
ç½® - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - åºç¡æ°æ® - ç©æäº§åå表页 |
| | | - ç©æè¯¦æ
/ç¼è¾é¡µ |
| | | - MES ç产 - ç©æäº§å详æ
页 |
| | | |
| | | ## ä¸å¡åºæ¯ |
| | | |
| | | å½ç©æå¯ç¨æ¹æ¬¡ç®¡çï¼`isBatchManaged = true`ï¼æ¶ï¼éè¦é
ç½®æ¹æ¬¡å±æ§ï¼å®ä¹åå»ºæ¹æ¬¡æ¶åªäºå段æ¯å¿
å¡«çã |
| | | |
| | | **æ¹æ¬¡å±æ§å段ï¼ä»
ä¿ç以ä¸7个ï¼ï¼** |
| | | |
| | | | åæ®µ | 说æ | |
| | | |------|------| |
| | | | çäº§æ¥æ | æ¹æ¬¡ççäº§æ¥æ | |
| | | | æææ | æ¹æ¬¡çå¤±ææ¥æ | |
| | | | å
¥åºæ¥æ | æ¹æ¬¡çå
¥åºæ¥æ | |
| | | | ä¾åºå | æ¹æ¬¡çä¾åºå | |
| | | | éè´è®¢åç¼å· | æ¹æ¬¡çéè´è®¢åå· | |
| | | | ç产æ¹å· | æ¹æ¬¡çæ¹å· | |
| | | | è´¨éç¶æ | æ¹æ¬¡çè´¨éç¶æ | |
| | | |
| | | ## åååæ¥è¯´æ |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â æ¹æ¬¡é
ç½®åå忥 â |
| | | ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠|
| | | â â |
| | | â MDM ç©æé¡µé¢ ââââââââââââââââââ MES ç©æé¡µé¢ â |
| | | â â â â |
| | | â â¼ â¼ â |
| | | â mdm_item_batch_config âââââââââââ mes_md_item_batch_config â |
| | | â â â â |
| | | â âââââââââââ主åå¨âââââââââââââââââââ â |
| | | â â |
| | | â 说æï¼ â |
| | | â - MDM 表æ¯ä¸»åå¨ï¼MES 表æ¯éå â |
| | | â - ä»»æä¸æ¹ä¿®æ¹ï¼èªå¨åæ¥å°å¦ä¸æ¹ â |
| | | â - æ¥è¯¢æ¶ä¼å
ä» MDM 表è·å â |
| | | â â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | ## API |
| | | |
| | | ### è·åç©ææ¹æ¬¡é
ç½® |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | `/mes/md/item-batch-config/get-by-item-id` | æ ¹æ®ç©æIDè·åæ¹æ¬¡é
ç½® | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | itemId | Long | æ¯ | ç©æID | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "id": 1, |
| | | "itemId": 8, |
| | | "produceDateFlag": true, |
| | | "expireDateFlag": true, |
| | | "receiptDateFlag": false, |
| | | "vendorFlag": true, |
| | | "purchaseOrderCodeFlag": false, |
| | | "lotNumberFlag": true, |
| | | "qualityStatusFlag": false |
| | | }, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | **ååºå段说æï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | Long | é
ç½®ID | |
| | | | itemId | Long | ç©æID | |
| | | | produceDateFlag | Boolean | çäº§æ¥æå¿
å¡« | |
| | | | expireDateFlag | Boolean | æææå¿
å¡« | |
| | | | receiptDateFlag | Boolean | å
¥åºæ¥æå¿
å¡« | |
| | | | vendorFlag | Boolean | ä¾åºåå¿
å¡« | |
| | | | purchaseOrderCodeFlag | Boolean | éè´è®¢åå·å¿
å¡« | |
| | | | lotNumberFlag | Boolean | ç产æ¹å·å¿
å¡« | |
| | | | qualityStatusFlag | Boolean | è´¨éç¶æå¿
å¡« | |
| | | |
| | | ### ä¿åç©ææ¹æ¬¡é
ç½® |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | `/mes/md/item-batch-config/save` | ä¿åæ¹æ¬¡é
ç½®ï¼æ°å¢/æ´æ°ï¼ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "itemId": 8, |
| | | "produceDateFlag": true, |
| | | "expireDateFlag": true, |
| | | "receiptDateFlag": false, |
| | | "vendorFlag": true, |
| | | "purchaseOrderCodeFlag": false, |
| | | "lotNumberFlag": true, |
| | | "qualityStatusFlag": false |
| | | } |
| | | ``` |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | itemId | Long | æ¯ | ç©æID | |
| | | | produceDateFlag | Boolean | å¦ | çäº§æ¥æå¿
å¡«ï¼é»è®¤ false | |
| | | | expireDateFlag | Boolean | å¦ | æææå¿
å¡«ï¼é»è®¤ false | |
| | | | receiptDateFlag | Boolean | å¦ | å
¥åºæ¥æå¿
å¡«ï¼é»è®¤ false | |
| | | | vendorFlag | Boolean | å¦ | ä¾åºåå¿
å¡«ï¼é»è®¤ false | |
| | | | purchaseOrderCodeFlag | Boolean | å¦ | éè´è®¢åå·å¿
å¡«ï¼é»è®¤ false | |
| | | | lotNumberFlag | Boolean | å¦ | ç产æ¹å·å¿
å¡«ï¼é»è®¤ false | |
| | | | qualityStatusFlag | Boolean | å¦ | è´¨éç¶æå¿
å¡«ï¼é»è®¤ false | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": 1, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. ç©æè¯¦æ
/ç¼è¾é¡µ |
| | | |
| | | å¨ç©æè¯¦æ
页å¢å "æ¹æ¬¡å±æ§é
ç½®"åºåã |
| | | |
| | | **å±ç¤ºæ¡ä»¶ï¼** |
| | | - å½ç©æç `isBatchManaged = true` æ¶æ¾ç¤ºè¯¥é
ç½®åºå |
| | | - å½ç©æç `isBatchManaged = false` æ¶éè该é
ç½®åºå |
| | | |
| | | ### 2. æ¹æ¬¡å±æ§é
置表å |
| | | |
| | | **表ååæ®µï¼ä»
7个ï¼ï¼** |
| | | |
| | | | åæ®µ | æ§ä»¶ç±»å | 说æ | |
| | | |------|----------|------| |
| | | | çäº§æ¥æ | el-checkbox | å¾é表示åå»ºæ¹æ¬¡æ¶å¿
å¡« | |
| | | | æææ | el-checkbox | å¾é表示åå»ºæ¹æ¬¡æ¶å¿
å¡« | |
| | | | å
¥åºæ¥æ | el-checkbox | å¾é表示åå»ºæ¹æ¬¡æ¶å¿
å¡« | |
| | | | ä¾åºå | el-checkbox | å¾é表示åå»ºæ¹æ¬¡æ¶å¿
å¡« | |
| | | | éè´è®¢åå· | el-checkbox | å¾é表示åå»ºæ¹æ¬¡æ¶å¿
å¡« | |
| | | | ç产æ¹å· | el-checkbox | å¾é表示åå»ºæ¹æ¬¡æ¶å¿
å¡« | |
| | | | è´¨éç¶æ | el-checkbox | å¾é表示åå»ºæ¹æ¬¡æ¶å¿
å¡« | |
| | | |
| | | **建议å¸å±ï¼** |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â æ¹æ¬¡å±æ§é
ç½® â |
| | | ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠|
| | | â â çäº§æ¥æ â æææ â å
¥åºæ¥æ â ä¾åºå â |
| | | â â éè´è®¢åå· â ç产æ¹å· â è´¨éç¶æ â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | ### 3. æ°æ®å è½½é»è¾ |
| | | |
| | | **è¿å
¥ç©æè¯¦æ
页æ¶ï¼** |
| | | |
| | | 1. å è½½ç©æåºæ¬ä¿¡æ¯ |
| | | 2. 夿 `isBatchManaged` æ¯å¦ä¸º `true` |
| | | 3. 妿æ¯ï¼è°ç¨ `GET /mes/md/item-batch-config/get-by-item-id?itemId={ç©æID}` è·åé
ç½® |
| | | 4. 渲æé
置表åï¼å°è¿åçé
ç½®æ°æ®ç»å®å°è¡¨å |
| | | |
| | | **ä¿åç©ææ¶ï¼** |
| | | |
| | | 1. å
ä¿åç©æåºæ¬ä¿¡æ¯ |
| | | 2. 妿 `isBatchManaged = true`ï¼è°ç¨ `POST /mes/md/item-batch-config/save` ä¿åæ¹æ¬¡é
ç½® |
| | | |
| | | ### 4. æ¨èé»è®¤é
ç½® |
| | | |
| | | 对äºå¸¸è§çéè´ç©æï¼æ¨èé»è®¤é
ç½®ï¼ |
| | | |
| | | | åæ®µ | æ¨è | 说æ | |
| | | |------|------|------| |
| | | | çäº§æ¥æ | â | 追溯ç产æ¶é´ | |
| | | | æææ | â | æä¿è´¨æçç©æ | |
| | | | å
¥åºæ¥æ | â | é常èªå¨è®°å½ | |
| | | | ä¾åºå | â | éè´ç©æéè¦è¿½æº¯æ¥æº | |
| | | | éè´è®¢åå· | â | å¯é | |
| | | | ç产æ¹å· | â | æ¹æ¬¡è¿½æº¯ | |
| | | | è´¨éç¶æ | â | éè¦è´¨æ£æ¶ä½¿ç¨ | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | ç©ææªå¯ç¨æ¹æ¬¡ç®¡ç | 䏿¾ç¤ºæ¹æ¬¡å±æ§é
ç½®åºå | |
| | | | ç©æå¯ç¨æ¹æ¬¡ç®¡ç使 é
ç½® | åå»ºæ¹æ¬¡æ¶å
许任æå段ï¼å®½æ¾æ¨¡å¼ï¼ | |
| | | | ç©æå¯ç¨æ¹æ¬¡ç®¡ç䏿é
ç½® | åå»ºæ¹æ¬¡æ¶æ ¡éªå¿
å¡«åæ®µ | |
| | | | MDM ä¿®æ¹æ¹æ¬¡é
ç½® | èªå¨åæ¥å° MES 表 | |
| | | | MES ä¿®æ¹æ¹æ¬¡é
ç½® | èªå¨åæ¥å° MDM 表 | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - æ¹æ¬¡é
ç½®æ¯ç©æçº§å«çï¼æ¯ä¸ªç©æç¬ç«é
ç½® |
| | | - ä¿®æ¹æ¹æ¬¡é
ç½®ä¸ä¼å½±åå·²åå»ºçæ¹æ¬¡ï¼åªå½±ååç»æ°åå»ºçæ¹æ¬¡ |
| | | - MDM å MES çæ¹æ¬¡é
ç½®ä¼èªå¨åå忥 |
| | | - åªä¿çå¿
è¦ç7ä¸ªæ¹æ¬¡å±æ§å段ï¼å
¶ä»å段ä¸åä½¿ç¨ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # MDM ä¸ MES ç©æåå忥 - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - MDM 模åï¼ç©æä¸»æ°æ®å表页ãç©ææ°å¢/ç¼è¾é¡µ |
| | | - MES 模åï¼ç©æäº§åå表页ãç©æäº§åæ°å¢/ç¼è¾é¡µ |
| | | |
| | | ## ä¸å¡æµç¨è¯´æ |
| | | |
| | | ### åå忥å
³ç³» |
| | | |
| | | ``` |
| | | MDM ç©æ ââââââââ MES ç©æ |
| | | â â |
| | | | syncMes=true | syncMdm=true |
| | | ââââââââââââââââââââ |
| | | ``` |
| | | |
| | | | æä½ç«¯ | åæ¥è§¦åæ¡ä»¶ | åæ¥ç®æ | |
| | | |--------|-------------|---------| |
| | | | MDM æ°å¢/ç¼è¾ç©æ | `syncMes = true` | MES `mes_md_item` + `mes_md_item_batch_config` | |
| | | | MES æ°å¢/ç¼è¾ç©æ | `syncMdm = true` | MDM `mdm_item` + `mdm_item_batch_config` | |
| | | |
| | | ### æ¹æ¬¡å±æ§å段ï¼7个å¿
å¡«é¡¹ï¼ |
| | | |
| | | | åæ®µ | 䏿å | 说æ | |
| | | |------|--------|------| |
| | | | produceDateFlag | çäº§æ¥æå¿
å¡« | å
¥åºæ¶æ¯å¦å¿
å¡«çäº§æ¥æ | |
| | | | expireDateFlag | æææå¿
å¡« | å
¥åºæ¶æ¯å¦å¿
å¡«æææ | |
| | | | receiptDateFlag | å
¥åºæ¥æå¿
å¡« | å
¥åºæ¶æ¯å¦å¿
å¡«å
¥åºæ¥æ | |
| | | | vendorFlag | ä¾åºåå¿
å¡« | å
¥åºæ¶æ¯å¦å¿
å¡«ä¾åºå | |
| | | | purchaseOrderCodeFlag | éè´è®¢åå·å¿
å¡« | å
¥åºæ¶æ¯å¦å¿
å¡«éè´è®¢åå· | |
| | | | lotNumberFlag | ç产æ¹å·å¿
å¡« | å
¥åºæ¶æ¯å¦å¿
å¡«ç产æ¹å· | |
| | | | qualityStatusFlag | è´¨éç¶æå¿
å¡« | å
¥åºæ¶æ¯å¦å¿
å¡«è´¨éç¶æ | |
| | | |
| | | --- |
| | | |
| | | ## API |
| | | |
| | | ### 1. MDM ç©ææ°å¢/ç¼è¾ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | `/admin-api/mdm/item/create` | æ°å¢ MDM ç©æ | |
| | | | PUT | `/admin-api/mdm/item/update` | ç¼è¾ MDM ç©æ | |
| | | |
| | | **请æ±åæ°ï¼MdmItemSaveReqVOï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | å¦ | ç©æç¼å·ï¼ç¼è¾æ¶å¿
å¡«ï¼ | |
| | | | code | String | æ¯ | ç©æç¼ç | |
| | | | name | String | æ¯ | ç©æåç§° | |
| | | | specification | String | å¦ | è§æ ¼åå· | |
| | | | categoryId | Long | å¦ | åç±»IDï¼å
³è MES ç©æåç±»ï¼ | |
| | | | unitMeasureId | Long | å¦ | 计éåä½ID | |
| | | | itemType | Integer | æ¯ | ç©æç±»åï¼1åæ, 2åæå, 3æå, 4è¾
æ | |
| | | | status | Integer | æ¯ | ç¶æï¼0å¯ç¨, 1ç¦ç¨ | |
| | | | minStock | BigDecimal | å¦ | æä½åºå | |
| | | | maxStock | BigDecimal | å¦ | æé«åºå | |
| | | | isBatchManaged | Boolean | å¦ | æ¯å¦æ¹æ¬¡ç®¡ç | |
| | | | isHighValue | Boolean | å¦ | æ¯å¦é«å¼ç©æ | |
| | | | remark | String | å¦ | 夿³¨ | |
| | | | **syncMes** | **Boolean** | **å¦** | **æ¯å¦åæ¥å° MES** | |
| | | | **produceDateFlag** | **Boolean** | **å¦** | **çäº§æ¥æå¿
å¡«** | |
| | | | **expireDateFlag** | **Boolean** | **å¦** | **æææå¿
å¡«** | |
| | | | **receiptDateFlag** | **Boolean** | **å¦** | **å
¥åºæ¥æå¿
å¡«** | |
| | | | **vendorFlag** | **Boolean** | **å¦** | **ä¾åºåå¿
å¡«** | |
| | | | **purchaseOrderCodeFlag** | **Boolean** | **å¦** | **éè´è®¢åå·å¿
å¡«** | |
| | | | **lotNumberFlag** | **Boolean** | **å¦** | **ç产æ¹å·å¿
å¡«** | |
| | | | **qualityStatusFlag** | **Boolean** | **å¦** | **è´¨éç¶æå¿
å¡«** | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "msg": "æä½æå", |
| | | "data": 123 // ç©æID |
| | | } |
| | | ``` |
| | | |
| | | ### 2. MES ç©ææ°å¢/ç¼è¾ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | `/admin-api/mes/md-item/create` | æ°å¢ MES ç©æ | |
| | | | PUT | `/admin-api/mes/md-item/update` | ç¼è¾ MES ç©æ | |
| | | |
| | | **请æ±åæ°ï¼MesMdItemSaveReqVOï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | å¦ | ç©æç¼å·ï¼ç¼è¾æ¶å¿
å¡«ï¼ | |
| | | | code | String | æ¯ | ç©æç¼ç | |
| | | | name | String | æ¯ | ç©æåç§° | |
| | | | specification | String | å¦ | è§æ ¼åå· | |
| | | | unitMeasureId | Long | æ¯ | 计éåä½ID | |
| | | | itemTypeId | Long | æ¯ | ç©æåç±»ID | |
| | | | safeStockFlag | Boolean | å¦ | æ¯å¦å¯ç¨å®å
¨åºå | |
| | | | minStock | BigDecimal | å¦ | æä½åºå | |
| | | | maxStock | BigDecimal | å¦ | æé«åºå | |
| | | | highValue | Boolean | å¦ | æ¯å¦é«å¼ç©æ | |
| | | | batchFlag | Boolean | å¦ | æ¯å¦æ¹æ¬¡ç®¡ç | |
| | | | remark | String | å¦ | 夿³¨ | |
| | | | **syncMdm** | **Boolean** | **å¦** | **æ¯å¦åæ¥å° MDM** | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "msg": "æä½æå", |
| | | "data": 456 // ç©æID |
| | | } |
| | | ``` |
| | | |
| | | ### 3. MES æ¹æ¬¡å±æ§é
ç½®ä¿å |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | `/admin-api/mes/md-item-batch-config/create` | æ°å¢æ¹æ¬¡é
ç½® | |
| | | | PUT | `/admin-api/mes/md-item-batch-config/update` | ç¼è¾æ¹æ¬¡é
ç½® | |
| | | |
| | | **请æ±åæ°ï¼MesMdItemBatchConfigSaveReqVOï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | å¦ | é
ç½®IDï¼ç¼è¾æ¶å¿
å¡«ï¼ | |
| | | | itemId | Long | æ¯ | ç©æID | |
| | | | produceDateFlag | Boolean | å¦ | çäº§æ¥æå¿
å¡« | |
| | | | expireDateFlag | Boolean | å¦ | æææå¿
å¡« | |
| | | | receiptDateFlag | Boolean | å¦ | å
¥åºæ¥æå¿
å¡« | |
| | | | vendorFlag | Boolean | å¦ | ä¾åºåå¿
å¡« | |
| | | | purchaseOrderCodeFlag | Boolean | å¦ | éè´è®¢åå·å¿
å¡« | |
| | | | lotNumberFlag | Boolean | å¦ | ç产æ¹å·å¿
å¡« | |
| | | | qualityStatusFlag | Boolean | å¦ | è´¨éç¶æå¿
å¡« | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "msg": "æä½æå", |
| | | "data": 789 // é
ç½®ID |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. MDM ç©ææ°å¢/ç¼è¾é¡µé¢ |
| | | |
| | | #### 1.1 表ååæ®µæ°å¢ |
| | | |
| | | å¨ç©æè¡¨å䏿°å¢ä»¥ä¸åæ®µï¼ |
| | | |
| | | | åæ®µ | æ§ä»¶ç±»å | å±ç¤ºæ¡ä»¶ | 说æ | |
| | | |------|----------|----------|------| |
| | | | syncMes | Switch å¼å
³ | å§ç»æ¾ç¤º | æ¯å¦åæ¥å° MES | |
| | | | æ¹æ¬¡å±æ§é
ç½® | åç»æ é¢ | `isBatchManaged = true` æ¶æ¾ç¤º | æ¹æ¬¡å±æ§å¿
å¡«é
ç½® | |
| | | | produceDateFlag | Switch å¼å
³ | `isBatchManaged = true` æ¶æ¾ç¤º | çäº§æ¥æå¿
å¡« | |
| | | | expireDateFlag | Switch å¼å
³ | `isBatchManaged = true` æ¶æ¾ç¤º | æææå¿
å¡« | |
| | | | receiptDateFlag | Switch å¼å
³ | `isBatchManaged = true` æ¶æ¾ç¤º | å
¥åºæ¥æå¿
å¡« | |
| | | | vendorFlag | Switch å¼å
³ | `isBatchManaged = true` æ¶æ¾ç¤º | ä¾åºåå¿
å¡« | |
| | | | purchaseOrderCodeFlag | Switch å¼å
³ | `isBatchManaged = true` æ¶æ¾ç¤º | éè´è®¢åå·å¿
å¡« | |
| | | | lotNumberFlag | Switch å¼å
³ | `isBatchManaged = true` æ¶æ¾ç¤º | ç产æ¹å·å¿
å¡« | |
| | | | qualityStatusFlag | Switch å¼å
³ | `isBatchManaged = true` æ¶æ¾ç¤º | è´¨éç¶æå¿
å¡« | |
| | | |
| | | #### 1.2 æ°æ®ç»æ |
| | | |
| | | ```javascript |
| | | data() { |
| | | return { |
| | | form: { |
| | | // åæå段... |
| | | syncMes: false, |
| | | // æ¹æ¬¡å±æ§é
ç½® |
| | | produceDateFlag: false, |
| | | expireDateFlag: false, |
| | | receiptDateFlag: false, |
| | | vendorFlag: false, |
| | | purchaseOrderCodeFlag: false, |
| | | lotNumberFlag: false, |
| | | qualityStatusFlag: false |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### 1.3 æäº¤é»è¾ |
| | | |
| | | æäº¤æ¶å°ææå段ä¸èµ·æäº¤å° `/admin-api/mdm/item/create` æ `/admin-api/mdm/item/update`ã |
| | | |
| | | **注æäºé¡¹ï¼** |
| | | - å½ `isBatchManaged = true` æ¶ï¼æ¾ç¤ºæ¹æ¬¡å±æ§é
ç½®åºå |
| | | - å端ä¼èªå¨å°æ¹æ¬¡é
ç½®ä¿åå° `mdm_item_batch_config` 表 |
| | | - å½ `syncMes = true` æ¶ï¼å端ä¼åæ¥ç©æåæ¹æ¬¡é
ç½®å° MES |
| | | |
| | | --- |
| | | |
| | | ### 2. MES ç©ææ°å¢/ç¼è¾é¡µé¢ |
| | | |
| | | #### 2.1 表ååæ®µæ°å¢ |
| | | |
| | | å¨ç©æè¡¨å䏿°å¢ä»¥ä¸åæ®µï¼ |
| | | |
| | | | åæ®µ | æ§ä»¶ç±»å | å±ç¤ºæ¡ä»¶ | 说æ | |
| | | |------|----------|----------|------| |
| | | | syncMdm | Switch å¼å
³ | å§ç»æ¾ç¤º | æ¯å¦åæ¥å° MDM | |
| | | |
| | | #### 2.2 æ°æ®ç»æ |
| | | |
| | | ```javascript |
| | | data() { |
| | | return { |
| | | form: { |
| | | // åæå段... |
| | | syncMdm: false |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### 2.3 æäº¤é»è¾ |
| | | |
| | | æäº¤æ¶å° `syncMdm` åæ®µä¸èµ·æäº¤ã |
| | | |
| | | **注æäºé¡¹ï¼** |
| | | - å½ `syncMdm = true` æ¶ï¼å端ä¼åæ¥ç©æåæ¹æ¬¡é
ç½®å° MDM |
| | | - MES çæ¹æ¬¡é
ç½®éè¿åç¬çæ¹æ¬¡é
置页é¢ç»´æ¤ï¼å·²æåè½ï¼ |
| | | |
| | | --- |
| | | |
| | | ### 3. MES æ¹æ¬¡å±æ§é
置页é¢ï¼å·²æåè½ï¼æ éä¿®æ¹ï¼ |
| | | |
| | | 该页é¢å·²æï¼ç¨äºé
ç½® MES ç©æçæ¹æ¬¡å±æ§å¿
填项ãå½ MES ç©æåæ¥å° MDM æ¶ï¼ä¼èªå¨å¸¦ä¸è¿äºé
ç½®ã |
| | | |
| | | --- |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | ### MDM ç©æå表页 |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | code | å表ã详æ
| ç©æç¼ç | |
| | | | name | å表ã详æ
| ç©æåç§° | |
| | | | specification | å表ã详æ
| è§æ ¼åå· | |
| | | | itemType | å表ã详æ
| ç©æç±»åï¼éè½¬æ¢æ¾ç¤ºï¼1åæ, 2åæå, 3æå, 4è¾
æï¼ | |
| | | | status | å表ã详æ
| ç¶æ | |
| | | | isBatchManaged | å表ã详æ
| æ¯å¦æ¹æ¬¡ç®¡ç | |
| | | | syncMes | 详æ
| æ¯å¦å·²åæ¥å° MESï¼æ ¹æ®æ¯å¦æå¯¹åº MES ç©æå¤æï¼ | |
| | | |
| | | ### MES ç©æå表页 |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | code | å表ã详æ
| ç©æç¼ç | |
| | | | name | å表ã详æ
| ç©æåç§° | |
| | | | specification | å表ã详æ
| è§æ ¼åå· | |
| | | | itemTypeName | å表ã详æ
| ç©æåç±»åç§° | |
| | | | batchFlag | å表ã详æ
| æ¯å¦æ¹æ¬¡ç®¡ç | |
| | | | syncMdm | 详æ
| æ¯å¦å·²åæ¥å° MDMï¼æ ¹æ®æ¯å¦æå¯¹åº MDM ç©æå¤æï¼ | |
| | | |
| | | --- |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | ### 忥è§å |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | MDM æ°å¢ç©æ + syncMes=true | å建 MDM ç©æ â 忥å建 MES ç©æåæ¹æ¬¡é
ç½® | |
| | | | MDM ç¼è¾ç©æ + syncMes=true | æ´æ° MDM ç©æ â åæ¥æ´æ° MES ç©æåæ¹æ¬¡é
ç½®ï¼æ code å¹é
ï¼ | |
| | | | MES æ°å¢ç©æ + syncMdm=true | å建 MES ç©æ â 忥å建 MDM ç©æåæ¹æ¬¡é
ç½® | |
| | | | MES ç¼è¾ç©æ + syncMdm=true | æ´æ° MES ç©æ â åæ¥æ´æ° MDM ç©æåæ¹æ¬¡é
ç½®ï¼æ code å¹é
ï¼ | |
| | | |
| | | ### æ¹æ¬¡é
ç½®åæ¥è§å |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | MDM â MES 忥 | å° MDM ç `mdm_item_batch_config` åæ¥å° MES ç `mes_md_item_batch_config` | |
| | | | MES â MDM 忥 | å° MES ç `mes_md_item_batch_config` åæ¥å° MDM ç `mdm_item_batch_config` | |
| | | |
| | | ### åæ®µæ å°è§å |
| | | |
| | | | MDM åæ®µ | MES åæ®µ | 说æ | |
| | | |----------|----------|------| |
| | | | code | code | ç©æç¼ç ï¼å¯ä¸æ è¯ | |
| | | | name | name | ç©æåç§° | |
| | | | specification | specification | è§æ ¼åå· | |
| | | | unitMeasureId (MDM åä½ID) | unitMeasureId (MES åä½ID) | éè¿åä½ç¼ç è½¬æ¢ | |
| | | | categoryId (MDM åç±»ID) | itemTypeId (MES åç±»ID) | éè¿åç±»ç¼ç è½¬æ¢ | |
| | | | itemType | itemOrProduct | 1/2/4âITEM, 3âPRODUCT | |
| | | | isBatchManaged | batchFlag | æ¯å¦æ¹æ¬¡ç®¡ç | |
| | | | isHighValue | highValue | æ¯å¦é«å¼ç©æ | |
| | | | minStock | minStock | æä½åºå | |
| | | | maxStock | maxStock | æé«åºå | |
| | | |
| | | ### ç©æç±»åæ å° |
| | | |
| | | | MDM itemType | MDM 说æ | MES itemOrProduct | MES 说æ | |
| | | |--------------|----------|-------------------|----------| |
| | | | 1 | åæ | ITEM | ç©æ | |
| | | | 2 | åæå | ITEM | ç©æ | |
| | | | 3 | æå | PRODUCT | 产å | |
| | | | 4 | è¾
æ | ITEM | ç©æ | |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **åæ¥å¤±è´¥å¤ç**ï¼åæ¥æä½ä¸ç©æä¿åæ¯åä¸äºå¡ï¼å¦æåæ¥å¤±è´¥ï¼æ´ä¸ªä¿åæä½ä¼åæ»ã |
| | | |
| | | 2. **ç¼ç å¯ä¸æ§**ï¼ç©æç¼ç ï¼codeï¼å¨ MDM å MES ä¸é½å¿
é¡»å¯ä¸ï¼åæ¥æ¶æ code è¿è¡å¹é
ï¼åå¨åæ´æ°ï¼ä¸åå¨åæ°å¢ï¼ã |
| | | |
| | | 3. **åä½/åç±»æ å°**ï¼MDM å MES çåä½ãåç±»æ¯ä¸¤å¥ç¬ç«çä¸»æ°æ®ï¼åæ¥æ¶éè¿ç¼ç ï¼codeï¼è¿è¡æ å°ï¼ç¡®ä¿ä¸¤è¾¹æç¸åçç¼ç æ°æ®ã |
| | | |
| | | 4. **æ¹æ¬¡é
ç½®åæ¥æ¶æº**ï¼ |
| | | - MDM ä¿åç©ææ¶ï¼æ¹æ¬¡é
ç½®ä¿åå°æ¬å° `mdm_item_batch_config` 表 |
| | | - 妿 `syncMes=true`ï¼åæ¶åæ¥å° MES ç `mes_md_item_batch_config` 表 |
| | | - MES åç |
| | | |
| | | 5. **å端å±ç¤ºå»ºè®®**ï¼ |
| | | - å¨å表页å¢å "åæ¥ç¶æ"åï¼æ¾ç¤ºæ¯å¦å·²åæ¥å°å¯¹æ¹ç³»ç» |
| | | - å¯ä»¥éè¿ç©æç¼ç æ¥è¯¢å¯¹æ¹ç³»ç»æ¯å¦å卿¥å¤æåæ¥ç¶æ |
| | | |
| | | 6. **æ°æ®ä¸è´æ§**ï¼ |
| | | - 建议å¨ä¸ç«¯ç»´æ¤ç©ææ°æ®åï¼åæ¥å°å¦ä¸ç«¯ |
| | | - é¿å
ä¸¤è¾¹åæ¶ç¼è¾åä¸ç©æå¯¼è´æ°æ®å²çª |
| | | |
| | | --- |
| | | |
| | | ## è°è¯å»ºè®® |
| | | |
| | | 1. é¦å
æµè¯ MDM â MES 忥ï¼å建 MDM ç©æï¼å¾é syncMesï¼æ£æ¥ MES æ¯å¦çæå¯¹åºç©æ |
| | | 2. æµè¯ MES â MDM 忥ï¼å建 MES ç©æï¼å¾é syncMdmï¼æ£æ¥ MDM æ¯å¦çæå¯¹åºç©æ |
| | | 3. æµè¯æ¹æ¬¡é
ç½®åæ¥ï¼å¨ MDM è®¾ç½®æ¹æ¬¡å±æ§ï¼åæ¥åæ£æ¥ MES çæ¹æ¬¡é
ç½®æ¯å¦ä¸è´ |
| | | 4. æ£æ¥æ°æ®åºï¼ |
| | | - MDM ç©æï¼`mdm_item`ã`mdm_item_batch_config` |
| | | - MES ç©æï¼`mes_md_item`ã`mes_md_item_batch_config` |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # åºåäºå¡æµæ°´ - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - åºåäºå¡æµæ°´å表页é¢ï¼æ°å¢ï¼ |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /mes/wm/transaction/page | å页æ¥è¯¢åºåäºå¡æµæ°´ | |
| | | |
| | | ### 请æ±åæ° |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | itemId | Long | å¦ | ç©æID | |
| | | | batchCode | String | å¦ | æ¹æ¬¡å·ï¼æ¨¡ç³å¹é
| |
| | | | warehouseId | Long | å¦ | ä»åºID | |
| | | | locationId | Long | å¦ | åºåºID | |
| | | | areaId | Long | å¦ | åºä½ID | |
| | | | type | Integer | å¦ | äºå¡ç±»åï¼1-å
¥åº 2-åºåºï¼ | |
| | | | bizType | Integer | å¦ | ä¸å¡ç±»åï¼126-èªå®ä¹å
¥åº 127-èªå®ä¹åºåº çï¼ | |
| | | | bizCode | String | å¦ | ä¸å¡åå·ï¼æ¨¡ç³å¹é
| |
| | | | materialStockId | Long | å¦ | åºåè®°å½ID | |
| | | | startTime | LocalDateTime | å¦ | å¼å§æ¶é´ | |
| | | | endTime | LocalDateTime | å¦ | ç»ææ¶é´ | |
| | | | pageNo | Integer | æ¯ | 页ç ï¼ç»§æ¿èª PageParamï¼ | |
| | | | pageSize | Integer | æ¯ | æ¯é¡µæ¡æ°ï¼ç»§æ¿èª PageParamï¼ | |
| | | |
| | | ### ååºå段 |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | Long | ç¼å· | |
| | | | type | Integer | äºå¡ç±»åï¼1-å
¥åº 2-åºåºï¼ | |
| | | | typeName | String | äºå¡ç±»ååç§°ï¼å
¥åº/åºåºï¼ | |
| | | | bizType | Integer | ä¸å¡ç±»å | |
| | | | bizTypeName | String | ä¸å¡ç±»ååç§°ï¼èªå®ä¹å
¥åº/èªå®ä¹åºåº/éè´å
¥åº/éå®åºåº çï¼ | |
| | | | bizCode | String | ä¸å¡åå· | |
| | | | itemId | Long | ç©æID | |
| | | | itemCode | String | ç©æç¼ç | |
| | | | itemName | String | ç©æåç§° | |
| | | | quantity | BigDecimal | å卿°éï¼æ£æ°=å
¥åºï¼è´æ°=åºåºï¼ | |
| | | | batchId | Long | æ¹æ¬¡ID | |
| | | | batchCode | String | æ¹æ¬¡å· | |
| | | | warehouseId | Long | ä»åºID | |
| | | | warehouseName | String | ä»åºåç§° | |
| | | | locationId | Long | åºåºID | |
| | | | locationName | String | åºåºåç§° | |
| | | | areaId | Long | åºä½ID | |
| | | | areaName | String | åºä½åç§° | |
| | | | transactionTime | LocalDateTime | äºå¡åçæ¶é´ | |
| | | | createTime | LocalDateTime | å建æ¶é´ | |
| | | |
| | | ### ååºç¤ºä¾ |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "total": 100, |
| | | "list": [ |
| | | { |
| | | "id": 1, |
| | | "type": 1, |
| | | "typeName": "å
¥åº", |
| | | "bizType": 126, |
| | | "bizTypeName": "èªå®ä¹å
¥åº", |
| | | "bizCode": "STOCK_ADJUST_6", |
| | | "itemId": 2, |
| | | "itemCode": "ITEM001", |
| | | "itemName": "èºä¸", |
| | | "quantity": 100, |
| | | "batchId": 7, |
| | | "batchCode": "T8811", |
| | | "warehouseId": 1, |
| | | "warehouseName": "æåä»", |
| | | "locationId": 1, |
| | | "locationName": "Aåº", |
| | | "areaId": 1, |
| | | "areaName": "A-01-01", |
| | | "transactionTime": "2025-07-15 10:30:00", |
| | | "createTime": "2025-07-15 10:30:00" |
| | | } |
| | | ] |
| | | }, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | typeName | å表ã详æ
| äºå¡ç±»ååç§°ï¼ä½¿ç¨æ ç¾å±ç¤ºï¼å
¥åº=绿è²ï¼åºåº=红è²ï¼ | |
| | | | bizTypeName | å表ã详æ
| ä¸å¡ç±»ååç§° | |
| | | | bizCode | å表ã详æ
| ä¸å¡åå·ï¼å¯ç¹å»è·³è½¬å°å¯¹åºä¸å¡åæ® | |
| | | | itemCode | å表 | ç©æç¼ç | |
| | | | itemName | å表 | ç©æåç§° | |
| | | | quantity | å表 | å卿°éï¼æ£æ°æ¾ç¤ºç»¿è²ï¼è´æ°æ¾ç¤ºçº¢è² | |
| | | | batchCode | å表 | æ¹æ¬¡å· | |
| | | | warehouseName | å表 | ä»åºåç§° | |
| | | | locationName | å表 | åºåºåç§° | |
| | | | areaName | å表 | åºä½åç§° | |
| | | | transactionTime | å表 | äºå¡åçæ¶é´ï¼ä½ä¸ºé»è®¤æåºå段 | |
| | | |
| | | ## æç´¢æ¡ä»¶ |
| | | |
| | | | æ¡ä»¶ | ç»ä»¶ | 说æ | |
| | | |------|------|------| |
| | | | ç©æ | ç©æéæ©å¨ | éæ©ç©æåæ¥è¯¢ | |
| | | | æ¹æ¬¡å· | Input | 模ç³å¹é
| |
| | | | ä»åº | 䏿鿩 | éæ©ä»åº | |
| | | | åºåº | 䏿鿩 | æ ¹æ®ä»åºèå¨ | |
| | | | åºä½ | 䏿鿩 | æ ¹æ®åºåºèå¨ | |
| | | | äºå¡ç±»å | 䏿鿩 | å
¥åº/åºåº | |
| | | | ä¸å¡ç±»å | 䏿鿩 | èªå®ä¹å
¥åº/èªå®ä¹åºåº ç | |
| | | | ä¸å¡åå· | Input | 模ç³å¹é
| |
| | | | æ¶é´èå´ | DatePicker | äºå¡åçæ¶é´èå´ | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | æ°æ®æ¥æº | åºåäºå¡æµæ°´ç±ç³»ç»èªå¨çæï¼ä¸å¯äººå·¥å建ãä¿®æ¹ãå é¤ | |
| | | | æåº | é»è®¤æäºå¡åçæ¶é´ååºæå | |
| | | | æé | éè¦ `mes:wm-transaction:query` æé | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - æµæ°´è®°å½åªè¯»ï¼ä¸å
许æ°å¢ãä¿®æ¹ãå é¤ |
| | | - quantity åæ®µæ£æ°è¡¨ç¤ºå
¥åºï¼è´æ°è¡¨ç¤ºåºåºï¼å端å±ç¤ºæ¶å¯æ ¹æ®ç¬¦å·æ¾ç¤ºä¸åé¢è² |
| | | - bizCode å¯ä½ä¸ºè·³è½¬é¾æ¥ï¼ç¹å»å跳转å°å¯¹åºçä¸å¡åæ®è¯¦æ
页 |
| | | - ä¸å¡ç±»åè¾å¤ï¼ä¸æéæ©æ¡å»ºè®®æä½¿ç¨é¢çæåºï¼èªå®ä¹å
¥åºãèªå®ä¹åºåºæ¾åé¢ï¼ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # åºåäºå¡æµæ°´æ¥è¯¢ - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - åºåäºå¡æµæ°´åè¡¨é¡µï¼æ°å¢é¡µé¢ï¼èåè·¯å¾ï¼ä»å¨ç©æµ > åºåäºå¡æµæ°´ï¼ |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /mes/wm/transaction/page | å页æ¥è¯¢åºåäºå¡æµæ°´ | |
| | | |
| | | ### 请æ±åæ° |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | itemId | Long | å¦ | ç©æID | |
| | | | batchCode | String | å¦ | æ¹æ¬¡å·ï¼æ¨¡ç³å¹é
| |
| | | | warehouseId | Long | å¦ | ä»åºID | |
| | | | locationId | Long | å¦ | åºåºID | |
| | | | areaId | Long | å¦ | åºä½ID | |
| | | | type | Integer | å¦ | äºå¡ç±»åï¼1-å
¥åº 2-åºåºï¼ | |
| | | | bizType | Integer | å¦ | ä¸å¡ç±»å | |
| | | | bizCode | String | å¦ | ä¸å¡åå·ï¼æ¨¡ç³å¹é
| |
| | | | materialStockId | Long | å¦ | åºåè®°å½ID | |
| | | | startTime | String | å¦ | å¼å§æ¶é´ï¼æ ¼å¼ï¼yyyy-MM-dd HH:mm:ssï¼ | |
| | | | endTime | String | å¦ | ç»ææ¶é´ï¼æ ¼å¼ï¼yyyy-MM-dd HH:mm:ssï¼ | |
| | | | pageNo | Integer | æ¯ | 页ç ï¼é»è®¤1 | |
| | | | pageSize | Integer | æ¯ | æ¯é¡µæ¡æ°ï¼é»è®¤10 | |
| | | |
| | | ### ååºå段 |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | Long | ç¼å· | |
| | | | type | Integer | äºå¡ç±»åï¼1-å
¥åº 2-åºåºï¼ | |
| | | | typeName | String | äºå¡ç±»ååç§°ï¼å
¥åº/åºåºï¼ | |
| | | | bizType | Integer | ä¸å¡ç±»åç¼ç | |
| | | | bizTypeName | String | ä¸å¡ç±»ååç§° | |
| | | | bizCode | String | ä¸å¡åå· | |
| | | | itemId | Long | ç©æID | |
| | | | itemCode | String | ç©æç¼ç | |
| | | | itemName | String | ç©æåç§° | |
| | | | quantity | BigDecimal | å卿°éï¼æ£æ°=å
¥åºï¼è´æ°=åºåºï¼ | |
| | | | batchId | Long | æ¹æ¬¡ID | |
| | | | batchCode | String | æ¹æ¬¡å· | |
| | | | warehouseId | Long | ä»åºID | |
| | | | warehouseName | String | ä»åºåç§° | |
| | | | locationId | Long | åºåºID | |
| | | | locationName | String | åºåºåç§° | |
| | | | areaId | Long | åºä½ID | |
| | | | areaName | String | åºä½åç§° | |
| | | | transactionTime | String | äºå¡åçæ¶é´ | |
| | | | createTime | String | å建æ¶é´ | |
| | | |
| | | ### ååºç¤ºä¾ |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "total": 50, |
| | | "list": [ |
| | | { |
| | | "id": 1, |
| | | "type": 1, |
| | | "typeName": "å
¥åº", |
| | | "bizType": 126, |
| | | "bizTypeName": "èªå®ä¹å
¥åº", |
| | | "bizCode": "STOCK_ADJUST_6", |
| | | "itemId": 2, |
| | | "itemCode": "M001", |
| | | "itemName": "èºä¸", |
| | | "quantity": 100.00, |
| | | "batchId": 7, |
| | | "batchCode": "T8811", |
| | | "warehouseId": 1, |
| | | "warehouseName": "æåä»", |
| | | "locationId": 1, |
| | | "locationName": "Aåº", |
| | | "areaId": 1, |
| | | "areaName": "A-01-01", |
| | | "transactionTime": "2025-07-15 10:30:00", |
| | | "createTime": "2025-07-15 10:30:00" |
| | | } |
| | | ] |
| | | }, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ## ä¸å¡ç±»å说æ |
| | | |
| | | | bizType | bizTypeName | 说æ | |
| | | |---------|-------------|------| |
| | | | 126 | èªå®ä¹å
¥åº | åºåè°æ´å
¥åº | |
| | | | 127 | èªå®ä¹åºåº | åºåè°æ´åºåº | |
| | | | 110 | éè´å
¥åº | éè´å
¥åºå | |
| | | | 119 | éå®åºåº | éå®åºåºå | |
| | | | 112 | è°æ¨åºåº | åºåè°æ¨åºåº | |
| | | | 113 | è°æ¨å
¥åº | åºåè°æ¨å
¥åº | |
| | | | 115 | å
¶ä»å
¥åº | å
¶ä»å
¥åºå | |
| | | | 114 | å
¶ä»åºåº | å
¶ä»åºåºå | |
| | | | 116 | çäº§é¢æ | çäº§é¢æå | |
| | | | 117 | çäº§éæ | ç产éæå | |
| | | | 118 | ç产å
¥åº | ç产å
¥åºå | |
| | | | 123 | ç产æ¶è | ç产æ¥å·¥æ¶è | |
| | | | 124 | 产åäº§åº | ç产æ¥å·¥äº§åº | |
| | | | 125 | ä¾åºåéè´§ | ä¾åºåéè´§åºåº | |
| | | | 120 | éå®éè´§ | éå®éè´§å
¥åº | |
| | | | 121 | å¤ååæ | å¤ååæ | |
| | | | 122 | å¤åå
¥åº | å¤åå
¥åº | |
| | | |
| | | ## æç´¢æ¡ä»¶ |
| | | |
| | | | æ¡ä»¶å段 | ç»ä»¶ç±»å | 说æ | |
| | | |----------|----------|------| |
| | | | ç©æ | ç©æéæ©å¼¹çª | éæ©ç©æåå¸¦åº itemId | |
| | | | æ¹æ¬¡å· | Input è¾å
¥æ¡ | æ¯ææ¨¡ç³æç´¢ | |
| | | | ä»åº | 䏿鿩 | éæ©ä»åº | |
| | | | åºåº | 䏿鿩 | æ ¹æ®ä»åºèå¨å è½½ | |
| | | | åºä½ | 䏿鿩 | æ ¹æ®åºåºèå¨å è½½ | |
| | | | äºå¡ç±»å | 䏿鿩 | é项ï¼å
¥åºãåºåº | |
| | | | ä¸å¡ç±»å | 䏿鿩 | é项è§ä¸è¡¨ä¸å¡ç±»å说æ | |
| | | | ä¸å¡åå· | Input è¾å
¥æ¡ | æ¯ææ¨¡ç³æç´¢ | |
| | | | æ¶é´èå´ | DatePicker æ¥æèå´ | éæ©äºå¡åçæ¶é´èå´ | |
| | | |
| | | ## åè¡¨åæ®µå±ç¤º |
| | | |
| | | | åå | åæ®µ | 宽度 | 说æ | |
| | | |------|------|------|------| |
| | | | äºå¡ç±»å | typeName | 80 | å
¥åºæ¾ç¤ºç»¿è²æ ç¾ï¼åºåºæ¾ç¤ºçº¢è²æ ç¾ | |
| | | | ä¸å¡ç±»å | bizTypeName | 100 | ä¸å¡ç±»ååç§° | |
| | | | ä¸å¡åå· | bizCode | 150 | å¯ç¹å»è·³è½¬å°å¯¹åºä¸å¡åæ® | |
| | | | ç©æç¼ç | itemCode | 120 | - | |
| | | | ç©æåç§° | itemName | 150 | - | |
| | | | æ¹æ¬¡å· | batchCode | 120 | æ æ¹æ¬¡æ¶æ¾ç¤ºç©º | |
| | | | æ°é | quantity | 100 | æ£æ°æ¾ç¤ºç»¿è²ï¼è´æ°æ¾ç¤ºçº¢è² | |
| | | | ä»åº | warehouseName | 100 | - | |
| | | | åºåº | locationName | 100 | - | |
| | | | åºä½ | areaName | 100 | - | |
| | | | äºå¡æ¶é´ | transactionTime | 160 | æ ¼å¼ï¼yyyy-MM-dd HH:mm:ss | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | æ°æ®åªè¯» | æµæ°´è®°å½ç±ç³»ç»èªå¨çæï¼ä¸å¯äººå·¥æ°å¢ãä¿®æ¹ãå é¤ | |
| | | | é»è®¤æåº | æäºå¡æ¶é´ååºæå | |
| | | | æ°éæ¾ç¤º | quantity > 0 æ¾ç¤ºç»¿è²ï¼quantity < 0 æ¾ç¤ºçº¢è² | |
| | | | ç±»åæ ç¾ | å
¥åºæ¾ç¤ºç»¿è² success æ ç¾ï¼åºåºæ¾ç¤ºçº¢è² danger æ ç¾ | |
| | | | ä¸å¡åå·è·³è½¬ | ç¹å» bizCode å¯è·³è½¬å°å¯¹åºä¸å¡åæ®è¯¦æ
页 | |
| | | |
| | | ## æéé
ç½® |
| | | |
| | | | æéæ è¯ | 说æ | |
| | | |----------|------| |
| | | | mes:wm-transaction:query | æ¥è¯¢åºåäºå¡æµæ°´ | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. æµæ°´è®°å½ä¸ºç³»ç»èªå¨çæï¼é¡µé¢ä¸æä¾æ°å¢ãç¼è¾ãå é¤æé® |
| | | 2. ä¸å¡åå·ï¼bizCodeï¼å¯ä½ä¸ºè·³è½¬é¾æ¥ï¼ç¹å»è·³è½¬å°å¯¹åºä¸å¡åæ® |
| | | 3. æç´¢æ¡ä»¶ä¸çä»åºãåºåºãåºä½åå¨èå¨å
³ç³»ï¼ |
| | | - éæ©ä»åºåï¼åºåºä¸æåªæ¾ç¤ºè¯¥ä»åºä¸çåºåº |
| | | - éæ©åºåºåï¼åºä½ä¸æåªæ¾ç¤ºè¯¥åºåºä¸çåºä½ |
| | | 4. æ¶é´èå´æç´¢é»è®¤å¯æ¥è¯¢æè¿30å¤©æ°æ® |
| | |
| | | /** |
| | | * æ´æ°éå®è®¢åçåºåºç¶æ |
| | | * |
| | | * æ ¹æ®æç»åºåºæ°éèªå¨è®¡ç®è®¢åç¶æï¼ |
| | | * - æææç»é½å®æåºåº â å®æç¶æ |
| | | * - é¨åæç»å®æåºåº â é¨ååºåºç¶æ |
| | | * |
| | | * @param orderId 订åç¼å· |
| | | */ |
| | | CommonResult<Boolean> updateOrderOutStatus(Long orderId); |
| | | |
| | | /** |
| | | * æ´æ°éå®è®¢åçåºåºç¶æä¸ºæå®å¼ |
| | | * |
| | | * @param orderId 订åç¼å· |
| | | * @param outStatus åºåºç¶æ |
| | | */ |
| | | CommonResult<Boolean> updateOrderOutStatusTo(Long orderId, Integer outStatus); |
| | | |
| | | } |
| ÎļþÃû´Ó yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErpSaleOrderOutStatusEnum.java ÐÞ¸Ä |
| | |
| | | package cn.iocoder.yudao.module.erp.enums; |
| | | package cn.iocoder.yudao.module.erp.api.sale.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | |
| | | public enum ErpSaleOrderOutStatusEnum implements ArrayValuable<Integer> { |
| | | |
| | | NOT_OUT(0, "æªåºåº"), |
| | | PART_OUT(1, "é¨ååºåº"), |
| | | ALL_OUT(2, "å
¨é¨åºåº"); |
| | | RESERVED(1, "å·²é¢ç"), // åè´§éç¥åå®¡æ ¸éè¿ |
| | | PART_OUT(2, "é¨ååºåº"), // é¨åæ£è´§/åºåº |
| | | ALL_OUT(3, "å
¨é¨åºåº"); // å
¨é¨åºåºå®æ |
| | | |
| | | private final Integer status; |
| | | private final String name; |
| | |
| | | return success(true); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Boolean> updateOrderOutStatusTo(Long orderId, Integer outStatus) { |
| | | if (orderId == null || outStatus == null) { |
| | | return success(false); |
| | | } |
| | | saleOrderMapper.updateById(new ErpSaleOrderDO() |
| | | .setId(orderId).setOutStatus(outStatus)); |
| | | return success(true); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAccountDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinanceReceiptDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinanceReceiptItemDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpCustomerDO; |
| | | import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService; |
| | | import cn.iocoder.yudao.module.erp.service.finance.ErpFinanceReceiptService; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpCustomerService; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | |
| | | @Resource |
| | | private ErpFinanceReceiptService financeReceiptService; |
| | | @Resource |
| | | private ErpCustomerService customerService; |
| | | private CrmCustomerApi customerApi; |
| | | @Resource |
| | | private ErpAccountService accountService; |
| | | |
| | |
| | | convertSet(pageResult.getList(), ErpFinanceReceiptDO::getId)); |
| | | Map<Long, List<ErpFinanceReceiptItemDO>> financeReceiptItemMap = convertMultiMap(receiptItemList, ErpFinanceReceiptItemDO::getReceiptId); |
| | | // 1.2 客æ·ä¿¡æ¯ |
| | | Map<Long, ErpCustomerDO> customerMap = customerService.getCustomerMap( |
| | | Map<Long, CrmCustomerRespDTO> customerMap = customerApi.getCustomerMap( |
| | | convertSet(pageResult.getList(), ErpFinanceReceiptDO::getCustomerId)); |
| | | // 1.3 ç»ç®è´¦æ·ä¿¡æ¯ |
| | | Map<Long, ErpAccountDO> accountMap = accountService.getAccountMap( |
| | |
| | | @ToString(callSuper = true) |
| | | public class ErpSaleOrderPageReqVO extends PageParam { |
| | | |
| | | /** |
| | | * åºåºç¶æ - æ |
| | | */ |
| | | public static final Integer OUT_STATUS_NONE = 0; |
| | | /** |
| | | * åºåºç¶æ - é¨å |
| | | */ |
| | | public static final Integer OUT_STATUS_PART = 1; |
| | | /** |
| | | * åºåºç¶æ - å
¨é¨ |
| | | */ |
| | | public static final Integer OUT_STATUS_ALL = 2; |
| | | |
| | | /** |
| | | * éè´§ç¶æ - æ |
| | | */ |
| | | public static final Integer RETURN_STATUS_NONE = 0; |
| | | /** |
| | | * éè´§ç¶æ - é¨å |
| | | */ |
| | | public static final Integer RETURN_STATUS_PART = 1; |
| | | /** |
| | | * éè´§ç¶æ - å
¨é¨ |
| | | */ |
| | | public static final Integer RETURN_STATUS_ALL = 2; |
| | | |
| | | @Schema(description = "éå®åç¼å·", example = "XS001") |
| | | private String no; |
| | | |
| | |
| | | |
| | | @Schema(description = "产åç¼å·", example = "1") |
| | | private Long productId; |
| | | |
| | | @Schema(description = "åºåºç¶æ", example = "2") |
| | | private Integer outStatus; |
| | | |
| | | @Schema(description = "éè´§ç¶æ", example = "2") |
| | | private Integer returnStatus; |
| | | |
| | | @Schema(description = "æ¯å¦å¯åºåº", example = "true") |
| | | private Boolean outEnable; |
| | | |
| | | @Schema(description = "æ¯å¦å¯éè´§", example = "true") |
| | | private Boolean returnEnable; |
| | | |
| | | } |
| | |
| | | |
| | | // ========== éå®åºåº ========== |
| | | |
| | | @Schema(description = "éå®åºåºæ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") |
| | | @Schema(description = "éå®åºåºæ°é", example = "100.00") |
| | | private BigDecimal outCount; |
| | | |
| | | // ========== éå®éè´§ï¼åºåºï¼ï¼ ========== |
| | | |
| | | @Schema(description = "éå®éè´§æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") |
| | | private BigDecimal returnCount; |
| | | @Schema(description = "åºåºç¶æ", example = "0") |
| | | private Integer outStatus; |
| | | |
| | | @Data |
| | | public static class Item { |
| | |
| | | |
| | | // ========== éå®åºåº ========== |
| | | |
| | | @Schema(description = "éå®åºåºæ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") |
| | | @Schema(description = "éå®åºåºæ°é", example = "100.00") |
| | | private BigDecimal outCount; |
| | | |
| | | // ========== éå®éè´§ï¼å
¥åºï¼ï¼ ========== |
| | | |
| | | @Schema(description = "éå®éè´§æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") |
| | | private BigDecimal returnCount; |
| | | |
| | | // ========== å
³èåæ®µ ========== |
| | | |
| | |
| | | private String productUnitName; |
| | | |
| | | @Schema(description = "åºåæ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") |
| | | private BigDecimal stockCount; // è¯¥åæ®µä»
ä»
å¨â详æ
âåâç¼è¾âæ¶ä½¿ç¨ |
| | | private BigDecimal stockCount; // è¯¥åæ®µä»
ä»
å¨è¯¦æ
åç¼è¾æ¶ä½¿ç¨ |
| | | |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.dataobject.finance; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpCustomerDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | |
| | | */ |
| | | private Long accountId; |
| | | /** |
| | | * å
³èéè´ç³è¯·ç¼å· |
| | | * |
| | | * å
³è {@link ErpPurchaseRequestDO#getId()} |
| | | */ |
| | | private Long requestId; |
| | | /** |
| | | * éè´ç³è¯·åå· |
| | | */ |
| | | private String requestNo; |
| | | /** |
| | | * ä¸åæ¶é´ |
| | | */ |
| | | private LocalDateTime orderTime; |
| | |
| | | private String remark; |
| | | |
| | | // ========== éå®åºåº ========== |
| | | |
| | | /** |
| | | * éå®åºåºæ°é |
| | | */ |
| | | private BigDecimal outCount; |
| | | |
| | | // ========== éå®éè´§ï¼å
¥åºï¼ï¼ ========== |
| | | /** |
| | | * éå®éè´§æ°é |
| | | */ |
| | | private BigDecimal returnCount; |
| | | |
| | | /** |
| | | * åºåºç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.erp.enums.ErpSaleOrderOutStatusEnum} |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.erp.api.sale.enums.ErpSaleOrderOutStatusEnum} |
| | | */ |
| | | private Integer outStatus; |
| | | |
| | |
| | | private String remark; |
| | | |
| | | // ========== éå®åºåº ========== |
| | | |
| | | /** |
| | | * éå®åºåºæ°é |
| | | */ |
| | | private BigDecimal outCount; |
| | | |
| | | // ========== éå®éè´§ï¼å
¥åºï¼ï¼ ========== |
| | | /** |
| | | * éå®éè´§æ°é |
| | | */ |
| | | private BigDecimal returnCount; |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * ERP éå®è®¢å Mapper |
| | |
| | | .likeIfPresent(ErpSaleOrderDO::getRemark, reqVO.getRemark()) |
| | | .eqIfPresent(ErpSaleOrderDO::getCreator, reqVO.getCreator()) |
| | | .orderByDesc(ErpSaleOrderDO::getId); |
| | | // å
¥åºç¶æã为ä»ä¹éè¦ t. çåå ï¼æ¯å 为è表æ¥è¯¢æ¶ï¼éè¦æå®è¡¨åï¼ä¸ç¶ä¼æ¥ out_count é误 |
| | | if (Objects.equals(reqVO.getOutStatus(), ErpSaleOrderPageReqVO.OUT_STATUS_NONE)) { |
| | | query.eq(ErpSaleOrderDO::getOutCount, 0); |
| | | } else if (Objects.equals(reqVO.getOutStatus(), ErpSaleOrderPageReqVO.OUT_STATUS_PART)) { |
| | | query.gt(ErpSaleOrderDO::getOutCount, 0).apply("t.out_count < t.total_count"); |
| | | } else if (Objects.equals(reqVO.getOutStatus(), ErpSaleOrderPageReqVO.OUT_STATUS_ALL)) { |
| | | query.apply("t.out_count = t.total_count"); |
| | | } |
| | | // éè´§ç¶æ |
| | | if (Objects.equals(reqVO.getReturnStatus(), ErpSaleOrderPageReqVO.RETURN_STATUS_NONE)) { |
| | | query.eq(ErpSaleOrderDO::getReturnCount, 0); |
| | | } else if (Objects.equals(reqVO.getReturnStatus(), ErpSaleOrderPageReqVO.RETURN_STATUS_PART)) { |
| | | query.gt(ErpSaleOrderDO::getReturnCount, 0).apply("t.return_count < t.total_count"); |
| | | } else if (Objects.equals(reqVO.getReturnStatus(), ErpSaleOrderPageReqVO.RETURN_STATUS_ALL)) { |
| | | query.apply("t.return_count = t.total_count"); |
| | | } |
| | | // å¯éå®åºåº |
| | | if (Boolean.TRUE.equals(reqVO.getOutEnable())) { |
| | | query.eq(ErpSaleOrderDO::getStatus, ErpAuditStatus.APPROVE.getStatus()) |
| | | .apply("t.out_count < t.total_count"); |
| | | } |
| | | // å¯éå®éè´§ |
| | | if (Boolean.TRUE.equals(reqVO.getReturnEnable())) { |
| | | query.eq(ErpSaleOrderDO::getStatus, ErpAuditStatus.APPROVE.getStatus()) |
| | | .apply("t.return_count < t.out_count"); |
| | | } |
| | | if (reqVO.getProductId() != null) { |
| | | query.leftJoin(ErpSaleOrderItemDO.class, ErpSaleOrderItemDO::getOrderId, ErpSaleOrderDO::getId) |
| | | .eq(reqVO.getProductId() != null, ErpSaleOrderItemDO::getProductId, reqVO.getProductId()) |
| | |
| | | * éè´è®¢å {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO} |
| | | */ |
| | | public static final String PURCHASE_ORDER_NO_PREFIX = "CGDD"; |
| | | /** |
| | | * éè´ç³è¯· {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO} |
| | | */ |
| | | public static final String PURCHASE_REQUEST_NO_PREFIX = "CGSQ"; |
| | | |
| | | /** |
| | | * 仿¬¾å {@link cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentDO} |
| | |
| | | import cn.iocoder.yudao.module.erp.enums.ErpPurchaseOrderInStatusEnum; |
| | | import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | |
| | | |
| | | /** |
| | | * ERP éè´è®¢å Service å®ç°ç±» |
| | | * |
| | | * 注æï¼éè´è®¢åä¸éè¦ BPM 审æ¹ï¼å®¡æ¹æµç¨å¨éè´ç³è¯·é¶æ®µå®æã |
| | | * éè´è®¢åç±éè´ç³è¯·çæï¼æç´æ¥å建ï¼ç¶æä¸ºå·²å®¡æ ¸ï¼ã |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | |
| | | private ErpSupplierService supplierService; |
| | | @Resource |
| | | private ErpAccountService accountService; |
| | | |
| | | @Resource |
| | | @Lazy |
| | | private ErpPurchaseRequestService purchaseRequestService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | // 4. æ´æ°éè´è®¢åå
¥åºç¶æ |
| | | purchaseOrderMapper.updateById(new ErpPurchaseOrderDO() |
| | | .setId(orderId).setInStatus(inStatus)); |
| | | // 5. åæ¥æ´æ°éè´ç³è¯·çå
¥åºç¶æï¼å¦ææå
³èçéè´ç³è¯·ï¼ |
| | | if (order.getRequestId() != null) { |
| | | purchaseRequestService.updatePurchaseRequestInStatus(order.getRequestId(), inStatus); |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | void updateSaleOrderOutCount(Long id, Map<Long, BigDecimal> outCountMap); |
| | | |
| | | /** |
| | | * æ´æ°éå®è®¢åçéè´§æ°é |
| | | * |
| | | * @param orderId ç¼å· |
| | | * @param returnCountMap éè´§æ°é Mapï¼key éå®è®¢å项ç¼å·ï¼value éè´§æ°é |
| | | */ |
| | | void updateSaleOrderReturnCount(Long orderId, Map<Long, BigDecimal> returnCountMap); |
| | | |
| | | /** |
| | | * å é¤éå®è®¢å |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpSaleOrderOutStatusEnum; |
| | | import cn.iocoder.yudao.module.erp.api.sale.enums.ErpSaleOrderOutStatusEnum; |
| | | import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | |
| | | |
| | | // 2.1 æå
¥è®¢å |
| | | ErpSaleOrderDO saleOrder = BeanUtils.toBean(createReqVO, ErpSaleOrderDO.class, in -> in |
| | | .setNo(no).setStatus(ErpAuditStatus.PROCESS.getStatus())); |
| | | .setNo(no).setStatus(ErpAuditStatus.PROCESS.getStatus()) |
| | | .setOutCount(BigDecimal.ZERO).setOutStatus(ErpSaleOrderOutStatusEnum.NOT_OUT.getStatus())); |
| | | calculateTotalPrice(saleOrder, saleOrderItems); |
| | | saleOrderMapper.insert(saleOrder); |
| | | // 2.2 æå
¥è®¢å项 |
| | |
| | | if (!approve && outCount.compareTo(BigDecimal.ZERO) > 0) { |
| | | throw exception(SALE_ORDER_PROCESS_FAIL_EXISTS_OUT); |
| | | } |
| | | // 1.4 åå¨éå®éè´§åï¼æ æ³åå®¡æ ¸ |
| | | BigDecimal returnCount = saleOrder.getReturnCount() != null ? saleOrder.getReturnCount() : BigDecimal.ZERO; |
| | | if (!approve && returnCount.compareTo(BigDecimal.ZERO) > 0) { |
| | | throw exception(SALE_ORDER_PROCESS_FAIL_EXISTS_RETURN); |
| | | } |
| | | |
| | | // 2. æ´æ°ç¶æ |
| | | int updateCount = saleOrderMapper.updateByIdAndStatus(id, saleOrder.getStatus(), |
| | |
| | | BigDecimal outCount = saleOrder.getOutCount() != null ? saleOrder.getOutCount() : BigDecimal.ZERO; |
| | | if (outCount.compareTo(BigDecimal.ZERO) > 0) { |
| | | throw exception(SALE_ORDER_CANCEL_FAIL_EXISTS_OUT); |
| | | } |
| | | // 1.4 åå¨éå®éè´§åï¼æ æ³ä½åº |
| | | BigDecimal returnCount = saleOrder.getReturnCount() != null ? saleOrder.getReturnCount() : BigDecimal.ZERO; |
| | | if (returnCount.compareTo(BigDecimal.ZERO) > 0) { |
| | | throw exception(SALE_ORDER_CANCEL_FAIL_EXISTS_RETURN); |
| | | } |
| | | |
| | | // 2. æ´æ°ç¶æä¸ºå·²ä½åº |
| | |
| | | // 2. æ´æ°éå®è®¢å |
| | | BigDecimal totalOutCount = getSumValue(outCountMap.values(), value -> value, BigDecimal::add, BigDecimal.ZERO); |
| | | saleOrderMapper.updateById(new ErpSaleOrderDO().setId(id).setOutCount(totalOutCount)); |
| | | } |
| | | |
| | | @Override |
| | | public void updateSaleOrderReturnCount(Long orderId, Map<Long, BigDecimal> returnCountMap) { |
| | | List<ErpSaleOrderItemDO> orderItems = saleOrderItemMapper.selectListByOrderId(orderId); |
| | | // 1. æ´æ°æ¯ä¸ªéå®è®¢å项 |
| | | orderItems.forEach(item -> { |
| | | BigDecimal returnCount = returnCountMap.getOrDefault(item.getId(), BigDecimal.ZERO); |
| | | if (item.getReturnCount().equals(returnCount)) { |
| | | return; |
| | | } |
| | | if (returnCount.compareTo(item.getOutCount()) > 0) { |
| | | throw exception(SALE_ORDER_ITEM_RETURN_FAIL_OUT_EXCEED, |
| | | "产åID:" + item.getProductId(), item.getOutCount()); |
| | | } |
| | | saleOrderItemMapper.updateById(new ErpSaleOrderItemDO().setId(item.getId()).setReturnCount(returnCount)); |
| | | }); |
| | | // 2. æ´æ°éå®è®¢å |
| | | BigDecimal totalReturnCount = getSumValue(returnCountMap.values(), value -> value, BigDecimal::add, BigDecimal.ZERO); |
| | | saleOrderMapper.updateById(new ErpSaleOrderDO().setId(orderId).setReturnCount(totalReturnCount)); |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | */ |
| | | CommonResult<MdmItemCategoryRespDTO> validateItemCategoryExists(Long id); |
| | | |
| | | /** |
| | | * æ ¹æ®ç©æ/äº§åæ è¯è·ååç±» |
| | | * |
| | | * @param itemOrProduct ç©æ/äº§åæ è¯ |
| | | * @return ç©æåç±» |
| | | */ |
| | | CommonResult<MdmItemCategoryRespDTO> getItemCategoryByItemOrProduct(String itemOrProduct); |
| | | |
| | | } |
| | |
| | | return success(BeanUtils.toBean(itemCategory, MdmItemCategoryRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemCategoryRespDTO> getItemCategoryByItemOrProduct(String itemOrProduct) { |
| | | MdmItemCategoryDO itemCategory = itemCategoryService.getItemCategoryByItemOrProduct(itemOrProduct); |
| | | return success(BeanUtils.toBean(itemCategory, MdmItemCategoryRespDTO.class)); |
| | | } |
| | | |
| | | } |
| | |
| | | @Schema(description = "ç©æç±»å", example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "ç©æ/äº§åæ è¯(å
¼å®¹MES)", example = "ITEM") |
| | | private String itemOrProduct; |
| | | |
| | | @Schema(description = "æåº", example = "1") |
| | | private Integer sort; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemBatchConfigRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * MDM ç©ææ¹æ¬¡é
ç½® API æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmItemBatchConfigApi { |
| | | |
| | | String PREFIX = "/rpc-api/mdm/item-batch-config"; |
| | | |
| | | /** |
| | | * æ ¹æ®ç©æç¼å·è·åæ¹æ¬¡é
ç½® |
| | | * |
| | | * @param itemId ç©æç¼å· |
| | | * @return æ¹æ¬¡é
ç½®ï¼ä¸åå¨è¿å nullï¼ |
| | | */ |
| | | CommonResult<MdmItemBatchConfigRespDTO> getItemBatchConfigByItemId(Long itemId); |
| | | |
| | | /** |
| | | * æ ¹æ®ç©æç¼å·è·åæ¹æ¬¡é
ç½®ï¼ä¾¿æ·æ¹æ³ï¼ |
| | | * |
| | | * @param itemId ç©æç¼å· |
| | | * @return æ¹æ¬¡é
ç½®ï¼ä¸åå¨è¿å nullï¼ |
| | | */ |
| | | default MdmItemBatchConfigRespDTO getItemBatchConfig(Long itemId) { |
| | | CommonResult<MdmItemBatchConfigRespDTO> result = getItemBatchConfigByItemId(itemId); |
| | | return result != null ? result.getData() : null; |
| | | } |
| | | |
| | | /** |
| | | * ä¿åæ¹æ¬¡é
ç½® |
| | | * |
| | | * @param config æ¹æ¬¡é
ç½® |
| | | * @return é
ç½®ç¼å· |
| | | */ |
| | | CommonResult<Long> saveItemBatchConfig(MdmItemBatchConfigDO config); |
| | | |
| | | /** |
| | | * ä¿åæ¹æ¬¡é
ç½®ï¼ä¾¿æ·æ¹æ³ï¼ |
| | | * |
| | | * @param config æ¹æ¬¡é
ç½® |
| | | * @return é
ç½®ç¼å· |
| | | */ |
| | | default Long saveItemBatch(MdmItemBatchConfigDO config) { |
| | | CommonResult<Long> result = saveItemBatchConfig(config); |
| | | return result != null ? result.getData() : null; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemBatchConfigRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO; |
| | | import cn.iocoder.yudao.module.mdm.service.item.MdmItemBatchConfigService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * MDM ç©ææ¹æ¬¡é
ç½® API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RestController |
| | | @Validated |
| | | public class MdmItemBatchConfigApiImpl implements MdmItemBatchConfigApi { |
| | | |
| | | @Resource |
| | | private MdmItemBatchConfigService itemBatchConfigService; |
| | | |
| | | @Override |
| | | public CommonResult<MdmItemBatchConfigRespDTO> getItemBatchConfigByItemId(Long itemId) { |
| | | MdmItemBatchConfigDO config = itemBatchConfigService.getItemBatchConfigByItemId(itemId); |
| | | return success(BeanUtils.toBean(config, MdmItemBatchConfigRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Long> saveItemBatchConfig(MdmItemBatchConfigDO config) { |
| | | return success(itemBatchConfigService.saveItemBatchConfig(config)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemSyncReqDTO; |
| | | |
| | | /** |
| | | * MDM ç©æåæ¥ API æ¥å£ |
| | | * |
| | | * ä¾ MES 模ååæ¥ç©æä¸»æ°æ®å° MDM ä½¿ç¨ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmItemSyncApi { |
| | | |
| | | String PREFIX = "/rpc-api/mdm/item-sync"; |
| | | |
| | | /** |
| | | * åæ¥ç©æå° MDMï¼æ code å¹é
ï¼åå¨åæ´æ°ï¼ä¸åå¨ååå»ºï¼ |
| | | * |
| | | * @param syncReqDTO åæ¥ä¿¡æ¯ |
| | | * @return MDM ç©æç¼å· |
| | | */ |
| | | CommonResult<Long> syncItemToMdm(MdmItemSyncReqDTO syncReqDTO); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemSyncReqDTO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemBatchConfigMapper; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * MDM ç©æåæ¥ API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RestController |
| | | @Validated |
| | | public class MdmItemSyncApiImpl implements MdmItemSyncApi { |
| | | |
| | | @Resource |
| | | private MdmItemMapper itemMapper; |
| | | |
| | | @Resource |
| | | private MdmItemBatchConfigMapper itemBatchConfigMapper; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public CommonResult<Long> syncItemToMdm(MdmItemSyncReqDTO syncReqDTO) { |
| | | // 1. æ code æ¥è¯¢æ¯å¦å·²åå¨ |
| | | MdmItemDO existingItem = itemMapper.selectByCode(syncReqDTO.getCode()); |
| | | |
| | | // 2. ä¿åææ´æ°ç©æä¸»æ°æ® |
| | | MdmItemDO item = BeanUtils.toBean(syncReqDTO, MdmItemDO.class); |
| | | Long itemId; |
| | | if (existingItem != null) { |
| | | // æ´æ° |
| | | item.setId(existingItem.getId()); |
| | | itemMapper.updateById(item); |
| | | itemId = existingItem.getId(); |
| | | } else { |
| | | // æ°å¢ |
| | | itemMapper.insert(item); |
| | | itemId = item.getId(); |
| | | } |
| | | |
| | | // 3. åæ¥æ¹æ¬¡å±æ§é
ç½® |
| | | syncBatchConfig(itemId, syncReqDTO); |
| | | |
| | | return success(itemId); |
| | | } |
| | | |
| | | /** |
| | | * åæ¥æ¹æ¬¡å±æ§é
ç½® |
| | | */ |
| | | private void syncBatchConfig(Long itemId, MdmItemSyncReqDTO syncReqDTO) { |
| | | // æ£æ¥æ¯å¦ææ¹æ¬¡é
ç½®æ°æ® |
| | | if (syncReqDTO.getProduceDateFlag() == null |
| | | && syncReqDTO.getExpireDateFlag() == null |
| | | && syncReqDTO.getReceiptDateFlag() == null |
| | | && syncReqDTO.getVendorFlag() == null |
| | | && syncReqDTO.getPurchaseOrderCodeFlag() == null |
| | | && syncReqDTO.getLotNumberFlag() == null |
| | | && syncReqDTO.getQualityStatusFlag() == null) { |
| | | return; |
| | | } |
| | | |
| | | // æ¥è¯¢å·²æé
ç½® |
| | | MdmItemBatchConfigDO existing = itemBatchConfigMapper.selectOne(MdmItemBatchConfigDO::getItemId, itemId); |
| | | |
| | | MdmItemBatchConfigDO config = new MdmItemBatchConfigDO(); |
| | | config.setItemId(itemId); |
| | | config.setProduceDateFlag(Boolean.TRUE.equals(syncReqDTO.getProduceDateFlag())); |
| | | config.setExpireDateFlag(Boolean.TRUE.equals(syncReqDTO.getExpireDateFlag())); |
| | | config.setReceiptDateFlag(Boolean.TRUE.equals(syncReqDTO.getReceiptDateFlag())); |
| | | config.setVendorFlag(Boolean.TRUE.equals(syncReqDTO.getVendorFlag())); |
| | | config.setPurchaseOrderCodeFlag(Boolean.TRUE.equals(syncReqDTO.getPurchaseOrderCodeFlag())); |
| | | config.setLotNumberFlag(Boolean.TRUE.equals(syncReqDTO.getLotNumberFlag())); |
| | | config.setQualityStatusFlag(Boolean.TRUE.equals(syncReqDTO.getQualityStatusFlag())); |
| | | // æ¸
空ä¸éè¦çåæ®µ |
| | | config.setClientFlag(false); |
| | | config.setSalesOrderCodeFlag(false); |
| | | config.setWorkOrderFlag(false); |
| | | config.setTaskFlag(false); |
| | | config.setWorkstationFlag(false); |
| | | config.setToolFlag(false); |
| | | config.setMoldFlag(false); |
| | | |
| | | if (existing != null) { |
| | | config.setId(existing.getId()); |
| | | itemBatchConfigMapper.updateById(config); |
| | | } else { |
| | | itemBatchConfigMapper.insert(config); |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * MDM ç©ææ¹æ¬¡é
ç½® Response DTO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Data |
| | | public class MdmItemBatchConfigRespDTO implements Serializable { |
| | | |
| | | /** |
| | | * ç¼å· |
| | | */ |
| | | private Long id; |
| | | |
| | | /** |
| | | * ç©æç¼å· |
| | | */ |
| | | private Long itemId; |
| | | |
| | | /** |
| | | * çäº§æ¥æå¿
å¡« |
| | | */ |
| | | private Boolean produceDateFlag; |
| | | |
| | | /** |
| | | * æææå¿
å¡« |
| | | */ |
| | | private Boolean expireDateFlag; |
| | | |
| | | /** |
| | | * å
¥åºæ¥æå¿
å¡« |
| | | */ |
| | | private Boolean receiptDateFlag; |
| | | |
| | | /** |
| | | * ä¾åºåå¿
å¡« |
| | | */ |
| | | private Boolean vendorFlag; |
| | | |
| | | /** |
| | | * 客æ·å¿
å¡« |
| | | */ |
| | | private Boolean clientFlag; |
| | | |
| | | /** |
| | | * éå®è®¢åç¼å·å¿
å¡« |
| | | */ |
| | | private Boolean salesOrderCodeFlag; |
| | | |
| | | /** |
| | | * éè´è®¢åç¼å·å¿
å¡« |
| | | */ |
| | | private Boolean purchaseOrderCodeFlag; |
| | | |
| | | /** |
| | | * ç产工åå¿
å¡« |
| | | */ |
| | | private Boolean workOrderFlag; |
| | | |
| | | /** |
| | | * ç产任å¡å¿
å¡« |
| | | */ |
| | | private Boolean taskFlag; |
| | | |
| | | /** |
| | | * å·¥ä½ç«å¿
å¡« |
| | | */ |
| | | private Boolean workstationFlag; |
| | | |
| | | /** |
| | | * å·¥å
·å¿
å¡« |
| | | */ |
| | | private Boolean toolFlag; |
| | | |
| | | /** |
| | | * 模å
·å¿
å¡« |
| | | */ |
| | | private Boolean moldFlag; |
| | | |
| | | /** |
| | | * ç产æ¹å·å¿
å¡« |
| | | */ |
| | | private Boolean lotNumberFlag; |
| | | |
| | | /** |
| | | * è´¨éç¶æå¿
å¡« |
| | | */ |
| | | private Boolean qualityStatusFlag; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.api.item.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * MDM ç©æåæ¥ Request DTO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Schema(description = "MDM ç©æåæ¥ Request DTO") |
| | | @Data |
| | | public class MdmItemSyncReqDTO { |
| | | |
| | | @Schema(description = "ç©æç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "ITEM001") |
| | | private String code; |
| | | |
| | | @Schema(description = "ç©æåç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "èºä¸") |
| | | private String name; |
| | | |
| | | @Schema(description = "è§æ ¼åå·", example = "M6*20") |
| | | private String specification; |
| | | |
| | | @Schema(description = "ç©æç±»åï¼1åæ, 2åæå, 3æå, 4è¾
æ", example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "计éåä½ID", example = "1") |
| | | private Long unitMeasureId; |
| | | |
| | | @Schema(description = "åç±»ID", example = "1") |
| | | private Long categoryId; |
| | | |
| | | @Schema(description = "åçID", example = "1") |
| | | private Long brandId; |
| | | |
| | | @Schema(description = "ç¶æï¼0å¯ç¨, 1ç¦ç¨", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "éè´ä»·", example = "10.00") |
| | | private BigDecimal purchasePrice; |
| | | |
| | | @Schema(description = "éå®ä»·", example = "20.00") |
| | | private BigDecimal salesPrice; |
| | | |
| | | @Schema(description = "ææ¬ä»·", example = "15.00") |
| | | private BigDecimal costPrice; |
| | | |
| | | @Schema(description = "æä½ä»·", example = "8.00") |
| | | private BigDecimal minPrice; |
| | | |
| | | @Schema(description = "å®å
¨åºå", example = "100") |
| | | private BigDecimal safetyStock; |
| | | |
| | | @Schema(description = "æä½åºå", example = "50") |
| | | private BigDecimal minStock; |
| | | |
| | | @Schema(description = "æé«åºå", example = "1000") |
| | | private BigDecimal maxStock; |
| | | |
| | | @Schema(description = "æå°è®¢è´§é", example = "10") |
| | | private BigDecimal minOrderQty; |
| | | |
| | | @Schema(description = "æåæï¼å¤©ï¼", example = "7") |
| | | private Integer leadTime; |
| | | |
| | | @Schema(description = "æ¯å¦æ¹æ¬¡ç®¡ç", example = "true") |
| | | private Boolean isBatchManaged; |
| | | |
| | | @Schema(description = "æ¯å¦åºåå·ç®¡ç", example = "false") |
| | | private Boolean isSerialManaged; |
| | | |
| | | @Schema(description = "æææï¼å¤©ï¼", example = "365") |
| | | private Integer expiryDay; |
| | | |
| | | @Schema(description = "æ¯å¦é«å¼ç©æ", example = "false") |
| | | private Boolean isHighValue; |
| | | |
| | | @Schema(description = "éé", example = "1.5") |
| | | private BigDecimal weight; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | |
| | | // ========== æ¹æ¬¡å±æ§é
ç½® ========== |
| | | |
| | | @Schema(description = "çäº§æ¥æå¿
å¡«", example = "true") |
| | | private Boolean produceDateFlag; |
| | | |
| | | @Schema(description = "æææå¿
å¡«", example = "true") |
| | | private Boolean expireDateFlag; |
| | | |
| | | @Schema(description = "å
¥åºæ¥æå¿
å¡«", example = "false") |
| | | private Boolean receiptDateFlag; |
| | | |
| | | @Schema(description = "ä¾åºåå¿
å¡«", example = "true") |
| | | private Boolean vendorFlag; |
| | | |
| | | @Schema(description = "éè´è®¢åå·å¿
å¡«", example = "false") |
| | | private Boolean purchaseOrderCodeFlag; |
| | | |
| | | @Schema(description = "ç产æ¹å·å¿
å¡«", example = "true") |
| | | private Boolean lotNumberFlag; |
| | | |
| | | @Schema(description = "è´¨éç¶æå¿
å¡«", example = "false") |
| | | private Boolean qualityStatusFlag; |
| | | |
| | | } |
| | |
| | | @Schema(description = "ç©æç±»å", example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "ç©æ/äº§åæ è¯(å
¼å®¹MES)", example = "ITEM") |
| | | private String itemOrProduct; |
| | | |
| | | @Schema(description = "æåº", example = "1") |
| | | private Integer sort; |
| | | |
| | |
| | | @Schema(description = "ç©æç±»å", example = "1") |
| | | private Integer itemType; |
| | | |
| | | @Schema(description = "ç©æ/äº§åæ è¯(å
¼å®¹MES)", example = "ITEM") |
| | | private String itemOrProduct; |
| | | |
| | | @Schema(description = "æåº", example = "1") |
| | | private Integer sort; |
| | | |
| | |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemRespVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemStatusUpdateReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.warehouse.MdmWarehouseDO; |
| | | import cn.iocoder.yudao.module.mdm.service.brand.MdmBrandService; |
| | | import cn.iocoder.yudao.module.mdm.service.category.MdmItemCategoryService; |
| | | import cn.iocoder.yudao.module.mdm.service.item.MdmItemBatchConfigService; |
| | | import cn.iocoder.yudao.module.mdm.service.item.MdmItemService; |
| | | import cn.iocoder.yudao.module.mdm.service.unit.MdmUnitMeasureService; |
| | | import cn.iocoder.yudao.module.mdm.service.warehouse.MdmWarehouseService; |
| | |
| | | private MdmItemService itemService; |
| | | |
| | | @Resource |
| | | private MdmItemCategoryService itemCategoryService; |
| | | @Resource |
| | | private MdmUnitMeasureService unitMeasureService; |
| | | |
| | | @Resource |
| | | private MdmWarehouseService warehouseService; |
| | | @Resource |
| | | private MdmBrandService brandService; |
| | | @Resource |
| | | private MdmItemBatchConfigService itemBatchConfigService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "åå»ºç©æ") |
| | |
| | | MdmItemRespVO resp = BeanUtils.toBean(item, MdmItemRespVO.class); |
| | | if (resp != null) { |
| | | enrichItemRespVO(resp); |
| | | // å¡«å
æ¹æ¬¡å±æ§é
ç½® |
| | | enrichItemBatchConfig(resp); |
| | | } |
| | | return success(resp); |
| | | } |
| | |
| | | @PreAuthorize("@ss.hasPermission('mdm:item:query')") |
| | | public CommonResult<PageResult<MdmItemRespVO>> getItemPage(@Valid MdmItemPageReqVO pageReqVO) { |
| | | PageResult<MdmItemDO> pageResult = itemService.getItemPage(pageReqVO); |
| | | // å
³èæ¥è¯¢åç±»åç§° |
| | | Map<Long, MdmItemCategoryDO> categoryMap = itemCategoryService.getItemCategoryMap( |
| | | convertSet(pageResult.getList(), MdmItemDO::getCategoryId)); |
| | | // å
³èæ¥è¯¢è®¡éåä½åç§° |
| | | Map<Long, MdmUnitMeasureDO> unitMap = unitMeasureService.getUnitMeasureMap( |
| | | convertSet(pageResult.getList(), MdmItemDO::getUnitMeasureId)); |
| | |
| | | .collect(Collectors.toMap(MdmWarehouseDO::getId, w -> w)); |
| | | // èµå¼ |
| | | respList.forEach(resp -> { |
| | | // åç±»åç§° |
| | | MdmItemCategoryDO category = categoryMap.get(resp.getCategoryId()); |
| | | if (category != null) { |
| | | resp.setCategoryName(category.getName()); |
| | | } |
| | | MdmUnitMeasureDO unit = unitMap.get(resp.getUnitMeasureId()); |
| | | if (unit != null) { |
| | | resp.setUnitMeasureName(unit.getName()); |
| | |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
ç©æååº VO çå
³èåç§°ï¼ä¸»åä½ãè¾
åä½ãä»åºåç§°ï¼ |
| | | * å¡«å
ç©æååº VO çå
³èåç§°ï¼åç±»ã主åä½ãè¾
åä½ãä»åºåç§°ï¼ |
| | | */ |
| | | private void enrichItemRespVO(MdmItemRespVO resp) { |
| | | // åç±»åç§° |
| | | if (resp.getCategoryId() != null) { |
| | | MdmItemCategoryDO category = itemCategoryService.getItemCategory(resp.getCategoryId()); |
| | | if (category != null) { |
| | | resp.setCategoryName(category.getName()); |
| | | } |
| | | } |
| | | // 主åä½åç§° |
| | | if (resp.getUnitMeasureId() != null) { |
| | | MdmUnitMeasureDO unit = unitMeasureService.getUnitMeasure(resp.getUnitMeasureId()); |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
ç©ææ¹æ¬¡å±æ§é
ç½® |
| | | */ |
| | | private void enrichItemBatchConfig(MdmItemRespVO resp) { |
| | | MdmItemBatchConfigDO config = itemBatchConfigService.getItemBatchConfigByItemId(resp.getId()); |
| | | if (config != null) { |
| | | resp.setProduceDateFlag(config.getProduceDateFlag()); |
| | | resp.setExpireDateFlag(config.getExpireDateFlag()); |
| | | resp.setReceiptDateFlag(config.getReceiptDateFlag()); |
| | | resp.setVendorFlag(config.getVendorFlag()); |
| | | resp.setPurchaseOrderCodeFlag(config.getPurchaseOrderCodeFlag()); |
| | | resp.setLotNumberFlag(config.getLotNumberFlag()); |
| | | resp.setQualityStatusFlag(config.getQualityStatusFlag()); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | @Schema(description = "æ¯å¦æ¹æ¬¡ç®¡ç", example = "false") |
| | | private Boolean isBatchManaged; |
| | | |
| | | // ==================== æ¹æ¬¡å±æ§é
ç½® ==================== |
| | | |
| | | @Schema(description = "çäº§æ¥æ", example = "false") |
| | | private Boolean produceDateFlag; |
| | | |
| | | @Schema(description = "æææ", example = "false") |
| | | private Boolean expireDateFlag; |
| | | |
| | | @Schema(description = "å
¥åºæ¥æ", example = "false") |
| | | private Boolean receiptDateFlag; |
| | | |
| | | @Schema(description = "ä¾åºå", example = "false") |
| | | private Boolean vendorFlag; |
| | | |
| | | @Schema(description = "éè´è®¢åç¼å·", example = "false") |
| | | private Boolean purchaseOrderCodeFlag; |
| | | |
| | | @Schema(description = "ç产æ¹å·", example = "false") |
| | | private Boolean lotNumberFlag; |
| | | |
| | | @Schema(description = "è´¨éç¶æ", example = "false") |
| | | private Boolean qualityStatusFlag; |
| | | |
| | | @Schema(description = "æ¯å¦é«å¼ç©æ", example = "false") |
| | | private Boolean isHighValue; |
| | | |
| | |
| | | @Schema(description = "æ¯å¦åæ¥å° MES", example = "false") |
| | | private Boolean syncMes; |
| | | |
| | | // ========== æ¹æ¬¡å±æ§é
ç½®ï¼åæ¥æ¶ä¸èµ·ä¿åï¼ ========== |
| | | |
| | | @Schema(description = "çäº§æ¥æå¿
å¡«", example = "true") |
| | | private Boolean produceDateFlag; |
| | | |
| | | @Schema(description = "æææå¿
å¡«", example = "true") |
| | | private Boolean expireDateFlag; |
| | | |
| | | @Schema(description = "å
¥åºæ¥æå¿
å¡«", example = "false") |
| | | private Boolean receiptDateFlag; |
| | | |
| | | @Schema(description = "ä¾åºåå¿
å¡«", example = "true") |
| | | private Boolean vendorFlag; |
| | | |
| | | @Schema(description = "éè´è®¢åå·å¿
å¡«", example = "false") |
| | | private Boolean purchaseOrderCodeFlag; |
| | | |
| | | @Schema(description = "ç产æ¹å·å¿
å¡«", example = "true") |
| | | private Boolean lotNumberFlag; |
| | | |
| | | @Schema(description = "è´¨éç¶æå¿
å¡«", example = "false") |
| | | private Boolean qualityStatusFlag; |
| | | |
| | | } |
| | |
| | | private Integer itemType; |
| | | |
| | | /** |
| | | * ç©æ/äº§åæ è¯(å
¼å®¹MES: ITEM/PRODUCT) |
| | | */ |
| | | private String itemOrProduct; |
| | | |
| | | /** |
| | | * æåº |
| | | */ |
| | | private Integer sort; |
| | |
| | | return selectList(MdmItemCategoryDO::getId, ids); |
| | | } |
| | | |
| | | default MdmItemCategoryDO selectByItemOrProduct(String itemOrProduct) { |
| | | return selectOne(MdmItemCategoryDO::getItemOrProduct, itemOrProduct); |
| | | } |
| | | |
| | | } |
| | |
| | | */ |
| | | List<MdmItemCategoryDO> getSimpleItemList(); |
| | | |
| | | /** |
| | | * æ ¹æ®ç©æ/äº§åæ è¯è·ååç±» |
| | | * |
| | | * @param itemOrProduct ç©æ/äº§åæ è¯ |
| | | * @return ç©æåç±» |
| | | */ |
| | | MdmItemCategoryDO getItemCategoryByItemOrProduct(String itemOrProduct); |
| | | |
| | | } |
| | |
| | | return itemCategoryMapper.selectList(new MdmItemCategoryDO().setStatus(0)); |
| | | } |
| | | |
| | | @Override |
| | | public MdmItemCategoryDO getItemCategoryByItemOrProduct(String itemOrProduct) { |
| | | return itemCategoryMapper.selectByItemOrProduct(itemOrProduct); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.item; |
| | | |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO; |
| | | |
| | | /** |
| | | * MDM ç©ææ¹æ¬¡é
ç½® Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface MdmItemBatchConfigService { |
| | | |
| | | /** |
| | | * æ ¹æ®ç©æç¼å·è·åæ¹æ¬¡é
ç½® |
| | | * |
| | | * @param itemId ç©æç¼å· |
| | | * @return æ¹æ¬¡é
ç½®ï¼ä¸åå¨è¿å null |
| | | */ |
| | | MdmItemBatchConfigDO getItemBatchConfigByItemId(Long itemId); |
| | | |
| | | /** |
| | | * ä¿åæ¹æ¬¡é
ç½®ï¼æ°å¢ææ´æ°ï¼ |
| | | * |
| | | * @param config æ¹æ¬¡é
ç½® |
| | | * @return é
ç½®ç¼å· |
| | | */ |
| | | Long saveItemBatchConfig(MdmItemBatchConfigDO config); |
| | | |
| | | /** |
| | | * æ ¹æ®ç©æç¼å·å 餿¹æ¬¡é
ç½® |
| | | * |
| | | * @param itemId ç©æç¼å· |
| | | */ |
| | | void deleteItemBatchConfigByItemId(Long itemId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.item; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemBatchConfigMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MDM ç©ææ¹æ¬¡é
ç½® Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class MdmItemBatchConfigServiceImpl implements MdmItemBatchConfigService { |
| | | |
| | | @Resource |
| | | private MdmItemBatchConfigMapper itemBatchConfigMapper; |
| | | |
| | | @Override |
| | | public MdmItemBatchConfigDO getItemBatchConfigByItemId(Long itemId) { |
| | | List<MdmItemBatchConfigDO> list = itemBatchConfigMapper.selectList(MdmItemBatchConfigDO::getItemId, itemId); |
| | | return CollUtil.getFirst(list); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long saveItemBatchConfig(MdmItemBatchConfigDO config) { |
| | | // æ¸
空ä¸éè¦çåæ®µï¼åªä¿çå¿
è¦ç7ä¸ªåæ®µï¼ |
| | | config.setClientFlag(false); |
| | | config.setSalesOrderCodeFlag(false); |
| | | config.setWorkOrderFlag(false); |
| | | config.setTaskFlag(false); |
| | | config.setWorkstationFlag(false); |
| | | config.setToolFlag(false); |
| | | config.setMoldFlag(false); |
| | | |
| | | // æ¥è¯¢å·²æé
ç½® |
| | | MdmItemBatchConfigDO existing = getItemBatchConfigByItemId(config.getItemId()); |
| | | if (existing != null) { |
| | | // æ´æ° |
| | | config.setId(existing.getId()); |
| | | itemBatchConfigMapper.updateById(config); |
| | | return existing.getId(); |
| | | } |
| | | // æ°å¢ |
| | | itemBatchConfigMapper.insert(config); |
| | | return config.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteItemBatchConfigByItemId(Long itemId) { |
| | | itemBatchConfigMapper.delete(MdmItemBatchConfigDO::getItemId, itemId); |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO; |
| | |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemBatchConfigMapper; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemMapper; |
| | | import cn.iocoder.yudao.module.mdm.service.brand.MdmBrandService; |
| | | import cn.iocoder.yudao.module.mdm.service.category.MdmItemCategoryService; |
| | | import cn.iocoder.yudao.module.mdm.service.unit.MdmUnitMeasureService; |
| | | import cn.iocoder.yudao.module.mes.api.item.MesMdItemApi; |
| | | import cn.iocoder.yudao.module.mes.api.item.MesMdItemTypeApi; |
| | | import cn.iocoder.yudao.module.mes.api.item.dto.MesMdItemSyncReqDTO; |
| | | import cn.iocoder.yudao.module.mes.api.item.dto.MesMdItemTypeRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | |
| | | private MdmBrandService brandService; |
| | | |
| | | @Resource |
| | | @Lazy |
| | | private MesMdItemApi mesMdItemApi; |
| | | @Resource |
| | | private MesMdItemTypeApi mesMdItemTypeApi; |
| | | private MdmItemBatchConfigMapper itemBatchConfigMapper; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | // æå
¥ MDM ç©æ |
| | | MdmItemDO item = BeanUtils.toBean(createReqVO, MdmItemDO.class); |
| | | itemMapper.insert(item); |
| | | |
| | | // ä¿åæ¹æ¬¡é
ç½®ï¼å¦ææï¼ |
| | | saveBatchConfig(item.getId(), createReqVO); |
| | | |
| | | // åæ¥å° MESï¼å¾é syncMes æ¶ï¼ |
| | | if (Boolean.TRUE.equals(createReqVO.getSyncMes())) { |
| | |
| | | // æ´æ° MDM ç©æ |
| | | MdmItemDO updateObj = BeanUtils.toBean(updateReqVO, MdmItemDO.class); |
| | | itemMapper.updateById(updateObj); |
| | | |
| | | // ä¿åæ¹æ¬¡é
ç½®ï¼å¦ææï¼ |
| | | saveBatchConfig(updateReqVO.getId(), updateReqVO); |
| | | |
| | | // åæ¥å° MESï¼å¾é syncMes æ¶ï¼ |
| | | if (Boolean.TRUE.equals(updateReqVO.getSyncMes())) { |
| | |
| | | } |
| | | unitCode = unitMeasure.getCode(); |
| | | } |
| | | // è§£æåç±» id -> codeï¼ä½¿ç¨ MES ç©æåç±» APIï¼ |
| | | // è§£æåç±» id -> codeï¼ä½¿ç¨ MDM æ¬å°åç±»æå¡ï¼ |
| | | String itemTypeCode = null; |
| | | if (reqVO.getCategoryId() != null) { |
| | | CommonResult<MesMdItemTypeRespDTO> result = mesMdItemTypeApi.getItemType(reqVO.getCategoryId()); |
| | | if (result != null && result.isSuccess() && result.getData() != null) { |
| | | itemTypeCode = result.getData().getCode(); |
| | | MdmItemCategoryDO category = itemCategoryService.getItemCategory(reqVO.getCategoryId()); |
| | | if (category != null) { |
| | | itemTypeCode = category.getCode(); |
| | | } |
| | | } else if (reqVO.getItemType() != null) { |
| | | // æ ¹æ® itemType æ¥æ¾å¯¹åºåç±»ç¼ç |
| | | // itemType: 1åæ, 2åæå, 3æå, 4è¾
æ |
| | | String itemTypeName = convertItemTypeToName(reqVO.getItemType()); |
| | | CommonResult<List<MesMdItemTypeRespDTO>> listResult = mesMdItemTypeApi.getItemTypeList(null); |
| | | if (listResult != null && listResult.isSuccess() && listResult.getData() != null) { |
| | | itemTypeCode = listResult.getData().stream() |
| | | .filter(c -> c.getName() != null && c.getName().equals(itemTypeName)) |
| | | .findFirst() |
| | | .map(MesMdItemTypeRespDTO::getCode) |
| | | .orElse(null); |
| | | } |
| | | List<MdmItemCategoryDO> categories = itemCategoryService.getItemCategoryList( |
| | | itemCategoryService.getItemCategoryChildrenList(null).stream().map(MdmItemCategoryDO::getId).collect(Collectors.toSet())); |
| | | itemTypeCode = categories.stream() |
| | | .filter(c -> c.getName() != null && c.getName().equals(itemTypeName)) |
| | | .findFirst() |
| | | .map(MdmItemCategoryDO::getCode) |
| | | .orElse(null); |
| | | } |
| | | // ç»è£
忥 DTO |
| | | MesMdItemSyncReqDTO syncReqDTO = new MesMdItemSyncReqDTO(); |
| | |
| | | syncReqDTO.setHighValue(reqVO.getIsHighValue()); |
| | | syncReqDTO.setBatchFlag(reqVO.getIsBatchManaged()); |
| | | syncReqDTO.setRemark(reqVO.getRemark()); |
| | | // æ¹æ¬¡é
ç½®åæ®µ |
| | | syncReqDTO.setProduceDateFlag(reqVO.getProduceDateFlag()); |
| | | syncReqDTO.setExpireDateFlag(reqVO.getExpireDateFlag()); |
| | | syncReqDTO.setReceiptDateFlag(reqVO.getReceiptDateFlag()); |
| | | syncReqDTO.setVendorFlag(reqVO.getVendorFlag()); |
| | | syncReqDTO.setPurchaseOrderCodeFlag(reqVO.getPurchaseOrderCodeFlag()); |
| | | syncReqDTO.setLotNumberFlag(reqVO.getLotNumberFlag()); |
| | | syncReqDTO.setQualityStatusFlag(reqVO.getQualityStatusFlag()); |
| | | // create èµ° createItemï¼update èµ° updateItemï¼MES ä¾§æ code upsertï¼ |
| | | if (reqVO.getId() == null) { |
| | | mesMdItemApi.createItem(syncReqDTO); |
| | |
| | | if (categoryId == null) { |
| | | return; |
| | | } |
| | | CommonResult<MesMdItemTypeRespDTO> result = mesMdItemTypeApi.getItemType(categoryId); |
| | | if (result == null || !result.isSuccess() || result.getData() == null) { |
| | | // ä½¿ç¨ MDM æ¬å°åç±»æå¡æ ¡éª |
| | | MdmItemCategoryDO category = itemCategoryService.getItemCategory(categoryId); |
| | | if (category == null) { |
| | | throw exception(MDM_ITEM_CATEGORY_NOT_EXISTS); |
| | | } |
| | | } |
| | |
| | | return itemMapper.selectByCode(code); |
| | | } |
| | | |
| | | /** |
| | | * ä¿åæ¹æ¬¡é
ç½®ï¼å° MDM æ¬å°è¡¨ï¼ |
| | | */ |
| | | private void saveBatchConfig(Long itemId, MdmItemSaveReqVO reqVO) { |
| | | // æ£æ¥æ¯å¦ææ¹æ¬¡é
ç½®æ°æ® |
| | | if (reqVO.getProduceDateFlag() == null |
| | | && reqVO.getExpireDateFlag() == null |
| | | && reqVO.getReceiptDateFlag() == null |
| | | && reqVO.getVendorFlag() == null |
| | | && reqVO.getPurchaseOrderCodeFlag() == null |
| | | && reqVO.getLotNumberFlag() == null |
| | | && reqVO.getQualityStatusFlag() == null) { |
| | | return; |
| | | } |
| | | |
| | | // æ¥è¯¢å·²æé
ç½® |
| | | cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO existing = |
| | | itemBatchConfigMapper.selectOne( |
| | | cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO::getItemId, itemId); |
| | | |
| | | cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO config = |
| | | new cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO(); |
| | | config.setItemId(itemId); |
| | | config.setProduceDateFlag(Boolean.TRUE.equals(reqVO.getProduceDateFlag())); |
| | | config.setExpireDateFlag(Boolean.TRUE.equals(reqVO.getExpireDateFlag())); |
| | | config.setReceiptDateFlag(Boolean.TRUE.equals(reqVO.getReceiptDateFlag())); |
| | | config.setVendorFlag(Boolean.TRUE.equals(reqVO.getVendorFlag())); |
| | | config.setPurchaseOrderCodeFlag(Boolean.TRUE.equals(reqVO.getPurchaseOrderCodeFlag())); |
| | | config.setLotNumberFlag(Boolean.TRUE.equals(reqVO.getLotNumberFlag())); |
| | | config.setQualityStatusFlag(Boolean.TRUE.equals(reqVO.getQualityStatusFlag())); |
| | | // æ¸
空ä¸éè¦çåæ®µ |
| | | config.setClientFlag(false); |
| | | config.setSalesOrderCodeFlag(false); |
| | | config.setWorkOrderFlag(false); |
| | | config.setTaskFlag(false); |
| | | config.setWorkstationFlag(false); |
| | | config.setToolFlag(false); |
| | | config.setMoldFlag(false); |
| | | |
| | | if (existing != null) { |
| | | config.setId(existing.getId()); |
| | | itemBatchConfigMapper.updateById(config); |
| | | } else { |
| | | itemBatchConfigMapper.insert(config); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | |
| | | // ========== æ¹æ¬¡å±æ§é
ç½® ========== |
| | | |
| | | @Schema(description = "çäº§æ¥æå¿
å¡«", example = "true") |
| | | private Boolean produceDateFlag; |
| | | |
| | | @Schema(description = "æææå¿
å¡«", example = "true") |
| | | private Boolean expireDateFlag; |
| | | |
| | | @Schema(description = "å
¥åºæ¥æå¿
å¡«", example = "false") |
| | | private Boolean receiptDateFlag; |
| | | |
| | | @Schema(description = "ä¾åºåå¿
å¡«", example = "true") |
| | | private Boolean vendorFlag; |
| | | |
| | | @Schema(description = "éè´è®¢åå·å¿
å¡«", example = "false") |
| | | private Boolean purchaseOrderCodeFlag; |
| | | |
| | | @Schema(description = "ç产æ¹å·å¿
å¡«", example = "true") |
| | | private Boolean lotNumberFlag; |
| | | |
| | | @Schema(description = "è´¨éç¶æå¿
å¡«", example = "false") |
| | | private Boolean qualityStatusFlag; |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.api.item.dto.MesMdItemSyncReqDTO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.batchconfig.MesMdItemBatchConfigSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemBatchConfigService; |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService; |
| | | import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; |
| | |
| | | private MesMdItemTypeService itemTypeService; |
| | | @Resource |
| | | private MesMdUnitMeasureService unitMeasureService; |
| | | @Resource |
| | | private MesMdItemBatchConfigService itemBatchConfigService; |
| | | |
| | | @Override |
| | | public Long createItem(MesMdItemSyncReqDTO syncReqDTO) { |
| | | log.info("[createItem] 忥å建 MES ç©æäº§åï¼code={}", syncReqDTO.getCode()); |
| | | MesMdItemSaveReqVO saveReqVO = buildSaveReqVO(syncReqDTO); |
| | | return itemService.createItem(saveReqVO); |
| | | Long itemId = itemService.createItem(saveReqVO); |
| | | // åæ¥æ¹æ¬¡é
ç½® |
| | | saveBatchConfig(itemId, syncReqDTO); |
| | | return itemId; |
| | | } |
| | | |
| | | @Override |
| | |
| | | MesMdItemSaveReqVO saveReqVO = buildSaveReqVO(syncReqDTO); |
| | | // æ code å¹é
ï¼åå¨åæ´æ°ï¼ä¸åå¨åå建ï¼upsertï¼ |
| | | MesMdItemDO existItem = itemService.getItemByCode(syncReqDTO.getCode()); |
| | | Long itemId; |
| | | if (existItem == null) { |
| | | itemService.createItem(saveReqVO); |
| | | itemId = itemService.createItem(saveReqVO); |
| | | } else { |
| | | saveReqVO.setId(existItem.getId()); |
| | | itemService.updateItem(saveReqVO); |
| | | itemId = existItem.getId(); |
| | | } |
| | | // åæ¥æ¹æ¬¡é
ç½® |
| | | saveBatchConfig(itemId, syncReqDTO); |
| | | } |
| | | |
| | | /** |
| | |
| | | return saveReqVO; |
| | | } |
| | | |
| | | /** |
| | | * ä¿åæ¹æ¬¡é
ç½® |
| | | */ |
| | | private void saveBatchConfig(Long itemId, MesMdItemSyncReqDTO syncReqDTO) { |
| | | // æ£æ¥æ¯å¦ææ¹æ¬¡é
ç½®æ°æ® |
| | | if (syncReqDTO.getProduceDateFlag() == null |
| | | && syncReqDTO.getExpireDateFlag() == null |
| | | && syncReqDTO.getReceiptDateFlag() == null |
| | | && syncReqDTO.getVendorFlag() == null |
| | | && syncReqDTO.getPurchaseOrderCodeFlag() == null |
| | | && syncReqDTO.getLotNumberFlag() == null |
| | | && syncReqDTO.getQualityStatusFlag() == null) { |
| | | return; |
| | | } |
| | | MesMdItemBatchConfigSaveReqVO configReqVO = new MesMdItemBatchConfigSaveReqVO(); |
| | | configReqVO.setItemId(itemId); |
| | | configReqVO.setProduceDateFlag(syncReqDTO.getProduceDateFlag()); |
| | | configReqVO.setExpireDateFlag(syncReqDTO.getExpireDateFlag()); |
| | | configReqVO.setReceiptDateFlag(syncReqDTO.getReceiptDateFlag()); |
| | | configReqVO.setVendorFlag(syncReqDTO.getVendorFlag()); |
| | | configReqVO.setPurchaseOrderCodeFlag(syncReqDTO.getPurchaseOrderCodeFlag()); |
| | | configReqVO.setLotNumberFlag(syncReqDTO.getLotNumberFlag()); |
| | | configReqVO.setQualityStatusFlag(syncReqDTO.getQualityStatusFlag()); |
| | | itemBatchConfigService.saveItemBatchConfig(configReqVO); |
| | | } |
| | | |
| | | } |
| | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "æ¯å¦åæ¥å° MDM", example = "true") |
| | | private Boolean syncMdm; |
| | | |
| | | } |
| | |
| | | private Long itemId; |
| | | |
| | | /** |
| | | * æ¹æ¬¡å·ï¼ä¼ å
¥å使ç¨è¯¥æ¹æ¬¡å·ï¼ä¸ä¼ åèªå¨çæï¼ |
| | | */ |
| | | private String batchCode; |
| | | |
| | | /** |
| | | * çäº§æ¥æ |
| | | */ |
| | | private LocalDateTime produceDate; |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import jakarta.validation.constraints.Positive; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; |
| | | |
| | | /** |
| | | * åºåè°æ´ï¼èªå®ä¹åºå
¥åºï¼Request VO |
| | |
| | | @NotNull(message = "åºä½IDä¸è½ä¸ºç©º") |
| | | private Long areaId; |
| | | |
| | | @Schema(description = "æ¹æ¬¡ID", example = "1") |
| | | // ========== æ¹æ¬¡ç¸å
³å段 ========== |
| | | |
| | | @Schema(description = "æ¹æ¬¡IDï¼éæ©å·²ææ¹æ¬¡æ¶ä¼ å
¥ï¼", example = "1") |
| | | private Long batchId; |
| | | |
| | | @Schema(description = "æ¹æ¬¡å·", example = "BATCH001") |
| | | @Schema(description = "æ¹æ¬¡å·ï¼æ°å»ºæ¹æ¬¡æ¶ä¼ å
¥ï¼ç³»ç»èªå¨åå»ºæ¹æ¬¡è®°å½ï¼", example = "BATCH001") |
| | | private String batchCode; |
| | | |
| | | @Schema(description = "çäº§æ¥æï¼æ°å»ºæ¹æ¬¡æ¶ä¼ å
¥ï¼", example = "2025-01-01") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | private LocalDate produceDate; |
| | | |
| | | @Schema(description = "æææï¼æ°å»ºæ¹æ¬¡æ¶ä¼ å
¥ï¼", example = "2026-01-01") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | private LocalDate expireDate; |
| | | |
| | | @Schema(description = "ä¾åºåID", example = "1") |
| | | private Long vendorId; |
| | | |
| | | @Schema(description = "ç产æ¹å·", example = "LOT001") |
| | | private String lotNumber; |
| | | |
| | | @Schema(description = "è´¨éç¶æï¼0-å¾
æ£éª 1-åæ ¼ 2-ä¸åæ ¼ï¼æ¯ææ°åæå符串ï¼", example = "1") |
| | | private Object qualityStatus; |
| | | |
| | | // ========== å
¶ä»å段 ========== |
| | | |
| | | @Schema(description = "æ°éï¼å¿
须大äº0ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") |
| | | @NotNull(message = "æ°éä¸è½ä¸ºç©º") |
| | | @Positive(message = "æ°éå¿
须大äº0") |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.wm.transaction; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | 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.transaction.vo.MesWmTransactionPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.transaction.vo.MesWmTransactionRespVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transaction.MesWmTransactionDO; |
| | | 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.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | |
| | | /** |
| | | * åºåäºå¡æµæ°´ Controller |
| | | */ |
| | | @Tag(name = "管çåå° - åºåäºå¡æµæ°´") |
| | | @RestController |
| | | @RequestMapping("/mes/wm/transaction") |
| | | @Validated |
| | | public class MesWmTransactionController { |
| | | |
| | | @Resource |
| | | private MesWmTransactionService transactionService; |
| | | @Resource |
| | | private MesMdmItemService mdmItemService; |
| | | @Resource |
| | | private MesWmWarehouseService warehouseService; |
| | | @Resource |
| | | private MesWmWarehouseLocationService locationService; |
| | | @Resource |
| | | private MesWmWarehouseAreaService areaService; |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·ååºåäºå¡æµæ°´å页") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1") |
| | | @PreAuthorize("@ss.hasPermission('mes:wm-transaction:query')") |
| | | public CommonResult<PageResult<MesWmTransactionRespVO>> getTransactionPage(@Valid MesWmTransactionPageReqVO pageReqVO) { |
| | | PageResult<MesWmTransactionDO> pageResult = transactionService.getTransactionPage(pageReqVO); |
| | | if (pageResult.getTotal() == 0) { |
| | | return success(PageResult.empty(pageResult.getTotal())); |
| | | } |
| | | |
| | | // å
³èæ¥è¯¢ç©æä¿¡æ¯ |
| | | Map<Long, MesMdmItemDO> itemMap = mdmItemService.getItemMap( |
| | | convertSet(pageResult.getList(), MesWmTransactionDO::getItemId)); |
| | | // å
³èæ¥è¯¢ä»åºä¿¡æ¯ |
| | | Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap( |
| | | convertSet(pageResult.getList(), MesWmTransactionDO::getWarehouseId)); |
| | | // å
³èæ¥è¯¢åºåºä¿¡æ¯ |
| | | Map<Long, MesWmWarehouseLocationDO> locationMap = locationService.getWarehouseLocationMap( |
| | | convertSet(pageResult.getList(), MesWmTransactionDO::getLocationId)); |
| | | // å
³èæ¥è¯¢åºä½ä¿¡æ¯ |
| | | Map<Long, MesWmWarehouseAreaDO> areaMap = areaService.getWarehouseAreaMap( |
| | | convertSet(pageResult.getList(), MesWmTransactionDO::getAreaId)); |
| | | |
| | | // 转æ¢ä¸º VO |
| | | List<MesWmTransactionRespVO> voList = pageResult.getList().stream().map(transaction -> { |
| | | MesWmTransactionRespVO vo = BeanUtils.toBean(transaction, MesWmTransactionRespVO.class); |
| | | // äºå¡ç±»ååç§° |
| | | MesWmTransactionTypeEnum typeEnum = MesWmTransactionTypeEnum.valueOf(transaction.getType()); |
| | | vo.setTypeName(typeEnum != null ? typeEnum.getName() : "æªç¥"); |
| | | // ä¸å¡ç±»ååç§° |
| | | vo.setBizTypeName(getBizTypeName(transaction.getBizType())); |
| | | // ç©æä¿¡æ¯ |
| | | MesMdmItemDO item = itemMap.get(transaction.getItemId()); |
| | | if (item != null) { |
| | | vo.setItemCode(item.getCode()); |
| | | vo.setItemName(item.getName()); |
| | | } |
| | | // ä»åºä¿¡æ¯ |
| | | MesWmWarehouseDO warehouse = warehouseMap.get(transaction.getWarehouseId()); |
| | | if (warehouse != null) { |
| | | vo.setWarehouseName(warehouse.getName()); |
| | | } |
| | | // åºåºä¿¡æ¯ |
| | | MesWmWarehouseLocationDO location = locationMap.get(transaction.getLocationId()); |
| | | if (location != null) { |
| | | vo.setLocationName(location.getName()); |
| | | } |
| | | // åºä½ä¿¡æ¯ |
| | | MesWmWarehouseAreaDO area = areaMap.get(transaction.getAreaId()); |
| | | if (area != null) { |
| | | vo.setAreaName(area.getName()); |
| | | } |
| | | return vo; |
| | | }).collect(Collectors.toList()); |
| | | |
| | | return success(new PageResult<>(voList, pageResult.getTotal())); |
| | | } |
| | | |
| | | /** |
| | | * è·åä¸å¡ç±»ååç§° |
| | | */ |
| | | private String getBizTypeName(Integer bizType) { |
| | | if (bizType == null) { |
| | | return "æªç¥"; |
| | | } |
| | | switch (bizType) { |
| | | case MesBizTypeConstants.WM_STOCK_ADJUST_IN: |
| | | return "èªå®ä¹å
¥åº"; |
| | | case MesBizTypeConstants.WM_STOCK_ADJUST_OUT: |
| | | return "èªå®ä¹åºåº"; |
| | | case MesBizTypeConstants.WM_ITEM_RECEIPT_IN: |
| | | return "éè´å
¥åº"; |
| | | case MesBizTypeConstants.WM_PRODUCT_SALES: |
| | | return "éå®åºåº"; |
| | | case MesBizTypeConstants.WM_TRANSFER_IN: |
| | | return "è°æ¨å
¥åº"; |
| | | case MesBizTypeConstants.WM_TRANSFER_OUT: |
| | | return "è°æ¨åºåº"; |
| | | case MesBizTypeConstants.WM_MISC_RECPT: |
| | | return "å
¶ä»å
¥åº"; |
| | | case MesBizTypeConstants.WM_MISC_ISSUE: |
| | | return "å
¶ä»åºåº"; |
| | | case MesBizTypeConstants.WM_ISSUE: |
| | | return "çäº§é¢æ"; |
| | | case MesBizTypeConstants.WM_RETURN_ISSUE: |
| | | return "ç产éæ"; |
| | | case MesBizTypeConstants.WM_PRODUCT_RECPT: |
| | | return "ç产å
¥åº"; |
| | | case MesBizTypeConstants.WM_ITEM_CONSUME: |
| | | return "ç产æ¶è"; |
| | | case MesBizTypeConstants.WM_PRODUCT_PRODUCE: |
| | | return "产å产åº"; |
| | | case MesBizTypeConstants.WM_RETURN_VENDOR: |
| | | return "ä¾åºåéè´§"; |
| | | case MesBizTypeConstants.WM_RETURN_SALES: |
| | | return "éå®éè´§"; |
| | | case MesBizTypeConstants.WM_OUTSOURCE_ISSUE: |
| | | return "å¤ååæ"; |
| | | case MesBizTypeConstants.WM_OUTSOURCE_RECPT: |
| | | return "å¤åå
¥åº"; |
| | | default: |
| | | return "æªç¥ç±»å(" + bizType + ")"; |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.wm.transaction.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| | | |
| | | /** |
| | | * åºåäºå¡æµæ°´æ¥è¯¢ Request VO |
| | | */ |
| | | @Schema(description = "管çåå° - åºåäºå¡æµæ°´æ¥è¯¢ Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class MesWmTransactionPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "ç©æID", example = "1") |
| | | private Long itemId; |
| | | |
| | | @Schema(description = "æ¹æ¬¡å·", example = "BATCH001") |
| | | private String batchCode; |
| | | |
| | | @Schema(description = "ä»åºID", example = "1") |
| | | private Long warehouseId; |
| | | |
| | | @Schema(description = "åºåºID", example = "1") |
| | | private Long locationId; |
| | | |
| | | @Schema(description = "åºä½ID", example = "1") |
| | | private Long areaId; |
| | | |
| | | @Schema(description = "äºå¡ç±»åï¼1-å
¥åº 2-åºåºï¼", example = "1") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "ä¸å¡ç±»åï¼126-èªå®ä¹å
¥åº 127-èªå®ä¹åºåº çï¼", example = "126") |
| | | private Integer bizType; |
| | | |
| | | @Schema(description = "ä¸å¡åå·", example = "STOCK_ADJUST_1") |
| | | private String bizCode; |
| | | |
| | | @Schema(description = "åºåè®°å½ID", example = "1") |
| | | private Long materialStockId; |
| | | |
| | | @Schema(description = "å¼å§æ¶é´") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| | | private LocalDateTime startTime; |
| | | |
| | | @Schema(description = "ç»ææ¶é´") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| | | private LocalDateTime endTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.wm.transaction.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * åºåäºå¡æµæ°´ Response VO |
| | | */ |
| | | @Schema(description = "管çåå° - åºåäºå¡æµæ°´ Response VO") |
| | | @Data |
| | | public class MesWmTransactionRespVO { |
| | | |
| | | @Schema(description = "ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "äºå¡ç±»åï¼1-å
¥åº 2-åºåºï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "äºå¡ç±»ååç§°", example = "å
¥åº") |
| | | private String typeName; |
| | | |
| | | @Schema(description = "ä¸å¡ç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "126") |
| | | private Integer bizType; |
| | | |
| | | @Schema(description = "ä¸å¡ç±»ååç§°", example = "èªå®ä¹å
¥åº") |
| | | private String bizTypeName; |
| | | |
| | | @Schema(description = "ä¸å¡åå·", example = "STOCK_ADJUST_1") |
| | | private String bizCode; |
| | | |
| | | // ========== ç©æç»´åº¦ ========== |
| | | |
| | | @Schema(description = "ç©æID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long itemId; |
| | | |
| | | @Schema(description = "ç©æç¼ç ", example = "ITEM001") |
| | | private String itemCode; |
| | | |
| | | @Schema(description = "ç©æåç§°", example = "èºä¸") |
| | | private String itemName; |
| | | |
| | | @Schema(description = "å卿°éï¼æ£æ°=å
¥åºï¼è´æ°=åºåºï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") |
| | | private BigDecimal quantity; |
| | | |
| | | @Schema(description = "æ¹æ¬¡ID", example = "1") |
| | | private Long batchId; |
| | | |
| | | @Schema(description = "æ¹æ¬¡å·", example = "BATCH001") |
| | | private String batchCode; |
| | | |
| | | // ========== åºåä½ç½® ========== |
| | | |
| | | @Schema(description = "ä»åºID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long warehouseId; |
| | | |
| | | @Schema(description = "ä»åºåç§°", example = "æåä»") |
| | | private String warehouseName; |
| | | |
| | | @Schema(description = "åºåºID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long locationId; |
| | | |
| | | @Schema(description = "åºåºåç§°", example = "Aåº") |
| | | private String locationName; |
| | | |
| | | @Schema(description = "åºä½ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long areaId; |
| | | |
| | | @Schema(description = "åºä½åç§°", example = "A-01-01") |
| | | private String areaName; |
| | | |
| | | // ========== æ¶é´ ========== |
| | | |
| | | @Schema(description = "äºå¡åçæ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private LocalDateTime transactionTime; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| | |
| | | .setSql("reserved_quantity = reserved_quantity + " + count); |
| | | if (checkFlag && count.compareTo(BigDecimal.ZERO) > 0) { |
| | | // æ ¡éªå¯ç¨éå
è¶³ï¼quantity - frozen_quantity - reserved_quantity >= count |
| | | updateWrapper.setSql("reserved_quantity = reserved_quantity + " + count + |
| | | " WHERE quantity - IFNULL(frozen_quantity, 0) - IFNULL(reserved_quantity, 0) >= " + count); |
| | | updateWrapper.apply("quantity - IFNULL(frozen_quantity, 0) - IFNULL(reserved_quantity, 0) >= {0}", count); |
| | | } |
| | | return update(null, updateWrapper); |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.mysql.wm.transaction; |
| | | |
| | | 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.transaction.vo.MesWmTransactionPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transaction.MesWmTransactionDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | |
| | | @Mapper |
| | | public interface MesWmTransactionMapper extends BaseMapperX<MesWmTransactionDO> { |
| | | |
| | | default PageResult<MesWmTransactionDO> selectPage(MesWmTransactionPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesWmTransactionDO>() |
| | | .eqIfPresent(MesWmTransactionDO::getItemId, reqVO.getItemId()) |
| | | .likeIfPresent(MesWmTransactionDO::getBatchCode, reqVO.getBatchCode()) |
| | | .eqIfPresent(MesWmTransactionDO::getWarehouseId, reqVO.getWarehouseId()) |
| | | .eqIfPresent(MesWmTransactionDO::getLocationId, reqVO.getLocationId()) |
| | | .eqIfPresent(MesWmTransactionDO::getAreaId, reqVO.getAreaId()) |
| | | .eqIfPresent(MesWmTransactionDO::getType, reqVO.getType()) |
| | | .eqIfPresent(MesWmTransactionDO::getBizType, reqVO.getBizType()) |
| | | .likeIfPresent(MesWmTransactionDO::getBizCode, reqVO.getBizCode()) |
| | | .eqIfPresent(MesWmTransactionDO::getMaterialStockId, reqVO.getMaterialStockId()) |
| | | .geIfPresent(MesWmTransactionDO::getTransactionTime, reqVO.getStartTime()) |
| | | .leIfPresent(MesWmTransactionDO::getTransactionTime, reqVO.getEndTime()) |
| | | .orderByDesc(MesWmTransactionDO::getTransactionTime)); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.batchconfig.MesMdItemBatchConfigSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemBatchConfigMapper; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemBatchConfigApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemBatchConfigRespDTO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | |
| | | |
| | | /** |
| | | * MES ç©ææ¹æ¬¡å±æ§é
ç½® Service å®ç°ç±» |
| | | * |
| | | * æ¹æ¬¡é
ç½®ç»ä¸åå¨å¨ MDM 表ï¼mdm_item_batch_configï¼ |
| | | * MES æ¬å°è¡¨ï¼mes_md_item_batch_configï¼ä»
ç¨äºå
¼å®¹å岿°æ®å MES 模åå
鍿¥è¯¢ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | |
| | | private MesMdItemBatchConfigMapper itemBatchConfigMapper; |
| | | |
| | | @Resource |
| | | @Lazy // é¿å
循ç¯ä¾èµï¼MesMdItemServiceImpl ä¹ä¼æ³¨å
¥æ¬ Serviceï¼ |
| | | @Lazy |
| | | private MesMdItemService itemService; |
| | | |
| | | @Resource |
| | | @Lazy |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | @Resource |
| | | private MdmItemBatchConfigApi mdmItemBatchConfigApi; |
| | | |
| | | @Override |
| | | public MesMdItemBatchConfigDO getItemBatchConfigByItemId(Long itemId) { |
| | | return itemBatchConfigMapper.selectByItemId(itemId); |
| | | // ä¼å
ä» MES æ¬å°è¡¨æ¥è¯¢ï¼æ§è½æ´å¥½ï¼ |
| | | MesMdItemBatchConfigDO mesConfig = itemBatchConfigMapper.selectByItemId(itemId); |
| | | if (mesConfig != null) { |
| | | return mesConfig; |
| | | } |
| | | // æ¬å°è¡¨ä¸åå¨ï¼å°è¯ä» MDM è·åï¼ä¸åå
¥æ¬å°ï¼é¿å
å¯ä½ç¨ï¼ |
| | | MdmItemBatchConfigRespDTO mdmConfig = mdmItemBatchConfigApi.getItemBatchConfig(itemId); |
| | | if (mdmConfig != null) { |
| | | return BeanUtils.toBean(mdmConfig, MesMdItemBatchConfigDO.class); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long saveItemBatchConfig(MesMdItemBatchConfigSaveReqVO saveReqVO) { |
| | | // 1. æ ¡éªç©æåå¨ |
| | | if (itemService.getItem(saveReqVO.getItemId()) == null) { |
| | | // 1. æ ¡éªç©æåå¨ï¼ä» MDM æ ¡éªï¼ |
| | | if (mdmItemApi.getItem(saveReqVO.getItemId()).getCheckedData() == null) { |
| | | throw exception(MD_ITEM_NOT_EXISTS); |
| | | } |
| | | |
| | | // 2. æ¥è¯¢å·²æé
ç½®ï¼å³å®æ°å¢è¿æ¯æ´æ° |
| | | MesMdItemBatchConfigDO existing = itemBatchConfigMapper.selectByItemId(saveReqVO.getItemId()); |
| | | if (existing != null) { |
| | | // æ´æ° |
| | | MesMdItemBatchConfigDO updateObj = BeanUtils.toBean(saveReqVO, MesMdItemBatchConfigDO.class); |
| | | updateObj.setId(existing.getId()); |
| | | itemBatchConfigMapper.updateById(updateObj); |
| | | return existing.getId(); |
| | | } |
| | | // 2. æ¸
空ä¸éè¦çåæ®µï¼åªä¿çå¿
è¦ç7ä¸ªåæ®µï¼ |
| | | MesMdItemBatchConfigSaveReqVO cleanReqVO = new MesMdItemBatchConfigSaveReqVO(); |
| | | cleanReqVO.setId(saveReqVO.getId()); |
| | | cleanReqVO.setItemId(saveReqVO.getItemId()); |
| | | cleanReqVO.setProduceDateFlag(saveReqVO.getProduceDateFlag()); |
| | | cleanReqVO.setExpireDateFlag(saveReqVO.getExpireDateFlag()); |
| | | cleanReqVO.setReceiptDateFlag(saveReqVO.getReceiptDateFlag()); |
| | | cleanReqVO.setVendorFlag(saveReqVO.getVendorFlag()); |
| | | cleanReqVO.setPurchaseOrderCodeFlag(saveReqVO.getPurchaseOrderCodeFlag()); |
| | | cleanReqVO.setLotNumberFlag(saveReqVO.getLotNumberFlag()); |
| | | cleanReqVO.setQualityStatusFlag(saveReqVO.getQualityStatusFlag()); |
| | | |
| | | // æ°å¢ |
| | | MesMdItemBatchConfigDO insertObj = BeanUtils.toBean(saveReqVO, MesMdItemBatchConfigDO.class); |
| | | itemBatchConfigMapper.insert(insertObj); |
| | | return insertObj.getId(); |
| | | // 3. ä¿åå° MDM 表 |
| | | MdmItemBatchConfigDO mdmConfig = BeanUtils.toBean(cleanReqVO, MdmItemBatchConfigDO.class); |
| | | Long configId = mdmItemBatchConfigApi.saveItemBatch(mdmConfig); |
| | | |
| | | // 4. 忥ä¿åå° MES æ¬å°è¡¨ |
| | | saveToMesTable(cleanReqVO); |
| | | |
| | | return configId; |
| | | } |
| | | |
| | | @Override |
| | |
| | | itemBatchConfigMapper.deleteByItemId(itemId); |
| | | } |
| | | |
| | | } |
| | | /** |
| | | * ä¿åå° MES æ¬å°è¡¨ |
| | | */ |
| | | private void saveToMesTable(MesMdItemBatchConfigSaveReqVO saveReqVO) { |
| | | MesMdItemBatchConfigDO existing = itemBatchConfigMapper.selectByItemId(saveReqVO.getItemId()); |
| | | MesMdItemBatchConfigDO mesConfig = BeanUtils.toBean(saveReqVO, MesMdItemBatchConfigDO.class); |
| | | |
| | | if (existing != null) { |
| | | // åå¨åæ´æ°ï¼ä½¿ç¨å·²æç ID |
| | | mesConfig.setId(existing.getId()); |
| | | itemBatchConfigMapper.updateById(mesConfig); |
| | | } else { |
| | | // ä¸åå¨åæå
¥ï¼è®©æ°æ®åºèªå¨çæ ID |
| | | mesConfig.setId(null); |
| | | itemBatchConfigMapper.insert(mesConfig); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; |
| | | import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemSyncApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemSyncReqDTO; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | /** |
| | | * MES ç©æäº§å Service å®ç°ç±» |
| | | * |
| | | * 注æï¼å½åä¿æä½¿ç¨ MES æ¬å°è¡¨ï¼å¾
MDM æ°æ®è¿ç§»å®æåååæ¢å° MDM API |
| | | * æ¯æ MES å MDM ç©ææ°æ®åå忥 |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | |
| | | @Resource |
| | | private MesMdAutoCodeRecordService autoCodeRecordService; |
| | | |
| | | @Resource |
| | | private MdmItemSyncApi mdmItemSyncApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createItem(MesMdItemSaveReqVO createReqVO) { |
| | | // æ ¡éªæ°æ® |
| | | validateItemSaveData(createReqVO); |
| | |
| | | // èªå¨çææ¡ç |
| | | barcodeService.autoGenerateBarcode(BarcodeBizTypeEnum.ITEM.getValue(), |
| | | item.getId(), item.getCode(), item.getName()); |
| | | |
| | | // åæ¥å° MDMï¼å¾é syncMdm æ¶ï¼ |
| | | if (Boolean.TRUE.equals(createReqVO.getSyncMdm())) { |
| | | syncItemToMdm(item, createReqVO); |
| | | } |
| | | |
| | | return item.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateItem(MesMdItemSaveReqVO updateReqVO) { |
| | | // æ ¡éªåå¨ |
| | | validateItemExists(updateReqVO.getId()); |
| | |
| | | MesMdItemDO updateObj = BeanUtils.toBean(updateReqVO, MesMdItemDO.class); |
| | | clearStockIfNotSafe(updateObj); // 妿æªå¯ç¨å®å
¨åºåï¼æ¸
é¶åºåä¸ä¸é |
| | | itemMapper.updateById(updateObj); |
| | | |
| | | // åæ¥å° MDMï¼å¾é syncMdm æ¶ï¼ |
| | | if (Boolean.TRUE.equals(updateReqVO.getSyncMdm())) { |
| | | MesMdItemDO item = itemMapper.selectById(updateReqVO.getId()); |
| | | syncItemToMdm(item, updateReqVO); |
| | | } |
| | | } |
| | | |
| | | private void validateItemSaveData(MesMdItemSaveReqVO reqVO) { |
| | |
| | | return respVO; |
| | | } |
| | | |
| | | /** |
| | | * åæ¥ç©æå° MDM |
| | | * |
| | | * @param item MES ç©ææ°æ® |
| | | * @param saveReqVO ä¿å请æ±ï¼å
嫿¹æ¬¡é
ç½®ï¼ |
| | | */ |
| | | private void syncItemToMdm(MesMdItemDO item, MesMdItemSaveReqVO saveReqVO) { |
| | | // 1. è·åç©æç±»å对åºç itemType |
| | | Integer itemType = null; |
| | | if (item.getItemTypeId() != null) { |
| | | MesMdItemTypeDO itemTypeDO = itemTypeService.getItemType(item.getItemTypeId()); |
| | | if (itemTypeDO != null) { |
| | | // MES: ITEM=ç©æ, PRODUCT=产å -> MDM: 1=åæ, 2=åæå, 3=æå, 4=è¾
æ |
| | | itemType = convertMesItemTypeToMdm(itemTypeDO.getItemOrProduct(), itemTypeDO.getName()); |
| | | } |
| | | } |
| | | |
| | | // 2. è·å计éåä½ç¼ç |
| | | String unitCode = null; |
| | | Long unitMeasureId = null; |
| | | if (item.getUnitMeasureId() != null) { |
| | | MesMdUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasure(item.getUnitMeasureId()); |
| | | if (unitMeasure != null) { |
| | | unitCode = unitMeasure.getCode(); |
| | | } |
| | | unitMeasureId = item.getUnitMeasureId(); |
| | | } |
| | | |
| | | // 3. è·åæ¹æ¬¡é
ç½® |
| | | MesMdItemBatchConfigDO batchConfig = itemBatchConfigService.getItemBatchConfigByItemId(item.getId()); |
| | | |
| | | // 4. ç»è£
忥 DTO |
| | | MdmItemSyncReqDTO syncReqDTO = new MdmItemSyncReqDTO(); |
| | | syncReqDTO.setCode(item.getCode()); |
| | | syncReqDTO.setName(item.getName()); |
| | | syncReqDTO.setSpecification(item.getSpecification()); |
| | | syncReqDTO.setItemType(itemType); |
| | | syncReqDTO.setUnitMeasureId(unitMeasureId); |
| | | syncReqDTO.setCategoryId(item.getItemTypeId()); |
| | | syncReqDTO.setStatus(item.getStatus()); |
| | | syncReqDTO.setMinStock(item.getMinStock()); |
| | | syncReqDTO.setMaxStock(item.getMaxStock()); |
| | | syncReqDTO.setIsBatchManaged(item.getBatchFlag()); |
| | | syncReqDTO.setIsHighValue(item.getHighValue()); |
| | | syncReqDTO.setRemark(item.getRemark()); |
| | | |
| | | // 5. åæ¥æ¹æ¬¡é
ç½® |
| | | if (batchConfig != null) { |
| | | syncReqDTO.setProduceDateFlag(batchConfig.getProduceDateFlag()); |
| | | syncReqDTO.setExpireDateFlag(batchConfig.getExpireDateFlag()); |
| | | syncReqDTO.setReceiptDateFlag(batchConfig.getReceiptDateFlag()); |
| | | syncReqDTO.setVendorFlag(batchConfig.getVendorFlag()); |
| | | syncReqDTO.setPurchaseOrderCodeFlag(batchConfig.getPurchaseOrderCodeFlag()); |
| | | syncReqDTO.setLotNumberFlag(batchConfig.getLotNumberFlag()); |
| | | syncReqDTO.setQualityStatusFlag(batchConfig.getQualityStatusFlag()); |
| | | } |
| | | |
| | | // 6. è°ç¨ MDM 忥 API |
| | | mdmItemSyncApi.syncItemToMdm(syncReqDTO); |
| | | } |
| | | |
| | | /** |
| | | * å° MES ç©æç±»å转æ¢ä¸º MDM ç©æç±»å |
| | | * MES: ITEM(ç©æ)/PRODUCT(产å) |
| | | * MDM: 1åæ, 2åæå, 3æå, 4è¾
æ |
| | | */ |
| | | private Integer convertMesItemTypeToMdm(String itemOrProduct, String typeName) { |
| | | if (itemOrProduct == null) { |
| | | return null; |
| | | } |
| | | // æ ¹æ®åç§°å¹é
|
| | | if (typeName != null) { |
| | | if (typeName.contains("åæ")) { |
| | | return 1; |
| | | } else if (typeName.contains("åæå")) { |
| | | return 2; |
| | | } else if (typeName.contains("æå")) { |
| | | return 3; |
| | | } else if (typeName.contains("è¾
æ")) { |
| | | return 4; |
| | | } |
| | | } |
| | | // æ ¹æ® ITEM/PRODUCT å
åº |
| | | if ("PRODUCT".equals(itemOrProduct)) { |
| | | return 3; // 产å -> æå |
| | | } |
| | | return 1; // é»è®¤åæ |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.category.MdmItemCategoryApi; |
| | | import cn.iocoder.yudao.module.mdm.api.category.dto.MdmItemCategoryRespDTO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeListReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; |
| | |
| | | /** |
| | | * MES ç©æäº§ååç±» Service å®ç°ç±» |
| | | * |
| | | * å
¼å®¹å±å®ç°ï¼æ°æ®åå¨å¨ mes_md_item_type 表ï¼ä½ä¼å
ä» MDM åç±» API è·å |
| | | * å®é
åç±»æ°æ®å·²è¿ç§»å° mdm_item_category 表 |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | |
| | | public class MesMdItemTypeServiceImpl implements MesMdItemTypeService { |
| | | |
| | | @Resource |
| | | private MdmItemCategoryApi mdmItemCategoryApi; |
| | | |
| | | @Resource |
| | | private MesMdItemTypeMapper itemTypeMapper; |
| | | |
| | | @Resource |
| | | @Lazy // å»¶è¿å è½½ï¼é¿å
循ç¯ä¾èµ |
| | | @Lazy |
| | | private MesMdItemService itemService; |
| | | |
| | | @Override |
| | |
| | | // æ ¡éªæ°æ® |
| | | validateItemTypeSaveData(createReqVO); |
| | | |
| | | // æå
¥ |
| | | // æå
¥å°æ¬å°è¡¨ï¼ä¿æå
¼å®¹ï¼ |
| | | MesMdItemTypeDO itemType = BeanUtils.toBean(createReqVO, MesMdItemTypeDO.class); |
| | | itemTypeMapper.insert(itemType); |
| | | return itemType.getId(); |
| | |
| | | // æ ¡éªæ°æ® |
| | | validateItemTypeSaveData(updateReqVO); |
| | | |
| | | // æ´æ° |
| | | // æ´æ°æ¬å°è¡¨ |
| | | MesMdItemTypeDO updateObj = BeanUtils.toBean(updateReqVO, MesMdItemTypeDO.class); |
| | | itemTypeMapper.updateById(updateObj); |
| | | } |
| | |
| | | } |
| | | |
| | | private void validateItemTypeExists(Long id) { |
| | | // ä¼å
ä» MDM è·å |
| | | CommonResult<MdmItemCategoryRespDTO> result = mdmItemCategoryApi.getItemCategory(id); |
| | | if (result.isSuccess() && result.getData() != null) { |
| | | return; |
| | | } |
| | | // åéå°æ¬å°è¡¨ |
| | | if (itemTypeMapper.selectById(id) == null) { |
| | | throw exception(MD_ITEM_TYPE_NOT_EXISTS); |
| | | } |
| | |
| | | if (Objects.equals(id, parentId)) { |
| | | throw exception(MD_ITEM_TYPE_PARENT_ERROR); |
| | | } |
| | | // 2. ç¶åç±»ä¸åå¨ |
| | | MesMdItemTypeDO parentItemType = itemTypeMapper.selectById(parentId); |
| | | // 2. ç¶åç±»ä¸åå¨ - ä¼å
ä» MDM è·å |
| | | CommonResult<MdmItemCategoryRespDTO> result = mdmItemCategoryApi.getItemCategory(parentId); |
| | | MesMdItemTypeDO parentItemType = null; |
| | | if (result.isSuccess() && result.getData() != null) { |
| | | parentItemType = convertToMesDO(result.getData()); |
| | | } else { |
| | | parentItemType = itemTypeMapper.selectById(parentId); |
| | | } |
| | | if (parentItemType == null) { |
| | | throw exception(MD_ITEM_TYPE_PARENT_NOT_EXITS); |
| | | } |
| | | // 3. é彿 ¡éªç¶åç±»ï¼å¦æç¶åç±»æ¯èªå·±çååç±»ï¼åæ¥éï¼é¿å
å½¢æç¯è·¯ |
| | | if (id == null) { // id 为空ï¼è¯´ææ°å¢ï¼ä¸éè¦èèç¯è·¯ |
| | | if (id == null) { |
| | | return; |
| | | } |
| | | for (int i = 0; i < Short.MAX_VALUE; i++) { |
| | | // 3.1 æ ¡éªç¯è·¯ |
| | | parentId = parentItemType.getParentId(); |
| | | if (Objects.equals(id, parentId)) { |
| | | throw exception(MD_ITEM_TYPE_PARENT_IS_CHILD); |
| | | } |
| | | // 3.2 ç»§ç»éå½ä¸ä¸çº§ç¶åç±» |
| | | if (parentId == null || MesMdItemTypeDO.PARENT_ID_ROOT.equals(parentId)) { |
| | | break; |
| | | } |
| | | parentItemType = itemTypeMapper.selectById(parentId); |
| | | // ç»§ç»æ¥æ¾ç¶çº§ |
| | | CommonResult<MdmItemCategoryRespDTO> parentResult = mdmItemCategoryApi.getItemCategory(parentId); |
| | | if (parentResult.isSuccess() && parentResult.getData() != null) { |
| | | parentItemType = convertToMesDO(parentResult.getData()); |
| | | } else { |
| | | parentItemType = itemTypeMapper.selectById(parentId); |
| | | } |
| | | if (parentItemType == null) { |
| | | break; |
| | | } |
| | |
| | | |
| | | @Override |
| | | public MesMdItemTypeDO getItemType(Long id) { |
| | | // ä¼å
ä» MDM è·å |
| | | CommonResult<MdmItemCategoryRespDTO> result = mdmItemCategoryApi.getItemCategory(id); |
| | | if (result.isSuccess() && result.getData() != null) { |
| | | return convertToMesDO(result.getData()); |
| | | } |
| | | // åéå°æ¬å°è¡¨ |
| | | return itemTypeMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public MesMdItemTypeDO getItemTypeByCode(String code) { |
| | | // 仿¬å°è¡¨æ¥ |
| | | return itemTypeMapper.selectByCode(code); |
| | | } |
| | | |
| | | @Override |
| | | public List<MesMdItemTypeDO> getItemTypeList(MesMdItemTypeListReqVO listReqVO) { |
| | | // 仿¬å°è¡¨æ¥ |
| | | return itemTypeMapper.selectList(listReqVO); |
| | | } |
| | | |
| | |
| | | |
| | | @Override |
| | | public List<MesMdItemTypeDO> getItemTypeChildrenList(Long parentId) { |
| | | List<MesMdItemTypeDO> allList = itemTypeMapper.selectList(); // åç±»æ»éå°ï¼å
¨éæ¥ |
| | | // é彿¶éææååç±» |
| | | List<MesMdItemTypeDO> allList = itemTypeMapper.selectList(); |
| | | List<MesMdItemTypeDO> result = new ArrayList<>(); |
| | | collectItemTypeChildren(result, parentId, allList); |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * é彿¶éææååç±» |
| | | */ |
| | | private void collectItemTypeChildren(List<MesMdItemTypeDO> result, Long parentId, List<MesMdItemTypeDO> allList) { |
| | | for (MesMdItemTypeDO itemType : allList) { |
| | | if (Objects.equals(itemType.getParentId(), parentId)) { |
| | |
| | | } |
| | | } |
| | | |
| | | } |
| | | /** |
| | | * è½¬æ¢ MDM åç±» DTO 为 MES DO |
| | | */ |
| | | private MesMdItemTypeDO convertToMesDO(MdmItemCategoryRespDTO dto) { |
| | | MesMdItemTypeDO mesDO = new MesMdItemTypeDO(); |
| | | mesDO.setId(dto.getId()); |
| | | mesDO.setCode(dto.getCode()); |
| | | mesDO.setName(dto.getName()); |
| | | mesDO.setParentId(dto.getParentId()); |
| | | mesDO.setItemOrProduct(dto.getItemOrProduct()); |
| | | mesDO.setSort(dto.getSort()); |
| | | mesDO.setStatus(dto.getStatus()); |
| | | return mesDO; |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.batch.MesWmBatchMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum; |
| | | import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemBatchConfigService; |
| | | import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemBatchConfigApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemBatchConfigRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | @Resource |
| | | private MesMdmItemService mdmItemService; |
| | | @Resource |
| | | private MesMdItemBatchConfigService itemBatchConfigService; |
| | | private MdmItemBatchConfigApi itemBatchConfigApi; |
| | | @Resource |
| | | private MesMdAutoCodeRecordService autoCodeRecordService; |
| | | @Resource |
| | |
| | | // æªå¯ç¨æ¹æ¬¡ç®¡çï¼è¿å null |
| | | return null; |
| | | } |
| | | // 1.2 æ¥è¯¢ç©ææ¹æ¬¡é
ç½® |
| | | MesMdItemBatchConfigDO config = itemBatchConfigService.validateItemBatchConfigExists(reqVO.getItemId()); |
| | | |
| | | // è°è¯æ¥å¿ï¼æå°æ¥æ¶å°çæ¥æ |
| | | log.info("[getOrGenerateBatchCode] æ¶å°è¯·æ±, itemId={}, batchCode={}, produceDate={}", |
| | | reqVO.getItemId(), reqVO.getBatchCode(), reqVO.getProduceDate()); |
| | | |
| | | // 1.2 æ¥è¯¢ç©ææ¹æ¬¡é
ç½®ï¼ä» MDM è·åï¼ä¸åå¨å使ç¨é»è®¤é
ç½®ï¼ |
| | | MdmItemBatchConfigRespDTO config = itemBatchConfigApi.getItemBatchConfig(reqVO.getItemId()); |
| | | |
| | | // 2. æ ¹æ®é
ç½®æ ¡éªå¿
å¡«åæ°å¹¶æ¸
空ä¸éè¦çåæ° |
| | | MesWmBatchDO batch = MesWmBatchDO.builder().itemId(reqVO.getItemId()).build(); |
| | | // çäº§æ¥æ |
| | | if (Boolean.TRUE.equals(config.getProduceDateFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getProduceDate())) { |
| | | throw exception(WM_BATCH_PRODUCE_DATE_REQUIRED); |
| | | if (config != null) { |
| | | // çäº§æ¥æ |
| | | if (Boolean.TRUE.equals(config.getProduceDateFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getProduceDate())) { |
| | | throw exception(WM_BATCH_PRODUCE_DATE_REQUIRED); |
| | | } |
| | | batch.setProduceDate(reqVO.getProduceDate()); |
| | | } |
| | | batch.setProduceDate(reqVO.getProduceDate()); |
| | | // å
¥åºæ¥æ |
| | | if (Boolean.TRUE.equals(config.getReceiptDateFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getReceiptDate())) { |
| | | throw exception(WM_BATCH_RECEIPT_DATE_REQUIRED); |
| | | } |
| | | batch.setReceiptDate(reqVO.getReceiptDate()); |
| | | } |
| | | // æææ |
| | | if (Boolean.TRUE.equals(config.getExpireDateFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getExpireDate())) { |
| | | throw exception(WM_BATCH_EXPIRE_DATE_REQUIRED); |
| | | } |
| | | batch.setExpireDate(reqVO.getExpireDate()); |
| | | } |
| | | // ä¾åºå |
| | | if (Boolean.TRUE.equals(config.getVendorFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getVendorId())) { |
| | | throw exception(WM_BATCH_VENDOR_REQUIRED); |
| | | } |
| | | batch.setVendorId(reqVO.getVendorId()); |
| | | } |
| | | // å®¢æ· |
| | | if (Boolean.TRUE.equals(config.getClientFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getClientId())) { |
| | | throw exception(WM_BATCH_CLIENT_REQUIRED); |
| | | } |
| | | batch.setClientId(reqVO.getClientId()); |
| | | } |
| | | // éè´è®¢åç¼å· |
| | | if (Boolean.TRUE.equals(config.getPurchaseOrderCodeFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getPurchaseOrderCode())) { |
| | | throw exception(WM_BATCH_PURCHASE_ORDER_CODE_REQUIRED); |
| | | } |
| | | batch.setPurchaseOrderCode(reqVO.getPurchaseOrderCode()); |
| | | } |
| | | // éå®è®¢åç¼å· |
| | | if (Boolean.TRUE.equals(config.getSalesOrderCodeFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getSalesOrderCode())) { |
| | | throw exception(WM_BATCH_CUSTOMER_ORDER_CODE_REQUIRED); |
| | | } |
| | | batch.setSalesOrderCode(reqVO.getSalesOrderCode()); |
| | | } |
| | | // ç产工å |
| | | if (Boolean.TRUE.equals(config.getWorkOrderFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getWorkOrderId())) { |
| | | throw exception(WM_BATCH_WORK_ORDER_REQUIRED); |
| | | } |
| | | batch.setWorkOrderId(reqVO.getWorkOrderId()); |
| | | } |
| | | // çäº§ä»»å¡ |
| | | if (Boolean.TRUE.equals(config.getTaskFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getTaskId())) { |
| | | throw exception(WM_BATCH_TASK_REQUIRED); |
| | | } |
| | | batch.setTaskId(reqVO.getTaskId()); |
| | | } |
| | | // å·¥ä½ç« |
| | | if (Boolean.TRUE.equals(config.getWorkstationFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getWorkstationId())) { |
| | | throw exception(WM_BATCH_WORKSTATION_REQUIRED); |
| | | } |
| | | batch.setWorkstationId(reqVO.getWorkstationId()); |
| | | } |
| | | // å·¥å
· |
| | | if (Boolean.TRUE.equals(config.getToolFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getToolId())) { |
| | | throw exception(WM_BATCH_TOOL_REQUIRED); |
| | | } |
| | | batch.setToolId(reqVO.getToolId()); |
| | | } |
| | | // 模å
· |
| | | if (Boolean.TRUE.equals(config.getMoldFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getMoldId())) { |
| | | throw exception(WM_BATCH_MOLD_REQUIRED); |
| | | } |
| | | batch.setMoldId(reqVO.getMoldId()); |
| | | } |
| | | // ç产æ¹å· |
| | | if (Boolean.TRUE.equals(config.getLotNumberFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getLotNumber())) { |
| | | throw exception(WM_BATCH_LOT_NUMBER_REQUIRED); |
| | | } |
| | | batch.setLotNumber(reqVO.getLotNumber()); |
| | | } |
| | | // è´¨éç¶æ |
| | | if (Boolean.TRUE.equals(config.getQualityStatusFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getQualityStatus())) { |
| | | throw exception(WM_BATCH_QUALITY_STATUS_REQUIRED); |
| | | } |
| | | batch.setQualityStatus(reqVO.getQualityStatus()); |
| | | } |
| | | } |
| | | // å
¥åºæ¥æ |
| | | if (Boolean.TRUE.equals(config.getReceiptDateFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getReceiptDate())) { |
| | | throw exception(WM_BATCH_RECEIPT_DATE_REQUIRED); |
| | | // æ æ¹æ¬¡é
ç½®æ¶ï¼ä½¿ç¨ä¼ å
¥çåæ°ï¼å®½æ¾æ¨¡å¼ï¼éç¨äºèªå®ä¹å
¥åºçåºæ¯ï¼ |
| | | else { |
| | | if (reqVO.getProduceDate() != null) { |
| | | batch.setProduceDate(reqVO.getProduceDate()); |
| | | } |
| | | batch.setReceiptDate(reqVO.getReceiptDate()); |
| | | } |
| | | // æææ |
| | | if (Boolean.TRUE.equals(config.getExpireDateFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getExpireDate())) { |
| | | throw exception(WM_BATCH_EXPIRE_DATE_REQUIRED); |
| | | if (reqVO.getReceiptDate() != null) { |
| | | batch.setReceiptDate(reqVO.getReceiptDate()); |
| | | } |
| | | batch.setExpireDate(reqVO.getExpireDate()); |
| | | } |
| | | // ä¾åºå |
| | | if (Boolean.TRUE.equals(config.getVendorFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getVendorId())) { |
| | | throw exception(WM_BATCH_VENDOR_REQUIRED); |
| | | if (reqVO.getExpireDate() != null) { |
| | | batch.setExpireDate(reqVO.getExpireDate()); |
| | | } |
| | | batch.setVendorId(reqVO.getVendorId()); |
| | | } |
| | | // å®¢æ· |
| | | if (Boolean.TRUE.equals(config.getClientFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getClientId())) { |
| | | throw exception(WM_BATCH_CLIENT_REQUIRED); |
| | | if (reqVO.getVendorId() != null) { |
| | | batch.setVendorId(reqVO.getVendorId()); |
| | | } |
| | | batch.setClientId(reqVO.getClientId()); |
| | | } |
| | | // éè´è®¢åç¼å· |
| | | if (Boolean.TRUE.equals(config.getPurchaseOrderCodeFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getPurchaseOrderCode())) { |
| | | throw exception(WM_BATCH_PURCHASE_ORDER_CODE_REQUIRED); |
| | | if (reqVO.getClientId() != null) { |
| | | batch.setClientId(reqVO.getClientId()); |
| | | } |
| | | batch.setPurchaseOrderCode(reqVO.getPurchaseOrderCode()); |
| | | } |
| | | // éå®è®¢åç¼å· |
| | | if (Boolean.TRUE.equals(config.getSalesOrderCodeFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getSalesOrderCode())) { |
| | | throw exception(WM_BATCH_CUSTOMER_ORDER_CODE_REQUIRED); |
| | | } |
| | | batch.setSalesOrderCode(reqVO.getSalesOrderCode()); |
| | | } |
| | | // ç产工å |
| | | if (Boolean.TRUE.equals(config.getWorkOrderFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getWorkOrderId())) { |
| | | throw exception(WM_BATCH_WORK_ORDER_REQUIRED); |
| | | } |
| | | batch.setWorkOrderId(reqVO.getWorkOrderId()); |
| | | } |
| | | // çäº§ä»»å¡ |
| | | if (Boolean.TRUE.equals(config.getTaskFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getTaskId())) { |
| | | throw exception(WM_BATCH_TASK_REQUIRED); |
| | | } |
| | | batch.setTaskId(reqVO.getTaskId()); |
| | | } |
| | | // å·¥ä½ç« |
| | | if (Boolean.TRUE.equals(config.getWorkstationFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getWorkstationId())) { |
| | | throw exception(WM_BATCH_WORKSTATION_REQUIRED); |
| | | } |
| | | batch.setWorkstationId(reqVO.getWorkstationId()); |
| | | } |
| | | // å·¥å
· |
| | | if (Boolean.TRUE.equals(config.getToolFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getToolId())) { |
| | | throw exception(WM_BATCH_TOOL_REQUIRED); |
| | | } |
| | | batch.setToolId(reqVO.getToolId()); |
| | | } |
| | | // 模å
· |
| | | if (Boolean.TRUE.equals(config.getMoldFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getMoldId())) { |
| | | throw exception(WM_BATCH_MOLD_REQUIRED); |
| | | } |
| | | batch.setMoldId(reqVO.getMoldId()); |
| | | } |
| | | // ç产æ¹å· |
| | | if (Boolean.TRUE.equals(config.getLotNumberFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getLotNumber())) { |
| | | throw exception(WM_BATCH_LOT_NUMBER_REQUIRED); |
| | | } |
| | | batch.setLotNumber(reqVO.getLotNumber()); |
| | | } |
| | | // è´¨éç¶æ |
| | | if (Boolean.TRUE.equals(config.getQualityStatusFlag())) { |
| | | if (ObjUtil.isNull(reqVO.getQualityStatus())) { |
| | | throw exception(WM_BATCH_QUALITY_STATUS_REQUIRED); |
| | | } |
| | | batch.setQualityStatus(reqVO.getQualityStatus()); |
| | | } |
| | | |
| | | // 3.1 æ
åµä¸ï¼æ¥è¯¢æ¯å¦åå¨å¹é
çæ¹æ¬¡ |
| | | MesWmBatchDO existingBatch = batchMapper.selectFirst(batch); |
| | | if (existingBatch != null) { |
| | | return existingBatch; |
| | | // 3.1 æ
åµä¸ï¼ä¼ å
¥äº batchCodeï¼æ¥è¯¢æ¯å¦åå¨è¯¥æ¹æ¬¡å· |
| | | if (StrUtil.isNotBlank(reqVO.getBatchCode())) { |
| | | MesWmBatchDO existingBatch = batchMapper.selectByCode(reqVO.getBatchCode()); |
| | | if (existingBatch != null) { |
| | | // æ ¡éªç©ææ¯å¦å¹é
|
| | | if (!existingBatch.getItemId().equals(reqVO.getItemId())) { |
| | | throw exception(WM_BATCH_ITEM_MISMATCH); |
| | | } |
| | | // æ´æ°æ¹æ¬¡å±æ§ï¼ä»
æ´æ°ä¼ å
¥çé空å¼ï¼ |
| | | updateBatchProperties(existingBatch, batch); |
| | | return existingBatch; |
| | | } |
| | | // ä¸åå¨å使ç¨ä¼ å
¥ç batchCode åå»ºæ°æ¹æ¬¡ |
| | | batch.setCode(reqVO.getBatchCode()); |
| | | } else { |
| | | // 3.2 æ
åµäºï¼æ¥è¯¢æ¯å¦åå¨å¹é
çæ¹æ¬¡ï¼æ ¹æ®å±æ§å¹é
ï¼ |
| | | MesWmBatchDO existingBatch = batchMapper.selectFirst(batch); |
| | | if (existingBatch != null) { |
| | | return existingBatch; |
| | | } |
| | | // 3.3 æ
åµä¸ï¼èªå¨çææ°æ¹æ¬¡å· |
| | | String batchCode = autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.WM_BATCH_CODE.getCode()); |
| | | batch.setCode(batchCode); |
| | | } |
| | | |
| | | // 3.2 æ
åµäºï¼çææ°æ¹æ¬¡ |
| | | String batchCode = autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.WM_BATCH_CODE.getCode()); |
| | | batch.setCode(batchCode); |
| | | batchMapper.insert(batch); |
| | | |
| | | // 4. çææ¡ç |
| | |
| | | return batch; |
| | | } |
| | | |
| | | /** |
| | | * æ´æ°å·²ææ¹æ¬¡ç屿§ï¼ä»
æ´æ°ä¼ å
¥çé空å¼ï¼ |
| | | * |
| | | * @param existingBatch å·²ææ¹æ¬¡ |
| | | * @param newBatch æ°æ¹æ¬¡å±æ§ |
| | | */ |
| | | private void updateBatchProperties(MesWmBatchDO existingBatch, MesWmBatchDO newBatch) { |
| | | boolean needUpdate = false; |
| | | if (newBatch.getProduceDate() != null && !newBatch.getProduceDate().equals(existingBatch.getProduceDate())) { |
| | | existingBatch.setProduceDate(newBatch.getProduceDate()); |
| | | needUpdate = true; |
| | | } |
| | | if (newBatch.getExpireDate() != null && !newBatch.getExpireDate().equals(existingBatch.getExpireDate())) { |
| | | existingBatch.setExpireDate(newBatch.getExpireDate()); |
| | | needUpdate = true; |
| | | } |
| | | if (newBatch.getReceiptDate() != null && !newBatch.getReceiptDate().equals(existingBatch.getReceiptDate())) { |
| | | existingBatch.setReceiptDate(newBatch.getReceiptDate()); |
| | | needUpdate = true; |
| | | } |
| | | if (newBatch.getVendorId() != null && !newBatch.getVendorId().equals(existingBatch.getVendorId())) { |
| | | existingBatch.setVendorId(newBatch.getVendorId()); |
| | | needUpdate = true; |
| | | } |
| | | if (newBatch.getClientId() != null && !newBatch.getClientId().equals(existingBatch.getClientId())) { |
| | | existingBatch.setClientId(newBatch.getClientId()); |
| | | needUpdate = true; |
| | | } |
| | | if (newBatch.getSalesOrderCode() != null && !newBatch.getSalesOrderCode().equals(existingBatch.getSalesOrderCode())) { |
| | | existingBatch.setSalesOrderCode(newBatch.getSalesOrderCode()); |
| | | needUpdate = true; |
| | | } |
| | | if (newBatch.getPurchaseOrderCode() != null && !newBatch.getPurchaseOrderCode().equals(existingBatch.getPurchaseOrderCode())) { |
| | | existingBatch.setPurchaseOrderCode(newBatch.getPurchaseOrderCode()); |
| | | needUpdate = true; |
| | | } |
| | | if (newBatch.getWorkOrderId() != null && !newBatch.getWorkOrderId().equals(existingBatch.getWorkOrderId())) { |
| | | existingBatch.setWorkOrderId(newBatch.getWorkOrderId()); |
| | | needUpdate = true; |
| | | } |
| | | if (newBatch.getTaskId() != null && !newBatch.getTaskId().equals(existingBatch.getTaskId())) { |
| | | existingBatch.setTaskId(newBatch.getTaskId()); |
| | | needUpdate = true; |
| | | } |
| | | if (newBatch.getWorkstationId() != null && !newBatch.getWorkstationId().equals(existingBatch.getWorkstationId())) { |
| | | existingBatch.setWorkstationId(newBatch.getWorkstationId()); |
| | | needUpdate = true; |
| | | } |
| | | if (newBatch.getToolId() != null && !newBatch.getToolId().equals(existingBatch.getToolId())) { |
| | | existingBatch.setToolId(newBatch.getToolId()); |
| | | needUpdate = true; |
| | | } |
| | | if (newBatch.getMoldId() != null && !newBatch.getMoldId().equals(existingBatch.getMoldId())) { |
| | | existingBatch.setMoldId(newBatch.getMoldId()); |
| | | needUpdate = true; |
| | | } |
| | | if (newBatch.getLotNumber() != null && !newBatch.getLotNumber().equals(existingBatch.getLotNumber())) { |
| | | existingBatch.setLotNumber(newBatch.getLotNumber()); |
| | | needUpdate = true; |
| | | } |
| | | if (newBatch.getQualityStatus() != null && !newBatch.getQualityStatus().equals(existingBatch.getQualityStatus())) { |
| | | existingBatch.setQualityStatus(newBatch.getQualityStatus()); |
| | | needUpdate = true; |
| | | } |
| | | if (needUpdate) { |
| | | batchMapper.updateById(existingBatch); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<MesWmBatchDO> getForwardBatchList(String code) { |
| | | return getForwardBatchList(code, new HashSet<>(), 0); |
| | |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; |
| | | 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; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; |
| | | 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; |
| | |
| | | @Resource |
| | | @Lazy |
| | | private MesWmTransactionService wmTransactionService; |
| | | @Resource |
| | | @Lazy |
| | | private MesWmBatchService batchService; |
| | | |
| | | @Override |
| | | public MesWmMaterialStockDO getMaterialStock(Long id) { |
| | |
| | | // 1. æ ¡éªç©æåå¨ä¸å¯ç¨ |
| | | MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(reqVO.getItemId()); |
| | | |
| | | // 2. æ ¡éªåºä½æ··æ¾è§å |
| | | checkAreaMixingRule(reqVO.getAreaId(), reqVO.getItemId(), reqVO.getBatchId()); |
| | | // 2. å¤çæ¹æ¬¡ï¼ä»
å
¥åºæ¶éè¦å¤çæ¹æ¬¡ï¼ |
| | | Long batchId = reqVO.getBatchId(); |
| | | String batchCode = reqVO.getBatchCode(); |
| | | if (isInbound) { |
| | | MesWmBatchDO batch = resolveBatch(reqVO, item); |
| | | if (batch != null) { |
| | | batchId = batch.getId(); |
| | | batchCode = batch.getCode(); |
| | | } |
| | | } else { |
| | | // åºåºæ¶æ ¡éªæ¹æ¬¡åå¨ |
| | | if (batchId != null) { |
| | | batchService.validateBatchExists(batchId, reqVO.getItemId()); |
| | | } |
| | | } |
| | | |
| | | // 3. è·åæå建åºåè®°å½ |
| | | // 3. æ ¡éªåºä½æ··æ¾è§å |
| | | checkAreaMixingRule(reqVO.getAreaId(), reqVO.getItemId(), batchId); |
| | | |
| | | // 4. è·åæå建åºåè®°å½ |
| | | MesWmMaterialStockDO stock = getOrCreateMaterialStock( |
| | | reqVO.getItemId(), |
| | | reqVO.getWarehouseId(), |
| | | reqVO.getLocationId(), |
| | | reqVO.getAreaId(), |
| | | reqVO.getBatchId(), |
| | | reqVO.getBatchCode(), |
| | | batchId, |
| | | batchCode, |
| | | reqVO.getVendorId(), |
| | | LocalDateTime.now() |
| | | ); |
| | | |
| | | // 4. 计ç®å卿°éï¼å
¥åºä¸ºæ£ï¼åºåºä¸ºè´ |
| | | // 5. 计ç®å卿°éï¼å
¥åºä¸ºæ£ï¼åºåºä¸ºè´ |
| | | BigDecimal quantity = isInbound ? reqVO.getQuantity() : reqVO.getQuantity().negate(); |
| | | |
| | | // 5. æ´æ°åºåæ°éï¼åºåºæ¶æ ¡éªåºåå
è¶³ï¼ |
| | | updateMaterialStockQuantity(stock.getId(), quantity, !isInbound); |
| | | |
| | | // 6. å建åºåäºå¡æµæ°´ |
| | | // 6. å建åºåäºå¡æµæ°´ï¼å
é¨ä¼æ´æ°åºåæ°éï¼ |
| | | int bizType = isInbound ? MesBizTypeConstants.WM_STOCK_ADJUST_IN : MesBizTypeConstants.WM_STOCK_ADJUST_OUT; |
| | | MesWmTransactionSaveReqDTO transaction = new MesWmTransactionSaveReqDTO() |
| | | .setType(isInbound ? MesWmTransactionTypeEnum.IN.getType() : MesWmTransactionTypeEnum.OUT.getType()) |
| | |
| | | .setBizLineId(stock.getId()) |
| | | .setItemId(reqVO.getItemId()) |
| | | .setQuantity(quantity) |
| | | .setBatchId(reqVO.getBatchId()) |
| | | .setBatchCode(reqVO.getBatchCode()) |
| | | .setBatchId(batchId) |
| | | .setBatchCode(batchCode) |
| | | .setWarehouseId(reqVO.getWarehouseId()) |
| | | .setLocationId(reqVO.getLocationId()) |
| | | .setAreaId(reqVO.getAreaId()) |
| | |
| | | return stock.getId(); |
| | | } |
| | | |
| | | /** |
| | | * è§£ææ¹æ¬¡ |
| | | * <p> |
| | | * å
¥åºæ¶çæ¹æ¬¡å¤çé»è¾ï¼ |
| | | * 1. ç©ææªå¯ç¨æ¹æ¬¡ç®¡çï¼è¿å null |
| | | * 2. ä¼ å
¥ batchIdï¼æ ¡éªå¹¶ä½¿ç¨å·²ææ¹æ¬¡ |
| | | * 3. æªä¼ batchIdï¼æ ¹æ® batchCode çåæ°èªå¨åå»ºæ¹æ¬¡ |
| | | * |
| | | * @param reqVO å
¥åºè¯·æ± |
| | | * @param item ç©æä¿¡æ¯ |
| | | * @return æ¹æ¬¡è®°å½ï¼ç©ææªå¯ç¨æ¹æ¬¡ç®¡çæ¶è¿å nullï¼ |
| | | */ |
| | | private MesWmBatchDO resolveBatch(MesWmMaterialStockAdjustReqVO reqVO, MesMdmItemDO item) { |
| | | // 1. ç©ææªå¯ç¨æ¹æ¬¡ç®¡çï¼è¿å null |
| | | if (Boolean.FALSE.equals(item.getIsBatchManaged())) { |
| | | return null; |
| | | } |
| | | |
| | | // 2. ä¼ å
¥ batchIdï¼æ ¡éªå¹¶è¿åå·²ææ¹æ¬¡ |
| | | if (reqVO.getBatchId() != null) { |
| | | return batchService.validateBatchExists(reqVO.getBatchId(), reqVO.getItemId()); |
| | | } |
| | | |
| | | // 3. æªä¼ batchIdï¼èªå¨åå»ºæ¹æ¬¡ |
| | | MesWmBatchGenerateReqVO batchReqVO = new MesWmBatchGenerateReqVO() |
| | | .setItemId(reqVO.getItemId()) |
| | | .setBatchCode(reqVO.getBatchCode()) |
| | | .setVendorId(reqVO.getVendorId()) |
| | | .setProduceDate(reqVO.getProduceDate() != null ? reqVO.getProduceDate().atStartOfDay() : null) |
| | | .setExpireDate(reqVO.getExpireDate() != null ? reqVO.getExpireDate().atStartOfDay() : null) |
| | | .setReceiptDate(LocalDateTime.now()) |
| | | .setLotNumber(reqVO.getLotNumber()) |
| | | .setQualityStatus(parseQualityStatus(reqVO.getQualityStatus())); |
| | | return batchService.getOrGenerateBatchCode(batchReqVO); |
| | | } |
| | | |
| | | /** |
| | | * è§£æè´¨éç¶æï¼æ¯ææ°åæåç¬¦ä¸²ï¼ |
| | | */ |
| | | private Integer parseQualityStatus(Object qualityStatus) { |
| | | if (qualityStatus == null) { |
| | | return null; |
| | | } |
| | | if (qualityStatus instanceof Integer) { |
| | | return (Integer) qualityStatus; |
| | | } |
| | | if (qualityStatus instanceof String) { |
| | | String str = (String) qualityStatus; |
| | | // æ¯ææ°åå符串 |
| | | if (str.matches("\\d+")) { |
| | | return Integer.parseInt(str); |
| | | } |
| | | // æ¯æå¸¸è§å符串æ å° |
| | | switch (str.toUpperCase()) { |
| | | case "PENDING": |
| | | case "å¾
æ£éª": |
| | | case "å¾
æ£": |
| | | return 0; |
| | | case "PASS": |
| | | case "QUALIFIED": |
| | | case "åæ ¼": |
| | | return 1; |
| | | case "FAIL": |
| | | case "UNQUALIFIED": |
| | | case "ä¸åæ ¼": |
| | | return 2; |
| | | default: |
| | | throw new IllegalArgumentException("æ æçè´¨éç¶æ: " + str); |
| | | } |
| | | } |
| | | throw new IllegalArgumentException("æ æçè´¨éç¶æç±»å: " + qualityStatus.getClass().getName()); |
| | | } |
| | | |
| | | } |
| | |
| | | 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.erp.api.sale.ErpSaleOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.sale.enums.ErpSaleOrderOutStatusEnum; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | // æ§è¡æ£è´§ï¼å¾
æ£è´§ â å¾
å¡«åè¿åï¼ |
| | | productSalesMapper.updateById(new MesWmProductSalesDO() |
| | | .setId(id).setStatus(MesWmProductSalesStatusEnum.SHIPPING.getStatus())); |
| | | |
| | | // åå ERP éå®è®¢ååºåºç¶æä¸º"é¨ååºåº"ï¼è¡¨ç¤ºå·²æ£è´§/å ç¨ï¼ |
| | | if (sales.getSaleOrderId() != null) { |
| | | saleOrderApi.updateOrderOutStatusTo(sales.getSaleOrderId(), |
| | | ErpSaleOrderOutStatusEnum.PART_OUT.getStatus()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) |
| | | .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) |
| | | .setBizType(MesBizTypeConstants.WM_PRODUCT_SALES).setBizId(sales.getId()) |
| | | .setBizCode(sales.getCode()).setBizLineId(detail.getLineId()))); |
| | | .setBizCode(sales.getCode()).setBizLineId(detail.getLineId()) |
| | | .setMaterialStockId(detail.getMaterialStockId()))); // æå®åºåè®°å½IDï¼é¿å
éæ°å¹é
|
| | | } |
| | | |
| | | @Override |
| | |
| | | import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.enums.ErpSaleOrderOutStatusEnum; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitSalesNotice(Long id) { |
| | | // 1.1 æ ¡éªåå¨ + èç¨¿ç¶æ |
| | | validateSalesNoticeExistsAndDraft(id); |
| | | MesWmSalesNoticeDO notice = validateSalesNoticeExistsAndDraft(id); |
| | | // 1.2 æ£æ¥æ¯å¦æè¡é¡¹ç® |
| | | List<MesWmSalesNoticeLineDO> lines = salesNoticeLineService.getSalesNoticeLineListByNoticeId(id); |
| | | if (CollUtil.isEmpty(lines)) { |
| | |
| | | // 2. æ´æ°ç¶æï¼è稿 â å¾
åºåº |
| | | salesNoticeMapper.updateById(new MesWmSalesNoticeDO() |
| | | .setId(id).setStatus(APPROVED.getStatus())); |
| | | |
| | | // 3. åå ERP éå®è®¢ååºåºç¶æä¸º"å·²é¢ç" |
| | | if (notice.getSaleOrderId() != null) { |
| | | saleOrderApi.updateOrderOutStatusTo(notice.getSaleOrderId(), |
| | | ErpSaleOrderOutStatusEnum.RESERVED.getStatus()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | package cn.iocoder.yudao.module.mes.service.wm.transaction; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.transaction.vo.MesWmTransactionPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transaction.MesWmTransactionDO; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | | import jakarta.validation.Valid; |
| | | |
| | |
| | | */ |
| | | void createTransactionList(List<MesWmTransactionSaveReqDTO> reqDTOs); |
| | | |
| | | /** |
| | | * å页æ¥è¯¢åºåäºå¡æµæ°´ |
| | | * |
| | | * @param pageReqVO æ¥è¯¢æ¡ä»¶ |
| | | * @return äºå¡æµæ°´åé¡µç»æ |
| | | */ |
| | | PageResult<MesWmTransactionDO> getTransactionPage(MesWmTransactionPageReqVO pageReqVO); |
| | | |
| | | } |
| | |
| | | import cn.hutool.core.lang.Assert; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.transaction.vo.MesWmTransactionPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; |
| | |
| | | // 1.5 å
³èäºå¡æ ¡éª |
| | | checkRelatedTransaction(reqDTO); |
| | | |
| | | // 2.1 è·åæå建åºåè®°å½ |
| | | MesWmMaterialStockDO materialStock = materialStockService.getOrCreateMaterialStock( |
| | | reqDTO.getItemId(), reqDTO.getWarehouseId(), reqDTO.getLocationId(), reqDTO.getAreaId(), |
| | | reqDTO.getBatchId(), reqDTO.getBatchCode(), reqDTO.getVendorId(), reqDTO.getReceiptTime()); |
| | | // 2.1 è·åæå建åºåè®°å½ï¼å¦æä¼ å
¥äº materialStockId åç´æ¥ä½¿ç¨ï¼é¿å
éæ°å¹é
ï¼ |
| | | MesWmMaterialStockDO materialStock; |
| | | if (reqDTO.getMaterialStockId() != null) { |
| | | materialStock = materialStockService.getMaterialStock(reqDTO.getMaterialStockId()); |
| | | if (materialStock == null) { |
| | | throw exception(WM_MATERIAL_STOCK_NOT_EXISTS); |
| | | } |
| | | // æ ¡éªç©æãæ¹æ¬¡ãä»åºç维度ä¸è´ï¼é²æ¢ä¼ å
¥é误ç materialStockIdï¼ |
| | | if (ObjUtil.notEqual(materialStock.getItemId(), reqDTO.getItemId()) |
| | | || ObjUtil.notEqual(materialStock.getWarehouseId(), reqDTO.getWarehouseId()) |
| | | || ObjUtil.notEqual(materialStock.getLocationId(), reqDTO.getLocationId()) |
| | | || ObjUtil.notEqual(materialStock.getAreaId(), reqDTO.getAreaId())) { |
| | | throw exception(WM_MATERIAL_STOCK_SELECTION_MISMATCH); |
| | | } |
| | | } else { |
| | | materialStock = materialStockService.getOrCreateMaterialStock( |
| | | reqDTO.getItemId(), reqDTO.getWarehouseId(), reqDTO.getLocationId(), reqDTO.getAreaId(), |
| | | reqDTO.getBatchId(), reqDTO.getBatchCode(), reqDTO.getVendorId(), reqDTO.getReceiptTime()); |
| | | } |
| | | // 2.2 å»ç»æ ¡éªï¼ä»åºãåºåºãåºä½ãåºåè®°å½ï¼ |
| | | checkFrozen(reqDTO, materialStock); |
| | | // 2.3 æ´æ°åºåæ°é |
| | |
| | | reqDTOs.forEach(this::createTransaction); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<MesWmTransactionDO> getTransactionPage(MesWmTransactionPageReqVO pageReqVO) { |
| | | return transactionMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | // ==================== ç§ææ ¡éªæ¹æ³ ==================== |
| | | |
| | | /** |
| | |
| | | // ===== å
³è ===== |
| | | |
| | | /** |
| | | * æå®åºåè®°å½ IDï¼åºåºåºæ¯ä¼å
使ç¨ï¼é¿å
éæ°å¹é
åºåè®°å½ï¼ |
| | | */ |
| | | private Long materialStockId; |
| | | |
| | | /** |
| | | * å
³èäºå¡ IDï¼æå¯¹äºå¡ä¸ï¼å
¥åºäºå¡å
³èåºåºäºå¡ï¼ |
| | | */ |
| | | private Long relatedTransactionId; |
| | |
| | | SQL è·¯å¾ï¼åºåäºå¡(æ¶è OUT) â æ¶èå â æ¥å·¥è®°å½ â åºåäºå¡(äº§åº IN) â æ¹æ¬¡ |
| | | --> |
| | | <select id="selectListByForward" parameterType="String" resultMap="BatchTraceResult"> |
| | | SELECT DISTINCT pf.work_order_id, pf.item_id, ppl.batch_id, ppl.batch_code |
| | | SELECT DISTINCT pf.work_order_id, pf.item_id, tx_produce.batch_id, tx_produce.batch_code |
| | | FROM mes_wm_transaction tx_consume |
| | | LEFT JOIN mes_wm_item_consume ic ON tx_consume.biz_id = ic.id AND tx_consume.biz_type = 123 AND ic.deleted = 0 |
| | | LEFT JOIN mes_pro_feedback pf ON pf.id = ic.feedback_id AND pf.deleted = 0 |
| | | LEFT JOIN mes_wm_transaction tx_produce ON tx_produce.biz_id = pf.id AND tx_produce.biz_type = 124 AND tx_produce.deleted = 0 |
| | | LEFT JOIN mes_wm_product_produce pp ON tx_produce.biz_id = pp.id AND tx_produce.biz_type = 124 AND pp.deleted = 0 |
| | | WHERE tx_consume.batch_code = #{batchCode} |
| | | AND tx_consume.biz_type = 123 |
| | | AND tx_consume.deleted = 0 |
| | |
| | | SQL è·¯å¾ï¼åºåäºå¡(äº§åº IN) â 产åºå â æ¥å·¥è®°å½ â åºåäºå¡(æ¶è OUT) â æ¹æ¬¡ |
| | | --> |
| | | <select id="selectListByBackward" parameterType="String" resultMap="BatchTraceResult"> |
| | | SELECT DISTINCT ic.work_order_id, icd.item_id, icd.batch_id, icd.batch_code |
| | | SELECT DISTINCT ic.work_order_id, tx_consume.item_id, tx_consume.batch_id, tx_consume.batch_code |
| | | FROM mes_wm_transaction tx_produce |
| | | LEFT JOIN mes_wm_product_produce pp ON tx_produce.biz_id = pp.id AND tx_produce.biz_type = 124 AND pp.deleted = 0 |
| | | LEFT JOIN mes_pro_feedback pf ON pf.id = pp.feedback_id AND pf.deleted = 0 |
| | | LEFT JOIN mes_wm_transaction tx_consume ON tx_consume.biz_id = pf.id AND tx_consume.biz_type = 123 AND tx_consume.deleted = 0 |
| | | LEFT JOIN mes_wm_item_consume ic ON tx_consume.biz_id = ic.id AND tx_consume.biz_type = 123 AND ic.deleted = 0 |
| | | LEFT JOIN mes_wm_item_consume ic ON ic.id = tx_consume.biz_id AND ic.deleted = 0 |
| | | WHERE tx_produce.batch_code = #{batchCode} |
| | | AND tx_produce.biz_type = 124 |
| | | AND tx_produce.deleted = 0 |