Merge branch 'dev_business' of http://114.132.189.42:9002/r/mom-pro2-after into dev_business
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: å·¥ä¸AIæºé å¹³å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [active]: å·¥ä¸AIæºé å¹³å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | - generic [ref=f1e7]: |
| | | - complementary [ref=f1e8]: |
| | | - generic [ref=f1e9]: |
| | | - generic [ref=f1e10] [cursor=pointer] |
| | | - link "å·¥ä¸AIæºé å¹³å° å·¥ä¸AIæºé å¹³å°" [ref=f1e15] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - img "å·¥ä¸AIæºé å¹³å°" [ref=f1e18] |
| | | - generic [ref=f1e19]: å·¥ä¸AIæºé å¹³å° |
| | | - menu [ref=f1e22]: |
| | | - menuitem "é¦é¡µ" [ref=f1e23] [cursor=pointer] |
| | | - listitem [ref=f1e30]: |
| | | - generic [ref=f1e31] [cursor=pointer]: åºç¡æ°æ® |
| | | - listitem [ref=f1e39]: |
| | | - generic [ref=f1e40] [cursor=pointer]: éè´ç®¡ç |
| | | - listitem [ref=f1e46]: |
| | | - generic [ref=f1e47] [cursor=pointer]: è¥é管ç |
| | | - listitem [ref=f1e53]: |
| | | - generic [ref=f1e54] [cursor=pointer]: 设å¤ç®¡ç |
| | | - listitem [ref=f1e61]: |
| | | - generic [ref=f1e62] [cursor=pointer]: ä»å¨ç©æµ |
| | | - listitem [ref=f1e70]: |
| | | - generic [ref=f1e71] [cursor=pointer]: çäº§ç®¡æ§ |
| | | - listitem [ref=f1e78]: |
| | | - generic [ref=f1e79] [cursor=pointer]: è´¨é管ç |
| | | - listitem [ref=f1e85]: |
| | | - generic [ref=f1e86] [cursor=pointer]: å³çBIå¤§å± |
| | | - listitem [ref=f1e92]: |
| | | - generic [ref=f1e93] [cursor=pointer]: åååå
¬ |
| | | - list [ref=f1e99]: |
| | | - listitem [ref=f1e100]: |
| | | - generic [ref=f1e101] [cursor=pointer]: æµç¨ç®¡ç |
| | | - list [ref=f1e107]: |
| | | - menuitem "æµç¨æ¨¡å" [ref=f1e108] [cursor=pointer] |
| | | - menuitem "æµç¨è¡¨å" [ref=f1e113] [cursor=pointer] |
| | | - menuitem "æµç¨åç±»" [ref=f1e118] [cursor=pointer] |
| | | - menuitem "ç¨æ·åç»" [ref=f1e123] [cursor=pointer] |
| | | - menuitem "æµç¨çå¬å¨" [ref=f1e128] [cursor=pointer] |
| | | - menuitem "æµç¨è¡¨è¾¾å¼" [ref=f1e133] [cursor=pointer] |
| | | - menuitem "æµç¨å®ä¾" [ref=f1e138] [cursor=pointer] |
| | | - menuitem "æµç¨ä»»å¡" [ref=f1e143] [cursor=pointer] |
| | | - listitem [ref=f1e148]: |
| | | - generic [ref=f1e149] [cursor=pointer]: 审æ¹ä¸å¿ |
| | | - menuitem "APIå¯é¥ç®¡ç" [ref=f1e155] [cursor=pointer] |
| | | - menuitem "模å管ç" [ref=f1e161] [cursor=pointer] |
| | | - menuitem "ç¥è¯åºç®¡ç" [ref=f1e166] [cursor=pointer] |
| | | - menuitem "éç¥å
Œ" [ref=f1e172] [cursor=pointer] |
| | | - listitem [ref=f1e177]: |
| | | - generic [ref=f1e178] [cursor=pointer]: 人åèµæº |
| | | - listitem [ref=f1e184]: |
| | | - generic [ref=f1e185] [cursor=pointer]: å®å管ç |
| | | - listitem [ref=f1e191]: |
| | | - generic [ref=f1e192] [cursor=pointer]: åºç¡è®¾æ½ |
| | | - listitem [ref=f1e198]: |
| | | - generic [ref=f1e199] [cursor=pointer]: ç³»ç»ç®¡ç |
| | | - listitem [ref=f1e205]: |
| | | - generic [ref=f1e206] [cursor=pointer]: IM 峿¶é讯 |
| | | - generic [ref=f1e214] [cursor=pointer] |
| | | - generic [ref=f1e219]: |
| | | - generic [ref=f1e220]: |
| | | - banner [ref=f1e221]: |
| | | - button [ref=f1e222] [cursor=pointer] |
| | | - button [ref=f1e225] [cursor=pointer] |
| | | - navigation "breadcrumb" [ref=f1e230]: |
| | | - list [ref=f1e231]: |
| | | - listitem [ref=f1e232]: |
| | | - link "åååå
¬" [ref=f1e233] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - listitem [ref=f1e237] |
| | | - listitem [ref=f1e240]: |
| | | - link "æµç¨ç®¡ç" [ref=f1e241] [cursor=pointer]: |
| | | - /url: javascript:void 0 |
| | | - listitem [ref=f1e245] |
| | | - listitem [ref=f1e248]: |
| | | - link "æµç¨æ¨¡å" [disabled] [ref=f1e249] |
| | | - generic [ref=f1e254]: |
| | | - generic [ref=f1e256] [cursor=pointer]: |
| | | - generic [ref=f1e260]: æç´¢ |
| | | - generic [ref=f1e261]: Ctrl K |
| | | - button [ref=f1e263] [cursor=pointer] |
| | | - button "dark" [ref=f1e268] [cursor=pointer] |
| | | - button [ref=f1e277] [cursor=pointer] |
| | | - button [ref=f1e283] [cursor=pointer] |
| | | - button [ref=f1e286] [cursor=pointer] |
| | | - button [ref=f1e292] [cursor=pointer]: |
| | | - button [ref=f1e294] |
| | | - button "å·¥ä½å°" [ref=f1e299] [cursor=pointer] |
| | | - button [ref=f1e303] [cursor=pointer]: |
| | | - img "è¶
级管çå" [ref=f1e308] |
| | | - generic [ref=f1e310]: |
| | | - generic [ref=f1e315]: |
| | | - generic [ref=f1e316] [cursor=pointer]: é¦é¡µ |
| | | - generic [ref=f1e334] [cursor=pointer]: æµç¨æ¨¡å |
| | | - generic [ref=f1e351]: |
| | | - button [ref=f1e352] [cursor=pointer] |
| | | - generic [ref=f1e359] [cursor=pointer] |
| | | - generic [ref=f1e363] [cursor=pointer] |
| | | - main [ref=f1e370]: |
| | | - generic [ref=f1e376]: |
| | | - generic [ref=f1e377]: æµç¨æ¨¡å |
| | | - generic [ref=f1e379]: |
| | | - textbox "æç´¢æµç¨" [ref=f1e381] |
| | | - button "æ°å»ºæ¨¡å" [ref=f1e383] [cursor=pointer] |
| | | - button [ref=f1e387] [cursor=pointer] |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ERP éè´æ¥ç¥¨å»æå®¡æ ¸ - å端èè°æ¹æ¡ |
| | | |
| | | ## åæ´èæ¯ |
| | | |
| | | éè´æ¥ç¥¨ï¼`erp_purchase_invoice`ï¼ä¸åéè¦å®¡æ ¸æµç¨ï¼æ¥ç¥¨å建åç´æ¥çæãå¯ç´æ¥ç¨äºä»æ¬¾ãå端已å é¤å®¡æ ¸ç¶æå段ï¼`auditStatus`ï¼ä¸å·¥ä½æµæ®çåæ®µï¼`processInstanceId`ï¼ï¼å¹¶ç§»é¤äºå®¡æ ¸ç¸å
³æ¥å£ï¼ä»æ¬¾å建æ¶ä¸åæ ¡éª"æ¥ç¥¨å¿
é¡»å®¡æ ¸éè¿"ã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - éè´æ¥ç¥¨ç®¡ç页ï¼`views/erp/purchase/invoice/`ï¼ |
| | | - 仿¬¾å管ç页ï¼`views/erp/finance/payment/`ï¼ä»
è¡ä¸ºååï¼æ 鿹代ç ï¼ |
| | | |
| | | ## æ¥å£åæ´ |
| | | |
| | | ### å·²å 餿¥å£ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | PUT | /erp/purchase-invoice/update-status | å®¡æ ¸/åå®¡æ ¸ï¼å端éå é¤å¯¹åºæé®ä¸ API 彿° | |
| | | | GET | /erp/purchase-invoice/audit-count | å¾
å®¡æ ¸æ¥ç¥¨æ°éï¼å端éå é¤å¯¹åº API 彿° | |
| | | |
| | | ### ååºå段åå |
| | | |
| | | | æ¥å£ | åå | |
| | | |------|------| |
| | | | /erp/purchase-invoice/page | ååºç§»é¤ `auditStatus`ã`processInstanceId` åæ®µ | |
| | | | /erp/purchase-invoice/get | ååºç§»é¤ `auditStatus`ã`processInstanceId` åæ®µ | |
| | | | /erp/purchase-invoice/simple-list | ååºç§»é¤ `auditStatus` åæ®µï¼ä¸ååªè¿å"å®¡æ ¸éè¿"æ¥ç¥¨ï¼æ¹ä¸ºè¿å该ä¾åºå/订åä¸"å·²ä¸ä¼ éä»¶ä¸å©ä½å¯ä» > 0"çå
¨é¨æ¥ç¥¨ | |
| | | | /erp/finance-payment/getã/page | åµå¥ `invoice` 对象ä¸ä¸åå
å« `auditStatus` åæ®µ | |
| | | |
| | | ### æ ¡éªè§åååï¼å端ï¼åç«¯æ æ¹å¨ï¼ |
| | | |
| | | | åºæ¯ | åå | |
| | | |------|------| |
| | | | 仿¬¾å建/æ´æ° | 廿"å
³èæ¥ç¥¨å¿
é¡»å®¡æ ¸éè¿"æ ¡éªï¼å
¶ä½æ ¡éªï¼æ¥ç¥¨åå¨ãå·²ä¼ éä»¶ãä¾åºåä¸è´ãéé¢ä¸è¶
å©ä½å¯ä»ï¼ä¿ç | |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. API å®ä¹ï¼`src/api/erp/purchase/invoice/index.ts`ï¼ |
| | | |
| | | - `PurchaseInvoice` ç±»åï¼å é¤ `auditStatus`ã`processInstanceId` åæ®µ |
| | | - `PurchaseInvoiceSimple` ç±»åï¼å é¤ `auditStatus` åæ®µ |
| | | - å é¤å½æ°ï¼`updatePurchaseInvoiceStatus`ã`getAuditPurchaseInvoiceCount` |
| | | - æ´æ° `getPurchaseInvoiceSimpleList` 注é说æ |
| | | |
| | | ### 2. æ¥ç¥¨å表页ï¼`src/views/erp/purchase/invoice/index.vue`ï¼ |
| | | |
| | | - å é¤"å®¡æ ¸""åå®¡æ ¸"æä½æé®å对åºå¤ç彿° |
| | | - å é¤"审æ¹ç¶æ"åçç¶æ Tag æ¨¡æ¿ |
| | | - ç¼è¾æé®ä¸åæå®¡æ ¸ç¶ææ§å¶æ¾éï¼ä»»æç¶æå¯ç¼è¾ï¼ |
| | | - å 餿é®ä¸åæå®¡æ ¸ç¶ææ§å¶æ¾éï¼æ¯å¦å¯å ç±åç«¯æ ¡éª"å·²æææä»æ¬¾å"å³å®ï¼ |
| | | |
| | | ### 3. æ¥ç¥¨å表é
ç½®ï¼`src/views/erp/purchase/invoice/data.ts`ï¼ |
| | | |
| | | - æç´¢è¡¨åï¼å é¤"å®¡æ ¸ç¶æ"çé项 |
| | | - å表åï¼å é¤"审æ¹ç¶æ"å |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | æ¥ç¥¨å建 | å建å³çæï¼æ å®¡æ ¸ç¯è | |
| | | | æ¥ç¥¨ç¼è¾ | ä»»æç¶æå¯ç¼è¾ | |
| | | | æ¥ç¥¨å é¤ | å·²æææä»æ¬¾åï¼ä»æ¬¾éé¢ > 0ï¼å
³èçæ¥ç¥¨ä¸å¯å é¤ï¼å端ä¼è¿åé误æç¤º | |
| | | | 仿¬¾éæ©æ¥ç¥¨ | 䏿åªå±ç¤º"å·²ä¸ä¼ éä»¶ä¸å©ä½å¯ä» > 0"çæ¥ç¥¨ï¼ä¸åæ"å¾
å®¡æ ¸"æ¥ç¥¨ | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - 仿¬¾æ¨¡åï¼`views/erp/finance/payment/`ï¼æªå¼ç¨ `auditStatus`ï¼æ éä¿®æ¹ï¼å
¶"å
³èæ¥ç¥¨"䏿å¯éèå´éå端 simple-list é»è¾èªå¨ååã |
| | | - å岿¥ç¥¨æ°æ®ï¼æ°æ®åºå·²å é¤ `audit_status`ã`process_instance_id` 两åï¼å岿¥ç¥¨å
¨é¨è§ä¸ºææï¼å¯ç´æ¥ç¨äºä»æ¬¾ã |
| | | - å端æ¥å£å é¤åï¼è¯·åæ¥æ£æ¥æ¯å¦æå
¶å®é¡µé¢ï¼å¦å·¥ä½å°/å¾
åï¼è°ç¨å·²å é¤çæ¥å£ï¼å½åæªåç°ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # MES ç©æç¶ææ§å¶ - å端èè°æ¹æ¡ |
| | | |
| | | ## åæ´æ¦è¿° |
| | | |
| | | - MES 模å**ä¸åå
许æ§å¶ç©æç¶æ**ï¼ç¶æåªè½ç±åºç¡æ°æ®ï¼MDMï¼ç©æç®¡çæ§å¶ã |
| | | - ç§»é¤ MES æ¥å£ `PUT /mes/md/item/update-status`ã |
| | | - MDM ç©æåæ¥å° MES æ¶ä¼ éç¶æï¼å¯ç¨/ç¦ç¨ï¼ï¼MES ç©æç¶æè·é MDM ä¿æåæ¥ã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - MES ç©æå表页ï¼`src/views/mes/md/item/index.vue`ï¼ç§»é¤ç¶æå¼å
³ï¼æ¹ä¸ºåªè¯»å±ç¤ºï¼ |
| | | - MES ç©ææ°å¢/ç¼è¾è¡¨åï¼`src/views/mes/md/item/modules/form.vue`ï¼ç¶æå段æ¹ä¸ºç¦ç¨/åªè¯»ï¼ |
| | | - åºç¡æ°æ®ç©æç®¡ç页ï¼`src/views/basicData/mdm/index.vue`ï¼ç¶ææ§å¶å
¥å£ï¼ä¿æä¸åï¼ |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | PUTï¼å·²ç§»é¤ï¼ | `/mes/md/item/update-status` | MES ä¾§ç¶ææ§å¶æ¥å£ï¼å·²åºå¼ï¼å端**ä¸å¾åè°ç¨** | |
| | | |
| | | MDM ç¶ææ§å¶æ¥å£ï¼ä¿æä¸åï¼ç¶æä¼åæ¥å° MESï¼ï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | `/mdm/item/create` | åå»ºç©æï¼status é忥另å
¥ MES | |
| | | | PUT | `/mdm/item/update` | æ´æ°ç©æï¼status é忥另å
¥ MES | |
| | | | PUT | `/mdm/item/update-status` | æ´æ°ç©æç¶æï¼å®æ¶åæ¥å° MES | |
| | | |
| | | ## æ°æ®å¸¦å
¥è¯´æ |
| | | |
| | | 1. MDM å建/ç¼è¾ç©ææ¶ï¼`status`ï¼0=å¯ç¨ï¼1=ç¦ç¨ï¼é忥é¾è·¯å¸¦å
¥ MESï¼MES ç©ææ°å»ºæ²¿ç¨ MDM ç¶æã |
| | | 2. MDM ç©æå¯ç¨/ç¦ç¨ï¼`update-status`ï¼ï¼ç¶æå®æ¶åæ¥å° MESã |
| | | 3. MES æ¬å°æ°å¢ç©æï¼ä¸ç»è¿ MDM 忥ï¼é»è®¤ç¶æä¸º**ç¦ç¨**ï¼ä¸ MES ä¾§æ æ³èªè¡å¯ç¨ï¼é¡»å¨ MDM ä¸å¯ç¨å忥å MESã |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | ç¶æ | MES ç©æå表 | åªè¯»å±ç¤ºï¼æ¥æºä¸º MDM åæ¥ç¶æï¼ä¸åæä¾å¼å
³åæ¢ | |
| | | | ç¶æ | MES æ°å¢/ç¼è¾è¡¨å | ç¦ç¨/éèï¼ä¸å
è®¸ä¿®æ¹ | |
| | | | ç¶æ | MDM ç©æå表/表å | å¯ç¼è¾ï¼ä¸ºç¶æå¯ä¸æ§å¶å
¥å£ | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | MDM å建/ç¼è¾ç©æ | ç¶æéåæ¥å° MESï¼MES ç©æç¶æä¿æä¸è´ | |
| | | | MDM å¯ç¨/ç¦ç¨ç©æ | ç¶æå®æ¶åæ¥å° MES | |
| | | | MES æ¬å°æ°å¢ç©æ | é»è®¤ç¦ç¨ï¼MES ä¾§æ æ³å¯ç¨ï¼é¡»å¨ MDM ä¸å¯ç¨ | |
| | | | MES ç¼è¾ç©æ | ä¸å
许修æ¹ç¶æå段 | |
| | | | MES ç¶ææ§å¶ | ä¸åæä¾å¯ç¨/ç¦ç¨å
¥å£ | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - MES å表页éç§»é¤ç¶æå¼å
³ï¼`updateItemStatus` ç¸å
³è°ç¨ï¼ï¼ç¶æåæ¹ä¸ºåªè¯»ææ¬/æ ç¾å±ç¤ºï¼æä¿çå±ç¤ºåä½å»æå¯åæ¢è½åã |
| | | - MES æ°å¢/ç¼è¾è¡¨åä¸çç¶æåæ®µéç¦ç¨æéèï¼é¿å
è¯¯ä¼ å¯¼è´ç¶æè¢«ä¿®æ¹ã |
| | | - å端 `src/api/mes/md/item/index.ts` ä¸ç `updateItemStatus` 彿°å¯ä¸å¹¶æ¸
çï¼æ¥å£å·²ç§»é¤ï¼ã |
| | | - MDM å¯ç¨ç©ææ¶ï¼è¥è¯¥ç©æå¨ MES ä¾§å¯ç¨äºæ¹æ¬¡ç®¡ç使ªé
ç½®æ¹æ¬¡å±æ§ãæä¸ºäº§å使ªé
ç½® BOMï¼MES åæ¥æ ¡éªå¯è½æ¦æªå¯ç¨æä½ï¼éå
å¨ MES ä¾§è¡¥é½å¯¹åºé
ç½®ã |
| | |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - éè´æ¥ç¥¨ç®¡ç页ï¼**æ°å»ºé¡µé¢**ï¼åèéè´ç³è¯·/éè´è®¢å页é¢ç»æï¼ |
| | | - éè´æ¥ç¥¨ç®¡çé¡µï¼æ¥ç¥¨åè¡¨ãæ°å¢/ç¼è¾/详æ
å¼¹çªï¼ |
| | | - éè´è®¢å详æ
页ï¼å±ç¤ºè¯¥è®¢åä¸å·²å
³èçæ¥ç¥¨ä¿¡æ¯ï¼ |
| | | - 仿¬¾å管çé¡µï¼æ°å»º/ç¼è¾å¼¹çªãå表ã详æ
ï¼ |
| | | - 仿¬¾å详æ
页ï¼å±ç¤ºå
³èçæ¥ç¥¨ä¿¡æ¯ï¼ |
| | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | 1. éè´è®¢åï¼å®¡æ ¸éè¿ï¼-> å建æ¥ç¥¨ï¼`purchaseOrderId` å¿
éï¼ä¾åºåèªå¨å¸¦åºï¼ä»¥éè´è®¢åçä¾åºå为åï¼å端æ éä¼ `supplierId`ï¼ç±å端æéè´è®¢åæ¥è¯¢è®¾ç½®ï¼ã |
| | | 2. æ¥ç¥¨å建å -> ä¸ä¼ å票éä»¶ï¼èµ° system 模å Storage APIï¼ã |
| | | 3. æ¥ç¥¨æäº¤å®¡æ¹ -> 审æ¹éè¿ -> æå¯ä½ä¸ºä»æ¬¾å
³è对象ã |
| | | 4. æ°å»ºä»æ¬¾å -> éæ©å
³èæ¥ç¥¨ï¼`invoiceId` å¿
å¡«ï¼ï¼ä» `GET /erp/purchase-invoice/simple-list?supplierId=&purchaseOrderId=` éæ©ï¼ä»
æ¾ç¤º"审æ¹éè¿ + å·²ä¸ä¼ éä»¶ + å©ä½å¯ä»éé¢ > 0"çæ¥ç¥¨ï¼éæ©å `remainingInvoicePrice` å¯ç¨äºé¢å¡«ä»æ¬¾éé¢ä¸éã |
| | | 2. æ¥ç¥¨å建å -> ä¸ä¼ å票éä»¶ï¼èµ° system 模å Storage APIï¼ã**æ¥ç¥¨å建å³çæï¼æ å®¡æ ¸ç¯è**ã |
| | | 3. æ°å»ºä»æ¬¾å -> éæ©å
³èæ¥ç¥¨ï¼`invoiceId` å¿
å¡«ï¼ï¼ä» `GET /erp/purchase-invoice/simple-list?supplierId=&purchaseOrderId=` éæ©ï¼ä»
æ¾ç¤º"å·²ä¸ä¼ éä»¶ + å©ä½å¯ä»éé¢ > 0"çæ¥ç¥¨ï¼éæ©å `remainingInvoicePrice` å¯ç¨äºé¢å¡«ä»æ¬¾éé¢ä¸éã |
| | | |
| | | 对åºå
³ç³»ï¼**éè´è®¢å(1) -> æ¥ç¥¨(N) -> 仿¬¾(M)**ã |
| | | |
| | | ## API |
| | | |
| | | ### 1. æ¥ç¥¨ç®¡çï¼æ°ï¼ |
| | | ### 1. æ¥ç¥¨ç®¡ç |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | |
| | | | GET | /erp/purchase-invoice/get?id= | è·å¾æ¥ç¥¨è¯¦æ
| |
| | | | GET | /erp/purchase-invoice/page | æ¥ç¥¨å页 | |
| | | | GET | /erp/purchase-invoice/export-excel | å¯¼åºæ¥ç¥¨ Excel | |
| | | | PUT | /erp/purchase-invoice/submit?id= | æäº¤æ¥ç¥¨å®¡æ¹ | |
| | | | GET | /erp/purchase-invoice/audit-count | å¾
å®¡æ ¸æ¥ç¥¨æ°é | |
| | | | GET | /erp/purchase-invoice/simple-list?supplierId=&purchaseOrderId= | ç²¾ç®å表ï¼ä»æ¬¾è¡¨åéæ¥ç¥¨ï¼ | |
| | | |
| | | > å·²ç§»é¤æ¥å£ï¼`/erp/purchase-invoice/update-status`ï¼å®¡æ ¸/åå®¡æ ¸ï¼ã`/erp/purchase-invoice/audit-count`ï¼å¾
å®¡æ ¸æ°éï¼ãåç«¯è¯·åæ¥å é¤å¯¹åºæé®ä¸æ¥å£è°ç¨ã |
| | | |
| | | **å建/æ´æ°æ¥ç¥¨è¯·æ±åæ°ï¼** |
| | | |
| | |
| | | | remark | String | å¦ | 夿³¨ | |
| | | | blobIds | List\<Long\> | å¦ | å票éä»¶ blobId å表 | |
| | | |
| | | **æ¥ç¥¨å页/详æ
ååºæ°å¢å段ï¼** |
| | | **æ¥ç¥¨å页/详æ
ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | no | String | æ¥ç¥¨ç¼å·ï¼å端çæï¼åç¼ FPDï¼ | |
| | | | supplierName | String | ä¾åºååç§° | |
| | | | order | Object | éè´è®¢åä¿¡æ¯ï¼åµå¥ï¼ | |
| | | | auditStatus | Integer | 审æ¹ç¶æï¼0æªæäº¤/10审æ¹ä¸/20å®¡æ ¸éè¿/30å®¡æ ¸ä¸éè¿/40å·²åæ¶ï¼ | |
| | | | attachmentList | List | å票éä»¶å表 | |
| | | | hasAttachment | Boolean | æ¯å¦å·²ä¸ä¼ å票éä»¶ | |
| | | | remainingInvoicePrice | BigDecimal | å©ä½å¯ä»éé¢ = æ¥ç¥¨éé¢ - 该æ¥ç¥¨å·²ä»æ¬¾éé¢ | |
| | | |
| | | > 已移é¤ååºå段ï¼`auditStatus`ï¼å®¡æ¹ç¶æï¼ã`processInstanceId`ï¼å·¥ä½æµç¼å·ï¼ã |
| | | |
| | | **simple-list ååºï¼** |
| | | |
| | |
| | | | price | BigDecimal | æ¥ç¥¨éé¢ | |
| | | | supplierId | Long | ä¾åºåç¼å· | |
| | | | purchaseOrderId | Long | éè´è®¢åç¼å· | |
| | | | auditStatus | Integer | 审æ¹ç¶æ | |
| | | | hasAttachment | Boolean | æ¯å¦å·²ä¸ä¼ éä»¶ï¼æä¸º trueï¼ | |
| | | | remainingInvoicePrice | BigDecimal | å©ä½å¯ä»éé¢ | |
| | | |
| | | ### 2. 仿¬¾åï¼æ¥å£åæ´ï¼ |
| | | ### 2. 仿¬¾å |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /erp/finance-payment/create | åå»ºä»æ¬¾åï¼è¯·æ±ä½æ°å¢ `invoiceId`ï¼å¿
å¡«ï¼ | |
| | | | PUT | /erp/finance-payment/update | æ´æ°ä»æ¬¾åï¼è¯·æ±ä½æ°å¢ `invoiceId`ï¼å¿
å¡«ï¼ | |
| | | | GET | /erp/finance-payment/get | ååºæ°å¢ `invoiceId`ã`invoice` åµå¥å¯¹è±¡ | |
| | | | GET | /erp/finance-payment/page | ååºæ°å¢ `invoiceId`ã`invoice` åµå¥å¯¹è±¡ | |
| | | | POST | /erp/finance-payment/create | åå»ºä»æ¬¾åï¼è¯·æ±ä½å« `invoiceId`ï¼å¿
å¡«ï¼ | |
| | | | PUT | /erp/finance-payment/update | æ´æ°ä»æ¬¾åï¼è¯·æ±ä½å« `invoiceId`ï¼å¿
å¡«ï¼ | |
| | | | GET | /erp/finance-payment/get | ååºå« `invoiceId`ã`invoice` åµå¥å¯¹è±¡ | |
| | | | GET | /erp/finance-payment/page | ååºå« `invoiceId`ã`invoice` åµå¥å¯¹è±¡ | |
| | | |
| | | **请æ±åæ°æ°å¢ï¼** |
| | | |
| | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | invoiceId | Long | å
³èçæ¥ç¥¨ç¼å· | |
| | | | invoice | Object | å
³èçæ¥ç¥¨ä¿¡æ¯ï¼å« noãinvoiceNoãinvoiceTitleãpriceãauditStatus çï¼ | |
| | | | invoice | Object | å
³èçæ¥ç¥¨ä¿¡æ¯ï¼å« noãinvoiceNoãinvoiceTitleãprice çï¼ | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | |
| | | "no": "FPD20260810000001", |
| | | "invoiceNo": "02564178", |
| | | "invoiceTitle": "XXç§ææéå
¬å¸", |
| | | "price": 9000.00, |
| | | "auditStatus": 20 |
| | | "price": 9000.00 |
| | | }, |
| | | "paymentPrice": 5000.00 |
| | | } |
| | |
| | | | å票å·ç /æ¬å¤´ | æ¥ç¥¨å表ã详æ
| å½å
¥å段 | |
| | | | æ¥ç¥¨éé¢ | æ¥ç¥¨å表ã详æ
ã仿¬¾è¡¨å | å
| |
| | | | æ¥ç¥¨æ¥æ | æ¥ç¥¨å表ã详æ
| | |
| | | | 审æ¹ç¶æ | æ¥ç¥¨å表ã详æ
| åå
¸å±ç¤º | |
| | | | å票éä»¶ | æ¥ç¥¨è¯¦æ
ãæ¥ç¥¨å表 | ä¸ä¼ /é¢è§/ä¸è½½ | |
| | | | å票éä»¶ | æ¥ç¥¨è¯¦æ
ãæ¥ç¥¨å表 | ä¸ä¼ /é¢è§/ä¸è½½ï¼æéä»¶æ¾ç¤º"å·²ä¸ä¼ "Tag | |
| | | | å©ä½å¯ä»éé¢ | æ¥ç¥¨å表ã仿¬¾è¡¨å | æ¥ç¥¨éé¢ - 已仿¬¾éé¢ | |
| | | | å
³èæ¥ç¥¨ | 仿¬¾å表ã仿¬¾è¯¦æ
| å±ç¤º invoice.no / invoice.invoiceNo / invoice.price | |
| | | |
| | | > 已移é¤å±ç¤ºåæ®µï¼æ¥ç¥¨å表ç"审æ¹ç¶æ"åãæç´¢æ¡ä»¶"å®¡æ ¸ç¶æ"ã"å®¡æ ¸/åå®¡æ ¸"æä½æé®ã |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | æ¥ç¥¨å建 | éè´è®¢åå¿
é¡»å®¡æ ¸éè¿ï¼æ¥ç¥¨ä¾åºåä¸éè´è®¢åä¸è´ï¼æ¥ç¥¨éé¢ä¸è¶
è¿è®¢åå©ä½å¯å¼ç¥¨éé¢ | |
| | | | æ¥ç¥¨ç¼è¾ | ä»
"æªæäº¤"ç¶æå¯ç¼è¾ | |
| | | | æ¥ç¥¨å é¤ | 审æ¹éè¿åä¸å¯å é¤ | |
| | | | æ¥ç¥¨æäº¤å®¡æ¹ | ä»
"æªæäº¤"ç¶æå¯æäº¤ï¼æäº¤åè¿å
¥å®¡æ¹ä¸ | |
| | | | 仿¬¾éæ©æ¥ç¥¨ | ä»
审æ¹éè¿ + å·²ä¸ä¼ å票éä»¶çæ¥ç¥¨å¯é | |
| | | | æ¥ç¥¨å建 | éè´è®¢åå¿
é¡»å®¡æ ¸éè¿ï¼æ¥ç¥¨ä¾åºåä¸éè´è®¢åä¸è´ï¼æ¥ç¥¨éé¢ä¸è¶
è¿è®¢åå©ä½å¯å¼ç¥¨éé¢ï¼**å建å³çæï¼æ éå®¡æ ¸** | |
| | | | æ¥ç¥¨ç¼è¾ | ä»»æç¶æå¯ç¼è¾ï¼æ å®¡æ ¸ç¶æéå¶ | |
| | | | æ¥ç¥¨å é¤ | å·²æææä»æ¬¾åï¼æªä½åºä¸ä»æ¬¾éé¢ > 0ï¼å
³èçæ¥ç¥¨ä¸å¯å é¤ï¼å
¶ä½å¯å é¤ | |
| | | | 仿¬¾éæ©æ¥ç¥¨ | å·²ä¸ä¼ å票éä»¶ä¸å©ä½å¯ä»éé¢ > 0 çæ¥ç¥¨å¯éï¼**ä¸åè¦æ±å®¡æ ¸éè¿**ï¼ | |
| | | | 仿¬¾éé¢ä¸é | 仿¬¾éé¢ <= 该æ¥ç¥¨éé¢ - 该æ¥ç¥¨å·²ä»æ¬¾éé¢ï¼æªå®¡æ ¸+审æ¹ä¸+å·²å®¡æ ¸ä»æ¬¾ï¼æé¤ä½åºï¼ | |
| | | | ä¾åºåä¸è´æ§ | 仿¬¾çä¾åºåå¿
é¡»ä¸å
³èæ¥ç¥¨çä¾åºåä¸è´ | |
| | | | åé仿¬¾å | invoiceId 为空çåé仿¬¾åï¼ç¼è¾æ¶ééæ°éæ©åæ ¼æ¥ç¥¨ | |
| | |
| | | - 仿¬¾è¡¨åéæ©æ¥ç¥¨æ¶ï¼å
æä¾åºåè¿æ»¤ï¼`supplierId`ï¼ï¼å¯éè®¢åæ¶ä¼ `purchaseOrderId` è¿ä¸æ¥è¿æ»¤ã |
| | | - `remainingInvoicePrice` ä¸ºè´æ°æ 0 çæ¥ç¥¨ä¸ä¼åºç°å¨ simple-list ä¸ï¼å端å¯ç´æ¥æè¿åå表渲æã |
| | | - 仿¬¾é颿 ¡éªå¨å端ï¼å端å¯å°æ¥ç¥¨ç `remainingInvoicePrice` ä½ä¸ºä»æ¬¾éé¢è¾å
¥ä¸éæç¤ºã |
| | | - æ¥ç¥¨å®¡æ¹ç¶æååéè¿ BPM åè°æ´æ°ï¼å端æ éå¤çï¼å页æ¥å£ç´æ¥è¿åææ°ç¶æã |
| | | - æ¥ç¥¨å票éä»¶ä¸ä¼ ä½¿ç¨ system 模å Storage APIï¼upload -> bindï¼ï¼ä¸è¦ä½¿ç¨æ§ç /infra/file æ¥å£ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ERP éè´æ¥ç¥¨å»æå®¡æ ¸ï¼å é¤å®¡æ ¸ç¶æå段ä¸å·¥ä½æµæ®çåæ®µ |
| | | -- èæ¯ï¼æ¥ç¥¨å建å³çæï¼æ éå®¡æ ¸ï¼ä»æ¬¾ä¸åæ ¡éª"æ¥ç¥¨å®¡æ ¸éè¿" |
| | | -- æ§è¡æ¶æºï¼æ°å端é¨ç½²åçåæçªå£æ§è¡ï¼æ§ä»£ç 读åè¿ä¸¤åï¼å
å åä¼å¯¼è´è¿è¡æ¶æ¥éï¼ |
| | | |
| | | ALTER TABLE erp_purchase_invoice DROP COLUMN audit_status; |
| | | ALTER TABLE erp_purchase_invoice DROP COLUMN process_instance_id; |
| | | |
| | | -- æ¸
çå¤å¿èåæéï¼å¯¹åºå·²å é¤ç /update-status å®¡æ ¸æ¥å£ï¼ |
| | | DELETE FROM system_menu WHERE permission = 'erp:purchase-invoice:update-status'; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # SRM èµè´¨éä»¶ä¸ä¼ - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - éè´ç®¡ç-SRM-ä¾åºå管ç-èµè´¨è¯ä¹¦å表页 |
| | | - éè´ç®¡ç-SRM-ä¾åºå管ç-èµè´¨è¯ä¹¦æ°å¢/ç¼è¾å¼¹çª |
| | | - éè´ç®¡ç-SRM-ææ é¡¹ç®-æ°å¢/ç¼è¾å¼¹çªï¼å«åå¸ä¸/ææ ä¸çé¨åæ´æ°ï¼ |
| | | - éè´ç®¡ç-SRM-ææ é¡¹ç®-详æ
页 |
| | | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | 1. ç¨æ·å¨è¡¨åä¸éè¿ä¸ä¼ ç»ä»¶éæ©æä»¶ |
| | | 2. ä¸ä¼ ç»ä»¶è°ç¨ `/system/storage-blob/upload` è·å¾ `blobId` |
| | | 3. ä¿åä¸å¡è®°å½ï¼èµè´¨è¯ä¹¦ / ææ é¡¹ç®ï¼æ¶ï¼å°æä»¶ ID å表 `blobIds` éä¸å¡æ°æ®ä¸å¹¶æäº¤ |
| | | 4. å端å¨ä¸å¡è®°å½ä¿ååï¼éè¿ `recordType + recordId` å°æä»¶ç»å®å° `system_storage_attachment` ä¸é´è¡¨ |
| | | 5. æ¥è¯¢ä¸å¡è®°å½ï¼è¯¦æ
ãåé¡µï¼æ¶ï¼å端è¿å `attachmentList`ï¼å«æä»¶ URLãåç§°ï¼ï¼å端å±ç¤ºä¸è½½é¾æ¥ |
| | | |
| | | ## API |
| | | |
| | | ### 1. èµè´¨è¯ä¹¦éä»¶ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /system/storage-blob/upload | ä¸ä¼ æä»¶ï¼å
¥å multipart ç `files`ï¼è¿å Blob å表ï¼å« `id`ï¼ | |
| | | | POST | /srm/supplier-certificate/create | å建èµè´¨è¯ä¹¦ï¼æ°å¢å
¥å `blobIds` | |
| | | | PUT | /srm/supplier-certificate/update | æ´æ°èµè´¨è¯ä¹¦ï¼æ°å¢å
¥å `blobIds`ï¼å¢éæ´æ°éä»¶ï¼ | |
| | | | DELETE | /srm/supplier-certificate/delete | å é¤èµè´¨è¯ä¹¦ï¼åæ¥å é¤éä»¶ | |
| | | | GET | /srm/supplier-certificate/page | å页æ¥è¯¢ï¼ååºæ°å¢ `attachmentList` | |
| | | | GET | /srm/supplier-certificate/get | 详æ
æ¥è¯¢ï¼ååºæ°å¢ `attachmentList` | |
| | | | GET | /srm/supplier-certificate/list-by-supplier | æä¾åºåæ¥è¯¢ï¼ååºæ°å¢ `attachmentList` | |
| | | |
| | | **请æ±åæ°ï¼create/update æ°å¢å段ï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | blobIds | Array\<Long\> | å¦ | èµè´¨è¯ä¹¦éä»¶æä»¶ ID å表 | |
| | | |
| | | **ååºå段æ°å¢ï¼attachmentList æ°ç»å
ç´ ï¼ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | Long | æä»¶ ID | |
| | | | name | String | åæä»¶å | |
| | | | url | String | æä»¶è®¿é®å°å | |
| | | | previewURL | String | é¢è§å°å | |
| | | | downloadURL | String | ä¸è½½å°å | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "id": 1, |
| | | "supplierId": 10, |
| | | "certificateName": "ISO9001è´¨é管çä½ç³»", |
| | | "attachmentList": [ |
| | | { |
| | | "id": 1001, |
| | | "name": "iso9001_cert.pdf", |
| | | "url": "https://example.com/files/xxx.pdf" |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 2. ææ é¡¹ç®èµè´¨è¦æ±éä»¶ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /system/storage-blob/upload | ä¸ä¼ æä»¶ï¼å
¥å multipart ç `files`ï¼è¿å Blob å表ï¼å« `id`ï¼ | |
| | | | POST | /srm/tender-project/create | åå»ºææ é¡¹ç®ï¼æ°å¢å
¥å `blobIds` | |
| | | | PUT | /srm/tender-project/update | æ´æ°ææ 项ç®ï¼æ°å¢å
¥å `blobIds`ï¼è稿/åå¸ä¸/ææ ä¸åå¢éæ´æ°éä»¶ï¼ | |
| | | | PUT | /srm/tender-project/update-info | é¨åæ´æ°ï¼åå¸ä¸/ææ ä¸ï¼ï¼æ°å¢å
¥å `blobIds` | |
| | | | DELETE | /srm/tender-project/delete | å 餿æ 项ç®ï¼åæ¥å é¤éä»¶ | |
| | | | GET | /srm/tender-project/get | 详æ
æ¥è¯¢ï¼ååºæ°å¢ `attachmentList` | |
| | | | GET | /srm/tender-project/page | å页æ¥è¯¢ï¼ååºæ°å¢ `attachmentList` | |
| | | |
| | | **请æ±åæ°ï¼create/update/update-info æ°å¢å段ï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | blobIds | Array\<Long\> | å¦ | èµè´¨è¦æ±éä»¶æä»¶ ID å表 | |
| | | |
| | | **ååºå段æ°å¢ï¼** åèµè´¨è¯ä¹¦ï¼`attachmentList` æ°ç»å
ç´ å« `id`ã`name`ã`url`ã`previewURL`ã`downloadURL`ã |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | è¯ä¹¦éä»¶ | èµè´¨è¯ä¹¦å表 | æ°å¢ãéä»¶ãåï¼æ¾ç¤ºéä»¶åç§°é¾æ¥ï¼ç¹å»æ°çªå£æå¼ï¼æ éä»¶æ¾ç¤º `--` | |
| | | | è¯ä¹¦éä»¶ | èµè´¨è¯ä¹¦æ°å¢/ç¼è¾å¼¹çª | ãè¯ä¹¦éä»¶ãä¸ä¼ é¡¹ï¼æ¯æå¤æä»¶ï¼ç¼è¾æ¶åæ¾å·²ä¸ä¼ æä»¶ | |
| | | | èµè´¨è¦æ±éä»¶ | ææ é¡¹ç®æ°å¢/ç¼è¾å¼¹çª | ãèµè´¨è¦æ±éä»¶ãä¸ä¼ é¡¹ï¼æ¯æå¤æä»¶ï¼ç¼è¾æ¶åæ¾å·²ä¸ä¼ æä»¶ | |
| | | | èµè´¨è¦æ±éä»¶ | ææ é¡¹ç®è¯¦æ
页 | ãèµè´¨è¦æ±ãæå 颿¿å
å±ç¤ºéä»¶åç§°é¾æ¥ï¼ç¹å»æ°çªå£æå¼ | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | ç¼è¾åæ¾ | ç¼è¾æ¶å端è¿å `attachmentList`ï¼å端å°å
¶æ å°ä¸ºä¸ä¼ ç»ä»¶æä»¶å¯¹è±¡ï¼`uid`ã`name`ã`url`ã`status='done'`ã`id`ï¼å¹¶èµç» `blobIds`ï¼æäº¤æ¶æ `valueKey='id'` æåæä»¶ ID æäº¤ | |
| | | | éä»¶æ´æ° | å端æãå¢éæ´æ°ãå¤çï¼ä»¥æ¬æ¬¡æäº¤ç `blobIds` 为åï¼èªå¨å é¤å·²ç§»é¤çæä»¶ç»å®ãæ°å¢æ°ä¸ä¼ çæä»¶ç»å® | |
| | | | å é¤ä¸å¡è®°å½ | å é¤èµè´¨è¯ä¹¦/ææ é¡¹ç®æ¶ï¼åç«¯åæ¥å é¤å
¶éä»¶ | |
| | | | åå¸ä¸/ææ ä¸ç¼è¾ | ææ é¡¹ç®å¨åå¸ä¸/ææ ä¸é¶æ®µéè¿ `update-info` æ¥å£ä»
è½ä¿®æ¹ææ 说æãèµè´¨è¦æ±åèµè´¨è¦æ±éä»¶ | |
| | | | ä¸ä¼ æ ¼å¼ | æ¯æ jpgãjpegãpngãpdfãdocãdocxï¼å个æä»¶ä¸è¶
è¿ 2MB | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - ä¸ä¼ å¿
须走 `/system/storage-blob/upload`ï¼ç¦æ¢ä½¿ç¨æ§ç `/infra/file/*` æ¥å£ã |
| | | - èµè´¨è¯ä¹¦ä¸ææ 项ç®ä½¿ç¨ä¸åç `recordType`ï¼èµè´¨è¯ä¹¦ä¸º `srm_supplier_certificate`ï¼ææ 项ç®ä¸º `srm_tender_project`ï¼å端æ éå
³å¿ï¼ç±å端å¤çã |
| | | - ç¼è¾åæ¾æ¶è¥ç¨æ·æªæ¹å¨éä»¶ï¼æäº¤ç `blobIds` ä»åºå
å«åææä»¶ IDï¼ç±ä¸ä¼ ç»ä»¶åæ¾å¯¹è±¡æºå¸¦ï¼ï¼é¿å
é件被误å ã |
| | | - ææ é¡¹ç®é¨åæ´æ°ï¼`update-info`ï¼è¯·æ±ä½åæ ·éæºå¸¦ `blobIds`ã |
| | | - å表页é件龿¥å»ºè®® `target="_blank"` æ°çªå£æå¼ï¼ä¾¿äºé¢è§ PDF/å¾çã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # SRM ä¾åºåææ é人 & 䏿 èªå¨åå
¥ - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ææ é¡¹ç®è¯¦æ
é¡µï¼ææ 管ç Tabãè¯æ Tab çä¾åºåéæ©ï¼ |
| | | - SRM ä¾åºå管ç页é¢ï¼ä»
æ°å¢ `getSupplierList` APIï¼é¡µé¢æ¬èº«æ æ¹å¨ï¼ |
| | | |
| | | ## èæ¯ä¸éæ± |
| | | |
| | | 1. ææ é¡¹ç®è¯¦æ
页ä¸ãæ°å¢ææ ããè¯æ ãæ¶éæ©ä¾åºåï¼**ä¸åè¿æ»¤åå
¥ç¶æ**ï¼ç´æ¥æ¥è¯¢ä¾åºåæ¡£æ¡å表ã |
| | | 2. 䏿 å¹¶çæéè´è®¢åæ¶ï¼å¦æä¾åºåå°æªåå
¥ï¼å端ä¼èªå¨å建åå
¥ç³è¯·å¹¶ç½®ä¸ºå·²éè¿ï¼å端æ éé¢å¤å¤çã |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /srm/supplier/list | è·åä¾åºåæ¡£æ¡å表ï¼ä¸è¿æ»¤åå
¥ç¶æï¼ | |
| | | |
| | | **请æ±åæ°ï¼** æ |
| | | |
| | | **ååºï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | number | ä¾åºå ID | |
| | | | name | string | ä¾åºååç§° | |
| | | | code | string | ä¾åºåç¼ç | |
| | | | status | number | ç¶æï¼0 å¯ç¨ï¼1 ç¦ç¨ï¼ | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": [ |
| | | { "id": 1, "code": "SUP001", "name": "ææå
¬å¸", "status": 0 } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. æ°å¢ API 彿° |
| | | |
| | | å¨ `src/api/srm/supplier/index.ts` 䏿°å¢ `getSupplierList()`ï¼è¯·æ± `/srm/supplier/list`ã |
| | | |
| | | > åæç `getSupplierSimpleList()`ï¼è¯·æ± `/srm/supplier/simple-list`ï¼ä»
è¿åå·²åå
¥ä¾åºåï¼**ä¿çä¸å¨**ï¼å
¶å®é¡µé¢ï¼éè´è®¢åãéè´å
¥åºãIQC çï¼ä»ä½¿ç¨å®ã |
| | | |
| | | ### 2. ææ é¡¹ç®è¯¦æ
页æ¹ç¨æ¡£æ¡å表 |
| | | |
| | | `src/views/srm/tender/detail.vue` ä¸ï¼ |
| | | |
| | | - å° `getSupplierSimpleList` ç import æ¿æ¢ä¸º `getSupplierList` |
| | | - å° `onMounted` ä¸å è½½ä¾åºåæ°æ®çè°ç¨æ¹ä¸º `getSupplierList` |
| | | |
| | | 该页é¢çãææ 管çãä¾åºå鿩䏿ããè¯æ ãä¾åºå鿩䏿ï¼å使ç¨åä¸ä¸ª `supplierList`ï¼æ¿æ¢åä¸¤ä¸ªä¸æé½ä¼å±ç¤ºå
¨é¨ä¾åºåæ¡£æ¡ï¼ä¸è¿æ»¤åå
¥ï¼ã |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | id | 䏿 value | ä¾åºå IDï¼æäº¤ç»å端 | |
| | | | name | 䏿 label | ä¾åºååç§° | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | ææ æ¶éæ©ä¾åºå | å±ç¤ºå
¨é¨ä¾åºåæ¡£æ¡ï¼ä¸åè¿æ»¤åå
¥ç¶æ | |
| | | | è¯æ æ¶éæ©ä¾åºå | åææ ï¼å±ç¤ºå
¨é¨ä¾åºåæ¡£æ¡ | |
| | | | 䏿 çæéè´è®¢å | è¥ä¾åºåæªåå
¥ï¼å端èªå¨å建åå
¥ç³è¯·å¹¶ç´æ¥ç½®ä¸ºå·²éè¿ï¼åçæéè´è®¢åï¼å端æ éè°ç¨åå
¥ç¸å
³æ¥å£ | |
| | | | æªåå
¥ä¾åºåè½å¦ææ | å¯ä»¥ï¼ææ ä¸ååå
¥ç¶æéå¶ | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - `getSupplierList` è¿åçæ°ç»å
ç´ å« `id`ã`name`ï¼å¯ç´æ¥ç¨äºä¸æé项ï¼`{ id, name }`ï¼ã |
| | | - ä¾åºå被ç¦ç¨ï¼status = 1ï¼æ¶æ¯å¦å
è®¸ææ ï¼æ¬æ¥å£ä¸è¿æ»¤åå
¥ç¶æï¼`status` åæ®µç±å端å³å®æ¯å¦è¿æ»¤å±ç¤ºï¼ç®åææ è¯¦æ
页䏿ä¸è¿æ»¤ã |
| | | - 䏿 èªå¨åå
¥æ¯å端è¡ä¸ºï¼å端ãç¡®è®¤ä¸æ ããçæéè´è®¢åãæé®çè°ç¨æ¹å¼ä¸åã |
| | |
| | | List<DeptRespDTO> startDepts = metaInfo != null ? convertList(metaInfo.getStartDeptIds(), deptMap::get) : null; |
| | | return buildModel0(model, metaInfo, form, category, deployment, processDefinition, startUsers, startDepts); |
| | | }); |
| | | // æåº |
| | | result.sort(Comparator.comparing(BpmModelMetaInfoVO::getSort)); |
| | | // æåºï¼æå·¥é¨ç½²ï¼DB ç´æï¼ç模åå¯è½æ²¡æ metaInfo/sortï¼å
åºæå°æå |
| | | result.sort(Comparator.comparing(BpmModelMetaInfoVO::getSort, |
| | | Comparator.nullsLast(Comparator.naturalOrder()))); |
| | | return result; |
| | | } |
| | | |
| | |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderRespVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInvoiceDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpPurchaseInvoiceAuditStatusEnum; |
| | | import cn.iocoder.yudao.module.erp.service.finance.ErpFinancePaymentService; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInvoiceService; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInvoiceServiceImpl; |
| | |
| | | }); |
| | | } |
| | | |
| | | @PutMapping("/update-status") |
| | | @Operation(summary = "æ´æ°æ¥ç¥¨çç¶æï¼å®¡æ ¸/åå®¡æ ¸ï¼") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-invoice:update-status')") |
| | | public CommonResult<Boolean> updatePurchaseInvoiceStatus(@RequestParam("id") Long id, |
| | | @RequestParam("status") Integer status) { |
| | | invoiceService.updatePurchaseInvoiceStatus(id, status); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/audit-count") |
| | | @Operation(summary = "è·å¾å¾
å®¡æ ¸æ¥ç¥¨æ°é") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-invoice:query')") |
| | | public CommonResult<Long> getAuditInvoiceCount() { |
| | | return success(invoiceService.getAuditInvoiceCount()); |
| | | } |
| | | |
| | | @GetMapping("/simple-list") |
| | | @Operation(summary = "è·å¾æ¥ç¥¨ç²¾ç®å表", description = "åªå
å«å®¡æ ¸éè¿ä¸å·²ä¸ä¼ å票éä»¶çæ¥ç¥¨ï¼ä¸»è¦ç¨äºä»æ¬¾å建æ¶éæ©å
³èæ¥ç¥¨") |
| | | @Operation(summary = "è·å¾æ¥ç¥¨ç²¾ç®å表", description = "åªå
å«å·²ä¸ä¼ å票éä»¶çæ¥ç¥¨ï¼ä¸»è¦ç¨äºä»æ¬¾å建æ¶éæ©å
³èæ¥ç¥¨") |
| | | @Parameter(name = "supplierId", description = "ä¾åºåç¼å·", required = true) |
| | | @Parameter(name = "purchaseOrderId", description = "éè´è®¢åç¼å·ï¼å¯éï¼ç¨äºæè®¢åè¿æ»¤ï¼") |
| | | @PreAuthorize("@ss.hasPermission('erp:purchase-invoice:query')") |
| | |
| | | @RequestParam(value = "purchaseOrderId", required = false) Long purchaseOrderId) { |
| | | List<ErpPurchaseInvoiceDO> invoices; |
| | | if (purchaseOrderId != null) { |
| | | invoices = invoiceService.getPurchaseInvoiceListByOrderIdAndStatus(purchaseOrderId, |
| | | List.of(ErpPurchaseInvoiceAuditStatusEnum.APPROVE.getStatus())); |
| | | invoices = invoiceService.getPurchaseInvoiceListByOrderId(purchaseOrderId); |
| | | } else { |
| | | invoices = invoiceService.getPurchaseInvoiceListBySupplierIdAndStatus(supplierId, |
| | | List.of(ErpPurchaseInvoiceAuditStatusEnum.APPROVE.getStatus())); |
| | | invoices = invoiceService.getPurchaseInvoiceListBySupplierId(supplierId); |
| | | } |
| | | if (CollUtil.isEmpty(invoices)) { |
| | | return success(Collections.emptyList()); |
| | |
| | | .setId(invoice.getId()).setNo(invoice.getNo()).setInvoiceNo(invoice.getInvoiceNo()) |
| | | .setInvoiceTitle(invoice.getInvoiceTitle()).setPrice(invoice.getPrice()) |
| | | .setSupplierId(invoice.getSupplierId()).setPurchaseOrderId(invoice.getPurchaseOrderId()) |
| | | .setAuditStatus(invoice.getAuditStatus()).setHasAttachment(true) |
| | | .setHasAttachment(true) |
| | | .setRemainingInvoicePrice(remainingPrice)); |
| | | } |
| | | return success(result); |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpPurchaseInvoiceAuditStatusEnum; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | |
| | | |
| | | @Schema(description = "éè´è®¢åç¼å·", example = "17386") |
| | | private Long purchaseOrderId; |
| | | |
| | | @Schema(description = "审æ¹ç¶æ", example = "20") |
| | | @InEnum(ErpPurchaseInvoiceAuditStatusEnum.class) |
| | | private Integer auditStatus; |
| | | |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice; |
| | | |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderRespVO; |
| | | import cn.iocoder.yudao.module.erp.enums.DictTypeConstants; |
| | | import cn.iocoder.yudao.module.system.api.storage.dto.StorageBlobRespDTO; |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | |
| | | @Schema(description = "æ¥ç¥¨æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-02-02") |
| | | @ExcelProperty("æ¥ç¥¨æ¥æ") |
| | | private LocalDateTime invoiceTime; |
| | | |
| | | @Schema(description = "审æ¹ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | @ExcelProperty(value = "审æ¹ç¶æ", converter = DictConvert.class) |
| | | @DictFormat(DictTypeConstants.AUDIT_STATUS) |
| | | private Integer auditStatus; |
| | | |
| | | @Schema(description = "工使µç¼å·", example = "1043") |
| | | @ExcelProperty("工使µç¼å·") |
| | | private String processInstanceId; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.dataobject.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpPurchaseInvoiceAuditStatusEnum; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | /** |
| | | * 工使µç¼å· |
| | | * |
| | | * å
³è ProcessInstance ç id 屿§ |
| | | */ |
| | | private String processInstanceId; |
| | | /** |
| | | * 审æ¹ç¶æ |
| | | * |
| | | * æä¸¾ {@link ErpPurchaseInvoiceAuditStatusEnum} |
| | | */ |
| | | private Integer auditStatus; |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice.ErpPurchaseInvoicePageReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInvoiceDO; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpPurchaseInvoiceAuditStatusEnum; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | return selectOne(ErpPurchaseInvoiceDO::getNo, no); |
| | | } |
| | | |
| | | default int updateByIdAndStatus(Long id, Integer status, ErpPurchaseInvoiceDO updateObj) { |
| | | return update(updateObj, new LambdaUpdateWrapper<ErpPurchaseInvoiceDO>() |
| | | .eq(ErpPurchaseInvoiceDO::getId, id).eq(ErpPurchaseInvoiceDO::getAuditStatus, status)); |
| | | } |
| | | |
| | | default PageResult<ErpPurchaseInvoiceDO> selectPage(ErpPurchaseInvoicePageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<ErpPurchaseInvoiceDO>() |
| | | .likeIfPresent(ErpPurchaseInvoiceDO::getNo, reqVO.getNo()) |
| | | .eqIfPresent(ErpPurchaseInvoiceDO::getSupplierId, reqVO.getSupplierId()) |
| | | .eqIfPresent(ErpPurchaseInvoiceDO::getPurchaseOrderId, reqVO.getPurchaseOrderId()) |
| | | .eqIfPresent(ErpPurchaseInvoiceDO::getAuditStatus, reqVO.getAuditStatus()) |
| | | .orderByDesc(ErpPurchaseInvoiceDO::getId)); |
| | | } |
| | | |
| | | default List<ErpPurchaseInvoiceDO> selectListByOrderIdAndStatus(Long orderId, Collection<Integer> auditStatuses) { |
| | | default List<ErpPurchaseInvoiceDO> selectListByOrderId(Long orderId) { |
| | | return selectList(new LambdaQueryWrapperX<ErpPurchaseInvoiceDO>() |
| | | .eq(ErpPurchaseInvoiceDO::getPurchaseOrderId, orderId) |
| | | .in(ErpPurchaseInvoiceDO::getAuditStatus, auditStatuses)); |
| | | .eq(ErpPurchaseInvoiceDO::getPurchaseOrderId, orderId)); |
| | | } |
| | | |
| | | default List<ErpPurchaseInvoiceDO> selectListBySupplierIdAndStatus(Long supplierId, Collection<Integer> auditStatuses) { |
| | | default List<ErpPurchaseInvoiceDO> selectListBySupplierId(Long supplierId) { |
| | | return selectList(new LambdaQueryWrapperX<ErpPurchaseInvoiceDO>() |
| | | .eq(ErpPurchaseInvoiceDO::getSupplierId, supplierId) |
| | | .in(ErpPurchaseInvoiceDO::getAuditStatus, auditStatuses)); |
| | | } |
| | | |
| | | default Long selectCountByAudit() { |
| | | return selectCount(ErpPurchaseInvoiceDO::getAuditStatus, ErpPurchaseInvoiceAuditStatusEnum.PROCESS.getStatus()); |
| | | .eq(ErpPurchaseInvoiceDO::getSupplierId, supplierId)); |
| | | } |
| | | |
| | | } |
| | |
| | | // ========== ERP éè´æ¥ç¥¨ï¼1-030-105-000ï¼ ========== |
| | | ErrorCode PURCHASE_INVOICE_NOT_EXISTS = new ErrorCode(1_030_105_000, "æ¥ç¥¨ä¸åå¨"); |
| | | ErrorCode PURCHASE_INVOICE_NO_EXISTS = new ErrorCode(1_030_105_001, "çææ¥ç¥¨ç¼å·å¤±è´¥ï¼è¯·éæ°æäº¤"); |
| | | ErrorCode PURCHASE_INVOICE_UPDATE_FAIL_EDITING_PROHIBITED = new ErrorCode(1_030_105_002, "æ¥ç¥¨({})䏿¯æªå®¡æ ¸ç¶æï¼æ æ³ä¿®æ¹"); |
| | | ErrorCode PURCHASE_INVOICE_DELETE_FAIL_IS_APPROVE = new ErrorCode(1_030_105_003, "å 餿¥ç¥¨å¤±è´¥ï¼åå ï¼æ¥ç¥¨å®¡æ¹å·²éè¿"); |
| | | ErrorCode PURCHASE_INVOICE_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS = new ErrorCode(1_030_105_005, "æ´æ°æ¥ç¥¨å®¡æ ¸ç¶æå¤±è´¥ï¼åå ï¼æ¥ç¥¨ä¸æ¯å®¡æ ¸ä¸ç¶æ"); |
| | | ErrorCode PURCHASE_INVOICE_DELETE_FAIL_HAS_PAYMENT = new ErrorCode(1_030_105_004, "å 餿¥ç¥¨å¤±è´¥ï¼åå ï¼æ¥ç¥¨å·²å卿æä»æ¬¾å"); |
| | | ErrorCode PURCHASE_INVOICE_CREATE_FAIL_ORDER_NOT_APPROVE = new ErrorCode(1_030_105_006, "å建æ¥ç¥¨å¤±è´¥ï¼åå ï¼éè´è®¢å䏿¯å®¡æ ¸éè¿ç¶æ"); |
| | | ErrorCode PURCHASE_INVOICE_CREATE_FAIL_SUPPLIER_MISMATCH = new ErrorCode(1_030_105_007, "å建æ¥ç¥¨å¤±è´¥ï¼åå ï¼æ¥ç¥¨ä¾åºåä¸éè´è®¢åä¸ä¸è´"); |
| | | ErrorCode PURCHASE_INVOICE_CREATE_FAIL_PRICE_EXCEEDS_LIMIT = new ErrorCode(1_030_105_008, "å建æ¥ç¥¨å¤±è´¥ï¼åå ï¼æ¥ç¥¨éé¢è¶
åºéè´è®¢åéé¢ï¼ç®åå¯å¼ç¥¨ï¼{} å
"); |
| | | ErrorCode PURCHASE_INVOICE_APPROVE_FAIL = new ErrorCode(1_030_105_009, "å®¡æ ¸å¤±è´¥ï¼åªææªå®¡æ ¸çæ¥ç¥¨æè½å®¡æ ¸"); |
| | | ErrorCode PURCHASE_INVOICE_PROCESS_FAIL = new ErrorCode(1_030_105_010, "åå®¡æ ¸å¤±è´¥ï¼åªæå·²å®¡æ ¸çæ¥ç¥¨æè½åå®¡æ ¸"); |
| | | |
| | | // ========== ERP éè´éè´§ï¼1-030-103-000ï¼ ========== |
| | | ErrorCode PURCHASE_RETURN_NOT_EXISTS = new ErrorCode(1_030_103_000, "éè´éè´§åä¸åå¨"); |
| | |
| | | ErrorCode FINANCE_PAYMENT_NO_EXISTS = new ErrorCode(1_030_601_004, "çæä»æ¬¾åå·å¤±è´¥ï¼è¯·éæ°æäº¤"); |
| | | ErrorCode FINANCE_PAYMENT_UPDATE_FAIL_APPROVE = new ErrorCode(1_030_601_005, "仿¬¾å({})å·²å®¡æ ¸ï¼æ æ³ä¿®æ¹"); |
| | | ErrorCode FINANCE_PAYMENT_CREATE_FAIL_INVOICE_NOT_EXISTS = new ErrorCode(1_030_601_006, "åå»ºä»æ¬¾å失败ï¼åå ï¼å
³èçæ¥ç¥¨ä¸åå¨"); |
| | | ErrorCode FINANCE_PAYMENT_CREATE_FAIL_INVOICE_NOT_APPROVE = new ErrorCode(1_030_601_007, "åå»ºä»æ¬¾å失败ï¼åå ï¼å
³èçæ¥ç¥¨ä¸æ¯å®¡æ¹éè¿ç¶æ"); |
| | | ErrorCode FINANCE_PAYMENT_CREATE_FAIL_INVOICE_NOT_ATTACHMENT = new ErrorCode(1_030_601_008, "åå»ºä»æ¬¾å失败ï¼åå ï¼å
³èçæ¥ç¥¨æªä¸ä¼ å票éä»¶"); |
| | | ErrorCode FINANCE_PAYMENT_CREATE_FAIL_INVOICE_SUPPLIER_MISMATCH = new ErrorCode(1_030_601_009, "åå»ºä»æ¬¾å失败ï¼åå ï¼å
³èçæ¥ç¥¨ä¸æéä¾åºåä¸å¹é
"); |
| | | ErrorCode FINANCE_PAYMENT_CREATE_FAIL_INVOICE_PRICE_EXCEEDS = new ErrorCode(1_030_601_010, "åå»ºä»æ¬¾å失败ï¼åå ï¼ä»æ¬¾éé¢è¶
åºè¯¥æ¥ç¥¨å©ä½å¯ä»éé¢ï¼ç®åå¯ä»ï¼{} å
"); |
| | |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinancePaymentMapper; |
| | | 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.ErpPurchaseInvoiceAuditStatusEnum; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInvoiceService; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInvoiceServiceImpl; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService; |
| | |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªä»æ¬¾åå
³èçæ¥ç¥¨ï¼åå¨ã审æ¹éè¿ãå·²ä¸ä¼ å票éä»¶ãä¾åºå䏿¥ç¥¨ä¸è´ |
| | | * æ ¡éªä»æ¬¾åå
³èçæ¥ç¥¨ï¼åå¨ãå·²ä¸ä¼ å票éä»¶ãä¾åºå䏿¥ç¥¨ä¸è´ |
| | | * |
| | | * @param invoiceId æ¥ç¥¨ç¼å· |
| | | * @param supplierId ä¾åºåç¼å· |
| | |
| | | if (invoice == null) { |
| | | throw exception(FINANCE_PAYMENT_CREATE_FAIL_INVOICE_NOT_EXISTS); |
| | | } |
| | | // 2. æ ¡éªæ¥ç¥¨å®¡æ¹éè¿ |
| | | if (ObjectUtil.notEqual(invoice.getAuditStatus(), ErpPurchaseInvoiceAuditStatusEnum.APPROVE.getStatus())) { |
| | | throw exception(FINANCE_PAYMENT_CREATE_FAIL_INVOICE_NOT_APPROVE); |
| | | } |
| | | // 3. æ ¡éªå·²ä¸ä¼ å票éä»¶ |
| | | // 2. æ ¡éªå·²ä¸ä¼ å票éä»¶ |
| | | if (CollUtil.isEmpty(storageAttachmentApi.listAttachments( |
| | | ErpPurchaseInvoiceServiceImpl.PURCHASE_INVOICE_RECORD_TYPE, invoiceId))) { |
| | | throw exception(FINANCE_PAYMENT_CREATE_FAIL_INVOICE_NOT_ATTACHMENT); |
| | | } |
| | | // 4. æ ¡éªä¾åºå䏿¥ç¥¨ä¸è´ï¼é²èæ°æ®ï¼ |
| | | // 3. æ ¡éªä¾åºå䏿¥ç¥¨ä¸è´ï¼é²èæ°æ®ï¼ |
| | | if (ObjectUtil.notEqual(invoice.getSupplierId(), supplierId)) { |
| | | throw exception(FINANCE_PAYMENT_CREATE_FAIL_INVOICE_SUPPLIER_MISMATCH); |
| | | } |
| | |
| | | void deletePurchaseInvoice(Long id); |
| | | |
| | | /** |
| | | * æ´æ°æ¥ç¥¨çç¶æï¼å®¡æ ¸/åå®¡æ ¸ï¼ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param status ç¶æ |
| | | */ |
| | | void updatePurchaseInvoiceStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * è·å¾æ¥ç¥¨ |
| | | * |
| | | * @param id ç¼å· |
| | |
| | | PageResult<ErpPurchaseInvoiceDO> getPurchaseInvoicePage(ErpPurchaseInvoicePageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * æ ¹æ®éè´è®¢åç¼å·å审æ¹ç¶æè·å¾æ¥ç¥¨å表 |
| | | * æ ¹æ®éè´è®¢åç¼å·è·å¾æ¥ç¥¨å表 |
| | | * |
| | | * @param orderId éè´è®¢åç¼å· |
| | | * @param auditStatuses 审æ¹ç¶æéå |
| | | * @return æ¥ç¥¨å表 |
| | | */ |
| | | List<ErpPurchaseInvoiceDO> getPurchaseInvoiceListByOrderIdAndStatus(Long orderId, Collection<Integer> auditStatuses); |
| | | List<ErpPurchaseInvoiceDO> getPurchaseInvoiceListByOrderId(Long orderId); |
| | | |
| | | /** |
| | | * æ ¹æ®ä¾åºåç¼å·å审æ¹ç¶æè·å¾æ¥ç¥¨å表 |
| | | * æ ¹æ®ä¾åºåç¼å·è·å¾æ¥ç¥¨å表 |
| | | * |
| | | * @param supplierId ä¾åºåç¼å· |
| | | * @param auditStatuses 审æ¹ç¶æéå |
| | | * @return æ¥ç¥¨å表 |
| | | */ |
| | | List<ErpPurchaseInvoiceDO> getPurchaseInvoiceListBySupplierIdAndStatus(Long supplierId, Collection<Integer> auditStatuses); |
| | | |
| | | /** |
| | | * è·å¾å¾
å®¡æ ¸æ¥ç¥¨æ°é |
| | | * |
| | | * @return æ°é |
| | | */ |
| | | Long getAuditInvoiceCount(); |
| | | List<ErpPurchaseInvoiceDO> getPurchaseInvoiceListBySupplierId(Long supplierId); |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice.ErpPurchaseInvoiceSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInvoiceDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinancePaymentMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseInvoiceMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpPurchaseInvoiceAuditStatusEnum; |
| | | import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | 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.getSumValue; |
| | |
| | | private ErpPurchaseInvoiceMapper invoiceMapper; |
| | | |
| | | @Resource |
| | | private ErpFinancePaymentMapper financePaymentMapper; |
| | | |
| | | @Resource |
| | | private ErpNoRedisDAO noRedisDAO; |
| | | |
| | | @Resource |
| | |
| | | throw exception(PURCHASE_INVOICE_NO_EXISTS); |
| | | } |
| | | |
| | | // 2.1 æå
¥æ¥ç¥¨ï¼å建åå³ä¸ºæªå®¡æ ¸ç¶æï¼ |
| | | ErpPurchaseInvoiceDO invoice = BeanUtils.toBean(createReqVO, ErpPurchaseInvoiceDO.class) |
| | | .setNo(no).setAuditStatus(ErpPurchaseInvoiceAuditStatusEnum.PROCESS.getStatus()); |
| | | // 2.1 æå
¥æ¥ç¥¨ï¼å建åå³ä¸ºææç¶æï¼æ éå®¡æ ¸ï¼ |
| | | ErpPurchaseInvoiceDO invoice = BeanUtils.toBean(createReqVO, ErpPurchaseInvoiceDO.class).setNo(no); |
| | | invoiceMapper.insert(invoice); |
| | | |
| | | // 2.2 ç»å®å票éä»¶ |
| | |
| | | } |
| | | |
| | | private void validatePurchaseInvoicePriceExceedsLimit(ErpPurchaseInvoiceSaveReqVO reqVO) { |
| | | // 1. 计ç®å©ä½å¯å¼ç¥¨éé¢ï¼ä¸å
æ¬ reqVO èªèº«ï¼å®¡æ¹ä¸ä¹å ç¨é¢åº¦ï¼é²æ¢ç´¯è®¡æ¥ç¥¨è¶
è¿éè´è®¢åéé¢ï¼ |
| | | // 1. 计ç®å©ä½å¯å¼ç¥¨éé¢ï¼ä¸å
æ¬ reqVO èªèº«ï¼æææææ¥ç¥¨é½å ç¨é¢åº¦ï¼é²æ¢ç´¯è®¡æ¥ç¥¨è¶
è¿éè´è®¢åéé¢ï¼ |
| | | ErpPurchaseOrderDO purchaseOrder = purchaseOrderService.getPurchaseOrder(reqVO.getPurchaseOrderId()); |
| | | List<ErpPurchaseInvoiceDO> invoices = invoiceMapper.selectListByOrderIdAndStatus(reqVO.getPurchaseOrderId(), |
| | | List.of(ErpPurchaseInvoiceAuditStatusEnum.DRAFT.getStatus(), |
| | | ErpPurchaseInvoiceAuditStatusEnum.PROCESS.getStatus(), |
| | | ErpPurchaseInvoiceAuditStatusEnum.APPROVE.getStatus())); |
| | | List<ErpPurchaseInvoiceDO> invoices = invoiceMapper.selectListByOrderId(reqVO.getPurchaseOrderId()); |
| | | if (reqVO.getId() != null) { |
| | | invoices.removeIf(invoice -> ObjectUtil.equal(invoice.getId(), reqVO.getId())); |
| | | } |
| | |
| | | public void updatePurchaseInvoice(ErpPurchaseInvoiceSaveReqVO updateReqVO) { |
| | | Assert.notNull(updateReqVO.getId(), "æ¥ç¥¨ç¼å·ä¸è½ä¸ºç©º"); |
| | | // 1.1 æ ¡éªåå¨ |
| | | ErpPurchaseInvoiceDO oldInvoice = validatePurchaseInvoiceExists(updateReqVO.getId()); |
| | | // 1.2 åªææªå®¡æ ¸å¯ä»¥ç¼è¾ |
| | | if (ObjectUtil.notEqual(oldInvoice.getAuditStatus(), ErpPurchaseInvoiceAuditStatusEnum.PROCESS.getStatus())) { |
| | | throw exception(PURCHASE_INVOICE_UPDATE_FAIL_EDITING_PROHIBITED, oldInvoice.getNo()); |
| | | } |
| | | // 1.3 æ ¡éªå
³èæ°æ® + å¯å¼ç¥¨éé¢ |
| | | validatePurchaseInvoiceExists(updateReqVO.getId()); |
| | | // 1.2 æ ¡éªå
³èæ°æ® + å¯å¼ç¥¨éé¢ |
| | | validateRelationDataExists(updateReqVO); |
| | | validatePurchaseInvoicePriceExceedsLimit(updateReqVO); |
| | | |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deletePurchaseInvoice(Long id) { |
| | | // 1.1 æ ¡éªåå¨ |
| | | ErpPurchaseInvoiceDO invoice = validatePurchaseInvoiceExists(id); |
| | | // 1.2 审æ¹éè¿æ¶ï¼ä¸å
许å é¤ |
| | | if (ObjectUtil.equal(invoice.getAuditStatus(), ErpPurchaseInvoiceAuditStatusEnum.APPROVE.getStatus())) { |
| | | throw exception(PURCHASE_INVOICE_DELETE_FAIL_IS_APPROVE); |
| | | validatePurchaseInvoiceExists(id); |
| | | // 1.2 å·²æææä»æ¬¾åå
³èçæ¥ç¥¨ï¼ä¸å
许å é¤ï¼ä¿ææ¥ç¥¨ä¸ä»æ¬¾çå
³è宿´æ§ï¼ |
| | | Map<Long, BigDecimal> paidMap = financePaymentMapper.selectPaymentPriceMapByInvoiceId(List.of(id)); |
| | | if (paidMap.getOrDefault(id, BigDecimal.ZERO).compareTo(BigDecimal.ZERO) > 0) { |
| | | throw exception(PURCHASE_INVOICE_DELETE_FAIL_HAS_PAYMENT); |
| | | } |
| | | |
| | | // 2.1 å é¤å票éä»¶ |
| | | storageAttachmentApi.deleteAttachmentsByRecord(PURCHASE_INVOICE_RECORD_TYPE, id); |
| | | // 2.2 å 餿¥ç¥¨ |
| | | invoiceMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updatePurchaseInvoiceStatus(Long id, Integer status) { |
| | | boolean approve = ErpPurchaseInvoiceAuditStatusEnum.APPROVE.getStatus().equals(status); |
| | | // 1.1 æ ¡éªåå¨ |
| | | ErpPurchaseInvoiceDO invoice = validatePurchaseInvoiceExists(id); |
| | | // 1.2 æ ¡éªç¶æ |
| | | if (invoice.getAuditStatus().equals(status)) { |
| | | throw exception(approve ? PURCHASE_INVOICE_APPROVE_FAIL : PURCHASE_INVOICE_PROCESS_FAIL); |
| | | } |
| | | |
| | | // 2. æ´æ°ç¶æ |
| | | int updateCount = invoiceMapper.updateByIdAndStatus(id, invoice.getAuditStatus(), |
| | | new ErpPurchaseInvoiceDO().setAuditStatus(status)); |
| | | if (updateCount == 0) { |
| | | throw exception(approve ? PURCHASE_INVOICE_APPROVE_FAIL : PURCHASE_INVOICE_PROCESS_FAIL); |
| | | } |
| | | } |
| | | |
| | | private ErpPurchaseInvoiceDO validatePurchaseInvoiceExists(Long id) { |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<ErpPurchaseInvoiceDO> getPurchaseInvoiceListByOrderIdAndStatus(Long orderId, Collection<Integer> auditStatuses) { |
| | | return invoiceMapper.selectListByOrderIdAndStatus(orderId, auditStatuses); |
| | | public List<ErpPurchaseInvoiceDO> getPurchaseInvoiceListByOrderId(Long orderId) { |
| | | return invoiceMapper.selectListByOrderId(orderId); |
| | | } |
| | | |
| | | @Override |
| | | public List<ErpPurchaseInvoiceDO> getPurchaseInvoiceListBySupplierIdAndStatus(Long supplierId, Collection<Integer> auditStatuses) { |
| | | return invoiceMapper.selectListBySupplierIdAndStatus(supplierId, auditStatuses); |
| | | } |
| | | |
| | | @Override |
| | | public Long getAuditInvoiceCount() { |
| | | return invoiceMapper.selectCountByAudit(); |
| | | public List<ErpPurchaseInvoiceDO> getPurchaseInvoiceListBySupplierId(Long supplierId) { |
| | | return invoiceMapper.selectListBySupplierId(supplierId); |
| | | } |
| | | |
| | | } |
| | |
| | | syncReqDTO.setMaxStock(reqVO.getMaxStock()); |
| | | syncReqDTO.setHighValue(reqVO.getIsHighValue()); |
| | | syncReqDTO.setBatchFlag(reqVO.getIsBatchManaged()); |
| | | syncReqDTO.setStatus(reqVO.getStatus()); |
| | | syncReqDTO.setRemark(reqVO.getRemark()); |
| | | // æ¹æ¬¡é
ç½®åæ®µ |
| | | syncReqDTO.setProduceDateFlag(reqVO.getProduceDateFlag()); |
| | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "ç¶æ", example = "1") |
| | | private Integer status; |
| | | |
| | | // ========== æ¹æ¬¡å±æ§é
ç½® ========== |
| | | |
| | | @Schema(description = "çäº§æ¥æå¿
å¡«", example = "true") |
| | |
| | | import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.Parameters; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | |
| | | @PreAuthorize("@ss.hasPermission('mes:md-item:update')") |
| | | public CommonResult<Boolean> updateItem(@Valid @RequestBody MesMdItemSaveReqVO updateReqVO) { |
| | | itemService.updateItem(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/update-status") |
| | | @Operation(summary = "æ´æ°ç©æäº§åç¶æ") |
| | | @Parameters({ |
| | | @Parameter(name = "id", description = "ç¼å·", required = true), |
| | | @Parameter(name = "status", description = "ç¶æ", required = true) |
| | | }) |
| | | @PreAuthorize("@ss.hasPermission('mes:md-item:update')") |
| | | public CommonResult<Boolean> updateItemStatus(@RequestParam("id") Long id, |
| | | @RequestParam("status") Integer status) { |
| | | itemService.updateItemStatus(id, status); |
| | | return success(true); |
| | | } |
| | | |
| | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "ç¶æ", example = "1") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "æ¯å¦åæ¥å° MDM", example = "true") |
| | | private Boolean syncMdm; |
| | | |
| | |
| | | |
| | | // æå
¥ |
| | | MesMdItemDO item = BeanUtils.toBean(createReqVO, MesMdItemDO.class); |
| | | item.setStatus(CommonStatusEnum.DISABLE.getStatus()); // é»è®¤ç¦ç¨ãä¿¡æ¯å®æåï¼åå¯ç¨ |
| | | // ç¶æåªè½ç±åºç¡æ°æ®ï¼MDMï¼æ§å¶ï¼MDM åæ¥æ¶æ²¿ç¨å
¶ç¶æï¼MES æ¬å°æ°å¢é»è®¤ç¦ç¨ |
| | | item.setStatus(createReqVO.getMdmItemId() != null && createReqVO.getStatus() != null |
| | | ? createReqVO.getStatus() : CommonStatusEnum.DISABLE.getStatus()); |
| | | clearStockIfNotSafe(item); // 妿æªå¯ç¨å®å
¨åºåï¼æ¸
é¶åºåä¸ä¸é |
| | | itemMapper.insert(item); |
| | | |
| | |
| | | // æ´æ° |
| | | MesMdItemDO updateObj = BeanUtils.toBean(updateReqVO, MesMdItemDO.class); |
| | | clearStockIfNotSafe(updateObj); // 妿æªå¯ç¨å®å
¨åºåï¼æ¸
é¶åºåä¸ä¸é |
| | | // ç¶æåªè½ç±åºç¡æ°æ®ï¼MDMï¼æ§å¶ï¼MES æ¬å°æ´æ°ä¸å
许修æ¹ç¶æ |
| | | if (updateReqVO.getMdmItemId() == null) { |
| | | updateObj.setStatus(null); |
| | | } |
| | | itemMapper.updateById(updateObj); |
| | | |
| | | // åæ¥å° MDMï¼å¾é syncMdm æ¶ï¼ |
| | |
| | | import cn.iocoder.yudao.module.srm.controller.admin.certificate.vo.*; |
| | | import cn.iocoder.yudao.module.srm.dal.dataobject.SrmSupplierDO; |
| | | import cn.iocoder.yudao.module.srm.service.certificate.SrmSupplierCertificateService; |
| | | import cn.iocoder.yudao.module.srm.service.certificate.SrmSupplierCertificateServiceImpl; |
| | | import cn.iocoder.yudao.module.srm.service.supplier.SrmSupplierService; |
| | | import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | |
| | | |
| | | @Resource |
| | | private SrmSupplierService supplierService; |
| | | |
| | | @Resource |
| | | private StorageAttachmentApi storageAttachmentApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建èµè´¨è¯ä¹¦") |
| | |
| | | var pageResult = certificateService.getCertificatePage(pageReqVO); |
| | | var respList = BeanUtils.toBean(pageResult.getList(), SrmSupplierCertificateRespVO.class); |
| | | enrichSupplierNames(respList); |
| | | enrichAttachments(respList); |
| | | return success(new PageResult<>(respList, pageResult.getTotal())); |
| | | } |
| | | |
| | |
| | | public CommonResult<List<SrmSupplierCertificateRespVO>> getListBySupplier(@RequestParam("supplierId") Long supplierId) { |
| | | var list = BeanUtils.toBean(certificateService.getCertificateListBySupplierId(supplierId), SrmSupplierCertificateRespVO.class); |
| | | enrichSupplierNames(list); |
| | | enrichAttachments(list); |
| | | return success(list); |
| | | } |
| | | |
| | |
| | | public CommonResult<SrmSupplierCertificateRespVO> getCertificate(@RequestParam("id") Long id) { |
| | | var resp = BeanUtils.toBean(certificateService.getCertificate(id), SrmSupplierCertificateRespVO.class); |
| | | enrichSupplierName(resp); |
| | | enrichAttachments(List.of(resp)); |
| | | return success(resp); |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | private void enrichAttachments(List<SrmSupplierCertificateRespVO> list) { |
| | | if (list == null || list.isEmpty()) return; |
| | | list.forEach(vo -> vo.setAttachmentList(storageAttachmentApi.listAttachments( |
| | | SrmSupplierCertificateServiceImpl.CERTIFICATE_RECORD_TYPE, vo.getId()))); |
| | | } |
| | | |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.srm.controller.admin.certificate.vo; |
| | | |
| | | import cn.iocoder.yudao.module.system.api.storage.dto.StorageBlobRespDTO; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - SRM ä¾åºåèµè´¨è¯ä¹¦ Response VO") |
| | | @Data |
| | |
| | | @Schema(description = "å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | @Schema(description = "è¯ä¹¦éä»¶å表") |
| | | private List<StorageBlobRespDTO> attachmentList; |
| | | |
| | | } |
| | |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - SRM ä¾åºåèµè´¨è¯ä¹¦å建/æ´æ° Request VO") |
| | | @Data |
| | |
| | | @Schema(description = "夿³¨", example = "年度èµè´¨å®¡æ ¸") |
| | | private String remark; |
| | | |
| | | @Schema(description = "è¯ä¹¦éä»¶æä»¶IDå表") |
| | | private List<Long> blobIds; |
| | | |
| | | } |
| | |
| | | return success(BeanUtils.toBean(list, SrmSupplierRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·åä¾åºåæ¡£æ¡å表ï¼ä¸è¿æ»¤åå
¥ç¶æï¼") |
| | | public CommonResult<List<SrmSupplierRespVO>> getSupplierAllList() { |
| | | List<SrmSupplierDO> list = supplierService.getSupplierAllList(); |
| | | return success(BeanUtils.toBean(list, SrmSupplierRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºä¾åºå Excel") |
| | | @PreAuthorize("@ss.hasPermission('srm:supplier:export')") |
| | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.*; |
| | | import cn.iocoder.yudao.module.srm.service.tender.SrmTenderProjectService; |
| | | import cn.iocoder.yudao.module.srm.service.tender.SrmTenderProjectServiceImpl; |
| | | import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | |
| | | |
| | | @Resource |
| | | private SrmTenderProjectService tenderProjectService; |
| | | |
| | | @Resource |
| | | private StorageAttachmentApi storageAttachmentApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "åå»ºææ é¡¹ç®") |
| | |
| | | @Operation(summary = "è·åææ é¡¹ç®è¯¦æ
") |
| | | @PreAuthorize("@ss.hasPermission('srm:tender-project:query')") |
| | | public CommonResult<SrmTenderProjectRespVO> getTenderProject(@RequestParam("id") Long id) { |
| | | return success(BeanUtils.toBean(tenderProjectService.getTenderProject(id), SrmTenderProjectRespVO.class)); |
| | | var resp = BeanUtils.toBean(tenderProjectService.getTenderProject(id), SrmTenderProjectRespVO.class); |
| | | enrichAttachments(List.of(resp)); |
| | | return success(resp); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·åææ é¡¹ç®å页") |
| | | @PreAuthorize("@ss.hasPermission('srm:tender-project:query')") |
| | | public CommonResult<PageResult<SrmTenderProjectRespVO>> getTenderProjectPage(@Valid SrmTenderProjectPageReqVO pageReqVO) { |
| | | return success(BeanUtils.toBean(tenderProjectService.getTenderProjectPage(pageReqVO), SrmTenderProjectRespVO.class)); |
| | | var pageResult = tenderProjectService.getTenderProjectPage(pageReqVO); |
| | | var respList = BeanUtils.toBean(pageResult.getList(), SrmTenderProjectRespVO.class); |
| | | enrichAttachments(respList); |
| | | return success(new PageResult<>(respList, pageResult.getTotal())); |
| | | } |
| | | |
| | | // ========== å
³èæ°æ®å¡«å
========== |
| | | |
| | | private void enrichAttachments(List<SrmTenderProjectRespVO> list) { |
| | | if (list == null || list.isEmpty()) return; |
| | | list.forEach(vo -> vo.setAttachmentList(storageAttachmentApi.listAttachments( |
| | | SrmTenderProjectServiceImpl.TENDER_PROJECT_RECORD_TYPE, vo.getId()))); |
| | | } |
| | | |
| | | @PutMapping("/publish") |
| | |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - SRM ææ é¡¹ç®é¨åæ´æ° Request VOï¼åå¸ä¸/ææ ä¸é¶æ®µï¼") |
| | | @Data |
| | | public class SrmTenderProjectPartialUpdateReqVO { |
| | |
| | | @Schema(description = "èµè´¨è¦æ±", example = "éå
·å¤ISO9001认è¯") |
| | | private String qualificationRequirements; |
| | | |
| | | @Schema(description = "èµè´¨è¦æ±éä»¶æä»¶IDå表") |
| | | private List<Long> blobIds; |
| | | |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.srm.controller.admin.tender.vo; |
| | | |
| | | import cn.iocoder.yudao.module.system.api.storage.dto.StorageBlobRespDTO; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - SRM ææ é¡¹ç® Response VO") |
| | | @Data |
| | |
| | | @Schema(description = "èµè´¨è¦æ±", example = "éå
·å¤ISO9001认è¯") |
| | | private String qualificationRequirements; |
| | | |
| | | @Schema(description = "èµè´¨è¦æ±éä»¶å表") |
| | | private List<StorageBlobRespDTO> attachmentList; |
| | | |
| | | @Schema(description = "éè´ç³è¯·ID", example = "1") |
| | | private Long purchaseRequestId; |
| | | |
| | |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - SRM ææ é¡¹ç®å建/æ´æ° Request VO") |
| | | @Data |
| | |
| | | @Schema(description = "èµè´¨è¦æ±", example = "éå
·å¤ISO9001认è¯") |
| | | private String qualificationRequirements; |
| | | |
| | | @Schema(description = "èµè´¨è¦æ±éä»¶æä»¶IDå表") |
| | | private List<Long> blobIds; |
| | | |
| | | @Schema(description = "éè´ç³è¯·ID", example = "1") |
| | | private Long purchaseRequestId; |
| | | |
| | |
| | | */ |
| | | void approve(Long id); |
| | | |
| | | /** |
| | | * ç¡®ä¿ä¾åºåå·²åå
¥ï¼æªåå
¥åèªå¨å建åå
¥ç³è¯·å¹¶ç½®ä¸ºå·²éè¿ |
| | | * |
| | | * @param supplierId ä¾åºåç¼å· |
| | | */ |
| | | void ensureSupplierApproved(Long supplierId); |
| | | |
| | | } |
| | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void ensureSupplierApproved(Long supplierId) { |
| | | if (supplierId == null) { |
| | | return; |
| | | } |
| | | // æ ¡éªä¾åºååå¨ |
| | | SrmSupplierDO supplier = supplierMapper.selectById(supplierId); |
| | | if (supplier == null) { |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.SUPPLIER_NOT_EXISTS); |
| | | } |
| | | // å·²åå
¥åæ éå¤ç |
| | | if (supplierApplyMapper.existsApprovedBySupplierId(supplierId)) { |
| | | return; |
| | | } |
| | | // èªå¨å建åå
¥ç³è¯·å¹¶ç´æ¥ç½®ä¸ºå·²éè¿ |
| | | SrmSupplierApplyDO apply = new SrmSupplierApplyDO(); |
| | | apply.setApplyNo(generateApplyNo()); |
| | | apply.setSupplierId(supplierId); |
| | | apply.setSupplierName(supplier.getName()); |
| | | apply.setSupplierType(supplier.getType()); |
| | | apply.setCompanyNature(supplier.getCompanyNature()); |
| | | apply.setRegisteredCapital(supplier.getRegisteredCapital()); |
| | | apply.setBusinessLicenseNo(supplier.getBusinessLicenseNo()); |
| | | apply.setTaxNo(supplier.getTaxNo()); |
| | | apply.setAddress(supplier.getAddress()); |
| | | apply.setBankName(supplier.getBankName()); |
| | | apply.setBankAccount(supplier.getBankAccount()); |
| | | apply.setContactName(supplier.getContactName()); |
| | | apply.setContactMobile(supplier.getContactMobile()); |
| | | apply.setContactEmail(supplier.getContactEmail()); |
| | | apply.setRemark("䏿 çæéè´è®¢åæ¶èªå¨åå
¥å¹¶éè¿"); |
| | | apply.setApplyStatus(SupplierApplyStatusEnum.APPROVED.getCode()); |
| | | apply.setApplyTime(LocalDateTime.now()); |
| | | supplierApplyMapper.insert(apply); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void approve(Long id) { |
| | | SrmSupplierApplyDO apply = validateApplyExists(id); |
| | | if (!SupplierApplyStatusEnum.APPROVED.getCode().equals(apply.getApplyStatus())) { |
| | |
| | | package cn.iocoder.yudao.module.srm.service.certificate; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.srm.controller.admin.certificate.vo.SrmSupplierCertificatePageReqVO; |
| | |
| | | import cn.iocoder.yudao.module.srm.dal.mysql.SrmSupplierCertificateMapper; |
| | | import cn.iocoder.yudao.module.srm.enums.ErrorCodeConstants; |
| | | import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; |
| | | import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.time.LocalDate; |
| | |
| | | @Validated |
| | | public class SrmSupplierCertificateServiceImpl implements SrmSupplierCertificateService { |
| | | |
| | | /** |
| | | * èµè´¨è¯ä¹¦éä»¶çä¸å¡è®°å½ç±»åï¼å¯¹åº {@link cn.iocoder.yudao.module.system.enums.storage.StorageRecordTypeEnum#SRM_SUPPLIER_CERTIFICATE} |
| | | */ |
| | | public static final String CERTIFICATE_RECORD_TYPE = "srm_supplier_certificate"; |
| | | |
| | | @Resource |
| | | private SrmSupplierCertificateMapper certificateMapper; |
| | | |
| | | @Resource |
| | | private StorageAttachmentApi storageAttachmentApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createCertificate(SrmSupplierCertificateSaveReqVO createReqVO) { |
| | | SrmSupplierCertificateDO certificate = BeanUtils.toBean(createReqVO, SrmSupplierCertificateDO.class); |
| | | updateStatus(certificate); |
| | | certificateMapper.insert(certificate); |
| | | // ç»å®è¯ä¹¦éä»¶ |
| | | if (CollUtil.isNotEmpty(createReqVO.getBlobIds())) { |
| | | storageAttachmentApi.bindAttachments("file", CERTIFICATE_RECORD_TYPE, certificate.getId(), createReqVO.getBlobIds()); |
| | | } |
| | | return certificate.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateCertificate(SrmSupplierCertificateSaveReqVO updateReqVO) { |
| | | validateCertificateExists(updateReqVO.getId()); |
| | | SrmSupplierCertificateDO updateObj = BeanUtils.toBean(updateReqVO, SrmSupplierCertificateDO.class); |
| | | updateStatus(updateObj); |
| | | certificateMapper.updateById(updateObj); |
| | | // å¢éæ´æ°è¯ä¹¦éä»¶ |
| | | storageAttachmentApi.updateAttachments("file", CERTIFICATE_RECORD_TYPE, updateReqVO.getId(), updateReqVO.getBlobIds()); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deleteCertificate(Long id) { |
| | | validateCertificateExists(id); |
| | | // å é¤è¯ä¹¦éä»¶ |
| | | storageAttachmentApi.deleteAttachmentsByRecord(CERTIFICATE_RECORD_TYPE, id); |
| | | certificateMapper.deleteById(id); |
| | | } |
| | | |
| | |
| | | List<SrmSupplierDO> getSupplierSimpleList(); |
| | | |
| | | /** |
| | | * è·åå
¨é¨ä¾åºåæ¡£æ¡å表ï¼ä¸è¿æ»¤åå
¥ç¶æï¼ç¨äºææ éæ©ä¾åºåï¼ |
| | | */ |
| | | List<SrmSupplierDO> getSupplierAllList(); |
| | | |
| | | /** |
| | | * è·åä¾åºåå表 |
| | | */ |
| | | List<SrmSupplierDO> getSupplierList(Collection<Long> ids); |
| | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.srm.controller.admin.supplier.vo.SrmSupplierPageReqVO; |
| | | import cn.iocoder.yudao.module.srm.controller.admin.supplier.vo.SrmSupplierSaveReqVO; |
| | | import cn.iocoder.yudao.module.srm.dal.dataobject.*; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<SrmSupplierDO> getSupplierAllList() { |
| | | return supplierMapper.selectList(new LambdaQueryWrapperX<SrmSupplierDO>() |
| | | .orderByAsc(SrmSupplierDO::getId)); |
| | | } |
| | | |
| | | @Override |
| | | public List<SrmSupplierDO> getSupplierList(Collection<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | |
| | | import cn.iocoder.yudao.module.srm.enums.BidStatusEnum; |
| | | import cn.iocoder.yudao.module.srm.enums.ErrorCodeConstants; |
| | | import cn.iocoder.yudao.module.srm.enums.TenderStatusEnum; |
| | | import cn.iocoder.yudao.module.srm.service.apply.SrmSupplierApplyService; |
| | | import com.mzt.logapi.starter.annotation.LogRecord; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderApi erpPurchaseOrderApi; |
| | | |
| | | @Resource |
| | | private SrmSupplierApplyService supplierApplyService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.AWARD_SUPPLIER_NOT_SYNCED); |
| | | } |
| | | |
| | | // ä¾åºåæªåå
¥åèªå¨åå
¥å¹¶éè¿ï¼ä¿è¯éè´è®¢åæµç¨å¯ç¨ |
| | | supplierApplyService.ensureSupplierApproved(srmSupplier.getId()); |
| | | |
| | | // 3. æ¥ææ ç©æå表 |
| | | List<SrmTenderMaterialDO> materials = tenderMaterialMapper |
| | | .selectListByTenderProjectId(award.getTenderProjectId()); |
| | |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderCreateReqDTO; |
| | | 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.storage.StorageAttachmentApi; |
| | | import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.SrmTenderMaterialSaveReqVO; |
| | | import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.SrmTenderProjectPageReqVO; |
| | | import cn.iocoder.yudao.module.srm.controller.admin.tender.vo.SrmTenderProjectPartialUpdateReqVO; |
| | |
| | | import cn.iocoder.yudao.module.srm.enums.BidStatusEnum; |
| | | import cn.iocoder.yudao.module.srm.enums.ErrorCodeConstants; |
| | | import cn.iocoder.yudao.module.srm.enums.TenderStatusEnum; |
| | | import cn.iocoder.yudao.module.srm.service.apply.SrmSupplierApplyService; |
| | | import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; |
| | | import com.mzt.logapi.context.LogRecordContext; |
| | | import com.mzt.logapi.starter.annotation.LogRecord; |
| | |
| | | @Slf4j |
| | | public class SrmTenderProjectServiceImpl implements SrmTenderProjectService { |
| | | |
| | | /** |
| | | * ææ é¡¹ç®èµè´¨è¦æ±éä»¶çä¸å¡è®°å½ç±»åï¼å¯¹åº {@link cn.iocoder.yudao.module.system.enums.storage.StorageRecordTypeEnum#SRM_TENDER_PROJECT} |
| | | */ |
| | | public static final String TENDER_PROJECT_RECORD_TYPE = "srm_tender_project"; |
| | | |
| | | @Resource |
| | | private SrmTenderProjectMapper tenderProjectMapper; |
| | | @Resource |
| | |
| | | private MdmItemApi mdmItemApi; |
| | | @Resource |
| | | private ErpPurchaseOrderApi erpPurchaseOrderApi; |
| | | @Resource |
| | | private SrmSupplierApplyService supplierApplyService; |
| | | @Resource |
| | | private StorageAttachmentApi storageAttachmentApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createTenderProject(SrmTenderProjectSaveReqVO createReqVO) { |
| | | SrmTenderProjectDO project = BeanUtils.toBean(createReqVO, SrmTenderProjectDO.class); |
| | | project.setTenderStatus(TenderStatusEnum.DRAFT.getCode()); |
| | |
| | | project.setBiddingMode(tenderConfigService.getConfig().getDefaultBiddingMode()); |
| | | } |
| | | tenderProjectMapper.insert(project); |
| | | // ç»å®èµè´¨è¦æ±éä»¶ |
| | | if (CollUtil.isNotEmpty(createReqVO.getBlobIds())) { |
| | | storageAttachmentApi.bindAttachments("file", TENDER_PROJECT_RECORD_TYPE, project.getId(), createReqVO.getBlobIds()); |
| | | } |
| | | return project.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @LogRecord(type = LOG_TENDER_TYPE, subType = LOG_TENDER_UPDATE_SUB_TYPE, |
| | | bizNo = "{{#updateReqVO.id}}", success = LOG_TENDER_UPDATE_SUCCESS) |
| | | public void updateTenderProject(SrmTenderProjectSaveReqVO updateReqVO) { |
| | |
| | | SrmTenderProjectDO updateObj = BeanUtils.toBean(updateReqVO, SrmTenderProjectDO.class); |
| | | updateObj.setTenderStatus(status); // ç¶æä¸å
许åç«¯ä¼ å
¥è¦ç |
| | | tenderProjectMapper.updateById(updateObj); |
| | | // å¢éæ´æ°èµè´¨è¦æ±éä»¶ |
| | | storageAttachmentApi.updateAttachments("file", TENDER_PROJECT_RECORD_TYPE, updateReqVO.getId(), updateReqVO.getBlobIds()); |
| | | LogRecordContext.putVariable("tenderName", project.getTenderName()); |
| | | LogRecordContext.putVariable("oldTenderDesc", project.getTenderDesc()); |
| | | LogRecordContext.putVariable("newTenderDesc", updateReqVO.getTenderDesc()); |
| | |
| | | updateObj.setTenderDesc(updateReqVO.getTenderDesc()); |
| | | updateObj.setQualificationRequirements(updateReqVO.getQualificationRequirements()); |
| | | tenderProjectMapper.updateById(updateObj); |
| | | // å¢éæ´æ°èµè´¨è¦æ±éä»¶ |
| | | storageAttachmentApi.updateAttachments("file", TENDER_PROJECT_RECORD_TYPE, updateReqVO.getId(), updateReqVO.getBlobIds()); |
| | | LogRecordContext.putVariable("tenderName", project.getTenderName()); |
| | | LogRecordContext.putVariable("oldTenderDesc", project.getTenderDesc()); |
| | | LogRecordContext.putVariable("newTenderDesc", updateReqVO.getTenderDesc()); |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deleteTenderProject(Long id) { |
| | | SrmTenderProjectDO project = validateTenderExists(id); |
| | | if (!TenderStatusEnum.DRAFT.getCode().equals(project.getTenderStatus())) { |
| | |
| | | if (tenderBidMapper.countByTenderProjectId(id) > 0) { |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.TENDER_HAS_BIDS_CANNOT_DELETE); |
| | | } |
| | | // å é¤èµè´¨è¦æ±éä»¶ |
| | | storageAttachmentApi.deleteAttachmentsByRecord(TENDER_PROJECT_RECORD_TYPE, id); |
| | | tenderMaterialMapper.deleteByTenderProjectId(id); |
| | | tenderProjectMapper.deleteById(id); |
| | | } |
| | |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.AWARD_SUPPLIER_NOT_SYNCED); |
| | | } |
| | | |
| | | // ä¾åºåæªåå
¥åèªå¨åå
¥å¹¶éè¿ï¼ä¿è¯éè´è®¢åæµç¨å¯ç¨ |
| | | supplierApplyService.ensureSupplierApproved(supplier.getId()); |
| | | |
| | | // æ¥ææ ç©æ |
| | | List<SrmTenderMaterialDO> materials = tenderMaterialMapper |
| | | .selectListByTenderProjectId(award.getTenderProjectId()); |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | @LogRecord(type = LOG_TENDER_TYPE, subType = LOG_TENDER_UPDATE_SUB_TYPE, |
| | | bizNo = "{{#updateReqVO.id}}", success = LOG_TENDER_UPDATE_SUCCESS) |
| | | public void updateTenderProjectPartial(SrmTenderProjectPartialUpdateReqVO updateReqVO) { |
| | |
| | | updateObj.setTenderDesc(updateReqVO.getTenderDesc()); |
| | | updateObj.setQualificationRequirements(updateReqVO.getQualificationRequirements()); |
| | | tenderProjectMapper.updateById(updateObj); |
| | | // å¢éæ´æ°èµè´¨è¦æ±éä»¶ |
| | | storageAttachmentApi.updateAttachments("file", TENDER_PROJECT_RECORD_TYPE, updateReqVO.getId(), updateReqVO.getBlobIds()); |
| | | LogRecordContext.putVariable("tenderName", project.getTenderName()); |
| | | LogRecordContext.putVariable("oldTenderDesc", project.getTenderDesc()); |
| | | LogRecordContext.putVariable("newTenderDesc", updateReqVO.getTenderDesc()); |
| | |
| | | AFTER_SALE_RETURN("aftersales_after_sale_return", "å®åéè´§ç³è¯·"), |
| | | |
| | | // ===== MES ===== |
| | | MES_PD_DOCUMENT("mes_pd_document", "MES è®¾è®¡èµæ"); |
| | | MES_PD_DOCUMENT("mes_pd_document", "MES è®¾è®¡èµæ"), |
| | | |
| | | // ===== SRM ===== |
| | | SRM_SUPPLIER_CERTIFICATE("srm_supplier_certificate", "SRM ä¾åºåèµè´¨è¯ä¹¦"), |
| | | SRM_TENDER_PROJECT("srm_tender_project", "SRM ææ é¡¹ç®"); |
| | | |
| | | private final String type; |
| | | private final String description; |