docs/process_param_bind_feedback_integration.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,194 @@ # åºç¡åæ°ä¸å·¥åºç»å® + æ¥å·¥å¡«ååæ°åæ®µ - å端èè°æ¹æ¡ ## éæ±èæ¯ - åºç¡åæ°ï¼å·¥èºåæ°ï¼èåãå·¥èºè®¾è®¡ â åºç¡åæ°ãï¼åæ¬æ æ³ä¸ãå·¥åºãç´æ¥ç»å®ã - æ¬æ¬¡å®ç°ï¼**å·¥åºä¸»æ°æ®å¯ç»å®åºç¡åæ°**ï¼ä»»å¡æ åæ°æ¨¡æ¿æ¶ï¼çæä»»å¡ä¼æå·¥åºç»å®çåæ°èªå¨åºååæ°å¿«ç §ï¼**æ¥å·¥æ¶å¿ 须填åç»å®çåæ°åæ®µ**ï¼å¿ å¡«åæ°å¼ºæ ¡éªï¼ï¼æ¥å·¥è¯¦æ /åè¡¨åæ¾åæ°å¼ã ## æ¶åé¡µé¢ 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`ã docs/sql/mes_process_param_bind_full.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,145 @@ -- ============================================================================ -- éæ±ï¼åºç¡åæ°(å·¥èºåæ°)å¯ä¸å·¥åºç»å®ï¼ç»å®åæ¥å·¥éå¡«ååæ°åæ®µ -- ä¸é®æ´åèæ¬ï¼å¯ç´æ¥æå¨æ§è¡ï¼å«å¹çä¿æ¤ï¼é夿§è¡ä¸æ¥éï¼ -- -- 第ä¸é¨åï¼åè½è¿ç§»ï¼å·¥åº-åæ°ç»å®ï¼ -- 第äºé¨åï¼æ´»åºæ¼ç§»ä¿®å¤ï¼ä»£ç å·²å¼ç¨ä½åºç¼ºå¤±çå/表ï¼éè¡¥é½æè½å»ºä»»å¡/æ¥å·¥ï¼ -- ============================================================================ -- ============================================================================ -- 第ä¸é¨åï¼åè½è¿ç§» -- ============================================================================ -- ---------- 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'; -- ============================================================================ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java
@@ -59,10 +59,15 @@ 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; @@ -109,6 +114,10 @@ private MesWmItemConsumeLineMapper itemConsumeLineMapper; @Resource private MesQcIpqcMapper ipqcMapper; @Resource private MesProWorkOrderParamRecordMapper paramRecordMapper; @Resource private MesProWorkOrderParamRecordDetailMapper paramRecordDetailMapper; @PostMapping("/create") @Operation(summary = "å建ç产æ¥å·¥") @@ -287,6 +296,28 @@ 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 -> { @@ -320,6 +351,22 @@ 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()); } }); } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackRespVO.java
@@ -10,6 +10,7 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @Schema(description = "管çåå° - MES ç产æ¥å·¥ Response VO") @Data @@ -177,4 +178,34 @@ @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; } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/process/MesProProcessParamController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,111 @@ 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())); }) ); } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/process/vo/param/MesProProcessParamRespVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,57 @@ 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; } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/process/vo/param/MesProProcessParamSaveReqVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,37 @@ 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; } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/process/MesProProcessParamDO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,56 @@ 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; } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderParamRecordDetailDO.java
@@ -55,6 +55,10 @@ */ private Integer paramType; /** * æ¯å¦å¿ å¡«ï¼å¿«ç §ï¼ */ private Boolean required; /** * 计éåä½ç¼å·ï¼å¿«ç §ï¼ */ private Long unitMeasureId; yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/process/MesProProcessParamMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,49 @@ 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)); } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderParamRecordMapper.java
@@ -7,6 +7,7 @@ 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; /** @@ -40,4 +41,10 @@ .orderByDesc(MesProWorkOrderParamRecordDO::getId)); } default List<MesProWorkOrderParamRecordDO> selectListByTaskIds(Collection<Long> taskIds) { return selectList(new LambdaQueryWrapperX<MesProWorkOrderParamRecordDO>() .in(MesProWorkOrderParamRecordDO::getTaskId, taskIds) .orderByAsc(MesProWorkOrderParamRecordDO::getId)); } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pd/processparam/MesPdProcessParamServiceImpl.java
@@ -35,6 +35,10 @@ @Lazy private MesMdAutoCodeRecordService autoCodeRecordService; @Resource @Lazy private cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessParamService processParamService; @Override public Long createProcessParam(MesPdProcessParamSaveReqVO createReqVO) { // çæåæ°ç¼ç @@ -60,6 +64,8 @@ public void deleteProcessParam(Long id) { // æ ¡éªåå¨ validateProcessParamExists(id); // å é¤å·¥åºç»å®å ³ç³»ï¼é¿å æ®çèæ°æ® processParamService.deleteByParamId(id); // å é¤ processParamMapper.deleteById(id); } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
@@ -104,6 +104,7 @@ 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); @@ -113,11 +114,13 @@ .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()); @@ -128,11 +131,14 @@ 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, yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessParamService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,55 @@ 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); } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessParamServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,86 @@ 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); } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java
@@ -12,6 +12,7 @@ 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; @@ -24,6 +25,7 @@ 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; @@ -111,6 +113,9 @@ @Lazy private MesProWorkOrderParamRecordService workOrderParamRecordService; @Resource @Lazy private MesProProcessParamService processParamService; @Resource private MesMdAutoCodeRecordService autoCodeRecordService; @Resource private MesMdWorkstationMachineService workstationMachineService; @@ -150,14 +155,28 @@ } // 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 @@ -498,9 +517,8 @@ .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. æ´æ°å·¥åå·²æäº§æ°é yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordService.java
@@ -3,6 +3,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; @@ -30,6 +31,15 @@ Long createTaskParamRecord(Long taskId, Long templateId); /** * æ ¹æ®å·¥åºç»å®çå·¥èºåæ°ä¸ºç产任å¡åºååæ°å¿«ç §ï¼æ æ¨¡æ¿æ¶çåéè·¯å¾ï¼ * * @param taskId ä»»å¡ç¼å· * @param processParams å·¥åºç»å®çå·¥èºåæ°å表 * @return è®°å½ç¼å· */ Long createTaskParamRecordFromProcessParams(Long taskId, List<MesProProcessParamDO> processParams); /** * æ´æ°å·¥ååæ°è®°å½ï¼ä» æ´æ°å¡«åå¼ï¼ä¸æ¢æ¨¡æ¿ï¼ * * @param updateReqVO æ´æ°ä¿¡æ¯ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordServiceImpl.java
@@ -5,14 +5,17 @@ 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; @@ -22,6 +25,7 @@ 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; @@ -46,6 +50,8 @@ private MesProWorkOrderService workOrderService; @Resource private MesPdProcessParamTemplateService templateService; @Resource private MesPdProcessParamService pdProcessParamService; @Autowired private MesProTaskService mesProTaskService; @Autowired @@ -80,10 +86,57 @@ .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(); } @@ -139,6 +192,7 @@ .paramCode(templateDetail.getParamCode()) .paramName(templateDetail.getParamName()) .paramType(templateDetail.getParamType()) .required(templateDetail.getRequired()) .unitMeasureId(templateDetail.getUnitMeasureId()) .paramValue(item.getParamValue()) .build(); @@ -194,6 +248,7 @@ .paramCode(templateDetail.getParamCode()) .paramName(templateDetail.getParamName()) .paramType(templateDetail.getParamType()) .required(templateDetail.getRequired()) .unitMeasureId(templateDetail.getUnitMeasureId()) .paramValue(item.getParamValue()) .build(); @@ -230,22 +285,38 @@ @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); } }