Merge remote-tracking branch 'origin/dev_business' into dev_business
已添加21个文件
已修改82个文件
已删除332个文件
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # æ°æ®åºæä½è§å |
| | | |
| | | ## æ°æ®åºçæ¬ |
| | | |
| | | - **MySQL çæ¬**: 8.4.8 |
| | | - 注æ MySQL 8.4 çè¯æ³å·®å¼ï¼å¦ `GROUP BY` æ´ä¸¥æ ¼ãé¨ååºå¼å½æ°çï¼ |
| | | |
| | | ## Docker é¨ç½²é
ç½® |
| | | |
| | | ```bash |
| | | --sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION" \ |
| | | --innodb_strict_mode=OFF \ |
| | | --innodb_page_size=32k \ |
| | | --max_connections=1020 \ |
| | | --lower_case_table_names=1 \ |
| | | --innodb_buffer_pool_size=70G \ |
| | | --innodb_flush_log_at_trx_commit=2 \ |
| | | --innodb_log_file_size=2G \ |
| | | --innodb_log_buffer_size=64M |
| | | ``` |
| | | |
| | | **é
置说æï¼** |
| | | - `lower_case_table_names=1`: 表åä¸åºå大å°å |
| | | - `innodb_page_size=32k`: è¾å¤§ç页大å°éåå¤§æ°æ®éåºæ¯ |
| | | - `innodb_buffer_pool_size=70G`: ç¼å²æ± 大å°ï¼å»ºè®®ä¸ºç©çå
åç 60-80% |
| | | - `innodb_flush_log_at_trx_commit=2`: æ¯ç§å·åæ¥å¿ï¼æ§è½ä¼å
ï¼ééèåºæ¯ï¼ |
| | | |
| | | ## è§å |
| | | |
| | | - ä¼å
ä½¿ç¨ MySQL MCP å·¥å
·ï¼`mcp__designcomputer-mysql_mcp_server__execute_sql`ã`mcp__designcomputer-mysql_mcp_server__get_schema_info`ã`mcp__designcomputer-mysql_mcp_server__get_table_sample`ï¼ç´æ¥æä½æ°æ®åºï¼èééè¿ Bash æ§è¡ mysql å½ä»¤ã |
| | | - æ¥è¯¢ãéªè¯ãè°è¯æ°æ®åºæ¶ï¼ç´æ¥è°ç¨ MCP å·¥å
·æ§è¡ SQLï¼æ éåç¨æ·è¾åº SQL è¯å¥æè¯¢é®æ¯å¦æ§è¡ã |
| | | - ä»
å¨ä»¥ä¸åºæ¯è¾åº SQLï¼ç¨æ·æç¡®è¦æ±æ¥ç SQLãéè¦çæ SQL èæ¬æä»¶ï¼å¦è¿ç§»èæ¬ï¼ãMCP å·¥å
·ä¸å¯ç¨æ¶åéå° Bashã |
| | | |
| | | ## MCP å·¥å
·è¯´æ |
| | | |
| | | | å·¥å
· | ç¨é | |
| | | |------|------| |
| | | | `execute_sql` | æ§è¡ SQL è¯å¥ï¼SELECT/INSERT/UPDATE/DELETE/DDLï¼ | |
| | | | `get_schema_info` | è·åè¡¨ç»æä¿¡æ¯ï¼ååãç±»åãæ³¨éçï¼ | |
| | | | `get_table_sample` | è·åè¡¨æ°æ®æ ·æ¬ï¼ç¨äºäºè§£æ°æ®æ ¼å¼ï¼ | |
| | | |
| | | ## æ§è¡ SQL èæ¬ |
| | | |
| | | å½ç¨æ·è¦æ±æ§è¡ SQL æä»¶æ¶ï¼ |
| | | 1. å
读åæä»¶å
容 |
| | | 2. éæ¡æ§è¡ SQL è¯å¥ |
| | | 3. éå°éè¯¯æ¶æ£æ¥è¡¨ç»æï¼è°æ´è¯å¥åéè¯ |
| | | 4. æ±æ»æ§è¡ç»æ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | --- |
| | | name: frontend-doc-generation |
| | | description: å端èè°æ¹æ¡çæè§å |
| | | metadata: |
| | | type: feedback |
| | | --- |
| | | |
| | | # å端èè°æ¹æ¡è§å |
| | | |
| | | ## è§å |
| | | |
| | | å端æ¥å£åæ´æ¶ï¼**ä¸çæå端代ç **ï¼åªçæå端èè°æ¹æ¡ææ¡£ï¼è¾åºå° `docs/` ç®å½ã |
| | | |
| | | ## èè°æ¹æ¡å
å®¹è¦æ± |
| | | |
| | | - **API 说æ**ï¼è·¯å¾ãæ¹æ³ã请æ±åæ°ãååºæ ¼å¼ |
| | | - **æ¶åçå端页é¢**ï¼ååºéè¦ä¿®æ¹çé¡µé¢ |
| | | - **æ°æ®å¸¦å
¥è¯´æ**ï¼éç¹å¼ºè°ä¿¡æ¯å¦ä½ä»ä¸ä¸æ¥å¸¦å
¥ï¼å¦éè´è®¢å -> å°è´§éç¥ -> éè´å
¥åºï¼ |
| | | - **æ¥å£è°ç¨æ¶åº**ï¼è¯´æä½æ¶è°ç¨åªä¸ªæ¥å£è·åå
³èæ°æ® |
| | | - **表ååæ®µæ å°**ï¼æç¡®åªäºå段ä»ä¸æ¸¸æ°æ®èªå¨å¡«å
ï¼åªäºéè¦ç¨æ·æå¨è¾å
¥ |
| | | |
| | | ## ææ¡£æ¨¡æ¿ |
| | | |
| | | ```markdown |
| | | # åè½åç§° - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - 页é¢1 |
| | | - 页é¢2 |
| | | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | 1. æ¥éª¤1 -> æ¥éª¤2ï¼å段Aãåæ®µB 仿¥éª¤1èªå¨å¸¦å
¥ |
| | | 2. æ¥éª¤2 -> æ¥éª¤3ï¼å段C 仿¥éª¤2èªå¨å¸¦å
¥ |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /xxx/xxx | 说æ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | xxx | String | æ¯ | xxx | |
| | | |
| | | **ååºï¼** `{ "code": 200, "msg": "æä½æå" }` |
| | | |
| | | ## å端å®ç°è¦ç¹ |
| | | |
| | | ### 1. æ°æ®è·åæ¶æº |
| | | |
| | | - 页颿弿¶è°ç¨ XXX æ¥å£è·åéè´è®¢åä¿¡æ¯ |
| | | - éæ©éè´è®¢ååï¼è°ç¨ YYY æ¥å£è·åç©ææç» |
| | | |
| | | ### 2. åæ®µèªå¨å¡«å
è§å |
| | | |
| | | | ç®æ åæ®µ | æ°æ®æ¥æº | å¡«å
æ¶æº | |
| | | |----------|----------|----------| |
| | | | ç©æç¼ç | éè´è®¢åè¡.itemCode | éæ©è®¢åè¡å | |
| | | | ç©æåç§° | éè´è®¢åè¡.itemName | éæ©è®¢åè¡å | |
| | | |
| | | ### 3. ç¨æ·å¯ç¼è¾å段 |
| | | |
| | | - åæ®µAï¼ç¨æ·å¯ä¿®æ¹ |
| | | - åæ®µBï¼ç¨æ·å¯ä¿®æ¹ |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - 注æäºé¡¹1 |
| | | - 注æäºé¡¹2 |
| | | ``` |
| | |
| | | # æ¥å£åæ´åç«¯ææ¡£è§å |
| | | # æ¥å£åæ´å端èè°æ¹æ¡è§å |
| | | |
| | | ## è§å |
| | | |
| | | - æ¯æ¬¡æ¶åæ¥å£åæ´ï¼æ°å¢æ¥å£ãä¿®æ¹è¯·æ±åæ°ãä¿®æ¹ååºç»æï¼æ¶ï¼å¿
é¡»è¾åºä¸ä»½åç«¯ä¿®æ¹ææ¡£å° `docs/` ç®å½ã |
| | | - ææ¡£ä»¥ Markdown æ ¼å¼ç¼åï¼æä»¶å使ç¨å°å忝åä¸å线ï¼å¦ `docs/customer_handover.md`ã |
| | | - ææ¡£å
容è³å°å
å«ï¼API 说æï¼è·¯å¾ãæ¹æ³ã请æ±åæ°ãååºæ ¼å¼ï¼ãæ¶åçå端页é¢ãå
·ä½çä¿®æ¹ä»£ç 示ä¾ã |
| | | - æ¯æ¬¡æ¶åæ¥å£åæ´ï¼æ°å¢æ¥å£ãä¿®æ¹è¯·æ±åæ°ãä¿®æ¹ååºç»æï¼æ¶ï¼å¿
é¡»è¾åºä¸ä»½**å端èè°æ¹æ¡**å° `docs/` ç®å½ã |
| | | - **ä¸çæå端代ç **ï¼åªçæèè°æ¹æ¡ææ¡£ï¼æå¯¼å端å¼å人åå¦ä½å¯¹æ¥ã |
| | | - ææ¡£ä»¥ Markdown æ ¼å¼ç¼åï¼æä»¶å使ç¨å°å忝åä¸å线ï¼å¦ `docs/purchase_receipt_integration.md`ã |
| | | - ææ¡£å
容éç¹å¼ºè°**ä¿¡æ¯å¸¦å
¥**é®é¢ï¼åªäºæ°æ®ä»ä¸ä¸æ¥èªå¨å¸¦å
¥ã使¶è·åå
³èæ°æ®ãåæ®µå¦ä½æ å°ã |
| | | |
| | | ## ææ¡£æ¨¡æ¿ |
| | | |
| | |
| | | "Edit", |
| | | "Bash(git status)", |
| | | "Bash(git diff)", |
| | | "Bash(npm test)", |
| | | "Bash(npm run build)", |
| | | "Bash(pytest *)", |
| | | "mcp__ide__getDiagnostics", |
| | | "WebFetch(domain:help.jimureport.com)", |
| | | "WebSearch", |
| | | "Bash(python3 *)", |
| | | "Bash(git log *)", |
| | | "Bash(git branch *)", |
| | | "Bash(mvn compile *)", |
| | | "Bash(mysql -u root -p123456 -D ruoyi-vue-pro)", |
| | | "Bash(mysql -h127.0.0.1 -P3306 -uroot -p123456 ruoyi-vue-pro)", |
| | | "Bash(where mysql *)", |
| | | "Bash(dir /s /b \"C:\\\\Program Files\\\\MySQL\\\\*\\\\bin\\\\mysql.exe\")", |
| | | "Bash(dir /s /b \"C:\\\\Program Files \\(x86\\)\\\\MySQL\\\\*\\\\bin\\\\mysql.exe\")", |
| | | "Bash(cmd.exe /c \"where mysql\")", |
| | | "Bash(cmd.exe /c \"dir /s /b C:\\\\ProgramData\\\\MySQL\\\\*\\\\mysql.exe\")", |
| | | "Bash(cmd.exe /c \"dir /s /b C:\\\\Program Files\\\\MySQL\\\\*\\\\mysql.exe\")", |
| | | "Bash(mvn install *)", |
| | | "Bash(mvn dependency:tree -pl yudao-module-report)", |
| | | "Bash(xargs -I {} basename {} .java)", |
| | | "Bash(xargs grep -l \"HrmLeaveTypeEnum\\\\|HrmAuditStatusEnum\")" |
| | | "Bash(claude mcp *)", |
| | | "WebFetch(domain:help.jimureport.com)", |
| | | "WebFetch(domain:github.com)", |
| | | "WebSearch", |
| | | "mcp__ide__getDiagnostics", |
| | | "mcp__mysql__query", |
| | | "mcp__mysql__listTables", |
| | | "mcp__mysql__describeTable", |
| | | "Bash(mysql *)", |
| | | "mcp__designcomputer-mysql_mcp_server__execute_sql", |
| | | "mcp__designcomputer-mysql_mcp_server__get_schema_info", |
| | | "mcp__designcomputer-mysql_mcp_server__get_table_sample" |
| | | ], |
| | | "deny": [ |
| | | "Bash(rm -rf *)", |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # éè´å
¥åºæµç¨ä¼å - å端èè°æ¹æ¡ |
| | | |
| | | ## ä¸å¡æµç¨æ¦è¿° |
| | | |
| | | ä¼ååçéè´å
¥åºæµç¨ï¼ |
| | | |
| | | ``` |
| | | ERPéè´è®¢å -> MESå°è´§éç¥ -> MESéè´å
¥åº -> BPMå®¡æ¹ -> å
¥åºæå |
| | | ``` |
| | | |
| | | æ ¸å¿æ¹è¿ï¼**æ¯ä¸æ¥èªå¨å¸¦å
¥ä¸æ¸¸æ°æ®ï¼ç©æç»ä¸ä½¿ç¨MDMæ¨¡åæ°æ®ï¼åå°æå¨è¾å
¥**ã |
| | | |
| | | --- |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - å°è´§éç¥å表页ï¼`/mes/wm/arrival-notice`ï¼ |
| | | - å°è´§éç¥æ°å¢/ç¼è¾å¼¹çª |
| | | - éè´å
¥åºå表页ï¼`/mes/wm/item-receipt`ï¼ |
| | | - éè´å
¥åºæ°å¢/ç¼è¾å¼¹çª |
| | | - éè´è®¢åéæ©å¨å¼¹çªï¼æ°å¢ç»ä»¶ï¼ |
| | | - å°è´§éç¥éæ©å¨å¼¹çªï¼æ°å¢ç»ä»¶ï¼ |
| | | |
| | | --- |
| | | |
| | | ## æ°æ®å¸¦å
¥è§å |
| | | |
| | | ### 1. éè´è®¢å -> å°è´§éç¥ |
| | | |
| | | | ç®æ åæ®µ | æ°æ®æ¥æº | èªå¨å¸¦å
¥ | 说æ | |
| | | |----------|----------|----------|------| |
| | | | ä¾åºå | éè´è®¢å.supplierId | â
| èªå¨å¡«å
ï¼ä¸å¯ä¿®æ¹ | |
| | | | éè´è®¢åç¼ç | éè´è®¢å.no | â
| æ¾ç¤ºç¨ï¼ä¸å¯ä¿®æ¹ | |
| | | | éè´è®¢åID | éè´è®¢å.id | â
| å
³èåæ®µ | |
| | | |
| | | ### 2. éè´è®¢åè¡ -> å°è´§éç¥è¡ |
| | | |
| | | | ç®æ åæ®µ | æ°æ®æ¥æº | èªå¨å¸¦å
¥ | 说æ | |
| | | |----------|----------|----------|------| |
| | | | éè´è®¢åè¡ID | éè´è®¢åè¡.id | â
| å
³èåæ®µï¼ç¨äºè¿½æº¯ | |
| | | | ç©æç¼ç | ERP产åç¼ç æ å°MDMç©æ | â ï¸ | éç¨æ·éæ©æ å°å
³ç³» | |
| | | | å°è´§æ°é | è®¢è´æ°é - å·²å
¥åºæ°é | â
| å¯ä¿®æ¹ | |
| | | | æ¯å¦éæ£éª | é»è®¤false | â
| å¯ä¿®æ¹ | |
| | | |
| | | ### 3. å°è´§éç¥ -> éè´å
¥åº |
| | | |
| | | | ç®æ åæ®µ | æ°æ®æ¥æº | èªå¨å¸¦å
¥ | 说æ | |
| | | |----------|----------|----------|------| |
| | | | ä¾åºå | å°è´§éç¥.vendorId | â
| èªå¨å¡«å
ï¼ä¸å¯ä¿®æ¹ | |
| | | | å°è´§éç¥ç¼ç | å°è´§éç¥.code | â
| æ¾ç¤ºç¨ | |
| | | | éè´è®¢åç¼ç | å°è´§éç¥.purchaseOrderCode | â
| æ¾ç¤ºç¨ | |
| | | |
| | | ### 4. å°è´§éç¥è¡ -> éè´å
¥åºè¡ |
| | | |
| | | | ç®æ åæ®µ | æ°æ®æ¥æº | èªå¨å¸¦å
¥ | 说æ | |
| | | |----------|----------|----------|------| |
| | | | ç©æID | å°è´§éç¥è¡.itemId | â
| ä¸å¯ä¿®æ¹ | |
| | | | å°è´§éç¥è¡ID | å°è´§éç¥è¡.id | â
| å
³èåæ®µ | |
| | | | éè´è®¢åè¡ID | å°è´§éç¥è¡.purchaseOrderItemId | â
| å
³èåæ®µ | |
| | | | å
¥åºæ°é | å°è´§éç¥è¡.qualifiedQuantity | â
| å¯ä¿®æ¹ | |
| | | | æ¹æ¬¡ä¿¡æ¯ | èªå¨çæ | â
| æ ¹æ®æ¹æ¬¡è§å | |
| | | |
| | | --- |
| | | |
| | | ## æ°å¢ API æ¥å£ |
| | | |
| | | ### å°è´§éç¥æ¨¡å |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | `/mes/wm/arrival-notice/generate-from-purchase-order?purchaseOrderId={id}` | æ ¹æ®éè´è®¢åçæå°è´§éç¥å | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | purchaseOrderId | Long | æ¯ | ERPéè´è®¢åç¼å· | |
| | | |
| | | **ååºï¼** `{ "code": 200, "data": 123, "msg": "æä½æå" }` ï¼data为çæçå°è´§éç¥åç¼å·ï¼ |
| | | |
| | | ### éè´å
¥åºæ¨¡å |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | `/mes/wm/item-receipt/generate-from-arrival-notice?arrivalNoticeId={id}` | æ ¹æ®å°è´§éç¥åçæéè´å
¥åºå | |
| | | | PUT | `/mes/wm/item-receipt/submit-approval?id={id}&processDefinitionKey={key}` | æäº¤éè´å
¥åºåå®¡æ¹ | |
| | | |
| | | **请æ±åæ°ï¼generate-from-arrival-noticeï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | arrivalNoticeId | Long | æ¯ | å°è´§éç¥åç¼å· | |
| | | |
| | | **请æ±åæ°ï¼submit-approvalï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | éè´å
¥åºåç¼å· | |
| | | | processDefinitionKey | String | æ¯ | BPMæµç¨å®ä¹Key | |
| | | |
| | | --- |
| | | |
| | | ## å端å®ç°è¦ç¹ |
| | | |
| | | ### 1. å°è´§éç¥é¡µé¢æ¹é |
| | | |
| | | #### 1.1 æ°å¢"ä»éè´è®¢åçæ"æé® |
| | | |
| | | ```html |
| | | <el-button type="primary" @click="handleGenerateFromPO"> |
| | | ä»éè´è®¢åçæ |
| | | </el-button> |
| | | ``` |
| | | |
| | | #### 1.2 éè´è®¢åéæ©å¨å¼¹çª |
| | | |
| | | - è°ç¨ ERP æ¥å£è·åå·²å®¡æ ¸ç¶æçéè´è®¢åå表 |
| | | - æ¾ç¤ºå段ï¼è®¢åå·ãä¾åºååç§°ãè®¢åæ¥æãæ»éé¢ |
| | | - éæ©åè°ç¨ `/mes/wm/arrival-notice/generate-from-purchase-order` æ¥å£ |
| | | |
| | | #### 1.3 æ°æ®è·åæ¶æº |
| | | |
| | | ``` |
| | | ç¨æ·ç¹å»"ä»éè´è®¢åçæ" |
| | | -> å¼¹åºéè´è®¢åéæ©å¨ |
| | | -> éæ©è®¢å |
| | | -> è°ç¨ generate-from-purchase-order API |
| | | -> 跳转å°å°è´§éç¥ç¼è¾é¡µï¼ID为è¿åå¼ï¼ |
| | | -> æ¾ç¤ºå·²å¸¦å
¥çæ°æ® |
| | | ``` |
| | | |
| | | #### 1.4 åæ®µæ¾ç¤ºè§å |
| | | |
| | | - èªå¨å¸¦å
¥çåæ®µæ¾ç¤ºä¸º**ç¦ç¨ç¶æ**ï¼ç°è²èæ¯ï¼ |
| | | - ç©æéæ©å¨ä»ä¿çï¼å
è®¸ç¨æ·è¡¥å
ç©ææ å°å
³ç³» |
| | | |
| | | ### 2. éè´å
¥åºé¡µé¢æ¹é |
| | | |
| | | #### 2.1 æ°å¢"ä»å°è´§éç¥çæ"æé® |
| | | |
| | | ```html |
| | | <el-button type="primary" @click="handleGenerateFromAN"> |
| | | ä»å°è´§éç¥çæ |
| | | </el-button> |
| | | ``` |
| | | |
| | | #### 2.2 å°è´§éç¥éæ©å¨å¼¹çª |
| | | |
| | | - è°ç¨ MES æ¥å£è·åç¶æä¸º"å¾
å
¥åº"çå°è´§éç¥åå表 |
| | | - æ¾ç¤ºå段ï¼éç¥åå·ãä¾åºååç§°ãå°è´§æ¥æãç¶æ |
| | | - éæ©åè°ç¨ `/mes/wm/item-receipt/generate-from-arrival-notice` æ¥å£ |
| | | |
| | | #### 2.3 æ°æ®è·åæ¶æº |
| | | |
| | | ``` |
| | | ç¨æ·ç¹å»"ä»å°è´§éç¥çæ" |
| | | -> å¼¹åºå°è´§éç¥éæ©å¨ |
| | | -> éæ©éç¥å |
| | | -> è°ç¨ generate-from-arrival-notice API |
| | | -> 跳转å°éè´å
¥åºç¼è¾é¡µï¼ID为è¿åå¼ï¼ |
| | | -> æ¾ç¤ºå·²å¸¦å
¥çæ°æ® |
| | | ``` |
| | | |
| | | #### 2.4 BPMå®¡æ¹æµç¨ |
| | | |
| | | - ç¶æä¸º"è稿"æ¶æ¾ç¤º"æäº¤å®¡æ¹"æé® |
| | | - ç¹å»åå¼¹åºæµç¨éæ©å¨ï¼å¤ç¨ç°æBPMæµç¨éæ©ç»ä»¶ï¼ |
| | | - éæ©æµç¨åè°ç¨ `submit-approval` API |
| | | - ç¶æå为"审æ¹ä¸"ï¼ç¦æ¢ç¼è¾ |
| | | |
| | | ### 3. ç¶ææµè½¬å¾ |
| | | |
| | | #### å°è´§éç¥ç¶æ |
| | | |
| | | ``` |
| | | è稿(0) --æäº¤--> å¾
è´¨æ£(2) --IQC宿--> å¾
å
¥åº(3) --å
¥åºå®æ--> 已宿(4) |
| | | \ |
| | | -> å¾
å
¥åº(3) [æ 鿣éª] |
| | | ``` |
| | | |
| | | #### éè´å
¥åºç¶æï¼æ°å¢BPM审æ¹ï¼ |
| | | |
| | | ``` |
| | | è稿(0) --æäº¤å®¡æ¹--> 审æ¹ä¸(2) --审æ¹éè¿--> å¾
䏿¶(3) --䏿¶--> å¾
å
¥åº(4) --å
¥åº--> 已宿(5) |
| | | \ |
| | | -> å®¡æ¹æç» -> è稿(0) [å¯éæ°æäº¤] |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | ### æ°æ®å¸¦å
¥å¼ºè° |
| | | |
| | | 1. **ç©æä¿¡æ¯å¿
é¡»ä»MDM模åè·å**ï¼ä¸å
许æå¨è¾å
¥ç©æç¼ç /åç§° |
| | | 2. **éè´è®¢åè¡å
³è**ï¼å°è´§éç¥è¡å¿
é¡»å
³èéè´è®¢åè¡ï¼ç¡®ä¿æ°æ®å¯è¿½æº¯ |
| | | 3. **å
¥åºæ°éæ ¡éª**ï¼å
¥åºæ°éä¸è½è¶
è¿å°è´§éç¥è¡çåæ ¼æ°é |
| | | |
| | | ### åç«¯æ ¡éªè§å |
| | | |
| | | 1. ä»éè´è®¢åçæå°è´§éç¥æ¶ï¼æ ¡éªéè´è®¢åç¶æå¿
须为"å·²å®¡æ ¸" |
| | | 2. ä»å°è´§éç¥çæéè´å
¥åºæ¶ï¼æ ¡éªå°è´§éç¥ç¶æå¿
须为"å¾
å
¥åº" |
| | | 3. æäº¤å®¡æ¹æ¶ï¼æ ¡éªå
¥åºåç¶æå¿
须为"è稿"ï¼ä¸è³å°æä¸æ¡å
¥åºè¡ |
| | | |
| | | ### é误å¤ç |
| | | |
| | | | é误ç | 说æ | å端æç¤º | |
| | | |--------|------|----------| |
| | | | 1040705007 | éè´è®¢åä¸åå¨ | "æééè´è®¢åä¸åå¨ï¼è¯·å·æ°åéè¯" | |
| | | | 1040705008 | éè´è®¢åæ æç»æ°æ® | "该éè´è®¢å没ææç»æ°æ®" | |
| | | | WM_ARRIVAL_NOTICE_NO_LINE | å°è´§éç¥æ è¡æ°æ® | "该å°è´§éç¥æ²¡ææç»æ°æ®" | |
| | | |
| | | --- |
| | | |
| | | ## åç«¯ä¿®æ¹æä»¶æ¸
å |
| | | |
| | | ### æ°æ®åºåæ´ |
| | | - `sql/mysql/mes_purchase_receipt_enhance.sql` |
| | | |
| | | ### ERP API æ©å± |
| | | - `yudao-module-erp-api/.../ErpPurchaseOrderApi.java` |
| | | - `yudao-module-erp-api/.../ErpPurchaseOrderItemRespDTO.java` |
| | | - `yudao-module-erp/.../ErpPurchaseOrderApiImpl.java` |
| | | |
| | | ### MES DO/VO ä¿®æ¹ |
| | | - `MesWmArrivalNoticeDO.java` - æ°å¢ purchaseOrderCode |
| | | - `MesWmArrivalNoticeLineDO.java` - æ°å¢ purchaseOrderItemId |
| | | - `MesWmItemReceiptDO.java` - æ°å¢ processInstanceId |
| | | - `MesWmItemReceiptLineDO.java` - æ°å¢ purchaseOrderItemId |
| | | - 对åºç SaveReqVO å RespVO |
| | | |
| | | ### MES Service æ°å¢æ¹æ³ |
| | | - `MesWmArrivalNoticeService.generateArrivalNoticeFromPurchaseOrder()` |
| | | - `MesWmItemReceiptService.generateItemReceiptFromArrivalNotice()` |
| | | - `MesWmItemReceiptService.submitItemReceiptApproval()` |
| | | - `MesWmItemReceiptService.updateItemReceiptAuditStatus()` |
| | | |
| | | ### MES Controller æ°å¢æ¥å£ |
| | | - `POST /mes/wm/arrival-notice/generate-from-purchase-order` |
| | | - `POST /mes/wm/item-receipt/generate-from-arrival-notice` |
| | | - `PUT /mes/wm/item-receipt/submit-approval` |
| | | |
| | | ### BPM çå¬å¨ |
| | | - `MesWmItemReceiptStatusListener.java` |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # éå®åè´§æµç¨ - å端èè°æ¹æ¡ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - ERP éå®è®¢åé¡µé¢ |
| | | - MES åè´§éç¥åé¡µé¢ |
| | | - MES éå®åºåºåé¡µé¢ |
| | | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | 1. **éå®è®¢å -> åè´§éç¥å**ï¼éå®è®¢åIDãéå®è®¢åå·ã客æ·IDãç©ææç»èªå¨å¸¦å
¥ |
| | | 2. **åè´§éç¥å -> éå®åºåºå**ï¼åè´§éç¥åIDãéå®è®¢åIDã客æ·IDãç©ææç»èªå¨å¸¦å
¥ |
| | | 3. **éå®åºåº -> BPMå®¡æ¹ -> åºåºæå**ï¼åæ¥æ´æ°éå®è®¢ååºåºæ°éåç¶æ |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /mes/wm/sales-notice/generate-from-sale-order | ä»éå®è®¢åçæåè´§éç¥å | |
| | | | GET | /mes/wm/sales-notice/page | åè´§éç¥åå页æ¥è¯¢ | |
| | | | GET | /mes/wm/sales-notice/get | è·ååè´§éç¥å详æ
| |
| | | | POST | /mes/wm/sales-notice/create | å建åè´§éç¥å | |
| | | | PUT | /mes/wm/sales-notice/submit | æäº¤åè´§éç¥å | |
| | | |
| | | ### ä»éå®è®¢åçæåè´§éç¥å |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | saleOrderId | Long | æ¯ | éå®è®¢åID | |
| | | |
| | | **ååºï¼** `{ "code": 200, "data": 123 }` ï¼è¿ååè´§éç¥åIDï¼ |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. ERP éå®è®¢åé¡µé¢ - æ·»å "çæåè´§éç¥å"æé® |
| | | |
| | | ```html |
| | | <el-button type="primary" @click="handleGenerateNotice" v-hasPermi="['mes:wm-sales-notice:create']"> |
| | | çæåè´§éç¥å |
| | | </el-button> |
| | | ``` |
| | | |
| | | ```js |
| | | // data |
| | | data() { |
| | | return { |
| | | // ... |
| | | } |
| | | } |
| | | |
| | | // methods |
| | | methods: { |
| | | /** çæåè´§éç¥å */ |
| | | async handleGenerateNotice() { |
| | | if (!this.selectedRow) { |
| | | this.$modal.msgWarning('è¯·éæ©ä¸æ¡éå®è®¢å'); |
| | | return; |
| | | } |
| | | try { |
| | | const res = await generateFromSaleOrder(this.selectedRow.id); |
| | | this.$modal.msgSuccess('çæåè´§éç¥åæå'); |
| | | // 跳转å°åè´§éç¥åé¡µé¢ |
| | | this.$router.push({ |
| | | path: '/mes/wm/sales-notice/edit', |
| | | query: { id: res.data } |
| | | }); |
| | | } catch (e) { |
| | | console.error(e); |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 2. åè´§éç¥åé¡µé¢ - æ¾ç¤ºéå®è®¢åä¿¡æ¯ |
| | | |
| | | ```html |
| | | <el-descriptions :column="3" border> |
| | | <el-descriptions-item label="éå®è®¢åå·"> |
| | | {{ form.saleOrderCode }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="客æ·"> |
| | | {{ form.clientName }} |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | ``` |
| | | |
| | | ### 3. åè´§éç¥åè¡è¡¨æ ¼ - æ°å¢å |
| | | |
| | | | åå | åæ®µ | 说æ | |
| | | |------|------|------| |
| | | | éå®è®¢åæç»ID | saleOrderItemId | éèåæ®µï¼ç¨äºè¿½æº¯ | |
| | | |
| | | ### 4. éå®åºåºåé¡µé¢ - æ¾ç¤ºéå®è®¢åä¿¡æ¯ |
| | | |
| | | ```html |
| | | <el-descriptions :column="3" border> |
| | | <el-descriptions-item label="åè´§éç¥åå·"> |
| | | {{ form.noticeCode }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="éå®è®¢åå·"> |
| | | {{ form.saleOrderCode }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="客æ·"> |
| | | {{ form.clientName }} |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | ``` |
| | | |
| | | ## æ°æ®å段æ å° |
| | | |
| | | ### åè´§éç¥å主表 |
| | | |
| | | | ç®æ åæ®µ | æ°æ®æ¥æº | å¡«å
æ¶æº | |
| | | |----------|----------|----------| |
| | | | saleOrderId | éå®è®¢å.id | ä»éå®è®¢åçææ¶ | |
| | | | saleOrderCode | éå®è®¢å.no | ä»éå®è®¢åçææ¶ | |
| | | | clientId | éå®è®¢å.customerId | ä»éå®è®¢åçææ¶ | |
| | | |
| | | ### åè´§éç¥åè¡ |
| | | |
| | | | ç®æ åæ®µ | æ°æ®æ¥æº | å¡«å
æ¶æº | |
| | | |----------|----------|----------| |
| | | | saleOrderItemId | éå®è®¢åæç».id | ä»éå®è®¢åçææ¶ | |
| | | | itemId | éå®è®¢åæç».productId | ä»éå®è®¢åçææ¶ | |
| | | | quantity | éå®è®¢åæç».count | ä»éå®è®¢åçææ¶ | |
| | | |
| | | ### éå®åºåºå主表 |
| | | |
| | | | ç®æ åæ®µ | æ°æ®æ¥æº | å¡«å
æ¶æº | |
| | | |----------|----------|----------| |
| | | | noticeId | åè´§éç¥å.id | ä»åè´§éç¥åçææ¶ | |
| | | | saleOrderId | åè´§éç¥å.saleOrderId | ä»åè´§éç¥åçææ¶ | |
| | | | saleOrderCode | åè´§éç¥å.saleOrderCode | ä»åè´§éç¥åçææ¶ | |
| | | |
| | | ### éå®åºåºåè¡ |
| | | |
| | | | ç®æ åæ®µ | æ°æ®æ¥æº | å¡«å
æ¶æº | |
| | | |----------|----------|----------| |
| | | | noticeLineId | åè´§éç¥åè¡.id | ä»åè´§éç¥åçææ¶ | |
| | | | saleOrderItemId | åè´§éç¥åè¡.saleOrderItemId | ä»åè´§éç¥åçææ¶ | |
| | | |
| | | ## ç¶ææµè½¬ |
| | | |
| | | ### åè´§éç¥åç¶æ |
| | | |
| | | | ç¶æå¼ | ç¶æå | 说æ | |
| | | |--------|--------|------| |
| | | | 0 | è稿 | æ°å»ºç¶æ | |
| | | | 3 | å¾
åºåº | æäº¤å | |
| | | | 4 | 已宿 | åºåºå®æåèªå¨æ´æ° | |
| | | |
| | | ### éå®è®¢ååºåºç¶æ |
| | | |
| | | | ç¶æå¼ | ç¶æå | 说æ | |
| | | |--------|--------|------| |
| | | | 0 | æªåºåº | é»è®¤å¼ | |
| | | | 1 | é¨ååºåº | é¨åæç»å·²åºåº | |
| | | | 2 | å
¨é¨åºåº | æææç»å·²åºåº | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. ä»éå®è®¢åçæåè´§éç¥åæ¶ï¼ä¼èªå¨å¸¦å
¥ææéå®è®¢åæç» |
| | | 2. åè´§éç¥åæäº¤åç¶æå为"å¾
åºåº"ï¼æ¤æ¶å¯ä»åè´§éç¥åçæéå®åºåºå |
| | | 3. éå®åºåºå®æåï¼ç³»ç»èªå¨æ´æ°ï¼ |
| | | - åè´§éç¥åç¶æ -> 已宿 |
| | | - éå®è®¢ååºåºæ°éååºåºç¶æ |
| | | 4. éå®è®¢åçåºåºç¶ææ ¹æ®æç»åºåºæ°éèªå¨è®¡ç®ï¼æ éæå¨ç»´æ¤ |
| | |
| | | <module>yudao-module-erp-api</module> |
| | | <!-- <module>yudao-module-iot</module>--> |
| | | <module>yudao-module-mes</module> |
| | | <module>yudao-module-wms</module> |
| | | <module>yudao-module-wms-api</module> |
| | | <module>yudao-module-im</module> |
| | | <!-- MDM ä¸»æ°æ®ç®¡ç模å --> |
| | | <module>yudao-module-mdm-api</module> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ä»å¨ç©æµæ¨¡åéè´å
¥åºæµç¨ä¼å - æ°æ®åºåæ´èæ¬ |
| | | -- æ§è¡æ¥æ: 2026-07-10 |
| | | |
| | | -- ===================== |
| | | -- 1. å°è´§éç¥ä¸»è¡¨åæ´ |
| | | -- ===================== |
| | | |
| | | -- æ·»å éè´è®¢åç¼ç ï¼åä½å段ï¼ç¨äºæ¾ç¤ºï¼ |
| | | ALTER TABLE mes_wm_arrival_notice |
| | | ADD COLUMN purchase_order_code VARCHAR(64) COMMENT 'éè´è®¢åç¼ç ï¼åä½å段ï¼' AFTER purchase_order_id; |
| | | |
| | | -- ===================== |
| | | -- 2. å°è´§éç¥è¡è¡¨åæ´ |
| | | -- ===================== |
| | | |
| | | -- æ·»å éè´è®¢åè¡å
³è |
| | | ALTER TABLE mes_wm_arrival_notice_line |
| | | ADD COLUMN purchase_order_item_id BIGINT COMMENT 'éè´è®¢åè¡ç¼å·ï¼å
³è ERP éè´è®¢åæç»ï¼' AFTER notice_id; |
| | | |
| | | -- æ·»å ç´¢å¼ |
| | | ALTER TABLE mes_wm_arrival_notice_line |
| | | ADD INDEX idx_purchase_order_item_id (purchase_order_item_id); |
| | | |
| | | -- ===================== |
| | | -- 3. éè´å
¥åºä¸»è¡¨åæ´ |
| | | -- ===================== |
| | | |
| | | -- æ·»å BPM æµç¨å®ä¾ç¼å· |
| | | ALTER TABLE mes_wm_item_receipt |
| | | ADD COLUMN process_instance_id VARCHAR(64) COMMENT 'BPM æµç¨å®ä¾ç¼å·' AFTER status; |
| | | |
| | | -- ===================== |
| | | -- 4. éè´å
¥åºè¡è¡¨åæ´ |
| | | -- ===================== |
| | | |
| | | -- æ·»å éè´è®¢åè¡å
³èï¼å®æ´è¿½æº¯é¾ï¼ |
| | | ALTER TABLE mes_wm_item_receipt_line |
| | | ADD COLUMN purchase_order_item_id BIGINT COMMENT 'éè´è®¢åè¡ç¼å·ï¼å®æ´è¿½æº¯é¾ï¼' AFTER arrival_notice_line_id; |
| | | |
| | | -- æ·»å ç´¢å¼ |
| | | ALTER TABLE mes_wm_item_receipt_line |
| | | ADD INDEX idx_purchase_order_item_id (purchase_order_item_id); |
| | | |
| | | -- ===================== |
| | | -- 5. BPM åç±»é
ç½® |
| | | -- ===================== |
| | | |
| | | -- æ·»å éè´å
¥åºå®¡æ¹åç±»ï¼å¦æä¸åå¨ï¼ |
| | | -- 注æï¼id éè¦æ ¹æ®å®é
æ°æ®åºåºåçæ |
| | | INSERT INTO bpm_category (name, code, status, remark, creator, create_time, updater, update_time, deleted) |
| | | SELECT 'éè´å
¥åºå®¡æ¹', 'item_receipt_approve', 0, 'MESéè´å
¥åºå审æ¹åç±»', '1', NOW(), '1', NOW(), b'0' |
| | | FROM DUAL |
| | | WHERE NOT EXISTS (SELECT 1 FROM bpm_category WHERE code = 'item_receipt_approve' AND deleted = b'0'); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- éè´å
¥åºæµç¨ä¼å - æ°æ®åºåæ¥èæ¬ |
| | | -- æ§è¡æ¥æ: 2026-07-10 |
| | | -- 说æ: åååæ¥æ°æ®åºä¸ DO ç±»åæ®µ |
| | | |
| | | -- ===================== |
| | | -- 1. å°è´§éç¥è¡è¡¨è¡¥å
åæ®µ |
| | | -- ===================== |
| | | |
| | | -- æ·»å å°è´§æ°éï¼DO æï¼æ°æ®åºæ ï¼ |
| | | ALTER TABLE mes_wm_arrival_notice_line |
| | | ADD COLUMN arrival_quantity DECIMAL(24,6) COMMENT 'å°è´§æ°é' AFTER item_id; |
| | | |
| | | -- æ·»å åæ ¼æ°éï¼DO æï¼æ°æ®åºæ ï¼ |
| | | ALTER TABLE mes_wm_arrival_notice_line |
| | | ADD COLUMN qualified_quantity DECIMAL(24,6) COMMENT 'åæ ¼æ°é' AFTER arrival_quantity; |
| | | |
| | | -- æ·»å æ¯å¦éæ£éªæ å¿ï¼DO æï¼æ°æ®åºæ ï¼ |
| | | ALTER TABLE mes_wm_arrival_notice_line |
| | | ADD COLUMN iqc_check_flag BIT DEFAULT b'0' COMMENT 'æ¯å¦éè¦æ¥ææ£éª' AFTER qualified_quantity; |
| | | |
| | | -- æ·»å æ£éªåç¼å·ï¼DO æï¼æ°æ®åºæ ï¼ |
| | | ALTER TABLE mes_wm_arrival_notice_line |
| | | ADD COLUMN iqc_id BIGINT COMMENT 'æ¥ææ£éªåç¼å·' AFTER iqc_check_flag; |
| | | |
| | | -- å° quantity æ¹å为åéçåæ®µåï¼é¿å
æ§ä¹ï¼ä¿çååæ®µä½ä¸ºå¤ç¨ï¼ |
| | | -- ALTER TABLE mes_wm_arrival_notice_line CHANGE COLUMN quantity reserved_quantity DECIMAL(24,6) COMMENT 'é¢çæ°é'; |
| | | |
| | | -- ===================== |
| | | -- 2. éè´å
¥åºè¡è¡¨è¡¥å
åæ®µ |
| | | -- ===================== |
| | | |
| | | -- æ·»å å°è´§éç¥è¡IDï¼DO æï¼æ°æ®åºæ ï¼ |
| | | ALTER TABLE mes_wm_item_receipt_line |
| | | ADD COLUMN arrival_notice_line_id BIGINT COMMENT 'å°è´§éç¥åè¡ç¼å·' AFTER receipt_id; |
| | | |
| | | -- å° quantity æ¹å为 received_quantityï¼ä¸ DO åæ®µåä¸è´ï¼ |
| | | ALTER TABLE mes_wm_item_receipt_line |
| | | CHANGE COLUMN quantity received_quantity DECIMAL(24,6) COMMENT 'å
¥åºæ°é'; |
| | | |
| | | -- æ·»å æ¹æ¬¡ç¼å·ï¼DO æï¼æ°æ®åºæ ï¼ |
| | | ALTER TABLE mes_wm_item_receipt_line |
| | | ADD COLUMN batch_id BIGINT COMMENT 'æ¹æ¬¡ç¼å·' AFTER received_quantity; |
| | | |
| | | -- æ·»å æ¹æ¬¡ç¼ç ï¼DO æï¼æ°æ®åºæ ï¼ |
| | | ALTER TABLE mes_wm_item_receipt_line |
| | | ADD COLUMN batch_code VARCHAR(64) COMMENT 'æ¹æ¬¡ç¼ç ' AFTER batch_id; |
| | | |
| | | -- æ·»å çäº§æ¥æï¼DO æï¼æ°æ®åºæ ï¼ |
| | | ALTER TABLE mes_wm_item_receipt_line |
| | | ADD COLUMN production_date DATETIME COMMENT 'çäº§æ¥æ' AFTER batch_code; |
| | | |
| | | -- æ·»å æææï¼DO æï¼æ°æ®åºæ ï¼ |
| | | ALTER TABLE mes_wm_item_receipt_line |
| | | ADD COLUMN expire_date DATETIME COMMENT 'æææ' AFTER production_date; |
| | | |
| | | -- æ·»å ç产æ¹å·ï¼DO æï¼æ°æ®åºæ ï¼ |
| | | ALTER TABLE mes_wm_item_receipt_line |
| | | ADD COLUMN lot_number VARCHAR(64) COMMENT 'ç产æ¹å·' AFTER expire_date; |
| | | |
| | | -- ===================== |
| | | -- 3. éè´å
¥åºæç»è¡¨è¡¥å
åæ®µ |
| | | -- ===================== |
| | | |
| | | -- DO ç¼ºå° material_stock_id åæ®µï¼ä½æ°æ®åºå·²æï¼æ éæä½ |
| | | |
| | | -- ===================== |
| | | -- 4. éè´å
¥åºä¸»è¡¨æ·»å ç´¢å¼ |
| | | -- ===================== |
| | | |
| | | -- æ·»å æµç¨å®ä¾ç´¢å¼ï¼ä¾¿äºæ¥è¯¢å®¡æ¹ç¶æï¼ |
| | | ALTER TABLE mes_wm_item_receipt |
| | | ADD INDEX idx_process_instance_id (process_instance_id); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- MES éè´å
¥åºåè¡¨ç»æä¿®æ¹ |
| | | -- æ ¹æ® MesWmItemReceiptDO è°æ´æ°æ®åºè¡¨å段 |
| | | -- 说æï¼åè¡¨ç»æä¸º"ç©æéåºå"ï¼DO ç±»å®ä¹ä¸º"éè´å
¥åºå" |
| | | |
| | | -- 1. å é¤ç产工å IDï¼éåºååæ®µï¼ |
| | | ALTER TABLE mes_wm_item_receipt DROP COLUMN IF EXISTS work_order_id; |
| | | |
| | | -- 2. æ·»å æ¥ææ£éªåç¼å· |
| | | ALTER TABLE mes_wm_item_receipt ADD COLUMN iqc_id BIGINT COMMENT 'æ¥ææ£éªåç¼å·' AFTER name; |
| | | |
| | | -- 3. æ·»å å°è´§éç¥åç¼å· |
| | | ALTER TABLE mes_wm_item_receipt ADD COLUMN notice_id BIGINT COMMENT 'å°è´§éç¥åç¼å·' AFTER iqc_id; |
| | | |
| | | -- 4. æ·»å éè´è®¢åå· |
| | | ALTER TABLE mes_wm_item_receipt ADD COLUMN purchase_order_code VARCHAR(64) COMMENT 'éè´è®¢åå·' AFTER notice_id; |
| | | |
| | | -- 5. æ·»å ä¾åºåç¼å· |
| | | ALTER TABLE mes_wm_item_receipt ADD COLUMN vendor_id BIGINT COMMENT 'ä¾åºåç¼å·' AFTER purchase_order_code; |
| | | |
| | | -- 6. æ´æ°è¡¨æ³¨é |
| | | ALTER TABLE mes_wm_item_receipt COMMENT 'MES éè´å
¥åºå'; |
| | |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO; |
| | | import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; |
| | | import cn.iocoder.yudao.module.crm.service.business.CrmBusinessStatusService; |
| | | import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; |
| | | import cn.iocoder.yudao.module.crm.service.product.CrmProductService; |
| | | 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; |
| | |
| | | @Resource |
| | | private CrmBusinessStatusService businessStatusService; |
| | | @Resource |
| | | private CrmProductService productService; |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | |
| | | CrmBusinessRespVO businessVO = buildBusinessDetailList(Collections.singletonList(business)).get(0); |
| | | // æ¼æ¥äº§å项 |
| | | List<CrmBusinessProductDO> businessProducts = businessService.getBusinessProductListByBusinessId(businessVO.getId()); |
| | | Map<Long, CrmProductDO> productMap = productService.getProductMap( |
| | | convertSet(businessProducts, CrmBusinessProductDO::getProductId)); |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(businessProducts, CrmBusinessProductDO::getItemId)); |
| | | businessVO.setProducts(BeanUtils.toBean(businessProducts, CrmBusinessRespVO.Product.class, businessProductVO -> |
| | | MapUtils.findAndThen(productMap, businessProductVO.getProductId(), |
| | | product -> businessProductVO.setProductName(product.getName()) |
| | | .setProductNo(product.getNo()).setProductUnit(product.getUnit())))); |
| | | MapUtils.findAndThen(itemMap, businessProductVO.getItemId(), |
| | | item -> businessProductVO.setItemName(item.getName()) |
| | | .setItemCode(item.getCode()).setItemUnitId(item.getUnitMeasureId())))); |
| | | return businessVO; |
| | | } |
| | | |
| | |
| | | @Schema(description = "ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "888") |
| | | private Long id; |
| | | |
| | | @Schema(description = "产åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529") |
| | | private Long productId; |
| | | @Schema(description = "产ååç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "æå") |
| | | private String productName; |
| | | @Schema(description = "äº§åæ¡ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529") |
| | | private String productNo; |
| | | @Schema(description = "产ååä½", requiredMode = Schema.RequiredMode.REQUIRED, example = "æå") |
| | | private Integer productUnit; |
| | | @Schema(description = "MDM ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529") |
| | | private Long itemId; |
| | | @Schema(description = "ç©æåç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "æå") |
| | | private String itemName; |
| | | @Schema(description = "ç©æç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529") |
| | | private String itemCode; |
| | | @Schema(description = "计éåä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long itemUnitId; |
| | | |
| | | @Schema(description = "产ååä»·", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00") |
| | | private BigDecimal productPrice; |
| | | @Schema(description = "ç©æåä»·", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00") |
| | | private BigDecimal itemPrice; |
| | | |
| | | @Schema(description = "åæºä»·æ ¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00") |
| | | private BigDecimal businessPrice; |
| | | |
| | | @Schema(description = "äº§åæ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911") |
| | | @Schema(description = "æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911") |
| | | private BigDecimal count; |
| | | |
| | | @Schema(description = "æ»è®¡ä»·æ ¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00") |
| | |
| | | @AllArgsConstructor |
| | | public static class BusinessProduct { |
| | | |
| | | @Schema(description = "产åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529") |
| | | @NotNull(message = "产åç¼å·ä¸è½ä¸ºç©º") |
| | | private Long productId; |
| | | @Schema(description = "MDM ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529") |
| | | @NotNull(message = "ç©æç¼å·ä¸è½ä¸ºç©º") |
| | | private Long itemId; |
| | | |
| | | @Schema(description = "产ååä»·", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00") |
| | | @NotNull(message = "产ååä»·ä¸è½ä¸ºç©º") |
| | | private BigDecimal productPrice; |
| | | @Schema(description = "计éåä½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "计éåä½ä¸è½ä¸ºç©º") |
| | | private Long itemUnitId; |
| | | |
| | | @Schema(description = "ç©æåä»·", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00") |
| | | @NotNull(message = "ç©æåä»·ä¸è½ä¸ºç©º") |
| | | private BigDecimal itemPrice; |
| | | |
| | | @Schema(description = "åæºä»·æ ¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "123.00") |
| | | @NotNull(message = "åæºä»·æ ¼ä¸è½ä¸ºç©º") |
| | | private BigDecimal businessPrice; |
| | | |
| | | @Schema(description = "äº§åæ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911") |
| | | @NotNull(message = "äº§åæ°éä¸è½ä¸ºç©º") |
| | | private Integer count; |
| | | @Schema(description = "æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "8911") |
| | | @NotNull(message = "æ°éä¸è½ä¸ºç©º") |
| | | private BigDecimal count; |
| | | |
| | | } |
| | | |
| | |
| | | import cn.iocoder.yudao.module.crm.service.contact.CrmContactService; |
| | | import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; |
| | | import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; |
| | | import cn.iocoder.yudao.module.crm.service.product.CrmProductService; |
| | | import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | |
| | | package cn.iocoder.yudao.module.crm.dal.dataobject.business; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | |
| | | */ |
| | | private Long businessId; |
| | | /** |
| | | * 产åç¼å· |
| | | * MDM ç©æç¼å· |
| | | * |
| | | * å
³è {@link CrmProductDO#getId()} |
| | | * å
³è MdmItemRespDTO.id |
| | | */ |
| | | private Long productId; |
| | | private Long itemId; |
| | | /** |
| | | * 产ååä»·ï¼åä½ï¼å
|
| | | * 计éåä½ç¼å· |
| | | * |
| | | * åä½ {@link CrmProductDO#getPrice()} |
| | | * å
³è MdmUnitMeasureRespDTO.id |
| | | */ |
| | | private BigDecimal productPrice; |
| | | private Long itemUnitId; |
| | | /** |
| | | * ç©æåä»·ï¼åä½ï¼å
ï¼åä½ï¼ |
| | | */ |
| | | private BigDecimal itemPrice; |
| | | /** |
| | | * åæºä»·æ ¼, åä½ï¼å
|
| | | */ |
| | |
| | | import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; |
| | | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; |
| | | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; |
| | | import cn.iocoder.yudao.module.crm.service.product.CrmProductService; |
| | | 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.user.AdminUserApi; |
| | | import com.mzt.logapi.context.LogRecordContext; |
| | | import com.mzt.logapi.service.impl.DiffParseFunction; |
| | |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| | |
| | | @Resource |
| | | private CrmContactBusinessService contactBusinessService; |
| | | @Resource |
| | | private CrmProductService productService; |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | |
| | | } |
| | | |
| | | private List<CrmBusinessProductDO> validateBusinessProducts(List<CrmBusinessSaveReqVO.BusinessProduct> list) { |
| | | // 1. æ ¡éªäº§ååå¨ |
| | | productService.validProductList(convertSet(list, CrmBusinessSaveReqVO.BusinessProduct::getProductId)); |
| | | // 1. æ ¡éªç©æåå¨ |
| | | Set<Long> itemIds = convertSet(list, CrmBusinessSaveReqVO.BusinessProduct::getItemId); |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(itemIds); |
| | | for (Long itemId : itemIds) { |
| | | if (itemMap.get(itemId) == null) { |
| | | throw exception(PRODUCT_NOT_EXISTS); |
| | | } |
| | | } |
| | | // 2. 转å为 CrmBusinessProductDO å表 |
| | | return convertList(list, o -> BeanUtils.toBean(o, CrmBusinessProductDO.class, |
| | | item -> item.setTotalPrice(MoneyUtils.priceMultiply(item.getBusinessPrice(), item.getCount())))); |
| | |
| | | import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; |
| | | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; |
| | | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO; |
| | | import cn.iocoder.yudao.module.crm.service.product.CrmProductService; |
| | | import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService; |
| | | import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderCreateReqDTO; |
| | |
| | | |
| | | @Resource |
| | | private CrmPermissionService crmPermissionService; |
| | | @Resource |
| | | private CrmProductService productService; |
| | | @Resource |
| | | private CrmCustomerService customerService; |
| | | @Resource |
| | |
| | | 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.ErpPurchaseOrderItemRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | */ |
| | | CommonResult<List<ErpPurchaseOrderRespDTO>> getPurchaseOrderList(List<Long> ids); |
| | | |
| | | /** |
| | | * è·åéè´è®¢åæç»å表 |
| | | * |
| | | * @param orderId 订åç¼å· |
| | | * @return æç»å表 |
| | | */ |
| | | CommonResult<List<ErpPurchaseOrderItemRespDTO>> getPurchaseOrderItemList(Long orderId); |
| | | |
| | | /** |
| | | * è·åéè´è®¢åæç» |
| | | * |
| | | * @param id æç»ç¼å· |
| | | * @return æç» |
| | | */ |
| | | CommonResult<ErpPurchaseOrderItemRespDTO> getPurchaseOrderItem(Long id); |
| | | |
| | | /** |
| | | * æ´æ°éè´è®¢åæç»çå
¥åºæ°é |
| | | * |
| | | * @param orderItemId æç»ç¼å· |
| | | * @param inCount å
¥åºæ°éå¢é |
| | | */ |
| | | CommonResult<Boolean> updateOrderItemInCount(Long orderItemId, BigDecimal inCount); |
| | | |
| | | /** |
| | | * æ´æ°éè´è®¢åçå
¥åºç¶æ |
| | | * |
| | | * æ ¹æ®æç»å
¥åºæ°éèªå¨è®¡ç®è®¢åç¶æï¼ |
| | | * - æææç»é½å®æå
¥åº â å®æç¶æ |
| | | * - é¨åæç»å®æå
¥åº â é¨åå
¥åºç¶æ |
| | | * |
| | | * @param orderId 订åç¼å· |
| | | */ |
| | | CommonResult<Boolean> updateOrderInStatus(Long orderId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.purchase.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "RPC æå¡ - ERP éè´è®¢åæç» Response DTO") |
| | | @Data |
| | | public class ErpPurchaseOrderItemRespDTO { |
| | | |
| | | @Schema(description = "æç»ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "éè´è®¢åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long orderId; |
| | | |
| | | @Schema(description = "产åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long productId; |
| | | |
| | | @Schema(description = "产ååä½ç¼å·", example = "1") |
| | | private Long productUnitId; |
| | | |
| | | @Schema(description = "产ååä»·ï¼åä½ï¼å
", example = "100.00") |
| | | private BigDecimal productPrice; |
| | | |
| | | @Schema(description = "è®¢è´æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | private BigDecimal count; |
| | | |
| | | @Schema(description = "å·²å
¥åºæ°é", example = "5") |
| | | private BigDecimal inCount; |
| | | |
| | | @Schema(description = "å·²éè´§æ°é", example = "0") |
| | | private BigDecimal returnCount; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| | |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderCreateReqDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ERP éå®è®¢å API æ¥å£ |
| | |
| | | */ |
| | | CommonResult<ErpSaleOrderRespDTO> getSaleOrderByContractId(Long contractId); |
| | | |
| | | /** |
| | | * è·åéå®è®¢åæç»å表 |
| | | * |
| | | * @param orderId 订åç¼å· |
| | | * @return æç»å表 |
| | | */ |
| | | CommonResult<List<ErpSaleOrderItemRespDTO>> getSaleOrderItemList(Long orderId); |
| | | |
| | | /** |
| | | * è·åéå®è®¢åæç» |
| | | * |
| | | * @param id æç»ç¼å· |
| | | * @return æç» |
| | | */ |
| | | CommonResult<ErpSaleOrderItemRespDTO> getSaleOrderItem(Long id); |
| | | |
| | | /** |
| | | * æ´æ°éå®è®¢åæç»çåºåºæ°é |
| | | * |
| | | * @param orderItemId æç»ç¼å· |
| | | * @param outCount åºåºæ°éå¢é |
| | | */ |
| | | CommonResult<Boolean> updateOrderItemOutCount(Long orderItemId, BigDecimal outCount); |
| | | |
| | | /** |
| | | * æ´æ°éå®è®¢åçåºåºç¶æ |
| | | * |
| | | * æ ¹æ®æç»åºåºæ°éèªå¨è®¡ç®è®¢åç¶æï¼ |
| | | * - æææç»é½å®æåºåº â å®æç¶æ |
| | | * - é¨åæç»å®æåºåº â é¨ååºåºç¶æ |
| | | * |
| | | * @param orderId 订åç¼å· |
| | | */ |
| | | CommonResult<Boolean> updateOrderOutStatus(Long orderId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.sale.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "RPC æå¡ - ERP éå®è®¢åæç» Response DTO") |
| | | @Data |
| | | public class ErpSaleOrderItemRespDTO { |
| | | |
| | | @Schema(description = "æç»ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "éå®è®¢åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long orderId; |
| | | |
| | | @Schema(description = "产åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long productId; |
| | | |
| | | @Schema(description = "产ååä½ç¼å·", example = "1") |
| | | private Long productUnitId; |
| | | |
| | | @Schema(description = "产ååä»·ï¼åä½ï¼å
", example = "100.00") |
| | | private BigDecimal productPrice; |
| | | |
| | | @Schema(description = "è®¢è´æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | private BigDecimal count; |
| | | |
| | | @Schema(description = "å·²åºåºæ°é", example = "5") |
| | | private BigDecimal outCount; |
| | | |
| | | @Schema(description = "å·²éè´§æ°é", example = "0") |
| | | private BigDecimal returnCount; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- WMS ä»å¨ç©æµ API --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-wms-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ä¸å¡ç»ä»¶ --> |
| | | |
| | | <!-- Web ç¸å
³ --> |
| | |
| | | |
| | | 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.ErpPurchaseOrderItemRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO; |
| | | 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.mysql.purchase.ErpPurchaseOrderItemMapper; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseOrderService; |
| | | import jakarta.annotation.Resource; |
| | |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | |
| | |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderService purchaseOrderService; |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderItemMapper purchaseOrderItemMapper; |
| | | |
| | | @Override |
| | | public CommonResult<ErpPurchaseOrderRespDTO> getPurchaseOrder(Long id) { |
| | |
| | | return success(BeanUtils.toBean(orders, ErpPurchaseOrderRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<ErpPurchaseOrderItemRespDTO>> getPurchaseOrderItemList(Long orderId) { |
| | | if (orderId == null) { |
| | | return success(Collections.emptyList()); |
| | | } |
| | | List<ErpPurchaseOrderItemDO> items = purchaseOrderService.getPurchaseOrderItemListByOrderId(orderId); |
| | | return success(BeanUtils.toBean(items, ErpPurchaseOrderItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<ErpPurchaseOrderItemRespDTO> getPurchaseOrderItem(Long id) { |
| | | if (id == null) { |
| | | return success(null); |
| | | } |
| | | ErpPurchaseOrderItemDO item = purchaseOrderItemMapper.selectById(id); |
| | | return success(BeanUtils.toBean(item, ErpPurchaseOrderItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Boolean> updateOrderItemInCount(Long orderItemId, BigDecimal inCount) { |
| | | if (orderItemId == null || inCount == null) { |
| | | return success(false); |
| | | } |
| | | ErpPurchaseOrderItemDO item = purchaseOrderItemMapper.selectById(orderItemId); |
| | | if (item == null) { |
| | | return success(false); |
| | | } |
| | | // ç´¯å å
¥åºæ°é |
| | | BigDecimal newInCount = (item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO).add(inCount); |
| | | ErpPurchaseOrderItemDO updateItem = new ErpPurchaseOrderItemDO(); |
| | | updateItem.setId(orderItemId); |
| | | updateItem.setInCount(newInCount); |
| | | purchaseOrderItemMapper.updateById(updateItem); |
| | | return success(true); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Boolean> updateOrderInStatus(Long orderId) { |
| | | if (orderId == null) { |
| | | return success(false); |
| | | } |
| | | purchaseOrderService.updatePurchaseOrderInStatus(orderId); |
| | | return success(true); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderCreateReqDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderItemMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderMapper; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOrderService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | |
| | | |
| | | @Resource |
| | | private ErpSaleOrderMapper saleOrderMapper; |
| | | |
| | | @Resource |
| | | private ErpSaleOrderItemMapper saleOrderItemMapper; |
| | | |
| | | @Override |
| | | public CommonResult<Long> createSaleOrder(ErpSaleOrderCreateReqDTO createReqDTO) { |
| | |
| | | return success(BeanUtils.toBean(order, ErpSaleOrderRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<ErpSaleOrderItemRespDTO>> getSaleOrderItemList(Long orderId) { |
| | | if (orderId == null) { |
| | | return success(Collections.emptyList()); |
| | | } |
| | | List<ErpSaleOrderItemDO> items = saleOrderService.getSaleOrderItemListByOrderId(orderId); |
| | | return success(BeanUtils.toBean(items, ErpSaleOrderItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<ErpSaleOrderItemRespDTO> getSaleOrderItem(Long id) { |
| | | if (id == null) { |
| | | return success(null); |
| | | } |
| | | ErpSaleOrderItemDO item = saleOrderItemMapper.selectById(id); |
| | | return success(BeanUtils.toBean(item, ErpSaleOrderItemRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Boolean> updateOrderItemOutCount(Long orderItemId, BigDecimal outCount) { |
| | | if (orderItemId == null || outCount == null) { |
| | | return success(false); |
| | | } |
| | | ErpSaleOrderItemDO item = saleOrderItemMapper.selectById(orderItemId); |
| | | if (item == null) { |
| | | return success(false); |
| | | } |
| | | // ç´¯å åºåºæ°é |
| | | BigDecimal newOutCount = (item.getOutCount() != null ? item.getOutCount() : BigDecimal.ZERO).add(outCount); |
| | | ErpSaleOrderItemDO updateItem = new ErpSaleOrderItemDO(); |
| | | updateItem.setId(orderItemId); |
| | | updateItem.setOutCount(newOutCount); |
| | | saleOrderItemMapper.updateById(updateItem); |
| | | return success(true); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<Boolean> updateOrderOutStatus(Long orderId) { |
| | | if (orderId == null) { |
| | | return success(false); |
| | | } |
| | | saleOrderService.updateSaleOrderOutStatus(orderId); |
| | | return success(true); |
| | | } |
| | | |
| | | } |
| | |
| | | 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.collection.MapUtils; |
| | | 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.product.vo.product.ErpProductRespVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderRespVO; |
| | | 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.ErpSupplierDO; |
| | | import cn.iocoder.yudao.module.erp.service.product.ErpProductService; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseOrderService; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService; |
| | | import cn.iocoder.yudao.module.erp.service.stock.ErpStockService; |
| | | 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.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | |
| | | @Resource |
| | | private ErpPurchaseOrderService purchaseOrderService; |
| | | @Resource |
| | | private ErpStockService stockService; |
| | | @Resource |
| | | private ErpProductService productService; |
| | | @Resource |
| | | private ErpSupplierService supplierService; |
| | | |
| | | @Resource |
| | | private MdmItemApi mdmItemApi; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | |
| | | return success(null); |
| | | } |
| | | List<ErpPurchaseOrderItemDO> purchaseOrderItemList = purchaseOrderService.getPurchaseOrderItemListByOrderId(id); |
| | | Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId)); |
| | | return success(BeanUtils.toBean(purchaseOrder, ErpPurchaseOrderRespVO.class, purchaseOrderVO -> |
| | | purchaseOrderVO.setItems(BeanUtils.toBean(purchaseOrderItemList, ErpPurchaseOrderRespVO.Item.class, item -> { |
| | | BigDecimal purchaseCount = stockService.getStockCount(item.getProductId()); |
| | | item.setStockCount(purchaseCount != null ? purchaseCount : BigDecimal.ZERO); |
| | | MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) |
| | | .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())); |
| | | // åºåä¿¡æ¯æä¸æ¥è¯¢ï¼ä»å¨ç©æµæ¨¡åï¼ |
| | | item.setStockCount(BigDecimal.ZERO); |
| | | MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName()) |
| | | .setProductBarCode(mdmItem.getBarCode())); |
| | | })))); |
| | | } |
| | | |
| | |
| | | List<ErpPurchaseOrderItemDO> purchaseOrderItemList = purchaseOrderService.getPurchaseOrderItemListByOrderIds( |
| | | convertSet(pageResult.getList(), ErpPurchaseOrderDO::getId)); |
| | | Map<Long, List<ErpPurchaseOrderItemDO>> purchaseOrderItemMap = convertMultiMap(purchaseOrderItemList, ErpPurchaseOrderItemDO::getOrderId); |
| | | // 1.2 产åä¿¡æ¯ |
| | | Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( |
| | | // 1.2 ç©æä¿¡æ¯ |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId)); |
| | | // 1.3 ä¾åºåä¿¡æ¯ |
| | | Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap( |
| | |
| | | // 2. å¼å§æ¼æ¥ |
| | | return BeanUtils.toBean(pageResult, ErpPurchaseOrderRespVO.class, purchaseOrder -> { |
| | | purchaseOrder.setItems(BeanUtils.toBean(purchaseOrderItemMap.get(purchaseOrder.getId()), ErpPurchaseOrderRespVO.Item.class, |
| | | item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) |
| | | .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())))); |
| | | item -> MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName()) |
| | | .setProductBarCode(mdmItem.getBarCode())))); |
| | | purchaseOrder.setProductNames(CollUtil.join(purchaseOrder.getItems(), "ï¼", ErpPurchaseOrderRespVO.Item::getProductName)); |
| | | MapUtils.findAndThen(supplierMap, purchaseOrder.getSupplierId(), supplier -> purchaseOrder.setSupplierName(supplier.getName())); |
| | | MapUtils.findAndThen(userMap, Long.parseLong(purchaseOrder.getCreator()), user -> purchaseOrder.setCreatorName(user.getNickname())); |
| | |
| | | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; |
| | | 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.product.ErpProductService; |
| | | 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; |
| | |
| | | @Resource |
| | | private ErpPurchaseRequestService purchaseRequestService; |
| | | @Resource |
| | | private ErpProductService productService; |
| | | @Resource |
| | | private ErpSupplierService supplierService; |
| | | |
| | | @Resource |
| | | private MdmItemApi mdmItemApi; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | @Resource |
| | |
| | | return success(null); |
| | | } |
| | | List<ErpPurchaseRequestItemDO> purchaseRequestItemList = purchaseRequestService.getPurchaseRequestItemListByRequestId(id); |
| | | Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(purchaseRequestItemList, ErpPurchaseRequestItemDO::getProductId)); |
| | | return success(BeanUtils.toBean(purchaseRequest, ErpPurchaseRequestRespVO.class, vo -> { |
| | | vo.setItems(BeanUtils.toBean(purchaseRequestItemList, ErpPurchaseRequestRespVO.Item.class, item -> |
| | | MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) |
| | | .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())))); |
| | | MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName()) |
| | | .setProductBarCode(mdmItem.getBarCode())))); |
| | | // å¡«å
å
³èåæ®µ |
| | | fillPurchaseRequestRelatedFields(vo); |
| | | })); |
| | |
| | | List<ErpPurchaseRequestItemDO> purchaseRequestItemList = purchaseRequestService.getPurchaseRequestItemListByRequestIds( |
| | | convertSet(pageResult.getList(), ErpPurchaseRequestDO::getId)); |
| | | Map<Long, List<ErpPurchaseRequestItemDO>> purchaseRequestItemMap = convertMultiMap(purchaseRequestItemList, ErpPurchaseRequestItemDO::getRequestId); |
| | | // 1.2 产åä¿¡æ¯ |
| | | Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( |
| | | // 1.2 ç©æä¿¡æ¯ |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(purchaseRequestItemList, ErpPurchaseRequestItemDO::getProductId)); |
| | | // 1.3 ä¾åºåä¿¡æ¯ |
| | | Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap( |
| | |
| | | // 2. å¼å§æ¼æ¥ |
| | | return BeanUtils.toBean(pageResult, ErpPurchaseRequestRespVO.class, vo -> { |
| | | vo.setItems(BeanUtils.toBean(purchaseRequestItemMap.get(vo.getId()), ErpPurchaseRequestRespVO.Item.class, |
| | | item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) |
| | | .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())))); |
| | | item -> MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName()) |
| | | .setProductBarCode(mdmItem.getBarCode())))); |
| | | vo.setProductNames(CollUtil.join(vo.getItems(), "ï¼", ErpPurchaseRequestRespVO.Item::getProductName)); |
| | | MapUtils.findAndThen(supplierMap, vo.getSupplierId(), supplier -> vo.setSupplierName(supplier.getName())); |
| | | MapUtils.findAndThen(userMap, vo.getRequestUserId(), user -> vo.setRequestUserName(user.getNickname())); |
| | |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderRespVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO; |
| | | import cn.iocoder.yudao.module.erp.service.product.ErpProductService; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOrderService; |
| | | import cn.iocoder.yudao.module.erp.service.stock.ErpStockService; |
| | | 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.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | |
| | | @Resource |
| | | private ErpSaleOrderService saleOrderService; |
| | | @Resource |
| | | private ErpStockService stockService; |
| | | @Resource |
| | | private ErpProductService productService; |
| | | @Resource |
| | | private CrmCustomerApi customerApi; |
| | | |
| | | @Resource |
| | | private MdmItemApi mdmItemApi; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | |
| | | return success(null); |
| | | } |
| | | List<ErpSaleOrderItemDO> saleOrderItemList = saleOrderService.getSaleOrderItemListByOrderId(id); |
| | | Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductId)); |
| | | return success(BeanUtils.toBean(saleOrder, ErpSaleOrderRespVO.class, saleOrderVO -> |
| | | saleOrderVO.setItems(BeanUtils.toBean(saleOrderItemList, ErpSaleOrderRespVO.Item.class, item -> { |
| | | BigDecimal stockCount = stockService.getStockCount(item.getProductId()); |
| | | item.setStockCount(stockCount != null ? stockCount : BigDecimal.ZERO); |
| | | MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) |
| | | .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())); |
| | | // åºåä¿¡æ¯æä¸æ¥è¯¢ï¼ä»å¨ç©æµæ¨¡åï¼ |
| | | item.setStockCount(BigDecimal.ZERO); |
| | | MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName()) |
| | | .setProductBarCode(mdmItem.getBarCode())); |
| | | })))); |
| | | } |
| | | |
| | |
| | | List<ErpSaleOrderItemDO> saleOrderItemList = saleOrderService.getSaleOrderItemListByOrderIds( |
| | | convertSet(pageResult.getList(), ErpSaleOrderDO::getId)); |
| | | Map<Long, List<ErpSaleOrderItemDO>> saleOrderItemMap = convertMultiMap(saleOrderItemList, ErpSaleOrderItemDO::getOrderId); |
| | | // 1.2 产åä¿¡æ¯ |
| | | Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( |
| | | // 1.2 ç©æä¿¡æ¯ |
| | | Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap( |
| | | convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductId)); |
| | | // 1.3 客æ·ä¿¡æ¯ï¼ä½¿ç¨ CRM å®¢æ· APIï¼ |
| | | Map<Long, CrmCustomerRespDTO> customerMap = customerApi.getCustomerMap( |
| | |
| | | // 2. å¼å§æ¼æ¥ |
| | | return BeanUtils.toBean(pageResult, ErpSaleOrderRespVO.class, saleOrder -> { |
| | | saleOrder.setItems(BeanUtils.toBean(saleOrderItemMap.get(saleOrder.getId()), ErpSaleOrderRespVO.Item.class, |
| | | item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) |
| | | .setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())))); |
| | | item -> MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> item.setProductName(mdmItem.getName()) |
| | | .setProductBarCode(mdmItem.getBarCode())))); |
| | | saleOrder.setProductNames(CollUtil.join(saleOrder.getItems(), "ï¼", ErpSaleOrderRespVO.Item::getProductName)); |
| | | MapUtils.findAndThen(customerMap, saleOrder.getCustomerId(), supplier -> saleOrder.setCustomerName(supplier.getName())); |
| | | MapUtils.findAndThen(userMap, Long.parseLong(saleOrder.getCreator()), user -> saleOrder.setCreatorName(user.getNickname())); |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.dataobject.finance; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("erp_finance_payment_item") |
| | | @KeySequence("erp_finance_payment_item_seq") // ç¨äº OracleãPostgreSQLãKingbaseãDB2ãH2 æ°æ®åºç主é®èªå¢ãå¦ææ¯ MySQL çæ°æ®åºï¼å¯ä¸åã |
| | | @KeySequence("erp_finance_payment_item_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | |
| | | private Integer bizType; |
| | | /** |
| | | * ä¸å¡ç¼å· |
| | | * |
| | | * ä¾å¦è¯´ï¼{@link ErpPurchaseInDO#getId()} |
| | | */ |
| | | private Long bizId; |
| | | /** |
| | | * ä¸å¡åå· |
| | | * |
| | | * ä¾å¦è¯´ï¼{@link ErpPurchaseInDO#getNo()} |
| | | */ |
| | | private String bizNo; |
| | | |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.dataobject.finance; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOutDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("erp_finance_receipt_item") |
| | | @KeySequence("erp_finance_receipt_item_seq") // ç¨äº OracleãPostgreSQLãKingbaseãDB2ãH2 æ°æ®åºç主é®èªå¢ãå¦ææ¯ MySQL çæ°æ®åºï¼å¯ä¸åã |
| | | @KeySequence("erp_finance_receipt_item_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | |
| | | private Integer bizType; |
| | | /** |
| | | * ä¸å¡ç¼å· |
| | | * |
| | | * ä¾å¦è¯´ï¼{@link ErpSaleOutDO#getId()} |
| | | */ |
| | | private Long bizId; |
| | | /** |
| | | * ä¸å¡åå· |
| | | * |
| | | * ä¾å¦è¯´ï¼{@link ErpSaleOutDO#getNo()} |
| | | */ |
| | | private String bizNo; |
| | | |
| | |
| | | */ |
| | | private Long accountId; |
| | | /** |
| | | * å
³èéè´ç³è¯·ç¼å· |
| | | * |
| | | * å
³è {@link ErpPurchaseRequestDO#getId()} |
| | | */ |
| | | private Long requestId; |
| | | /** |
| | | * éè´ç³è¯·åå· |
| | | */ |
| | | private String requestNo; |
| | | /** |
| | | * ä¸åæ¶é´ |
| | | */ |
| | | private LocalDateTime orderTime; |
| | |
| | | */ |
| | | private BigDecimal returnCount; |
| | | |
| | | /** |
| | | * å
¥åºç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.erp.enums.ErpPurchaseOrderInStatusEnum} |
| | | */ |
| | | private Integer inStatus; |
| | | |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.dataobject.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | |
| | | */ |
| | | private Long orderId; |
| | | /** |
| | | * 产åç¼å· |
| | | * ç©æç¼å· |
| | | * |
| | | * å
³è {@link ErpProductDO#getId()} |
| | | * å
³è {@link cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO#getId()} |
| | | */ |
| | | private Long productId; |
| | | /** |
| | | * 产ååä½åä½ |
| | | * 计éåä½ç¼å· |
| | | * |
| | | * åä½ {@link ErpProductDO#getUnitId()} |
| | | * å
³è {@link cn.iocoder.yudao.module.mdm.api.unitmeasure.dto.MdmUnitMeasureRespDTO#getId()} |
| | | */ |
| | | private Long productUnitId; |
| | | |
| | |
| | | private LocalDateTime orderTime; |
| | | |
| | | /** |
| | | * å
¥åºç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.erp.enums.ErpPurchaseOrderInStatusEnum} |
| | | */ |
| | | private Integer inStatus; |
| | | |
| | | /** |
| | | * éä»¶å°å |
| | | */ |
| | | private String fileUrl; |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.dataobject.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | |
| | | */ |
| | | private Long requestId; |
| | | /** |
| | | * 产åç¼å· |
| | | * ç©æç¼å· |
| | | * |
| | | * å
³è {@link ErpProductDO#getId()} |
| | | * å
³è {@link cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO#getId()} |
| | | */ |
| | | private Long productId; |
| | | /** |
| | | * 产ååä½ç¼å· |
| | | * 计éåä½ç¼å· |
| | | * |
| | | * åä½ {@link ErpProductDO#getUnitId()} |
| | | * å
³è {@link cn.iocoder.yudao.module.mdm.api.unitmeasure.dto.MdmUnitMeasureRespDTO#getId()} |
| | | */ |
| | | private Long productUnitId; |
| | | |
| | |
| | | */ |
| | | private BigDecimal returnCount; |
| | | |
| | | /** |
| | | * åºåºç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.erp.enums.ErpSaleOrderOutStatusEnum} |
| | | */ |
| | | private Integer outStatus; |
| | | |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.dataobject.sale; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("erp_sale_order_items") |
| | | @KeySequence("erp_sale_order_items_seq") // ç¨äº OracleãPostgreSQLãKingbaseãDB2ãH2 æ°æ®åºç主é®èªå¢ãå¦ææ¯ MySQL çæ°æ®åºï¼å¯ä¸åã |
| | | @KeySequence("erp_sale_order_items_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | |
| | | */ |
| | | private Long orderId; |
| | | /** |
| | | * 产åç¼å· |
| | | * ç©æç¼å· |
| | | * |
| | | * å
³è {@link ErpProductDO#getId()} |
| | | * å
³è {@link cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO#getId()} |
| | | */ |
| | | private Long productId; |
| | | /** |
| | | * 产ååä½åä½ |
| | | * 计éåä½ç¼å· |
| | | * |
| | | * åä½ {@link ErpProductDO#getUnitId()} |
| | | * å
³è {@link cn.iocoder.yudao.module.mdm.api.unitmeasure.dto.MdmUnitMeasureRespDTO#getId()} |
| | | */ |
| | | private Long productUnitId; |
| | | |
| | |
| | | public class ErpNoRedisDAO { |
| | | |
| | | /** |
| | | * å
¶å®å
¥åº {@link cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockInDO} |
| | | */ |
| | | public static final String STOCK_IN_NO_PREFIX = "QTRK"; |
| | | /** |
| | | * å
¶å®åºåº {@link cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockOutDO} |
| | | */ |
| | | public static final String STOCK_OUT_NO_PREFIX = "QCKD"; |
| | | |
| | | /** |
| | | * åºåè°æ¨ {@link cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockMoveDO} |
| | | */ |
| | | public static final String STOCK_MOVE_NO_PREFIX = "QCDB"; |
| | | |
| | | /** |
| | | * åºåçç¹ {@link cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockCheckDO} |
| | | */ |
| | | public static final String STOCK_CHECK_NO_PREFIX = "QCPD"; |
| | | |
| | | /** |
| | | * éå®è®¢å {@link cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO} |
| | | */ |
| | | public static final String SALE_ORDER_NO_PREFIX = "XSDD"; |
| | | /** |
| | | * éå®åºåº {@link cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOutDO} |
| | | */ |
| | | public static final String SALE_OUT_NO_PREFIX = "XSCK"; |
| | | /** |
| | | * éå®éè´§ {@link cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleReturnDO} |
| | | */ |
| | | public static final String SALE_RETURN_NO_PREFIX = "XSTH"; |
| | | |
| | | /** |
| | | * éè´è®¢å {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO} |
| | |
| | | * éè´ç³è¯· {@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.purchase.ErpPurchaseInDO} |
| | | */ |
| | | public static final String PURCHASE_IN_NO_PREFIX = "CGRK"; |
| | | /** |
| | | * éè´éè´§ {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnDO} |
| | | */ |
| | | public static final String PURCHASE_RETURN_NO_PREFIX = "CGTH"; |
| | | |
| | | /** |
| | | * 仿¬¾å {@link cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentDO} |
| | |
| | | |
| | | /** |
| | | * çæåºå·ï¼ä½¿ç¨å½åæ¥æï¼æ ¼å¼ä¸º {PREFIX} + yyyyMMdd + 6 ä½èªå¢ |
| | | * ä¾å¦è¯´ï¼QTRK 202109 000001 ï¼æ²¡æä¸é´ç©ºæ ¼ï¼ |
| | | * ä¾å¦è¯´ï¼CGDD 202109 000001 ï¼æ²¡æä¸é´ç©ºæ ¼ï¼ |
| | | * |
| | | * @param prefix åç¼ |
| | | * @return åºå· |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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 éè´è®¢åå
¥åºç¶ææä¸¾ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum ErpPurchaseOrderInStatusEnum implements ArrayValuable<Integer> { |
| | | |
| | | NOT_IN(0, "æªå
¥åº"), |
| | | PART_IN(1, "é¨åå
¥åº"), |
| | | ALL_IN(2, "å
¨é¨å
¥åº"); |
| | | |
| | | private final Integer status; |
| | | private final String name; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()) |
| | | .map(ErpPurchaseOrderInStatusEnum::getStatus).toArray(Integer[]::new); |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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 éå®è®¢ååºåºç¶ææä¸¾ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum ErpSaleOrderOutStatusEnum implements ArrayValuable<Integer> { |
| | | |
| | | NOT_OUT(0, "æªåºåº"), |
| | | PART_OUT(1, "é¨ååºåº"), |
| | | ALL_OUT(2, "å
¨é¨åºåº"); |
| | | |
| | | private final Integer status; |
| | | private final String name; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()) |
| | | .map(ErpSaleOrderOutStatusEnum::getStatus).toArray(Integer[]::new); |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.erp.service.finance; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.lang.Assert; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.payment.ErpFinancePaymentSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinancePaymentItemDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinancePaymentItemMapper; |
| | | 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.common.ErpBizTypeEnum; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInService; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseReturnService; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpSupplierService; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | |
| | | 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.*; |
| | | |
| | | // TODO èè¿ï¼è®°å½æä½æ¥å¿ |
| | | |
| | | /** |
| | | * ERP 仿¬¾å Service å®ç°ç±» |
| | |
| | | private ErpSupplierService supplierService; |
| | | @Resource |
| | | private ErpAccountService accountService; |
| | | @Resource |
| | | private ErpPurchaseInService purchaseInService; |
| | | @Resource |
| | | private ErpPurchaseReturnService purchaseReturnService; |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | |
| | | private List<ErpFinancePaymentItemDO> validateFinancePaymentItems( |
| | | Long supplierId, |
| | | List<ErpFinancePaymentSaveReqVO.Item> list) { |
| | | // éè´å
¥åº/éè´§åè½å·²ç§»é¤ï¼ææ¶åªæ¯ææå¨å½å
¥ä»æ¬¾æç» |
| | | return convertList(list, o -> BeanUtils.toBean(o, ErpFinancePaymentItemDO.class, item -> { |
| | | if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_IN.getType())) { |
| | | ErpPurchaseInDO purchaseIn = purchaseInService.validatePurchaseIn(item.getBizId()); |
| | | Assert.equals(purchaseIn.getSupplierId(), supplierId, "ä¾åºåå¿
é¡»ç¸å"); |
| | | item.setTotalPrice(purchaseIn.getTotalPrice()).setBizNo(purchaseIn.getNo()); |
| | | } else if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_RETURN.getType())) { |
| | | ErpPurchaseReturnDO purchaseReturn = purchaseReturnService.validatePurchaseReturn(item.getBizId()); |
| | | Assert.equals(purchaseReturn.getSupplierId(), supplierId, "ä¾åºåå¿
é¡»ç¸å"); |
| | | item.setTotalPrice(purchaseReturn.getTotalPrice().negate()).setBizNo(purchaseReturn.getNo()); |
| | | } else { |
| | | throw new IllegalArgumentException("ä¸å¡ç±»å䏿£ç¡®ï¼" + item.getBizType()); |
| | | if (item.getPaymentPrice() == null) { |
| | | item.setPaymentPrice(BigDecimal.ZERO); |
| | | } |
| | | if (item.getTotalPrice() == null) { |
| | | item.setTotalPrice(BigDecimal.ZERO); |
| | | } |
| | | })); |
| | | } |
| | | |
| | | private void updateFinancePaymentItemList(Long id, List<ErpFinancePaymentItemDO> newList) { |
| | | // ç¬¬ä¸æ¥ï¼å¯¹æ¯æ°èæ°æ®ï¼è·å¾æ·»å ãä¿®æ¹ãå é¤çå表 |
| | | List<ErpFinancePaymentItemDO> oldList = financePaymentItemMapper.selectListByPaymentId(id); |
| | | List<List<ErpFinancePaymentItemDO>> diffList = diffList(oldList, newList, // id ä¸åï¼å°±è®¤ä¸ºæ¯ä¸åçè®°å½ |
| | | List<List<ErpFinancePaymentItemDO>> diffList = diffList(oldList, newList, |
| | | (oldVal, newVal) -> oldVal.getId().equals(newVal.getId())); |
| | | |
| | | // ç¬¬äºæ¥ï¼æ¹éæ·»å ãä¿®æ¹ãå é¤ |
| | | if (CollUtil.isNotEmpty(diffList.get(0))) { |
| | | diffList.get(0).forEach(o -> o.setPaymentId(id)); |
| | | financePaymentItemMapper.insertBatch(diffList.get(0)); |
| | |
| | | if (CollUtil.isNotEmpty(diffList.get(2))) { |
| | | financePaymentItemMapper.deleteByIds(convertList(diffList.get(2), ErpFinancePaymentItemDO::getId)); |
| | | } |
| | | |
| | | // ç¬¬ä¸æ¥ï¼æ´æ°éè´å
¥åºãéè´§ç仿¬¾é颿
åµ |
| | | updatePurchasePrice(CollectionUtils.newArrayList(diffList)); |
| | | } |
| | | |
| | | private void updatePurchasePrice(List<ErpFinancePaymentItemDO> paymentItems) { |
| | | paymentItems.forEach(paymentItem -> { |
| | | BigDecimal totalPaymentPrice = financePaymentItemMapper.selectPaymentPriceSumByBizIdAndBizType( |
| | | paymentItem.getBizId(), paymentItem.getBizType()); |
| | | if (ErpBizTypeEnum.PURCHASE_IN.getType().equals(paymentItem.getBizType())) { |
| | | purchaseInService.updatePurchaseInPaymentPrice(paymentItem.getBizId(), totalPaymentPrice); |
| | | } else if (ErpBizTypeEnum.PURCHASE_RETURN.getType().equals(paymentItem.getBizType())) { |
| | | purchaseReturnService.updatePurchaseReturnRefundPrice(paymentItem.getBizId(), totalPaymentPrice.negate()); |
| | | } else { |
| | | throw new IllegalArgumentException("ä¸å¡ç±»å䏿£ç¡®ï¼" + paymentItem.getBizType()); |
| | | } |
| | | }); |
| | | // éè´å
¥åº/éè´§åè½å·²ç§»é¤ï¼ä¸åæ´æ°å
³èä¸å¡éé¢ |
| | | } |
| | | |
| | | @Override |
| | |
| | | package cn.iocoder.yudao.module.erp.service.finance; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.lang.Assert; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.receipt.ErpFinanceReceiptPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.finance.vo.receipt.ErpFinanceReceiptSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinanceReceiptDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpFinanceReceiptItemDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOutDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleReturnDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinanceReceiptItemMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinanceReceiptMapper; |
| | | 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.common.ErpBizTypeEnum; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOutService; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpSaleReturnService; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | 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.*; |
| | | |
| | | // TODO èè¿ï¼è®°å½æä½æ¥å¿ |
| | | |
| | | /** |
| | | * ERP æ¶æ¬¾å Service å®ç°ç±» |
| | |
| | | private CrmCustomerApi customerApi; |
| | | @Resource |
| | | private ErpAccountService accountService; |
| | | @Resource |
| | | private ErpSaleOutService saleOutService; |
| | | @Resource |
| | | private ErpSaleReturnService saleReturnService; |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | |
| | | private List<ErpFinanceReceiptItemDO> validateFinanceReceiptItems( |
| | | Long customerId, |
| | | List<ErpFinanceReceiptSaveReqVO.Item> list) { |
| | | // éå®åºåº/éè´§åè½å·²ç§»é¤ï¼ææ¶åªæ¯ææå¨å½å
¥æ¶æ¬¾æç» |
| | | return convertList(list, o -> BeanUtils.toBean(o, ErpFinanceReceiptItemDO.class, item -> { |
| | | if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.SALE_OUT.getType())) { |
| | | ErpSaleOutDO saleOut = saleOutService.validateSaleOut(item.getBizId()); |
| | | Assert.equals(saleOut.getCustomerId(), customerId, "客æ·å¿
é¡»ç¸å"); |
| | | item.setTotalPrice(saleOut.getTotalPrice()).setBizNo(saleOut.getNo()); |
| | | } else if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.SALE_RETURN.getType())) { |
| | | ErpSaleReturnDO saleReturn = saleReturnService.validateSaleReturn(item.getBizId()); |
| | | Assert.equals(saleReturn.getCustomerId(), customerId, "客æ·å¿
é¡»ç¸å"); |
| | | item.setTotalPrice(saleReturn.getTotalPrice().negate()).setBizNo(saleReturn.getNo()); |
| | | } else { |
| | | throw new IllegalArgumentException("ä¸å¡ç±»å䏿£ç¡®ï¼" + item.getBizType()); |
| | | // ä¸å¡ç±»åæ ¡éªå·²ç§»é¤ï¼ç´æ¥ä½¿ç¨ä¼ å
¥çæ°æ® |
| | | if (item.getReceiptPrice() == null) { |
| | | item.setReceiptPrice(BigDecimal.ZERO); |
| | | } |
| | | if (item.getTotalPrice() == null) { |
| | | item.setTotalPrice(BigDecimal.ZERO); |
| | | } |
| | | })); |
| | | } |
| | |
| | | private void updateFinanceReceiptItemList(Long id, List<ErpFinanceReceiptItemDO> newList) { |
| | | // ç¬¬ä¸æ¥ï¼å¯¹æ¯æ°èæ°æ®ï¼è·å¾æ·»å ãä¿®æ¹ãå é¤çå表 |
| | | List<ErpFinanceReceiptItemDO> oldList = financeReceiptItemMapper.selectListByReceiptId(id); |
| | | List<List<ErpFinanceReceiptItemDO>> diffList = diffList(oldList, newList, // id ä¸åï¼å°±è®¤ä¸ºæ¯ä¸åçè®°å½ |
| | | List<List<ErpFinanceReceiptItemDO>> diffList = diffList(oldList, newList, |
| | | (oldVal, newVal) -> oldVal.getId().equals(newVal.getId())); |
| | | |
| | | // ç¬¬äºæ¥ï¼æ¹éæ·»å ãä¿®æ¹ãå é¤ |
| | |
| | | if (CollUtil.isNotEmpty(diffList.get(2))) { |
| | | financeReceiptItemMapper.deleteByIds(convertList(diffList.get(2), ErpFinanceReceiptItemDO::getId)); |
| | | } |
| | | |
| | | // ç¬¬ä¸æ¥ï¼æ´æ°éå®åºåºãéè´§çæ¶æ¬¾é颿
åµ |
| | | updateSalePrice(CollectionUtils.newArrayList(diffList)); |
| | | } |
| | | |
| | | private void updateSalePrice(List<ErpFinanceReceiptItemDO> receiptItems) { |
| | | receiptItems.forEach(receiptItem -> { |
| | | BigDecimal totalReceiptPrice = financeReceiptItemMapper.selectReceiptPriceSumByBizIdAndBizType( |
| | | receiptItem.getBizId(), receiptItem.getBizType()); |
| | | if (ErpBizTypeEnum.SALE_OUT.getType().equals(receiptItem.getBizType())) { |
| | | saleOutService.updateSaleInReceiptPrice(receiptItem.getBizId(), totalReceiptPrice); |
| | | } else if (ErpBizTypeEnum.SALE_RETURN.getType().equals(receiptItem.getBizType())) { |
| | | saleReturnService.updateSaleReturnRefundPrice(receiptItem.getBizId(), totalReceiptPrice.negate()); |
| | | } else { |
| | | throw new IllegalArgumentException("ä¸å¡ç±»å䏿£ç¡®ï¼" + receiptItem.getBizType()); |
| | | } |
| | | }); |
| | | // éå®åºåº/éè´§åè½å·²ç§»é¤ï¼ä¸åæ´æ°å
³èä¸å¡éé¢ |
| | | } |
| | | |
| | | @Override |
| | |
| | | */ |
| | | List<ErpPurchaseOrderDO> getPurchaseOrderList(List<Long> ids); |
| | | |
| | | /** |
| | | * æ´æ°éè´è®¢åçå
¥åºç¶æ |
| | | * |
| | | * æ ¹æ®æç»å
¥åºæ°éèªå¨è®¡ç®è®¢åç¶æï¼ |
| | | * - æææç»é½å®æå
¥åº â å
¨é¨å
¥åºç¶æ |
| | | * - é¨åæç»å®æå
¥åº â é¨åå
¥åºç¶æ |
| | | * - æ æç»å
¥åº â æªå
¥åºç¶æ |
| | | * |
| | | * @param orderId 订åç¼å· |
| | | */ |
| | | void updatePurchaseOrderInStatus(Long orderId); |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | 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.product.ErpProductDO; |
| | | 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.mysql.purchase.ErpPurchaseOrderItemMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseOrderMapper; |
| | | 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.erp.service.product.ErpProductService; |
| | | 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; |
| | |
| | | private ErpNoRedisDAO noRedisDAO; |
| | | |
| | | @Resource |
| | | private ErpProductService productService; |
| | | @Resource |
| | | private ErpSupplierService supplierService; |
| | | @Resource |
| | | private ErpAccountService accountService; |
| | | |
| | | @Resource |
| | | @Lazy |
| | | private ErpPurchaseRequestService purchaseRequestService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | } |
| | | |
| | | private List<ErpPurchaseOrderItemDO> validatePurchaseOrderItems(List<ErpPurchaseOrderSaveReqVO.Item> list) { |
| | | // 1. æ ¡éªäº§ååå¨ |
| | | List<ErpProductDO> productList = productService.validProductList( |
| | | convertSet(list, ErpPurchaseOrderSaveReqVO.Item::getProductId)); |
| | | Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId); |
| | | // 2. 转å为 ErpPurchaseOrderItemDO å表 |
| | | // 转å为 ErpPurchaseOrderItemDO å表ï¼äº§åéªè¯å·²ç§»é¤ï¼ |
| | | return convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseOrderItemDO.class, item -> { |
| | | item.setProductUnitId(productMap.get(item.getProductId()).getUnitId()); |
| | | item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount())); |
| | | if (item.getTotalPrice() == null) { |
| | | return; |
| | |
| | | } |
| | | if (inCount.compareTo(item.getCount()) > 0) { |
| | | throw exception(PURCHASE_ORDER_ITEM_IN_FAIL_PRODUCT_EXCEED, |
| | | productService.getProduct(item.getProductId()).getName(), item.getCount()); |
| | | "产åID:" + item.getProductId(), item.getCount()); |
| | | } |
| | | purchaseOrderItemMapper.updateById(new ErpPurchaseOrderItemDO().setId(item.getId()).setInCount(inCount)); |
| | | }); |
| | |
| | | } |
| | | if (returnCount.compareTo(item.getInCount()) > 0) { |
| | | throw exception(PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED, |
| | | productService.getProduct(item.getProductId()).getName(), item.getInCount()); |
| | | "产åID:" + item.getProductId(), item.getInCount()); |
| | | } |
| | | purchaseOrderItemMapper.updateById(new ErpPurchaseOrderItemDO().setId(item.getId()).setReturnCount(returnCount)); |
| | | }); |
| | |
| | | return purchaseOrderMapper.selectByIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | public void updatePurchaseOrderInStatus(Long orderId) { |
| | | // 1. è·åéè´è®¢å |
| | | ErpPurchaseOrderDO order = validatePurchaseOrderExists(orderId); |
| | | // 2. è·åéè´è®¢åæç» |
| | | List<ErpPurchaseOrderItemDO> items = purchaseOrderItemMapper.selectListByOrderId(orderId); |
| | | if (CollUtil.isEmpty(items)) { |
| | | return; |
| | | } |
| | | // 3. 计ç®å
¥åºç¶æ |
| | | int inStatus = calculateInStatus(items); |
| | | // 4. æ´æ°éè´è®¢åå
¥åºç¶æ |
| | | purchaseOrderMapper.updateById(new ErpPurchaseOrderDO() |
| | | .setId(orderId).setInStatus(inStatus)); |
| | | // 5. åæ¥æ´æ°éè´ç³è¯·çå
¥åºç¶æï¼å¦ææå
³èçéè´ç³è¯·ï¼ |
| | | if (order.getRequestId() != null) { |
| | | purchaseRequestService.updatePurchaseRequestInStatus(order.getRequestId(), inStatus); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 计ç®å
¥åºç¶æ |
| | | * |
| | | * @param items éè´è®¢åæç»å表 |
| | | * @return å
¥åºç¶æ |
| | | */ |
| | | private int calculateInStatus(List<ErpPurchaseOrderItemDO> items) { |
| | | boolean allIn = true; |
| | | boolean anyIn = false; |
| | | |
| | | for (ErpPurchaseOrderItemDO item : items) { |
| | | BigDecimal count = item.getCount() != null ? item.getCount() : BigDecimal.ZERO; |
| | | BigDecimal inCount = item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO; |
| | | |
| | | if (inCount.compareTo(BigDecimal.ZERO) > 0) { |
| | | anyIn = true; |
| | | } |
| | | if (inCount.compareTo(count) < 0) { |
| | | allIn = false; |
| | | } |
| | | } |
| | | |
| | | if (allIn) { |
| | | return ErpPurchaseOrderInStatusEnum.ALL_IN.getStatus(); |
| | | } else if (anyIn) { |
| | | return ErpPurchaseOrderInStatusEnum.PART_IN.getStatus(); |
| | | } else { |
| | | return ErpPurchaseOrderInStatusEnum.NOT_IN.getStatus(); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | */ |
| | | List<java.util.Map<String, Object>> getPurchaseRequestApproveProcessDefinitionList(); |
| | | |
| | | /** |
| | | * æ´æ°éè´ç³è¯·çå
¥åºç¶æ |
| | | * |
| | | * @param id éè´ç³è¯·ç¼å· |
| | | * @param inStatus å
¥åºç¶æ |
| | | */ |
| | | void updatePurchaseRequestInStatus(Long id, Integer inStatus); |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderSaveReqVO; |
| | | 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.product.ErpProductDO; |
| | | 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.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.ErpPurchaseRequestStatusEnum; |
| | | import cn.iocoder.yudao.module.erp.service.product.ErpProductService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.flowable.engine.repository.ProcessDefinition; |
| | |
| | | @Resource |
| | | private ErpNoRedisDAO noRedisDAO; |
| | | |
| | | @Resource |
| | | private ErpProductService productService; |
| | | @Resource |
| | | private ErpSupplierService supplierService; |
| | | |
| | |
| | | } |
| | | |
| | | private List<ErpPurchaseRequestItemDO> validatePurchaseRequestItems(List<ErpPurchaseRequestSaveReqVO.Item> list) { |
| | | // 1. æ ¡éªäº§ååå¨ |
| | | List<ErpProductDO> productList = productService.validProductList( |
| | | convertSet(list, ErpPurchaseRequestSaveReqVO.Item::getProductId)); |
| | | Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId); |
| | | // 2. 转å为 ErpPurchaseRequestItemDO å表 |
| | | // 转å为 ErpPurchaseRequestItemDO å表ï¼äº§åéªè¯å·²ç§»é¤ï¼ä½¿ç¨ MDM ç©æï¼ |
| | | return convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseRequestItemDO.class, item -> { |
| | | item.setProductUnitId(productMap.get(item.getProductId()).getUnitId()); |
| | | if (item.getProductPrice() != null && item.getCount() != null) { |
| | | item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount())); |
| | | if (item.getTaxPercent() != null) { |
| | |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | public void updatePurchaseRequestInStatus(Long id, Integer inStatus) { |
| | | purchaseRequestMapper.updateById(new ErpPurchaseRequestDO() |
| | | .setId(id) |
| | | .setInStatus(inStatus)); |
| | | } |
| | | |
| | | } |
| | |
| | | */ |
| | | List<ErpSaleOrderItemDO> getSaleOrderItemListByOrderIds(Collection<Long> orderIds); |
| | | |
| | | /** |
| | | * æ´æ°éå®è®¢åçåºåºç¶æ |
| | | * |
| | | * æ ¹æ®æç»åºåºæ°éèªå¨è®¡ç®è®¢åç¶æï¼ |
| | | * - æææç»é½å®æåºåº â å
¨é¨åºåºç¶æ |
| | | * - é¨åæç»å®æåºåº â é¨ååºåºç¶æ |
| | | * - æ æç»åºåº â æªåºåºç¶æ |
| | | * |
| | | * @param orderId 订åç¼å· |
| | | */ |
| | | void updateSaleOrderOutStatus(Long orderId); |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.crm.api.contract.CrmContractApi; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderItemMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpSaleOrderOutStatusEnum; |
| | | import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService; |
| | | import cn.iocoder.yudao.module.erp.service.product.ErpProductService; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | 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.*; |
| | | |
| | | // TODO èè¿ï¼è®°å½æä½æ¥å¿ |
| | | |
| | | /** |
| | | * ERP éå®è®¢å Service å®ç°ç±» |
| | |
| | | @Resource |
| | | private ErpNoRedisDAO noRedisDAO; |
| | | |
| | | @Resource |
| | | private ErpProductService productService; |
| | | @Resource |
| | | private CrmCustomerApi customerApi; |
| | | @Resource |
| | |
| | | } |
| | | |
| | | private List<ErpSaleOrderItemDO> validateSaleOrderItems(List<ErpSaleOrderSaveReqVO.Item> list) { |
| | | // 1. æ ¡éªäº§ååå¨ |
| | | List<ErpProductDO> productList = productService.validProductList( |
| | | convertSet(list, ErpSaleOrderSaveReqVO.Item::getProductId)); |
| | | Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId); |
| | | // 2. 转å为 ErpSaleOrderItemDO å表 |
| | | // 转å为 ErpSaleOrderItemDO å表ï¼äº§åéªè¯å·²ç§»é¤ï¼ |
| | | return convertList(list, o -> BeanUtils.toBean(o, ErpSaleOrderItemDO.class, item -> { |
| | | item.setProductUnitId(productMap.get(item.getProductId()).getUnitId()); |
| | | item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount())); |
| | | if (item.getTotalPrice() == null) { |
| | | return; |
| | |
| | | } |
| | | if (outCount.compareTo(item.getCount()) > 0) { |
| | | throw exception(SALE_ORDER_ITEM_OUT_FAIL_PRODUCT_EXCEED, |
| | | productService.getProduct(item.getProductId()).getName(), item.getCount()); |
| | | "产åID:" + item.getProductId(), item.getCount()); |
| | | } |
| | | saleOrderItemMapper.updateById(new ErpSaleOrderItemDO().setId(item.getId()).setOutCount(outCount)); |
| | | }); |
| | |
| | | } |
| | | if (returnCount.compareTo(item.getOutCount()) > 0) { |
| | | throw exception(SALE_ORDER_ITEM_RETURN_FAIL_OUT_EXCEED, |
| | | productService.getProduct(item.getProductId()).getName(), item.getOutCount()); |
| | | "产åID:" + item.getProductId(), item.getOutCount()); |
| | | } |
| | | saleOrderItemMapper.updateById(new ErpSaleOrderItemDO().setId(item.getId()).setReturnCount(returnCount)); |
| | | }); |
| | |
| | | return saleOrderItemMapper.selectListByOrderIds(orderIds); |
| | | } |
| | | |
| | | @Override |
| | | public void updateSaleOrderOutStatus(Long orderId) { |
| | | // 1. è·åéå®è®¢å |
| | | ErpSaleOrderDO order = validateSaleOrderExists(orderId); |
| | | // 2. è·åéå®è®¢åæç» |
| | | List<ErpSaleOrderItemDO> items = saleOrderItemMapper.selectListByOrderId(orderId); |
| | | if (CollUtil.isEmpty(items)) { |
| | | return; |
| | | } |
| | | // 3. 计ç®åºåºç¶æ |
| | | int outStatus = calculateOutStatus(items); |
| | | // 4. æ´æ°éå®è®¢ååºåºç¶æ |
| | | saleOrderMapper.updateById(new ErpSaleOrderDO() |
| | | .setId(orderId).setOutStatus(outStatus)); |
| | | } |
| | | |
| | | /** |
| | | * 计ç®åºåºç¶æ |
| | | * |
| | | * @param items éå®è®¢åæç»å表 |
| | | * @return åºåºç¶æ |
| | | */ |
| | | private int calculateOutStatus(List<ErpSaleOrderItemDO> items) { |
| | | boolean allOut = true; |
| | | boolean anyOut = false; |
| | | |
| | | for (ErpSaleOrderItemDO item : items) { |
| | | BigDecimal count = item.getCount() != null ? item.getCount() : BigDecimal.ZERO; |
| | | BigDecimal outCount = item.getOutCount() != null ? item.getOutCount() : BigDecimal.ZERO; |
| | | |
| | | if (outCount.compareTo(BigDecimal.ZERO) > 0) { |
| | | anyOut = true; |
| | | } |
| | | if (outCount.compareTo(count) < 0) { |
| | | allOut = false; |
| | | } |
| | | } |
| | | |
| | | if (allOut) { |
| | | return ErpSaleOrderOutStatusEnum.ALL_OUT.getStatus(); |
| | | } else if (anyOut) { |
| | | return ErpSaleOrderOutStatusEnum.PART_OUT.getStatus(); |
| | | } else { |
| | | return ErpSaleOrderOutStatusEnum.NOT_OUT.getStatus(); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.service.approval.HrmLeaveApplicationService; |
| | | 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; |
| | |
| | | |
| | | @Resource |
| | | private HrmLeaveApplicationService leaveApplicationService; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建请åç³è¯·") |
| | |
| | | @PreAuthorize("@ss.hasPermission('hrm:leave:submit')") |
| | | public CommonResult<Boolean> submitLeaveApplication(@RequestParam("id") Long id, |
| | | @RequestParam("processDefinitionKey") String processDefinitionKey) { |
| | | // è·åå½åç¨æ·ID |
| | | AdminUserRespDTO user = adminUserApi.getUser(1L); // TODO: è·åå½åç»å½ç¨æ· |
| | | leaveApplicationService.submitLeaveApplication(id, processDefinitionKey, user.getId()); |
| | | Long userId = SecurityFrameworkUtils.getLoginUserId(); |
| | | leaveApplicationService.submitLeaveApplication(id, processDefinitionKey, userId); |
| | | return success(true); |
| | | } |
| | | |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationSaveReqVO; |
| | |
| | | @PreAuthorize("@ss.hasPermission('hrm:resignation:submit')") |
| | | public CommonResult<Boolean> submitResignationApplication(@RequestParam("id") Long id, |
| | | @RequestParam("processDefinitionKey") String processDefinitionKey) { |
| | | AdminUserRespDTO user = adminUserApi.getUser(1L); // TODO: è·åå½åç»å½ç¨æ· |
| | | resignationApplicationService.submitResignationApplication(id, processDefinitionKey, user.getId()); |
| | | Long userId = SecurityFrameworkUtils.getLoginUserId(); |
| | | resignationApplicationService.submitResignationApplication(id, processDefinitionKey, userId); |
| | | return success(true); |
| | | } |
| | | |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationSaveReqVO; |
| | |
| | | @PreAuthorize("@ss.hasPermission('hrm:transfer:submit')") |
| | | public CommonResult<Boolean> submitTransferApplication(@RequestParam("id") Long id, |
| | | @RequestParam("processDefinitionKey") String processDefinitionKey) { |
| | | AdminUserRespDTO user = adminUserApi.getUser(1L); // TODO: è·åå½åç»å½ç¨æ· |
| | | transferApplicationService.submitTransferApplication(id, processDefinitionKey, user.getId()); |
| | | Long userId = SecurityFrameworkUtils.getLoginUserId(); |
| | | transferApplicationService.submitTransferApplication(id, processDefinitionKey, userId); |
| | | return success(true); |
| | | } |
| | | |
| | |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; |
| | | 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.BpmProcessDefinitionInfoDO; |
| | |
| | | } |
| | | |
| | | private Long getCurrentUserId() { |
| | | // TODO: è·åå½åç»å½ç¨æ·ID |
| | | return 1L; |
| | | return SecurityFrameworkUtils.getLoginUserId(); |
| | | } |
| | | |
| | | private String generateUniqueNo() { |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- WMS ä»å¨ç©æµ API --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-wms-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- BPM 工使µ API --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.api.wms.dto.WmsPurchaseInboundReqDTO; |
| | | import cn.iocoder.yudao.module.mes.api.wms.dto.WmsSalesOutboundReqDTO; |
| | | import cn.iocoder.yudao.module.mes.api.wms.dto.WmsStockDetailRespDTO; |
| | | import cn.iocoder.yudao.module.mes.api.wms.dto.WmsStockQueryReqDTO; |
| | | import cn.iocoder.yudao.module.mes.api.wms.stock.WmsStockApi; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockListReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; |
| | |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; |
| | | import cn.iocoder.yudao.module.wms.api.dto.WmsPurchaseInboundReqDTO; |
| | | import cn.iocoder.yudao.module.wms.api.dto.WmsSalesOutboundReqDTO; |
| | | import cn.iocoder.yudao.module.wms.api.dto.WmsStockDetailRespDTO; |
| | | import cn.iocoder.yudao.module.wms.api.dto.WmsStockQueryReqDTO; |
| | | import cn.iocoder.yudao.module.wms.api.stock.WmsStockApi; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.api.wms.dto.WmsTransactionCreateReqDTO; |
| | | import cn.iocoder.yudao.module.mes.api.wms.transaction.WmsTransactionApi; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | | import cn.iocoder.yudao.module.wms.api.transaction.WmsTransactionApi; |
| | | import cn.iocoder.yudao.module.wms.api.transaction.WmsTransactionCreateReqDTO; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.api.wms.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * WMS éè´å
¥åºè¯·æ± DTO |
| | | */ |
| | | @Data |
| | | public class WmsPurchaseInboundReqDTO { |
| | | |
| | | /** |
| | | * ä¸å¡åæ®ID |
| | | */ |
| | | private Long bizId; |
| | | |
| | | /** |
| | | * ä¸å¡åæ®ç¼ç |
| | | */ |
| | | private String bizCode; |
| | | |
| | | /** |
| | | * ä¾åºåID |
| | | */ |
| | | private Long vendorId; |
| | | |
| | | /** |
| | | * å
¥åºæ¶é´ |
| | | */ |
| | | private LocalDateTime receiptTime; |
| | | |
| | | /** |
| | | * ç©ææç»å表 |
| | | */ |
| | | private List<Item> items; |
| | | |
| | | @Data |
| | | public static class Item { |
| | | |
| | | /** |
| | | * ä¸å¡è¡ID |
| | | */ |
| | | private Long bizLineId; |
| | | |
| | | /** |
| | | * ç©æID |
| | | */ |
| | | private Long itemId; |
| | | |
| | | /** |
| | | * ä»åºID |
| | | */ |
| | | private Long warehouseId; |
| | | |
| | | /** |
| | | * åºä½ID |
| | | */ |
| | | private Long locationId; |
| | | |
| | | /** |
| | | * åºåID |
| | | */ |
| | | private Long areaId; |
| | | |
| | | /** |
| | | * æ¹æ¬¡ID |
| | | */ |
| | | private Long batchId; |
| | | |
| | | /** |
| | | * æ¹æ¬¡ç¼ç |
| | | */ |
| | | private String batchCode; |
| | | |
| | | /** |
| | | * æ°é |
| | | */ |
| | | private BigDecimal quantity; |
| | | |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.api.wms.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * WMS éå®åºåºè¯·æ± DTO |
| | | */ |
| | | @Data |
| | | public class WmsSalesOutboundReqDTO { |
| | | |
| | | /** |
| | | * ä¸å¡åæ®ID |
| | | */ |
| | | private Long bizId; |
| | | |
| | | /** |
| | | * ä¸å¡åæ®ç¼ç |
| | | */ |
| | | private String bizCode; |
| | | |
| | | /** |
| | | * åºåºæ¶é´ |
| | | */ |
| | | private LocalDateTime outboundTime; |
| | | |
| | | /** |
| | | * ç©ææç»å表 |
| | | */ |
| | | private List<Item> items; |
| | | |
| | | @Data |
| | | public static class Item { |
| | | |
| | | /** |
| | | * ä¸å¡è¡ID |
| | | */ |
| | | private Long bizLineId; |
| | | |
| | | /** |
| | | * ç©æID |
| | | */ |
| | | private Long itemId; |
| | | |
| | | /** |
| | | * ä»åºID |
| | | */ |
| | | private Long warehouseId; |
| | | |
| | | /** |
| | | * åºä½ID |
| | | */ |
| | | private Long locationId; |
| | | |
| | | /** |
| | | * åºåID |
| | | */ |
| | | private Long areaId; |
| | | |
| | | /** |
| | | * æ¹æ¬¡ID |
| | | */ |
| | | private Long batchId; |
| | | |
| | | /** |
| | | * æ¹æ¬¡ç¼ç |
| | | */ |
| | | private String batchCode; |
| | | |
| | | /** |
| | | * æ°é |
| | | */ |
| | | private BigDecimal quantity; |
| | | |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.api.wms.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * WMS åºåæç»ååº DTO |
| | | */ |
| | | @Data |
| | | public class WmsStockDetailRespDTO { |
| | | |
| | | /** |
| | | * ä¸»é® |
| | | */ |
| | | private Long id; |
| | | |
| | | /** |
| | | * ç©æID |
| | | */ |
| | | private Long itemId; |
| | | |
| | | /** |
| | | * ç©æç¼ç |
| | | */ |
| | | private String itemCode; |
| | | |
| | | /** |
| | | * ç©æåç§° |
| | | */ |
| | | private String itemName; |
| | | |
| | | /** |
| | | * ä»åºID |
| | | */ |
| | | private Long warehouseId; |
| | | |
| | | /** |
| | | * ä»åºåç§° |
| | | */ |
| | | private String warehouseName; |
| | | |
| | | /** |
| | | * åºä½ID |
| | | */ |
| | | private Long locationId; |
| | | |
| | | /** |
| | | * åºåID |
| | | */ |
| | | private Long areaId; |
| | | |
| | | /** |
| | | * æ¹æ¬¡ID |
| | | */ |
| | | private Long batchId; |
| | | |
| | | /** |
| | | * æ¹æ¬¡ç¼ç |
| | | */ |
| | | private String batchCode; |
| | | |
| | | /** |
| | | * ä¾åºåID |
| | | */ |
| | | private Long vendorId; |
| | | |
| | | /** |
| | | * æ°é |
| | | */ |
| | | private BigDecimal quantity; |
| | | |
| | | /** |
| | | * å建æ¶é´ |
| | | */ |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.api.wms.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * WMS åºåæ¥è¯¢è¯·æ± DTO |
| | | */ |
| | | @Data |
| | | public class WmsStockQueryReqDTO { |
| | | |
| | | /** |
| | | * ç©æID |
| | | */ |
| | | private Long itemId; |
| | | |
| | | /** |
| | | * ä»åºID |
| | | */ |
| | | private Long warehouseId; |
| | | |
| | | /** |
| | | * åºä½ID |
| | | */ |
| | | private Long locationId; |
| | | |
| | | /** |
| | | * åºåID |
| | | */ |
| | | private Long areaId; |
| | | |
| | | /** |
| | | * æ¹æ¬¡ID |
| | | */ |
| | | private Long batchId; |
| | | |
| | | /** |
| | | * ä¾åºåID |
| | | */ |
| | | private Long vendorId; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.api.wms.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * WMS åºåäºå¡åå»ºè¯·æ± DTO |
| | | */ |
| | | @Data |
| | | public class WmsTransactionCreateReqDTO { |
| | | |
| | | /** |
| | | * äºå¡ç±»åï¼IN/OUTï¼ |
| | | */ |
| | | private String type; |
| | | |
| | | /** |
| | | * ä¸å¡ç±»å |
| | | */ |
| | | private String bizType; |
| | | |
| | | /** |
| | | * ä¸å¡åæ®ID |
| | | */ |
| | | private Long bizId; |
| | | |
| | | /** |
| | | * ä¸å¡åæ®ç¼ç |
| | | */ |
| | | private String bizCode; |
| | | |
| | | /** |
| | | * ä¸å¡è¡ID |
| | | */ |
| | | private Long bizLineId; |
| | | |
| | | /** |
| | | * ç©æID |
| | | */ |
| | | private Long itemId; |
| | | |
| | | /** |
| | | * ä»åºID |
| | | */ |
| | | private Long warehouseId; |
| | | |
| | | /** |
| | | * åºä½ID |
| | | */ |
| | | private Long locationId; |
| | | |
| | | /** |
| | | * åºåID |
| | | */ |
| | | private Long areaId; |
| | | |
| | | /** |
| | | * æ¹æ¬¡ID |
| | | */ |
| | | private Long batchId; |
| | | |
| | | /** |
| | | * æ¹æ¬¡ç¼ç |
| | | */ |
| | | private String batchCode; |
| | | |
| | | /** |
| | | * ä¾åºåID |
| | | */ |
| | | private Long vendorId; |
| | | |
| | | /** |
| | | * æ°éï¼æ£æ°å
¥åºï¼è´æ°åºåºï¼ |
| | | */ |
| | | private BigDecimal quantity; |
| | | |
| | | /** |
| | | * å
¥åº/åºåºæ¶é´ |
| | | */ |
| | | private java.time.LocalDateTime receiptTime; |
| | | |
| | | /** |
| | | * æ¯å¦å·²å®¡æ ¸ |
| | | */ |
| | | private Boolean checkFlag; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.api.wms.stock; |
| | | |
| | | import cn.iocoder.yudao.module.mes.api.wms.dto.WmsPurchaseInboundReqDTO; |
| | | import cn.iocoder.yudao.module.mes.api.wms.dto.WmsSalesOutboundReqDTO; |
| | | import cn.iocoder.yudao.module.mes.api.wms.dto.WmsStockDetailRespDTO; |
| | | import cn.iocoder.yudao.module.mes.api.wms.dto.WmsStockQueryReqDTO; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * WMS åºå API æ¥å£ |
| | | */ |
| | | public interface WmsStockApi { |
| | | |
| | | /** |
| | | * éè´å
¥åº |
| | | * |
| | | * @param reqDTO å
¥åºè¯·æ± |
| | | * @return äºå¡ID |
| | | */ |
| | | Long purchaseInbound(WmsPurchaseInboundReqDTO reqDTO); |
| | | |
| | | /** |
| | | * éè´éè´§åºåº |
| | | * |
| | | * @param reqDTO åºåºè¯·æ± |
| | | * @return äºå¡ID |
| | | */ |
| | | Long purchaseReturnOutbound(WmsPurchaseInboundReqDTO reqDTO); |
| | | |
| | | /** |
| | | * éå®åºåº |
| | | * |
| | | * @param reqDTO åºåºè¯·æ± |
| | | * @return äºå¡ID |
| | | */ |
| | | Long salesOutbound(WmsSalesOutboundReqDTO reqDTO); |
| | | |
| | | /** |
| | | * éå®éè´§å
¥åº |
| | | * |
| | | * @param reqDTO å
¥åºè¯·æ± |
| | | * @return äºå¡ID |
| | | */ |
| | | Long salesReturnInbound(WmsSalesOutboundReqDTO reqDTO); |
| | | |
| | | /** |
| | | * è·ååºåæ°é |
| | | * |
| | | * @param itemId ç©æID |
| | | * @param warehouseId ä»åºID |
| | | * @return åºåæ°é |
| | | */ |
| | | BigDecimal getStockQuantity(Long itemId, Long warehouseId); |
| | | |
| | | /** |
| | | * è·ååºåæç» |
| | | * |
| | | * @param reqDTO æ¥è¯¢è¯·æ± |
| | | * @return åºåæç» |
| | | */ |
| | | WmsStockDetailRespDTO getStockDetail(WmsStockQueryReqDTO reqDTO); |
| | | |
| | | /** |
| | | * è·ååºåæç»å表 |
| | | * |
| | | * @param reqDTO æ¥è¯¢è¯·æ± |
| | | * @return åºåæç»å表 |
| | | */ |
| | | List<WmsStockDetailRespDTO> getStockDetailList(WmsStockQueryReqDTO reqDTO); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.api.wms.transaction; |
| | | |
| | | import cn.iocoder.yudao.module.mes.api.wms.dto.WmsTransactionCreateReqDTO; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * WMS åºåäºå¡ API æ¥å£ |
| | | */ |
| | | public interface WmsTransactionApi { |
| | | |
| | | /** |
| | | * å建åºåäºå¡ |
| | | * |
| | | * @param reqDTO äºå¡è¯·æ± |
| | | * @return äºå¡ID |
| | | */ |
| | | Long createTransaction(WmsTransactionCreateReqDTO reqDTO); |
| | | |
| | | /** |
| | | * æ¹éå建åºåäºå¡ |
| | | * |
| | | * @param reqDTOs äºå¡è¯·æ±å表 |
| | | */ |
| | | void createTransactionBatch(List<WmsTransactionCreateReqDTO> reqDTOs); |
| | | |
| | | } |
| | |
| | | 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.dto.ErpPurchaseOrderRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | |
| | | private MesWmArrivalNoticeService arrivalNoticeService; |
| | | @Resource |
| | | private MesMdVendorService vendorService; |
| | | @Resource |
| | | private ErpPurchaseOrderApi purchaseOrderApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建å°è´§éç¥å") |
| | |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/generate-from-purchase-order") |
| | | @Operation(summary = "æ ¹æ®éè´è®¢åçæå°è´§éç¥å") |
| | | @Parameter(name = "purchaseOrderId", description = "éè´è®¢åç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:create')") |
| | | public CommonResult<Long> generateFromPurchaseOrder(@RequestParam("purchaseOrderId") Long purchaseOrderId) { |
| | | return success(arrivalNoticeService.generateArrivalNoticeFromPurchaseOrder(purchaseOrderId)); |
| | | } |
| | | |
| | | // ==================== æ¼æ¥ VO ==================== |
| | | |
| | | private List<MesWmArrivalNoticeRespVO> buildRespVOList(List<MesWmArrivalNoticeDO> list) { |
| | |
| | | // 1. è·å¾å
³èæ°æ® |
| | | Map<Long, MesMdVendorDO> vendorMap = vendorService.getVendorMap( |
| | | convertSet(list, MesWmArrivalNoticeDO::getVendorId)); |
| | | // 2. æå»ºç»æ |
| | | // 2. è·å¾éè´è®¢åä¿¡æ¯ |
| | | List<Long> purchaseOrderIds = list.stream() |
| | | .map(MesWmArrivalNoticeDO::getPurchaseOrderId) |
| | | .filter(id -> id != null) |
| | | .distinct() |
| | | .toList(); |
| | | Map<Long, ErpPurchaseOrderRespDTO> purchaseOrderMap = purchaseOrderApi.getPurchaseOrderList(purchaseOrderIds) |
| | | .getCheckedData().stream() |
| | | .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(purchaseOrderMap, vo.getPurchaseOrderId(), purchaseOrder -> |
| | | vo.setPurchaseOrderNo(purchaseOrder.getNo())); |
| | | }); |
| | | } |
| | | |
| | |
| | | @Schema(description = "éç¥ååç§°", example = "颿¿å°è´§") |
| | | private String name; |
| | | |
| | | @Schema(description = "éè´è®¢åç¼å·", example = "PO20260101") |
| | | private String purchaseOrderCode; |
| | | @Schema(description = "éè´è®¢åç¼å·", example = "1") |
| | | private Long purchaseOrderId; |
| | | |
| | | @Schema(description = "ä¾åºåç¼å·", example = "1") |
| | | private Long vendorId; |
| | |
| | | |
| | | @Schema(description = "éè´è®¢åå·", example = "PO20260101") |
| | | @ExcelProperty("éè´è®¢åå·") |
| | | private String purchaseOrderCode; |
| | | private String purchaseOrderNo; |
| | | |
| | | @Schema(description = "ä¾åºåç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long vendorId; |
| | |
| | | @Schema(description = "éè´è®¢åç¼å·", example = "1") |
| | | private Long purchaseOrderId; |
| | | |
| | | @Schema(description = "éè´è®¢åå·", example = "PO20260101") |
| | | @Schema(description = "éè´è®¢åç¼ç ", example = "PO20260101") |
| | | private String purchaseOrderCode; |
| | | |
| | | @Schema(description = "ä¾åºåç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | |
| | | @Schema(description = "è系人", example = "å¼ ä¸") |
| | | private String contactName; |
| | | |
| | | @Schema(description = "èç³»çµè¯", example = "13800138000") |
| | | @Schema(description = "è系人", example = "13800138000") |
| | | private String contactTelephone; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | |
| | | @Schema(description = "å°è´§éç¥åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long noticeId; |
| | | |
| | | @Schema(description = "éè´è®¢åè¡ç¼å·", example = "1") |
| | | private Long purchaseOrderItemId; |
| | | |
| | | @Schema(description = "ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long itemId; |
| | | |
| | |
| | | @NotNull(message = "å°è´§éç¥åç¼å·ä¸è½ä¸ºç©º") |
| | | private Long noticeId; |
| | | |
| | | @Schema(description = "éè´è®¢åè¡ç¼å·", example = "1") |
| | | private Long purchaseOrderItemId; |
| | | |
| | | @Schema(description = "ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "ç©æç¼å·ä¸è½ä¸ºç©º") |
| | | private Long itemId; |
| | |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/generate-from-arrival-notice") |
| | | @Operation(summary = "æ ¹æ®å°è´§éç¥åçæéè´å
¥åºå") |
| | | @Parameter(name = "arrivalNoticeId", description = "å°è´§éç¥åç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:create')") |
| | | public CommonResult<Long> generateFromArrivalNotice(@RequestParam("arrivalNoticeId") Long arrivalNoticeId) { |
| | | return success(itemReceiptService.generateItemReceiptFromArrivalNotice(arrivalNoticeId)); |
| | | } |
| | | |
| | | @PutMapping("/submit-approval") |
| | | @Operation(summary = "æäº¤éè´å
¥åºå审æ¹") |
| | | @Parameter(name = "id", description = "å
¥åºåç¼å·", required = true) |
| | | @Parameter(name = "processDefinitionKey", description = "æµç¨å®ä¹ Key", required = true) |
| | | @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:update')") |
| | | public CommonResult<Boolean> submitApproval(@RequestParam("id") Long id, |
| | | @RequestParam("processDefinitionKey") String processDefinitionKey) { |
| | | itemReceiptService.submitItemReceiptApproval(id, processDefinitionKey); |
| | | return success(true); |
| | | } |
| | | |
| | | // ==================== æ¼æ¥ VO ==================== |
| | | |
| | | private List<MesWmItemReceiptRespVO> buildRespVOList(List<MesWmItemReceiptDO> list) { |
| | |
| | | MapUtils.findAndThen(iqcMap, vo.getIqcId(), |
| | | iqc -> vo.setIqcCode(iqc.getCode())); |
| | | MapUtils.findAndThen(noticeMap, vo.getNoticeId(), notice -> |
| | | vo.setNoticeCode(notice.getCode()).setPurchaseOrderCode(notice.getPurchaseOrderCode())); |
| | | vo.setNoticeCode(notice.getCode())); |
| | | }); |
| | | } |
| | | |
| | |
| | | @ExcelProperty("ç¶æ") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "BPM æµç¨å®ä¾ç¼å·", example = "xxx") |
| | | private String processInstanceId; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | |
| | | @Schema(description = "å°è´§éç¥åè¡ç¼å·", example = "1") |
| | | private Long arrivalNoticeLineId; |
| | | |
| | | @Schema(description = "éè´è®¢åè¡ç¼å·", example = "1") |
| | | private Long purchaseOrderItemId; |
| | | |
| | | @Schema(description = "ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long itemId; |
| | | |
| | |
| | | @Schema(description = "å°è´§éç¥åè¡ç¼å·", example = "1") |
| | | private Long arrivalNoticeLineId; |
| | | |
| | | @Schema(description = "éè´è®¢åè¡ç¼å·", example = "1") |
| | | private Long purchaseOrderItemId; |
| | | |
| | | @Schema(description = "ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "ç©æç¼å·ä¸è½ä¸ºç©º") |
| | | private Long itemId; |
| | |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/generate-from-sale-order") |
| | | @Operation(summary = "ä»éå®è®¢åçæåè´§éç¥å") |
| | | @Parameter(name = "saleOrderId", description = "éå®è®¢åID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('mes:wm-sales-notice:create')") |
| | | public CommonResult<Long> generateFromSaleOrder(@RequestParam("saleOrderId") Long saleOrderId) { |
| | | return success(salesNoticeService.generateSalesNoticeFromSaleOrder(saleOrderId)); |
| | | } |
| | | |
| | | // ==================== æ¼æ¥ VO ==================== |
| | | |
| | | private List<MesWmSalesNoticeRespVO> buildRespVOList(List<MesWmSalesNoticeDO> list) { |
| | |
| | | @ExcelProperty("éç¥ååç§°") |
| | | private String name; |
| | | |
| | | @Schema(description = "éå®è®¢åç¼å·", example = "SO202603010001") |
| | | @ExcelProperty("éå®è®¢åç¼å·") |
| | | private String salesOrderCode; |
| | | |
| | | @Schema(description = "客æ·ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long clientId; |
| | | |
| | |
| | | @ExcelProperty("客æ·åç§°") |
| | | private String clientName; |
| | | |
| | | @Schema(description = "éå®è®¢åID", example = "1") |
| | | private Long saleOrderId; |
| | | |
| | | @Schema(description = "éå®è®¢åå·", example = "SO202603010001") |
| | | @ExcelProperty("éå®è®¢åå·") |
| | | private String saleOrderCode; |
| | | |
| | | @Schema(description = "åè´§æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @ExcelProperty("åè´§æ¥æ") |
| | | private LocalDateTime salesDate; |
| | |
| | | @NotEmpty(message = "éç¥ååç§°ä¸è½ä¸ºç©º") |
| | | private String name; |
| | | |
| | | @Schema(description = "éå®è®¢åç¼å·", example = "SO202603010001") |
| | | private String salesOrderCode; |
| | | |
| | | @Schema(description = "客æ·ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "客æ·ç¼å·ä¸è½ä¸ºç©º") |
| | | private Long clientId; |
| | | |
| | | @Schema(description = "éå®è®¢åID", example = "1") |
| | | private Long saleOrderId; |
| | | |
| | | @Schema(description = "éå®è®¢åå·", example = "SO202603010001") |
| | | private String saleOrderCode; |
| | | |
| | | @Schema(description = "åè´§æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "åè´§æ¥æä¸è½ä¸ºç©º") |
| | | private LocalDateTime salesDate; |
| | |
| | | @Schema(description = "åè´§éç¥åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long noticeId; |
| | | |
| | | @Schema(description = "éå®è®¢åæç»ID", example = "1") |
| | | private Long saleOrderItemId; |
| | | |
| | | @Schema(description = "ç©æç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long itemId; |
| | | |
| | |
| | | */ |
| | | private Long purchaseOrderId; |
| | | /** |
| | | * éè´è®¢åå· |
| | | * |
| | | * åä½èª ERP éè´è®¢åç no åæ®µ |
| | | * éè´è®¢åç¼ç ï¼åä½å段ï¼ç¨äºæ¾ç¤ºï¼ |
| | | */ |
| | | private String purchaseOrderCode; |
| | | /** |
| | |
| | | */ |
| | | private Long noticeId; |
| | | /** |
| | | * éè´è®¢åè¡ç¼å· |
| | | * |
| | | * å
³è ERP {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO#getId()} |
| | | */ |
| | | private Long purchaseOrderItemId; |
| | | /** |
| | | * ç©æç¼å· |
| | | * |
| | | * å
³è {@link MesMdItemDO#getId()} |
| | |
| | | */ |
| | | private Integer status; |
| | | /** |
| | | * BPM æµç¨å®ä¾ç¼å· |
| | | */ |
| | | private String processInstanceId; |
| | | /** |
| | | * BPM æµç¨å®ä¹ Key |
| | | */ |
| | | private String processDefinitionKey; |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | |
| | | */ |
| | | private Long itemId; |
| | | /** |
| | | * åºåç¼å· |
| | | */ |
| | | private Long materialStockId; |
| | | /** |
| | | * 䏿¶æ°é |
| | | */ |
| | | private BigDecimal quantity; |
| | |
| | | */ |
| | | private Long arrivalNoticeLineId; |
| | | /** |
| | | * éè´è®¢åè¡ç¼å· |
| | | * |
| | | * å
³è ERP {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO#getId()} |
| | | */ |
| | | private Long purchaseOrderItemId; |
| | | /** |
| | | * ç©æç¼å· |
| | | * |
| | | * å
³è {@link MesMdItemDO#getId()} |
| | |
| | | */ |
| | | private Long clientId; |
| | | /** |
| | | * éå®è®¢åID |
| | | */ |
| | | private Long saleOrderId; |
| | | /** |
| | | * éå®è®¢åå· |
| | | */ |
| | | private String salesOrderCode; |
| | |
| | | */ |
| | | private Long salesId; |
| | | /** |
| | | * éå®è®¢åæç»ID |
| | | */ |
| | | private Long saleOrderItemId; |
| | | /** |
| | | * åè´§éç¥åè¡ID |
| | | * |
| | | * å
³è {@link MesWmSalesNoticeLineDO#getId()} |
| | |
| | | */ |
| | | private Long clientId; |
| | | /** |
| | | * éå®è®¢åID |
| | | */ |
| | | private Long saleOrderId; |
| | | /** |
| | | * éå®è®¢åå· |
| | | */ |
| | | private String saleOrderCode; |
| | | /** |
| | | * åè´§æ¥æ |
| | | */ |
| | | private LocalDateTime salesDate; |
| | |
| | | */ |
| | | private Long noticeId; |
| | | /** |
| | | * éå®è®¢åæç»ID |
| | | */ |
| | | private Long saleOrderItemId; |
| | | /** |
| | | * ç©æç¼å· |
| | | * |
| | | * å
³è {@link MesMdItemDO#getId()} |
| | |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<MesWmArrivalNoticeDO>() |
| | | .likeIfPresent(MesWmArrivalNoticeDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MesWmArrivalNoticeDO::getName, reqVO.getName()) |
| | | .likeIfPresent(MesWmArrivalNoticeDO::getPurchaseOrderCode, reqVO.getPurchaseOrderCode()) |
| | | .eqIfPresent(MesWmArrivalNoticeDO::getPurchaseOrderId, reqVO.getPurchaseOrderId()) |
| | | .eqIfPresent(MesWmArrivalNoticeDO::getVendorId, reqVO.getVendorId()) |
| | | .betweenIfPresent(MesWmArrivalNoticeDO::getArrivalDate, reqVO.getArrivalDate()) |
| | | .eqIfPresent(MesWmArrivalNoticeDO::getStatus, reqVO.getStatus()) |
| | |
| | | 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_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_SALES_NOTICE_LINE_NOT_EXISTS = new ErrorCode(1_040_720_010, "åè´§éç¥åè¡ä¸åå¨"); |
| | | ErrorCode WM_SALES_NOTICE_LINE_EMPTY = new ErrorCode(1_040_720_011, "åè´§éç¥åè¡ä¸ºç©ºï¼ä¸è½æäº¤"); |
| | | 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, "éå®è®¢åæç»ä¸ºç©º"); |
| | | |
| | | // ========== MES ä»åºç®¡ç-æ¡ç é
ç½®ï¼1-040-730-000ï¼ ========== |
| | | ErrorCode WM_BARCODE_CONFIG_NOT_EXISTS = new ErrorCode(1_040_730_000, "æ¡ç é
ç½®ä¸åå¨"); |
| | |
| | | * |
| | | * å¯¹åº MesWmSalesNoticeService#submitSalesNotice æ¹æ³ |
| | | */ |
| | | APPROVED(MesOrderStatusConstants.APPROVED, "å¾
åºåº"); |
| | | // TODO @èè¿ï¼ã对é½ãææ¶æ åç»æµç¨ï¼ççåç»è¦æä¹æ¯æä¸ã |
| | | APPROVED(MesOrderStatusConstants.APPROVED, "å¾
åºåº"), |
| | | /** |
| | | * 已宿 |
| | | * |
| | | * å¯¹åº MesWmSalesNoticeService#finishSalesNotice æ¹æ³ï¼åºåºå®æåè°ç¨ï¼ |
| | | */ |
| | | FINISHED(MesOrderStatusConstants.FINISHED, "已宿"); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmSalesNoticeStatusEnum::getStatus).toArray(Integer[]::new); |
| | | |
| | |
| | | */ |
| | | MesWmArrivalNoticeLineDO validateArrivalNoticeLineExists(Long lineId, Long noticeId); |
| | | |
| | | /** |
| | | * æ ¹æ®éè´è®¢åè¡å建å°è´§éç¥åè¡ï¼å
鍿¹æ³ï¼ä¸æ ¡éªï¼ |
| | | * |
| | | * @param line å°è´§éç¥åè¡ |
| | | */ |
| | | void createArrivalNoticeLineFromPurchaseOrderItem(MesWmArrivalNoticeLineDO line); |
| | | |
| | | } |
| | |
| | | return line; |
| | | } |
| | | |
| | | @Override |
| | | public void createArrivalNoticeLineFromPurchaseOrderItem(MesWmArrivalNoticeLineDO line) { |
| | | // å
鍿¹æ³ï¼ä¸åæ ¡éªï¼ç´æ¥æå
¥ |
| | | initQualifiedQuantityIfNoIqc(line); |
| | | arrivalNoticeLineMapper.insert(line); |
| | | } |
| | | |
| | | } |
| | |
| | | */ |
| | | Long getArrivalNoticeCountByVendorId(Long vendorId); |
| | | |
| | | /** |
| | | * æ ¹æ®éè´è®¢åçæå°è´§éç¥å |
| | | * |
| | | * @param purchaseOrderId éè´è®¢åç¼å· |
| | | * @return çæçå°è´§éç¥åç¼å· |
| | | */ |
| | | Long generateArrivalNoticeFromPurchaseOrder(Long purchaseOrderId); |
| | | |
| | | } |
| | |
| | | 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.dto.ErpPurchaseOrderRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO; |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | @Resource |
| | | private ErpPurchaseOrderApi purchaseOrderApi; |
| | | |
| | | @Resource |
| | | private MesMdItemService mdItemService; |
| | | |
| | | @Override |
| | | public Long createArrivalNotice(MesWmArrivalNoticeSaveReqVO createReqVO) { |
| | | // æ ¡éªæ°æ® |
| | |
| | | validateCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | // æ ¡éªä¾åºååå¨ä¸å¯ç¨ |
| | | vendorService.validateVendorExistsAndEnable(reqVO.getVendorId()); |
| | | // æ ¡éªéè´è®¢ååå¨ï¼å¹¶èªå¨å¡«å
éè´è®¢åå· |
| | | // æ ¡éªéè´è®¢ååå¨ |
| | | if (reqVO.getPurchaseOrderId() != null) { |
| | | ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(reqVO.getPurchaseOrderId()).getCheckedData(); |
| | | if (purchaseOrder == null) { |
| | | throw exception(WM_PURCHASE_ORDER_NOT_EXISTS); |
| | | } |
| | | // èªå¨å¡«å
éè´è®¢åå· |
| | | reqVO.setPurchaseOrderCode(purchaseOrder.getNo()); |
| | | } |
| | | } |
| | | |
| | |
| | | return arrivalNoticeMapper.selectCountByVendorId(vendorId); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long generateArrivalNoticeFromPurchaseOrder(Long purchaseOrderId) { |
| | | // 1. è·åéè´è®¢å |
| | | ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(purchaseOrderId).getCheckedData(); |
| | | if (purchaseOrder == null) { |
| | | throw exception(WM_PURCHASE_ORDER_NOT_EXISTS); |
| | | } |
| | | |
| | | // 2. è·åéè´è®¢åæç» |
| | | List<ErpPurchaseOrderItemRespDTO> items = purchaseOrderApi.getPurchaseOrderItemList(purchaseOrderId).getCheckedData(); |
| | | if (CollUtil.isEmpty(items)) { |
| | | throw exception(WM_PURCHASE_ORDER_NO_ITEM); |
| | | } |
| | | |
| | | // 3. çæå°è´§éç¥åç¼ç ï¼ä½¿ç¨ç¼ç è§åæå¡ï¼ |
| | | String code = generateArrivalNoticeCode(); |
| | | |
| | | // 4. å建å°è´§éç¥å主表 |
| | | 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()); |
| | | arrivalNoticeMapper.insert(notice); |
| | | |
| | | // 5. éåæç»å建å°è´§éç¥åè¡ |
| | | 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); // é»è®¤ä¸éè¦æ£éªï¼ç¨æ·å¯ä¿®æ¹ |
| | | arrivalNoticeLineService.createArrivalNoticeLineFromPurchaseOrderItem(line); |
| | | } |
| | | |
| | | return notice.getId(); |
| | | } |
| | | |
| | | /** |
| | | * çæå°è´§éç¥åç¼ç |
| | | */ |
| | | private String generateArrivalNoticeCode() { |
| | | // TODO: 使ç¨ç¼ç è§åæå¡çæç¼ç |
| | | return "AN" + System.currentTimeMillis(); |
| | | } |
| | | |
| | | } |
| | |
| | | */ |
| | | void deleteItemReceiptLineByReceiptId(Long receiptId); |
| | | |
| | | /** |
| | | * æ ¹æ®å°è´§éç¥åè¡å建å
¥åºåè¡ï¼å
鍿¹æ³ï¼ä¸æ ¡éªï¼ |
| | | * |
| | | * @param line å
¥åºåè¡ |
| | | */ |
| | | void createItemReceiptLineFromArrivalNoticeLine(MesWmItemReceiptLineDO line); |
| | | |
| | | } |
| | |
| | | itemReceiptLineMapper.deleteByReceiptId(receiptId); |
| | | } |
| | | |
| | | @Override |
| | | public void createItemReceiptLineFromArrivalNoticeLine(MesWmItemReceiptLineDO line) { |
| | | // å
鍿¹æ³ï¼ä¸åæ ¡éªï¼ç´æ¥æå
¥ |
| | | itemReceiptLineMapper.insert(line); |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªå°è´§éç¥åè¡ |
| | | * |
| | |
| | | return convertMap(getItemReceiptList(ids), MesWmItemReceiptDO::getId); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®å°è´§éç¥åçæéè´å
¥åºå |
| | | * |
| | | * @param arrivalNoticeId å°è´§éç¥åç¼å· |
| | | * @return çæçéè´å
¥åºåç¼å· |
| | | */ |
| | | Long generateItemReceiptFromArrivalNotice(Long arrivalNoticeId); |
| | | |
| | | /** |
| | | * æäº¤éè´å
¥åºåå®¡æ¹ |
| | | * |
| | | * @param id å
¥åºåç¼å· |
| | | * @param processDefinitionKey æµç¨å®ä¹ Key |
| | | */ |
| | | void submitItemReceiptApproval(Long id, String processDefinitionKey); |
| | | |
| | | /** |
| | | * æ´æ°éè´å
¥åºå审æ¹ç¶æï¼ç± BPM Listener åè°ï¼ |
| | | * |
| | | * @param id å
¥åºåç¼å· |
| | | * @param bpmResult BPM 审æ¹ç»æ |
| | | */ |
| | | void updateItemReceiptAuditStatus(Long id, Integer bpmResult); |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | 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.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi; |
| | | import org.springframework.security.core.Authentication; |
| | | import org.springframework.security.core.context.SecurityContextHolder; |
| | | 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 lombok.extern.slf4j.Slf4j; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Collection; |
| | |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { |
| | | |
| | | @Resource |
| | |
| | | private MesQcIqcService iqcService; |
| | | @Resource |
| | | private MesWmTransactionService wmTransactionService; |
| | | |
| | | @Resource |
| | | private MesWmArrivalNoticeLineService arrivalNoticeLineService; |
| | | |
| | | @Resource |
| | | private BpmProcessInstanceApi processInstanceApi; |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderApi purchaseOrderApi; |
| | | |
| | | @Override |
| | | public Long createItemReceipt(MesWmItemReceiptSaveReqVO createReqVO) { |
| | |
| | | if (receipt.getNoticeId() != null) { |
| | | arrivalNoticeService.finishArrivalNotice(receipt.getNoticeId()); |
| | | } |
| | | |
| | | // 5. åå ERP éè´è®¢åçå
¥åºæ°é |
| | | updateErpPurchaseOrderInCount(receipt); |
| | | } |
| | | |
| | | /** |
| | | * åå ERP éè´è®¢åçå
¥åºæ°é |
| | | */ |
| | | private void updateErpPurchaseOrderInCount(MesWmItemReceiptDO receipt) { |
| | | // è·åå
¥åºåè¡ |
| | | List<MesWmItemReceiptLineDO> lines = itemReceiptLineService.getItemReceiptLineListByReceiptId(receipt.getId()); |
| | | if (CollUtil.isEmpty(lines)) { |
| | | return; |
| | | } |
| | | // ç¨äºåå¨éè´è®¢å IDï¼é¿å
é夿´æ° |
| | | Long purchaseOrderId = null; |
| | | // éåè¡ï¼æ purchaseOrderItemId æ´æ°å
¥åºæ°é |
| | | for (MesWmItemReceiptLineDO line : lines) { |
| | | if (line.getPurchaseOrderItemId() != null && line.getReceivedQuantity() != null) { |
| | | purchaseOrderApi.updateOrderItemInCount(line.getPurchaseOrderItemId(), line.getReceivedQuantity()); |
| | | // è·åéè´è®¢å IDï¼ä»ç¬¬ä¸ä¸ªææçæç»é¡¹è·åï¼ |
| | | if (purchaseOrderId == null) { |
| | | cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO itemDTO = |
| | | purchaseOrderApi.getPurchaseOrderItem(line.getPurchaseOrderItemId()).getCheckedData(); |
| | | if (itemDTO != null && itemDTO.getOrderId() != null) { |
| | | purchaseOrderId = itemDTO.getOrderId(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | // æ´æ°éè´è®¢åçå
¥åºç¶æ |
| | | if (purchaseOrderId != null) { |
| | | purchaseOrderApi.updateOrderInStatus(purchaseOrderId); |
| | | } |
| | | } |
| | | |
| | | private void createTransactionList(MesWmItemReceiptDO receipt) { |
| | |
| | | return itemReceiptMapper.selectByIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long generateItemReceiptFromArrivalNotice(Long arrivalNoticeId) { |
| | | // 1. æ ¡éªå°è´§éç¥ååå¨ä¸ç¶æä¸ºå¾
å
¥åº |
| | | MesWmArrivalNoticeDO notice = arrivalNoticeService.validateArrivalNoticeReadyForReceipt(arrivalNoticeId); |
| | | |
| | | // 2. è·åå°è´§éç¥åè¡ |
| | | List<MesWmArrivalNoticeLineDO> lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(arrivalNoticeId); |
| | | if (CollUtil.isEmpty(lines)) { |
| | | throw exception(WM_ARRIVAL_NOTICE_NO_LINE); |
| | | } |
| | | |
| | | // 3. çæå
¥åºåç¼ç |
| | | String code = generateItemReceiptCode(); |
| | | |
| | | // 4. å建å
¥åºå主表 |
| | | MesWmItemReceiptDO receipt = new MesWmItemReceiptDO(); |
| | | receipt.setCode(code); |
| | | receipt.setName(notice.getName() + "å
¥åºå"); |
| | | receipt.setNoticeId(arrivalNoticeId); |
| | | receipt.setPurchaseOrderCode(notice.getPurchaseOrderCode()); |
| | | receipt.setVendorId(notice.getVendorId()); |
| | | receipt.setStatus(MesWmItemReceiptStatusEnum.PREPARE.getStatus()); |
| | | itemReceiptMapper.insert(receipt); |
| | | |
| | | // 5. éåè¡å建å
¥åºåè¡ |
| | | for (MesWmArrivalNoticeLineDO noticeLine : lines) { |
| | | MesWmItemReceiptLineDO receiptLine = new MesWmItemReceiptLineDO(); |
| | | receiptLine.setReceiptId(receipt.getId()); |
| | | receiptLine.setArrivalNoticeLineId(noticeLine.getId()); |
| | | receiptLine.setPurchaseOrderItemId(noticeLine.getPurchaseOrderItemId()); |
| | | receiptLine.setItemId(noticeLine.getItemId()); |
| | | // 使ç¨åæ ¼æ°éï¼å¦ææ IQC åæ¯åæ ¼æ°éï¼å¦åæ¯å°è´§æ°éï¼ |
| | | receiptLine.setReceivedQuantity(noticeLine.getQualifiedQuantity() != null ? noticeLine.getQualifiedQuantity() : noticeLine.getArrivalQuantity()); |
| | | itemReceiptLineService.createItemReceiptLineFromArrivalNoticeLine(receiptLine); |
| | | } |
| | | |
| | | return receipt.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitItemReceiptApproval(Long id, String processDefinitionKey) { |
| | | // 1. æ ¡éªåå¨ + èç¨¿ç¶æ |
| | | validateItemReceiptExistsAndDraft(id); |
| | | |
| | | // 2. å建 BPM æµç¨å®ä¾ |
| | | Long userId = getCurrentUserId(); |
| | | String processInstanceId = processInstanceApi.createProcessInstance(userId, |
| | | new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(processDefinitionKey) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | |
| | | // 3. æ´æ°å
¥åºåç¶æä¸ºå®¡æ¹ä¸ |
| | | itemReceiptMapper.updateById(new MesWmItemReceiptDO() |
| | | .setId(id) |
| | | .setStatus(MesWmItemReceiptStatusEnum.APPROVING.getStatus()) |
| | | .setProcessInstanceId(processInstanceId)); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateItemReceiptAuditStatus(Long id, Integer bpmResult) { |
| | | // 1. æ ¡éªåå¨ |
| | | MesWmItemReceiptDO receipt = validateItemReceiptExists(id); |
| | | if (!MesWmItemReceiptStatusEnum.APPROVING.getStatus().equals(receipt.getStatus())) { |
| | | log.warn("[updateItemReceiptAuditStatus] å
¥åºå({}) ä¸å¤äºå®¡æ¹ä¸ç¶æ", id); |
| | | return; |
| | | } |
| | | |
| | | // 2. æ ¹æ®å®¡æ¹ç»ææ´æ°ç¶æ |
| | | Integer newStatus = convertBpmResultToReceiptStatus(bpmResult); |
| | | if (newStatus != null) { |
| | | itemReceiptMapper.updateById(new MesWmItemReceiptDO() |
| | | .setId(id).setStatus(newStatus)); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è½¬æ¢ BPM 审æ¹ç»æä¸ºå
¥åºåç¶æ |
| | | */ |
| | | private Integer convertBpmResultToReceiptStatus(Integer bpmResult) { |
| | | if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmResult)) { |
| | | return MesWmItemReceiptStatusEnum.APPROVED.getStatus(); |
| | | } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmResult)) { |
| | | return MesWmItemReceiptStatusEnum.PREPARE.getStatus(); |
| | | } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmResult)) { |
| | | return MesWmItemReceiptStatusEnum.CANCELED.getStatus(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * è·åå½åç¨æ· ID |
| | | */ |
| | | private Long getCurrentUserId() { |
| | | Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); |
| | | if (authentication != null && authentication.getPrincipal() instanceof Long) { |
| | | return (Long) authentication.getPrincipal(); |
| | | } |
| | | return 1L; // é»è®¤ç¨æ· |
| | | } |
| | | |
| | | /** |
| | | * çæå
¥åºåç¼ç |
| | | */ |
| | | private String generateItemReceiptCode() { |
| | | // TODO: 使ç¨ç¼ç è§åæå¡çæç¼ç |
| | | return "IR" + System.currentTimeMillis(); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.wm.itemreceipt.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.event.EventListener; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * éè´å
¥åºå BPM 审æ¹ç¶æçå¬å¨ |
| | | * |
| | | * çå¬ BPM æµç¨å®ä¾ç¶æåæ´äºä»¶ï¼æ´æ°éè´å
¥åºåç审æ¹ç¶æ |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class MesWmItemReceiptStatusListener { |
| | | |
| | | /** |
| | | * BPM åç±»ç¼ç ï¼éè´å
¥åºå®¡æ¹ |
| | | */ |
| | | public static final String ITEM_RECEIPT_APPROVE_CATEGORY_CODE = "item_receipt_approve"; |
| | | |
| | | @Resource |
| | | private MesWmItemReceiptService itemReceiptService; |
| | | |
| | | @Resource |
| | | private MesWmItemReceiptMapper itemReceiptMapper; |
| | | |
| | | @EventListener |
| | | public void onApplicationEvent(BpmProcessInstanceStatusEvent event) { |
| | | // 1. è§£æä¸å¡ä¸»é® |
| | | Long receiptId; |
| | | try { |
| | | receiptId = Long.parseLong(event.getBusinessKey()); |
| | | } catch (NumberFormatException e) { |
| | | log.warn("[onApplicationEvent] ä¸å¡ä¸»é®({}) 䏿¯ææçå
¥åºåç¼å·", event.getBusinessKey()); |
| | | return; |
| | | } |
| | | |
| | | // 2. æ ¡éªå
¥åºååå¨ |
| | | MesWmItemReceiptDO receipt = itemReceiptMapper.selectById(receiptId); |
| | | if (receipt == null) { |
| | | log.warn("[onApplicationEvent] å
¥åºå({}) ä¸åå¨", receiptId); |
| | | return; |
| | | } |
| | | |
| | | // 3. æ ¡éªå
¥åºåç¶æä¸ºå®¡æ¹ä¸ |
| | | if (!MesWmItemReceiptStatusEnum.APPROVING.getStatus().equals(receipt.getStatus())) { |
| | | log.warn("[onApplicationEvent] å
¥åºå({}) ä¸å¤äºå®¡æ¹ä¸ç¶æï¼å½åç¶æï¼{}", receiptId, receipt.getStatus()); |
| | | return; |
| | | } |
| | | |
| | | // 4. æ´æ°å
¥åºå审æ¹ç¶æ |
| | | itemReceiptService.updateItemReceiptAuditStatus(receiptId, event.getStatus()); |
| | | log.info("[onApplicationEvent] å
¥åºå({}) 审æ¹ç¶ææ´æ°å®æï¼BPM ç¶æï¼{}", receiptId, event.getStatus()); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.service.wm.salesnotice.MesWmSalesNoticeService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | private MesWmTransactionService wmTransactionService; |
| | | @Resource |
| | | private MesWmMaterialStockService materialStockService; |
| | | |
| | | @Resource |
| | | private ErpSaleOrderApi saleOrderApi; |
| | | |
| | | @Override |
| | | public Long createProductSales(MesWmProductSalesSaveReqVO createReqVO) { |
| | |
| | | // 3. æ´æ°åºåºåç¶æ |
| | | productSalesMapper.updateById(new MesWmProductSalesDO() |
| | | .setId(id).setStatus(MesWmProductSalesStatusEnum.FINISHED.getStatus())); |
| | | |
| | | // 4. æ´æ°å
³èçåè´§éç¥åç¶æ |
| | | if (sales.getNoticeId() != null) { |
| | | salesNoticeService.finishSalesNotice(sales.getNoticeId()); |
| | | } |
| | | |
| | | // 5. åå ERP éå®è®¢åçåºåºæ°éåç¶æ |
| | | updateErpSaleOrderOutCount(sales); |
| | | } |
| | | |
| | | /** |
| | | * åå ERP éå®è®¢åçåºåºæ°éåç¶æ |
| | | */ |
| | | private void updateErpSaleOrderOutCount(MesWmProductSalesDO sales) { |
| | | // è·ååºåºåè¡ |
| | | List<MesWmProductSalesLineDO> lines = productSalesLineService.getProductSalesLineListBySalesId(sales.getId()); |
| | | if (CollUtil.isEmpty(lines)) { |
| | | return; |
| | | } |
| | | // ç¨äºåå¨éå®è®¢å IDï¼é¿å
é夿´æ° |
| | | Long saleOrderId = null; |
| | | // éåè¡ï¼æ saleOrderItemId æ´æ°åºåºæ°é |
| | | for (MesWmProductSalesLineDO line : lines) { |
| | | if (line.getSaleOrderItemId() != null && line.getQuantity() != null) { |
| | | saleOrderApi.updateOrderItemOutCount(line.getSaleOrderItemId(), line.getQuantity()); |
| | | // è·åéå®è®¢å IDï¼ä»ç¬¬ä¸ä¸ªææçæç»é¡¹è·åï¼ |
| | | if (saleOrderId == null) { |
| | | cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO itemDTO = |
| | | saleOrderApi.getSaleOrderItem(line.getSaleOrderItemId()).getCheckedData(); |
| | | if (itemDTO != null && itemDTO.getOrderId() != null) { |
| | | saleOrderId = itemDTO.getOrderId(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | // æ´æ°éå®è®¢åçåºåºç¶æ |
| | | if (saleOrderId != null) { |
| | | saleOrderApi.updateOrderOutStatus(saleOrderId); |
| | | } |
| | | } |
| | | |
| | | private void createTransactionList(MesWmProductSalesDO sales) { |
| | |
| | | */ |
| | | MesWmSalesNoticeLineDO validateSalesNoticeLineExists(Long lineId, Long noticeId); |
| | | |
| | | /** |
| | | * å建åè´§éç¥åè¡ï¼ç´æ¥ä½¿ç¨ DOï¼ |
| | | * |
| | | * @param line è¡ DO |
| | | */ |
| | | void createSalesNoticeLine(MesWmSalesNoticeLineDO line); |
| | | |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void createSalesNoticeLine(MesWmSalesNoticeLineDO line) { |
| | | salesNoticeLineMapper.insert(line); |
| | | } |
| | | |
| | | } |
| | |
| | | return convertMap(getSalesNoticeList(ids), MesWmSalesNoticeDO::getId); |
| | | } |
| | | |
| | | /** |
| | | * ä»éå®è®¢åçæåè´§éç¥å |
| | | * |
| | | * @param saleOrderId éå®è®¢åID |
| | | * @return åè´§éç¥åID |
| | | */ |
| | | Long generateSalesNoticeFromSaleOrder(Long saleOrderId); |
| | | |
| | | /** |
| | | * 宿åè´§éç¥åï¼åºåºå®æåè°ç¨ï¼ |
| | | * |
| | | * @param id ç¼å· |
| | | */ |
| | | void finishSalesNotice(Long id); |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.salesnotice.MesWmSalesNoticeMapper; |
| | | import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; |
| | | import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; |
| | | import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | private MesWmSalesNoticeLineService salesNoticeLineService; |
| | | @Resource |
| | | private MesMdClientService clientService; |
| | | |
| | | @Resource |
| | | private ErpSaleOrderApi saleOrderApi; |
| | | @Resource |
| | | private MesMdAutoCodeRecordService autoCodeRecordService; |
| | | |
| | | @Override |
| | | public Long createSalesNotice(MesWmSalesNoticeSaveReqVO createReqVO) { |
| | |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long generateSalesNoticeFromSaleOrder(Long saleOrderId) { |
| | | // 1. è·åéå®è®¢åä¿¡æ¯ |
| | | ErpSaleOrderRespDTO saleOrder = saleOrderApi.getSaleOrder(saleOrderId).getCheckedData(); |
| | | if (saleOrder == null) { |
| | | throw exception(WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS); |
| | | } |
| | | |
| | | // 2. è·åéå®è®¢åæç» |
| | | List<ErpSaleOrderItemRespDTO> saleOrderItems = saleOrderApi.getSaleOrderItemList(saleOrderId).getCheckedData(); |
| | | if (CollUtil.isEmpty(saleOrderItems)) { |
| | | throw exception(WM_SALES_NOTICE_SALE_ORDER_ITEM_EMPTY); |
| | | } |
| | | |
| | | // 3. çæåè´§éç¥åç¼ç |
| | | String code = autoCodeRecordService.generateAutoCode("SALESNOTICE_CODE", null); |
| | | |
| | | // 4. å建åè´§éç¥å主表 |
| | | MesWmSalesNoticeDO notice = new MesWmSalesNoticeDO(); |
| | | notice.setCode(code); |
| | | notice.setName("éå®è®¢å[" + saleOrder.getNo() + "]åè´§éç¥"); |
| | | notice.setClientId(saleOrder.getCustomerId()); |
| | | notice.setSaleOrderId(saleOrderId); |
| | | notice.setSaleOrderCode(saleOrder.getNo()); |
| | | notice.setSalesDate(java.time.LocalDateTime.now()); |
| | | notice.setStatus(PREPARE.getStatus()); |
| | | salesNoticeMapper.insert(notice); |
| | | |
| | | // 5. éåæç»å建åè´§éç¥åè¡ |
| | | for (ErpSaleOrderItemRespDTO saleOrderItem : saleOrderItems) { |
| | | MesWmSalesNoticeLineDO line = new MesWmSalesNoticeLineDO(); |
| | | line.setNoticeId(notice.getId()); |
| | | line.setSaleOrderItemId(saleOrderItem.getId()); |
| | | line.setItemId(saleOrderItem.getProductId()); |
| | | line.setQuantity(saleOrderItem.getCount()); |
| | | salesNoticeLineService.createSalesNoticeLine(line); |
| | | } |
| | | |
| | | return notice.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void finishSalesNotice(Long id) { |
| | | // æ ¡éªåå¨ |
| | | MesWmSalesNoticeDO notice = validateSalesNoticeExists(id); |
| | | // æ´æ°ç¶æä¸ºå·²å®æ |
| | | salesNoticeMapper.updateById(new MesWmSalesNoticeDO() |
| | | .setId(id).setStatus(FINISHED.getStatus())); |
| | | } |
| | | |
| | | } |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- WMS ä»åºç®¡ç模å --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-wms</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- IM ç¸å
³æ¨¡å --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | server: |
| | | port: 48080 |
| | | |
| | | --- #################### æ°æ®åºç¸å
³é
ç½® #################### |
| | | spring: |
| | | autoconfigure: |
| | | # noinspection SpringBootApplicationYaml |
| | | exclude: |
| | | - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # é»è®¤ local ç¯å¢ï¼ä¸å¼å¯ Quartz çèªå¨é
ç½® |
| | | - org.springframework.ai.vectorstore.qdrant.autoconfigure.QdrantVectorStoreAutoConfiguration # ç¦ç¨ AI 模åç Qdrantï¼æå¨å建 |
| | | - org.springframework.ai.vectorstore.redis.autoconfigure.RedisVectorStoreAutoConfiguration # ç¦ç¨ AI 模åç Redisï¼æå¨å建 |
| | | - org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusVectorStoreAutoConfiguration # ç¦ç¨ AI 模åç Milvusï¼æå¨å建 |
| | | - org.dromara.trans.config.TransServiceConfig # TODO èè¿ï¼easy-trans å
¼å®¹ Spring Boot 4 åç§»é¤ï¼TransServiceConfig å¼ç¨äºå·²ç§»é¤ç RestTemplateBuilderï¼ |
| | | # TODO èè¿ï¼spring-ai-alibaba 2.0.0-M1.1 ç DashScope èªå¨é
ç½®æä¸å
¼å®¹ Spring AI 2.0.0 |
| | | - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeChatAutoConfiguration |
| | | - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeAgentAutoConfiguration |
| | | - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeImageAutoConfiguration |
| | | - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeVideoAutoConfiguration |
| | | - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeAudioSpeechAutoConfiguration |
| | | - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeAudioTranscriptionAutoConfiguration |
| | | - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeRerankAutoConfiguration |
| | | - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeEmbeddingAutoConfiguration |
| | | - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeMultimodalEmbeddingAutoConfiguration |
| | | - com.alibaba.cloud.ai.autoconfigure.dashscope.DashScopeAsyncToolCallingManagerAutoConfiguration |
| | | # æ°æ®æºé
置项 |
| | | datasource: |
| | | druid: # Druid ãçæ§ãç¸å
³çå
¨å±é
ç½® |
| | | web-stat-filter: |
| | | enabled: true |
| | | stat-view-servlet: |
| | | enabled: true |
| | | allow: # 设置ç½ååï¼ä¸å¡«åå
许ææè®¿é® |
| | | url-pattern: /druid/* |
| | | login-username: # æ§å¶å°ç®¡çç¨æ·ååå¯ç |
| | | login-password: |
| | | filter: |
| | | stat: |
| | | enabled: true |
| | | log-slow-sql: true # æ
¢ SQL è®°å½ |
| | | slow-sql-millis: 100 |
| | | merge-sql: true |
| | | wall: |
| | | config: |
| | | multi-statement-allow: true |
| | | dynamic: # 夿°æ®æºé
ç½® |
| | | druid: # Druid ãè¿æ¥æ± ãç¸å
³çå
¨å±é
ç½® |
| | | initial-size: 1 # åå§è¿æ¥æ° |
| | | min-idle: 1 # æå°è¿æ¥æ± æ°é |
| | | max-active: 20 # æå¤§è¿æ¥æ± æ°é |
| | | max-wait: 60000 # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ï¼åä½ï¼æ¯«ç§ï¼1 åéï¼ |
| | | time-between-eviction-runs-millis: 60000 # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼åä½ï¼æ¯«ç§ï¼1 åéï¼ |
| | | min-evictable-idle-time-millis: 600000 # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± 䏿å°çåçæ¶é´ï¼åä½ï¼æ¯«ç§ï¼10 åéï¼ |
| | | max-evictable-idle-time-millis: 1800000 # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± 䏿大çåçæ¶é´ï¼åä½ï¼æ¯«ç§ï¼30 åéï¼ |
| | | validation-query: SELECT 1 FROM DUAL # é
ç½®æ£æµè¿æ¥æ¯å¦ææ |
| | | test-while-idle: true |
| | | test-on-borrow: false |
| | | test-on-return: false |
| | | pool-prepared-statements: true # æ¯å¦å¼å¯ PreparedStatement ç¼å |
| | | max-pool-prepared-statement-per-connection-size: 20 # æ¯ä¸ªè¿æ¥ç¼åç PreparedStatement æ°é |
| | | primary: master |
| | | datasource: |
| | | master: |
| | | url: jdbc:mysql://172.17.0.1:11101/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X è¿æ¥çç¤ºä¾ |
| | | # url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X è¿æ¥çç¤ºä¾ |
| | | # url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL è¿æ¥çç¤ºä¾ |
| | | # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle è¿æ¥çç¤ºä¾ |
| | | # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true;useUnicode=true;characterEncoding=utf-8 # SQLServer è¿æ¥çç¤ºä¾ |
| | | # url: jdbc:dm://127.0.0.1:5236?schema=RUOYI_VUE_PRO # DM è¿æ¥çç¤ºä¾ |
| | | # url: jdbc:kingbase8://127.0.0.1:54321/test # 人大éä» KingbaseES è¿æ¥çç¤ºä¾ |
| | | # url: jdbc:postgresql://127.0.0.1:5432/postgres # OpenGauss è¿æ¥çç¤ºä¾ |
| | | # url: jdbc:postgresql://127.0.0.1:5866/ruoyi-vue-pro # çé« HighGo è¿æ¥çç¤ºä¾ |
| | | username: root |
| | | password: xd@123456.. |
| | | # username: sa # SQL Server è¿æ¥çç¤ºä¾ |
| | | # password: Yudao@2024 # SQL Server è¿æ¥çç¤ºä¾ |
| | | # username: SYSDBA # DM è¿æ¥çç¤ºä¾ |
| | | # password: SYSDBA001 # DM è¿æ¥çç¤ºä¾ |
| | | # username: root # OpenGauss è¿æ¥çç¤ºä¾ |
| | | # password: Yudao@2024 # OpenGauss è¿æ¥çç¤ºä¾ |
| | | # username: root # çé« HighGo è¿æ¥çç¤ºä¾ |
| | | # password: 123456 # çé« HighGo è¿æ¥çç¤ºä¾ |
| | | slave: # 模æä»åºï¼å¯æ ¹æ®èªå·±éè¦ä¿®æ¹ |
| | | lazy: true # å¼å¯æå è½½ï¼ä¿è¯å¯å¨é度 |
| | | url: jdbc:mysql://172.17.0.1:11101/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true |
| | | username: root |
| | | password: xd@123456 |
| | | # tdengine: # IoT æ°æ®åºï¼éè¦ IoT ç©èç½åå¼å¯å¢ï¼ï¼ |
| | | # lazy: true # å¼å¯æå è½½ï¼ä¿è¯å¯å¨é度 |
| | | # url: jdbc:TAOS-WS://127.0.0.1:6041/ruoyi_vue_pro?varcharAsString=true&enableAutoReconnect=true # åè§ï¼https://t.zsxq.com/qaX9cï¼å¼å¯ TDengine WebSocket èªå¨éè¿ |
| | | # driver-class-name: com.taosdata.jdbc.ws.WebSocketDriver |
| | | # username: root |
| | | # password: taosdata |
| | | # druid: |
| | | # validation-query: SELECT SERVER_STATUS() # TDengine æ°æ®æºçæææ§æ£æ¥ SQL |
| | | |
| | | # Redis é
ç½®ãRedisson é»è®¤çé
置足å¤ä½¿ç¨ï¼ä¸è¬ä¸éè¦è¿è¡è°ä¼ |
| | | data: |
| | | redis: |
| | | host: 172.17.0.1 # å°å |
| | | port: 11102 # ç«¯å£ |
| | | database: 0 # æ°æ®åºç´¢å¼ |
| | | # password: dev # å¯ç ï¼å»ºè®®ç产ç¯å¢å¼å¯ |
| | | |
| | | --- #################### 宿¶ä»»å¡ç¸å
³é
ç½® #################### |
| | | |
| | | # Quartz é
置项ï¼å¯¹åº QuartzProperties é
置类 |
| | | spring: |
| | | quartz: |
| | | auto-startup: true # æ¬å°å¼åç¯å¢ï¼å°½éä¸è¦å¼å¯ Job |
| | | scheduler-name: schedulerName # Scheduler ååãé»è®¤ä¸º schedulerName |
| | | job-store-type: jdbc # Job åå¨å¨ç±»åãé»è®¤ä¸º memory 表示å
åï¼å¯é jdbc ä½¿ç¨æ°æ®åºã |
| | | wait-for-jobs-to-complete-on-shutdown: true # åºç¨å
³éæ¶ï¼æ¯å¦çå¾
宿¶ä»»å¡æ§è¡å®æãé»è®¤ä¸º false ï¼å»ºè®®è®¾ç½®ä¸º true |
| | | properties: # æ·»å Quartz Scheduler éå 屿§ï¼æ´å¤å¯ä»¥ç http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html ææ¡£ |
| | | org: |
| | | quartz: |
| | | # Scheduler ç¸å
³é
ç½® |
| | | scheduler: |
| | | instanceName: schedulerName |
| | | instanceId: AUTO # èªå¨çæ instance ID |
| | | # JobStore ç¸å
³é
ç½® |
| | | jobStore: |
| | | # JobStore å®ç°ç±»ãå¯è§å客ï¼https://blog.csdn.net/weixin_42458219/article/details/122247162 |
| | | class: org.springframework.scheduling.quartz.LocalDataSourceJobStore |
| | | isClustered: true # æ¯éç¾¤æ¨¡å¼ |
| | | clusterCheckinInterval: 15000 # éç¾¤æ£æ¥é¢çï¼åä½ï¼æ¯«ç§ãé»è®¤ä¸º 15000ï¼å³ 15 ç§ |
| | | misfireThreshold: 60000 # misfire éå¼ï¼åä½ï¼æ¯«ç§ã |
| | | # çº¿ç¨æ± ç¸å
³é
ç½® |
| | | threadPool: |
| | | threadCount: 25 # çº¿ç¨æ± 大å°ãé»è®¤ä¸º 10 ã |
| | | threadPriority: 5 # 线ç¨ä¼å
级 |
| | | class: org.quartz.simpl.SimpleThreadPool # çº¿ç¨æ± ç±»å |
| | | jdbc: # ä½¿ç¨ JDBC ç JobStore çæ¶åï¼JDBC çé
ç½® |
| | | initialize-schema: NEVER # æ¯å¦èªå¨ä½¿ç¨ SQL åå§å Quartz è¡¨ç»æãè¿é设置æ never ï¼æä»¬æå¨åå»ºè¡¨ç»æã |
| | | |
| | | --- #################### æ¶æ¯éåç¸å
³ #################### |
| | | |
| | | # rocketmq é
置项ï¼å¯¹åº RocketMQProperties é
置类 |
| | | rocketmq: |
| | | name-server: 127.0.0.1:9876 # RocketMQ Namesrv |
| | | |
| | | spring: |
| | | # RabbitMQ é
置项ï¼å¯¹åº RabbitProperties é
置类 |
| | | rabbitmq: |
| | | host: 127.0.0.1 # RabbitMQ æå¡çå°å |
| | | port: 5672 # RabbitMQ æå¡çç«¯å£ |
| | | username: rabbit # RabbitMQ æå¡çè´¦å· |
| | | password: rabbit # RabbitMQ æå¡çå¯ç |
| | | # Kafka é
置项ï¼å¯¹åº KafkaProperties é
置类 |
| | | kafka: |
| | | bootstrap-servers: 127.0.0.1:9092 # æå® Kafka Broker å°åï¼å¯ä»¥è®¾ç½®å¤ä¸ªï¼ä»¥éå·åé |
| | | |
| | | --- #################### æå¡ä¿éç¸å
³é
ç½® #################### |
| | | |
| | | # Lock4j é
置项 |
| | | lock4j: |
| | | acquire-timeout: 3000 # è·ååå¸å¼éè¶
æ¶æ¶é´ï¼é»è®¤ä¸º 3000 æ¯«ç§ |
| | | expire: 30000 # åå¸å¼éçè¶
æ¶æ¶é´ï¼é»è®¤ä¸º 30000 æ¯«ç§ |
| | | |
| | | --- #################### çæ§ç¸å
³é
ç½® #################### |
| | | |
| | | # Actuator çæ§ç«¯ç¹çé
置项 |
| | | management: |
| | | endpoints: |
| | | web: |
| | | base-path: /actuator # Actuator æä¾ç API æ¥å£çæ ¹ç®å½ãé»è®¤ä¸º /actuator |
| | | exposure: |
| | | include: '*' # éè¦å¼æ¾ç端ç¹ãé»è®¤å¼åªæå¼ health å info 两个端ç¹ãéè¿è®¾ç½® * ï¼å¯ä»¥å¼æ¾ææç«¯ç¹ã |
| | | |
| | | # Spring Boot Admin é
置项 |
| | | spring: |
| | | boot: |
| | | admin: |
| | | # Spring Boot Admin Client 客æ·ç«¯çç¸å
³é
ç½® |
| | | client: |
| | | url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server å°å |
| | | instance: |
| | | service-host-type: IP # 注åå®ä¾æ¶ï¼ä¼å
ä½¿ç¨ IP [IP, HOST_NAME, CANONICAL_HOST_NAME] |
| | | username: admin |
| | | password: admin |
| | | # Spring Boot Admin Server æå¡ç«¯çç¸å
³é
ç½® |
| | | context-path: /admin # é
ç½® Spring |
| | | # å
许åµå
¥ iframe çååï¼æ¯æéé
符ï¼ï¼å®é
é¨ç½²æ¶ï¼å¯ä»¥æ¹ä¸º "'self' [ä½ çå
¬ç½åå]" |
| | | frame-ancestors: "'self' localhost localhost:48080 127.0.0.1 127.0.0.1:48080" |
| | | |
| | | # æ¥å¿æä»¶é
ç½® |
| | | logging: |
| | | file: |
| | | name: ${user.home}/logs/${spring.application.name}.log # æ¥å¿æä»¶åï¼å
¨è·¯å¾ |
| | | level: |
| | | # é
ç½®èªå·±åç MyBatis Mapper æå°æ¥å¿ |
| | | cn.iocoder.yudao.module.bpm.dal.mysql: debug |
| | | cn.iocoder.yudao.module.infra.dal.mysql: debug |
| | | cn.iocoder.yudao.module.infra.dal.mysql.logger.ApiErrorLogMapper: INFO # é
ç½® ApiErrorLogMapper çæ¥å¿çº§å«ä¸º infoï¼é¿å
å GlobalExceptionHandler éå¤æå° |
| | | cn.iocoder.yudao.module.infra.dal.mysql.job.JobLogMapper: INFO # é
ç½® JobLogMapper çæ¥å¿çº§å«ä¸º info |
| | | cn.iocoder.yudao.module.infra.dal.mysql.file.FileConfigMapper: INFO # é
ç½® FileConfigMapper çæ¥å¿çº§å«ä¸º info |
| | | cn.iocoder.yudao.module.pay.dal.mysql: debug |
| | | cn.iocoder.yudao.module.pay.dal.mysql.notify.PayNotifyTaskMapper: INFO # é
ç½® PayNotifyTaskMapper çæ¥å¿çº§å«ä¸º info |
| | | cn.iocoder.yudao.module.system.dal.mysql: debug |
| | | cn.iocoder.yudao.module.system.dal.mysql.sms.SmsChannelMapper: INFO # é
ç½® SmsChannelMapper çæ¥å¿çº§å«ä¸º info |
| | | cn.iocoder.yudao.module.tool.dal.mysql: debug |
| | | cn.iocoder.yudao.module.member.dal.mysql: debug |
| | | cn.iocoder.yudao.module.trade.dal.mysql: debug |
| | | cn.iocoder.yudao.module.promotion.dal.mysql: debug |
| | | cn.iocoder.yudao.module.statistics.dal.mysql: debug |
| | | cn.iocoder.yudao.module.crm.dal.mysql: debug |
| | | cn.iocoder.yudao.module.erp.dal.mysql: debug |
| | | cn.iocoder.yudao.module.mes.dal.mysql: debug |
| | | cn.iocoder.yudao.module.wms.dal.mysql: debug |
| | | cn.iocoder.yudao.module.iot.dal.mysql: debug |
| | | cn.iocoder.yudao.module.iot.dal.tdengine: DEBUG |
| | | cn.iocoder.yudao.module.iot.service.rule: debug |
| | | cn.iocoder.yudao.module.ai.dal.mysql: debug |
| | | cn.iocoder.yudao.module.im.dal.mysql: debug |
| | | org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO èè¿ï¼å
ç¦ç¨ï¼Spring Boot 3.X åå¨é¨åé误ç WARN æç¤º |
| | | |
| | | debug: false |
| | | |
| | | --- #################### 微信å
¬ä¼å·ãå°ç¨åºç¸å
³é
ç½® #################### |
| | | wx: |
| | | mp: # å
¬ä¼å·é
ç½®ï¼å¿
å¡«ï¼ï¼åè§ https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md ææ¡£ |
| | | # app-id: wx041349c6f39b268b # æµè¯å·ï¼çå¸å°§æä¾çï¼ |
| | | # secret: 5abee519483bc9f8cb37ce280e814bd0 |
| | | # app-id: wx5b23ba7a5589ecbb # æµè¯å·ï¼èªå·±çï¼ |
| | | # secret: 2a7b3b20c537e52e74afd395eb85f61f |
| | | app-id: wxf56b1542b9e85f8a # æµè¯å·ï¼Kongdy æä¾çï¼ |
| | | secret: 496379dcef1ba869e9234de8d598cfd3 |
| | | # åå¨é
ç½®ï¼è§£å³ AccessToken çè·¨èç¹çå
񄧮 |
| | | config-storage: |
| | | type: RedisTemplate # éç¨ RedisTemplate æä½ Redisï¼ä¼èªå¨ä» Spring ä¸è·å |
| | | key-prefix: wx # Redis Key çåç¼ |
| | | http-client-type: HttpComponents # éç¨ HttpComponentsï¼HttpClient 5ï¼è¯·æ±å¾®ä¿¡å
¬ä¼å·å¹³å° |
| | | miniapp: # å°ç¨åºé
ç½®ï¼å¿
å¡«ï¼ï¼åè§ https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md ææ¡£ |
| | | # appid: wx62056c0d5e8db250 # æµè¯å·ï¼çå¸å°§æä¾çï¼ |
| | | # secret: 333ae72f41552af1e998fe1f54e1584a |
| | | # appid: wx63c280fe3248a3e7 # wenhualiançæ¥å£æµè¯å· |
| | | # secret: 6f270509224a7ae1296bbf1c8cb97aed |
| | | appid: wxc4598c446f8a9cb3 # æµè¯å·ï¼Kongdy æä¾çï¼ |
| | | secret: 4a1a04e07f6a4a0751b39c3064a92c8b |
| | | # appid: wx66186af0759f47c9 # æµè¯å·ï¼puhui æä¾çï¼ |
| | | # secret: 3218bcbd112cbc614c7264ceb20144ac |
| | | config-storage: |
| | | type: RedisTemplate # éç¨ RedisTemplate æä½ Redisï¼ä¼èªå¨ä» Spring ä¸è·å |
| | | key-prefix: wa # Redis Key çåç¼ |
| | | http-client-type: HttpComponents # éç¨ HttpComponentsï¼HttpClient 5ï¼è¯·æ±å¾®ä¿¡å°ç¨åºå¹³å° |
| | | |
| | | --- #################### èéç¸å
³é
ç½® #################### |
| | | |
| | | # èéé
置项ï¼è®¾ç½®å½åé¡¹ç®ææèªå®ä¹çé
ç½® |
| | | yudao: |
| | | captcha: |
| | | enable: false # æ¬å°ç¯å¢ï¼ææ¶å
³éå¾çéªè¯ç ï¼æ¹ä¾¿ç»å½çæ¥å£çæµè¯ï¼ |
| | | security: |
| | | mock-enable: true |
| | | pay: |
| | | order-notify-url: https://yutou.mynatapp.cc/admin-api/pay/notify/order # æ¯ä»æ¸ éçãæ¯ä»ãåè°å°å |
| | | refund-notify-url: https://yutou.mynatapp.cc/admin-api/pay/notify/refund # æ¯ä»æ¸ éçã鿬¾ãåè°å°å |
| | | transfer-notify-url: https://yutou.mynatapp.cc/admin-api/pay/notify/transfer # æ¯ä»æ¸ éçã转账ãåè°å°å |
| | | access-log: # è®¿é®æ¥å¿çé
置项 |
| | | enable: false |
| | | demo: false # å
³éæ¼ç¤ºæ¨¡å¼ |
| | | wxa-code: |
| | | env-version: develop # å°ç¨åºçæ¬: æ£å¼ç为 "release"ï¼ä½éªç为 "trial"ï¼å¼åç为 "develop" |
| | | wxa-subscribe-message: |
| | | miniprogram-state: developer # 跳转å°ç¨åºç±»åï¼å¼åç为 âdeveloperâï¼ä½éªç为 âtrialâä¸ºï¼æ£å¼ç为 âformalâ |
| | | tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ å°å¾çå¯é¥ https://lbs.qq.com/service/staticV2/staticGuide/staticDoc |
| | | |
| | | justauth: |
| | | enabled: true |
| | | type: |
| | | DINGTALK: # éé |
| | | client-id: dingvrnreaje3yqvzhxg |
| | | client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI |
| | | ignore-check-redirect-uri: true |
| | | WECHAT_ENTERPRISE: # ä¼ä¸å¾®ä¿¡ |
| | | client-id: wwd411c69a39ad2e54 |
| | | client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw |
| | | agent-id: 1000004 |
| | | ignore-check-redirect-uri: true |
| | | # noinspection SpringBootApplicationYaml |
| | | WECHAT_MINI_PROGRAM: # 微信å°ç¨åº |
| | | client-id: ${wx.miniapp.appid} |
| | | client-secret: ${wx.miniapp.secret} |
| | | ignore-check-redirect-uri: true |
| | | ignore-check-state: true # 微信å°ç¨åºï¼ä¸ä¼ä½¿ç¨å° stateï¼æä»¥ä¸è¿è¡æ ¡éª |
| | | WECHAT_MP: # 微信å
¬ä¼å· |
| | | client-id: ${wx.mp.app-id} |
| | | client-secret: ${wx.mp.secret} |
| | | ignore-check-redirect-uri: true |
| | | ALIPAY: # æ¯ä»å®å°ç¨åº |
| | | client-id: xx |
| | | client-secret: xx |
| | | alipay-public-key: xx |
| | | ignore-check-redirect-uri: true |
| | | ignore-check-state: true |
| | | cache: |
| | | type: REDIS |
| | | prefix: 'social_auth_state:' # ç¼ååç¼ï¼ç®ååªå¯¹ Redis ç¼åçæï¼é»è®¤ JUSTAUTH::STATE:: |
| | | timeout: 24h # è¶
æ¶æ¶é¿ï¼ç®ååªå¯¹ Redis ç¼åçæï¼é»è®¤ 3 åé |