已修改36个文件
已添加15个文件
已删除1个文件
| | |
| | | .claude/worktrees/ |
| | | .claude/scheduled_tasks.json |
| | | |
| | | ###################################################################### |
| | | # AI / Personal Docsï¼ä¸ªäººå·¥ä½ææ¡£ï¼ä¸çº³å
¥çæ¬æ§å¶ï¼ |
| | | /docs/ |
| | | /TODO.md |
| | | /fix_quartz_and_issues.md |
| | | |
| | | # ç³»ç» & æ¥å¿ |
| | | .DS_Store |
| | | Thumbs.db |
| | | *.log |
| | | *.md |
| | | |
| | | graphify-out/ |
| | | .agents/ |
| | | .agents/ |
| | | # æ°æ®åºåæ´èæ¬ï¼æå¨æ§è¡ï¼ä¸å
¥åºï¼ |
| | | sql/sale_order_bpm_approval.sql |
| | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | 1. **ä¸è½½æ¨¡æ¿** -> å端è°ç¨ `GET /hrm/employee/import-template` ä¸è½½ Excel 模æ¿ï¼æ¨¡æ¿å
å«ç¤ºä¾è¡ä¾åèã |
| | | 2. **填忍¡æ¿** -> ç¨æ·ææ¨¡æ¿å¡«åå工信æ¯ï¼å
¶ä¸"é¨é¨åç§°/å²ä½åç§°/ç¨æ·è§è²"ä¸åå¡«**åç§°**ï¼ç¨æ·è§è²å¤ä¸ªç¨ä¸æéå·åéï¼ï¼ç±å端èªå¨è½¬æ¢ä¸º IDã |
| | | 2. **填忍¡æ¿** -> ç¨æ·ææ¨¡æ¿å¡«åå工信æ¯ï¼å
¶ä¸"é¨é¨åç§°/å²ä½åç§°/ç¨æ·è§è²"ä¸åå¡«**åç§°**ï¼å²ä½åç§°ãç¨æ·è§è²å¤ä¸ªç¨ä¸ææè±æéå·åéï¼ï¼ç±å端èªå¨è½¬æ¢ä¸º IDã |
| | | 3. **ä¸ä¼ 导å
¥** -> å端è°ç¨ `POST /hrm/employee/import`ï¼multipart 表åï¼file + updateSupportï¼ä¸ä¼ æä»¶ã |
| | | 4. **å±ç¤ºç»æ** -> å端è¿å导å
¥ç»æï¼å建æååå / æ´æ°æååå / 失败ååååå ï¼ï¼åç«¯éæ¡å±ç¤ºã |
| | | |
| | |
| | | |
| | | - æ§å«ï¼å¡«"ç·"/"女"ï¼åå
¸ `hrm_gender`ï¼å¼ 1/2ï¼ |
| | | - åå·¥ç¶æï¼å¡«"å¨è"/"è¯ç¨"/"离è"ï¼åå
¸ `hrm_employee_status`ï¼å¼ 1/2/3ï¼ |
| | | - å²ä½åç§°ï¼å¡«å²ä½åç§°ï¼**æ¯æå¤ä¸ª**ï¼å¤ä¸ªç¨è±æéå·ï¼`,`ï¼æä¸æéå·ï¼`ï¼`ï¼åéï¼å¦"é¨é¨ç»ç,项ç®ç»ç"ï¼ |
| | | - ç¨æ·è§è²ï¼å¡«è§è²åç§°ï¼å¤ä¸ªç¨**䏿éå·**åéï¼å¦"æ®é管çå,æ®éåå·¥"ï¼ |
| | | |
| | | ### 导å
¥åå·¥ |
| | |
| | | | æ§å« | 模æ¿å | å¿
å¡«ï¼é»è®¤ç· | |
| | | | ææºå· | 模æ¿å | å¿
å¡«ï¼å°ä½ä¸ºç³»ç»ç»å½è´¦å· | |
| | | | é¨é¨åç§° | 模æ¿å | å¿
å¡«ï¼å¡«åç§°ï¼å端转 ID | |
| | | | å²ä½åç§° | 模æ¿å | å¿
å¡«ï¼å¡«åç§°ï¼å端转 ID | |
| | | | å²ä½åç§° | 模æ¿å | å¿
å¡«ï¼å¡«åç§°ï¼æ¯æå¤ä¸ªï¼ç¨éå·åéï¼ï¼å端转 ID | |
| | | | ç¨æ·è§è² | 模æ¿å | éå¡«ï¼å¡«åç§°ï¼å¤ä¸ªç¨ä¸æéå·åé | |
| | | | å
¥èæ¥æ | 模æ¿å | å¿
å¡«ï¼æ ¼å¼ YYYY-MM-DD | |
| | | | åå·¥ç¶æ | 模æ¿å | å¿
å¡«ï¼é»è®¤å¨è | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # åå·¥å°è´¦å²ä½å¤é - å端èè°æ¹æ¡ |
| | | |
| | | ## èæ¯ |
| | | |
| | | 人åèµæº > å工管çï¼åå·¥å°è´¦ï¼ç"å²ä½"ç±åéæ¹ä¸º**å¤é**ï¼ä¸ç³»ç»"ç¨æ·ç®¡ç"çå¤å²ä½è½åä¿æä¸è´ãåå¨ä¸éç¨ JSON æ°ç»ï¼`post_ids` åï¼ï¼å"è§è²"åæ®µçæ¢ææ¨¡å¼ã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - 人åèµæº > å工管ç å表页ï¼`src/views/hrm/employee/index.vue`ï¼ |
| | | - åå·¥æ°å¢/ç¼è¾è¡¨åï¼`src/views/hrm/employee/modules/form.vue`ã`data.ts`ï¼ |
| | | - å工详æ
ï¼`src/views/hrm/employee/modules/detail.vue`ï¼ |
| | | - å工导å
¥å¼¹çªï¼å«ä¸è½½æ¨¡æ¿ãä¸ä¼ æä»¶ï¼ |
| | | - åå·¥å¯¼åº Excel |
| | | |
| | | ## API åæ´è¯´æ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | åæ´ | |
| | | |------|------|------| |
| | | | POST | `/hrm/employee/create` | 请æ±å段 `postId` â `postIds`ï¼æ°ç»ï¼ | |
| | | | PUT | `/hrm/employee/update` | 请æ±å段 `postId` â `postIds`ï¼æ°ç»ï¼ | |
| | | | GET | `/hrm/employee/get` | ååºå段 `postId/postName` â `postIds/postNames` | |
| | | | GET | `/hrm/employee/page` | ååºå段 `postId/postName` â `postIds/postNames` | |
| | | | GET | `/hrm/employee/export-excel` | "å²ä½åç§°"忝æå¤å¼ï¼éå·æ¼æ¥ï¼ | |
| | | | GET | `/hrm/employee/import-template` | "å²ä½åç§°"åç¤ºä¾æ¹ä¸ºå¤å²ä½ | |
| | | | POST | `/hrm/employee/import` | "å²ä½åç§°"忝æå¡«åå¤ä¸ªå²ä½å | |
| | | |
| | | ### 1. æ°å¢åå·¥ `POST /hrm/employee/create` |
| | | |
| | | **请æ±åæ°ï¼åæ®µåæ´ï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | postIds | List\<Long\> | æ¯ | å²ä½IDæ°ç»ï¼è³å°ä¸ä¸ªï¼å `postId` åå¼å段已移é¤ï¼ | |
| | | |
| | | ```json |
| | | { |
| | | "name": "å¼ ä¸", |
| | | "phone": "13800138000", |
| | | "deptId": 103, |
| | | "postIds": [2, 4], |
| | | "roleIds": [1], |
| | | "hireDate": "2026-08-01", |
| | | "employeeStatus": 1, |
| | | "gender": 1 |
| | | } |
| | | ``` |
| | | |
| | | ### 2. æ´æ°åå·¥ `PUT /hrm/employee/update` |
| | | |
| | | å createï¼è¯·æ±ä½ä¸ç `postIds` 为åå·¥æç»çå²ä½éåï¼å
¨éè¦çï¼éå¢éï¼ã |
| | | |
| | | ### 3. å工详æ
/ å页 `GET /hrm/employee/get`ã`GET /hrm/employee/page` |
| | | |
| | | **ååºåæ®µåæ´ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | postIds | List\<Long\> | å²ä½IDæ°ç»ï¼å `postId` 已移é¤ï¼ | |
| | | | postNames | String | å²ä½åç§°ï¼å¤ä¸ªç¨è±æéå·æ¼æ¥ï¼å¦"é¨é¨ç»ç,项ç®ç»ç"ï¼å `postName` 已移é¤ï¼ | |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "id": 6, |
| | | "name": "å¼ ä¸", |
| | | "deptName": "ç åé¨", |
| | | "postIds": [2, 4], |
| | | "postNames": "é¨é¨ç»ç,项ç®ç»ç", |
| | | "roleNames": "æ®é管çå" |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 4. å¯¼åº Excel `GET /hrm/employee/export-excel` |
| | | |
| | | - "å²ä½åç§°"åå±ç¤ºå¤ä¸ªå²ä½åï¼è±æéå·æ¼æ¥ï¼ä¸å页è¿åç `postNames` ä¸è´ï¼ã |
| | | |
| | | ### 5. 导å
¥æ¨¡æ¿ / 导å
¥ `GET /hrm/employee/import-template`ã`POST /hrm/employee/import` |
| | | |
| | | - 模æ¿"å²ä½åç§°"åç±å个å²ä½åæ¹ä¸ºæ¯æ**å¤ä¸ªå²ä½å**ï¼å¤ä¸ªç¨**è±æéå·ï¼`,`ï¼æä¸æéå·ï¼`ï¼`ï¼**åéã |
| | | - 模æ¿ç¤ºä¾è¡ï¼`é¨é¨ç»ç,项ç®ç»ç`ã |
| | | - ä»»ä¸å²ä½åä¸åå¨ï¼è¯¥è¡å¯¼å
¥å¤±è´¥ï¼åå "å²ä½ãxxãä¸åå¨"ã |
| | | - å²ä½åç§°åä¸å
许为空ï¼å²ä½å¿
å¡«ï¼ã |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | postIds | 表åï¼æ°å¢/ç¼è¾ï¼ã详æ
| 表åå²ä½æ¹ä¸ºå¤é䏿æ¡ï¼ç¼è¾åæ¾å¾éå¤ä¸ª | |
| | | | postNames | å表ã详æ
ãå¯¼åº | å±ç¤ºä¸ºéå·æ¼æ¥çå¤ä¸ªå²ä½å | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | 表åä¿å | `postIds` å¿
å¡«ï¼è³å°ä¸ä¸ªå²ä½ | |
| | | | ç¼è¾ä¿å | `postIds` å
¨éè¦ç该åå·¥å²ä½ | |
| | | | 导å
¥ | "å²ä½åç§°"åå¤ä¸ªåç§°ç¨éå·åéï¼ä»»ä¸ä¸åå¨åæ´è¡å¤±è´¥ | |
| | | | å·²ææ°æ® | åéåå·¥çåå²ä½æ°æ®å·²è¿ç§»ä¸º `postIds`ï¼èæ°æ®ä¸ä¸¢å¤± | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - **å端éåæ¥ä¿®æ¹**ï¼æ°å¢/ç¼è¾è¡¨åçå²ä½å段ä»åéæ¹ä¸ºå¤éä¸æï¼æäº¤åæ®µåä» `postId` æ¹ä¸º `postIds`ï¼å表/详æ
å±ç¤ºåæ®µä» `postName` æ¹ä¸º `postNames`ã |
| | | - **ç¼è¾åå·¥æ¶åæ¥æ´æ°**å
³èç³»ç»ç»å½ç¨æ·ï¼ç¨æ·ç®¡ç页ï¼çå²ä½/é¨é¨/æµç§°/è§è²/é®ç®±/夿³¨ï¼ä¸¤è¾¹ä¿æä¸è´ã |
| | | - å²ä½ä¸ææ°æ®ä»ä»ç³»ç»å²ä½æ¥å£è·åï¼ä¸ä¹åä¸è´ï¼ã |
| | | - å²ä½åç§°è§£æä¸ºç²¾ç¡®å¹é
ï¼ä¸æ¯ææ¨¡ç³ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # åºç¡åæ°ä¸å·¥åºç»å® + æ¥å·¥å¡«ååæ°åæ®µ - å端èè°æ¹æ¡ |
| | | |
| | | ## éæ±èæ¯ |
| | | |
| | | - åºç¡åæ°ï¼å·¥èºåæ°ï¼èåãå·¥èºè®¾è®¡ â åºç¡åæ°ãï¼åæ¬æ æ³ä¸ãå·¥åºãç´æ¥ç»å®ã |
| | | - æ¬æ¬¡å®ç°ï¼**å·¥åºä¸»æ°æ®å¯ç»å®åºç¡åæ°**ï¼ä»»å¡æ åæ°æ¨¡æ¿æ¶ï¼çæä»»å¡ä¼æå·¥åºç»å®çåæ°èªå¨åºååæ°å¿«ç
§ï¼**æ¥å·¥æ¶å¿
须填åç»å®çåæ°åæ®µ**ï¼å¿
å¡«åæ°å¼ºæ ¡éªï¼ï¼æ¥å·¥è¯¦æ
/åè¡¨åæ¾åæ°å¼ã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | 1. å·¥åºè®¾ç½®é¡µï¼`mes/process-design/process/index`ï¼ââæ°å¢ãå·¥èºåæ°ãTabï¼ç»´æ¤å·¥åºç»å®çåæ° |
| | | 2. åºç¡åæ°é¡µï¼`mes/process-design/parameter/index`ï¼ââæ°å¢ãå
³èå·¥åºãå
¥å£ï¼æ¥çè¯¥åæ°è¢«åªäºå·¥åºä½¿ç¨ |
| | | 3. ç产任å¡å建/èªå¨æäº§ââ任塿工åºç»å®åæ°çæåæ°å¿«ç
§ï¼æ æ¨¡æ¿æ¶ï¼ |
| | | 4. ç产æ¥å·¥æ°å¢/ç¼è¾ââæä»»å¡åæ°è®°å½æ¸²æåæ°å段ï¼å¿
å¡«åæ°æ ¡éª |
| | | 5. æ¥å·¥è¯¦æ
/å表ââ忾已填åçåæ°å¼ |
| | | |
| | | ## ä¸å¡æµç¨ä¸æ°æ®å¸¦å
¥ |
| | | |
| | | ``` |
| | | 1. å·¥åºè®¾ç½®é¡µ â ãå·¥èºåæ°ãTab â å¾éåºç¡åæ°ï¼è®¾ç½®æ¯å¦å¿
å¡«/æåº â ä¿åå° mes_pro_process_param |
| | | 2. æäº§/æå·¥å»ºä»»å¡ â ä»»å¡çå·¥åºè¥æªç»å®åæ°æ¨¡æ¿ï¼åä»ãå·¥åºç»å®çåæ°ãçæä»»å¡åæ°è®°å½å¿«ç
§ |
| | | ï¼åæ°æ¥æºä¼å
级ï¼å·¥åå·¥åºç»å®æ¨¡æ¿ â 路线工åºç»å®æ¨¡æ¿ â å·¥åºä¸»æ°æ®ç»å®åæ° â æ åæ°è®°å½ï¼ |
| | | 3. ç产æ¥å·¥ â æä»»å¡åæ°è®°å½æ¸²æåæ°å段ï¼åæ°å + åä½ + å¿
å¡«æå·ï¼ |
| | | 4. æäº¤æ¥å·¥ â å¿
å¡«åæ°ä¸ºç©ºåå端æç»ï¼æ¥éãå¿
å¡«åæ°ãxxxãæªå¡«åãï¼ |
| | | 5. æ¥å·¥è¯¦æ
/å表 â åæ¾æ¬æ¬¡ä»»å¡åæ°å¿«ç
§å已填åçåæ°å¼ |
| | | ``` |
| | | |
| | | ## API |
| | | |
| | | ### ä¸ãå·¥åº-å·¥èºåæ°ç»å®ï¼æ°å¢ï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | `/admin-api/mes/pro/process-param/list-by-process` | æ¥è¯¢å·¥åºç»å®çåæ°å表ï¼å¸¦åæ°è¯¦æ
/åä½ï¼ | |
| | | | POST | `/admin-api/mes/pro/process-param/update-bindings` | å
¨éè¦çä¿åå·¥åºç»å®çåæ° | |
| | | | GET | `/admin-api/mes/pro/process-param/list-by-param` | 忥æåºç¡åæ°è¢«åªäºå·¥åºç»å® | |
| | | |
| | | æéï¼è¯» `mes:pro-process:query`ï¼å `mes:pro-process:update`ï¼å¤ç¨å·¥åºæéï¼æ éæ°èåï¼ã |
| | | |
| | | **GET /list-by-process 请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | processId | Long | æ¯ | å·¥åºç¼å· | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": [ |
| | | { |
| | | "id": 9, |
| | | "processId": 10, |
| | | "processParamId": 7, |
| | | "paramCode": "CS202607150004", |
| | | "paramName": "æµè¯åæ°_æ°å¼", |
| | | "paramType": 1, |
| | | "unitMeasureId": 1, |
| | | "unitMeasureName": "å¨", |
| | | "required": true, |
| | | "sort": 1, |
| | | "remark": null |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | **POST /update-bindings 请æ±åæ°ï¼å
¨éè¦çï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | processId | Long | æ¯ | å·¥åºç¼å· | |
| | | | items | Array | å¦ | ç»å®çåæ°å表ï¼ä¼ 空æ°ç»=æ¸
空ç»å®ï¼ | |
| | | | items[].processParamId | Long | æ¯ | åºç¡åæ°ç¼å· | |
| | | | items[].required | Boolean | å¦ | æ¯å¦å¿
å¡«ï¼å¯è¦çåæ°é»è®¤å¼ï¼ | |
| | | | items[].sort | Integer | å¦ | æåº | |
| | | | items[].remark | String | å¦ | 夿³¨ | |
| | | |
| | | **GET /list-by-param 请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | paramId | Long | æ¯ | åºç¡åæ°ç¼å· | |
| | | |
| | | **ååºï¼** `data` 为工åºå表ï¼`id`ã`code`ã`name`ï¼ã |
| | | |
| | | ### äºãä»»å¡åæ°è®°å½ï¼å·²ææ¥å£ï¼è¡ä¸ºå¢å¼ºï¼ |
| | | |
| | | ä»»å¡å建/èªå¨æäº§æ¶ï¼è¥ä»»å¡æ åæ°æ¨¡æ¿ä½å·¥åºç»å®äºåæ°ï¼ä¼çæä¸æ¡ `templateName=å·¥åºç»å®åæ°`ã`templateId=null` çåæ°è®°å½ã |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | `/admin-api/mes/pro/work-order-param-record/page-by-work-order?taskId=` | æä»»å¡æ¥è¯¢åæ°è®°å½ï¼å«æç»å¿«ç
§ï¼ | |
| | | |
| | | æç»å¿«ç
§æ°å¢å段ï¼`required`ï¼æ¯å¦å¿
å¡«ï¼ã |
| | | |
| | | ### ä¸ãç产æ¥å·¥ï¼å·²ææ¥å£ï¼å¢å¼ºï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | `/admin-api/mes/pro/feedback/create` | å建æ¥å·¥ï¼æäº¤ `paramValues`ï¼ | |
| | | | PUT | `/admin-api/mes/pro/feedback/update` | ä¿®æ¹æ¥å·¥ | |
| | | | GET | `/admin-api/mes/pro/feedback/get` | æ¥å·¥è¯¦æ
ï¼ååºæ°å¢ `paramValues`ï¼ | |
| | | | GET | `/admin-api/mes/pro/feedback/page` | æ¥å·¥å页ï¼ååºæ°å¢ `paramValues`ï¼ | |
| | | |
| | | **请æ±åæ°æ°å¢ï¼å·²åå¨ï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | paramValues | Array | å¦ | æ¬æ¬¡æ¥å·¥å¡«åçåæ°å¼ï¼ä»»å¡æ åæ°è®°å½æ¶ä¸ä¼ | |
| | | | paramValues[].detailId | Long | æ¯ï¼ä¼ å
¥æ¶ï¼ | **ä»»å¡åæ°è®°å½æç»ç¼å·**ï¼ä¸æ¯æ¨¡æ¿æç»ç¼å·ï¼ | |
| | | | paramValues[].value | String | æ¡ä»¶å¿
å¡« | åæ°å¼ï¼å¿
å¡«åæ°ä¸è½ä¸ºç©ºï¼ | |
| | | |
| | | **ååºå段æ°å¢ï¼æ¥å·¥è¯¦æ
/å表ï¼ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | paramValues | Array | ä»»å¡åæ°å¿«ç
§å已填åçå¼ | |
| | | | paramValues[].detailId | Long | ä»»å¡åæ°è®°å½æç»ç¼å· | |
| | | | paramValues[].paramCode | String | åæ°ç¼ç | |
| | | | paramValues[].paramName | String | åæ°åç§° | |
| | | | paramValues[].paramType | Integer | åæ°ç±»å | |
| | | | paramValues[].unitMeasureName | String | åä½åç§° | |
| | | | paramValues[].paramValue | String | åæ°å¼ | |
| | | | paramValues[].required | Boolean | æ¯å¦å¿
å¡« | |
| | | |
| | | **ååºç¤ºä¾ï¼æ¥å·¥è¯¦æ
ï¼ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "id": 48, |
| | | "code": "FB_TEST_39", |
| | | "processId": 10, |
| | | "paramValues": [ |
| | | { "detailId": 55, "paramCode": "CS202607150004", "paramName": "æµè¯åæ°_æ°å¼", "paramType": 1, "unitMeasureName": "å¨", "paramValue": "200", "required": true }, |
| | | { "detailId": 56, "paramCode": "CS202607100003", "paramName": "æµè¯åæ°11", "paramType": 2, "unitMeasureName": "åå
", "paramValue": "200", "required": false } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## åæ®µå±ç¤ºè§å |
| | | |
| | | ### å·¥åºè®¾ç½®é¡µãå·¥èºåæ°ãTab |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | åæ°ç¼ç /åç§° | Tab è¡¨æ ¼ | å±ç¤ºå·²ç»å®åæ° | |
| | | | åæ°ç±»å | Tab è¡¨æ ¼ | åå
¸ï¼1=ææ¬ 2=æ°å¼ 3=å¸å° 4=æ¥æ | |
| | | | åä½ | Tab è¡¨æ ¼ | 计éåä½åç§° | |
| | | | æ¯å¦å¿
å¡« | Tab è¡¨æ ¼ï¼å¼å
³ï¼ | å¯è¦çåæ°é»è®¤å¼ | |
| | | | æåº | Tab è¡¨æ ¼ | æ°åæåº | |
| | | | 夿³¨ | Tab è¡¨æ ¼ | 夿³¨ | |
| | | | æä½ | Tab è¡¨æ ¼ | æ°å¢è¡ï¼éæ©åºç¡åæ°ï¼ãå é¤è¡ | |
| | | | ä¿å | Tab åºé¨ | å
¨éè¦çä¿åï¼è°ç¨ update-bindingsï¼ | |
| | | |
| | | ### åºç¡åæ°é¡µãå
³èå·¥åºã |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | å·¥åºç¼ç /åç§° | å¼¹çª/æ½å± | è¯¥åæ°è¢«ç»å®çå·¥åºå表ï¼åªè¯»ï¼ | |
| | | |
| | | ### ç产æ¥å·¥è¡¨å |
| | | |
| | | | åæ®µ | å±ç¤ºä½ç½® | 说æ | |
| | | |------|----------|------| |
| | | | åæ°åç§° | 表åè¡æ ç¾ | ä»ä»»å¡åæ°è®°å½å¿«ç
§è¯»å | |
| | | | åä½ | è¾å
¥æ¡åç¼ | å¦ â | |
| | | | å¿
å¡« | çº¢è²æå· | required=true æ¶æ è®° | |
| | | | åæ°å¼ | è¾å
¥æ¡ | æåæ°ç±»å渲æè¾å
¥æ§ä»¶ | |
| | | | å¿
å¡«æ ¡éª | æäº¤æ¶ | å¿
å¡«åæ°ä¸ºç©ºï¼å端è¿åãå¿
å¡«åæ°ãxxxãæªå¡«åã | |
| | | |
| | | ## ä¸å¡è§å说æ |
| | | |
| | | | åºæ¯ | è§å | |
| | | |------|------| |
| | | | åæ°æ¥æºä¼å
级 | å·¥åå·¥åºç»å®æ¨¡æ¿ â 路线工åºç»å®æ¨¡æ¿ â å·¥åºä¸»æ°æ®ç»å®åæ° â æ åæ°è®°å½ | |
| | | | æ åæ°è®°å½ | 任塿£å¸¸çæãæ¥å·¥ä¸è¦æ±åæ°å¼ | |
| | | | æåæ°è®°å½ | æ¥å·¥æä»»å¡åæ°æç»å¡«åï¼å¿
å¡«åæ°ï¼required=trueï¼å¿
须填å | |
| | | | å¿«ç
§æºå¶ | ä»»å¡çææ¶åºååæ°å¿«ç
§ï¼åç§°/ç±»å/åä½/å¿
å¡«ï¼ï¼åç»æ¹å·¥åºç»å®ä¸å½±ååå²ä»»å¡ | |
| | | | å
¨éè¦ç | å·¥åºç»å®ä¿å为å
¨éè¦çï¼ä¼ 空æ°ç»=æ¸
空ç»å® | |
| | | | å é¤åºç¡åæ° | èªå¨æ¸
çå
¶å·¥åºç»å®å
³ç³» | |
| | | | æ¥å·¥åæ¾ | æ¥å·¥è¯¦æ
/åè¡¨åæ¾ä»»å¡åæ°å¿«ç
§å已填å¼ï¼åå²å¼ä¸å åç»åæ´æ¹å | |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - `paramValues[].detailId` æ¯**ä»»å¡åæ°è®°å½æç»ç¼å·**ï¼ä¸æ¯æ¨¡æ¿æç»ç¼å·ï¼å端åºå
æä»»å¡åæ°è®°å½æ¥å£åæç»ï¼å以å
¶ id æäº¤ã |
| | | - 任塿 模æ¿ä½å·¥åºç»å®äºåæ°æ¶ï¼åæ°è®°å½ç `templateId=null`ã`templateName=å·¥åºç»å®åæ°`ï¼å·¥ååæ°è®°å½é¡µææ¤å±ç¤ºã |
| | | - åæ°ç±»åï¼1=ææ¬ 2=æ°å¼ 3=å¸å° 4=æ¥æï¼æ¥å·¥è¡¨åæç±»å渲æè¾å
¥æ§ä»¶ã |
| | | - æ¥å·¥æäº¤æ¶å³ä½¿ä¸å¡«åæ°ï¼paramValues 为空ï¼ï¼å端ä¹ä¼æ ¡éªå¿
å¡«åæ°ï¼ä»»å¡ç»å®äºåæ°æ¶å¿
须填åã |
| | | - å·¥åºç»å®åæ°æ¥å£ç读åæéå¤ç¨å·¥åºè®¾ç½®é¡µæéï¼`mes:pro-process:query/update`ï¼ã |
| | | - å端页é¢è·¯å¾ä¸èåï¼å·¥åºè®¾ç½® `mes/process-design/process/index`ãåºç¡åæ° `mes/process-design/parameter/index`ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================================================ |
| | | -- éæ±ï¼åºç¡åæ°(å·¥èºåæ°)å¯ä¸å·¥åºç»å®ï¼ç»å®åæ¥å·¥éå¡«ååæ°åæ®µ |
| | | -- ä¸é®æ´åèæ¬ï¼å¯ç´æ¥æå¨æ§è¡ï¼å«å¹çä¿æ¤ï¼é夿§è¡ä¸æ¥éï¼ |
| | | -- |
| | | -- 第ä¸é¨åï¼åè½è¿ç§»ï¼å·¥åº-åæ°ç»å®ï¼ |
| | | -- 第äºé¨åï¼æ´»åºæ¼ç§»ä¿®å¤ï¼ä»£ç å·²å¼ç¨ä½åºç¼ºå¤±çå/表ï¼éè¡¥é½æè½å»ºä»»å¡/æ¥å·¥ï¼ |
| | | -- ============================================================================ |
| | | |
| | | -- ============================================================================ |
| | | -- 第ä¸é¨åï¼åè½è¿ç§» |
| | | -- ============================================================================ |
| | | |
| | | -- ---------- 1.1 å·¥åº/ä»»å¡/å·¥åå·¥åº å¢å param_template_idï¼åæ°æ¨¡æ¿å
³èï¼åè½é¾è·¯åç½®ï¼ ---------- |
| | | SET @exists = (SELECT COUNT(*) FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() AND table_name = 'mes_pro_task' AND column_name = 'param_template_id'); |
| | | SET @sql = IF(@exists = 0, |
| | | 'ALTER TABLE mes_pro_task ADD COLUMN param_template_id bigint DEFAULT NULL COMMENT ''å·¥èºåæ°æ¨¡æ¿ç¼å·'' AFTER process_id', |
| | | 'SELECT 1'); |
| | | PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; |
| | | |
| | | SET @exists = (SELECT COUNT(*) FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() AND table_name = 'mes_pro_route_process' AND column_name = 'param_template_id'); |
| | | SET @sql = IF(@exists = 0, |
| | | 'ALTER TABLE mes_pro_route_process ADD COLUMN param_template_id bigint DEFAULT NULL COMMENT ''å·¥èºåæ°æ¨¡æ¿ç¼å·'' AFTER process_id', |
| | | 'SELECT 1'); |
| | | PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; |
| | | |
| | | SET @exists = (SELECT COUNT(*) FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() AND table_name = 'mes_pro_work_order_process' AND column_name = 'param_template_id'); |
| | | SET @sql = IF(@exists = 0, |
| | | 'ALTER TABLE mes_pro_work_order_process ADD COLUMN param_template_id bigint DEFAULT NULL COMMENT ''å·¥èºåæ°æ¨¡æ¿ç¼å·'' AFTER process_id', |
| | | 'SELECT 1'); |
| | | PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; |
| | | |
| | | -- ---------- 1.2 æ°å»º å·¥åº-å·¥èºåæ°ç»å®è¡¨ ---------- |
| | | CREATE TABLE IF NOT EXISTS `mes_pro_process_param` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `process_id` bigint NOT NULL COMMENT 'å·¥åºç¼å·ï¼å
³è mes_pro_processï¼', |
| | | `process_param_id` bigint NOT NULL COMMENT 'å·¥èºåæ°ç¼å·ï¼å
³è mes_pd_process_paramï¼', |
| | | `required` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å¿
å¡«', |
| | | `sort` int NULL DEFAULT NULL COMMENT 'æåº', |
| | | `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`) USING BTREE, |
| | | INDEX `idx_process_id`(`process_id` ASC) USING BTREE, |
| | | INDEX `idx_process_param_id`(`process_param_id` ASC) USING BTREE |
| | | ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'MES å·¥åº-å·¥èºåæ°ç»å®' ROW_FORMAT = DYNAMIC; |
| | | |
| | | -- ---------- 1.3 åæ°è®°å½ä¸»è¡¨æ¨¡æ¿å段å
许为空ï¼å·¥åºç»å®åæ°çææ¶æ æ¨¡æ¿ï¼ ---------- |
| | | ALTER TABLE mes_pro_work_order_param_record MODIFY COLUMN template_id bigint NULL DEFAULT NULL COMMENT 'åæ°æ¨¡æ¿ç¼å·ï¼å·¥åºç»å®åæ°çææ¶ä¸ºç©ºï¼'; |
| | | ALTER TABLE mes_pro_work_order_param_record MODIFY COLUMN template_name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模æ¿åç§°ï¼å¿«ç
§ï¼'; |
| | | |
| | | -- ---------- 1.4 åæ°è®°å½æç»å¢å required å¿«ç
§ï¼æ¥å·¥å¿
å¡«æ ¡éªç¨ï¼ ---------- |
| | | SET @exists = (SELECT COUNT(*) FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() AND table_name = 'mes_pro_work_order_param_record_detail' AND column_name = 'required'); |
| | | SET @sql = IF(@exists = 0, |
| | | 'ALTER TABLE mes_pro_work_order_param_record_detail ADD COLUMN required bit(1) NOT NULL DEFAULT b''0'' COMMENT ''æ¯å¦å¿
å¡«ï¼å¿«ç
§ï¼'' AFTER param_type', |
| | | 'SELECT 1'); |
| | | PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; |
| | | |
| | | -- ============================================================================ |
| | | -- 第äºé¨åï¼æ´»åºæ¼ç§»ä¿®å¤ï¼ä»£ç å·²å¼ç¨ä½åºç¼ºå¤±ï¼è¥ä½ çåºå·²æè¿äºå/表å¯å¿½ç¥ï¼ |
| | | -- ============================================================================ |
| | | |
| | | -- ---------- 2.1 mes_pro_work_order 缺失åï¼æ¥å·¥å®¡æ¹ BPM ç¸å
³ï¼ ---------- |
| | | SET @exists = (SELECT COUNT(*) FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() AND table_name = 'mes_pro_work_order' AND column_name = 'is_feedback_approve'); |
| | | SET @sql = IF(@exists = 0, |
| | | 'ALTER TABLE mes_pro_work_order ADD COLUMN is_feedback_approve tinyint(1) DEFAULT NULL COMMENT ''æ¯å¦å¼å¯æ¥å·¥å®¡æ¹ (1: å¼å¯, 0/NULL: å
³é)'' AFTER deleted', |
| | | 'SELECT 1'); |
| | | PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; |
| | | |
| | | SET @exists = (SELECT COUNT(*) FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() AND table_name = 'mes_pro_work_order' AND column_name = 'process_definition_key'); |
| | | SET @sql = IF(@exists = 0, |
| | | 'ALTER TABLE mes_pro_work_order ADD COLUMN process_definition_key varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT ''BPM æµç¨å®ä¹ Key'' AFTER is_feedback_approve', |
| | | 'SELECT 1'); |
| | | PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; |
| | | |
| | | SET @exists = (SELECT COUNT(*) FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() AND table_name = 'mes_pro_work_order' AND column_name = 'feedback_role'); |
| | | SET @sql = IF(@exists = 0, |
| | | 'ALTER TABLE mes_pro_work_order ADD COLUMN feedback_role varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT ''æ¥å·¥è§è² (å¤ä¸ªè§è²ä»¥éå·åé)'' AFTER process_definition_key', |
| | | 'SELECT 1'); |
| | | PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; |
| | | |
| | | -- ---------- 2.2 mes_pro_feedback 缺失åï¼æ¥å·¥ BPM ç¸å
³ï¼ ---------- |
| | | SET @exists = (SELECT COUNT(*) FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() AND table_name = 'mes_pro_feedback' AND column_name = 'process_instance_id'); |
| | | SET @sql = IF(@exists = 0, |
| | | 'ALTER TABLE mes_pro_feedback ADD COLUMN process_instance_id varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT ''BPM æµç¨å®ä¾ç¼å·'' AFTER remark', |
| | | 'SELECT 1'); |
| | | PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; |
| | | |
| | | SET @exists = (SELECT COUNT(*) FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() AND table_name = 'mes_pro_feedback' AND column_name = 'process_definition_key'); |
| | | SET @sql = IF(@exists = 0, |
| | | 'ALTER TABLE mes_pro_feedback ADD COLUMN process_definition_key varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT ''BPM æµç¨å®ä¹ Key'' AFTER process_instance_id', |
| | | 'SELECT 1'); |
| | | PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; |
| | | |
| | | -- ---------- 2.3 缺失表ï¼ä»»å¡æå®æ¥å·¥äººåãä»»å¡å工记å½ï¼æ¤åè¿ç§»æªåºç¨ï¼ ---------- |
| | | CREATE TABLE IF NOT EXISTS `mes_pro_task_assignee` ( |
| | | `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `task_id` bigint(20) NOT NULL COMMENT 'çäº§ä»»å¡ ID', |
| | | `user_id` bigint(20) NOT NULL COMMENT 'ç³»ç»ç¨æ· ID (æå®æ¥å·¥äººå)', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_task_id` (`task_id`), |
| | | KEY `idx_user_id` (`user_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='çäº§ä»»å¡æå®æ¥å·¥äººå表'; |
| | | |
| | | CREATE TABLE IF NOT EXISTS `mes_pro_task_pause_record` ( |
| | | `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `task_id` bigint(20) NOT NULL COMMENT 'ä»»å¡ç¼å·', |
| | | `work_order_id` bigint(20) DEFAULT NULL COMMENT 'å·¥åç¼å·', |
| | | `workstation_id` bigint(20) DEFAULT NULL COMMENT 'å·¥ä½ç«ç¼å·', |
| | | `reason` varchar(255) NOT NULL COMMENT 'åå·¥åå ', |
| | | `pause_time` datetime NOT NULL COMMENT 'åå·¥æ¶é´', |
| | | `pause_user_id` bigint(20) NOT NULL COMMENT 'åå·¥æä½äººID', |
| | | `resume_time` datetime DEFAULT NULL COMMENT 'å¤å·¥æ¶é´', |
| | | `resume_user_id` bigint(20) DEFAULT NULL COMMENT 'å¤å·¥æä½äººID', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`) USING BTREE, |
| | | KEY `idx_task_id` (`task_id`) USING BTREE |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='ç产任å¡å工记å½è¡¨'; |
| | | |
| | | -- ============================================================================ |
| | | -- æ§è¡å®æã坿§è¡ä»¥ä¸è¯å¥æ ¸å¯¹ï¼ |
| | | -- SHOW TABLES LIKE 'mes_pro_process_param'; |
| | | -- SHOW COLUMNS FROM mes_pro_work_order_param_record_detail LIKE 'required'; |
| | | -- ============================================================================ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- HRM å工表ï¼å²ä½å¤éæ¹é SQL |
| | | -- 1. æ·»å post_ids åæ®µï¼JSON æ ¼å¼ï¼ä¸ role_ids å卿¹å¼ä¸è´ï¼ |
| | | -- 2. è¿ç§»å·²æ post_id æ°æ®å° post_ids |
| | | -- 3. ä¿ç post_id åæ®µï¼å
¼å®¹æ§èæ¬/å¤é¨å¼ç¨ï¼å·²åºå¼ä¸ååå
¥ï¼ |
| | | -- ============================================= |
| | | |
| | | -- 1. æ·»å å²ä½IDåè¡¨åæ®µï¼JSONæ ¼å¼åå¨ï¼ |
| | | ALTER TABLE `hrm_employee` ADD COLUMN `post_ids` varchar(500) DEFAULT NULL COMMENT 'å²ä½IDå表ï¼JSONæ ¼å¼ï¼' AFTER `post_id`; |
| | | |
| | | -- 2. è¿ç§»å·²æ post_id æ°æ®å° post_ids |
| | | UPDATE `hrm_employee` SET `post_ids` = CONCAT('[', `post_id`, ']') WHERE `post_id` IS NOT NULL AND (`post_ids` IS NULL OR `post_ids` = ''); |
| | | |
| | | -- æ§è¡å®ææç¤º |
| | | SELECT 'HRM å工表å²ä½å¤éæ¹é 宿ï¼' AS result; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- HRM åå·¥å°è´¦å²ä½å¤é - æ°æ®åºåæ´æ±æ»èæ¬ |
| | | -- éç¨ï¼test / prod çéè¦æå·¥æ§è¡çç¯å¢ |
| | | -- å
å«ï¼ |
| | | -- 1. hrm_employee 表æ°å¢å²ä½IDå表(post_ids)åï¼å¹¶è¿ç§»æ§ post_id æ°æ® |
| | | -- 2. hrm_salary_structure 表æ°å¢ä¼æ¯æ¥/æ³å®è忥å çå·¥èµåçåï¼ä¿®å¤åå·¥ç¼è¾é¡µèªé
¬ç»æä¸ææ¥éï¼ |
| | | -- 注æï¼MySQL 8 ç ALTER TABLE ADD COLUMN 䏿¯æ IF NOT EXISTSï¼ |
| | | -- è¥æåå·²åå¨ï¼å¯¹åº ALTER è¯å¥ä¼æ¥"Duplicate column"ï¼å¿½ç¥è¯¥æ¡å³å¯ç»§ç»ã |
| | | -- ============================================= |
| | | |
| | | -- ---------- 1. hrm_employeeï¼æ°å¢å²ä½IDå表(JSON)ï¼å¹¶è¿ç§»æ§ post_id ---------- |
| | | ALTER TABLE `hrm_employee` ADD COLUMN `post_ids` varchar(500) DEFAULT NULL COMMENT 'å²ä½IDå表ï¼JSONæ ¼å¼ï¼' AFTER `post_id`; |
| | | UPDATE `hrm_employee` SET `post_ids` = CONCAT('[', `post_id`, ']') WHERE `post_id` IS NOT NULL AND (`post_ids` IS NULL OR `post_ids` = ''); |
| | | |
| | | -- ---------- 2. hrm_salary_structureï¼æ°å¢ä¼æ¯æ¥/æ³å®è忥å çåç ---------- |
| | | ALTER TABLE `hrm_salary_structure` ADD COLUMN `rest_day_overtime_pay_ratio` decimal(4,2) DEFAULT 2.00 COMMENT '伿¯æ¥å çå·¥èµåç' AFTER `overtime_pay_ratio`; |
| | | ALTER TABLE `hrm_salary_structure` ADD COLUMN `legal_holiday_overtime_pay_ratio` decimal(4,2) DEFAULT 3.00 COMMENT 'æ³å®è忥å çå·¥èµåç' AFTER `rest_day_overtime_pay_ratio`; |
| | | |
| | | -- ---------- 宿æç¤º ---------- |
| | | SELECT 'HRM åå·¥å°è´¦å²ä½å¤éæ°æ®åºåæ´å®æï¼' AS result; |
| | |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | |
| | |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/update-status") |
| | | @Operation(summary = "æ´æ°éå®è®¢åçç¶æ") |
| | | @PostMapping("/submit") |
| | | @Operation(summary = "æäº¤éå®è®¢å审æ¹ï¼åååå
¬ï¼") |
| | | @PreAuthorize("@ss.hasPermission('erp:sale-order:update-status')") |
| | | public CommonResult<Boolean> updateSaleOrderStatus(@RequestParam("id") Long id, |
| | | @RequestParam("status") Integer status) { |
| | | saleOrderService.updateSaleOrderStatus(id, status); |
| | | public CommonResult<Boolean> submitSaleOrder(@RequestParam("id") Long id, |
| | | @RequestParam("processDefinitionKey") String processDefinitionKey) { |
| | | Long userId = getLoginUserId(); |
| | | saleOrderService.submitSaleOrder(id, processDefinitionKey, userId); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/approve-process-list") |
| | | @Operation(summary = "è·åéå®è®¢åå®¡æ¹æµç¨å表") |
| | | @PreAuthorize("@ss.hasPermission('erp:sale-order:query')") |
| | | public CommonResult<List<Map<String, Object>>> getApproveProcessList() { |
| | | return success(saleOrderService.getSaleOrderApproveProcessDefinitionList()); |
| | | } |
| | | |
| | | @PutMapping("/cancel") |
| | |
| | | convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductUnitId)); |
| | | // 3. 转æ¢è®¢å项 |
| | | List<ErpSaleOrderRespVO.Item> itemVOList = BeanUtils.toBean(saleOrderItemList, ErpSaleOrderRespVO.Item.class, item -> { |
| | | fillItemPrice(item); |
| | | item.setStockCount(mesWmStockApi.getStockQuantity(item.getProductId())); |
| | | item.setBatchCode(batchCodeMap.get(item.getId())); |
| | | MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> |
| | |
| | | return BeanUtils.toBean(pageResult, ErpSaleOrderRespVO.class, saleOrder -> { |
| | | saleOrder.setItems(BeanUtils.toBean(saleOrderItemMap.get(saleOrder.getId()), ErpSaleOrderRespVO.Item.class, |
| | | item -> { |
| | | fillItemPrice(item); |
| | | item.setBatchCode(batchCodeMap.get(item.getId())); |
| | | MapUtils.findAndThen(itemMap, item.getProductId(), mdmItem -> |
| | | item.setProductName(mdmItem.getName()).setProductBarCode(mdmItem.getBarCode()) |
| | |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
订å项çéé¢å段 |
| | | * |
| | | * DO ä¸ totalPrice 为产åéé¢ï¼ä¸å«ç¨ï¼ï¼RespVO éè¦è¡¥å
¨ï¼ |
| | | * - totalProductPriceï¼äº§åéé¢ |
| | | * - totalPriceï¼å«ç¨éé¢ï¼äº§åéé¢ + ç¨é¢ï¼ |
| | | */ |
| | | private void fillItemPrice(ErpSaleOrderRespVO.Item item) { |
| | | BigDecimal productAmount = item.getTotalPrice() != null ? item.getTotalPrice() : BigDecimal.ZERO; |
| | | BigDecimal tax = item.getTaxPrice() != null ? item.getTaxPrice() : BigDecimal.ZERO; |
| | | item.setTotalProductPrice(productAmount); |
| | | item.setTotalPrice(productAmount.add(tax)); |
| | | } |
| | | |
| | | } |
| | |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "BPM æµç¨å®ä¾ç¼å·", example = "b00eb97d-2d1c-4cf1-9b4b-2a5bcdc9a3a7") |
| | | private String processInstanceId; |
| | | |
| | | @Schema(description = "éä»¶å表") |
| | | private List<StorageBlobRespDTO> attachmentList; |
| | | |
| | |
| | | @Schema(description = "ç¨é¢ï¼åä½ï¼å
", example = "100.00") |
| | | private BigDecimal taxPrice; |
| | | |
| | | @Schema(description = "产åéé¢ï¼åä½ï¼å
", example = "100.00") |
| | | private BigDecimal totalProductPrice; |
| | | |
| | | @Schema(description = "å«ç¨éé¢ï¼åä½ï¼å
", example = "113.00") |
| | | private BigDecimal totalPrice; |
| | | |
| | | @Schema(description = "夿³¨", example = "é便") |
| | | private String remark; |
| | | |
| | |
| | | */ |
| | | private String remark; |
| | | |
| | | // ========== åååå
¬(BPM)å®¡æ¹ ========== |
| | | |
| | | /** |
| | | * BPM æµç¨å®ä¾ç¼å· |
| | | * |
| | | * æäº¤å®¡æ¹å°åååå
¬åçæçæµç¨å®ä¾ç¼å·ï¼ç¨äºå
³è审æ¹è®°å½ |
| | | */ |
| | | private String processInstanceId; |
| | | |
| | | // ========== éå®åºåº ========== |
| | | |
| | | /** |
| | |
| | | @Getter |
| | | public enum ErpAuditStatus implements ArrayValuable<Integer> { |
| | | |
| | | PROCESS(10, "æªå®¡æ ¸"), // æªå®¡æ ¸/è稿 |
| | | DRAFT(0, "æªæäº¤"), // æªæäº¤/è稿ï¼å建ååå§ç¶æï¼æäº¤åè¿å
¥å®¡æ¹ |
| | | PROCESS(10, "æªå®¡æ ¸"), // æªå®¡æ ¸/è稿ï¼åå²ç¶æï¼æ°æ°æ®ä¸å使ç¨ï¼ |
| | | APPROVING(15, "审æ¹ä¸"), // 审æ¹ä¸ |
| | | APPROVE(20, "å·²å®¡æ ¸"), // å®¡æ ¸éè¿ |
| | | CANCEL(30, "å·²ä½åº"), // å·²ä½åº/å·²æ¤é |
| | |
| | | ErrorCode SALE_ORDER_CANCEL_FAIL = new ErrorCode(1_020_201_014, "ä½åºå¤±è´¥ï¼è¯·å·æ°é¡µé¢åéè¯"); |
| | | ErrorCode SALE_ORDER_ENABLE_FAIL_NOT_CANCEL = new ErrorCode(1_020_201_015, "å¯ç¨å¤±è´¥ï¼éå®è®¢å({})æªä½åºï¼åªæå·²ä½åºç订åæè½éæ°å¯ç¨"); |
| | | ErrorCode SALE_ORDER_ENABLE_FAIL = new ErrorCode(1_020_201_016, "å¯ç¨å¤±è´¥ï¼è¯·å·æ°é¡µé¢åéè¯"); |
| | | ErrorCode SALE_ORDER_SUBMIT_FAIL_STATUS = new ErrorCode(1_020_201_017, "æäº¤å®¡æ¹å¤±è´¥ï¼éå®è®¢å({})åªææªæäº¤æå·²é©³åç¶ææè½æäº¤"); |
| | | ErrorCode SALE_ORDER_SUBMIT_FAIL_ITEM_EMPTY = new ErrorCode(1_020_201_018, "æäº¤å®¡æ¹å¤±è´¥ï¼éå®è®¢å({})没æè®¢åæç»ï¼æ æ³æäº¤"); |
| | | ErrorCode SALE_ORDER_BPM_CATEGORY_NOT_EXISTS = new ErrorCode(1_020_201_019, "éå®è®¢åå®¡æ ¸åç±»ä¸åå¨ï¼è¯·å
å¨BPM模åå建éå®è®¢åå®¡æ ¸æµç¨åç±»"); |
| | | ErrorCode SALE_ORDER_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_020_201_020, "éå®è®¢åå®¡æ ¸åç±»ä¸æ²¡æå¯ç¨çæµç¨æ¨¡åï¼è¯·å
å建并å叿µç¨"); |
| | | |
| | | // ========== ERP éå®åºåºï¼1-030-202-000ï¼ ========== |
| | | ErrorCode SALE_OUT_NOT_EXISTS = new ErrorCode(1_020_202_000, "éå®åºåºåä¸åå¨"); |
| | |
| | | void updateSaleOrder(@Valid ErpSaleOrderSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * æ´æ°éå®è®¢åçç¶æ |
| | | * æäº¤éå®è®¢å审æ¹ï¼åååå
¬ BPMï¼ |
| | | * |
| | | * æªæäº¤æå·²é©³åçéå®è®¢åå¯æäº¤ï¼æäº¤åè¿å
¥åååå
¬å®¡æ¹æµç¨ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param status ç¶æ |
| | | * @param processDefinitionKey æµç¨å®ä¹çæ è¯ |
| | | * @param userId æäº¤äººç¼å· |
| | | */ |
| | | void updateSaleOrderStatus(Long id, Integer status); |
| | | void submitSaleOrder(Long id, String processDefinitionKey, Long userId); |
| | | |
| | | /** |
| | | * æ´æ°éå®è®¢åç审æ¹ç¶æï¼åååå
¬å®¡æ¹ç»æåè°ï¼ |
| | | * |
| | | * @param id ç¼å· |
| | | * @param bpmResult BPM 审æ¹ç»æï¼éè¿/驳å/åæ¶ï¼ |
| | | */ |
| | | void updateSaleOrderAuditStatus(Long id, Integer bpmResult); |
| | | |
| | | /** |
| | | * è·å¾éå®è®¢åå®¡æ¹æµç¨å®ä¹å表 |
| | | * |
| | | * @return æµç¨å®ä¹å表ï¼id/key/nameï¼ |
| | | */ |
| | | List<Map<String, Object>> getSaleOrderApproveProcessDefinitionList(); |
| | | |
| | | /** |
| | | * ä½åºéå®è®¢å |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO; |
| | | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; |
| | | import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | 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.system.api.storage.StorageAttachmentApi; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | | import org.flowable.engine.repository.ProcessDefinition; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.ArrayList; |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | |
| | | * MPS ç¶æï¼å·²åæ¶ï¼å¯¹åº MES 模å MesProMpsStatusEnum.CANCELED çå¼ 3ï¼ |
| | | */ |
| | | private static final Integer MPS_STATUS_CANCELED = 3; |
| | | |
| | | /** |
| | | * BPM éå®è®¢å审æ¹åç±»ç¼ç |
| | | */ |
| | | private static final String SALE_ORDER_APPROVE_CATEGORY_CODE = "sale_order_approve"; |
| | | /** |
| | | * BPM éå®è®¢åå®¡æ¹æµç¨å®ä¹ Keyï¼æäº¤åè¿å
¥åååå
¬å®¡æ¹ï¼ |
| | | */ |
| | | private static final String SALE_ORDER_APPROVE_PROCESS_DEFINITION_KEY = "sale_order_approve"; |
| | | |
| | | @Resource |
| | | private ErpSaleOrderMapper saleOrderMapper; |
| | |
| | | @Resource |
| | | private StorageAttachmentApi storageAttachmentApi; |
| | | |
| | | @Resource |
| | | private BpmProcessInstanceApi processInstanceApi; |
| | | @Resource |
| | | private BpmCategoryService bpmCategoryService; |
| | | @Resource |
| | | private BpmProcessDefinitionService bpmProcessDefinitionService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createSaleOrder(ErpSaleOrderSaveReqVO createReqVO) { |
| | |
| | | throw exception(SALE_ORDER_NO_EXISTS); |
| | | } |
| | | |
| | | // 2.1 æå
¥è®¢å |
| | | // 2.1 æå
¥è®¢åï¼å建åä¸ºæªæäº¤ç¶æï¼éæå¨æäº¤å®¡æ¹å°åååå
¬ï¼ |
| | | ErpSaleOrderDO saleOrder = BeanUtils.toBean(createReqVO, ErpSaleOrderDO.class, in -> in |
| | | .setNo(no).setStatus(ErpAuditStatus.PROCESS.getStatus()) |
| | | .setNo(no).setStatus(ErpAuditStatus.DRAFT.getStatus()) |
| | | .setDepositPrice(ObjectUtil.defaultIfNull(createReqVO.getDepositPrice(), BigDecimal.ZERO)) |
| | | .setOutCount(BigDecimal.ZERO).setOutStatus(ErpSaleOrderOutStatusEnum.NOT_OUT.getStatus())); |
| | | calculateTotalPrice(saleOrder, saleOrderItems); |
| | |
| | | public void updateSaleOrder(ErpSaleOrderSaveReqVO updateReqVO) { |
| | | // 1.1 æ ¡éªåå¨ |
| | | ErpSaleOrderDO saleOrder = validateSaleOrderExists(updateReqVO.getId()); |
| | | if (ErpAuditStatus.APPROVE.getStatus().equals(saleOrder.getStatus())) { |
| | | // 1.2 æ ¡éªç¶æï¼åªææªæäº¤æå·²é©³åçéå®è®¢åæè½ä¿®æ¹ |
| | | if (!ErpAuditStatus.DRAFT.getStatus().equals(saleOrder.getStatus()) |
| | | && !ErpAuditStatus.REJECT.getStatus().equals(saleOrder.getStatus())) { |
| | | throw exception(SALE_ORDER_UPDATE_FAIL_APPROVE, saleOrder.getNo()); |
| | | } |
| | | // 1.2 æ ¡éªå®¢æ·ï¼ä½¿ç¨ CRM å®¢æ· APIï¼ |
| | | // 1.3 æ ¡éªå®¢æ·ï¼ä½¿ç¨ CRM å®¢æ· APIï¼ |
| | | customerApi.validateCustomer(updateReqVO.getCustomerId()); |
| | | // 1.3 æ ¡éªç»ç®è´¦æ· |
| | | if (updateReqVO.getAccountId() != null) { |
| | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateSaleOrderStatus(Long id, Integer status) { |
| | | boolean approve = ErpAuditStatus.APPROVE.getStatus().equals(status); |
| | | // 1.1 æ ¡éªåå¨ |
| | | public void submitSaleOrder(Long id, String processDefinitionKey, Long userId) { |
| | | // 1. æ ¡éªåå¨ |
| | | ErpSaleOrderDO saleOrder = validateSaleOrderExists(id); |
| | | // 1.2 æ ¡éªç¶æ |
| | | if (saleOrder.getStatus().equals(status)) { |
| | | throw exception(approve ? SALE_ORDER_APPROVE_FAIL : SALE_ORDER_PROCESS_FAIL); |
| | | // 2. æ ¡éªç¶æï¼åªææªæäº¤æå·²é©³åçéå®è®¢åæè½æäº¤ |
| | | if (!ErpAuditStatus.DRAFT.getStatus().equals(saleOrder.getStatus()) |
| | | && !ErpAuditStatus.REJECT.getStatus().equals(saleOrder.getStatus())) { |
| | | throw exception(SALE_ORDER_SUBMIT_FAIL_STATUS, saleOrder.getNo()); |
| | | } |
| | | // 1.3 åå¨éå®åºåºåï¼æ æ³åå®¡æ ¸ |
| | | BigDecimal outCount = saleOrder.getOutCount() != null ? saleOrder.getOutCount() : BigDecimal.ZERO; |
| | | if (!approve && outCount.compareTo(BigDecimal.ZERO) > 0) { |
| | | throw exception(SALE_ORDER_PROCESS_FAIL_EXISTS_OUT); |
| | | // 3. æ ¡éªè®¢å项ä¸è½ä¸ºç©º |
| | | List<ErpSaleOrderItemDO> items = saleOrderItemMapper.selectListByOrderId(id); |
| | | if (CollUtil.isEmpty(items)) { |
| | | throw exception(SALE_ORDER_SUBMIT_FAIL_ITEM_EMPTY, saleOrder.getNo()); |
| | | } |
| | | |
| | | // 2. æ´æ°ç¶æ |
| | | int updateCount = saleOrderMapper.updateByIdAndStatus(id, saleOrder.getStatus(), |
| | | new ErpSaleOrderDO().setStatus(status)); |
| | | if (updateCount == 0) { |
| | | throw exception(approve ? SALE_ORDER_APPROVE_FAIL : SALE_ORDER_PROCESS_FAIL); |
| | | // 4. å建 BPM æµç¨å®ä¾ï¼å®¡æ¹å¨åååå
¬å®æï¼ |
| | | String processInstanceId = processInstanceApi.createProcessInstance(userId, |
| | | new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(processDefinitionKey) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | |
| | | // 5. æ´æ°éå®è®¢åç¶æä¸ºå®¡æ¹ä¸ï¼è®°å½æµç¨å®ä¾ç¼å· |
| | | saleOrderMapper.updateById(new ErpSaleOrderDO() |
| | | .setId(id) |
| | | .setStatus(ErpAuditStatus.APPROVING.getStatus()) |
| | | .setProcessInstanceId(processInstanceId)); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateSaleOrderAuditStatus(Long id, Integer bpmResult) { |
| | | // 1. æ ¡éªåå¨ |
| | | ErpSaleOrderDO saleOrder = validateSaleOrderExists(id); |
| | | if (!ErpAuditStatus.APPROVING.getStatus().equals(saleOrder.getStatus())) { |
| | | log.warn("[updateSaleOrderAuditStatus] éå®è®¢å({}) ä¸å¤äºå®¡æ¹ä¸ç¶æï¼è·³è¿", id); |
| | | return; |
| | | } |
| | | |
| | | // 2. æ ¹æ®å®¡æ¹ç»ææ´æ°ç¶æ |
| | | Integer newStatus = convertBpmResultToAuditStatus(bpmResult); |
| | | if (newStatus != null) { |
| | | saleOrderMapper.updateById(new ErpSaleOrderDO() |
| | | .setId(id).setStatus(newStatus)); |
| | | } |
| | | |
| | | // 3. å®¡æ ¸éè¿æ¶ï¼ä¸ºéè¦ç产çæç»å建 MPS |
| | | if (approve) { |
| | | if (ErpAuditStatus.APPROVE.getStatus().equals(newStatus)) { |
| | | createMpsForSaleOrder(id, saleOrder); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<Map<String, Object>> getSaleOrderApproveProcessDefinitionList() { |
| | | // 1. æ ¡éªåç±»åæµç¨å®ä¹æ¯å¦åå¨ |
| | | validateSaleOrderApproveCategoryAndProcessDefinition(); |
| | | |
| | | // 2. è·ååç±»ä¸çæµç¨å®ä¹ä¿¡æ¯ |
| | | List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService |
| | | .getProcessDefinitionInfoListByCategory(SALE_ORDER_APPROVE_CATEGORY_CODE); |
| | | if (CollUtil.isEmpty(definitionInfoList)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | |
| | | // 3. éåè·åæµç¨å®ä¹è¯¦æ
ï¼è¿æ»¤æ¿æ´»ç¶æï¼ä¿çææ°çæ¬ |
| | | Map<String, ProcessDefinition> latestVersionMap = new HashMap<>(); |
| | | for (BpmProcessDefinitionInfoDO info : definitionInfoList) { |
| | | ProcessDefinition pd = bpmProcessDefinitionService.getProcessDefinition(info.getProcessDefinitionId()); |
| | | if (pd == null || pd.isSuspended()) { |
| | | continue; |
| | | } |
| | | ProcessDefinition existing = latestVersionMap.get(pd.getKey()); |
| | | if (existing == null || pd.getVersion() > existing.getVersion()) { |
| | | latestVersionMap.put(pd.getKey(), pd); |
| | | } |
| | | } |
| | | |
| | | // 4. è¿åæµç¨å®ä¹å表 |
| | | List<Map<String, Object>> result = new ArrayList<>(); |
| | | for (ProcessDefinition pd : latestVersionMap.values()) { |
| | | Map<String, Object> item = new HashMap<>(); |
| | | item.put("id", pd.getId()); |
| | | item.put("key", pd.getKey()); |
| | | item.put("name", pd.getName()); |
| | | result.add(item); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªéå®è®¢å审æ¹åç±»æ¯å¦åå¨ |
| | | */ |
| | | private void validateSaleOrderApproveCategoryAndProcessDefinition() { |
| | | // 1. æ ¡éªåç±»æ¯å¦åå¨ |
| | | List<BpmCategoryDO> categories = bpmCategoryService.getCategoryListByCode( |
| | | Collections.singletonList(SALE_ORDER_APPROVE_CATEGORY_CODE)); |
| | | if (CollUtil.isEmpty(categories)) { |
| | | throw exception(SALE_ORDER_BPM_CATEGORY_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è½¬æ¢ BPM 审æ¹ç»æä¸ºå®¡æ ¸ç¶æ |
| | | */ |
| | | private Integer convertBpmResultToAuditStatus(Integer bpmResult) { |
| | | if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmResult)) { |
| | | return ErpAuditStatus.APPROVE.getStatus(); |
| | | } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmResult)) { |
| | | return ErpAuditStatus.REJECT.getStatus(); |
| | | } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmResult)) { |
| | | return ErpAuditStatus.CANCEL.getStatus(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deleteSaleOrder(List<Long> ids) { |
| | | // 1. æ ¡éªä¸å¤äºå·²å®¡æ¹ |
| | | // 1. æ ¡éªç¶æï¼åªææªæäº¤æå·²é©³åçéå®è®¢åæè½å é¤ |
| | | List<ErpSaleOrderDO> saleOrders = saleOrderMapper.selectByIds(ids); |
| | | if (CollUtil.isEmpty(saleOrders)) { |
| | | return; |
| | | } |
| | | saleOrders.forEach(saleOrder -> { |
| | | if (ErpAuditStatus.APPROVE.getStatus().equals(saleOrder.getStatus())) { |
| | | if (!ErpAuditStatus.DRAFT.getStatus().equals(saleOrder.getStatus()) |
| | | && !ErpAuditStatus.REJECT.getStatus().equals(saleOrder.getStatus())) { |
| | | throw exception(SALE_ORDER_DELETE_FAIL_APPROVE, saleOrder.getNo()); |
| | | } |
| | | }); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.sale.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener; |
| | | import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOrderService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * éå®è®¢å审æ¹ç¶æçå¬å¨ |
| | | * |
| | | * çå¬ BPM æµç¨å®ä¾ç¶æåæ´äºä»¶ï¼æ´æ°éå®è®¢åç审æ¹ç¶æï¼åååå
¬å®¡æ¹åååï¼ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class ErpSaleOrderStatusListener extends BpmProcessInstanceStatusEventListener { |
| | | |
| | | /** |
| | | * éå®è®¢åå®¡æ¹æµç¨å®ä¹ Key |
| | | */ |
| | | private static final String PROCESS_DEFINITION_KEY = "sale_order_approve"; |
| | | |
| | | @Resource |
| | | private ErpSaleOrderService saleOrderService; |
| | | |
| | | @Override |
| | | protected String getProcessDefinitionKey() { |
| | | return PROCESS_DEFINITION_KEY; |
| | | } |
| | | |
| | | @Override |
| | | protected void onEvent(BpmProcessInstanceStatusEvent event) { |
| | | Long orderId; |
| | | try { |
| | | orderId = Long.parseLong(event.getBusinessKey()); |
| | | } catch (NumberFormatException e) { |
| | | log.warn("[onEvent] businessKey({}) 䏿¯ææçéå®è®¢åç¼å·", event.getBusinessKey()); |
| | | return; |
| | | } |
| | | |
| | | log.info("[onEvent] æ¶å°BPM审æ¹äºä»¶ï¼orderId={}, status={}", orderId, event.getStatus()); |
| | | |
| | | try { |
| | | saleOrderService.updateSaleOrderAuditStatus(orderId, event.getStatus()); |
| | | log.info("[onEvent] éå®è®¢å({}) 审æ¹ç¶ææ´æ°å®æ", orderId); |
| | | } catch (Exception e) { |
| | | log.error("[onEvent] æ´æ°éå®è®¢å审æ¹ç¶æå¤±è´¥ï¼orderId={}", orderId, e); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | Map<Long, DeptRespDTO> deptMap = CollUtil.isEmpty(deptIds) ? Collections.emptyMap() : deptApi.getDeptMap(deptIds); |
| | | |
| | | // 2. æ¹éè·åå²ä½ä¿¡æ¯ |
| | | Set<Long> postIds = employeeList.stream() |
| | | .map(HrmEmployeeDO::getPostId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Set<Long> postIds = new HashSet<>(); |
| | | for (HrmEmployeeDO employee : employeeList) { |
| | | if (StrUtil.isNotBlank(employee.getPostIds())) { |
| | | postIds.addAll(JSONUtil.toList(employee.getPostIds(), Long.class)); |
| | | } |
| | | } |
| | | Map<Long, PostRespDTO> postMap = CollUtil.isEmpty(postIds) ? Collections.emptyMap() : postApi.getPostMap(postIds); |
| | | |
| | | // 3. æ¶éææè§è²ID |
| | |
| | | respVO.setDeptName(deptMap.get(employee.getDeptId()).getName()); |
| | | } |
| | | |
| | | // å¡«å
å²ä½åç§° |
| | | if (employee.getPostId() != null && postMap.containsKey(employee.getPostId())) { |
| | | respVO.setPostName(postMap.get(employee.getPostId()).getName()); |
| | | // å¡«å
å²ä½ä¿¡æ¯ |
| | | if (StrUtil.isNotBlank(employee.getPostIds())) { |
| | | List<Long> employeePostIds = JSONUtil.toList(employee.getPostIds(), Long.class); |
| | | respVO.setPostIds(employeePostIds); |
| | | if (CollUtil.isNotEmpty(employeePostIds)) { |
| | | respVO.setPostNames(employeePostIds.stream() |
| | | .filter(postMap::containsKey) |
| | | .map(id -> postMap.get(id).getName()) |
| | | .collect(Collectors.joining(","))); |
| | | } |
| | | } |
| | | |
| | | // è§£æ roleIds å¹¶å¡«å
è§è²åç§° |
| | |
| | | // è¾åºç¤ºä¾æ°æ®ï¼æ¹ä¾¿ä½¿ç¨è
åè |
| | | List<HrmEmployeeImportExcelVO> list = Arrays.asList( |
| | | HrmEmployeeImportExcelVO.builder().name("å¼ ä¸").gender(1).phone("13800138000") |
| | | .deptName("ç åé¨").postName("é¨é¨ç»ç").roleNames("æ®é管çå") |
| | | .deptName("ç åé¨").postName("é¨é¨ç»ç,项ç®ç»ç").roleNames("æ®é管çå") |
| | | .hireDate(LocalDate.of(2020, 3, 1)).employeeStatus(1) |
| | | .idCard("320102199001150011").birthday(LocalDate.of(1990, 1, 15)) |
| | | .nation("æ±æ").marriageStatus("å·²å©").age(36).education("æ¬ç§").politicalStatus("ä¸å
±å
å") |
| | |
| | | @ExcelProperty("é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "å²ä½ID") |
| | | private Long postId; |
| | | @Schema(description = "å²ä½IDå表") |
| | | private List<Long> postIds; |
| | | |
| | | @Schema(description = "å²ä½åç§°") |
| | | @Schema(description = "å²ä½åç§°å表") |
| | | @ExcelProperty("å²ä½åç§°") |
| | | private String postName; |
| | | private String postNames; |
| | | |
| | | @Schema(description = "åå·¥å§å") |
| | | @ExcelProperty("åå·¥å§å") |
| | |
| | | @NotNull(message = "é¨é¨ä¸è½ä¸ºç©º") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "å²ä½ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "å²ä½ä¸è½ä¸ºç©º") |
| | | private Long postId; |
| | | @Schema(description = "å²ä½IDå表", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1, 2]") |
| | | @NotEmpty(message = "å²ä½ä¸è½ä¸ºç©º") |
| | | private List<Long> postIds; |
| | | |
| | | @Schema(description = "åå·¥å§å", requiredMode = Schema.RequiredMode.REQUIRED, example = "å¼ ä¸") |
| | | @NotEmpty(message = "åå·¥å§åä¸è½ä¸ºç©º") |
| | |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * å²ä½ID |
| | | * å²ä½IDå表 |
| | | * |
| | | * å
³è PostDO#getId() |
| | | * å
³è PostDO#getId()ï¼JSON æ ¼å¼åå¨ |
| | | */ |
| | | private Long postId; |
| | | private String postIds; |
| | | |
| | | /** |
| | | * åå·¥ç¼å· |
| | |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.NumberUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.hutool.json.JSONUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | |
| | | resp.setEmployeeName(employee.getName()); resp.setEmployeeNo(employee.getEmployeeNo()); |
| | | resp.setDeptId(employee.getDeptId()); |
| | | DeptRespDTO dept = employee.getDeptId() == null ? null : deptApi.getDept(employee.getDeptId()); |
| | | PostRespDTO post = employee.getPostId() == null ? null |
| | | : postApi.getPostMap(Collections.singleton(employee.getPostId())).get(employee.getPostId()); |
| | | resp.setDeptName(dept == null ? null : dept.getName()); |
| | | resp.setPostName(post == null ? null : post.getName()); |
| | | // å²ä½å¤éï¼è§£æ postIds JSONï¼æ¼æ¥å²ä½åç§° |
| | | if (StrUtil.isNotBlank(employee.getPostIds())) { |
| | | List<Long> postIds = JSONUtil.toList(employee.getPostIds(), Long.class); |
| | | if (CollUtil.isNotEmpty(postIds)) { |
| | | Map<Long, PostRespDTO> postMap = postApi.getPostMap(postIds); |
| | | resp.setPostName(postIds.stream() |
| | | .filter(postMap::containsKey) |
| | | .map(id -> postMap.get(id).getName()) |
| | | .collect(Collectors.joining(","))); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.system.api.permission.dto.RoleRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserCreateReqDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserUpdateReqDTO; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | // 1. æ ¡éªé¨é¨ |
| | | deptApi.validateDeptList(Collections.singleton(createReqVO.getDeptId())); |
| | | // 2. æ ¡éªå²ä½ |
| | | postApi.validPostList(Collections.singleton(createReqVO.getPostId())); |
| | | postApi.validPostList(createReqVO.getPostIds()); |
| | | // 3. æ ¡éªææºå·æ¯å¦å·²åå¨ |
| | | if (employeeMapper.selectByPhone(createReqVO.getPhone()) != null) { |
| | | throw exception(EMPLOYEE_PHONE_EXISTS); |
| | |
| | | userCreateReqDTO.setUsername(createReqVO.getPhone()); |
| | | userCreateReqDTO.setNickname(createReqVO.getName()); |
| | | userCreateReqDTO.setDeptId(createReqVO.getDeptId()); |
| | | userCreateReqDTO.setPostIds(Collections.singleton(createReqVO.getPostId())); |
| | | userCreateReqDTO.setPostIds(new LinkedHashSet<>(createReqVO.getPostIds())); |
| | | userCreateReqDTO.setMobile(createReqVO.getPhone()); |
| | | userCreateReqDTO.setPassword(createReqVO.getPhone()); |
| | | userCreateReqDTO.setSex(createReqVO.getGender()); |
| | |
| | | // roleIds åå¨ä¸º JSON |
| | | if (CollUtil.isNotEmpty(createReqVO.getRoleIds())) { |
| | | employee.setRoleIds(JSONUtil.toJsonStr(createReqVO.getRoleIds())); |
| | | } |
| | | // postIds åå¨ä¸º JSON |
| | | if (CollUtil.isNotEmpty(createReqVO.getPostIds())) { |
| | | employee.setPostIds(JSONUtil.toJsonStr(createReqVO.getPostIds())); |
| | | } |
| | | employeeMapper.insert(employee); |
| | | Long employeeId = employee.getId(); |
| | |
| | | // æ ¡éªé¨é¨ |
| | | deptApi.validateDeptList(Collections.singleton(updateReqVO.getDeptId())); |
| | | // æ ¡éªå²ä½ |
| | | postApi.validPostList(Collections.singleton(updateReqVO.getPostId())); |
| | | postApi.validPostList(updateReqVO.getPostIds()); |
| | | // æ ¡éªææºå·æ¯å¦å·²åå¨ï¼å¦æææºå·æåæ´ï¼ |
| | | if (!Objects.equals(employee.getPhone(), updateReqVO.getPhone()) |
| | | && employeeMapper.selectByPhone(updateReqVO.getPhone()) != null) { |
| | |
| | | if (CollUtil.isNotEmpty(updateReqVO.getRoleIds())) { |
| | | updateObj.setRoleIds(JSONUtil.toJsonStr(updateReqVO.getRoleIds())); |
| | | } |
| | | // postIds åå¨ä¸º JSON |
| | | if (CollUtil.isNotEmpty(updateReqVO.getPostIds())) { |
| | | updateObj.setPostIds(JSONUtil.toJsonStr(updateReqVO.getPostIds())); |
| | | } |
| | | employeeMapper.updateById(updateObj); |
| | | // åæ¥æ´æ°å
³èç³»ç»ç¨æ·ï¼å²ä½/é¨é¨/æµç§°/è§è²/é®ç®±/夿³¨ï¼ï¼ä¿æä¸ç¨æ·ç®¡çä¸è´ |
| | | if (employee.getUserId() != null) { |
| | | AdminUserUpdateReqDTO userUpdateReqDTO = new AdminUserUpdateReqDTO(); |
| | | userUpdateReqDTO.setId(employee.getUserId()); |
| | | userUpdateReqDTO.setNickname(updateReqVO.getName()); |
| | | userUpdateReqDTO.setDeptId(updateReqVO.getDeptId()); |
| | | userUpdateReqDTO.setPostIds(new LinkedHashSet<>(updateReqVO.getPostIds())); |
| | | userUpdateReqDTO.setRoleIds(CollUtil.isEmpty(updateReqVO.getRoleIds()) ? null |
| | | : new LinkedHashSet<>(updateReqVO.getRoleIds())); |
| | | userUpdateReqDTO.setEmail(updateReqVO.getEmail()); |
| | | userUpdateReqDTO.setRemark(updateReqVO.getRemark()); |
| | | adminUserApi.updateUser(userUpdateReqDTO); |
| | | } |
| | | Long employeeId = updateReqVO.getId(); |
| | | |
| | | // 忥æè²ç»å |
| | |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | // å¡«å
å²ä½åç§° |
| | | if (employee.getPostId() != null) { |
| | | Map<Long, PostRespDTO> postMap = postApi.getPostMap(Collections.singleton(employee.getPostId())); |
| | | PostRespDTO post = postMap.get(employee.getPostId()); |
| | | if (post != null) { |
| | | respVO.setPostName(post.getName()); |
| | | // å¡«å
å²ä½ä¿¡æ¯ |
| | | if (StrUtil.isNotBlank(employee.getPostIds())) { |
| | | List<Long> postIds = JSONUtil.toList(employee.getPostIds(), Long.class); |
| | | respVO.setPostIds(postIds); |
| | | if (CollUtil.isNotEmpty(postIds)) { |
| | | Map<Long, PostRespDTO> postMap = postApi.getPostMap(postIds); |
| | | respVO.setPostNames(postIds.stream() |
| | | .filter(postMap::containsKey) |
| | | .map(postId -> postMap.get(postId).getName()) |
| | | .collect(Collectors.joining(","))); |
| | | } |
| | | } |
| | | // å¡«å
è§è²åç§° |
| | |
| | | try { |
| | | // 3.1 å称转 ID |
| | | Long deptId = parseDeptId(importEmployee.getDeptName(), deptMap); |
| | | Long postId = parsePostId(importEmployee.getPostName(), postMap); |
| | | Set<Long> postIds = parsePostIds(importEmployee.getPostName(), postMap); |
| | | Set<Long> roleIds = parseRoleIds(importEmployee.getRoleNames(), roleMap); |
| | | // 3.2 æå»ºä¿åè¯·æ± |
| | | HrmEmployeeSaveReqVO saveReqVO = buildImportSaveReqVO(importEmployee, deptId, postId, roleIds); |
| | | HrmEmployeeSaveReqVO saveReqVO = buildImportSaveReqVO(importEmployee, deptId, postIds, roleIds); |
| | | // 3.3 夿å卿§ï¼æææºå· |
| | | HrmEmployeeDO existEmployee = employeeMapper.selectByPhone(importEmployee.getPhone()); |
| | | if (existEmployee == null) { |
| | |
| | | } |
| | | |
| | | private HrmEmployeeSaveReqVO buildImportSaveReqVO(HrmEmployeeImportExcelVO importEmployee, |
| | | Long deptId, Long postId, Set<Long> roleIds) { |
| | | Long deptId, Set<Long> postIds, Set<Long> roleIds) { |
| | | if (StrUtil.isBlank(importEmployee.getName())) { |
| | | throw exception(EMPLOYEE_IMPORT_FIELD_REQUIRED, "åå·¥å§å"); |
| | | } |
| | |
| | | reqVO.setGender(importEmployee.getGender() != null ? importEmployee.getGender() : 1); // é»è®¤ç· |
| | | reqVO.setPhone(importEmployee.getPhone()); |
| | | reqVO.setDeptId(deptId); |
| | | reqVO.setPostId(postId); |
| | | reqVO.setPostIds(CollUtil.isEmpty(postIds) ? null : new ArrayList<>(postIds)); |
| | | reqVO.setRoleIds(CollUtil.isEmpty(roleIds) ? null : new ArrayList<>(roleIds)); |
| | | reqVO.setHireDate(importEmployee.getHireDate()); |
| | | reqVO.setEmployeeStatus(importEmployee.getEmployeeStatus() != null |
| | |
| | | return dept.getId(); |
| | | } |
| | | |
| | | private Long parsePostId(String postName, Map<String, PostRespDTO> postMap) { |
| | | if (StrUtil.isBlank(postName)) { |
| | | private Set<Long> parsePostIds(String postNames, Map<String, PostRespDTO> postMap) { |
| | | if (StrUtil.isBlank(postNames)) { |
| | | throw exception(EMPLOYEE_IMPORT_FIELD_REQUIRED, "å²ä½åç§°"); |
| | | } |
| | | PostRespDTO post = postMap.get(postName.trim()); |
| | | if (post == null) { |
| | | throw exception(EMPLOYEE_POST_NAME_NOT_EXISTS, postName.trim()); |
| | | Set<Long> postIds = new LinkedHashSet<>(); |
| | | for (String postName : postNames.split("[,ï¼]")) { |
| | | String trimmed = postName.trim(); |
| | | if (StrUtil.isBlank(trimmed)) { |
| | | continue; |
| | | } |
| | | PostRespDTO post = postMap.get(trimmed); |
| | | if (post == null) { |
| | | throw exception(EMPLOYEE_POST_NAME_NOT_EXISTS, trimmed); |
| | | } |
| | | postIds.add(post.getId()); |
| | | } |
| | | return post.getId(); |
| | | if (CollUtil.isEmpty(postIds)) { |
| | | throw exception(EMPLOYEE_IMPORT_FIELD_REQUIRED, "å²ä½åç§°"); |
| | | } |
| | | return postIds; |
| | | } |
| | | |
| | | private Set<Long> parseRoleIds(String roleNames, Map<String, RoleRespDTO> roleMap) { |
| | |
| | | import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationWorkerService; |
| | | import cn.iocoder.yudao.module.system.api.dept.PostApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.PostRespDTO; |
| | | 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 PostApi postApi; |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建人åèµæº") |
| | |
| | | return success(buildWorkstationWorkerRespVOList(list)); |
| | | } |
| | | |
| | | @GetMapping("/list-user-by-workstation") |
| | | @Operation(summary = "è·å¾å·¥ä½ç«å¯¹åºå²ä½çåå·¥å表") |
| | | @Parameter(name = "workstationId", description = "å·¥ä½ç«ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('mes:md-workstation:query')") |
| | | public CommonResult<List<AdminUserRespDTO>> getUserListByWorkstation( |
| | | @RequestParam("workstationId") Long workstationId) { |
| | | List<MesMdWorkstationWorkerDO> list = workstationWorkerService.getWorkstationWorkerListByWorkstationId(workstationId); |
| | | if (CollUtil.isEmpty(list)) { |
| | | return success(Collections.emptyList()); |
| | | } |
| | | List<Long> postIds = cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList(list, MesMdWorkstationWorkerDO::getPostId); |
| | | if (CollUtil.isEmpty(postIds)) { |
| | | return success(Collections.emptyList()); |
| | | } |
| | | List<AdminUserRespDTO> userList = adminUserApi.getUserListByPostIds(postIds); |
| | | return success(userList); |
| | | } |
| | | |
| | | // ==================== æ¼æ¥ VO ==================== |
| | | |
| | | private List<MesMdWorkstationWorkerRespVO> buildWorkstationWorkerRespVOList(List<MesMdWorkstationWorkerDO> list) { |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemconsume.MesWmItemConsumeMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceLineMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderParamRecordDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderParamRecordDetailDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderParamRecordMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderParamRecordDetailMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | import java.util.stream.Stream; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | |
| | | private MesWmItemConsumeLineMapper itemConsumeLineMapper; |
| | | @Resource |
| | | private MesQcIpqcMapper ipqcMapper; |
| | | @Resource |
| | | private MesProWorkOrderParamRecordMapper paramRecordMapper; |
| | | @Resource |
| | | private MesProWorkOrderParamRecordDetailMapper paramRecordDetailMapper; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建ç产æ¥å·¥") |
| | |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( |
| | | convertSetByFlatMap(list, feedback -> |
| | | Stream.of(feedback.getFeedbackUserId(), feedback.getApproveUserId()))); |
| | | // 1.9 ä»»å¡åæ°è®°å½ï¼æ¥å·¥åæ¾åæ°å¼ |
| | | Set<Long> taskIds = convertSet(list, MesProFeedbackDO::getTaskId); |
| | | Map<Long, List<MesProWorkOrderParamRecordDetailDO>> taskParamDetailMap = new HashMap<>(); |
| | | if (CollUtil.isNotEmpty(taskIds)) { |
| | | List<MesProWorkOrderParamRecordDO> paramRecords = paramRecordMapper.selectListByTaskIds(taskIds); |
| | | if (CollUtil.isNotEmpty(paramRecords)) { |
| | | Map<Long, List<MesProWorkOrderParamRecordDetailDO>> recordDetailMap = paramRecordDetailMapper |
| | | .selectListByRecordIds(convertSet(paramRecords, MesProWorkOrderParamRecordDO::getId)).stream() |
| | | .collect(Collectors.groupingBy(MesProWorkOrderParamRecordDetailDO::getRecordId)); |
| | | for (MesProWorkOrderParamRecordDO record : paramRecords) { |
| | | taskParamDetailMap.putIfAbsent(record.getTaskId(), |
| | | recordDetailMap.getOrDefault(record.getId(), Collections.emptyList())); |
| | | } |
| | | } |
| | | } |
| | | Set<Long> paramUnitIds = new HashSet<>(); |
| | | taskParamDetailMap.values().forEach(details -> details.forEach(d -> { |
| | | if (d.getUnitMeasureId() != null) { |
| | | paramUnitIds.add(d.getUnitMeasureId()); |
| | | } |
| | | })); |
| | | Map<Long, MesMdUnitMeasureDO> paramUnitMeasureMap = unitMeasureService.getUnitMeasureMap(paramUnitIds); |
| | | |
| | | // 2. æ¼æ¥ VO |
| | | return BeanUtils.toBean(list, MesProFeedbackRespVO.class, vo -> { |
| | |
| | | vo.setFeedbackUserNickname(user.getNickname())); |
| | | findAndThen(userMap, vo.getApproveUserId(), user -> |
| | | vo.setApproveUserNickname(user.getNickname())); |
| | | // åæ°å¼åæ¾ï¼ä»»å¡åæ°è®°å½å¿«ç
§ï¼å«å¿
å¡«æ è®°ï¼ |
| | | List<MesProWorkOrderParamRecordDetailDO> taskDetails = taskParamDetailMap.get(vo.getTaskId()); |
| | | if (CollUtil.isNotEmpty(taskDetails)) { |
| | | vo.setParamValues(taskDetails.stream().map(detail -> { |
| | | MesProFeedbackRespVO.ParamValueResp pv = new MesProFeedbackRespVO.ParamValueResp(); |
| | | pv.setDetailId(detail.getId()); |
| | | pv.setParamCode(detail.getParamCode()); |
| | | pv.setParamName(detail.getParamName()); |
| | | pv.setParamType(detail.getParamType()); |
| | | pv.setUnitMeasureName(paramUnitMeasureMap.containsKey(detail.getUnitMeasureId()) |
| | | ? paramUnitMeasureMap.get(detail.getUnitMeasureId()).getName() : null); |
| | | pv.setParamValue(detail.getParamValue()); |
| | | pv.setRequired(detail.getRequired()); |
| | | return pv; |
| | | }).toList()); |
| | | } |
| | | }); |
| | | } |
| | | |
| | |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - MES ç产æ¥å·¥ Response VO") |
| | | @Data |
| | |
| | | @ExcelProperty("BPM æµç¨å®ä¹ Key") |
| | | private String processDefinitionKey; |
| | | |
| | | @Schema(description = "æ¬æ¬¡æ¥å·¥å¯¹åºçä»»å¡åæ°å¼ï¼æä»»å¡åæ°è®°å½å¿«ç
§å±ç¤ºï¼") |
| | | private List<ParamValueResp> paramValues; |
| | | |
| | | @Data |
| | | @Schema(description = "æ¥å·¥åæ°å¼") |
| | | public static class ParamValueResp { |
| | | |
| | | @Schema(description = "ä»»å¡åæ°è®°å½æç»ç¼å·", example = "1") |
| | | private Long detailId; |
| | | |
| | | @Schema(description = "åæ°ç¼ç ", example = "PP2024001") |
| | | private String paramCode; |
| | | |
| | | @Schema(description = "åæ°åç§°", example = "温度") |
| | | private String paramName; |
| | | |
| | | @Schema(description = "åæ°ç±»å", example = "2") |
| | | private Integer paramType; |
| | | |
| | | @Schema(description = "计éåä½åç§°", example = "â") |
| | | private String unitMeasureName; |
| | | |
| | | @Schema(description = "åæ°å¼", example = "200") |
| | | private String paramValue; |
| | | |
| | | @Schema(description = "æ¯å¦å¿
å¡«", example = "true") |
| | | private Boolean required; |
| | | |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.pro.process; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.process.vo.MesProProcessRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.process.vo.param.MesProProcessParamRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.process.vo.param.MesProProcessParamSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparam.MesPdProcessParamDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessParamDO; |
| | | import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; |
| | | import cn.iocoder.yudao.module.mes.service.pd.processparam.MesPdProcessParamService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessParamService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; |
| | | |
| | | @Tag(name = "管çåå° - MES å·¥åºå·¥èºåæ°ç»å®") |
| | | @RestController |
| | | @RequestMapping("/mes/pro/process-param") |
| | | @Validated |
| | | public class MesProProcessParamController { |
| | | |
| | | @Resource |
| | | private MesProProcessParamService processParamService; |
| | | @Resource |
| | | private MesPdProcessParamService pdProcessParamService; |
| | | @Resource |
| | | private MesMdUnitMeasureService unitMeasureService; |
| | | @Resource |
| | | private MesProProcessService processService; |
| | | |
| | | @GetMapping("/list-by-process") |
| | | @Operation(summary = "è·å¾å·¥åºç»å®çå·¥èºåæ°åè¡¨ï¼æå·¥åºç¼å·ï¼") |
| | | @Parameter(name = "processId", description = "å·¥åºç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('mes:pro-process:query')") |
| | | public CommonResult<List<MesProProcessParamRespVO>> getProcessParamListByProcessId(@RequestParam("processId") Long processId) { |
| | | List<MesProProcessParamDO> list = processParamService.getProcessParamListByProcessId(processId); |
| | | return success(buildRespVOList(list)); |
| | | } |
| | | |
| | | @PostMapping("/update-bindings") |
| | | @Operation(summary = "å
¨éè¦çä¿åå·¥åºç»å®çå·¥èºåæ°") |
| | | @PreAuthorize("@ss.hasPermission('mes:pro-process:update')") |
| | | public CommonResult<Boolean> updateProcessParams(@Valid @RequestBody MesProProcessParamSaveReqVO reqVO) { |
| | | processParamService.updateProcessParams(reqVO.getProcessId(), reqVO.getItems()); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/list-by-param") |
| | | @Operation(summary = "è·å¾å·¥èºåæ°è¢«ç»å®çå·¥åºåè¡¨ï¼æå·¥èºåæ°ç¼å·ï¼") |
| | | @Parameter(name = "paramId", description = "å·¥èºåæ°ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('mes:pro-process:query')") |
| | | public CommonResult<List<MesProProcessRespVO>> getProcessListByParamId(@RequestParam("paramId") Long paramId) { |
| | | List<MesProProcessParamDO> list = processParamService.getProcessParamListByParamId(paramId); |
| | | if (CollUtil.isEmpty(list)) { |
| | | return success(Collections.emptyList()); |
| | | } |
| | | Map<Long, MesProProcessDO> processMap = processService.getProcessMap( |
| | | convertSet(list, MesProProcessParamDO::getProcessId)); |
| | | List<MesProProcessRespVO> result = new ArrayList<>(list.size()); |
| | | for (MesProProcessParamDO binding : list) { |
| | | MesProProcessDO process = processMap.get(binding.getProcessId()); |
| | | if (process != null) { |
| | | result.add(new MesProProcessRespVO() |
| | | .setId(process.getId()).setCode(process.getCode()).setName(process.getName())); |
| | | } |
| | | } |
| | | return success(result); |
| | | } |
| | | |
| | | // ==================== æ¼æ¥ VO ==================== |
| | | |
| | | private List<MesProProcessParamRespVO> buildRespVOList(List<MesProProcessParamDO> list) { |
| | | if (CollUtil.isEmpty(list)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | // 1. æ¹éè·åå·¥èºåæ°ä¸è®¡éåä½ |
| | | Map<Long, MesPdProcessParamDO> paramMap = pdProcessParamService.getProcessParamMap( |
| | | convertSet(list, MesProProcessParamDO::getProcessParamId)); |
| | | Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap( |
| | | convertSet(paramMap.values(), MesPdProcessParamDO::getUnitMeasureId)); |
| | | // 2. æ¼æ¥ VO |
| | | return BeanUtils.toBean(list, MesProProcessParamRespVO.class, vo -> |
| | | findAndThen(paramMap, vo.getProcessParamId(), param -> { |
| | | vo.setParamCode(param.getParamCode()).setParamName(param.getParamName()) |
| | | .setParamType(param.getParamType()).setUnitMeasureId(param.getUnitMeasureId()); |
| | | findAndThen(unitMeasureMap, param.getUnitMeasureId(), unit -> |
| | | vo.setUnitMeasureName(unit.getName())); |
| | | }) |
| | | ); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.pro.process.vo.param; |
| | | |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | @Schema(description = "管çåå° - MES å·¥åºå·¥èºåæ°ç»å® Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class MesProProcessParamRespVO { |
| | | |
| | | @Schema(description = "ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| | | @ExcelProperty("ç¼å·") |
| | | private Long id; |
| | | |
| | | @Schema(description = "å·¥åºç¼å·", example = "1") |
| | | private Long processId; |
| | | |
| | | @Schema(description = "å·¥èºåæ°ç¼å·", example = "1") |
| | | private Long processParamId; |
| | | |
| | | @Schema(description = "åæ°ç¼ç ", example = "PP2024001") |
| | | @ExcelProperty("åæ°ç¼ç ") |
| | | private String paramCode; |
| | | |
| | | @Schema(description = "åæ°åç§°", example = "温度") |
| | | @ExcelProperty("åæ°åç§°") |
| | | private String paramName; |
| | | |
| | | @Schema(description = "åæ°ç±»å", example = "2") |
| | | @ExcelProperty(value = "åæ°ç±»å", converter = DictConvert.class) |
| | | @DictFormat(DictTypeConstants.MES_PD_PROCESS_PARAM_TYPE) |
| | | private Integer paramType; |
| | | |
| | | @Schema(description = "计éåä½ç¼å·", example = "1") |
| | | private Long unitMeasureId; |
| | | |
| | | @Schema(description = "计éåä½åç§°", example = "â") |
| | | @ExcelProperty("åä½") |
| | | private String unitMeasureName; |
| | | |
| | | @Schema(description = "æ¯å¦å¿
å¡«", example = "true") |
| | | @ExcelProperty("æ¯å¦å¿
å¡«") |
| | | private Boolean required; |
| | | |
| | | @Schema(description = "æåº", example = "1") |
| | | private Integer sort; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.pro.process.vo.param; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - MES å·¥åºå·¥èºåæ°ç»å®æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class MesProProcessParamSaveReqVO { |
| | | |
| | | @Schema(description = "å·¥åºç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| | | @NotNull(message = "å·¥åºç¼å·ä¸è½ä¸ºç©º") |
| | | private Long processId; |
| | | |
| | | @Schema(description = "ç»å®çå·¥èºåæ°å表ï¼å
¨éè¦çä¿åï¼") |
| | | private List<Item> items; |
| | | |
| | | @Data |
| | | public static class Item { |
| | | |
| | | @Schema(description = "å·¥èºåæ°ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "å·¥èºåæ°ä¸è½ä¸ºç©º") |
| | | private Long processParamId; |
| | | |
| | | @Schema(description = "æ¯å¦å¿
å¡«ï¼å¯è¦çåæ°é»è®¤å¼ï¼", example = "true") |
| | | private Boolean required; |
| | | |
| | | @Schema(description = "æåº", example = "1") |
| | | private Integer sort; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | private String remark; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.dataobject.pro.process; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | /** |
| | | * MES å·¥åº-å·¥èºåæ°ç»å® DO |
| | | * |
| | | * <p>å·¥åºä¸»æ°æ®ä¸åºç¡åæ°ï¼å·¥èºåæ°ï¼çå
³èå
³ç³»ï¼ç¨äºæ¥å·¥æ¶æå·¥åºå±ç¤ºåæ°å段ã |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @TableName("mes_pro_process_param") |
| | | @KeySequence("mes_pro_process_param_seq") // ç¨äº OracleãPostgreSQLãKingbaseãDB2ãH2 æ°æ®åºç主é®èªå¢ãå¦ææ¯ MySQL çæ°æ®åºï¼å¯ä¸åã |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class MesProProcessParamDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | /** |
| | | * å·¥åºç¼å· |
| | | * |
| | | * å
³è {@link MesProProcessDO#getId()} |
| | | */ |
| | | private Long processId; |
| | | /** |
| | | * å·¥èºåæ°ç¼å· |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparam.MesPdProcessParamDO#getId()} |
| | | */ |
| | | private Long processParamId; |
| | | /** |
| | | * æ¯å¦å¿
å¡«ï¼å¯è¦çåæ°é»è®¤å¼ï¼ |
| | | */ |
| | | private Boolean required; |
| | | /** |
| | | * æåº |
| | | */ |
| | | private Integer sort; |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| | |
| | | */ |
| | | private Integer paramType; |
| | | /** |
| | | * æ¯å¦å¿
å¡«ï¼å¿«ç
§ï¼ |
| | | */ |
| | | private Boolean required; |
| | | /** |
| | | * 计éåä½ç¼å·ï¼å¿«ç
§ï¼ |
| | | */ |
| | | private Long unitMeasureId; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.dal.mysql.pro.process; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessParamDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MES å·¥åº-å·¥èºåæ°ç»å® Mapper |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Mapper |
| | | public interface MesProProcessParamMapper extends BaseMapperX<MesProProcessParamDO> { |
| | | |
| | | default List<MesProProcessParamDO> selectListByProcessId(Long processId) { |
| | | return selectList(new LambdaQueryWrapperX<MesProProcessParamDO>() |
| | | .eq(MesProProcessParamDO::getProcessId, processId) |
| | | .orderByAsc(MesProProcessParamDO::getSort) |
| | | .orderByAsc(MesProProcessParamDO::getId)); |
| | | } |
| | | |
| | | default List<MesProProcessParamDO> selectListByProcessIds(Collection<Long> processIds) { |
| | | return selectList(new LambdaQueryWrapperX<MesProProcessParamDO>() |
| | | .inIfPresent(MesProProcessParamDO::getProcessId, processIds) |
| | | .orderByAsc(MesProProcessParamDO::getSort) |
| | | .orderByAsc(MesProProcessParamDO::getId)); |
| | | } |
| | | |
| | | default List<MesProProcessParamDO> selectListByProcessParamId(Long processParamId) { |
| | | return selectList(new LambdaQueryWrapperX<MesProProcessParamDO>() |
| | | .eq(MesProProcessParamDO::getProcessParamId, processParamId) |
| | | .orderByAsc(MesProProcessParamDO::getId)); |
| | | } |
| | | |
| | | default void deleteByProcessId(Long processId) { |
| | | delete(new LambdaQueryWrapperX<MesProProcessParamDO>() |
| | | .eq(MesProProcessParamDO::getProcessId, processId)); |
| | | } |
| | | |
| | | default void deleteByProcessParamId(Long processParamId) { |
| | | delete(new LambdaQueryWrapperX<MesProProcessParamDO>() |
| | | .eq(MesProProcessParamDO::getProcessParamId, processParamId)); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderParamRecordDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | .orderByDesc(MesProWorkOrderParamRecordDO::getId)); |
| | | } |
| | | |
| | | default List<MesProWorkOrderParamRecordDO> selectListByTaskIds(Collection<Long> taskIds) { |
| | | return selectList(new LambdaQueryWrapperX<MesProWorkOrderParamRecordDO>() |
| | | .in(MesProWorkOrderParamRecordDO::getTaskId, taskIds) |
| | | .orderByAsc(MesProWorkOrderParamRecordDO::getId)); |
| | | } |
| | | |
| | | } |
| | |
| | | @Lazy |
| | | private MesMdAutoCodeRecordService autoCodeRecordService; |
| | | |
| | | @Resource |
| | | @Lazy |
| | | private cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessParamService processParamService; |
| | | |
| | | @Override |
| | | public Long createProcessParam(MesPdProcessParamSaveReqVO createReqVO) { |
| | | // çæåæ°ç¼ç |
| | |
| | | public void deleteProcessParam(Long id) { |
| | | // æ ¡éªåå¨ |
| | | validateProcessParamExists(id); |
| | | // å é¤å·¥åºç»å®å
³ç³»ï¼é¿å
æ®çèæ°æ® |
| | | processParamService.deleteByParamId(id); |
| | | // å é¤ |
| | | processParamMapper.deleteById(id); |
| | | } |
| | |
| | | private cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi processInstanceApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createFeedback(MesProFeedbackSaveReqVO createReqVO) { |
| | | // 1. æ ¡éª |
| | | MesProTaskDO task = validateFeedbackData(createReqVO); |
| | |
| | | .setStatus(MesProFeedbackStatusEnum.PREPARE.getStatus()) |
| | | .setItemId(task.getItemId()); |
| | | feedbackMapper.insert(feedback); |
| | | // 3. ä¿ååæ°å¼ï¼å¿
å¡«åæ°æ ¡éªå¤±è´¥æ¶æ´ä½åæ»ï¼é¿å
æ®çè稿 |
| | | saveParamValues(task.getId(), createReqVO.getParamValues()); |
| | | return feedback.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateFeedback(MesProFeedbackSaveReqVO updateReqVO) { |
| | | // 1.1 æ ¡éªåå¨ + èç¨¿ç¶æ |
| | | validateFeedbackStatusPrepare(updateReqVO.getId()); |
| | |
| | | MesProFeedbackDO updateObj = BeanUtils.toBean(updateReqVO, MesProFeedbackDO.class) |
| | | .setItemId(task.getItemId()); |
| | | feedbackMapper.updateById(updateObj); |
| | | // 3. ä¿ååæ°å¼ï¼å¿
å¡«åæ°æ ¡éªå¤±è´¥æ¶æ´ä½åæ» |
| | | saveParamValues(task.getId(), updateReqVO.getParamValues()); |
| | | } |
| | | |
| | | private void saveParamValues(Long taskId, List<MesProFeedbackSaveReqVO.ParamValue> paramValues) { |
| | | // å³ä½¿åæ°ä¸ºç©ºä¹è°ç¨æ´æ°ï¼ä»¥ä¾¿è§¦åå¿
å¡«åæ°æ ¡éªï¼ä»»å¡ç»å®äºåæ°æ¶å¿
须填åï¼ |
| | | if (CollUtil.isEmpty(paramValues)) { |
| | | paramRecordService.updateTaskParamValues(taskId, null, null); |
| | | return; |
| | | } |
| | | paramRecordService.updateTaskParamValues(taskId, |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.pro.process; |
| | | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.process.vo.param.MesProProcessParamSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessParamDO; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MES å·¥åº-å·¥èºåæ°ç»å® Service æ¥å£ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public interface MesProProcessParamService { |
| | | |
| | | /** |
| | | * è·å¾æå·¥åºç»å®çå·¥èºåæ°åè¡¨ï¼ææåºï¼ |
| | | * |
| | | * @param processId å·¥åºç¼å· |
| | | * @return ç»å®å表 |
| | | */ |
| | | List<MesProProcessParamDO> getProcessParamListByProcessId(Long processId); |
| | | |
| | | /** |
| | | * æ¹éè·å¾å¤ä¸ªå·¥åºç»å®çå·¥èºåæ° |
| | | * |
| | | * @param processIds å·¥åºç¼å·éå |
| | | * @return ç»å®å表 |
| | | */ |
| | | List<MesProProcessParamDO> getProcessParamListByProcessIds(Collection<Long> processIds); |
| | | |
| | | /** |
| | | * è·å¾æå·¥èºåæ°è¢«åªäºå·¥åºç»å®ï¼åºç¡åæ°é¡µåæ¥å·¥åºï¼ |
| | | * |
| | | * @param processParamId å·¥èºåæ°ç¼å· |
| | | * @return ç»å®å表 |
| | | */ |
| | | List<MesProProcessParamDO> getProcessParamListByParamId(Long processParamId); |
| | | |
| | | /** |
| | | * å
¨éè¦çä¿åæå·¥åºç»å®çå·¥èºåæ° |
| | | * |
| | | * @param processId å·¥åºç¼å· |
| | | * @param items ç»å®é¡¹å表 |
| | | */ |
| | | void updateProcessParams(Long processId, List<MesProProcessParamSaveReqVO.Item> items); |
| | | |
| | | /** |
| | | * å 餿工èºåæ°çææå·¥åºç»å®ï¼å é¤å·¥èºåæ°æ¶æ¸
çï¼ |
| | | * |
| | | * @param processParamId å·¥èºåæ°ç¼å· |
| | | */ |
| | | void deleteByParamId(Long processParamId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.service.pro.process; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.process.vo.param.MesProProcessParamSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessParamDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.process.MesProProcessParamMapper; |
| | | import cn.iocoder.yudao.module.mes.service.pd.processparam.MesPdProcessParamService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MES å·¥åº-å·¥èºåæ°ç»å® Service å®ç°ç±» |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class MesProProcessParamServiceImpl implements MesProProcessParamService { |
| | | |
| | | @Resource |
| | | private MesProProcessParamMapper processParamMapper; |
| | | @Resource |
| | | private MesProProcessService processService; |
| | | @Resource |
| | | private MesPdProcessParamService pdProcessParamService; |
| | | |
| | | @Override |
| | | public List<MesProProcessParamDO> getProcessParamListByProcessId(Long processId) { |
| | | return processParamMapper.selectListByProcessId(processId); |
| | | } |
| | | |
| | | @Override |
| | | public List<MesProProcessParamDO> getProcessParamListByProcessIds(Collection<Long> processIds) { |
| | | if (CollUtil.isEmpty(processIds)) { |
| | | return new ArrayList<>(); |
| | | } |
| | | return processParamMapper.selectListByProcessIds(processIds); |
| | | } |
| | | |
| | | @Override |
| | | public List<MesProProcessParamDO> getProcessParamListByParamId(Long processParamId) { |
| | | return processParamMapper.selectListByProcessParamId(processParamId); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateProcessParams(Long processId, List<MesProProcessParamSaveReqVO.Item> items) { |
| | | // 1. æ ¡éªå·¥åºåå¨ |
| | | processService.validateProcessExists(processId); |
| | | // 2. æ ¡éªå·¥èºåæ°åå¨ |
| | | if (CollUtil.isNotEmpty(items)) { |
| | | for (MesProProcessParamSaveReqVO.Item item : items) { |
| | | pdProcessParamService.validateProcessParamExists(item.getProcessParamId()); |
| | | } |
| | | } |
| | | // 3. å
¨éè¦çï¼å
å æ§ç»å®ï¼åæå
¥æ°ç»å® |
| | | processParamMapper.deleteByProcessId(processId); |
| | | if (CollUtil.isEmpty(items)) { |
| | | return; |
| | | } |
| | | List<MesProProcessParamDO> list = new ArrayList<>(items.size()); |
| | | for (int i = 0; i < items.size(); i++) { |
| | | MesProProcessParamSaveReqVO.Item item = items.get(i); |
| | | list.add(MesProProcessParamDO.builder() |
| | | .processId(processId) |
| | | .processParamId(item.getProcessParamId()) |
| | | .required(Boolean.TRUE.equals(item.getRequired())) |
| | | .sort(item.getSort() != null ? item.getSort() : i + 1) |
| | | .remark(item.getRemark()) |
| | | .build()); |
| | | } |
| | | processParamMapper.insertBatch(list); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteByParamId(Long processParamId) { |
| | | processParamMapper.deleteByProcessParamId(processParamId); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationMachineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessParamDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.task.MesProTaskMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper; |
| | |
| | | import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationMachineService; |
| | | import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessParamService; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO; |
| | |
| | | @Lazy |
| | | private MesProWorkOrderParamRecordService workOrderParamRecordService; |
| | | @Resource |
| | | @Lazy |
| | | private MesProProcessParamService processParamService; |
| | | @Resource |
| | | private MesMdAutoCodeRecordService autoCodeRecordService; |
| | | @Resource |
| | | private MesMdWorkstationMachineService workstationMachineService; |
| | |
| | | } |
| | | // 2.2 æå
¥ |
| | | taskMapper.insert(task); |
| | | if (task.getParamTemplateId() != null) { |
| | | workOrderParamRecordService.createTaskParamRecord(task.getId(), task.getParamTemplateId()); |
| | | } |
| | | // 2.2.1 åæ°å¿«ç
§ï¼ä¼å
ä½¿ç¨æ¨¡æ¿ï¼æ æ¨¡æ¿æ¶åéå°å·¥åºä¸»æ°æ®ç»å®çå·¥èºåæ° |
| | | createTaskParamRecordWithFallback(task); |
| | | |
| | | // 2.3 ä¿åæå®æ¥å·¥äººå |
| | | updateTaskAssignees(task.getId(), createReqVO.getAssigneeUserIds()); |
| | | |
| | | |
| | | return task.getId(); |
| | | } |
| | | |
| | | /** |
| | | * 为任å¡åºååæ°å¿«ç
§ï¼ä¼å
使ç¨è·¯çº¿/å·¥åå·¥åºç»å®çåæ°æ¨¡æ¿ï¼æ æ¨¡æ¿æ¶åéå°å·¥åºä¸»æ°æ®ç»å®çå·¥èºåæ° |
| | | */ |
| | | private void createTaskParamRecordWithFallback(MesProTaskDO task) { |
| | | if (task.getParamTemplateId() != null) { |
| | | workOrderParamRecordService.createTaskParamRecord(task.getId(), task.getParamTemplateId()); |
| | | return; |
| | | } |
| | | // æ æ¨¡æ¿ï¼ä»å·¥åºä¸»æ°æ®è§£æç»å®çå·¥èºåæ° |
| | | List<MesProProcessParamDO> processParams = processParamService.getProcessParamListByProcessId(task.getProcessId()); |
| | | if (CollUtil.isNotEmpty(processParams)) { |
| | | workOrderParamRecordService.createTaskParamRecordFromProcessParams(task.getId(), processParams); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | .setClientId(workOrder.getClientId()) |
| | | .setColorCode(rp.getColorCode()); |
| | | taskMapper.insert(task); |
| | | if (task.getParamTemplateId() != null) { |
| | | workOrderParamRecordService.createTaskParamRecord(task.getId(), task.getParamTemplateId()); |
| | | } |
| | | // åæ°å¿«ç
§ï¼ä¼å
ä½¿ç¨æ¨¡æ¿ï¼æ æ¨¡æ¿æ¶åéå°å·¥åºä¸»æ°æ®ç»å®çå·¥èºåæ° |
| | | createTaskParamRecordWithFallback(task); |
| | | taskIds.add(task.getId()); |
| | | } |
| | | // 7. æ´æ°å·¥åå·²æäº§æ°é |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.paramrecord.MesProWorkOrderParamRecordPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.paramrecord.MesProWorkOrderParamRecordSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessParamDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderParamRecordDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | |
| | | Long createTaskParamRecord(Long taskId, Long templateId); |
| | | |
| | | /** |
| | | * æ ¹æ®å·¥åºç»å®çå·¥èºåæ°ä¸ºç产任å¡åºååæ°å¿«ç
§ï¼æ æ¨¡æ¿æ¶çåéè·¯å¾ï¼ |
| | | * |
| | | * @param taskId ä»»å¡ç¼å· |
| | | * @param processParams å·¥åºç»å®çå·¥èºåæ°å表 |
| | | * @return è®°å½ç¼å· |
| | | */ |
| | | Long createTaskParamRecordFromProcessParams(Long taskId, List<MesProProcessParamDO> processParams); |
| | | |
| | | /** |
| | | * æ´æ°å·¥ååæ°è®°å½ï¼ä»
æ´æ°å¡«åå¼ï¼ä¸æ¢æ¨¡æ¿ï¼ |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.paramrecord.MesProWorkOrderParamRecordPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.paramrecord.MesProWorkOrderParamRecordSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparam.MesPdProcessParamDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDetailDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pd.processparamtemplate.MesPdProcessParamTemplateDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessParamDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderParamRecordDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderParamRecordDetailDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderParamRecordDetailMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderParamRecordMapper; |
| | | import cn.iocoder.yudao.module.mes.service.pd.processparam.MesPdProcessParamService; |
| | | import cn.iocoder.yudao.module.mes.service.pd.processparamtemplate.MesPdProcessParamTemplateService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; |
| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | |
| | | private MesProWorkOrderService workOrderService; |
| | | @Resource |
| | | private MesPdProcessParamTemplateService templateService; |
| | | @Resource |
| | | private MesPdProcessParamService pdProcessParamService; |
| | | @Autowired |
| | | private MesProTaskService mesProTaskService; |
| | | @Autowired |
| | |
| | | .paramCode(detail.getParamCode()) |
| | | .paramName(detail.getParamName()) |
| | | .paramType(detail.getParamType()) |
| | | .required(detail.getRequired()) |
| | | .unitMeasureId(detail.getUnitMeasureId()) |
| | | .paramValue(null) |
| | | .remark(detail.getRemark()) |
| | | .build()).toList()); |
| | | return record.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createTaskParamRecordFromProcessParams(Long taskId, List<MesProProcessParamDO> processParams) { |
| | | MesProTaskDO task = mesProTaskService.getTask(taskId); |
| | | if (task == null || CollUtil.isEmpty(processParams)) { |
| | | return null; |
| | | } |
| | | // 1. æ¹éè·åå·¥èºåæ°å®ä¹ï¼è¿æ»¤å·²å é¤çåæ° |
| | | Map<Long, MesPdProcessParamDO> paramMap = pdProcessParamService.getProcessParamMap( |
| | | processParams.stream().map(MesProProcessParamDO::getProcessParamId).collect(Collectors.toSet())); |
| | | List<MesProProcessParamDO> valid = processParams.stream() |
| | | .filter(pp -> paramMap.containsKey(pp.getProcessParamId())) |
| | | .toList(); |
| | | if (CollUtil.isEmpty(valid)) { |
| | | return null; |
| | | } |
| | | // 2. æå
¥ä¸»è¡¨ï¼æ 模æ¿ï¼template ç¸å
³åæ®µä¸ºç©ºï¼ |
| | | MesProWorkOrderDO workOrder = mesProWorkOrderService.getWorkOrder(task.getWorkOrderId()); |
| | | MesProWorkOrderParamRecordDO record = MesProWorkOrderParamRecordDO.builder() |
| | | .workOrderId(workOrder != null ? workOrder.getId() : task.getWorkOrderId()) |
| | | .taskId(taskId) |
| | | .templateId(null) |
| | | .templateCode(null) |
| | | .templateName("å·¥åºç»å®åæ°") |
| | | .recordNo("TASK-" + taskId) |
| | | .remark("çäº§ä»»å¡æå·¥åºç»å®åæ°çæçåæ°å¿«ç
§") |
| | | .build(); |
| | | paramRecordMapper.insert(record); |
| | | // 3. æå
¥æç»ï¼å¿«ç
§åæ°å®ä¹ï¼required ä¼å
åç»å®å¼ï¼å
¶æ¬¡ååæ°é»è®¤å¼ï¼ |
| | | paramRecordDetailMapper.insertBatch(valid.stream().map(pp -> { |
| | | MesPdProcessParamDO param = paramMap.get(pp.getProcessParamId()); |
| | | return MesProWorkOrderParamRecordDetailDO.builder() |
| | | .recordId(record.getId()) |
| | | .templateDetailId(null) |
| | | .paramCode(param.getParamCode()) |
| | | .paramName(param.getParamName()) |
| | | .paramType(param.getParamType()) |
| | | .required(pp.getRequired() != null ? pp.getRequired() : param.getRequired()) |
| | | .unitMeasureId(param.getUnitMeasureId()) |
| | | .paramValue(null) |
| | | .remark(pp.getRemark()) |
| | | .build(); |
| | | }).toList()); |
| | | return record.getId(); |
| | | } |
| | | |
| | |
| | | .paramCode(templateDetail.getParamCode()) |
| | | .paramName(templateDetail.getParamName()) |
| | | .paramType(templateDetail.getParamType()) |
| | | .required(templateDetail.getRequired()) |
| | | .unitMeasureId(templateDetail.getUnitMeasureId()) |
| | | .paramValue(item.getParamValue()) |
| | | .build(); |
| | |
| | | .paramCode(templateDetail.getParamCode()) |
| | | .paramName(templateDetail.getParamName()) |
| | | .paramType(templateDetail.getParamType()) |
| | | .required(templateDetail.getRequired()) |
| | | .unitMeasureId(templateDetail.getUnitMeasureId()) |
| | | .paramValue(item.getParamValue()) |
| | | .build(); |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateTaskParamValues(Long taskId, List<Long> detailIds, List<String> values) { |
| | | if (CollUtil.isEmpty(detailIds)) { |
| | | return; |
| | | } |
| | | MesProWorkOrderParamRecordDO record = paramRecordMapper.selectFirstByTaskId(taskId); |
| | | if (record == null) { |
| | | return; |
| | | return; // 任塿 åæ°è®°å½ï¼æªç»å®åæ°ï¼ï¼æ éæ ¡éª |
| | | } |
| | | List<MesProWorkOrderParamRecordDetailDO> details = paramRecordDetailMapper.selectListByRecordId(record.getId()); |
| | | if (CollUtil.isEmpty(details)) { |
| | | return; |
| | | } |
| | | // 1. æå»ºæäº¤æç»æ å°ï¼detailId -> åæ°å¼ï¼ |
| | | Map<Long, String> valueMap = new HashMap<>(); |
| | | if (CollUtil.isNotEmpty(detailIds)) { |
| | | for (int i = 0; i < detailIds.size(); i++) { |
| | | valueMap.put(detailIds.get(i), values != null && values.size() > i ? values.get(i) : null); |
| | | } |
| | | } |
| | | // 2. æ ¡éªå¿
填忰齿å¼ï¼ç»å®åæ°ææ¨¡æ¿å¿«ç
§ä¸ç requiredï¼ |
| | | Map<Long, MesProWorkOrderParamRecordDetailDO> detailMap = details.stream() |
| | | .collect(Collectors.toMap(MesProWorkOrderParamRecordDetailDO::getId, d -> d)); |
| | | for (int i = 0; i < detailIds.size(); i++) { |
| | | MesProWorkOrderParamRecordDetailDO detail = detailMap.get(detailIds.get(i)); |
| | | for (MesProWorkOrderParamRecordDetailDO detail : details) { |
| | | String value = valueMap.get(detail.getId()); |
| | | if (Boolean.TRUE.equals(detail.getRequired()) |
| | | && (value == null || value.isBlank())) { |
| | | throw exception(PRO_WORK_ORDER_PARAM_RECORD_REQUIRED_PARAM_MISSING, detail.getParamName()); |
| | | } |
| | | } |
| | | // 3. æ´æ°æäº¤çåæ°å¼ |
| | | for (Map.Entry<Long, String> entry : valueMap.entrySet()) { |
| | | MesProWorkOrderParamRecordDetailDO detail = detailMap.get(entry.getKey()); |
| | | if (detail == null) { |
| | | throw exception(PRO_WORK_ORDER_PARAM_RECORD_DETAIL_NOT_IN_TEMPLATE); |
| | | } |
| | | detail.setParamValue(values != null && values.size() > i ? values.get(i) : null); |
| | | detail.setParamValue(entry.getValue()); |
| | | paramRecordDetailMapper.updateById(detail); |
| | | } |
| | | } |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| | | |
| | | @Tag(name = "管çåå° - SRM ä¾åºååå
¥") |
| | | @RestController |
| | |
| | | } |
| | | |
| | | @PutMapping("/submit") |
| | | @Operation(summary = "æäº¤ç³è¯·") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @Operation(summary = "æäº¤åå
¥ç³è¯·å®¡æ¹ï¼å¯å¨åååå
¬æµç¨ï¼") |
| | | @PreAuthorize("@ss.hasPermission('srm:supplier-apply:update')") |
| | | public CommonResult<Boolean> submitApply(@RequestParam("id") Long id) { |
| | | applyService.submitApply(id); |
| | | public CommonResult<Boolean> submitApply(@RequestParam("id") Long id, |
| | | @RequestParam("processDefinitionKey") String processDefinitionKey) { |
| | | applyService.submitApply(id, processDefinitionKey, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/review-purchase") |
| | | @Operation(summary = "éè´å®¡æ ¸") |
| | | @PreAuthorize("@ss.hasPermission('srm:supplier-apply:update')") |
| | | public CommonResult<Boolean> reviewPurchase(@Valid @RequestBody SrmSupplierApplyReviewReqVO reqVO) { |
| | | applyService.reviewPurchase(reqVO.getId(), reqVO.getOpinion(), reqVO.getPassed()); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/review-quality") |
| | | @Operation(summary = "è´¨éå®¡æ ¸") |
| | | @PreAuthorize("@ss.hasPermission('srm:supplier-apply:update')") |
| | | public CommonResult<Boolean> reviewQuality(@Valid @RequestBody SrmSupplierApplyReviewReqVO reqVO) { |
| | | applyService.reviewQuality(reqVO.getId(), reqVO.getOpinion(), reqVO.getPassed()); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/review-finance") |
| | | @Operation(summary = "è´¢å¡å®¡æ ¸") |
| | | @PreAuthorize("@ss.hasPermission('srm:supplier-apply:update')") |
| | | public CommonResult<Boolean> reviewFinance(@Valid @RequestBody SrmSupplierApplyReviewReqVO reqVO) { |
| | | applyService.reviewFinance(reqVO.getId(), reqVO.getOpinion(), reqVO.getPassed()); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/approve") |
| | | @Operation(summary = "éè¿åèªå¨å建ä¾åºå") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('srm:supplier-apply:update')") |
| | | public CommonResult<Boolean> approve(@RequestParam("id") Long id) { |
| | | applyService.approve(id); |
| | | return success(true); |
| | | @GetMapping("/approve-process-list") |
| | | @Operation(summary = "è·ååå
¥ç³è¯·å®¡æ¹æµç¨å表") |
| | | @PreAuthorize("@ss.hasPermission('srm:supplier-apply:query')") |
| | | public CommonResult<List<Map<String, Object>>> getApproveProcessList() { |
| | | return success(applyService.getSupplierApplyApproveProcessDefinitionList()); |
| | | } |
| | | |
| | | } |
| | |
| | | @Schema(description = "ç³è¯·ç¶æ", example = "0") |
| | | private Integer applyStatus; |
| | | |
| | | @Schema(description = "BPM æµç¨å®ä¾ç¼å·", example = "1a2b3c4d") |
| | | private String processInstanceId; |
| | | |
| | | @Schema(description = "éè´å®¡æ ¸äººID", example = "2") |
| | | private Long purchaseReviewerId; |
| | | |
| | |
| | | private String applyUserName; |
| | | private LocalDateTime applyTime; |
| | | private Integer applyStatus; |
| | | private String processInstanceId; |
| | | |
| | | private Long purchaseReviewerId; |
| | | private LocalDateTime purchaseReviewTime; |
| | |
| | | ErrorCode APPLY_STATUS_NOT_PENDING = new ErrorCode(1_040_200_002, "å½åç¶æä¸å
è®¸å®¡æ ¸"); |
| | | ErrorCode APPLY_SUPPLIER_EXISTS = new ErrorCode(1_040_200_003, "该ä¾åºåå·²åå¨åå
¥è®°å½"); |
| | | ErrorCode APPLY_SUPPLIER_NAME_REQUIRED = new ErrorCode(1_040_200_004, "æªéæ©SRMä¾åºåæ¶ï¼ä¾åºååç§°ä¸è½ä¸ºç©º"); |
| | | ErrorCode APPLY_BPM_CATEGORY_NOT_EXISTS = new ErrorCode(1_040_200_005, "ä¾åºååå
¥å®¡æ¹åç±»ä¸åå¨ï¼è¯·å
å¨BPM模åå建ä¾åºååå
¥å®¡æ¹æµç¨åç±»"); |
| | | ErrorCode APPLY_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_040_200_006, "ä¾åºååå
¥å®¡æ¹åç±»ä¸æ²¡æå¯ç¨çæµç¨æ¨¡åï¼è¯·å
å建并å叿µç¨"); |
| | | |
| | | // ========== ä¾åºåèµè´¨ 1_040_300_000 ========== |
| | | ErrorCode CERTIFICATE_NOT_EXISTS = new ErrorCode(1_040_300_000, "èµè´¨è¯ä¹¦ä¸åå¨"); |
| | |
| | | |
| | | /** |
| | | * ä¾åºååå
¥ç³è¯·ç¶ææä¸¾ |
| | | * |
| | | * æ¥å
¥åååå
¬(BPM)å,SRM ä¾§åªæç¥æµç¨æç»ç»æ,å½å审æ¹è¿åº¦å¨åååå
¬æ¥çã |
| | | * åå²ç¶æ(å¾
éè´å®¡æ ¸ 10 / å¾
è´¨éå®¡æ ¸ 20 / å¾
è´¢å¡å®¡æ ¸ 30)å·²åºå¼, |
| | | * ç± SQL èæ¬ç»ä¸è¿ç§»:åå²å®¡æ¹ä¸åæ®é置为ãå¾
æäº¤ã,éæ°æäº¤èµ°åååå
‹ |
| | | */ |
| | | @Getter |
| | | public enum SupplierApplyStatusEnum { |
| | | |
| | | DRAFT(0, "å¾
æäº¤"), |
| | | PENDING_PURCHASE(10, "å¾
éè´å®¡æ ¸"), |
| | | PENDING_QUALITY(20, "å¾
è´¨éå®¡æ ¸"), |
| | | PENDING_FINANCE(30, "å¾
è´¢å¡å®¡æ ¸"), |
| | | PROCESS(10, "审æ¹ä¸"), |
| | | CANCEL(30, "已忶"), |
| | | APPROVED(40, "å·²éè¿"), |
| | | REJECTED(50, "å·²æç»"); |
| | | REJECTED(50, "已驳å"); |
| | | |
| | | SupplierApplyStatusEnum(Integer code, String name) { |
| | | this.code = code; |
| | |
| | | import cn.iocoder.yudao.module.srm.dal.dataobject.SrmSupplierApplyDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * SRM ä¾åºååå
¥ç³è¯· Service æ¥å£ |
| | | */ |
| | |
| | | PageResult<SrmSupplierApplyDO> getApplyPage(SrmSupplierApplyPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * æäº¤ç³è¯·ï¼å¾
éè´å®¡æ ¸ï¼ |
| | | * æäº¤ç³è¯·ï¼å¯å¨åååå
¬æµç¨ï¼ç¶æç½®ä¸ºå®¡æ¹ä¸ï¼ |
| | | * |
| | | * @param id ç³è¯·ç¼å· |
| | | * @param processDefinitionKey åååå
¬æµç¨å®ä¹ Key |
| | | * @param userId æäº¤äººç¼å· |
| | | */ |
| | | void submitApply(Long id); |
| | | void submitApply(Long id, String processDefinitionKey, Long userId); |
| | | |
| | | /** |
| | | * éè´å®¡æ ¸ |
| | | * è·åä¾åºååå
¥å®¡æ¹æµç¨å表ï¼åååå
¬å·²åå¸ä¸æ¿æ´»çæµç¨ï¼ |
| | | */ |
| | | void reviewPurchase(Long id, String opinion, Boolean passed); |
| | | List<Map<String, Object>> getSupplierApplyApproveProcessDefinitionList(); |
| | | |
| | | /** |
| | | * è´¨éå®¡æ ¸ |
| | | * åååå
¬æµç¨ç»æåå |
| | | * |
| | | * @param id ç³è¯·ç¼å· |
| | | * @param bpmResult æµç¨ç»æï¼{@link cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum}ï¼ |
| | | */ |
| | | void reviewQuality(Long id, String opinion, Boolean passed); |
| | | void updateSupplierApplyAuditStatus(Long id, Integer bpmResult); |
| | | |
| | | /** |
| | | * è´¢å¡å®¡æ ¸ |
| | | */ |
| | | void reviewFinance(Long id, String opinion, Boolean passed); |
| | | |
| | | /** |
| | | * éè¿åèªå¨å建ä¾åºå |
| | | * 审æ¹éè¿åèªå¨å建ä¾åºå |
| | | */ |
| | | void approve(Long id); |
| | | |
| | | /** |
| | | * ç¡®ä¿ä¾åºåå·²åå
¥ï¼æªåå
¥åèªå¨å建åå
¥ç³è¯·å¹¶ç½®ä¸ºå·²éè¿ |
| | | * ç¡®ä¿ä¾åºåå·²åå
¥ï¼æªåå
¥åèªå¨å建åå
¥ç³è¯·å¹¶ç½®ä¸ºå·²éè¿ï¼å®æ èªå¨åå
¥ï¼ä¸èµ°åååå
¬ï¼ |
| | | * |
| | | * @param supplierId ä¾åºåç¼å· |
| | | */ |
| | |
| | | package cn.iocoder.yudao.module.srm.service.apply; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO; |
| | | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; |
| | | import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; |
| | | import cn.iocoder.yudao.module.srm.controller.admin.apply.vo.SrmSupplierApplyPageReqVO; |
| | | import cn.iocoder.yudao.module.srm.controller.admin.apply.vo.SrmSupplierApplySaveReqVO; |
| | | import cn.iocoder.yudao.module.srm.dal.dataobject.SrmSupplierApplyDO; |
| | |
| | | import cn.iocoder.yudao.module.srm.enums.ErrorCodeConstants; |
| | | import cn.iocoder.yudao.module.srm.enums.SupplierApplyStatusEnum; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.flowable.engine.repository.ProcessDefinition; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * SRM ä¾åºååå
¥ç³è¯· Service å®ç°ç±» |
| | | * |
| | | * æ¥å
¥åååå
¬(BPM)å,éè´/è´¨é/è´¢å¡å®¡æ ¸å¨åååå
¬æµç¨ä¸å®æ, |
| | | * SRM ä¾§åªè´è´£åèµ·æµç¨å¹¶æ¥æ¶æµç¨ç»æäºä»¶ååç¶æã |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class SrmSupplierApplyServiceImpl implements SrmSupplierApplyService { |
| | | |
| | | /** |
| | | * BPM ä¾åºååå
¥å®¡æ¹åç±»ç¼ç |
| | | */ |
| | | private static final String SUPPLIER_APPLY_APPROVE_CATEGORY_CODE = "supplier_apply_approve"; |
| | | |
| | | @Resource |
| | | private SrmSupplierApplyMapper supplierApplyMapper; |
| | | |
| | | @Resource |
| | | private SrmSupplierMapper supplierMapper; |
| | | |
| | | @Resource |
| | | private BpmProcessInstanceApi processInstanceApi; |
| | | @Resource |
| | | private BpmCategoryService bpmCategoryService; |
| | | @Resource |
| | | private BpmProcessDefinitionService bpmProcessDefinitionService; |
| | | |
| | | @Override |
| | | public Long createApply(SrmSupplierApplySaveReqVO createReqVO) { |
| | |
| | | @Override |
| | | public void updateApply(SrmSupplierApplySaveReqVO updateReqVO) { |
| | | SrmSupplierApplyDO apply = validateApplyExists(updateReqVO.getId()); |
| | | if (!SupplierApplyStatusEnum.DRAFT.getCode().equals(apply.getApplyStatus())) { |
| | | // ä»
å¾
æäº¤/已驳åå¯ç¼è¾ |
| | | if (!SupplierApplyStatusEnum.DRAFT.getCode().equals(apply.getApplyStatus()) |
| | | && !SupplierApplyStatusEnum.REJECTED.getCode().equals(apply.getApplyStatus())) { |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.APPLY_STATUS_NOT_DRAFT); |
| | | } |
| | | // æ ¡éªï¼å¿
须鿩 SRM ä¾åºåææå¨å¡«åä¾åºååç§° |
| | |
| | | |
| | | @Override |
| | | public void deleteApply(Long id) { |
| | | validateApplyExists(id); |
| | | SrmSupplierApplyDO apply = validateApplyExists(id); |
| | | // ä»
å¾
æäº¤/已驳åå¯å é¤ |
| | | if (!SupplierApplyStatusEnum.DRAFT.getCode().equals(apply.getApplyStatus()) |
| | | && !SupplierApplyStatusEnum.REJECTED.getCode().equals(apply.getApplyStatus())) { |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.APPLY_STATUS_NOT_DRAFT); |
| | | } |
| | | supplierApplyMapper.deleteById(id); |
| | | } |
| | | |
| | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitApply(Long id) { |
| | | public void submitApply(Long id, String processDefinitionKey, Long userId) { |
| | | // 1. æ ¡éªåå¨ + å¾
æäº¤/已驳åç¶æ |
| | | SrmSupplierApplyDO apply = validateApplyExists(id); |
| | | if (!SupplierApplyStatusEnum.DRAFT.getCode().equals(apply.getApplyStatus())) { |
| | | if (!SupplierApplyStatusEnum.DRAFT.getCode().equals(apply.getApplyStatus()) |
| | | && !SupplierApplyStatusEnum.REJECTED.getCode().equals(apply.getApplyStatus())) { |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.APPLY_STATUS_NOT_DRAFT); |
| | | } |
| | | apply.setApplyStatus(SupplierApplyStatusEnum.PENDING_PURCHASE.getCode()); |
| | | apply.setApplyTime(LocalDateTime.now()); |
| | | supplierApplyMapper.updateById(apply); |
| | | // 2. å建 BPM æµç¨å®ä¾ï¼éè´å®¡æ ¸âè´¨éå®¡æ ¸âè´¢å¡å®¡æ ¸ï¼æµç¨ä¸å®¡æ¹äººå¨åååå
Ž
ç½®ï¼ |
| | | String processInstanceId = processInstanceApi.createProcessInstance(userId, |
| | | new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(processDefinitionKey) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | // 3. æ´æ°ç³è¯·ç¶æä¸ºå®¡æ¹ä¸ï¼ååæµç¨å®ä¾ç¼å· |
| | | supplierApplyMapper.updateById(new SrmSupplierApplyDO() |
| | | .setId(id) |
| | | .setApplyStatus(SupplierApplyStatusEnum.PROCESS.getCode()) |
| | | .setProcessInstanceId(processInstanceId)); |
| | | } |
| | | |
| | | @Override |
| | | public List<Map<String, Object>> getSupplierApplyApproveProcessDefinitionList() { |
| | | // 1. æ ¡éªåç±»åæµç¨å®ä¹æ¯å¦åå¨ |
| | | validateSupplierApplyApproveCategoryAndProcessDefinition(); |
| | | |
| | | // 2. è·ååç±»ä¸çæµç¨å®ä¹ä¿¡æ¯ |
| | | List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService |
| | | .getProcessDefinitionInfoListByCategory(SUPPLIER_APPLY_APPROVE_CATEGORY_CODE); |
| | | if (CollUtil.isEmpty(definitionInfoList)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | |
| | | // 3. éåè·åæµç¨å®ä¹è¯¦æ
ï¼è¿æ»¤æ¿æ´»ç¶æï¼ä¿çææ°çæ¬ |
| | | Map<String, ProcessDefinition> latestVersionMap = new HashMap<>(); |
| | | for (BpmProcessDefinitionInfoDO info : definitionInfoList) { |
| | | ProcessDefinition pd = bpmProcessDefinitionService.getProcessDefinition(info.getProcessDefinitionId()); |
| | | if (pd == null || pd.isSuspended()) { |
| | | continue; |
| | | } |
| | | ProcessDefinition existing = latestVersionMap.get(pd.getKey()); |
| | | if (existing == null || pd.getVersion() > existing.getVersion()) { |
| | | latestVersionMap.put(pd.getKey(), pd); |
| | | } |
| | | } |
| | | |
| | | // 4. è¿åæµç¨å®ä¹å表 |
| | | List<Map<String, Object>> result = new ArrayList<>(); |
| | | for (ProcessDefinition pd : latestVersionMap.values()) { |
| | | Map<String, Object> item = new HashMap<>(); |
| | | item.put("id", pd.getId()); |
| | | item.put("key", pd.getKey()); |
| | | item.put("name", pd.getName()); |
| | | result.add(item); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void reviewPurchase(Long id, String opinion, Boolean passed) { |
| | | public void updateSupplierApplyAuditStatus(Long id, Integer bpmResult) { |
| | | // 1. æ ¡éªåå¨ |
| | | SrmSupplierApplyDO apply = validateApplyExists(id); |
| | | if (!SupplierApplyStatusEnum.PENDING_PURCHASE.getCode().equals(apply.getApplyStatus())) { |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.APPLY_STATUS_NOT_PENDING); |
| | | if (!SupplierApplyStatusEnum.PROCESS.getCode().equals(apply.getApplyStatus())) { |
| | | log.warn("[updateSupplierApplyAuditStatus] åå
¥ç³è¯·({}) ä¸å¤äºå®¡æ¹ä¸ç¶æ", id); |
| | | return; |
| | | } |
| | | apply.setPurchaseReviewOpinion(opinion); |
| | | apply.setPurchaseReviewTime(LocalDateTime.now()); |
| | | apply.setApplyStatus(Boolean.TRUE.equals(passed) |
| | | ? SupplierApplyStatusEnum.PENDING_QUALITY.getCode() |
| | | : SupplierApplyStatusEnum.REJECTED.getCode()); |
| | | supplierApplyMapper.updateById(apply); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void reviewQuality(Long id, String opinion, Boolean passed) { |
| | | SrmSupplierApplyDO apply = validateApplyExists(id); |
| | | if (!SupplierApplyStatusEnum.PENDING_QUALITY.getCode().equals(apply.getApplyStatus())) { |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.APPLY_STATUS_NOT_PENDING); |
| | | // 2. æ ¹æ®å®¡æ¹ç»ææ´æ°ç¶æ |
| | | Integer newStatus = convertBpmResultToStatus(bpmResult); |
| | | if (newStatus != null) { |
| | | supplierApplyMapper.updateById(new SrmSupplierApplyDO() |
| | | .setId(id).setApplyStatus(newStatus)); |
| | | } |
| | | apply.setQualityReviewOpinion(opinion); |
| | | apply.setQualityReviewTime(LocalDateTime.now()); |
| | | apply.setApplyStatus(Boolean.TRUE.equals(passed) |
| | | ? SupplierApplyStatusEnum.PENDING_FINANCE.getCode() |
| | | : SupplierApplyStatusEnum.REJECTED.getCode()); |
| | | supplierApplyMapper.updateById(apply); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void reviewFinance(Long id, String opinion, Boolean passed) { |
| | | SrmSupplierApplyDO apply = validateApplyExists(id); |
| | | if (!SupplierApplyStatusEnum.PENDING_FINANCE.getCode().equals(apply.getApplyStatus())) { |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.APPLY_STATUS_NOT_PENDING); |
| | | // 3. 审æ¹éè¿ï¼èªå¨å建/å
³èä¾åºåæ¡£æ¡ |
| | | if (SupplierApplyStatusEnum.APPROVED.getCode().equals(newStatus)) { |
| | | approve(id); |
| | | } |
| | | apply.setFinanceReviewOpinion(opinion); |
| | | apply.setFinanceReviewTime(LocalDateTime.now()); |
| | | apply.setApplyStatus(Boolean.TRUE.equals(passed) |
| | | ? SupplierApplyStatusEnum.APPROVED.getCode() |
| | | : SupplierApplyStatusEnum.REJECTED.getCode()); |
| | | supplierApplyMapper.updateById(apply); |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (supplierApplyMapper.existsApprovedBySupplierId(supplierId)) { |
| | | return; |
| | | } |
| | | // èªå¨å建åå
¥ç³è¯·å¹¶ç´æ¥ç½®ä¸ºå·²éè¿ |
| | | // èªå¨å建åå
¥ç³è¯·å¹¶ç´æ¥ç½®ä¸ºå·²éè¿ï¼å®æ èªå¨åå
¥ï¼ä¸èµ°åååå
¬ï¼ |
| | | SrmSupplierApplyDO apply = new SrmSupplierApplyDO(); |
| | | apply.setApplyNo(generateApplyNo()); |
| | | apply.setSupplierId(supplierId); |
| | |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªä¾åºååå
¥å®¡æ¹åç±»åå¨ |
| | | */ |
| | | private void validateSupplierApplyApproveCategoryAndProcessDefinition() { |
| | | List<BpmCategoryDO> categories = bpmCategoryService.getCategoryListByCode( |
| | | Collections.singletonList(SUPPLIER_APPLY_APPROVE_CATEGORY_CODE)); |
| | | if (CollUtil.isEmpty(categories)) { |
| | | throw ServiceExceptionUtil.exception(ErrorCodeConstants.APPLY_BPM_CATEGORY_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è½¬æ¢ BPM 审æ¹ç»æä¸ºä¸å¡ç¶æ |
| | | */ |
| | | private Integer convertBpmResultToStatus(Integer bpmResult) { |
| | | if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmResult)) { |
| | | return SupplierApplyStatusEnum.APPROVED.getCode(); |
| | | } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmResult)) { |
| | | return SupplierApplyStatusEnum.REJECTED.getCode(); |
| | | } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmResult)) { |
| | | return SupplierApplyStatusEnum.CANCEL.getCode(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * çæç³è¯·ç¼å· |
| | | */ |
| | | private String generateApplyNo() { |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.srm.service.apply.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener; |
| | | import cn.iocoder.yudao.module.srm.service.apply.SrmSupplierApplyService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * ä¾åºååå
¥å®¡æ¹ç¶æçå¬å¨ |
| | | * |
| | | * çå¬ BPM æµç¨å®ä¾ç¶æåæ´äºä»¶ï¼æ´æ°åå
¥ç³è¯·ç审æ¹ç¶æï¼åååå
¬å®¡æ¹åååï¼ |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class SrmSupplierApplyStatusListener extends BpmProcessInstanceStatusEventListener { |
| | | |
| | | /** |
| | | * ä¾åºååå
¥å®¡æ¹æµç¨å®ä¹ Key |
| | | */ |
| | | private static final String PROCESS_DEFINITION_KEY = "supplier_apply_approve"; |
| | | |
| | | @Resource |
| | | private SrmSupplierApplyService supplierApplyService; |
| | | |
| | | @Override |
| | | protected String getProcessDefinitionKey() { |
| | | return PROCESS_DEFINITION_KEY; |
| | | } |
| | | |
| | | @Override |
| | | protected void onEvent(BpmProcessInstanceStatusEvent event) { |
| | | Long applyId; |
| | | try { |
| | | applyId = Long.parseLong(event.getBusinessKey()); |
| | | } catch (NumberFormatException e) { |
| | | log.warn("[onEvent] businessKey({}) 䏿¯ææçåå
¥ç³è¯·ç¼å·", event.getBusinessKey()); |
| | | return; |
| | | } |
| | | |
| | | log.info("[onEvent] æ¶å°BPM审æ¹äºä»¶ï¼applyId={}, status={}", applyId, event.getStatus()); |
| | | |
| | | try { |
| | | supplierApplyService.updateSupplierApplyAuditStatus(applyId, event.getStatus()); |
| | | log.info("[onEvent] åå
¥ç³è¯·({}) 审æ¹ç¶ææ´æ°å®æ", applyId); |
| | | } catch (Exception e) { |
| | | log.error("[onEvent] æ´æ°åå
¥ç³è¯·å®¡æ¹ç¶æå¤±è´¥ï¼applyId={}", applyId, e); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserCreateReqDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserUpdateReqDTO; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | |
| | | Long createUser(AdminUserCreateReqDTO createReqDTO); |
| | | |
| | | /** |
| | | * æ´æ°ç¨æ·ï¼ä¾å
¶ä»æ¨¡ååæ¥æ´æ°ç³»ç»ç¨æ·é¨åä¿¡æ¯ï¼å¦å²ä½/é¨é¨/æµç§°çï¼ |
| | | * |
| | | * @param updateReqDTO ç¨æ·æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateUser(AdminUserUpdateReqDTO updateReqDTO); |
| | | |
| | | /** |
| | | * éè¿ç¨æ· ID æ¥è¯¢ç¨æ· |
| | | * |
| | | * @param id ç¨æ·ID |
| | |
| | | import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserCreateReqDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserUpdateReqDTO; |
| | | import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO; |
| | | import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; |
| | | import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public void updateUser(AdminUserUpdateReqDTO updateReqDTO) { |
| | | UserSaveReqVO updateReqVO = new UserSaveReqVO(); |
| | | updateReqVO.setId(updateReqDTO.getId()); |
| | | updateReqVO.setNickname(updateReqDTO.getNickname()); |
| | | updateReqVO.setDeptId(updateReqDTO.getDeptId()); |
| | | updateReqVO.setPostIds(updateReqDTO.getPostIds()); |
| | | updateReqVO.setRoleIds(updateReqDTO.getRoleIds()); |
| | | updateReqVO.setEmail(updateReqDTO.getEmail()); |
| | | updateReqVO.setRemark(updateReqDTO.getRemark()); |
| | | userService.updateUser(updateReqVO); |
| | | } |
| | | |
| | | @Override |
| | | @DataPermission(enable = false) // å¿½ç¥æ°æ®æéï¼é¿å
å ä¸ºè¿æ»¤ï¼å¯¼è´æ æ³æ¥è¯¢ç¨æ·ã类似ï¼https://github.com/YunaiV/ruoyi-vue-pro/issues/1051 |
| | | public AdminUserRespDTO getUser(Long id) { |
| | | AdminUserDO user = userService.getUser(id); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.system.api.user.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.util.Set; |
| | | |
| | | /** |
| | | * Admin ç¨æ·æ´æ° Request DTO |
| | | * |
| | | * ä¾å
¶ä»æ¨¡ååæ¥æ´æ°ç³»ç»ç¨æ·çé¨åä¿¡æ¯ï¼å¦ HRM åå·¥ç¼è¾æ¶åæ¥å²ä½/é¨é¨çï¼ |
| | | */ |
| | | @Schema(description = "管çåå° - ç¨æ·æ´æ° Request DTO") |
| | | @Data |
| | | public class AdminUserUpdateReqDTO { |
| | | |
| | | @Schema(description = "ç¨æ·ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| | | @NotNull(message = "ç¨æ·ç¼å·ä¸è½ä¸ºç©º") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç¨æ·æµç§°", example = "å¼ ä¸") |
| | | private String nickname; |
| | | |
| | | @Schema(description = "é¨é¨ç¼å·", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "å²ä½ç¼å·æ°ç»", example = "[1, 2]") |
| | | private Set<Long> postIds; |
| | | |
| | | @Schema(description = "è§è²ç¼å·æ°ç»", example = "[1, 2]") |
| | | private Set<Long> roleIds; |
| | | |
| | | @Schema(description = "ç¨æ·é®ç®±", example = "zhangsan@example.com") |
| | | private String email; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_POST_NOT_EMPTY; |
| | | |
| | | @Tag(name = "管çåå° - ç¨æ·") |
| | | @RestController |
| | |
| | | @Operation(summary = "æ°å¢ç¨æ·") |
| | | @PreAuthorize("@ss.hasPermission('system:user:create')") |
| | | public CommonResult<Long> createUser(@Valid @RequestBody UserSaveReqVO reqVO) { |
| | | // æ ¡éªå²ä½å¿
å¡« |
| | | if (CollUtil.isEmpty(reqVO.getPostIds())) { |
| | | throw exception(USER_POST_NOT_EMPTY); |
| | | } |
| | | Long id = userService.createUser(reqVO); |
| | | return success(id); |
| | | } |
| | |
| | | @Operation(summary = "ä¿®æ¹ç¨æ·") |
| | | @PreAuthorize("@ss.hasPermission('system:user:update')") |
| | | public CommonResult<Boolean> updateUser(@Valid @RequestBody UserSaveReqVO reqVO) { |
| | | // æ ¡éªå²ä½å¿
å¡« |
| | | if (CollUtil.isEmpty(reqVO.getPostIds())) { |
| | | throw exception(USER_POST_NOT_EMPTY); |
| | | } |
| | | userService.updateUser(reqVO); |
| | | return success(true); |
| | | } |
| | |
| | | ErrorCode USER_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_002_003_004, "导å
¥ç¨æ·æ°æ®ä¸è½ä¸ºç©ºï¼"); |
| | | ErrorCode USER_PASSWORD_FAILED = new ErrorCode(1_002_003_005, "ç¨æ·å¯ç æ ¡éªå¤±è´¥"); |
| | | ErrorCode USER_IS_DISABLE = new ErrorCode(1_002_003_006, "åå为ã{}ãçç¨æ·å·²è¢«ç¦ç¨"); |
| | | ErrorCode USER_POST_NOT_EMPTY = new ErrorCode(1_002_003_007, "å²ä½ä¸è½ä¸ºç©º"); |
| | | ErrorCode USER_COUNT_MAX = new ErrorCode(1_002_003_008, "åå»ºç¨æ·å¤±è´¥ï¼åå ï¼è¶
è¿ç§æ·æå¤§ç§æ·é
é¢({})ï¼"); |
| | | ErrorCode USER_IMPORT_INIT_PASSWORD = new ErrorCode(1_002_003_009, "åå§å¯ç ä¸è½ä¸ºç©º"); |
| | | ErrorCode USER_MOBILE_NOT_EXISTS = new ErrorCode(1_002_003_010, "è¯¥ææºå·å°æªæ³¨å"); |