Merge remote-tracking branch 'origin/dev_business' into dev_business
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # 确认æ¶è´§ä¸è´¨æ£æµç¨ - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - éè´è®¢åå表页 |
| | | - éè´è®¢å详æ
页 |
| | | - å°è´§éç¥åå表页 |
| | | - å°è´§éç¥å详æ
页 |
| | | - 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. **è´¨æ£å¤±è´¥å¤ç**ï¼å¦æè´¨æ£ç»æä¸ºéè´§ææ¥åºï¼å°è´§éç¥åç¶æä¿æ"å¾
è´¨æ£"ï¼éè¦äººå·¥ä»å
¥å¤çï¼å¦éæ°å®ææ¶è´§ï¼ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ERP éè´è®¢åè´¨æ£åæ®µä¸ MES æ¥ææ£éªèªå¨å建 - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ERP éè´è®¢åå表页 |
| | | - ERP éè´è®¢åæ°å¢/ç¼è¾é¡µ |
| | | - ERP éè´è®¢å详æ
页 |
| | | - MES å°è´§éç¥åå表页 |
| | | - MES å°è´§éç¥å详æ
页 |
| | | - MES æ¥ææ£éªï¼IQCï¼å表页 |
| | | |
| | | ## ä¸å¡æµç¨ |
| | | |
| | | ### 1. éè´è®¢åæ°å¢è´¨æ£æ è¯ |
| | | |
| | | 1. ç¨æ·å¨ ERP éè´è®¢åæ°å¢/ç¼è¾é¡µé¢ï¼å¯ä»¥ä¸ºæ¯ä¸ªäº§åæç»å¾é"æ¯å¦éè¦æ¥ææ£éª" |
| | | 2. ä¿åæ¶ï¼`qcCheckFlag` åæ®µé订åæç»ä¸èµ·ä¿å |
| | | |
| | | ### 2. ä»éè´è®¢åçæå°è´§éç¥å |
| | | |
| | | 1. ç¨æ·ç¹å»"çæå°è´§éç¥å"æé® |
| | | 2. ç³»ç»èªå¨å°éè´è®¢åæç»ç `qcCheckFlag` 带å
¥å°è´§éç¥åè¡ç `iqcCheckFlag` |
| | | 3. ç¨æ·å¯å¨å°è´§éç¥å详æ
é¡µä¿®æ¹æ¯è¡çè´¨æ£æ è¯ |
| | | |
| | | ### 3. å°è´§éç¥åæäº¤èªå¨å建 IQC |
| | | |
| | | 1. ç¨æ·æäº¤å°è´§éç¥å |
| | | 2. 妿æè¡æ 记为éè¦è´¨æ£ï¼`iqcCheckFlag = true`ï¼ï¼ |
| | | - å°è´§éç¥åç¶æå为"å¾
è´¨æ£" |
| | | - ç³»ç»èªå¨ä¸ºæ¯ä¸ªéè¦è´¨æ£çè¡åå»ºä¸æ¡ IQC æ¥ææ£éªå |
| | | - è¡ä¸ç `iqcId` å
³èå°åå»ºçæ£éªå |
| | | 3. å¦ææ²¡æéè¦è´¨æ£çè¡ï¼ç¶æç´æ¥å为"å¾
å
¥åº" |
| | | |
| | | ## API åæ´ |
| | | |
| | | ### ERP éè´è®¢å |
| | | |
| | | #### 请æ±åæ°åæ´ |
| | | |
| | | **ErpPurchaseOrderSaveReqVO.Item æ°å¢å段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | qcCheckFlag | Boolean | å¦ | æ¯å¦éè¦æ¥ææ£éª | |
| | | |
| | | #### ååºåæ°åæ´ |
| | | |
| | | **ErpPurchaseOrderRespVO.Item æ°å¢å段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | qcCheckFlag | Boolean | æ¯å¦éè¦æ¥ææ£éª | |
| | | |
| | | ### MES å°è´§éç¥å |
| | | |
| | | #### ååºåæ°åæ´ |
| | | |
| | | **å°è´§éç¥åè¡æ°å¢å段ï¼å·²åå¨ï¼å¼ºè°å¸¦å
¥é»è¾ï¼ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | iqcCheckFlag | Boolean | æ¯å¦éè¦æ¥ææ£éªï¼ä»éè´è®¢å带å
¥ï¼ | |
| | | | iqcId | Long | å
³èç IQC æ£éªå IDï¼æäº¤åèªå¨åå»ºï¼ | |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | ### ERP éè´è®¢å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | æ¯å¦è´¨æ£ | 订åæç»è¡¨æ ¼ | ä½¿ç¨ Checkbox æ Switch å±ç¤ºï¼å¯ç¼è¾ | |
| | | |
| | | ### MES å°è´§éç¥å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | æ¯å¦è´¨æ£ | è¡æç»è¡¨æ ¼ | ä½¿ç¨ Tag æ Checkbox å±ç¤ºï¼æäº¤åä¸å¯ä¿®æ¹ | |
| | | | IQC æ£éªå | è¡æç»è¡¨æ ¼ | å
³èçæ£éªåç¼å·ï¼ç¹å»å¯è·³è½¬ï¼æäº¤åèªå¨å
³èï¼ | |
| | | |
| | | ### MES æ¥ææ£éª |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | æ¥æºåæ® | 详æ
页 | æ¾ç¤ºå°è´§éç¥åç¼å·ï¼ç¹å»å¯è·³è½¬ | |
| | | | æ¥æºåæ®è¡ | 详æ
页 | æ¾ç¤ºå°è´§éç¥åè¡ç¼å· | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | éè´è®¢åä¿å | `qcCheckFlag` é»è®¤ä¸º falseï¼ä¸è´¨æ£ï¼ | |
| | | | çæå°è´§éç¥å | ä»éè´è®¢åæç»å¸¦å
¥ `qcCheckFlag` å° `iqcCheckFlag` | |
| | | | å°è´§éç¥åæäº¤ | 妿éè¦è´¨æ£çè¡ï¼èªå¨å建 IQC æ£éªåå¹¶å
³è | |
| | | | IQC å建æ¡ä»¶ | ç©æå¿
é¡»é
ç½®äº IQC æ£éªæ¨¡æ¿ï¼å¦åè·³è¿å¹¶è®°å½æ¥å¿ | |
| | | | IQC åæ®ç¶æ | èªå¨å建ç IQC 为èç¨¿ç¶æï¼éè¦æ£éªå填忣éªç»æ | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **æ£éªæ¨¡æ¿é
ç½®**ï¼ç©æå¿
é¡»å
å¨ MES è´¨éæ¨¡åé
ç½® IQC æ£éªæ¨¡æ¿ï¼å¦åèªå¨å建 IQC ä¼å¤±è´¥ |
| | | 2. **æ°æ®å¸¦å
¥**ï¼ä»éè´è®¢åçæå°è´§éç¥åæ¶ï¼è´¨æ£æ è¯ä¼èªå¨å¸¦å
¥ï¼ä½ç¨æ·å¯å¨å°è´§éç¥åä¸ä¿®æ¹ |
| | | 3. **ç¶ææµè½¬**ï¼å°è´§éç¥åæäº¤åï¼éè¦è´¨æ£çè¡ä¼è¿å
¥"å¾
è´¨æ£"ç¶æï¼æææ£éªå®æåæå¯å
¥åº |
| | | 4. **æ£éªåå
³è**ï¼æäº¤åè¡ä¸ä¼å
³è IQC æ£éªå IDï¼ç¹å»å¯è·³è½¬æ¥çæ£éªè¯¦æ
|
| | | 5. **å¼å¸¸å¤ç**ï¼å¦ææè¡å建 IQC 失败ï¼å¦ç¼ºå°æ¨¡æ¿ï¼ï¼ä¸ä¼ä¸ææ´ä¸ªæäº¤æµç¨ï¼ä¼è®°å½æ¥å¿ç»§ç»å¤çå
¶ä»è¡ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # éè´æµç¨å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - éè´è®¢åå表页 |
| | | - éè´è®¢å详æ
页 |
| | | - å°è´§éç¥åå表页 |
| | | - å°è´§éç¥å详æ
页 |
| | | |
| | | ## ä¸å¡æµç¨ |
| | | |
| | | ``` |
| | | éè´ç³è¯·å®¡æ¹éè¿ â èªå¨çæéè´è®¢å(å·²å®¡æ ¸) |
| | | â ç¹å»"确认æ¶è´§" â çæå°è´§éç¥å(å¾
å
¥åº/å¾
è´¨æ£) |
| | | â 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. 妿éè´ç³è¯·æªæå®ä¾åºåï¼å®¡æ¹éè¿åéè¦æå¨éæ©ä¾åºåçæè®¢å |
| | |
| | | |
| | | @Override |
| | | public List<ProcessDefinition> getProcessDefinitionList(Set<String> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return emptyList(); |
| | | } |
| | | return repositoryService.createProcessDefinitionQuery().processDefinitionIds(ids).list(); |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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); |
| | | |
| | | } |
| | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | @Schema(description = "æ¯å¦éè¦æ¥ææ£éª", example = "true") |
| | | private Boolean qcCheckFlag; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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)); |
| | | } |
| | | |
| | | } |
| | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| | | |
| | | @Tag(name = "管çåå° - ERP éè´è®¢å") |
| | | @RestController |
| | |
| | | @RequestParam("status") Integer status) { |
| | | purchaseOrderService.updatePurchaseOrderStatus(id, status); |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/submit") |
| | | @Operation(summary = "æäº¤éè´è®¢å审æ¹") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-order:update-status')") |
| | | public CommonResult<Boolean> submitPurchaseOrder(@RequestParam("id") Long id, |
| | | @RequestParam("processDefinitionKey") String processDefinitionKey) { |
| | | Long userId = getLoginUserId(); |
| | | purchaseOrderService.submitPurchaseOrder(id, processDefinitionKey, userId); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/approve-process-list") |
| | | @Operation(summary = "è·åéè´è®¢åå®¡æ¹æµç¨å表") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-order:query')") |
| | | public CommonResult<List<Map<String, Object>>> getApproveProcessList() { |
| | | return success(purchaseOrderService.getPurchaseOrderApproveProcessDefinitionList()); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | |
| | | 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()); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.purchase; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestRespVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestSaveReqVO; |
| | | 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.dataobject.purchase.ErpSupplierDO; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseRequestService; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | 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; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | 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.io.IOException; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| | | |
| | | @Tag(name = "管çåå° - ERP éè´ç³è¯·") |
| | | @RestController |
| | | @RequestMapping("/erp/purchase-request") |
| | | @Validated |
| | | public class ErpPurchaseRequestController { |
| | | |
| | | @Resource |
| | | private ErpPurchaseRequestService purchaseRequestService; |
| | | @Resource |
| | | private ErpSupplierService supplierService; |
| | | |
| | | @Resource |
| | | private MdmItemApi mdmItemApi; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建éè´ç³è¯·") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:create')") |
| | | public CommonResult<Long> createPurchaseRequest(@Valid @RequestBody ErpPurchaseRequestSaveReqVO createReqVO) { |
| | | return success(purchaseRequestService.createPurchaseRequest(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°éè´ç³è¯·") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:update')") |
| | | public CommonResult<Boolean> updatePurchaseRequest(@Valid @RequestBody ErpPurchaseRequestSaveReqVO updateReqVO) { |
| | | purchaseRequestService.updatePurchaseRequest(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤éè´ç³è¯·") |
| | | @Parameter(name = "ids", description = "ç¼å·æ°ç»", required = true) |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:delete')") |
| | | public CommonResult<Boolean> deletePurchaseRequest(@RequestParam("ids") List<Long> ids) { |
| | | purchaseRequestService.deletePurchaseRequest(ids); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾éè´ç³è¯·") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:query')") |
| | | public CommonResult<ErpPurchaseRequestRespVO> getPurchaseRequest(@RequestParam("id") Long id) { |
| | | ErpPurchaseRequestDO purchaseRequest = purchaseRequestService.getPurchaseRequest(id); |
| | | if (purchaseRequest == null) { |
| | | return success(null); |
| | | } |
| | | List<ErpPurchaseRequestItemDO> purchaseRequestItemList = purchaseRequestService.getPurchaseRequestItemListByRequestId(id); |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(purchaseRequestItemList, ErpPurchaseRequestItemDO::getProductId)); |
| | | return success(BeanUtils.toBean(purchaseRequest, ErpPurchaseRequestRespVO.class, purchaseRequestVO -> |
| | | purchaseRequestVO.setItems(BeanUtils.toBean(purchaseRequestItemList, ErpPurchaseRequestRespVO.Item.class, item -> { |
| | | MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName()) |
| | | .setProductBarCode(mdmItem.getBarCode())); |
| | | })))); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾éè´ç³è¯·å页") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:query')") |
| | | public CommonResult<PageResult<ErpPurchaseRequestRespVO>> getPurchaseRequestPage(@Valid ErpPurchaseRequestPageReqVO pageReqVO) { |
| | | PageResult<ErpPurchaseRequestDO> pageResult = purchaseRequestService.getPurchaseRequestPage(pageReqVO); |
| | | return success(buildPurchaseRequestVOPageResult(pageResult)); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºéè´ç³è¯· Excel") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportPurchaseRequestExcel(@Valid ErpPurchaseRequestPageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | List<ErpPurchaseRequestRespVO> list = buildPurchaseRequestVOPageResult(purchaseRequestService.getPurchaseRequestPage(pageReqVO)).getList(); |
| | | ExcelUtils.write(response, "éè´ç³è¯·.xls", "æ°æ®", ErpPurchaseRequestRespVO.class, list); |
| | | } |
| | | |
| | | @PutMapping("/submit") |
| | | @Operation(summary = "æäº¤éè´ç³è¯·å®¡æ¹") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:submit')") |
| | | public CommonResult<Boolean> submitPurchaseRequest(@RequestParam("id") Long id, |
| | | @RequestParam("processDefinitionKey") String processDefinitionKey) { |
| | | Long userId = getLoginUserId(); |
| | | purchaseRequestService.submitPurchaseRequest(id, processDefinitionKey, userId); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/approve-process-list") |
| | | @Operation(summary = "è·åéè´ç³è¯·å®¡æ¹æµç¨å表") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:query')") |
| | | public CommonResult<List<Map<String, Object>>> getApproveProcessList() { |
| | | return success(purchaseRequestService.getPurchaseRequestApproveProcessDefinitionList()); |
| | | } |
| | | |
| | | @PostMapping("/generate-order") |
| | | @Operation(summary = "çæéè´è®¢å") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-request:generate-order')") |
| | | public CommonResult<Long> generatePurchaseOrder(@RequestParam("id") Long id, |
| | | @RequestParam("supplierId") Long supplierId) { |
| | | return success(purchaseRequestService.generatePurchaseOrder(id, supplierId)); |
| | | } |
| | | |
| | | private PageResult<ErpPurchaseRequestRespVO> buildPurchaseRequestVOPageResult(PageResult<ErpPurchaseRequestDO> pageResult) { |
| | | if (CollUtil.isEmpty(pageResult.getList())) { |
| | | return PageResult.empty(pageResult.getTotal()); |
| | | } |
| | | // 1.1 ç³è¯·æç» |
| | | List<ErpPurchaseRequestItemDO> purchaseRequestItemList = purchaseRequestService.getPurchaseRequestItemListByRequestIds( |
| | | convertSet(pageResult.getList(), ErpPurchaseRequestDO::getId)); |
| | | Map<Long, List<ErpPurchaseRequestItemDO>> purchaseRequestItemMap = convertMultiMap(purchaseRequestItemList, ErpPurchaseRequestItemDO::getRequestId); |
| | | // 1.2 ç©æä¿¡æ¯ |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(purchaseRequestItemList, ErpPurchaseRequestItemDO::getProductId)); |
| | | // 1.3 ä¾åºåä¿¡æ¯ |
| | | Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap( |
| | | convertSet(pageResult.getList(), ErpPurchaseRequestDO::getSupplierId)); |
| | | // 1.4 ç¨æ·ä¿¡æ¯ |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( |
| | | convertSet(pageResult.getList(), ErpPurchaseRequestDO::getRequestUserId)); |
| | | // 1.5 é¨é¨ä¿¡æ¯ |
| | | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap( |
| | | convertSet(pageResult.getList(), ErpPurchaseRequestDO::getRequestDeptId)); |
| | | // 2. å¼å§æ¼æ¥ |
| | | return BeanUtils.toBean(pageResult, ErpPurchaseRequestRespVO.class, purchaseRequest -> { |
| | | purchaseRequest.setItems(BeanUtils.toBean(purchaseRequestItemMap.get(purchaseRequest.getId()), ErpPurchaseRequestRespVO.Item.class, |
| | | item -> MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName()) |
| | | .setProductBarCode(mdmItem.getBarCode())))); |
| | | purchaseRequest.setProductNames(CollUtil.join(purchaseRequest.getItems(), "ï¼", ErpPurchaseRequestRespVO.Item::getProductName)); |
| | | MapUtils.findAndThen(supplierMap, purchaseRequest.getSupplierId(), supplier -> purchaseRequest.setSupplierName(supplier.getName())); |
| | | MapUtils.findAndThen(userMap, purchaseRequest.getRequestUserId(), user -> purchaseRequest.setRequestUserName(user.getNickname())); |
| | | MapUtils.findAndThen(deptMap, purchaseRequest.getRequestDeptId(), dept -> purchaseRequest.setRequestDeptName(dept.getName())); |
| | | }); |
| | | } |
| | | |
| | | } |
| | |
| | | @Schema(description = "éè´å
¥åºæ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") |
| | | private BigDecimal inCount; |
| | | |
| | | @Schema(description = "å
¥åºç¶æï¼0:æªå
¥åº 1:é¨åå
¥åº 2:å
¨é¨å
¥åºï¼", example = "0") |
| | | private Integer inStatus; |
| | | |
| | | // ========== éè´éè´§ï¼åºåºï¼ï¼ ========== |
| | | |
| | | @Schema(description = "éè´éè´§æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") |
| | |
| | | private String productUnitName; |
| | | |
| | | @Schema(description = "åºåæ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") |
| | | private BigDecimal stockCount; // è¯¥åæ®µä»
ä»
å¨â详æ
âåâç¼è¾âæ¶ä½¿ç¨ |
| | | private BigDecimal stockCount; // è¯¥åæ®µä»
ä»
å¨è¯¦æ
åç¼è¾æ¶ä½¿ç¨ |
| | | |
| | | // ========== è´¨æ£ ========== |
| | | |
| | | @Schema(description = "æ¯å¦éè¦æ¥ææ£éª", example = "true") |
| | | private Boolean qcCheckFlag; |
| | | |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | @Schema(description = "夿³¨", example = "é便") |
| | | private String remark; |
| | | |
| | | @Schema(description = "æ¯å¦éè¦æ¥ææ£éª", example = "true") |
| | | private Boolean qcCheckFlag; |
| | | |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request; |
| | | |
| | | 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; |
| | | |
| | | @Schema(description = "管çåå° - ERP éè´ç³è¯·å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class ErpPurchaseRequestPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "éè´ç³è¯·åå·", example = "CGSQ001") |
| | | private String no; |
| | | |
| | | @Schema(description = "ç³è¯·äººç¼å·", example = "1") |
| | | private Long requestUserId; |
| | | |
| | | @Schema(description = "ç³è¯·é¨é¨ç¼å·", example = "1") |
| | | private Long requestDeptId; |
| | | |
| | | @Schema(description = "ä¾åºåç¼å·", example = "1") |
| | | private Long supplierId; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "ç³è¯·æ¶é´") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | private LocalDateTime[] requestTime; |
| | | |
| | | @Schema(description = "产åç¼å·", example = "1") |
| | | private Long productId; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - ERP éè´ç³è¯· Response VO") |
| | | @Data |
| | | public class ErpPurchaseRequestRespVO { |
| | | |
| | | @Schema(description = "ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "éè´ç³è¯·åå·", requiredMode = Schema.RequiredMode.REQUIRED, example = "CGSQ001") |
| | | private String no; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "ç³è¯·äººç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long requestUserId; |
| | | |
| | | @Schema(description = "ç³è¯·äººå§å", example = "å¼ ä¸") |
| | | private String requestUserName; |
| | | |
| | | @Schema(description = "ç³è¯·é¨é¨ç¼å·", example = "1") |
| | | private Long requestDeptId; |
| | | |
| | | @Schema(description = "ç³è¯·é¨é¨åç§°", example = "ç产é¨") |
| | | private String requestDeptName; |
| | | |
| | | @Schema(description = "ç³è¯·æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private LocalDateTime requestTime; |
| | | |
| | | @Schema(description = "ç³è¯·çç±", example = "ç产éè¦") |
| | | private String requestReason; |
| | | |
| | | @Schema(description = "ä¾åºåç¼å·", example = "1") |
| | | private Long supplierId; |
| | | |
| | | @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 = "åè®¡ä»·æ ¼", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private BigDecimal totalPrice; |
| | | |
| | | @Schema(description = "产ååç§°å表", example = "产åA,产åB") |
| | | private String productNames; |
| | | |
| | | @Schema(description = "çæçéè´è®¢åç¼å·", example = "1") |
| | | private Long orderId; |
| | | |
| | | @Schema(description = "çæçéè´è®¢åå·", example = "CGDD001") |
| | | private String orderNo; |
| | | |
| | | @Schema(description = "å
¥åºç¶æï¼0:æªå
¥åº 1:é¨åå
¥åº 2:å
¨é¨å
¥åºï¼", example = "0") |
| | | private Integer inStatus; |
| | | |
| | | @Schema(description = "éä»¶å°å", example = "https://xxx.com/xxx.pdf") |
| | | private String fileUrl; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | @Schema(description = "ç³è¯·æç»å表") |
| | | private java.util.List<Item> items; |
| | | |
| | | @Schema(description = "ç³è¯·æç»é¡¹") |
| | | @Data |
| | | public static class Item { |
| | | |
| | | @Schema(description = "ç¼å·", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "产åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long productId; |
| | | |
| | | @Schema(description = "产ååç§°", example = "产åA") |
| | | private String productName; |
| | | |
| | | @Schema(description = "äº§åæ¡ç ", example = "12345678") |
| | | private String productBarCode; |
| | | |
| | | @Schema(description = "产ååä½ç¼å·", example = "1") |
| | | private Long productUnitId; |
| | | |
| | | @Schema(description = "产ååä½åç§°", example = "个") |
| | | private String productUnitName; |
| | | |
| | | @Schema(description = "产ååèåä»·", example = "100.00") |
| | | private BigDecimal productPrice; |
| | | |
| | | @Schema(description = "æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | private BigDecimal count; |
| | | |
| | | @Schema(description = "æ»ä»·", example = "1000.00") |
| | | private BigDecimal totalPrice; |
| | | |
| | | @Schema(description = "ç¨çï¼ç¾åæ¯", example = "13") |
| | | private BigDecimal taxPercent; |
| | | |
| | | @Schema(description = "ç¨é¢", example = "130.00") |
| | | private BigDecimal taxPrice; |
| | | |
| | | @Schema(description = "éæ±æ¥æ") |
| | | private LocalDateTime demandTime; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "æ¯å¦éè¦æ¥ææ£éª", example = "true") |
| | | private Boolean qcCheckFlag; |
| | | |
| | | @Schema(description = "å
¥åºæ°é", example = "10.00") |
| | | private BigDecimal inCount; |
| | | |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.Valid; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - ERP éè´ç³è¯·æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class ErpPurchaseRequestSaveReqVO { |
| | | |
| | | @Schema(description = "ç¼å·ï¼ä¿®æ¹æ¶å¿
å¡«ï¼", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç³è¯·æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "ç³è¯·æ¶é´ä¸è½ä¸ºç©º") |
| | | private LocalDateTime requestTime; |
| | | |
| | | @Schema(description = "ç³è¯·çç±", example = "ç产éè¦") |
| | | private String requestReason; |
| | | |
| | | @Schema(description = "ä¾åºåç¼å·", example = "1") |
| | | private Long supplierId; |
| | | |
| | | @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 = "ç³è¯·æç»å表", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotEmpty(message = "ç³è¯·æç»ä¸è½ä¸ºç©º") |
| | | @Valid |
| | | private List<Item> items; |
| | | |
| | | @Schema(description = "ç³è¯·æç»é¡¹") |
| | | @Data |
| | | public static class Item { |
| | | |
| | | @Schema(description = "ç¼å·ï¼ä¿®æ¹æ¶å¿
å¡«ï¼", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "产åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "产åç¼å·ä¸è½ä¸ºç©º") |
| | | private Long productId; |
| | | |
| | | @Schema(description = "产ååä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "产ååä½ä¸è½ä¸ºç©º") |
| | | private Long productUnitId; |
| | | |
| | | @Schema(description = "产ååèåä»·", example = "100.00") |
| | | private BigDecimal productPrice; |
| | | |
| | | @Schema(description = "æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | @NotNull(message = "æ°éä¸è½ä¸ºç©º") |
| | | private BigDecimal count; |
| | | |
| | | @Schema(description = "ç¨çï¼ç¾åæ¯", example = "13") |
| | | private BigDecimal taxPercent; |
| | | |
| | | @Schema(description = "éæ±æ¥æ") |
| | | private LocalDateTime demandTime; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "æ¯å¦éè¦æ¥ææ£éª", example = "true") |
| | | private Boolean qcCheckFlag; |
| | | |
| | | @Schema(description = "产ååç§°ï¼å端å±ç¤ºç¨ï¼å端忽ç¥ï¼", example = "产åA") |
| | | private String productName; |
| | | |
| | | @Schema(description = "äº§åæ¡ç ï¼å端å±ç¤ºç¨ï¼å端忽ç¥ï¼", example = "12345678") |
| | | private String productBarCode; |
| | | |
| | | @Schema(description = "产ååä½åç§°ï¼å端å±ç¤ºç¨ï¼å端忽ç¥ï¼", example = "个") |
| | | private String productUnitName; |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | */ |
| | | private Integer inStatus; |
| | | |
| | | /** |
| | | * BPM æµç¨å®ä¾ç¼å· |
| | | */ |
| | | private String processInstanceId; |
| | | |
| | | } |
| | |
| | | */ |
| | | private Long orderId; |
| | | /** |
| | | * éè´ç³è¯·æç»ç¼å· |
| | | * |
| | | * å
³è {@link ErpPurchaseRequestItemDO#getId()} |
| | | */ |
| | | private Long requestItemId; |
| | | /** |
| | | * ç©æç¼å· |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO#getId()} |
| | |
| | | */ |
| | | private BigDecimal returnCount; |
| | | |
| | | // ========== è´¨æ£ ========== |
| | | /** |
| | | * æ¯å¦éè¦æ¥ææ£éª |
| | | */ |
| | | private Boolean qcCheckFlag; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.dataobject.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯· DO |
| | | */ |
| | | @TableName("erp_purchase_request") |
| | | @KeySequence("erp_purchase_request_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class ErpPurchaseRequestDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * éè´ç³è¯·åå· |
| | | */ |
| | | private String no; |
| | | |
| | | /** |
| | | * ç¶æ |
| | | * |
| | | * 0: æªæäº¤ |
| | | * 10: 审æ¹ä¸ |
| | | * 20: å®¡æ ¸éè¿ |
| | | * 30: å®¡æ ¸ä¸éè¿ |
| | | * 40: 已忶 |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * ç³è¯·äººç¼å· |
| | | */ |
| | | private Long requestUserId; |
| | | |
| | | /** |
| | | * ç³è¯·é¨é¨ç¼å· |
| | | */ |
| | | private Long requestDeptId; |
| | | |
| | | /** |
| | | * ç³è¯·æ¶é´ |
| | | */ |
| | | private LocalDateTime requestTime; |
| | | |
| | | /** |
| | | * ç³è¯·çç± |
| | | */ |
| | | private String requestReason; |
| | | |
| | | /** |
| | | * ä¾åºåç¼å·ï¼å¯éï¼ |
| | | */ |
| | | private Long supplierId; |
| | | |
| | | /** |
| | | * å计æ°é |
| | | */ |
| | | private BigDecimal totalCount; |
| | | |
| | | /** |
| | | * åè®¡ä»·æ ¼ |
| | | */ |
| | | private BigDecimal totalPrice; |
| | | |
| | | /** |
| | | * å计产åä»·æ ¼ |
| | | */ |
| | | private BigDecimal totalProductPrice; |
| | | |
| | | /** |
| | | * å计ç¨é¢ |
| | | */ |
| | | private BigDecimal totalTaxPrice; |
| | | |
| | | /** |
| | | * 伿 çï¼ç¾åæ¯ |
| | | */ |
| | | private BigDecimal discountPercent; |
| | | |
| | | /** |
| | | * 伿 éé¢ |
| | | */ |
| | | private BigDecimal discountPrice; |
| | | |
| | | /** |
| | | * å®ééé¢ |
| | | */ |
| | | private BigDecimal depositPrice; |
| | | |
| | | /** |
| | | * éä»¶å°å |
| | | */ |
| | | private String fileUrl; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | /** |
| | | * BPM æµç¨å®ä¾ç¼å· |
| | | */ |
| | | private String processInstanceId; |
| | | |
| | | /** |
| | | * çæçéè´è®¢åç¼å· |
| | | */ |
| | | private Long orderId; |
| | | |
| | | /** |
| | | * çæçéè´è®¢åå· |
| | | */ |
| | | private String orderNo; |
| | | |
| | | /** |
| | | * å
¥åºç¶æ |
| | | * |
| | | * 0: æªå
¥åº |
| | | * 1: é¨åå
¥åº |
| | | * 2: å
¨é¨å
¥åº |
| | | */ |
| | | private Integer inStatus; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.dataobject.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯·æç» DO |
| | | */ |
| | | @TableName("erp_purchase_request_items") |
| | | @KeySequence("erp_purchase_request_items_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class ErpPurchaseRequestItemDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * éè´ç³è¯·ç¼å· |
| | | */ |
| | | private Long requestId; |
| | | |
| | | /** |
| | | * 产åç¼å· |
| | | */ |
| | | private Long productId; |
| | | |
| | | /** |
| | | * 产ååä½ç¼å· |
| | | */ |
| | | private Long productUnitId; |
| | | |
| | | /** |
| | | * 产ååèåä»· |
| | | */ |
| | | private BigDecimal productPrice; |
| | | |
| | | /** |
| | | * æ°é |
| | | */ |
| | | private BigDecimal count; |
| | | |
| | | /** |
| | | * æ»ä»· |
| | | */ |
| | | private BigDecimal totalPrice; |
| | | |
| | | /** |
| | | * ç¨çï¼ç¾åæ¯ |
| | | */ |
| | | private BigDecimal taxPercent; |
| | | |
| | | /** |
| | | * ç¨é¢ |
| | | */ |
| | | private BigDecimal taxPrice; |
| | | |
| | | /** |
| | | * éæ±æ¥æ |
| | | */ |
| | | private LocalDateTime demandTime; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | /** |
| | | * æ¯å¦éè¦æ¥ææ£éª |
| | | */ |
| | | private Boolean qcCheckFlag; |
| | | |
| | | /** |
| | | * å
¥åºæ°é |
| | | */ |
| | | private BigDecimal inCount; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.mysql.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestItemDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯·æç» Mapper |
| | | */ |
| | | @Mapper |
| | | public interface ErpPurchaseRequestItemMapper extends BaseMapperX<ErpPurchaseRequestItemDO> { |
| | | |
| | | default List<ErpPurchaseRequestItemDO> selectListByRequestId(Long requestId) { |
| | | return selectList(ErpPurchaseRequestItemDO::getRequestId, requestId); |
| | | } |
| | | |
| | | default List<ErpPurchaseRequestItemDO> selectListByRequestIds(Collection<Long> requestIds) { |
| | | return selectList(ErpPurchaseRequestItemDO::getRequestId, requestIds); |
| | | } |
| | | |
| | | default void deleteByRequestId(Long requestId) { |
| | | delete(new LambdaQueryWrapperX<ErpPurchaseRequestItemDO>().eq(ErpPurchaseRequestItemDO::getRequestId, requestId)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.mysql.purchase; |
| | | |
| | | 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.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯· Mapper |
| | | */ |
| | | @Mapper |
| | | public interface ErpPurchaseRequestMapper extends BaseMapperX<ErpPurchaseRequestDO> { |
| | | |
| | | default ErpPurchaseRequestDO selectByNo(String no) { |
| | | return selectOne(ErpPurchaseRequestDO::getNo, no); |
| | | } |
| | | |
| | | default List<ErpPurchaseRequestDO> selectRequestListByIds(Collection<Long> ids) { |
| | | return selectList(ErpPurchaseRequestDO::getId, ids); |
| | | } |
| | | |
| | | default List<ErpPurchaseRequestDO> selectList(Long supplierId, Integer status) { |
| | | return selectList(new LambdaQueryWrapperX<ErpPurchaseRequestDO>() |
| | | .eqIfPresent(ErpPurchaseRequestDO::getSupplierId, supplierId) |
| | | .eqIfPresent(ErpPurchaseRequestDO::getStatus, status)); |
| | | } |
| | | |
| | | default PageResult<ErpPurchaseRequestDO> selectPage(ErpPurchaseRequestPageReqVO pageReqVO) { |
| | | return selectPage(pageReqVO, new LambdaQueryWrapperX<ErpPurchaseRequestDO>() |
| | | .likeIfPresent(ErpPurchaseRequestDO::getNo, pageReqVO.getNo()) |
| | | .eqIfPresent(ErpPurchaseRequestDO::getRequestUserId, pageReqVO.getRequestUserId()) |
| | | .eqIfPresent(ErpPurchaseRequestDO::getRequestDeptId, pageReqVO.getRequestDeptId()) |
| | | .eqIfPresent(ErpPurchaseRequestDO::getSupplierId, pageReqVO.getSupplierId()) |
| | | .eqIfPresent(ErpPurchaseRequestDO::getStatus, pageReqVO.getStatus()) |
| | | .betweenIfPresent(ErpPurchaseRequestDO::getRequestTime, pageReqVO.getRequestTime()) |
| | | .orderByDesc(ErpPurchaseRequestDO::getId)); |
| | | } |
| | | |
| | | } |
| | |
| | | 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} |
| | | */ |
| | | public static final String FINANCE_PAYMENT_NO_PREFIX = "FKD"; |
| | |
| | | @Getter |
| | | public enum ErpAuditStatus implements ArrayValuable<Integer> { |
| | | |
| | | PROCESS(10, "æªå®¡æ ¸"), // å®¡æ ¸ä¸ |
| | | PROCESS(10, "æªå®¡æ ¸"), // æªå®¡æ ¸/è稿 |
| | | APPROVING(15, "审æ¹ä¸"), // 审æ¹ä¸ |
| | | APPROVE(20, "å·²å®¡æ ¸"), // å®¡æ ¸éè¿ |
| | | CANCEL(30, "å·²ä½åº"); // å·²ä½åº/å·²æ¤é |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯·ç¶ææä¸¾ |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum ErpPurchaseRequestStatusEnum implements ArrayValuable<Integer> { |
| | | |
| | | DRAFT(0, "æªæäº¤"), |
| | | PROCESS(10, "审æ¹ä¸"), |
| | | APPROVE(20, "å®¡æ ¸éè¿"), |
| | | REJECT(30, "å®¡æ ¸ä¸éè¿"), |
| | | CANCEL(40, "已忶"); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(ErpPurchaseRequestStatusEnum::getStatus).toArray(Integer[]::new); |
| | | |
| | | /** |
| | | * ç¶æ |
| | | */ |
| | | private final Integer status; |
| | | /** |
| | | * ç¶æå |
| | | */ |
| | | private final String name; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| | |
| | | ErrorCode PURCHASE_ORDER_PROCESS_FAIL_EXISTS_RETURN = new ErrorCode(1_030_101_010, "åå®¡æ ¸å¤±è´¥ï¼å·²åå¨å¯¹åºçéè´éè´§å"); |
| | | 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 updatePurchaseOrderStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * æäº¤éè´è®¢åå®¡æ¹ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param processDefinitionKey æµç¨å®ä¹ Key |
| | | * @param userId ç¨æ·ç¼å· |
| | | */ |
| | | void submitPurchaseOrder(Long id, String processDefinitionKey, Long userId); |
| | | |
| | | /** |
| | | * è·åéè´è®¢åå®¡æ¹æµç¨å表 |
| | | * |
| | | * @return æµç¨å®ä¹å表 |
| | | */ |
| | | List<Map<String, Object>> getPurchaseOrderApproveProcessDefinitionList(); |
| | | |
| | | /** |
| | | * æ´æ°éè´è®¢å审æ¹ç»æï¼BPM åè°ï¼ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | */ |
| | | void updatePurchaseOrderAuditStatus(Long id, Integer bpmResult); |
| | | |
| | | /** |
| | | * æ´æ°éè´è®¢åçå
¥åºæ°é |
| | | * |
| | | * @param id ç¼å· |
| | |
| | | */ |
| | | void updatePurchaseOrderInStatus(Long orderId); |
| | | |
| | | /** |
| | | * 确认æ¶è´§ |
| | | * |
| | | * çæå°è´§éç¥åï¼ç¶æä¸ºå¾
å
¥åº |
| | | * |
| | | * @param id éè´è®¢åç¼å· |
| | | * @return å°è´§éç¥åç¼å· |
| | | */ |
| | | Long confirmReceipt(Long id); |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO; |
| | | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; |
| | | import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderPageReqVO; |
| | | 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; |
| | |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService { |
| | | |
| | | /** |
| | | * BPM éè´è®¢å审æ¹åç±»ç¼ç |
| | | */ |
| | | private static final String PURCHASE_ORDER_APPROVE_CATEGORY_CODE = "purchase_request_approve"; |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderMapper purchaseOrderMapper; |
| | |
| | | private ErpSupplierService supplierService; |
| | | @Resource |
| | | private ErpAccountService accountService; |
| | | |
| | | @Resource |
| | | private BpmProcessInstanceApi processInstanceApi; |
| | | @Resource |
| | | 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) |
| | |
| | | throw exception(PURCHASE_ORDER_NO_EXISTS); |
| | | } |
| | | |
| | | // 2.1 æå
¥è®¢åï¼éè´è®¢åä¸éè¦å®¡æ¹ï¼ç´æ¥ä¸ºå·²å®¡æ ¸ç¶æï¼ |
| | | // 2.1 æå
¥è®¢åï¼éè´è®¢åå建å为æªå®¡æ ¸ç¶æï¼éè¦æäº¤å®¡æ¹ï¼ |
| | | ErpPurchaseOrderDO purchaseOrder = BeanUtils.toBean(createReqVO, ErpPurchaseOrderDO.class, in -> in |
| | | .setNo(no).setStatus(ErpAuditStatus.APPROVE.getStatus())); |
| | | .setNo(no).setStatus(ErpAuditStatus.PROCESS.getStatus()) |
| | | .setInCount(BigDecimal.ZERO).setInStatus(ErpPurchaseOrderInStatusEnum.NOT_IN.getStatus())); |
| | | calculateTotalPrice(purchaseOrder, purchaseOrderItems); |
| | | purchaseOrderMapper.insert(purchaseOrder); |
| | | // 2.2 æå
¥è®¢å项 |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updatePurchaseOrderStatus(Long id, Integer status) { |
| | | // éè´è®¢åä¸åæ¯æç¶ææµè½¬ï¼ä¸éè¦å®¡æ¹ï¼ |
| | | // æ¤æ¹æ³ä¿çç¨äºç¹æ®æ
åµï¼å¦åå®¡æ ¸åéæ°å®¡æ ¸ï¼ |
| | | boolean approve = ErpAuditStatus.APPROVE.getStatus().equals(status); |
| | | // 1.1 æ ¡éªåå¨ |
| | | ErpPurchaseOrderDO purchaseOrder = validatePurchaseOrderExists(id); |
| | |
| | | if (updateCount == 0) { |
| | | throw exception(approve ? PURCHASE_ORDER_APPROVE_FAIL : PURCHASE_ORDER_PROCESS_FAIL); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitPurchaseOrder(Long id, String processDefinitionKey, Long userId) { |
| | | // 1. æ ¡éªåå¨ + æªå®¡æ ¸ç¶æ |
| | | ErpPurchaseOrderDO purchaseOrder = validatePurchaseOrderExists(id); |
| | | if (!ErpAuditStatus.PROCESS.getStatus().equals(purchaseOrder.getStatus())) { |
| | | throw exception(PURCHASE_ORDER_SUBMIT_FAIL_STATUS); |
| | | } |
| | | |
| | | // 2. å建 BPM æµç¨å®ä¾ |
| | | String processInstanceId = processInstanceApi.createProcessInstance(userId, |
| | | new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(processDefinitionKey) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | |
| | | // 3. æ´æ°éè´è®¢åç¶æä¸ºå®¡æ¹ä¸ |
| | | purchaseOrderMapper.updateById(new ErpPurchaseOrderDO() |
| | | .setId(id) |
| | | .setStatus(ErpAuditStatus.APPROVING.getStatus()) |
| | | .setProcessInstanceId(processInstanceId)); |
| | | } |
| | | |
| | | @Override |
| | | public List<Map<String, Object>> getPurchaseOrderApproveProcessDefinitionList() { |
| | | // 1. æ ¡éªåç±»åæµç¨å®ä¹æ¯å¦åå¨ |
| | | validatePurchaseOrderApproveCategoryAndProcessDefinition(); |
| | | |
| | | // 2. è·ååç±»ä¸çæµç¨å®ä¹ä¿¡æ¯ |
| | | List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService |
| | | .getProcessDefinitionInfoListByCategory(PURCHASE_ORDER_APPROVE_CATEGORY_CODE); |
| | | if (CollUtil.isEmpty(definitionInfoList)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | |
| | | // 3. éåè·åæµç¨å®ä¹è¯¦æ
ï¼è¿æ»¤æ¿æ´»ç¶æï¼ä¿çææ°çæ¬ |
| | | Map<String, ProcessDefinition> latestVersionMap = new HashMap<>(); |
| | | for (BpmProcessDefinitionInfoDO info : definitionInfoList) { |
| | | ProcessDefinition pd = bpmProcessDefinitionService.getProcessDefinition(info.getProcessDefinitionId()); |
| | | if (pd == null || pd.isSuspended()) { |
| | | continue; |
| | | } |
| | | ProcessDefinition existing = latestVersionMap.get(pd.getKey()); |
| | | if (existing == null || pd.getVersion() > existing.getVersion()) { |
| | | latestVersionMap.put(pd.getKey(), pd); |
| | | } |
| | | } |
| | | |
| | | // 4. è¿åæµç¨å®ä¹å表 |
| | | List<Map<String, Object>> result = new ArrayList<>(); |
| | | for (ProcessDefinition pd : latestVersionMap.values()) { |
| | | Map<String, Object> item = new HashMap<>(); |
| | | item.put("id", pd.getId()); |
| | | item.put("key", pd.getKey()); |
| | | item.put("name", pd.getName()); |
| | | result.add(item); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updatePurchaseOrderAuditStatus(Long id, Integer bpmResult) { |
| | | // 1. æ ¡éªåå¨ |
| | | ErpPurchaseOrderDO purchaseOrder = validatePurchaseOrderExists(id); |
| | | if (!ErpAuditStatus.APPROVING.getStatus().equals(purchaseOrder.getStatus())) { |
| | | log.warn("[updatePurchaseOrderAuditStatus] éè´è®¢å({}) ä¸å¤äºå®¡æ¹ä¸ç¶æ", id); |
| | | return; |
| | | } |
| | | |
| | | // 2. æ ¹æ®å®¡æ¹ç»ææ´æ°ç¶æ |
| | | Integer newStatus = convertBpmResultToAuditStatus(bpmResult); |
| | | if (newStatus != null) { |
| | | purchaseOrderMapper.updateById(new ErpPurchaseOrderDO() |
| | | .setId(id).setStatus(newStatus)); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªéè´è®¢å审æ¹åç±»åæµç¨å®ä¹æ¯å¦åå¨ |
| | | */ |
| | | private void validatePurchaseOrderApproveCategoryAndProcessDefinition() { |
| | | // 1. æ ¡éªåç±»æ¯å¦åå¨ |
| | | List<BpmCategoryDO> categories = bpmCategoryService.getCategoryListByCode( |
| | | Collections.singletonList(PURCHASE_ORDER_APPROVE_CATEGORY_CODE)); |
| | | if (CollUtil.isEmpty(categories)) { |
| | | throw exception(PURCHASE_ORDER_BPM_CATEGORY_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è½¬æ¢ BPM 审æ¹ç»æä¸ºå®¡æ ¸ç¶æ |
| | | */ |
| | | private Integer convertBpmResultToAuditStatus(Integer bpmResult) { |
| | | if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmResult)) { |
| | | return ErpAuditStatus.APPROVE.getStatus(); |
| | | } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmResult)) { |
| | | return ErpAuditStatus.PROCESS.getStatus(); |
| | | } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmResult)) { |
| | | return ErpAuditStatus.CANCEL.getStatus(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private List<ErpPurchaseOrderItemDO> validatePurchaseOrderItems(List<ErpPurchaseOrderSaveReqVO.Item> list) { |
| | |
| | | if (CollUtil.isEmpty(items)) { |
| | | return; |
| | | } |
| | | // 3. 计ç®å
¥åºç¶æ |
| | | // 3. 计ç®å
¥åºç¶æåæ»å
¥åºæ°é |
| | | int inStatus = calculateInStatus(items); |
| | | // 4. æ´æ°éè´è®¢åå
¥åºç¶æ |
| | | BigDecimal totalInCount = calculateTotalInCount(items); |
| | | // 4. æ´æ°éè´è®¢åå
¥åºç¶æåå
¥åºæ°é |
| | | purchaseOrderMapper.updateById(new ErpPurchaseOrderDO() |
| | | .setId(orderId).setInStatus(inStatus)); |
| | | .setId(orderId).setInStatus(inStatus).setInCount(totalInCount)); |
| | | |
| | | // 5. ååéè´ç³è¯·æç»çå
¥åºæ°éåéè´ç³è¯·çå
¥åºç¶æ |
| | | updatePurchaseRequestInStatus(items, inStatus); |
| | | } |
| | | |
| | | /** |
| | | * è®¡ç®æ»å
¥åºæ°é |
| | | */ |
| | | private BigDecimal calculateTotalInCount(List<ErpPurchaseOrderItemDO> items) { |
| | | BigDecimal total = BigDecimal.ZERO; |
| | | for (ErpPurchaseOrderItemDO item : items) { |
| | | if (item.getInCount() != null) { |
| | | total = total.add(item.getInCount()); |
| | | } |
| | | } |
| | | return total; |
| | | } |
| | | |
| | | /** |
| | | * ååéè´ç³è¯·å
¥åºæ°éåå
¥åºç¶æ |
| | | * |
| | | * @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; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseRequestItemDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯· Service æ¥å£ |
| | | */ |
| | | public interface ErpPurchaseRequestService { |
| | | |
| | | /** |
| | | * å建éè´ç³è¯· |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return ç¼å· |
| | | */ |
| | | Long createPurchaseRequest(@Valid ErpPurchaseRequestSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°éè´ç³è¯· |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updatePurchaseRequest(@Valid ErpPurchaseRequestSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤éè´ç³è¯· |
| | | * |
| | | * @param ids ç¼å·æ°ç» |
| | | */ |
| | | void deletePurchaseRequest(List<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾éè´ç³è¯· |
| | | * |
| | | * @param id ç¼å· |
| | | * @return éè´ç³è¯· |
| | | */ |
| | | ErpPurchaseRequestDO getPurchaseRequest(Long id); |
| | | |
| | | /** |
| | | * è·å¾éè´ç³è¯·å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return éè´ç³è¯·å页 |
| | | */ |
| | | PageResult<ErpPurchaseRequestDO> getPurchaseRequestPage(ErpPurchaseRequestPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾éè´ç³è¯·é¡¹å表 |
| | | * |
| | | * @param requestId éè´ç³è¯·ç¼å· |
| | | * @return éè´ç³è¯·é¡¹å表 |
| | | */ |
| | | List<ErpPurchaseRequestItemDO> getPurchaseRequestItemListByRequestId(Long requestId); |
| | | |
| | | /** |
| | | * è·å¾éè´ç³è¯·é¡¹ List |
| | | * |
| | | * @param requestIds éè´ç³è¯·ç¼å·æ°ç» |
| | | * @return éè´ç³è¯·é¡¹ List |
| | | */ |
| | | List<ErpPurchaseRequestItemDO> getPurchaseRequestItemListByRequestIds(Collection<Long> requestIds); |
| | | |
| | | /** |
| | | * æäº¤éè´ç³è¯·å®¡æ¹ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param processDefinitionKey æµç¨å®ä¹ Key |
| | | * @param userId ç¨æ·ç¼å· |
| | | */ |
| | | void submitPurchaseRequest(Long id, String processDefinitionKey, Long userId); |
| | | |
| | | /** |
| | | * è·åéè´ç³è¯·å®¡æ¹æµç¨å表 |
| | | * |
| | | * @return æµç¨å®ä¹å表 |
| | | */ |
| | | List<Map<String, Object>> getPurchaseRequestApproveProcessDefinitionList(); |
| | | |
| | | /** |
| | | * æ´æ°éè´ç³è¯·å®¡æ¹ç»æï¼BPM åè°ï¼ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | */ |
| | | void updatePurchaseRequestAuditStatus(Long id, Integer bpmResult); |
| | | |
| | | /** |
| | | * çæéè´è®¢å |
| | | * |
| | | * @param id éè´ç³è¯·ç¼å· |
| | | * @param supplierId ä¾åºåç¼å· |
| | | * @return éè´è®¢åç¼å· |
| | | */ |
| | | Long generatePurchaseOrder(Long id, Long supplierId); |
| | | |
| | | /** |
| | | * æ ¹æ®ç¼å·å表è·åéè´ç³è¯·å表 |
| | | * |
| | | * @param ids ç¼å·å表 |
| | | * @return éè´ç³è¯·å表 |
| | | */ |
| | | List<ErpPurchaseRequestDO> getPurchaseRequestList(List<Long> ids); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.purchase; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO; |
| | | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; |
| | | import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.request.ErpPurchaseRequestSaveReqVO; |
| | | 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.ErpPurchaseRequestStatusEnum; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.flowable.engine.repository.ProcessDefinition; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.*; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| | | import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * ERP éè´ç³è¯· Service å®ç°ç±» |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class ErpPurchaseRequestServiceImpl implements ErpPurchaseRequestService { |
| | | |
| | | /** |
| | | * BPM éè´ç³è¯·å®¡æ¹åç±»ç¼ç |
| | | */ |
| | | private static final String PURCHASE_REQUEST_APPROVE_CATEGORY_CODE = "purchase_request_approve"; |
| | | |
| | | @Resource |
| | | private ErpPurchaseRequestMapper purchaseRequestMapper; |
| | | @Resource |
| | | private ErpPurchaseRequestItemMapper purchaseRequestItemMapper; |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderMapper purchaseOrderMapper; |
| | | @Resource |
| | | private ErpPurchaseOrderItemMapper purchaseOrderItemMapper; |
| | | |
| | | @Resource |
| | | private ErpNoRedisDAO noRedisDAO; |
| | | |
| | | @Resource |
| | | private ErpSupplierService supplierService; |
| | | |
| | | @Resource |
| | | private BpmProcessInstanceApi processInstanceApi; |
| | | @Resource |
| | | private BpmCategoryService bpmCategoryService; |
| | | @Resource |
| | | private BpmProcessDefinitionService bpmProcessDefinitionService; |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createPurchaseRequest(ErpPurchaseRequestSaveReqVO createReqVO) { |
| | | // 1. æ ¡éªè®¢åé¡¹çæææ§ |
| | | List<ErpPurchaseRequestItemDO> requestItems = validatePurchaseRequestItems(createReqVO.getItems()); |
| | | // 2. æ ¡éªä¾åºåï¼å¦ææå®ï¼ |
| | | if (createReqVO.getSupplierId() != null) { |
| | | supplierService.validateSupplier(createReqVO.getSupplierId()); |
| | | } |
| | | // 3. çæç³è¯·åå· |
| | | String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_REQUEST_NO_PREFIX); |
| | | if (purchaseRequestMapper.selectByNo(no) != null) { |
| | | throw exception(PURCHASE_REQUEST_NO_EXISTS); |
| | | } |
| | | |
| | | // 4. è·åå½åç¨æ·ä¿¡æ¯ |
| | | Long userId = Long.parseLong(getCurrentUserId()); |
| | | AdminUserRespDTO user = adminUserApi.getUser(userId); |
| | | Long deptId = user != null ? user.getDeptId() : null; |
| | | |
| | | // 5. æå
¥ç³è¯·å |
| | | ErpPurchaseRequestDO purchaseRequest = BeanUtils.toBean(createReqVO, ErpPurchaseRequestDO.class, req -> req |
| | | .setNo(no) |
| | | .setStatus(ErpPurchaseRequestStatusEnum.DRAFT.getStatus()) |
| | | .setRequestUserId(userId) |
| | | .setRequestDeptId(deptId)); |
| | | calculateTotalPrice(purchaseRequest, requestItems); |
| | | purchaseRequestMapper.insert(purchaseRequest); |
| | | |
| | | // 6. æå
¥ç³è¯·æç» |
| | | requestItems.forEach(o -> o.setRequestId(purchaseRequest.getId())); |
| | | purchaseRequestItemMapper.insertBatch(requestItems); |
| | | |
| | | return purchaseRequest.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updatePurchaseRequest(ErpPurchaseRequestSaveReqVO updateReqVO) { |
| | | // 1. æ ¡éªåå¨ + èç¨¿ç¶æ |
| | | ErpPurchaseRequestDO purchaseRequest = validatePurchaseRequestExistsAndDraft(updateReqVO.getId()); |
| | | // 2. æ ¡éªä¾åºåï¼å¦ææå®ï¼ |
| | | if (updateReqVO.getSupplierId() != null) { |
| | | supplierService.validateSupplier(updateReqVO.getSupplierId()); |
| | | } |
| | | // 3. æ ¡éªè®¢åé¡¹çæææ§ |
| | | List<ErpPurchaseRequestItemDO> requestItems = validatePurchaseRequestItems(updateReqVO.getItems()); |
| | | |
| | | // 4. æ´æ°ç³è¯·å |
| | | ErpPurchaseRequestDO updateObj = BeanUtils.toBean(updateReqVO, ErpPurchaseRequestDO.class); |
| | | calculateTotalPrice(updateObj, requestItems); |
| | | purchaseRequestMapper.updateById(updateObj); |
| | | |
| | | // 5. æ´æ°ç³è¯·æç» |
| | | updatePurchaseRequestItemList(updateReqVO.getId(), requestItems); |
| | | } |
| | | |
| | | private void calculateTotalPrice(ErpPurchaseRequestDO purchaseRequest, List<ErpPurchaseRequestItemDO> requestItems) { |
| | | purchaseRequest.setTotalCount(getSumValue(requestItems, ErpPurchaseRequestItemDO::getCount, BigDecimal::add)); |
| | | purchaseRequest.setTotalProductPrice(getSumValue(requestItems, ErpPurchaseRequestItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)); |
| | | purchaseRequest.setTotalTaxPrice(getSumValue(requestItems, ErpPurchaseRequestItemDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO)); |
| | | purchaseRequest.setTotalPrice(purchaseRequest.getTotalProductPrice().add(purchaseRequest.getTotalTaxPrice())); |
| | | // 计ç®ä¼æ ä»·æ ¼ |
| | | if (purchaseRequest.getDiscountPercent() == null) { |
| | | purchaseRequest.setDiscountPercent(BigDecimal.ZERO); |
| | | } |
| | | purchaseRequest.setDiscountPrice(MoneyUtils.priceMultiplyPercent(purchaseRequest.getTotalPrice(), purchaseRequest.getDiscountPercent())); |
| | | purchaseRequest.setTotalPrice(purchaseRequest.getTotalPrice().subtract(purchaseRequest.getDiscountPrice())); |
| | | } |
| | | |
| | | private List<ErpPurchaseRequestItemDO> validatePurchaseRequestItems(List<ErpPurchaseRequestSaveReqVO.Item> list) { |
| | | return convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseRequestItemDO.class, item -> { |
| | | if (item.getProductPrice() != null && item.getCount() != null) { |
| | | item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount())); |
| | | if (item.getTaxPercent() != null) { |
| | | item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent())); |
| | | } |
| | | } |
| | | })); |
| | | } |
| | | |
| | | private void updatePurchaseRequestItemList(Long id, List<ErpPurchaseRequestItemDO> newList) { |
| | | List<ErpPurchaseRequestItemDO> oldList = purchaseRequestItemMapper.selectListByRequestId(id); |
| | | List<List<ErpPurchaseRequestItemDO>> diffList = diffList(oldList, newList, |
| | | (oldVal, newVal) -> oldVal.getId().equals(newVal.getId())); |
| | | |
| | | if (CollUtil.isNotEmpty(diffList.get(0))) { |
| | | diffList.get(0).forEach(o -> o.setRequestId(id)); |
| | | purchaseRequestItemMapper.insertBatch(diffList.get(0)); |
| | | } |
| | | if (CollUtil.isNotEmpty(diffList.get(1))) { |
| | | purchaseRequestItemMapper.updateBatch(diffList.get(1)); |
| | | } |
| | | if (CollUtil.isNotEmpty(diffList.get(2))) { |
| | | purchaseRequestItemMapper.deleteByIds(convertList(diffList.get(2), ErpPurchaseRequestItemDO::getId)); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deletePurchaseRequest(List<Long> ids) { |
| | | List<ErpPurchaseRequestDO> purchaseRequests = purchaseRequestMapper.selectRequestListByIds(ids); |
| | | if (CollUtil.isEmpty(purchaseRequests)) { |
| | | return; |
| | | } |
| | | purchaseRequests.forEach(purchaseRequest -> { |
| | | // åªæèç¨¿ç¶ææè½å é¤ |
| | | if (!ErpPurchaseRequestStatusEnum.DRAFT.getStatus().equals(purchaseRequest.getStatus())) { |
| | | throw exception(PURCHASE_REQUEST_DELETE_FAIL_NOT_DRAFT, purchaseRequest.getNo()); |
| | | } |
| | | }); |
| | | |
| | | purchaseRequests.forEach(purchaseRequest -> { |
| | | purchaseRequestMapper.deleteById(purchaseRequest.getId()); |
| | | purchaseRequestItemMapper.deleteByRequestId(purchaseRequest.getId()); |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | | public ErpPurchaseRequestDO getPurchaseRequest(Long id) { |
| | | return purchaseRequestMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<ErpPurchaseRequestDO> getPurchaseRequestPage(ErpPurchaseRequestPageReqVO pageReqVO) { |
| | | return purchaseRequestMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public List<ErpPurchaseRequestItemDO> getPurchaseRequestItemListByRequestId(Long requestId) { |
| | | return purchaseRequestItemMapper.selectListByRequestId(requestId); |
| | | } |
| | | |
| | | @Override |
| | | public List<ErpPurchaseRequestItemDO> getPurchaseRequestItemListByRequestIds(Collection<Long> requestIds) { |
| | | if (CollUtil.isEmpty(requestIds)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return purchaseRequestItemMapper.selectListByRequestIds(requestIds); |
| | | } |
| | | |
| | | @Override |
| | | public List<ErpPurchaseRequestDO> getPurchaseRequestList(List<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return purchaseRequestMapper.selectRequestListByIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitPurchaseRequest(Long id, String processDefinitionKey, Long userId) { |
| | | // 1. æ ¡éªåå¨ + èç¨¿ç¶æ |
| | | ErpPurchaseRequestDO purchaseRequest = validatePurchaseRequestExistsAndDraft(id); |
| | | |
| | | // 2. æ ¡éªæ¯å¦ææç» |
| | | List<ErpPurchaseRequestItemDO> items = purchaseRequestItemMapper.selectListByRequestId(id); |
| | | if (CollUtil.isEmpty(items)) { |
| | | throw exception(PURCHASE_REQUEST_NOT_EXISTS); // TODO: æ·»å æç»ä¸ºç©ºçé误ç |
| | | } |
| | | |
| | | // 3. å建 BPM æµç¨å®ä¾ |
| | | String processInstanceId = processInstanceApi.createProcessInstance(userId, |
| | | new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(processDefinitionKey) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | |
| | | // 4. æ´æ°éè´ç³è¯·ç¶æä¸ºå®¡æ¹ä¸ |
| | | purchaseRequestMapper.updateById(new ErpPurchaseRequestDO() |
| | | .setId(id) |
| | | .setStatus(ErpPurchaseRequestStatusEnum.PROCESS.getStatus()) |
| | | .setProcessInstanceId(processInstanceId)); |
| | | } |
| | | |
| | | @Override |
| | | public List<Map<String, Object>> getPurchaseRequestApproveProcessDefinitionList() { |
| | | // 1. æ ¡éªåç±»åæµç¨å®ä¹æ¯å¦åå¨ |
| | | validatePurchaseRequestApproveCategoryAndProcessDefinition(); |
| | | |
| | | // 2. è·ååç±»ä¸çæµç¨å®ä¹ä¿¡æ¯ |
| | | List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService |
| | | .getProcessDefinitionInfoListByCategory(PURCHASE_REQUEST_APPROVE_CATEGORY_CODE); |
| | | if (CollUtil.isEmpty(definitionInfoList)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | |
| | | // 3. éåè·åæµç¨å®ä¹è¯¦æ
ï¼è¿æ»¤æ¿æ´»ç¶æï¼ä¿çææ°çæ¬ |
| | | Map<String, ProcessDefinition> latestVersionMap = new HashMap<>(); |
| | | for (BpmProcessDefinitionInfoDO info : definitionInfoList) { |
| | | ProcessDefinition pd = bpmProcessDefinitionService.getProcessDefinition(info.getProcessDefinitionId()); |
| | | if (pd == null || pd.isSuspended()) { |
| | | continue; |
| | | } |
| | | ProcessDefinition existing = latestVersionMap.get(pd.getKey()); |
| | | if (existing == null || pd.getVersion() > existing.getVersion()) { |
| | | latestVersionMap.put(pd.getKey(), pd); |
| | | } |
| | | } |
| | | |
| | | // 4. è¿åæµç¨å®ä¹å表 |
| | | List<Map<String, Object>> result = new ArrayList<>(); |
| | | for (ProcessDefinition pd : latestVersionMap.values()) { |
| | | Map<String, Object> item = new HashMap<>(); |
| | | item.put("id", pd.getId()); |
| | | item.put("key", pd.getKey()); |
| | | item.put("name", pd.getName()); |
| | | result.add(item); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updatePurchaseRequestAuditStatus(Long id, Integer bpmResult) { |
| | | // 1. æ ¡éªåå¨ |
| | | ErpPurchaseRequestDO purchaseRequest = validatePurchaseRequestExists(id); |
| | | if (!ErpPurchaseRequestStatusEnum.PROCESS.getStatus().equals(purchaseRequest.getStatus())) { |
| | | log.warn("[updatePurchaseRequestAuditStatus] éè´ç³è¯·({}) ä¸å¤äºå®¡æ¹ä¸ç¶æ", id); |
| | | return; |
| | | } |
| | | |
| | | // 2. æ ¹æ®å®¡æ¹ç»ææ´æ°ç¶æ |
| | | Integer newStatus = convertBpmResultToStatus(bpmResult); |
| | | if (newStatus != null) { |
| | | 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 |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long generatePurchaseOrder(Long id, Long supplierId) { |
| | | // 1. æ ¡éªåå¨ + å®¡æ ¸éè¿ç¶æ |
| | | ErpPurchaseRequestDO purchaseRequest = validatePurchaseRequestExists(id); |
| | | if (!ErpPurchaseRequestStatusEnum.APPROVE.getStatus().equals(purchaseRequest.getStatus())) { |
| | | throw exception(PURCHASE_REQUEST_NOT_APPROVE); |
| | | } |
| | | // 2. æ ¡éªæ¯å¦å·²çæè®¢å |
| | | if (purchaseRequest.getOrderId() != null) { |
| | | throw exception(PURCHASE_REQUEST_ORDER_EXISTS); |
| | | } |
| | | // 3. æ ¡éªä¾åºå |
| | | supplierService.validateSupplier(supplierId); |
| | | |
| | | // 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); |
| | | } |
| | | |
| | | // 2. çæéè´è®¢åå· |
| | | String orderNo = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX); |
| | | if (purchaseOrderMapper.selectByNo(orderNo) != null) { |
| | | throw exception(PURCHASE_ORDER_NO_EXISTS); |
| | | } |
| | | |
| | | // 3. å建éè´è®¢å |
| | | ErpPurchaseOrderDO purchaseOrder = new ErpPurchaseOrderDO(); |
| | | purchaseOrder.setNo(orderNo); |
| | | purchaseOrder.setStatus(ErpAuditStatus.APPROVE.getStatus()); // éè´è®¢åç´æ¥ä¸ºå·²å®¡æ ¸ç¶æ |
| | | purchaseOrder.setSupplierId(purchaseRequest.getSupplierId()); |
| | | purchaseOrder.setOrderTime(purchaseRequest.getRequestTime()); |
| | | purchaseOrder.setTotalCount(purchaseRequest.getTotalCount()); |
| | | purchaseOrder.setTotalPrice(purchaseRequest.getTotalPrice()); |
| | | purchaseOrder.setTotalProductPrice(purchaseRequest.getTotalProductPrice()); |
| | | 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); |
| | | |
| | | // 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.setCount(item.getCount()); |
| | | orderItem.setTotalPrice(item.getTotalPrice()); |
| | | orderItem.setTaxPercent(item.getTaxPercent()); |
| | | orderItem.setTaxPrice(item.getTaxPrice()); |
| | | orderItem.setRemark(item.getRemark()); |
| | | orderItem.setInCount(BigDecimal.ZERO); |
| | | orderItem.setQcCheckFlag(item.getQcCheckFlag() != null ? item.getQcCheckFlag() : false); |
| | | return orderItem; |
| | | }); |
| | | purchaseOrderItemMapper.insertBatch(orderItems); |
| | | |
| | | // 5. æ´æ°éè´ç³è¯·ç订åä¿¡æ¯ |
| | | purchaseRequestMapper.updateById(new ErpPurchaseRequestDO() |
| | | .setId(id) |
| | | .setOrderId(purchaseOrder.getId()) |
| | | .setOrderNo(orderNo)); |
| | | |
| | | return purchaseOrder.getId(); |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªéè´ç³è¯·å®¡æ¹åç±»åæµç¨å®ä¹æ¯å¦åå¨ |
| | | */ |
| | | private void validatePurchaseRequestApproveCategoryAndProcessDefinition() { |
| | | List<BpmCategoryDO> categories = bpmCategoryService.getCategoryListByCode( |
| | | Collections.singletonList(PURCHASE_REQUEST_APPROVE_CATEGORY_CODE)); |
| | | if (CollUtil.isEmpty(categories)) { |
| | | throw exception(PURCHASE_REQUEST_BPM_CATEGORY_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è½¬æ¢ BPM 审æ¹ç»æä¸ºç¶æ |
| | | */ |
| | | private Integer convertBpmResultToStatus(Integer bpmResult) { |
| | | if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmResult)) { |
| | | return ErpPurchaseRequestStatusEnum.APPROVE.getStatus(); |
| | | } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmResult)) { |
| | | return ErpPurchaseRequestStatusEnum.REJECT.getStatus(); |
| | | } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmResult)) { |
| | | return ErpPurchaseRequestStatusEnum.CANCEL.getStatus(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private ErpPurchaseRequestDO validatePurchaseRequestExists(Long id) { |
| | | ErpPurchaseRequestDO purchaseRequest = purchaseRequestMapper.selectById(id); |
| | | if (purchaseRequest == null) { |
| | | throw exception(PURCHASE_REQUEST_NOT_EXISTS); |
| | | } |
| | | return purchaseRequest; |
| | | } |
| | | |
| | | private ErpPurchaseRequestDO validatePurchaseRequestExistsAndDraft(Long id) { |
| | | ErpPurchaseRequestDO purchaseRequest = validatePurchaseRequestExists(id); |
| | | if (!ErpPurchaseRequestStatusEnum.DRAFT.getStatus().equals(purchaseRequest.getStatus())) { |
| | | throw exception(PURCHASE_REQUEST_UPDATE_FAIL_NOT_DRAFT, purchaseRequest.getNo()); |
| | | } |
| | | return purchaseRequest; |
| | | } |
| | | |
| | | private String getCurrentUserId() { |
| | | return cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId().toString(); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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.controller.admin.qc.iqc.vo.MesQcIqcSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Collection; |
| | |
| | | */ |
| | | Long getIqcCountByVendorId(Long vendorId); |
| | | |
| | | /** |
| | | * æ ¹æ®å°è´§éç¥åè¡èªå¨åå»ºæ¥ææ£éªå |
| | | * |
| | | * @param noticeId å°è´§éç¥å ID |
| | | * @param line å°è´§éç¥åè¡ |
| | | * @param noticeCode å°è´§éç¥åç¼å· |
| | | * @param vendorId ä¾åºå ID |
| | | * @return IQC æ£éªå ID |
| | | */ |
| | | Long createIqcFromArrivalNotice(Long noticeId, MesWmArrivalNoticeLineDO line, String noticeCode, Long vendorId); |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.qc.iqc.MesQcIqcMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; |
| | |
| | | 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()); |
| | |
| | | return iqcMapper.selectCountByVendorId(vendorId); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createIqcFromArrivalNotice(Long noticeId, MesWmArrivalNoticeLineDO line, String noticeCode, Long vendorId) { |
| | | // 1. æ ¡éªç©ææ¯å¦é
ç½®äº IQC æ£éªæ¨¡æ¿ |
| | | 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. çææ£éªåç¼ç |
| | | String code = "IQC" + System.currentTimeMillis(); |
| | | |
| | | // 3. å建 IQC 主表ï¼å¾
æ£éªç¶æï¼åå§åæ ¼æ°é为 0ï¼ |
| | | MesQcIqcDO iqc = new MesQcIqcDO(); |
| | | iqc.setCode(code); |
| | | iqc.setName(noticeCode + "-ç©ææ£éª"); |
| | | iqc.setTemplateId(templateId); |
| | | iqc.setSourceDocType(MesBizTypeConstants.WM_ARRIVAL_NOTICE); |
| | | iqc.setSourceDocId(noticeId); |
| | | iqc.setSourceLineId(line.getId()); |
| | | iqc.setSourceDocCode(noticeCode); |
| | | iqc.setVendorId(vendorId); |
| | | iqc.setItemId(line.getItemId()); |
| | | iqc.setReceivedQuantity(line.getArrivalQuantity()); |
| | | iqc.setCheckQuantity(BigDecimal.ZERO); // å¾
å¡«å |
| | | iqc.setQualifiedQuantity(BigDecimal.ZERO); // å¾
å¡«å |
| | | iqc.setUnqualifiedQuantity(BigDecimal.ZERO); // å¾
å¡«å |
| | | iqc.setReceiveDate(java.time.LocalDateTime.now()); |
| | | iqc.setStatus(MesQcStatusEnum.DRAFT.getStatus()); |
| | | iqcMapper.insert(iqc); |
| | | |
| | | // 4. 仿¨¡æ¿ææ èªå¨çææ£éªè¡ |
| | | iqcLineService.createLinesFromTemplate(iqc.getId(), templateId); |
| | | |
| | | 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); |
| | | |
| | | /** |
| | | * æ ¡éªå°è´§éç¥åè¡åå¨ |
| | |
| | | */ |
| | | void createArrivalNoticeLineFromPurchaseOrderItem(MesWmArrivalNoticeLineDO line); |
| | | |
| | | /** |
| | | * æ´æ°å°è´§éç¥åè¡ç IQC æ£éªå ID |
| | | * |
| | | * @param lineId è¡ç¼å· |
| | | * @param iqcId IQC æ£éªåç¼å· |
| | | */ |
| | | void updateArrivalNoticeLineIqcId(Long lineId, Long iqcId); |
| | | |
| | | } |
| | |
| | | } |
| | | |
| | | @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 |
| | |
| | | arrivalNoticeLineMapper.insert(line); |
| | | } |
| | | |
| | | @Override |
| | | public void updateArrivalNoticeLineIqcId(Long lineId, Long iqcId) { |
| | | arrivalNoticeLineMapper.updateById(new MesWmArrivalNoticeLineDO() |
| | | .setId(lineId).setIqcId(iqcId)); |
| | | } |
| | | |
| | | } |
| | |
| | | * @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; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | |
| | | |
| | | @Resource |
| | | private MesWmArrivalNoticeLineService arrivalNoticeLineService; |
| | | |
| | | @Resource |
| | | private cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService vendorService; |
| | | private ErpSupplierApi supplierApi; |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderApi purchaseOrderApi; |
| | | |
| | | @Resource |
| | | private MesMdmItemService mdmItemService; |
| | | |
| | | @Resource |
| | | @Lazy |
| | | private MesQcIqcService iqcService; |
| | | |
| | | @Override |
| | | public Long createArrivalNotice(MesWmArrivalNoticeSaveReqVO createReqVO) { |
| | |
| | | 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(); |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitArrivalNotice(Long id) { |
| | | // 1.1 æ ¡éªåå¨ + èç¨¿ç¶æ |
| | | validateArrivalNoticeExistsAndDraft(id); |
| | | MesWmArrivalNoticeDO notice = validateArrivalNoticeExistsAndDraft(id); |
| | | // 1.2 æ£æ¥æ¯å¦æè¡é¡¹ç® |
| | | List<MesWmArrivalNoticeLineDO> lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(id); |
| | | if (CollUtil.isEmpty(lines)) { |
| | |
| | | boolean needCheck = CollectionUtils.anyMatch(lines, |
| | | line -> Boolean.TRUE.equals(line.getIqcCheckFlag())); |
| | | if (needCheck) { |
| | | // éè¦æ£éªï¼è¿å
¥å¾
è´¨æ£ |
| | | // 2.1 éè¦æ£éªï¼è¿å
¥å¾
è´¨æ£ |
| | | arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO() |
| | | .setId(id).setStatus(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus())); |
| | | // 2.2 为éè¦è´¨æ£çè¡èªå¨å建 IQC æ£éªå |
| | | for (MesWmArrivalNoticeLineDO line : lines) { |
| | | if (Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcId() == null) { |
| | | try { |
| | | Long iqcId = iqcService.createIqcFromArrivalNotice( |
| | | id, line, notice.getCode(), notice.getVendorId()); |
| | | // æ´æ°è¡ä¸ç iqcId |
| | | arrivalNoticeLineService.updateArrivalNoticeLineIqcId(line.getId(), iqcId); |
| | | log.info("[submitArrivalNotice][å°è´§éç¥å({}) è¡({}) èªå¨å建 IQC æ£éªå({})]", |
| | | id, line.getId(), iqcId); |
| | | } catch (Exception e) { |
| | | log.warn("[submitArrivalNotice][å°è´§éç¥å({}) è¡({}) å建 IQC 失败: {}]", |
| | | id, line.getId(), e.getMessage()); |
| | | // ç»§ç»å¤çå
¶ä»è¡ï¼ä¸ä¸ææµç¨ |
| | | } |
| | | } |
| | | } |
| | | return; |
| | | } |
| | | // ä¸éè¦æ£éªï¼ç´æ¥è¿å
¥å¾
å
¥åº |
| | |
| | | |
| | | @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.setIqcCheckFlag(false); // é»è®¤ä¸éè¦æ£éªï¼ç¨æ·å¯ä¿®æ¹ |
| | | line.setItemId(item.getProductId()); // ä»éè´è®¢åæç»å¸¦å
¥ç©æç¼å· |
| | | BigDecimal arrivalQuantity = item.getCount() != null ? item.getCount().subtract(item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO) : BigDecimal.ZERO; |
| | | line.setArrivalQuantity(arrivalQuantity); |
| | | // ä»éè´è®¢åæç»å¸¦å
¥è´¨æ£æ è¯ |
| | | 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); |
| | | } |
| | | } |
| | | |