| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # 确认æ¶è´§ä¸è´¨æ£æµç¨ - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - éè´è®¢åå表页 |
| | | - éè´è®¢å详æ
页 |
| | | - å°è´§éç¥åå表页 |
| | | - å°è´§éç¥å详æ
页 |
| | | - IQC æ¥ææ£éªåé¡µé¢ |
| | | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | ``` |
| | | éè´ç³è¯·å®¡æ¹éè¿ â çæéè´è®¢åï¼å·²å®¡æ ¸ï¼ â 确认æ¶è´§ |
| | | â 夿æ¯å¦åå¨éè´¨æ£ç©æ |
| | | âââ æ¯ â çæå°è´§éç¥åï¼å¾
è´¨æ£ï¼â èªå¨å建 IQC å â IQC æ¥æè´¨æ£ |
| | | â âââ åæ ¼ â çå¾
ææè´¨æ£å®æ |
| | | â âââ ç¹é â çå¾
ææè´¨æ£å®æ |
| | | â âââ ä¸åæ ¼ï¼éè´§ï¼â ç¶æä¿æå¾
è´¨æ£ |
| | | â âââ ä¸åæ ¼ï¼æ¥åºï¼â ç¶æä¿æå¾
è´¨æ£ |
| | | â â |
| | | â ææéæ£ç©æè´¨æ£å®æä¸å¯å
¥åºï¼åæ ¼/ç¹éï¼â å°è´§éç¥åï¼å¾
å
¥åºï¼ |
| | | âââ å¦ â çæå°è´§éç¥åï¼å¾
å
¥åºï¼ |
| | | ``` |
| | | |
| | | **åæ®µå¸¦å
¥è¯´æï¼** |
| | | |
| | | | æºåæ® | ç®æ åæ® | 带å
¥å段 | |
| | | |--------|----------|----------| |
| | | | éè´è®¢å | å°è´§éç¥å | ä¾åºåãéè´è®¢åå· | |
| | | | éè´è®¢åæç» | å°è´§éç¥åè¡ | ç©æãå°è´§æ°éãè´¨æ£æ è¯(qcCheckFlag) | |
| | | | å°è´§éç¥åè¡ | IQC æ£éªå | ç©æãå°è´§æ°éãä¾åºå | |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /erp/purchase-order/confirm-receipt | 确认æ¶è´§ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | éè´è®¢åç¼å· | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": 123, // çæçå°è´§éç¥åç¼å· |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | ### éè´è®¢åæç»æ°å¢å段 |
| | | |
| | | | åæ®µ | ç±»å | å±ç¤ºä½ç½® | 说æ | |
| | | |------|------|----------|------| |
| | | | qcCheckFlag | Boolean | å表ã详æ
ã表å | æ¯å¦éè¦æ¥ææ£éªï¼é»è®¤ false | |
| | | |
| | | ### å°è´§éç¥åè¡æ°å¢å段 |
| | | |
| | | | åæ®µ | ç±»å | å±ç¤ºä½ç½® | 说æ | |
| | | |------|------|----------|------| |
| | | | iqcCheckFlag | Boolean | å表ã详æ
| æ¯å¦éè¦æ¥ææ£éªï¼ä»éè´è®¢å带å
¥ï¼ | |
| | | | iqcId | Long | 详æ
| å
³èç IQC æ£éªåç¼å·ï¼èªå¨å建åååï¼ | |
| | | | iqcCheckResult | Integer | å表ã详æ
| è´¨æ£ç»æï¼1åæ ¼ 2ç¹é 3ä¸åæ ¼éè´§ 4ä¸åæ ¼æ¥åº | |
| | | | qualifiedQuantity | BigDecimal | å表ã详æ
| åæ ¼æ°éï¼è´¨æ£å®æåååï¼ | |
| | | |
| | | ### å°è´§éç¥åç¶ææµè½¬ |
| | | |
| | | | ç¶æå¼ | ç¶æå | 说æ | |
| | | |--------|--------|------| |
| | | | 0 | è稿 | æ°å»ºç¶æ | |
| | | | 10 | å¾
è´¨æ£ | åå¨éè´¨æ£ç©æï¼çå¾
IQC 宿 | |
| | | | 20 | å¾
å
¥åº | æ éè´¨æ£æææè´¨æ£å®æä¸å¯å
¥åº | |
| | | | 30 | 已宿 | å
¥åºå®æ | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | ### 确认æ¶è´§æé®å±ç¤º |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | æ¾ç¤ºæ¡ä»¶ | 订åç¶æ=å·²å®¡æ ¸(20) ä¸ å
¥åºç¶æâ å
¨é¨å
¥åº(2) | |
| | | | ç¹å»å | è°ç¨ confirmReceipt æ¥å£ï¼è¿åå°è´§éç¥åç¼å· | |
| | | | æåå | æç¤º"确认æ¶è´§æåï¼å·²çæå°è´§éç¥å"ï¼å·æ°å表 | |
| | | |
| | | ### è´¨æ£ç»æå¯¹å
¥åºçå½±å |
| | | |
| | | | è´¨æ£ç»æ | å¼ | æ¯å¦å¯å
¥åº | 说æ | |
| | | |----------|-----|------------|------| |
| | | | åæ ¼ | 1 | â
æ¯ | æ£å¸¸å
¥åº | |
| | | | ç¹é | 2 | â
æ¯ | ç¹æ®æ¹åå
¥åº | |
| | | | ä¸åæ ¼éè´§ | 3 | â å¦ | éåä¾åºåï¼ä¸å¯å
¥åº | |
| | | | ä¸åæ ¼æ¥åº | 4 | â å¦ | æ¥åºå¤çï¼ä¸å¯å
¥åº | |
| | | |
| | | ### å°è´§éç¥åç¶ææ¨è¿è§å |
| | | |
| | | | å½åç¶æ | æ¨è¿æ¡ä»¶ | ç®æ ç¶æ | |
| | | |----------|----------|----------| |
| | | | è稿 | æäº¤æ¶åå¨éè´¨æ£è¡ | å¾
è´¨æ£ | |
| | | | è稿 | æäº¤æ¶æ éè´¨æ£è¡ | å¾
å
¥åº | |
| | | | å¾
è´¨æ£ | ææéæ£è¡å®æè´¨æ£ï¼ä¸é½ä¸ºåæ ¼/ç¹é | å¾
å
¥åº | |
| | | | å¾
è´¨æ£ | åå¨éè´§/æ¥åºç»æçè¡ | ä¿æå¾
è´¨æ£ | |
| | | | å¾
å
¥åº | æå¨å®ææä½ | 已宿 | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **èªå¨å建 IQC å**ï¼ç¡®è®¤æ¶è´§æ¶ï¼å¦æéè´è®¢åæç»è®¾ç½®äº `qcCheckFlag=true`ï¼ç³»ç»ä¼èªå¨å建对åºç IQC æ£éªåï¼æ éæå¨å建ã |
| | | 2. **è´¨æ£ç»æåå**ï¼IQC æ£éªå®æåï¼ä¼èªå¨ååå°è´§éç¥åè¡ç `iqcCheckResult` å `qualifiedQuantity` åæ®µã |
| | | 3. **é¨åæ¶è´§**ï¼ä¸ä¸ªéè´è®¢åå¯ä»¥å¤æ¬¡ç¡®è®¤æ¶è´§ï¼é¨åæ¶è´§åºæ¯ï¼ï¼æ¯æ¬¡çæç¬ç«çå°è´§éç¥åã |
| | | 4. **å
¥åºåææ¡ä»¶**ï¼åªæå°è´§éç¥åç¶æä¸º"å¾
å
¥åº"æ¶æè½æ§è¡éè´å
¥åºæä½ã |
| | | 5. **è´¨æ£å¤±è´¥å¤ç**ï¼å¦æè´¨æ£ç»æä¸ºéè´§ææ¥åºï¼å°è´§éç¥åç¶æä¿æ"å¾
è´¨æ£"ï¼éè¦äººå·¥ä»å
¥å¤çï¼å¦éæ°å®ææ¶è´§ï¼ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # éè´æµç¨å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - éè´è®¢åå表页 |
| | | - éè´è®¢å详æ
页 |
| | | - å°è´§éç¥åå表页 |
| | | - å°è´§éç¥å详æ
页 |
| | | |
| | | ## ä¸å¡æµç¨ |
| | | |
| | | ``` |
| | | éè´ç³è¯·å®¡æ¹éè¿ â èªå¨çæéè´è®¢å(å·²å®¡æ ¸) |
| | | â ç¹å»"确认æ¶è´§" â çæå°è´§éç¥å(å¾
å
¥åº/å¾
è´¨æ£) |
| | | â IQCè´¨æ£(å¦éè¦) â éè´å
¥åº |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãéè´è®¢å模å |
| | | |
| | | ### 1. æ°å¢æé®ï¼ç¡®è®¤æ¶è´§ |
| | | |
| | | **ä½ç½®ï¼** éè´è®¢åå表页ã详æ
页 |
| | | |
| | | **å±ç¤ºæ¡ä»¶ï¼** |
| | | - 订åç¶æ = å·²å®¡æ ¸(20) |
| | | - å
¥åºç¶æ â å
¨é¨å
¥åº(2) |
| | | |
| | | **APIï¼** |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /erp/purchase-order/confirm-receipt | 确认æ¶è´§ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | éè´è®¢åç¼å· | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": 123, // çæçå°è´§éç¥åç¼å· |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ### 2. æ°å¢å段ï¼éè´è®¢åæç» |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | qcCheckFlag | Boolean | æ¯å¦éè¦æ¥ææ£éªï¼é»è®¤ false | |
| | | |
| | | **å±ç¤ºä½ç½®ï¼** éè´è®¢åæç»è¡¨æ ¼ |
| | | |
| | | --- |
| | | |
| | | ## äºãéè´ç³è¯·æ¨¡å |
| | | |
| | | ### æ°å¢å段ï¼éè´ç³è¯·æç» |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | qcCheckFlag | Boolean | æ¯å¦éè¦æ¥ææ£éªï¼é»è®¤ false | |
| | | |
| | | **å±ç¤ºä½ç½®ï¼** éè´ç³è¯·æç»è¡¨æ ¼ |
| | | |
| | | ### æ°å¢å段ï¼éè´ç³è¯·ä¸»è¡¨ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | depositPrice | BigDecimal | å®ééé¢ï¼é»è®¤ 0 | |
| | | |
| | | **å±ç¤ºä½ç½®ï¼** éè´ç³è¯·è¡¨å |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãå°è´§éç¥å模å |
| | | |
| | | ### 1. ç¶ææµè½¬è¯´æ |
| | | |
| | | | ç¶æå¼ | ç¶æå | 说æ | |
| | | |--------|--------|------| |
| | | | 0 | è稿 | æ°å»ºç¶æ | |
| | | | 2 | å¾
è´¨æ£ | åå¨éè´¨æ£ç©æï¼çå¾
IQC 宿 | |
| | | | 3 | å¾
å
¥åº | æ éè´¨æ£æææè´¨æ£å®æä¸å¯å
¥åº | |
| | | | 4 | 已宿 | å
¥åºå®æ | |
| | | |
| | | ### 2. æ°å¢å段ï¼å°è´§éç¥åè¡ |
| | | |
| | | | åæ®µ | ç±»å | å±ç¤ºä½ç½® | 说æ | |
| | | |------|------|----------|------| |
| | | | iqcCheckFlag | Boolean | å表ã详æ
| æ¯å¦éè¦æ¥ææ£éª | |
| | | | iqcId | Long | 详æ
| å
³èç IQC æ£éªåç¼å· | |
| | | | iqcCheckResult | Integer | å表ã详æ
| è´¨æ£ç»æ | |
| | | | qualifiedQuantity | BigDecimal | å表ã详æ
| åæ ¼æ°é | |
| | | |
| | | ### 3. è´¨æ£ç»ææä¸¾ |
| | | |
| | | | å¼ | åç§° | æ¯å¦å¯å
¥åº | |
| | | |-----|------|------------| |
| | | | 1 | åæ ¼ | â
æ¯ | |
| | | | 2 | ç¹é | â
æ¯ | |
| | | | 3 | ä¸åæ ¼éè´§ | â å¦ | |
| | | | 4 | ä¸åæ ¼æ¥åº | â å¦ | |
| | | |
| | | ### 4. æ°å¢æ¥å£ï¼æ ¹æ®éè´è®¢åçæå°è´§éç¥å |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /mes/wm/arrival-notice/generate-from-purchase-order | æ ¹æ®éè´è®¢åçæå°è´§éç¥å | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | purchaseOrderId | Long | æ¯ | éè´è®¢åç¼å· | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": 123, // çæçå°è´§éç¥åç¼å· |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## åãåæ®µå¸¦å
¥è¯´æ |
| | | |
| | | ### æ°æ®æµè½¬æ å° |
| | | |
| | | | æºåæ® | ç®æ åæ® | 带å
¥å段 | |
| | | |--------|----------|----------| |
| | | | éè´ç³è¯·æç» | éè´è®¢åæç» | qcCheckFlagï¼è´¨æ£æ è¯ï¼ | |
| | | | éè´ç³è¯·ä¸»è¡¨ | éè´è®¢å主表 | depositPriceï¼å®ééé¢ï¼ | |
| | | | éè´è®¢å | å°è´§éç¥å | ä¾åºåãéè´è®¢åå· | |
| | | | éè´è®¢åæç» | å°è´§éç¥åè¡ | ç©æãå°è´§æ°éãqcCheckFlag | |
| | | | å°è´§éç¥åè¡ | IQC æ£éªå | ç©æãå°è´§æ°éãä¾åºå | |
| | | |
| | | --- |
| | | |
| | | ## äºãæé®å±ç¤ºè§åæ±æ» |
| | | |
| | | ### éè´è®¢åå表/详æ
页 |
| | | |
| | | | æé® | æ¾ç¤ºæ¡ä»¶ | |
| | | |------|----------| |
| | | | 确认æ¶è´§ | 订åç¶æ=å·²å®¡æ ¸(20) ä¸ å
¥åºç¶æâ å
¨é¨å
¥åº(2) | |
| | | |
| | | ### éè´ç³è¯·æç»è¡¨æ ¼ |
| | | |
| | | | å | 说æ | |
| | | |----|------| |
| | | | æ¯å¦è´¨æ£ | å¼å
³ç»ä»¶ï¼é»è®¤å
³é | |
| | | |
| | | ### éè´è®¢åæç»è¡¨æ ¼ |
| | | |
| | | | å | 说æ | |
| | | |----|------| |
| | | | æ¯å¦è´¨æ£ | åªè¯»å±ç¤ºï¼ä»éè´ç³è¯·å¸¦å
¥ | |
| | | |
| | | ### å°è´§éç¥åè¡è¡¨æ ¼ |
| | | |
| | | | å | 说æ | |
| | | |----|------| |
| | | | è´¨æ£æ è¯ | åªè¯»å±ç¤º | |
| | | | è´¨æ£ç»æ | åªè¯»å±ç¤ºï¼è´¨æ£å®æååå | |
| | | | åæ ¼æ°é | åªè¯»å±ç¤ºï¼è´¨æ£å®æååå | |
| | | |
| | | --- |
| | | |
| | | ## å
ãæ³¨æäºé¡¹ |
| | | |
| | | 1. **确认æ¶è´§æåå**ï¼è¿åå°è´§éç¥åç¼å·ï¼åç«¯å¯æç¤ºå¹¶å·æ°åè¡¨ï¼æè·³è½¬å°è´§éç¥å详æ
|
| | | 2. **ä¸ä¸ªéè´è®¢åå¯å¤æ¬¡ç¡®è®¤æ¶è´§**ï¼æ¯æé¨åæ¶è´§åºæ¯ï¼æ¯æ¬¡çæç¬ç«çå°è´§éç¥å |
| | | 3. **è´¨æ£èªå¨å建**ï¼ç¡®è®¤æ¶è´§æ¶ï¼ç³»ç»èªå¨å建 IQC æ£éªåï¼æ éæå¨å建 |
| | | 4. **å
¥åºåææ¡ä»¶**ï¼åªæå°è´§éç¥åç¶æä¸º"å¾
å
¥åº"æ¶æè½æ§è¡éè´å
¥åº |
| | | 5. **è´¨æ£å¤±è´¥å¤ç**ï¼å¦æè´¨æ£ç»æä¸ºéè´§ææ¥åºï¼å°è´§éç¥åç¶æä¿æ"å¾
è´¨æ£"ï¼é人工å¤ç |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãæéé
ç½® |
| | | |
| | | | æéæ è¯ | 说æ | |
| | | |----------|------| |
| | | | erp:purchase-order:confirm-receipt | 确认æ¶è´§æé | |
| | | |
| | | --- |
| | | |
| | | ## å
«ãAPI æ±æ» |
| | | |
| | | | 模å | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------|------| |
| | | | éè´è®¢å | POST | /erp/purchase-order/confirm-receipt | 确认æ¶è´§ | |
| | | | å°è´§éç¥å | POST | /mes/wm/arrival-notice/generate-from-purchase-order | æ ¹æ®éè´è®¢åçæ | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # éè´è®¢å确认æ¶è´§ - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - éè´è®¢åå表页 |
| | | - éè´è®¢å详æ
页 |
| | | |
| | | ## ä¸å¡æµç¨ |
| | | |
| | | ``` |
| | | éè´ç³è¯·å®¡æ¹éè¿ â çæéè´è®¢å(å·²å®¡æ ¸) â 确认æ¶è´§ â çæå°è´§éç¥å(å¾
å
¥åº/å¾
è´¨æ£) â æ§è¡å
¥åº |
| | | ``` |
| | | |
| | | **确认æ¶è´§åçèªå¨å¤çï¼** |
| | | - 妿éè´è®¢åæç»è®¾ç½®äº `qcCheckFlag=true`ï¼éè¦è´¨æ£ï¼ï¼å°è´§éç¥åèªå¨è¿å
¥"å¾
è´¨æ£"ç¶æï¼å¹¶å建 IQC æ£éªå |
| | | - 妿éè´è®¢åæç»è®¾ç½®äº `qcCheckFlag=false`ï¼æ éè´¨æ£ï¼ï¼å°è´§éç¥åç´æ¥è¿å
¥"å¾
å
¥åº"ç¶æ |
| | | |
| | | ## æ°å¢ API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /erp/purchase-order/confirm-receipt | 确认æ¶è´§ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | éè´è®¢åç¼å· | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": 123, // çæçå°è´§éç¥åç¼å· |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | **ä¸å¡è§åï¼** |
| | | - åªæå·²å®¡æ ¸ç¶æçéè´è®¢åæè½ç¡®è®¤æ¶è´§ |
| | | - å·²å
¨é¨å
¥åºçéè´è®¢åä¸è½ç¡®è®¤æ¶è´§ |
| | | - 确认æ¶è´§åè¿åçæçå°è´§éç¥åç¼å·ï¼å端å¯è·³è½¬å°è´§éç¥å详æ
|
| | | |
| | | ## åæ®µåæ´ |
| | | |
| | | ### éè´ç³è¯·æç»æ°å¢å段 |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | qcCheckFlag | Boolean | æ¯å¦éè¦æ¥ææ£éªï¼é»è®¤ false | |
| | | |
| | | ### éè´è®¢åæç»æ°å¢å段 |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | qcCheckFlag | Boolean | æ¯å¦éè¦æ¥ææ£éªï¼ä»éè´ç³è¯·å¸¦å
¥ | |
| | | |
| | | ### éè´ç³è¯·æ°å¢å段 |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | depositPrice | BigDecimal | å®ééé¢ï¼é»è®¤ 0 | |
| | | |
| | | ### éè´è®¢åæ°å¢å段 |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | depositPrice | BigDecimal | å®ééé¢ï¼ä»éè´ç³è¯·å¸¦å
¥ | |
| | | |
| | | ## æé®å±ç¤ºè§å |
| | | |
| | | ### éè´è®¢åå表/详æ
页 |
| | | |
| | | | æé® | æ¾ç¤ºæ¡ä»¶ | |
| | | |------|----------| |
| | | | 确认æ¶è´§ | 订åç¶æ=å·²å®¡æ ¸(20) ä¸ å
¥åºç¶æâ å
¨é¨å
¥åº(2) | |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. éè´è®¢åå表页 - æ·»å 确认æ¶è´§æé® |
| | | |
| | | ```html |
| | | <el-button |
| | | type="success" |
| | | v-if="scope.row.status === 20 && scope.row.inStatus !== 2" |
| | | @click="handleConfirmReceipt(scope.row)" |
| | | v-hasPermi="['erp:purchase-order:confirm-receipt']"> |
| | | 确认æ¶è´§ |
| | | </el-button> |
| | | ``` |
| | | |
| | | ### 2. æ¹æ³å®ç° |
| | | |
| | | ```js |
| | | // 确认æ¶è´§ |
| | | async handleConfirmReceipt(row) { |
| | | try { |
| | | await this.$modal.confirm(`确认对éè´è®¢åã${row.no}ãè¿è¡æ¶è´§æä½ï¼`); |
| | | const res = await confirmReceipt(row.id); |
| | | this.$modal.msgSuccess('确认æ¶è´§æåï¼å·²çæå°è´§éç¥å'); |
| | | // å¯éï¼è·³è½¬å°è´§éç¥å详æ
|
| | | // this.$router.push({ path: '/mes/wm/arrival-notice/detail', query: { id: res.data } }); |
| | | this.getList(); |
| | | } catch (e) { |
| | | // åæ¶æå¤±è´¥ |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 3. API æ¥å£ |
| | | |
| | | ```js |
| | | // api/erp/purchase/order.js |
| | | export function confirmReceipt(id) { |
| | | return request({ |
| | | url: '/erp/purchase-order/confirm-receipt', |
| | | method: 'post', |
| | | params: { id } |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | ### 4. éè´ç³è¯·è¡¨å - æ·»å è´¨æ£æ è¯å段 |
| | | |
| | | å¨éè´ç³è¯·æç»è¡¨æ ¼ä¸æ·»å "æ¯å¦è´¨æ£"åï¼ |
| | | |
| | | ```html |
| | | <el-table-column label="æ¯å¦è´¨æ£" prop="qcCheckFlag" width="100"> |
| | | <template #default="scope"> |
| | | <el-switch v-model="scope.row.qcCheckFlag" /> |
| | | </template> |
| | | </el-table-column> |
| | | ``` |
| | | |
| | | ### 5. éè´ç³è¯·è¡¨å - æ·»å å®éåæ®µ |
| | | |
| | | ```html |
| | | <el-form-item label="å®ééé¢" prop="depositPrice"> |
| | | <el-input-number |
| | | v-model="form.depositPrice" |
| | | :min="0" |
| | | :precision="2" |
| | | :controls="false" |
| | | placeholder="请è¾å
¥å®ééé¢" /> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | ## æéé
ç½® |
| | | |
| | | | æéæ è¯ | 说æ | |
| | | |----------|------| |
| | | | erp:purchase-order:confirm-receipt | 确认æ¶è´§æé | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. 确认æ¶è´§æä½ä¼èªå¨çæå°è´§éç¥åï¼æ éæå¨å建 |
| | | 2. è´¨æ£æ è¯ä»éè´ç³è¯· â éè´è®¢å â å°è´§éç¥åå
¨ç¨ä¼ é |
| | | 3. å®ééé¢ä»éè´ç³è¯·èªå¨å¸¦å
¥éè´è®¢å |
| | | 4. ä¸ä¸ªéè´è®¢åå¯ä»¥å¤æ¬¡ç¡®è®¤æ¶è´§ï¼é¨åæ¶è´§åºæ¯ï¼ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # éè´å
¥åºç¶æåå - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - éè´ç³è¯·å表页 |
| | | - éè´ç³è¯·è¯¦æ
页 |
| | | - éè´è®¢åå表页 |
| | | - éè´è®¢å详æ
页 |
| | | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | ``` |
| | | éè´ç³è¯·å®¡æ¹éè¿ â çæéè´è®¢å(å·²å®¡æ ¸) â 确认æ¶è´§ â çæå°è´§éç¥å(å¾
å
¥åº) â æ§è¡å
¥åº |
| | | â â â |
| | | order_id/order_no request_item_id å
³è in_status åå |
| | | ``` |
| | | |
| | | **ç¶æååæµç¨ï¼** |
| | | 1. å
¥åºå宿 â ååéè´è®¢åæç»å
¥åºæ°éï¼in_countï¼ |
| | | 2. å
¥åºå宿 â ååéè´è®¢åå
¥åºç¶æï¼in_statusï¼ |
| | | 3. å
¥åºå宿 â ååéè´ç³è¯·æç»å
¥åºæ°éï¼in_countï¼ |
| | | 4. å
¥åºå宿 â ååéè´ç³è¯·å
¥åºç¶æï¼in_statusï¼ |
| | | |
| | | ## åæ®µåæ´ |
| | | |
| | | ### éè´ç³è¯·æ°å¢å段 |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | inStatus | Integer | å
¥åºç¶æï¼0:æªå
¥åº 1:é¨åå
¥åº 2:å
¨é¨å
¥åºï¼ | |
| | | |
| | | ### éè´ç³è¯·æç»æ°å¢å段 |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | inCount | BigDecimal | å
¥åºæ°é | |
| | | |
| | | ### éè´è®¢åæç»æ°å¢å段 |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | requestItemId | Long | éè´ç³è¯·æç»ç¼å·ï¼ç³»ç»èªå¨å
³èï¼ | |
| | | |
| | | ## ååºåæ®µåæ´ |
| | | |
| | | ### éè´ç³è¯·è¯¦æ
ååºæ°å¢ |
| | | |
| | | ```json |
| | | { |
| | | "inStatus": 0 |
| | | } |
| | | ``` |
| | | |
| | | ### éè´ç³è¯·æç»ååºæ°å¢ |
| | | |
| | | ```json |
| | | { |
| | | "items": [ |
| | | { |
| | | "inCount": 0 |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | ### éè´è®¢å详æ
ååºæ°å¢ |
| | | |
| | | æ ååï¼`requestItemId` 为系ç»å
é¨å
³èï¼å端æ éå±ç¤ºï¼ |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | å
¥åºç¶æ | éè´ç³è¯·å表ã详æ
| ä½¿ç¨æ ç¾å±ç¤ºï¼æªå
¥åº/é¨åå
¥åº/å
¨é¨å
¥åº | |
| | | | å
¥åºæ°é | éè´ç³è¯·æç»è¡¨æ ¼ | æ°å¼å±ç¤ºï¼ä¿ç6ä½å°æ° | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | éè´ç³è¯·å
¥åºç¶æ | æ ¹æ®éè´è®¢åå
¥åºç¶æèªå¨æ´æ°ï¼æ éæå¨æä½ | |
| | | | éè´ç³è¯·æç»å
¥åºæ°é | æ ¹æ®éè´è®¢åæç»å
¥åºæ°éç´¯å æ´æ° | |
| | | | 夿¬¡å
¥åº | æ¯æé¨åå
¥åºï¼å
¥åºç¶æèªå¨æµè½¬ | |
| | | |
| | | ## å
¥åºç¶ææä¸¾ |
| | | |
| | | | å¼ | åç§° | é¢è²å»ºè®® | |
| | | |----|------|----------| |
| | | | 0 | æªå
¥åº | infoï¼ç°è²ï¼ | |
| | | | 1 | é¨åå
¥åº | warningï¼æ©è²ï¼ | |
| | | | 2 | å
¨é¨å
¥åº | successï¼ç»¿è²ï¼ | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. å
¥åºç¶æç±ç³»ç»èªå¨ååï¼æ éæå¨ç»´æ¤ |
| | | 2. ä¸ä¸ªéè´ç³è¯·å¯¹åºä¸ä¸ªéè´è®¢åï¼å
¥åºç¶æåæ¥ |
| | | 3. 妿éè´ç³è¯·æªæå®ä¾åºåï¼å®¡æ¹éè¿åéè¦æå¨éæ©ä¾åºåçæè®¢å |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpSupplierRespDTO; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ERP ä¾åºå API æ¥å£ |
| | | */ |
| | | public interface ErpSupplierApi { |
| | | |
| | | String PREFIX = "/rpc-api/erp/supplier"; |
| | | |
| | | /** |
| | | * è·åä¾åºå |
| | | * |
| | | * @param id ä¾åºåç¼å· |
| | | * @return ä¾åºå |
| | | */ |
| | | CommonResult<ErpSupplierRespDTO> getSupplier(Long id); |
| | | |
| | | /** |
| | | * æ ¡éªä¾åºååå¨ |
| | | * |
| | | * @param id ä¾åºåç¼å· |
| | | * @return ä¾åºå |
| | | */ |
| | | CommonResult<ErpSupplierRespDTO> validateSupplier(Long id); |
| | | |
| | | /** |
| | | * è·åä¾åºåå表 |
| | | * |
| | | * @param ids ç¼å·å表 |
| | | * @return ä¾åºåå表 |
| | | */ |
| | | CommonResult<List<ErpSupplierRespDTO>> getSupplierList(Collection<Long> ids); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.purchase.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * ERP ä¾åºå Response DTO |
| | | */ |
| | | @Data |
| | | public class ErpSupplierRespDTO { |
| | | |
| | | /** |
| | | * ä¾åºåç¼å· |
| | | */ |
| | | private Long id; |
| | | /** |
| | | * ä¾åºååç§° |
| | | */ |
| | | private String name; |
| | | /** |
| | | * è系人 |
| | | */ |
| | | private String contact; |
| | | /** |
| | | * ææºå·ç |
| | | */ |
| | | private String mobile; |
| | | /** |
| | | * èç³»çµè¯ |
| | | */ |
| | | private String telephone; |
| | | /** |
| | | * çµåé®ç®± |
| | | */ |
| | | private String email; |
| | | /** |
| | | * å¼å¯ç¶æ |
| | | */ |
| | | private Integer status; |
| | | /** |
| | | * 纳ç¨äººè¯å«å· |
| | | */ |
| | | private String taxNo; |
| | | /** |
| | | * ç¨ç |
| | | */ |
| | | private java.math.BigDecimal taxPercent; |
| | | |
| | | } |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- MES å¶é æ§è¡ç³»ç» API --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-mes-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ä¸å¡ç»ä»¶ --> |
| | | |
| | | <!-- Web ç¸å
³ --> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpSupplierRespDTO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpSupplierDO; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * ERP ä¾åºå API å®ç°ç±» |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class ErpSupplierApiImpl implements ErpSupplierApi { |
| | | |
| | | @Resource |
| | | private ErpSupplierService supplierService; |
| | | |
| | | @Override |
| | | public CommonResult<ErpSupplierRespDTO> getSupplier(Long id) { |
| | | ErpSupplierDO supplier = supplierService.getSupplier(id); |
| | | return success(BeanUtils.toBean(supplier, ErpSupplierRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<ErpSupplierRespDTO> validateSupplier(Long id) { |
| | | ErpSupplierDO supplier = supplierService.validateSupplier(id); |
| | | return success(BeanUtils.toBean(supplier, ErpSupplierRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<ErpSupplierRespDTO>> getSupplierList(Collection<Long> ids) { |
| | | List<ErpSupplierDO> list = supplierService.getSupplierList(ids); |
| | | return success(BeanUtils.toBean(list, ErpSupplierRespDTO.class)); |
| | | } |
| | | |
| | | } |
| | |
| | | ExcelUtils.write(response, "éè´è®¢å.xls", "æ°æ®", ErpPurchaseOrderRespVO.class, list); |
| | | } |
| | | |
| | | @PostMapping("/confirm-receipt") |
| | | @Operation(summary = "确认æ¶è´§") |
| | | @Parameter(name = "id", description = "éè´è®¢åç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-order:confirm-receipt')") |
| | | public CommonResult<Long> confirmReceipt(@RequestParam("id") Long id) { |
| | | return success(purchaseOrderService.confirmReceipt(id)); |
| | | } |
| | | |
| | | private PageResult<ErpPurchaseOrderRespVO> buildPurchaseOrderVOPageResult(PageResult<ErpPurchaseOrderDO> pageResult) { |
| | | if (CollUtil.isEmpty(pageResult.getList())) { |
| | | return PageResult.empty(pageResult.getTotal()); |
| | |
| | | @Schema(description = "ä¾åºååç§°", example = "ä¾åºåA") |
| | | private String supplierName; |
| | | |
| | | @Schema(description = "å®ééé¢", example = "1000.00") |
| | | private BigDecimal depositPrice; |
| | | |
| | | @Schema(description = "å计æ°é", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private BigDecimal totalCount; |
| | | |
| | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "æ¯å¦éè¦æ¥ææ£éª", example = "true") |
| | | private Boolean qcCheckFlag; |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | @Schema(description = "伿 çï¼ç¾åæ¯", example = "10") |
| | | private BigDecimal discountPercent; |
| | | |
| | | @Schema(description = "å®ééé¢", example = "1000.00") |
| | | private BigDecimal depositPrice; |
| | | |
| | | @Schema(description = "éä»¶å°å", example = "https://xxx.com/xxx.pdf") |
| | | private String fileUrl; |
| | | |
| | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "æ¯å¦éè¦æ¥ææ£éª", example = "true") |
| | | private Boolean qcCheckFlag; |
| | | |
| | | @Schema(description = "产ååç§°ï¼å端å±ç¤ºç¨ï¼å端忽ç¥ï¼", example = "产åA") |
| | | private String productName; |
| | | |
| | |
| | | */ |
| | | private Long orderId; |
| | | /** |
| | | * éè´ç³è¯·æç»ç¼å· |
| | | * |
| | | * å
³è {@link ErpPurchaseRequestItemDO#getId()} |
| | | */ |
| | | private Long requestItemId; |
| | | /** |
| | | * ç©æç¼å· |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO#getId()} |
| | |
| | | private BigDecimal discountPrice; |
| | | |
| | | /** |
| | | * å®ééé¢ |
| | | */ |
| | | private BigDecimal depositPrice; |
| | | |
| | | /** |
| | | * éä»¶å°å |
| | | */ |
| | | private String fileUrl; |
| | |
| | | */ |
| | | private String orderNo; |
| | | |
| | | /** |
| | | * å
¥åºç¶æ |
| | | * |
| | | * 0: æªå
¥åº |
| | | * 1: é¨åå
¥åº |
| | | * 2: å
¨é¨å
¥åº |
| | | */ |
| | | private Integer inStatus; |
| | | |
| | | } |
| | |
| | | */ |
| | | private String remark; |
| | | |
| | | /** |
| | | * æ¯å¦éè¦æ¥ææ£éª |
| | | */ |
| | | private Boolean qcCheckFlag; |
| | | |
| | | /** |
| | | * å
¥åºæ°é |
| | | */ |
| | | private BigDecimal inCount; |
| | | |
| | | } |
| | |
| | | ErrorCode PURCHASE_ORDER_BPM_CATEGORY_NOT_EXISTS = new ErrorCode(1_030_101_011, "éè´å®¡æ ¸åç±»ä¸åå¨ï¼è¯·å
å¨BPM模åå建éè´å®¡æ ¸æµç¨åç±»"); |
| | | ErrorCode PURCHASE_ORDER_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_030_101_012, "éè´å®¡æ ¸åç±»ä¸æ²¡æå¯ç¨çæµç¨æ¨¡åï¼è¯·å
å建并å叿µç¨"); |
| | | ErrorCode PURCHASE_ORDER_SUBMIT_FAIL_STATUS = new ErrorCode(1_030_101_013, "æäº¤å®¡æ¹å¤±è´¥ï¼åªææªå®¡æ ¸ç¶æçéè´è®¢åæè½æäº¤"); |
| | | ErrorCode PURCHASE_ORDER_ALL_IN = new ErrorCode(1_030_101_014, "éè´è®¢åå·²å
¨é¨å
¥åºï¼æ é确认æ¶è´§"); |
| | | |
| | | // ========== ERP éè´å
¥åºï¼1-030-102-000ï¼ ========== |
| | | ErrorCode PURCHASE_IN_NOT_EXISTS = new ErrorCode(1_030_102_000, "éè´å
¥åºåä¸åå¨"); |
| | |
| | | */ |
| | | void updatePurchaseOrderInStatus(Long orderId); |
| | | |
| | | /** |
| | | * 确认æ¶è´§ |
| | | * |
| | | * çæå°è´§éç¥åï¼ç¶æä¸ºå¾
å
¥åº |
| | | * |
| | | * @param id éè´è®¢åç¼å· |
| | | * @return å°è´§éç¥åç¼å· |
| | | */ |
| | | Long confirmReceipt(Long id); |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestItemDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseOrderItemMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseOrderMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseRequestItemMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseRequestMapper; |
| | | 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.ErpPurchaseOrderInStatusEnum; |
| | | import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService; |
| | | import cn.iocoder.yudao.module.mes.api.arrivalnotice.MesArrivalNoticeApi; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.flowable.engine.repository.ProcessDefinition; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | |
| | | private BpmCategoryService bpmCategoryService; |
| | | @Resource |
| | | private BpmProcessDefinitionService bpmProcessDefinitionService; |
| | | |
| | | @Resource |
| | | @Lazy |
| | | private MesArrivalNoticeApi arrivalNoticeApi; |
| | | |
| | | @Resource |
| | | private ErpPurchaseRequestItemMapper purchaseRequestItemMapper; |
| | | @Resource |
| | | private ErpPurchaseRequestMapper purchaseRequestMapper; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | // 4. æ´æ°éè´è®¢åå
¥åºç¶æ |
| | | purchaseOrderMapper.updateById(new ErpPurchaseOrderDO() |
| | | .setId(orderId).setInStatus(inStatus)); |
| | | |
| | | // 5. ååéè´ç³è¯·æç»çå
¥åºæ°éåéè´ç³è¯·çå
¥åºç¶æ |
| | | updatePurchaseRequestInStatus(items, inStatus); |
| | | } |
| | | |
| | | /** |
| | | * ååéè´ç³è¯·å
¥åºæ°éåå
¥åºç¶æ |
| | | * |
| | | * @param orderItems éè´è®¢åæç»å表 |
| | | * @param orderInStatus éè´è®¢åå
¥åºç¶æ |
| | | */ |
| | | private void updatePurchaseRequestInStatus(List<ErpPurchaseOrderItemDO> orderItems, int orderInStatus) { |
| | | // è·åææå
³èçéè´ç³è¯·æç» ID |
| | | Set<Long> requestItemIds = new HashSet<>(); |
| | | for (ErpPurchaseOrderItemDO item : orderItems) { |
| | | if (item.getRequestItemId() != null) { |
| | | requestItemIds.add(item.getRequestItemId()); |
| | | } |
| | | } |
| | | if (requestItemIds.isEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | // æ´æ°éè´ç³è¯·æç»çå
¥åºæ°é |
| | | for (ErpPurchaseOrderItemDO orderItem : orderItems) { |
| | | if (orderItem.getRequestItemId() != null && orderItem.getInCount() != null) { |
| | | purchaseRequestItemMapper.updateById(new ErpPurchaseRequestItemDO() |
| | | .setId(orderItem.getRequestItemId()) |
| | | .setInCount(orderItem.getInCount())); |
| | | } |
| | | } |
| | | |
| | | // è·åéè´ç³è¯·æç»ï¼æ¾å°å¯¹åºçéè´ç³è¯· ID |
| | | List<ErpPurchaseRequestItemDO> requestItems = purchaseRequestItemMapper.selectBatchIds(requestItemIds); |
| | | if (CollUtil.isEmpty(requestItems)) { |
| | | return; |
| | | } |
| | | Set<Long> requestIds = convertSet(requestItems, ErpPurchaseRequestItemDO::getRequestId); |
| | | |
| | | // æ´æ°éè´ç³è¯·çå
¥åºç¶æ |
| | | for (Long requestId : requestIds) { |
| | | purchaseRequestMapper.updateById(new ErpPurchaseRequestDO() |
| | | .setId(requestId) |
| | | .setInStatus(orderInStatus)); |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long confirmReceipt(Long id) { |
| | | // 1. æ ¡éªéè´è®¢ååå¨ä¸å·²å®¡æ ¸ |
| | | ErpPurchaseOrderDO purchaseOrder = validatePurchaseOrder(id); |
| | | |
| | | // 2. æ ¡éªéè´è®¢åæªå
¨é¨å
¥åº |
| | | if (ErpPurchaseOrderInStatusEnum.ALL_IN.getStatus().equals(purchaseOrder.getInStatus())) { |
| | | throw exception(PURCHASE_ORDER_ALL_IN); |
| | | } |
| | | |
| | | // 3. è°ç¨ MES æ¥å£çæå°è´§éç¥å |
| | | Long arrivalNoticeId = arrivalNoticeApi.generateArrivalNoticeFromPurchaseOrder(id); |
| | | log.info("[confirmReceipt] éè´è®¢å({}) 确认æ¶è´§ï¼çæå°è´§éç¥å({})", id, arrivalNoticeId); |
| | | |
| | | return arrivalNoticeId; |
| | | } |
| | | |
| | | } |
| | |
| | | purchaseRequestMapper.updateById(new ErpPurchaseRequestDO() |
| | | .setId(id).setStatus(newStatus)); |
| | | } |
| | | |
| | | // 3. 审æ¹éè¿ä¸æä¾åºåï¼èªå¨çæéè´è®¢å |
| | | if (ErpPurchaseRequestStatusEnum.APPROVE.getStatus().equals(newStatus) |
| | | && purchaseRequest.getSupplierId() != null |
| | | && purchaseRequest.getOrderId() == null) { |
| | | try { |
| | | Long orderId = doGeneratePurchaseOrder(purchaseRequest); |
| | | log.info("[updatePurchaseRequestAuditStatus] éè´ç³è¯·({}) èªå¨çæéè´è®¢å({})", id, orderId); |
| | | } catch (Exception e) { |
| | | log.error("[updatePurchaseRequestAuditStatus] éè´ç³è¯·({}) èªå¨çæéè´è®¢å失败", id, e); |
| | | // 䏿åºå¼å¸¸ï¼é¿å
å½±åç¶ææ´æ° |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | // 3. æ ¡éªä¾åºå |
| | | supplierService.validateSupplier(supplierId); |
| | | |
| | | // 4. è·åç³è¯·æç» |
| | | // 4. 设置ä¾åºåå¹¶çæè®¢å |
| | | purchaseRequest.setSupplierId(supplierId); |
| | | return doGeneratePurchaseOrder(purchaseRequest); |
| | | } |
| | | |
| | | /** |
| | | * æ§è¡çæéè´è®¢å |
| | | * |
| | | * @param purchaseRequest éè´ç³è¯·ï¼éå
å« supplierIdï¼ |
| | | * @return éè´è®¢å ID |
| | | */ |
| | | private Long doGeneratePurchaseOrder(ErpPurchaseRequestDO purchaseRequest) { |
| | | Long id = purchaseRequest.getId(); |
| | | |
| | | // 1. è·åç³è¯·æç» |
| | | List<ErpPurchaseRequestItemDO> requestItems = purchaseRequestItemMapper.selectListByRequestId(id); |
| | | if (CollUtil.isEmpty(requestItems)) { |
| | | throw exception(PURCHASE_REQUEST_NOT_EXISTS); |
| | | } |
| | | |
| | | // 5. çæéè´è®¢åå· |
| | | // 2. çæéè´è®¢åå· |
| | | String orderNo = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX); |
| | | if (purchaseOrderMapper.selectByNo(orderNo) != null) { |
| | | throw exception(PURCHASE_ORDER_NO_EXISTS); |
| | | } |
| | | |
| | | // 6. å建éè´è®¢å |
| | | // 3. å建éè´è®¢å |
| | | ErpPurchaseOrderDO purchaseOrder = new ErpPurchaseOrderDO(); |
| | | purchaseOrder.setNo(orderNo); |
| | | purchaseOrder.setStatus(ErpAuditStatus.APPROVE.getStatus()); // éè´è®¢åç´æ¥ä¸ºå·²å®¡æ ¸ç¶æ |
| | | purchaseOrder.setSupplierId(supplierId); |
| | | purchaseOrder.setSupplierId(purchaseRequest.getSupplierId()); |
| | | purchaseOrder.setOrderTime(purchaseRequest.getRequestTime()); |
| | | purchaseOrder.setTotalCount(purchaseRequest.getTotalCount()); |
| | | purchaseOrder.setTotalPrice(purchaseRequest.getTotalPrice()); |
| | |
| | | purchaseOrder.setTotalTaxPrice(purchaseRequest.getTotalTaxPrice()); |
| | | purchaseOrder.setDiscountPercent(purchaseRequest.getDiscountPercent()); |
| | | purchaseOrder.setDiscountPrice(purchaseRequest.getDiscountPrice()); |
| | | purchaseOrder.setDepositPrice(purchaseRequest.getDepositPrice() != null ? purchaseRequest.getDepositPrice() : BigDecimal.ZERO); |
| | | purchaseOrder.setRemark(purchaseRequest.getRemark()); |
| | | purchaseOrder.setInCount(BigDecimal.ZERO); |
| | | purchaseOrder.setInStatus(0); |
| | | purchaseOrderMapper.insert(purchaseOrder); |
| | | |
| | | // 7. å建éè´è®¢åæç» |
| | | // 4. å建éè´è®¢åæç» |
| | | List<ErpPurchaseOrderItemDO> orderItems = convertList(requestItems, item -> { |
| | | ErpPurchaseOrderItemDO orderItem = new ErpPurchaseOrderItemDO(); |
| | | orderItem.setOrderId(purchaseOrder.getId()); |
| | | orderItem.setRequestItemId(item.getId()); // å
³èéè´ç³è¯·æç» |
| | | orderItem.setProductId(item.getProductId()); |
| | | orderItem.setProductUnitId(item.getProductUnitId()); |
| | | orderItem.setProductPrice(item.getProductPrice()); |
| | |
| | | orderItem.setTaxPrice(item.getTaxPrice()); |
| | | orderItem.setRemark(item.getRemark()); |
| | | orderItem.setInCount(BigDecimal.ZERO); |
| | | orderItem.setQcCheckFlag(false); // é»è®¤ä¸éè¦è´¨æ£ |
| | | orderItem.setQcCheckFlag(item.getQcCheckFlag() != null ? item.getQcCheckFlag() : false); |
| | | return orderItem; |
| | | }); |
| | | purchaseOrderItemMapper.insertBatch(orderItems); |
| | | |
| | | // 8. æ´æ°éè´ç³è¯·ç订åä¿¡æ¯ |
| | | // 5. æ´æ°éè´ç³è¯·ç订åä¿¡æ¯ |
| | | purchaseRequestMapper.updateById(new ErpPurchaseRequestDO() |
| | | .setId(id) |
| | | .setOrderId(purchaseOrder.getId()) |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.purchase.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseRequestService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * éè´ç³è¯·å®¡æ¹ç¶æçå¬å¨ |
| | | * |
| | | * çå¬ BPM æµç¨å®ä¾ç¶æåæ´äºä»¶ï¼æ´æ°éè´ç³è¯·ç审æ¹ç¶æ |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class ErpPurchaseRequestStatusListener extends cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener { |
| | | |
| | | /** |
| | | * éè´ç³è¯·å®¡æ¹æµç¨å®ä¹ Key |
| | | */ |
| | | private static final String PROCESS_DEFINITION_KEY = "purchase_request_approve"; |
| | | |
| | | @Resource |
| | | private ErpPurchaseRequestService purchaseRequestService; |
| | | |
| | | @Override |
| | | protected String getProcessDefinitionKey() { |
| | | return PROCESS_DEFINITION_KEY; |
| | | } |
| | | |
| | | @Override |
| | | protected void onEvent(BpmProcessInstanceStatusEvent event) { |
| | | Long requestId; |
| | | try { |
| | | requestId = Long.parseLong(event.getBusinessKey()); |
| | | } catch (NumberFormatException e) { |
| | | log.warn("[onEvent] businessKey({}) 䏿¯ææçéè´ç³è¯·ç¼å·", event.getBusinessKey()); |
| | | return; |
| | | } |
| | | |
| | | log.info("[onEvent] æ¶å°BPM审æ¹äºä»¶ï¼requestId={}, status={}", requestId, event.getStatus()); |
| | | |
| | | try { |
| | | purchaseRequestService.updatePurchaseRequestAuditStatus(requestId, event.getStatus()); |
| | | log.info("[onEvent] éè´ç³è¯·({}) 审æ¹ç¶ææ´æ°å®æ", requestId); |
| | | } catch (Exception e) { |
| | | log.error("[onEvent] æ´æ°éè´ç³è¯·å®¡æ¹ç¶æå¤±è´¥ï¼requestId={}", requestId, e); |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.api.arrivalnotice; |
| | | |
| | | /** |
| | | * MES å°è´§éç¥å API æ¥å£ |
| | | */ |
| | | public interface MesArrivalNoticeApi { |
| | | |
| | | /** |
| | | * æ ¹æ®éè´è®¢åçæå°è´§éç¥åï¼å¾
å
¥åºç¶æï¼ |
| | | * |
| | | * @param purchaseOrderId éè´è®¢åç¼å· |
| | | * @return çæçå°è´§éç¥åç¼å· |
| | | */ |
| | | Long generateArrivalNoticeFromPurchaseOrder(Long purchaseOrderId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.api.arrivalnotice; |
| | | |
| | | import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | /** |
| | | * MES å°è´§éç¥å API å®ç°ç±» |
| | | */ |
| | | @Service |
| | | public class MesArrivalNoticeApiImpl implements MesArrivalNoticeApi { |
| | | |
| | | @Resource |
| | | private MesWmArrivalNoticeService arrivalNoticeService; |
| | | |
| | | @Override |
| | | public Long generateArrivalNoticeFromPurchaseOrder(Long purchaseOrderId) { |
| | | return arrivalNoticeService.generateArrivalNoticeFromPurchaseOrder(purchaseOrderId); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticeRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticeSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; |
| | | import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.ErpSupplierApi; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpSupplierRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | |
| | | @Resource |
| | | private MesWmArrivalNoticeService arrivalNoticeService; |
| | | @Resource |
| | | private MesMdVendorService vendorService; |
| | | private ErpSupplierApi supplierApi; |
| | | @Resource |
| | | private ErpPurchaseOrderApi purchaseOrderApi; |
| | | |
| | |
| | | if (CollUtil.isEmpty(list)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | // 1. è·å¾å
³èæ°æ® |
| | | Map<Long, MesMdVendorDO> vendorMap = vendorService.getVendorMap( |
| | | convertSet(list, MesWmArrivalNoticeDO::getVendorId)); |
| | | // 1. è·å¾ä¾åºåä¿¡æ¯ï¼ERP éè´ä¾åºåï¼ |
| | | Map<Long, ErpSupplierRespDTO> supplierMap = supplierApi.getSupplierList( |
| | | convertSet(list, MesWmArrivalNoticeDO::getVendorId)).getCheckedData().stream() |
| | | .collect(java.util.stream.Collectors.toMap(ErpSupplierRespDTO::getId, v -> v, (a, b) -> a)); |
| | | // 2. è·å¾éè´è®¢åä¿¡æ¯ |
| | | List<Long> purchaseOrderIds = list.stream() |
| | | .map(MesWmArrivalNoticeDO::getPurchaseOrderId) |
| | |
| | | .collect(java.util.stream.Collectors.toMap(ErpPurchaseOrderRespDTO::getId, v -> v, (a, b) -> a)); |
| | | // 3. æå»ºç»æ |
| | | return BeanUtils.toBean(list, MesWmArrivalNoticeRespVO.class, vo -> { |
| | | MapUtils.findAndThen(vendorMap, vo.getVendorId(), vendor -> |
| | | vo.setVendorCode(vendor.getCode()).setVendorName(vendor.getName())); |
| | | MapUtils.findAndThen(supplierMap, vo.getVendorId(), supplier -> |
| | | vo.setVendorName(supplier.getName())); |
| | | MapUtils.findAndThen(purchaseOrderMap, vo.getPurchaseOrderId(), purchaseOrder -> |
| | | vo.setPurchaseOrderNo(purchaseOrder.getNo())); |
| | | }); |
| | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO; |
| | | import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptService; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.ErpSupplierApi; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpSupplierRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | |
| | | @Resource |
| | | private MesWmItemReceiptService itemReceiptService; |
| | | @Resource |
| | | private MesMdVendorService vendorService; |
| | | private ErpSupplierApi supplierApi; |
| | | @Resource |
| | | private MesQcIqcService iqcService; |
| | | @Resource |
| | |
| | | if (CollUtil.isEmpty(list)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | // 1. è·å¾å
³èæ°æ® |
| | | Map<Long, MesMdVendorDO> vendorMap = vendorService.getVendorMap( |
| | | convertSet(list, MesWmItemReceiptDO::getVendorId)); |
| | | // 1. è·å¾å
³èæ°æ®ï¼éè´å
¥åºä½¿ç¨ ERP ä¾åºåï¼ |
| | | Map<Long, ErpSupplierRespDTO> supplierMap = supplierApi.getSupplierList( |
| | | convertSet(list, MesWmItemReceiptDO::getVendorId)).getCheckedData().stream() |
| | | .collect(java.util.stream.Collectors.toMap(ErpSupplierRespDTO::getId, v -> v, (a, b) -> a)); |
| | | Map<Long, MesQcIqcDO> iqcMap = iqcService.getIqcMap( |
| | | convertSet(list, MesWmItemReceiptDO::getIqcId)); |
| | | Map<Long, MesWmArrivalNoticeDO> noticeMap = arrivalNoticeService.getArrivalNoticeMap( |
| | | convertSet(list, MesWmItemReceiptDO::getNoticeId)); |
| | | // 2. æå»ºç»æ |
| | | return BeanUtils.toBean(list, MesWmItemReceiptRespVO.class, vo -> { |
| | | MapUtils.findAndThen(vendorMap, vo.getVendorId(), |
| | | vendor -> vo.setVendorName(vendor.getName())); |
| | | MapUtils.findAndThen(supplierMap, vo.getVendorId(), |
| | | supplier -> vo.setVendorName(supplier.getName())); |
| | | MapUtils.findAndThen(iqcMap, vo.getIqcId(), |
| | | iqc -> vo.setIqcCode(iqc.getCode())); |
| | | MapUtils.findAndThen(noticeMap, vo.getNoticeId(), notice -> |
| | |
| | | * å
³è {@link MesQcIqcDO#getId()} |
| | | */ |
| | | private Long iqcId; |
| | | |
| | | /** |
| | | * è´¨æ£ç»æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum} |
| | | * 1-åæ ¼ 2-ç¹é 3-ä¸åæ ¼éè´§ 4-ä¸åæ ¼æ¥åº |
| | | */ |
| | | private Integer iqcCheckResult; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | |
| | | return selectCount(MesWmArrivalNoticeDO::getVendorId, vendorId); |
| | | } |
| | | |
| | | default MesWmArrivalNoticeDO selectByPurchaseOrderId(Long purchaseOrderId) { |
| | | return selectOne(MesWmArrivalNoticeDO::getPurchaseOrderId, purchaseOrderId); |
| | | } |
| | | |
| | | } |
| | |
| | | return selectList(MesWmItemReceiptDO::getVendorId, vendorId); |
| | | } |
| | | |
| | | default MesWmItemReceiptDO selectByNoticeId(Long noticeId) { |
| | | return selectOne(MesWmItemReceiptDO::getNoticeId, noticeId); |
| | | } |
| | | |
| | | } |
| | |
| | | return selectOne(MesWmProductSalesDO::getCode, code); |
| | | } |
| | | |
| | | default MesWmProductSalesDO selectByNoticeId(Long noticeId) { |
| | | return selectOne(MesWmProductSalesDO::getNoticeId, noticeId); |
| | | } |
| | | |
| | | default List<MesWmProductSalesDO> selectListByClientId(Long clientId) { |
| | | return selectList(MesWmProductSalesDO::getClientId, clientId); |
| | | } |
| | |
| | | return selectOne(MesWmSalesNoticeDO::getCode, code); |
| | | } |
| | | |
| | | default MesWmSalesNoticeDO selectBySaleOrderId(Long saleOrderId) { |
| | | return selectOne(MesWmSalesNoticeDO::getSaleOrderId, saleOrderId); |
| | | } |
| | | |
| | | } |
| | |
| | | ErrorCode QC_IQC_NOT_PREPARE = new ErrorCode(1_040_603_002, "åªæèç¨¿ç¶æçæ£éªåæå¯æä½"); |
| | | ErrorCode QC_IQC_QUANTITY_MISMATCH = new ErrorCode(1_040_603_004, "åæ ¼åä¸ä¸åæ ¼åæ°éä¹åé¡»çäºæ£æµæ°é"); |
| | | ErrorCode QC_NO_TEMPLATE = new ErrorCode(1_040_603_005, "å½åäº§åæªé
ç½®æ£æµæ¨¡æ¿"); |
| | | ErrorCode QC_NO_TEMPLATE_FOR_ITEM = new ErrorCode(1_040_603_008, "ç©æã{}ãæªé
ç½® IQC æ£æµæ¨¡æ¿ï¼è¯·å
å¨è´¨é管çä¸é
ç½®"); |
| | | ErrorCode QC_IQC_SOURCE_DOC_PARAMS_MISSING = new ErrorCode(1_040_603_006, "æ¥æºåæ®ç±»åé空æ¶ï¼æ¥æºåæ® ID 忥æºåæ®è¡ ID ä¸è½ä¸ºç©º"); |
| | | ErrorCode QC_IQC_CHECK_RESULT_EMPTY = new ErrorCode(1_040_603_007, "宿æ£éªååï¼æ£æµç»æå¿
须填å"); |
| | | // ========== MES è´¨é管ç-æ¥ææ£éªè¡ï¼1-040-603-100ï¼ ========== |
| | |
| | | ErrorCode WM_ARRIVAL_NOTICE_IQC_PENDING = new ErrorCode(1_040_704_005, "åå¨å¾
æ£éªè¡ï¼æ æ³å®¡æ¹éè¿"); |
| | | ErrorCode WM_ARRIVAL_NOTICE_NO_LINE = new ErrorCode(1_040_704_006, "è³å°éè¦ä¸æ¡è¡é¡¹ç®"); |
| | | ErrorCode WM_ARRIVAL_NOTICE_VENDOR_MISMATCH = new ErrorCode(1_040_704_007, "å°è´§éç¥åçä¾åºåä¸å½ååæ®ä¸ä¸è´"); |
| | | ErrorCode WM_ARRIVAL_NOTICE_ALREADY_EXISTS = new ErrorCode(1_040_704_008, "该éè´è®¢åå·²çæå°è´§éç¥åï¼ä¸è½éå¤çæ"); |
| | | ErrorCode WM_ARRIVAL_NOTICE_LINE_NOT_EXISTS = new ErrorCode(1_040_704_100, "å°è´§éç¥åè¡ä¸åå¨"); |
| | | ErrorCode WM_ARRIVAL_NOTICE_LINE_NOT_MATCH = new ErrorCode(1_040_704_101, "å°è´§éç¥åè¡ä¸å±äºæå®çå°è´§éç¥å"); |
| | | |
| | |
| | | ErrorCode WM_ITEM_RECEIPT_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_705_004, "æç»ä¸æ¶æ»æ°ä¸è¡å
¥åºæ°éä¸å¹é
"); |
| | | ErrorCode WM_ITEM_RECEIPT_STATUS_ERROR = new ErrorCode(1_040_705_005, "å
¥åºåç¶æä¸æ£ç¡®"); |
| | | ErrorCode WM_ITEM_RECEIPT_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_705_006, "已宿æå·²åæ¶çå
¥åºåä¸å
è®¸åæ¶"); |
| | | ErrorCode WM_PURCHASE_ORDER_NOT_EXISTS = new ErrorCode(1_040_705_007, "éè´è®¢åä¸åå¨"); |
| | | ErrorCode WM_ITEM_RECEIPT_ALREADY_EXISTS = new ErrorCode(1_040_705_007, "该å°è´§éç¥åå·²çæå
¥åºåï¼ä¸è½éå¤çæ"); |
| | | ErrorCode WM_PURCHASE_ORDER_NOT_EXISTS = new ErrorCode(1_040_705_008, "éè´è®¢åä¸åå¨"); |
| | | ErrorCode WM_PURCHASE_ORDER_NO_ITEM = new ErrorCode(1_040_705_008, "éè´è®¢åæ æç»æ°æ®"); |
| | | ErrorCode WM_ITEM_RECEIPT_LINE_NOT_EXISTS = new ErrorCode(1_040_705_100, "éè´å
¥åºåè¡ä¸åå¨"); |
| | | ErrorCode WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_REQUIRED = new ErrorCode(1_040_705_101, |
| | |
| | | "å
¥åºåæªå
³èå°è´§éç¥åï¼ä¸è½éæ©å°è´§éç¥åè¡"); |
| | | ErrorCode WM_ITEM_RECEIPT_DETAIL_NOT_EXISTS = new ErrorCode(1_040_705_200, "éè´å
¥åºæç»ä¸åå¨"); |
| | | ErrorCode WM_ITEM_RECEIPT_DETAIL_QUANTITY_EXCEED = new ErrorCode(1_040_705_202, "䏿¶æç»æ»æ°éä¸è½è¶
è¿è¡å
¥åºæ°é"); |
| | | ErrorCode WM_ITEM_RECEIPT_BATCH_REQUIRED = new ErrorCode(1_040_705_203, "ç©æã{}-{}ãå·²å¼å¯æ¹æ¬¡ç®¡çï¼ä¸æ¶æç»çæ¹æ¬¡å·ä¸è½ä¸ºç©º"); |
| | | |
| | | // ========== MES ä»åºç®¡ç-颿ç³è¯·åï¼1-040-706-000ï¼ ========== |
| | | ErrorCode WM_MATERIAL_REQUEST_NOT_EXISTS = new ErrorCode(1_040_706_000, "颿ç³è¯·åä¸åå¨"); |
| | |
| | | ErrorCode WM_PRODUCT_SALES_CANNOT_FINISH = new ErrorCode(1_040_714_007, "å½åç¶æä¸å
许æ§è¡åºåº"); |
| | | ErrorCode WM_PRODUCT_SALES_CANNOT_CANCEL = new ErrorCode(1_040_714_008, "å½åç¶æä¸å
è®¸åæ¶"); |
| | | ErrorCode WM_PRODUCT_SALES_CANNOT_CONFIRM = new ErrorCode(1_040_714_009, "å½åç¶æä¸å
许确认æ£éªéè¿"); |
| | | ErrorCode WM_PRODUCT_SALES_ALREADY_EXISTS = new ErrorCode(1_040_714_010, "该åè´§éç¥åå·²çæéå®åºåºåï¼ä¸è½éå¤çæ"); |
| | | ErrorCode WM_PRODUCT_SALES_DETAILS_EMPTY = new ErrorCode(1_040_714_020, "æ£è´§æç»ä¸è½ä¸ºç©º"); |
| | | ErrorCode WM_PRODUCT_SALES_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_714_010, "æ£è´§æ°éä¸åºåºæ°éä¸å¹é
"); |
| | | ErrorCode WM_PRODUCT_SALES_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_714_011, "æ£è´§æ°éä¸åºåºæ°éä¸å¹é
"); |
| | | ErrorCode WM_PRODUCT_SALES_LINE_NOT_EXISTS = new ErrorCode(1_040_714_011, "éå®åºåºåè¡ä¸åå¨"); |
| | | ErrorCode WM_PRODUCT_SALES_DETAIL_NOT_EXISTS = new ErrorCode(1_040_714_012, "éå®åºåºæç»ä¸åå¨"); |
| | | ErrorCode WM_PRODUCT_SALES_STOCK_INSUFFICIENT = new ErrorCode(1_040_714_013, "åºåä¸è¶³ï¼æ æ³æ£è´§"); |
| | |
| | | ErrorCode WM_SALES_NOTICE_LINE_NOT_MATCH = new ErrorCode(1_040_720_012, "åè´§éç¥åè¡ä¸å±äºæå®çåè´§éç¥å"); |
| | | ErrorCode WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS = new ErrorCode(1_040_720_013, "éå®è®¢åä¸åå¨"); |
| | | ErrorCode WM_SALES_NOTICE_SALE_ORDER_ITEM_EMPTY = new ErrorCode(1_040_720_014, "éå®è®¢åæç»ä¸ºç©º"); |
| | | ErrorCode WM_SALES_NOTICE_ALREADY_EXISTS = new ErrorCode(1_040_720_015, "该éå®è®¢åå·²çæåè´§éç¥åï¼ä¸è½éå¤çæ"); |
| | | |
| | | // ========== MES ä»åºç®¡ç-æ¡ç é
ç½®ï¼1-040-730-000ï¼ ========== |
| | | ErrorCode WM_BARCODE_CONFIG_NOT_EXISTS = new ErrorCode(1_040_730_000, "æ¡ç é
ç½®ä¸åå¨"); |
| | |
| | | |
| | | /** |
| | | * MES æ£æµç»ææä¸¾ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Getter |
| | | @AllArgsConstructor |
| | | public enum MesQcCheckResultEnum implements ArrayValuable<Integer> { |
| | | |
| | | PASS(1, "æ£éªéè¿"), |
| | | FAIL(2, "æ£éªä¸éè¿"); |
| | | QUALIFIED(1, "åæ ¼"), |
| | | SPECIAL_APPROVAL(2, "ç¹é"), |
| | | RETURN(3, "ä¸åæ ¼éè´§"), |
| | | SCRAP(4, "ä¸åæ ¼æ¥åº"); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesQcCheckResultEnum::getType).toArray(Integer[]::new); |
| | | |
| | |
| | | return ARRAYS; |
| | | } |
| | | |
| | | /** |
| | | * 夿æ¯å¦å¯ä»¥å
¥åº |
| | | * |
| | | * @param type æ£æµç»æ |
| | | * @return true å¯ä»¥å
¥åº |
| | | */ |
| | | public static boolean canInbound(Integer type) { |
| | | return QUALIFIED.getType().equals(type) || SPECIAL_APPROVAL.getType().equals(type); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt.MesWmOutsourceReceiptService; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.ErpSupplierApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.context.annotation.Lazy; |
| | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @Resource |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | @Resource |
| | | @Lazy |
| | | private ErpSupplierApi supplierApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createIqc(MesQcIqcSaveReqVO createReqVO) { |
| | |
| | | private void validateIqcSaveData(MesQcIqcSaveReqVO reqVO) { |
| | | // æ ¡éªç¼å·å¯ä¸ |
| | | validateIqcCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | // æ ¡éªä¾åºåãç©æãæ£æµäººååå¨ |
| | | vendorService.validateVendorExists(reqVO.getVendorId()); |
| | | itemService.validateItemExists(reqVO.getItemId()); |
| | | // æ ¡éªä¾åºååå¨ï¼ä¼å
æ ¡éª ERP ä¾åºåï¼å¤±è´¥åæ ¡éª MDM ä¾åºåï¼ |
| | | if (reqVO.getVendorId() != null) { |
| | | try { |
| | | supplierApi.validateSupplier(reqVO.getVendorId()); |
| | | } catch (Exception e) { |
| | | // ERP ä¾åºåæ ¡éªå¤±è´¥ï¼å°è¯ MDM ä¾åºå |
| | | vendorService.validateVendorExists(reqVO.getVendorId()); |
| | | } |
| | | } |
| | | // æ ¡éªç©æåå¨ï¼ä½¿ç¨ MDM ç©æï¼ |
| | | if (reqVO.getItemId() != null) { |
| | | mdmItemApi.getItem(reqVO.getItemId()).getCheckedData(); |
| | | } |
| | | // æ ¡éªæ£æµäººååå¨ |
| | | adminUserApi.validateUser(reqVO.getInspectorUserId()); |
| | | } |
| | | |
| | |
| | | // æ ¹æ®ä¸åçæ¥æºåæ®ç±»åï¼ååä¸åçåæ® |
| | | if (Objects.equals(iqc.getSourceDocType(), MesBizTypeConstants.WM_ARRIVAL_NOTICE)) { |
| | | arrivalNoticeService.updateArrivalNoticeWhenIqcFinish(iqc.getSourceDocId(), iqc.getSourceLineId(), |
| | | iqc.getId(), iqc.getQualifiedQuantity()); |
| | | iqc.getId(), iqc.getCheckResult(), iqc.getQualifiedQuantity()); |
| | | } else if (Objects.equals(iqc.getSourceDocType(), MesBizTypeConstants.WM_OUTSOURCE_RECPT)) { |
| | | outsourceReceiptService.updateOutsourceReceiptWhenIqcFinish(iqc.getSourceDocId(), iqc.getSourceLineId(), |
| | | iqc.getId(), iqc.getQualifiedQuantity(), iqc.getUnqualifiedQuantity()); |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createIqcFromArrivalNotice(Long noticeId, MesWmArrivalNoticeLineDO line, String noticeCode, Long vendorId) { |
| | | // 1. æ ¡éªç©ææ¯å¦é
ç½®äº IQC æ£éªæ¨¡æ¿ |
| | | MesQcTemplateItemDO templateItem = templateItemService.getRequiredTemplateByItemIdAndType( |
| | | line.getItemId(), MesQcTypeEnum.IQC.getType()); |
| | | MesQcTemplateItemDO templateItem; |
| | | try { |
| | | templateItem = templateItemService.getRequiredTemplateByItemIdAndType( |
| | | line.getItemId(), MesQcTypeEnum.IQC.getType()); |
| | | } catch (Exception e) { |
| | | // è·åç©æä¿¡æ¯ï¼æä¾æ´æç¡®çé误æç¤º |
| | | String itemInfo = getItemInfo(line.getItemId()); |
| | | throw exception(QC_NO_TEMPLATE_FOR_ITEM, itemInfo); |
| | | } |
| | | Long templateId = templateItem.getTemplateId(); |
| | | |
| | | // 2. çææ£éªåç¼ç |
| | |
| | | return iqc.getId(); |
| | | } |
| | | |
| | | /** |
| | | * è·åç©æä¿¡æ¯ï¼ç¼ç +åç§°ï¼ |
| | | */ |
| | | private String getItemInfo(Long itemId) { |
| | | if (itemId == null) { |
| | | return "æªç¥ç©æ"; |
| | | } |
| | | try { |
| | | cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO item = mdmItemApi.getItem(itemId).getCheckedData(); |
| | | if (item != null) { |
| | | return item.getCode() + "-" + item.getName(); |
| | | } |
| | | } catch (Exception e) { |
| | | // 忽ç¥å¼å¸¸ |
| | | } |
| | | return "ç©æID:" + itemId; |
| | | } |
| | | |
| | | } |
| | |
| | | * |
| | | * @param lineId è¡ç¼å· |
| | | * @param iqcId IQC æ£éªåç¼å· |
| | | * @param checkResult è´¨æ£ç»æï¼1åæ ¼ 2ç¹é 3ä¸åæ ¼éè´§ 4ä¸åæ ¼æ¥åºï¼ |
| | | * @param qualifiedQuantity åæ ¼æ°é |
| | | */ |
| | | void updateArrivalNoticeLineWhenIqcFinish(Long lineId, Long iqcId, BigDecimal qualifiedQuantity); |
| | | void updateArrivalNoticeLineWhenIqcFinish(Long lineId, Long iqcId, Integer checkResult, BigDecimal qualifiedQuantity); |
| | | |
| | | /** |
| | | * æ ¡éªå°è´§éç¥åè¡åå¨ |
| | |
| | | } |
| | | |
| | | @Override |
| | | public void updateArrivalNoticeLineWhenIqcFinish(Long lineId, Long iqcId, BigDecimal qualifiedQuantity) { |
| | | public void updateArrivalNoticeLineWhenIqcFinish(Long lineId, Long iqcId, Integer checkResult, BigDecimal qualifiedQuantity) { |
| | | // æ ¡éªè¡åå¨ |
| | | validateArrivalNoticeLineExists(lineId); |
| | | // æ´æ° |
| | | // æ´æ°ï¼ç»å® iqcId + è´¨æ£ç»æ + åæ ¼æ°é |
| | | arrivalNoticeLineMapper.updateById(new MesWmArrivalNoticeLineDO() |
| | | .setId(lineId).setIqcId(iqcId).setQualifiedQuantity(qualifiedQuantity)); |
| | | .setId(lineId).setIqcId(iqcId).setIqcCheckResult(checkResult).setQualifiedQuantity(qualifiedQuantity)); |
| | | } |
| | | |
| | | @Override |
| | |
| | | * @param id å°è´§éç¥åç¼å· |
| | | * @param lineId å°è´§éç¥åè¡ç¼å· |
| | | * @param iqcId IQC æ£éªåç¼å· |
| | | * @param checkResult è´¨æ£ç»æï¼1åæ ¼ 2ç¹é 3ä¸åæ ¼éè´§ 4ä¸åæ ¼æ¥åºï¼ |
| | | * @param qualifiedQuantity åæ ¼æ°é |
| | | */ |
| | | void updateArrivalNoticeWhenIqcFinish(Long id, Long lineId, Long iqcId, BigDecimal qualifiedQuantity); |
| | | void updateArrivalNoticeWhenIqcFinish(Long id, Long lineId, Long iqcId, Integer checkResult, BigDecimal qualifiedQuantity); |
| | | |
| | | /** |
| | | * 宿å°è´§éç¥åï¼å¾
å
¥åº â 已宿ï¼ï¼å
é¨è°ç¨ |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.ErpSupplierApi; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO; |
| | | import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.annotation.Lazy; |
| | |
| | | |
| | | @Resource |
| | | private MesWmArrivalNoticeLineService arrivalNoticeLineService; |
| | | |
| | | @Resource |
| | | private cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService vendorService; |
| | | private ErpSupplierApi supplierApi; |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderApi purchaseOrderApi; |
| | |
| | | private void validateArrivalNoticeSaveData(MesWmArrivalNoticeSaveReqVO reqVO) { |
| | | // æ ¡éªç¼ç å¯ä¸ |
| | | validateCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | // æ ¡éªä¾åºååå¨ä¸å¯ç¨ |
| | | vendorService.validateVendorExistsAndEnable(reqVO.getVendorId()); |
| | | // æ ¡éªä¾åºååå¨ï¼ERP éè´ä¾åºåï¼ |
| | | supplierApi.validateSupplier(reqVO.getVendorId()); |
| | | // æ ¡éªéè´è®¢ååå¨ |
| | | if (reqVO.getPurchaseOrderId() != null) { |
| | | ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(reqVO.getPurchaseOrderId()).getCheckedData(); |
| | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateArrivalNoticeWhenIqcFinish(Long id, Long lineId, Long iqcId, BigDecimal qualifiedQuantity) { |
| | | public void updateArrivalNoticeWhenIqcFinish(Long id, Long lineId, Long iqcId, Integer checkResult, BigDecimal qualifiedQuantity) { |
| | | // 1.1 æ ¡éªå°è´§éç¥ååå¨ |
| | | MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(id); |
| | | // 1.2 æ ¡éªç¶æä¸ºå¾
è´¨æ£ |
| | |
| | | throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PENDING_QC); |
| | | } |
| | | |
| | | // 2. æ´æ°å°è´§éç¥åè¡ï¼ç»å® iqcId + åæ ¼æ°é |
| | | arrivalNoticeLineService.updateArrivalNoticeLineWhenIqcFinish(lineId, iqcId, qualifiedQuantity); |
| | | // 2. æ´æ°å°è´§éç¥åè¡ï¼ç»å® iqcId + è´¨æ£ç»æ + åæ ¼æ°é |
| | | arrivalNoticeLineService.updateArrivalNoticeLineWhenIqcFinish(lineId, iqcId, checkResult, qualifiedQuantity); |
| | | |
| | | // 3.1 夿æ¯å¦ææéæ£è¡é½å·²å®æ |
| | | // 3.1 夿æ¯å¦ææéæ£è¡é½å·²å®æè´¨æ£ |
| | | List<MesWmArrivalNoticeLineDO> lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(id); |
| | | boolean hasUnchecked = CollectionUtils.anyMatch(lines, |
| | | line -> Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcId() == null); |
| | | line -> Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcCheckResult() == null); |
| | | if (hasUnchecked) { |
| | | log.info("[updateArrivalNoticeWhenIqcFinish][å°è´§éç¥å({}) è¿ææªå®ææ£éªçè¡ï¼æä¸æ´æ°ç¶æ]", id); |
| | | return; |
| | | } |
| | | // 3.2 ææè¡æ£éªå®æï¼æ´æ°ä¸»è¡¨ç¶æ PENDING_QC â PENDING_RECEIPT |
| | | |
| | | // 3.2 夿æ¯å¦ææéæ£è¡é½å¯ä»¥å
¥åºï¼åæ ¼æç¹éï¼ |
| | | boolean hasNonInbound = CollectionUtils.anyMatch(lines, |
| | | line -> Boolean.TRUE.equals(line.getIqcCheckFlag()) |
| | | && !MesQcCheckResultEnum.canInbound(line.getIqcCheckResult())); |
| | | if (hasNonInbound) { |
| | | log.info("[updateArrivalNoticeWhenIqcFinish][å°è´§éç¥å({}) åå¨ä¸å¯å
¥åºçè¡ï¼éè´§/æ¥åºï¼ï¼ç¶æä¿æå¾
è´¨æ£]", id); |
| | | return; |
| | | } |
| | | |
| | | // 3.3 ææè¡æ£éªå®æä¸å¯å
¥åºï¼æ´æ°ä¸»è¡¨ç¶æ PENDING_QC â PENDING_RECEIPT |
| | | arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO() |
| | | .setId(id).setStatus(MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus())); |
| | | } |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long generateArrivalNoticeFromPurchaseOrder(Long purchaseOrderId) { |
| | | // 1. è·åéè´è®¢å |
| | | // 1. æ ¡éªæ¯å¦å·²çæè¿å°è´§éç¥åï¼é²æ¢éå¤çæï¼ |
| | | MesWmArrivalNoticeDO existNotice = arrivalNoticeMapper.selectByPurchaseOrderId(purchaseOrderId); |
| | | if (existNotice != null) { |
| | | throw exception(WM_ARRIVAL_NOTICE_ALREADY_EXISTS); |
| | | } |
| | | |
| | | // 2. è·åéè´è®¢å |
| | | ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(purchaseOrderId).getCheckedData(); |
| | | if (purchaseOrder == null) { |
| | | throw exception(WM_PURCHASE_ORDER_NOT_EXISTS); |
| | | } |
| | | |
| | | // 2. è·åéè´è®¢åæç» |
| | | // 3. è·åéè´è®¢åæç» |
| | | List<ErpPurchaseOrderItemRespDTO> items = purchaseOrderApi.getPurchaseOrderItemList(purchaseOrderId).getCheckedData(); |
| | | if (CollUtil.isEmpty(items)) { |
| | | throw exception(WM_PURCHASE_ORDER_NO_ITEM); |
| | | } |
| | | |
| | | // 3. çæå°è´§éç¥åç¼ç ï¼ä½¿ç¨ç¼ç è§åæå¡ï¼ |
| | | // 4. çæå°è´§éç¥åç¼ç |
| | | String code = generateArrivalNoticeCode(); |
| | | |
| | | // 4. å建å°è´§éç¥å主表 |
| | | // 5. å建å°è´§éç¥å主表ï¼ç´æ¥è®¾ä¸ºå¾
å
¥åºç¶æ |
| | | MesWmArrivalNoticeDO notice = new MesWmArrivalNoticeDO(); |
| | | notice.setCode(code); |
| | | notice.setName(purchaseOrder.getNo() + "å°è´§éç¥"); |
| | | notice.setPurchaseOrderId(purchaseOrderId); |
| | | notice.setPurchaseOrderCode(purchaseOrder.getNo()); |
| | | notice.setVendorId(purchaseOrder.getSupplierId()); |
| | | notice.setStatus(MesWmArrivalNoticeStatusEnum.PREPARE.getStatus()); |
| | | notice.setArrivalDate(java.time.LocalDateTime.now()); // å°è´§æ¶é´ä¸ºå½åæ¶é´ |
| | | notice.setStatus(MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus()); |
| | | arrivalNoticeMapper.insert(notice); |
| | | |
| | | // 5. éåæç»å建å°è´§éç¥åè¡ |
| | | // 6. éåæç»å建å°è´§éç¥åè¡ |
| | | boolean hasNeedQc = false; |
| | | for (ErpPurchaseOrderItemRespDTO item : items) { |
| | | MesWmArrivalNoticeLineDO line = new MesWmArrivalNoticeLineDO(); |
| | | line.setNoticeId(notice.getId()); |
| | | line.setPurchaseOrderItemId(item.getId()); |
| | | // 注æï¼è¿ééè¦æ ¹æ® ERP 产å ID æ å°å° MES ç©æ ID |
| | | // å®é
项ç®ä¸éè¦éè¿æ å°æå¡å¤çï¼è¿éææ¶çç©ºè®©ç¨æ·æå¨éæ© |
| | | line.setArrivalQuantity(item.getCount() != null ? item.getCount().subtract(item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO) : BigDecimal.ZERO); |
| | | line.setItemId(item.getProductId()); // ä»éè´è®¢åæç»å¸¦å
¥ç©æç¼å· |
| | | BigDecimal arrivalQuantity = item.getCount() != null ? item.getCount().subtract(item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO) : BigDecimal.ZERO; |
| | | line.setArrivalQuantity(arrivalQuantity); |
| | | // ä»éè´è®¢åæç»å¸¦å
¥è´¨æ£æ è¯ |
| | | line.setIqcCheckFlag(Boolean.TRUE.equals(item.getQcCheckFlag())); |
| | | boolean needQc = Boolean.TRUE.equals(item.getQcCheckFlag()); |
| | | line.setIqcCheckFlag(needQc); |
| | | // 妿ä¸éè¦è´¨æ£ï¼åæ ¼æ°éçäºå°è´§æ°é |
| | | if (!needQc) { |
| | | line.setQualifiedQuantity(arrivalQuantity); |
| | | } else { |
| | | hasNeedQc = true; |
| | | } |
| | | arrivalNoticeLineService.createArrivalNoticeLineFromPurchaseOrderItem(line); |
| | | } |
| | | |
| | | // 7. 妿æéè¦è´¨æ£çè¡ï¼æ´æ°ç¶æä¸ºå¾
è´¨æ£å¹¶èªå¨å建 IQC å |
| | | if (hasNeedQc) { |
| | | arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO() |
| | | .setId(notice.getId()).setStatus(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus())); |
| | | // 为éè¦è´¨æ£çè¡èªå¨å建 IQC æ£éªå |
| | | List<MesWmArrivalNoticeLineDO> lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(notice.getId()); |
| | | for (MesWmArrivalNoticeLineDO line : lines) { |
| | | if (Boolean.TRUE.equals(line.getIqcCheckFlag())) { |
| | | Long iqcId = iqcService.createIqcFromArrivalNotice( |
| | | notice.getId(), line, notice.getCode(), notice.getVendorId()); |
| | | arrivalNoticeLineService.updateArrivalNoticeLineIqcId(line.getId(), iqcId); |
| | | log.info("[generateArrivalNoticeFromPurchaseOrder][å°è´§éç¥å({}) è¡({}) èªå¨å建 IQC æ£éªå({})]", |
| | | notice.getId(), line.getId(), iqcId); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return notice.getId(); |
| | | } |
| | | |
| | |
| | | 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.math.BigDecimal; |
| | |
| | | private MesWmMaterialStockService materialStockService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createItemReceiptDetail(MesWmItemReceiptDetailSaveReqVO createReqVO) { |
| | | // 1. æ ¡éªæ°æ® |
| | | itemReceiptService.validateItemReceiptEditable(createReqVO.getReceiptId()); |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateItemReceiptDetail(MesWmItemReceiptDetailSaveReqVO updateReqVO) { |
| | | // 1.1 æ ¡éªåå¨ |
| | | MesWmItemReceiptDetailDO detail = validateItemReceiptDetailExists(updateReqVO.getId()); |
| | |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; |
| | | import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeLineService; |
| | |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.ErpSupplierApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import org.springframework.security.core.Authentication; |
| | | import org.springframework.security.core.context.SecurityContextHolder; |
| | | import jakarta.annotation.Resource; |
| | |
| | | import java.math.BigDecimal; |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| | |
| | | @Lazy |
| | | private MesWmArrivalNoticeService arrivalNoticeService; |
| | | @Resource |
| | | private MesMdVendorService vendorService; |
| | | @Lazy |
| | | private ErpSupplierApi supplierApi; |
| | | @Resource |
| | | @Lazy |
| | | private MesQcIqcService iqcService; |
| | |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderApi purchaseOrderApi; |
| | | |
| | | @Resource |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | @Override |
| | | public Long createItemReceipt(MesWmItemReceiptSaveReqVO createReqVO) { |
| | |
| | | private void validateItemReceiptSaveData(MesWmItemReceiptSaveReqVO reqVO) { |
| | | // æ ¡éªç¼ç å¯ä¸ |
| | | validateCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | // æ ¡éªä¾åºååå¨ |
| | | vendorService.validateVendorExistsAndEnable(reqVO.getVendorId()); |
| | | // æ ¡éªä¾åºååå¨ï¼éè´å
¥åºä½¿ç¨ ERP ä¾åºåï¼ |
| | | supplierApi.validateSupplier(reqVO.getVendorId()); |
| | | // æ ¡éªå°è´§éç¥ååå¨ |
| | | if (reqVO.getNoticeId() != null) { |
| | | MesWmArrivalNoticeDO notice = arrivalNoticeService.validateArrivalNoticeReadyForReceipt(reqVO.getNoticeId()); |
| | |
| | | throw exception(WM_ITEM_RECEIPT_NO_LINE); |
| | | } |
| | | |
| | | // æ ¡éªç©ææ¹æ¬¡ç®¡çï¼å¦æç©æå¼å¯æ¹æ¬¡ç®¡çï¼åæç»çæ¹æ¬¡å·ä¸è½ä¸ºç©º |
| | | validateBatchManagement(lines); |
| | | |
| | | // æäº¤ï¼è稿 â å¾
䏿¶ï¼ |
| | | itemReceiptMapper.updateById(new MesWmItemReceiptDO() |
| | | .setId(id).setStatus(MesWmItemReceiptStatusEnum.APPROVING.getStatus())); |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªç©ææ¹æ¬¡ç®¡çï¼å¦æç©æå¼å¯æ¹æ¬¡ç®¡çï¼åè¡çæ¹æ¬¡å·ä¸è½ä¸ºç©º |
| | | */ |
| | | private void validateBatchManagement(List<MesWmItemReceiptLineDO> lines) { |
| | | // è·åææç©æID |
| | | List<Long> itemIds = CollectionUtils.convertList(lines, MesWmItemReceiptLineDO::getItemId); |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(itemIds); |
| | | |
| | | // é忝ä¸è¡ï¼æ£æ¥ç©ææ¯å¦å¼å¯æ¹æ¬¡ç®¡ç |
| | | for (MesWmItemReceiptLineDO line : lines) { |
| | | MdmItemRespDTO item = itemMap.get(line.getItemId()); |
| | | if (item == null) { |
| | | continue; |
| | | } |
| | | // å¦æç©æå¼å¯æ¹æ¬¡ç®¡çï¼æ£æ¥è¡ä¸çæ¹æ¬¡å·æ¯å¦ä¸ºç©º |
| | | if (Boolean.TRUE.equals(item.getIsBatchManaged()) && line.getBatchId() == null) { |
| | | throw exception(WM_ITEM_RECEIPT_BATCH_REQUIRED, item.getCode(), item.getName()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | private void createTransactionList(MesWmItemReceiptDO receipt) { |
| | | List<MesWmItemReceiptDetailDO> details = itemReceiptDetailService.getItemReceiptDetailListByReceiptId(receipt.getId()); |
| | | wmTransactionService.createTransactionList(convertList(details, detail -> new MesWmTransactionSaveReqDTO() |
| | | .setType(MesWmTransactionTypeEnum.IN.getType()).setItemId(detail.getItemId()) |
| | | .setQuantity(detail.getQuantity()) // å
¥åºæ°éä¸ºæ£æ° |
| | | .setBatchId(detail.getBatchId()) |
| | | .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) |
| | | .setVendorId(receipt.getVendorId()).setReceiptTime(receipt.getReceiptDate()) |
| | | .setBizType(MesBizTypeConstants.WM_ITEM_RECEIPT_IN).setBizId(receipt.getId()) |
| | | .setBizCode(receipt.getCode()).setBizLineId(detail.getLineId()))); |
| | | // è·åææè¡ä¿¡æ¯ï¼ç¨äºè·åæ¹æ¬¡å· |
| | | List<MesWmItemReceiptLineDO> lines = itemReceiptLineService.getItemReceiptLineListByReceiptId(receipt.getId()); |
| | | Map<Long, MesWmItemReceiptLineDO> lineMap = CollectionUtils.convertMap(lines, MesWmItemReceiptLineDO::getId); |
| | | |
| | | wmTransactionService.createTransactionList(convertList(details, detail -> { |
| | | // ä»è¡ä¸è·åæ¹æ¬¡ä¿¡æ¯ï¼å¦ææç»æ²¡ææ¹æ¬¡å·ï¼ |
| | | MesWmItemReceiptLineDO line = lineMap.get(detail.getLineId()); |
| | | Long batchId = detail.getBatchId() != null ? detail.getBatchId() : |
| | | (line != null ? line.getBatchId() : null); |
| | | String batchCode = line != null ? line.getBatchCode() : null; |
| | | |
| | | return new MesWmTransactionSaveReqDTO() |
| | | .setType(MesWmTransactionTypeEnum.IN.getType()).setItemId(detail.getItemId()) |
| | | .setQuantity(detail.getQuantity()) |
| | | .setBatchId(batchId).setBatchCode(batchCode) |
| | | .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) |
| | | .setVendorId(receipt.getVendorId()).setReceiptTime(receipt.getReceiptDate()) |
| | | .setBizType(MesBizTypeConstants.WM_ITEM_RECEIPT_IN).setBizId(receipt.getId()) |
| | | .setBizCode(receipt.getCode()).setBizLineId(detail.getLineId()); |
| | | })); |
| | | } |
| | | |
| | | @Override |
| | |
| | | // 1. æ ¡éªå°è´§éç¥ååå¨ä¸ç¶æä¸ºå¾
å
¥åº |
| | | MesWmArrivalNoticeDO notice = arrivalNoticeService.validateArrivalNoticeReadyForReceipt(arrivalNoticeId); |
| | | |
| | | // 2. è·åå°è´§éç¥åè¡ |
| | | // 2. æ ¡éªæ¯å¦å·²çæè¿å
¥åºåï¼é²æ¢éå¤çæï¼ |
| | | MesWmItemReceiptDO existReceipt = itemReceiptMapper.selectByNoticeId(arrivalNoticeId); |
| | | if (existReceipt != null) { |
| | | throw exception(WM_ITEM_RECEIPT_ALREADY_EXISTS); |
| | | } |
| | | |
| | | // 3. è·åå°è´§éç¥åè¡ |
| | | List<MesWmArrivalNoticeLineDO> lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(arrivalNoticeId); |
| | | if (CollUtil.isEmpty(lines)) { |
| | | throw exception(WM_ARRIVAL_NOTICE_NO_LINE); |
| | | } |
| | | |
| | | // 3. çæå
¥åºåç¼ç |
| | | // 4. çæå
¥åºåç¼ç |
| | | String code = generateItemReceiptCode(); |
| | | |
| | | // 4. å建å
¥åºå主表 |
| | | // 5. å建å
¥åºå主表 |
| | | MesWmItemReceiptDO receipt = new MesWmItemReceiptDO(); |
| | | receipt.setCode(code); |
| | | receipt.setName(notice.getName() + "å
¥åºå"); |
| | | receipt.setNoticeId(arrivalNoticeId); |
| | | receipt.setPurchaseOrderCode(notice.getPurchaseOrderCode()); |
| | | receipt.setVendorId(notice.getVendorId()); |
| | | receipt.setReceiptDate(java.time.LocalDateTime.now()); // å
¥åºæ¶é´ä¸ºå½åæ¶é´ |
| | | receipt.setStatus(MesWmItemReceiptStatusEnum.PREPARE.getStatus()); |
| | | itemReceiptMapper.insert(receipt); |
| | | |
| | | // 5. éåè¡å建å
¥åºåè¡ |
| | | // 6. éåè¡å建å
¥åºåè¡ |
| | | for (MesWmArrivalNoticeLineDO noticeLine : lines) { |
| | | MesWmItemReceiptLineDO receiptLine = new MesWmItemReceiptLineDO(); |
| | | receiptLine.setReceiptId(receipt.getId()); |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateProductSalesLineWhenOqcFinish(Long id, Long oqcId, Integer checkResult) { |
| | | // 1. æ´æ°è¡ç oqcId + qualityStatus |
| | | Integer qualityStatus = Objects.equals(checkResult, MesQcCheckResultEnum.PASS.getType()) |
| | | Integer qualityStatus = Objects.equals(checkResult, MesQcCheckResultEnum.QUALIFIED.getType()) |
| | | ? MesWmQualityStatusEnum.PASS.getStatus() : MesWmQualityStatusEnum.FAIL.getStatus(); |
| | | productSalesLineMapper.updateById(new MesWmProductSalesLineDO() |
| | | .setId(id).setOqcId(oqcId).setQualityStatus(qualityStatus)); |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long generateSalesNoticeFromSaleOrder(Long saleOrderId) { |
| | | // 1. è·åéå®è®¢åä¿¡æ¯ |
| | | // 1. æ ¡éªæ¯å¦å·²çæè¿åè´§éç¥åï¼é²æ¢éå¤çæï¼ |
| | | MesWmSalesNoticeDO existNotice = salesNoticeMapper.selectBySaleOrderId(saleOrderId); |
| | | if (existNotice != null) { |
| | | throw exception(WM_SALES_NOTICE_ALREADY_EXISTS); |
| | | } |
| | | |
| | | // 2. è·åéå®è®¢åä¿¡æ¯ |
| | | ErpSaleOrderRespDTO saleOrder = saleOrderApi.getSaleOrder(saleOrderId).getCheckedData(); |
| | | if (saleOrder == null) { |
| | | throw exception(WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS); |
| | | } |
| | | |
| | | // 2. è·åéå®è®¢åæç» |
| | | // 3. è·åéå®è®¢åæç» |
| | | List<ErpSaleOrderItemRespDTO> saleOrderItems = saleOrderApi.getSaleOrderItemList(saleOrderId).getCheckedData(); |
| | | if (CollUtil.isEmpty(saleOrderItems)) { |
| | | throw exception(WM_SALES_NOTICE_SALE_ORDER_ITEM_EMPTY); |
| | | } |
| | | |
| | | // 3. çæåè´§éç¥åç¼ç |
| | | // 4. çæåè´§éç¥åç¼ç |
| | | String code = autoCodeRecordService.generateAutoCode("SALESNOTICE_CODE", null); |
| | | |
| | | // 4. å建åè´§éç¥å主表 |
| | | // 5. å建åè´§éç¥å主表 |
| | | MesWmSalesNoticeDO notice = new MesWmSalesNoticeDO(); |
| | | notice.setCode(code); |
| | | notice.setName("éå®è®¢å[" + saleOrder.getNo() + "]åè´§éç¥"); |
| | |
| | | notice.setStatus(PREPARE.getStatus()); |
| | | salesNoticeMapper.insert(notice); |
| | | |
| | | // 5. éåæç»å建åè´§éç¥åè¡ |
| | | // 6. éåæç»å建åè´§éç¥åè¡ |
| | | for (ErpSaleOrderItemRespDTO saleOrderItem : saleOrderItems) { |
| | | MesWmSalesNoticeLineDO line = new MesWmSalesNoticeLineDO(); |
| | | line.setNoticeId(notice.getId()); |
| | |
| | | throw exception(WM_SALES_NOTICE_STATUS_NOT_APPROVED); |
| | | } |
| | | |
| | | // 2. è·ååè´§éç¥åè¡ |
| | | // 2. æ ¡éªæ¯å¦å·²çæè¿éå®åºåºåï¼é²æ¢éå¤çæï¼ |
| | | if (productSalesMapper.selectByNoticeId(noticeId) != null) { |
| | | throw exception(WM_PRODUCT_SALES_ALREADY_EXISTS); |
| | | } |
| | | |
| | | // 3. è·ååè´§éç¥åè¡ |
| | | List<MesWmSalesNoticeLineDO> noticeLines = salesNoticeLineService.getSalesNoticeLineListByNoticeId(noticeId); |
| | | if (CollUtil.isEmpty(noticeLines)) { |
| | | throw exception(WM_SALES_NOTICE_LINE_EMPTY); |
| | | } |
| | | |
| | | // 3. çæéå®åºåºåç¼ç |
| | | // 4. çæéå®åºåºåç¼ç |
| | | String code = autoCodeRecordService.generateAutoCode("WM_PRODUCT_SALES_CODE", null); |
| | | |
| | | // 4. å建éå®åºåºå主表 |
| | | // 5. å建éå®åºåºå主表 |
| | | MesWmProductSalesDO productSales = new MesWmProductSalesDO(); |
| | | productSales.setCode(code); |
| | | productSales.setName("åè´§éç¥å[" + notice.getCode() + "]åºåº"); |
| | |
| | | productSales.setStatus(MesWmProductSalesStatusEnum.PREPARE.getStatus()); |
| | | productSalesMapper.insert(productSales); |
| | | |
| | | // 5. éååè´§éç¥åè¡å建éå®åºåºåè¡ |
| | | // 6. éååè´§éç¥åè¡å建éå®åºåºåè¡ |
| | | for (MesWmSalesNoticeLineDO noticeLine : noticeLines) { |
| | | MesWmProductSalesLineDO salesLine = new MesWmProductSalesLineDO(); |
| | | salesLine.setSalesId(productSales.getId()); |
| | |
| | | import cn.iocoder.yudao.module.mes.service.wms.approval.WmsApprovalService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.ApplicationListener; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class WmsInboundStatusListener implements ApplicationListener<BpmProcessInstanceStatusEvent> { |
| | | public class WmsInboundStatusListener extends cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener { |
| | | |
| | | /** |
| | | * éè´å
¥åºå®¡æ¹æµç¨å®ä¹ Key |
| | | */ |
| | | private static final String PROCESS_DEFINITION_KEY = "wms_inbound_approve"; |
| | | |
| | | @Resource |
| | | private WmsApprovalService approvalService; |
| | | |
| | | @Override |
| | | public void onApplicationEvent(BpmProcessInstanceStatusEvent event) { |
| | | // éè¿ businessKey æ¥è¯¢å
¥åºå |
| | | protected String getProcessDefinitionKey() { |
| | | return PROCESS_DEFINITION_KEY; |
| | | } |
| | | |
| | | @Override |
| | | protected void onEvent(BpmProcessInstanceStatusEvent event) { |
| | | Long orderId; |
| | | try { |
| | | orderId = Long.parseLong(event.getBusinessKey()); |
| | | } catch (NumberFormatException e) { |
| | | return; // businessKey 䏿¯æ°åï¼å¿½ç¥ |
| | | log.warn("[onEvent] businessKey({}) 䏿¯ææçæ°å", event.getBusinessKey()); |
| | | return; |
| | | } |
| | | |
| | | log.info("[onApplicationEvent] æ¶å°BPM审æ¹äºä»¶ï¼businessKey={}, status={}", |
| | | log.info("[onEvent] æ¶å°BPM审æ¹äºä»¶ï¼businessKey={}, status={}", |
| | | event.getBusinessKey(), event.getStatus()); |
| | | |
| | | // è°ç¨å®¡æ¹æå¡æ´æ°ç¶æ |
| | | try { |
| | | approvalService.updateAuditStatus(orderId, "INBOUND", event.getStatus()); |
| | | } catch (Exception e) { |
| | | log.error("[onApplicationEvent] æ´æ°å
¥åºå审æ¹ç¶æå¤±è´¥ï¼orderId={}", orderId, e); |
| | | log.error("[onEvent] æ´æ°å
¥åºå审æ¹ç¶æå¤±è´¥ï¼orderId={}", orderId, e); |
| | | } |
| | | } |
| | | |
| | |
| | | import cn.iocoder.yudao.module.mes.service.wms.approval.WmsApprovalService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.ApplicationListener; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class WmsOutboundStatusListener implements ApplicationListener<BpmProcessInstanceStatusEvent> { |
| | | public class WmsOutboundStatusListener extends cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener { |
| | | |
| | | /** |
| | | * éå®åºåºå®¡æ¹æµç¨å®ä¹ Key |
| | | */ |
| | | private static final String PROCESS_DEFINITION_KEY = "wms_outbound_approve"; |
| | | |
| | | @Resource |
| | | private WmsApprovalService approvalService; |
| | | |
| | | @Override |
| | | public void onApplicationEvent(BpmProcessInstanceStatusEvent event) { |
| | | // éè¿ businessKey æ¥è¯¢åºåºå |
| | | protected String getProcessDefinitionKey() { |
| | | return PROCESS_DEFINITION_KEY; |
| | | } |
| | | |
| | | @Override |
| | | protected void onEvent(BpmProcessInstanceStatusEvent event) { |
| | | Long orderId; |
| | | try { |
| | | orderId = Long.parseLong(event.getBusinessKey()); |
| | | } catch (NumberFormatException e) { |
| | | return; // businessKey 䏿¯æ°åï¼å¿½ç¥ |
| | | log.warn("[onEvent] businessKey({}) 䏿¯ææçæ°å", event.getBusinessKey()); |
| | | return; |
| | | } |
| | | |
| | | log.info("[onApplicationEvent] æ¶å°BPM审æ¹äºä»¶ï¼businessKey={}, status={}", |
| | | log.info("[onEvent] æ¶å°BPM审æ¹äºä»¶ï¼businessKey={}, status={}", |
| | | event.getBusinessKey(), event.getStatus()); |
| | | |
| | | // è°ç¨å®¡æ¹æå¡æ´æ°ç¶æ |
| | | try { |
| | | approvalService.updateAuditStatus(orderId, "OUTBOUND", event.getStatus()); |
| | | } catch (Exception e) { |
| | | log.error("[onApplicationEvent] æ´æ°åºåºå审æ¹ç¶æå¤±è´¥ï¼orderId={}", orderId, e); |
| | | log.error("[onEvent] æ´æ°åºåºå审æ¹ç¶æå¤±è´¥ï¼orderId={}", orderId, e); |
| | | } |
| | | } |
| | | |
| | |
| | | import cn.iocoder.yudao.module.mes.service.wms.approval.WmsApprovalService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.ApplicationListener; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class WmsTransferStatusListener implements ApplicationListener<BpmProcessInstanceStatusEvent> { |
| | | public class WmsTransferStatusListener extends cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener { |
| | | |
| | | /** |
| | | * è°æ¨å®¡æ¹æµç¨å®ä¹ Key |
| | | */ |
| | | private static final String PROCESS_DEFINITION_KEY = "wms_transfer_approve"; |
| | | |
| | | @Resource |
| | | private WmsApprovalService approvalService; |
| | | |
| | | @Override |
| | | public void onApplicationEvent(BpmProcessInstanceStatusEvent event) { |
| | | // éè¿ businessKey æ¥è¯¢è°æ¨å |
| | | protected String getProcessDefinitionKey() { |
| | | return PROCESS_DEFINITION_KEY; |
| | | } |
| | | |
| | | @Override |
| | | protected void onEvent(BpmProcessInstanceStatusEvent event) { |
| | | Long orderId; |
| | | try { |
| | | orderId = Long.parseLong(event.getBusinessKey()); |
| | | } catch (NumberFormatException e) { |
| | | return; // businessKey 䏿¯æ°åï¼å¿½ç¥ |
| | | log.warn("[onEvent] businessKey({}) 䏿¯ææçæ°å", event.getBusinessKey()); |
| | | return; |
| | | } |
| | | |
| | | log.info("[onApplicationEvent] æ¶å°BPM审æ¹äºä»¶ï¼businessKey={}, status={}", |
| | | log.info("[onEvent] æ¶å°BPM审æ¹äºä»¶ï¼businessKey={}, status={}", |
| | | event.getBusinessKey(), event.getStatus()); |
| | | |
| | | // è°ç¨å®¡æ¹æå¡æ´æ°ç¶æ |
| | | try { |
| | | approvalService.updateAuditStatus(orderId, "TRANSFER", event.getStatus()); |
| | | } catch (Exception e) { |
| | | log.error("[onApplicationEvent] æ´æ°è°æ¨å审æ¹ç¶æå¤±è´¥ï¼orderId={}", orderId, e); |
| | | log.error("[onEvent] æ´æ°è°æ¨å审æ¹ç¶æå¤±è´¥ï¼orderId={}", orderId, e); |
| | | } |
| | | } |
| | | |