From 26094cffde1b85f3d627f9038594b39c32203b76 Mon Sep 17 00:00:00 2001
From: hsy <1029150275@qq.com>
Date: 星期三, 26 八月 2026 17:13:59 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_business' into dev_business

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java           |    1 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java                            |   23 +++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessSaveReqVO.java |    3 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java          |   14 ++
 yudao-module-ai/pom.xml                                                                                                           |  148 --------------------
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskSaveReqVO.java                  |    3 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordService.java           |   10 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java   |    4 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordServiceImpl.java       |   59 ++++++++
 docs/sql/mes_pro_task_process_param.sql                                                                                           |   10 +
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskDO.java                              |    4 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java                    |   16 ++
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessRespVO.java    |    3 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/route/MesProRouteProcessDO.java                     |    4 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderProcessDO.java             |    4 
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderParamRecordMapper.java          |    7 +
 docs/mes_pro_task_process_param_integration.md                                                                                    |   64 +++++++++
 yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/config/AiAutoConfiguration.java                             |    9 -
 18 files changed, 231 insertions(+), 155 deletions(-)

diff --git a/docs/mes_pro_task_process_param_integration.md b/docs/mes_pro_task_process_param_integration.md
new file mode 100644
index 0000000..d6b7c2a
--- /dev/null
+++ b/docs/mes_pro_task_process_param_integration.md
@@ -0,0 +1,64 @@
+# 鐢熶骇浠诲姟宸ヨ壓鍙傛暟 - 鍓嶇鑱旇皟鏂规
+
+## 娑夊強椤甸潰
+
+- 宸ヨ壓璺嚎宸ュ簭缁存姢
+- 鐢熶骇鎺掍骇浠诲姟鏂板銆佺紪杈戝拰璇︽儏
+- 鐢熶骇鎶ュ伐鏂板銆佺紪杈戝拰璇︽儏
+- 宸ュ崟鍙傛暟璁板綍鏌ヨ
+
+## 涓氬姟娴佺▼涓庢暟鎹甫鍏�
+
+1. 宸ヨ壓璺嚎宸ュ簭鍙�夋嫨宸ヨ壓鍙傛暟妯℃澘锛屾ā鏉跨紪鍙烽殢璺嚎宸ュ簭淇濆瓨銆�
+2. 鑷姩鎺掍骇鏍规嵁宸ュ崟宸ュ簭鎴栬矾绾垮伐搴忕敓鎴愮敓浜т换鍔★紝骞跺皢鍙傛暟妯℃澘缂栧彿甯﹀叆浠诲姟銆�
+3. 浠诲姟鐢熸垚鏃讹紝绯荤粺澶嶅埗妯℃澘鍙婃槑缁嗗揩鐓у埌浠诲姟鍙傛暟璁板綍锛涘悗缁ā鏉夸慨鏀逛笉褰卞搷璇ヤ换鍔″揩鐓с��
+4. 鎶ュ伐浠ヤ换鍔′负鏍稿績锛屽弬鏁板�兼寜浠诲姟鍙傛暟璁板綍鏄庣粏缂栧彿鎻愪氦骞朵繚瀛橈紱鏃犳ā鏉夸换鍔′粛鍙甯告姤宸ャ��
+5. 鎶ュ伐瀹℃壒銆佽川妫�鍥炶皟鍜屾暟閲忓洖鍐欎笉閲嶆柊璇诲彇妯℃澘锛屽巻鍙插弬鏁板�间繚鎸佷笉鍙樸��
+
+## API
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|---|---|---|
+| POST | `/mes/pro/route-process/create` | 鏂板璺嚎宸ュ簭锛屽彲淇濆瓨 `paramTemplateId` |
+| PUT | `/mes/pro/route-process/update` | 淇敼璺嚎宸ュ簭鍙婂弬鏁版ā鏉� |
+| POST | `/mes/pro/task/create` | 鎵嬪伐鍒涘缓浠诲姟锛屽彲浼� `paramTemplateId` |
+| POST | `/mes/pro/task/auto-generate` | 鑷姩鎺掍骇锛屼换鍔$户鎵垮伐鍗曞伐搴忔垨璺嚎宸ュ簭鐨勬ā鏉� |
+| POST | `/mes/pro/feedback/create` | 鍒涘缓鎶ュ伐锛屽彲鎻愪氦 `paramValues` |
+| PUT | `/mes/pro/feedback/update` | 淇敼鑽夌鎶ュ伐鍙婂弬鏁板�� |
+| POST | `/mes/pro/feedback/submit` | 鎻愪氦鎶ュ伐锛岃繘鍏ュ鎵规垨鐩存帴瀹屾垚 |
+
+### 鍙傛暟瀛楁
+
+| 瀛楁 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|---|---|---|---|
+| `paramTemplateId` | Long | 鍚� | 浠诲姟鎴栬矾绾垮伐搴忎娇鐢ㄧ殑宸ヨ壓鍙傛暟妯℃澘缂栧彿 |
+| `paramValues` | Array | 鍚� | 鎶ュ伐濉啓鐨勫弬鏁板�硷紱鏃犳ā鏉挎椂涓嶄紶 |
+| `paramValues[].detailId` | Long | 鏄紙浼犲叆鏃讹級 | 浠诲姟鍙傛暟璁板綍鏄庣粏缂栧彿锛屼笉鏄ā鏉挎槑缁嗙紪鍙� |
+| `paramValues[].value` | String | 鍚� | 鏈鎶ュ伐鍙傛暟鍊� |
+
+## 瀛楁灞曠ず瑙勫垯
+
+| 瀛楁 | 灞曠ず浣嶇疆 | 璇存槑 |
+|---|---|---|
+| `paramTemplateId` | 璺嚎宸ュ簭銆佷换鍔¤鎯� | 灞曠ず褰撳墠浠诲姟閲囩敤鐨勫弬鏁版ā鏉� |
+| 鍙傛暟缂栫爜銆佸悕绉般�佺被鍨嬨�佸崟浣� | 浠诲姟鍙傛暟璁板綍銆佹姤宸ヨ〃鍗� | 浠庝换鍔″揩鐓ц鍙栵紝涓嶇洿鎺ュ洖鏌ユā鏉� |
+| 鍙傛暟鍊� | 鎶ュ伐琛ㄥ崟銆佹姤宸ヨ鎯呫�佸巻鍙茶褰� | 淇濆瓨鍒板弬鏁拌褰曟槑缁嗭紝灞曠ず宸蹭繚瀛樺�� |
+| `firstFeedbackTime`銆乣lastFeedbackTime` | 浠诲姟璇︽儏 | 棣栨鍜屾渶杩戜竴娆℃寮忔姤宸ユ椂闂� |
+
+## 涓氬姟瑙勫垯璇存槑
+
+| 鍦烘櫙 | 瑙勫垯 |
+|---|---|
+| 鏃犲弬鏁版ā鏉� | 浠诲姟姝e父鐢熸垚锛屾姤宸ヤ笉瑕佹眰鍙傛暟鍊� |
+| 鏈夊弬鏁版ā鏉� | 浠诲姟鐢熸垚鏃跺浐鍖栨ā鏉挎槑缁嗗揩鐓э紝鎶ュ伐鎸変换鍔℃槑缁嗗~鍐欏弬鏁� |
+| 妯℃澘鍚庣画淇敼 | 涓嶅奖鍝嶅凡鏈変换鍔″弬鏁板揩鐓у拰宸插~鍐欐姤宸ュ�� |
+| 鍙傛暟鏄庣粏缂栧彿涓嶅睘浜庡綋鍓嶄换鍔� | 鍚庣鎷掔粷淇濆瓨 |
+| 瀹℃壒鎴栬川妫�鍥炶皟 | 鍙鐞嗘姤宸ュ拰鐢熶骇鏁伴噺锛屼笉閲嶆柊鐢熸垚鍙傛暟璁板綍 |
+| 姝e紡鎶ュ伐鍚� | 浠诲姟鍙傛暟浣滀负鍘嗗彶璁板綍淇濈暀锛屼笉瑕嗙洊鍘熷揩鐓� |
+
+## 娉ㄦ剰浜嬮」
+
+- 鎶ュ伐椤甸潰搴斿厛鏍规嵁浠诲姟鍙傛暟璁板綍鑾峰彇鍙傛暟瀹氫箟锛屽啀浠ユ槑缁� `detailId` 鎻愪氦鍊笺��
+- 涓嶈灏嗘ā鏉挎槑缁嗙紪鍙峰綋浣滄姤宸ュ弬鏁版槑缁嗙紪鍙蜂娇鐢ㄣ��
+- 鏁板�笺�佹棩鏈熴�佸竷灏旂瓑鍙傛暟鐨勮緭鍏ユ牸寮忓簲涓庡弬鏁扮被鍨嬩繚鎸佷竴鑷淬��
+- `paramValues` 涓虹┖涓嶄唬琛ㄥ垹闄ゅ弬鏁拌褰曪紱娌℃湁妯℃澘鐨勪换鍔℃墠涓嶇敓鎴愬弬鏁拌褰曘��
diff --git a/docs/sql/mes_pro_task_process_param.sql b/docs/sql/mes_pro_task_process_param.sql
new file mode 100644
index 0000000..2696448
--- /dev/null
+++ b/docs/sql/mes_pro_task_process_param.sql
@@ -0,0 +1,10 @@
+-- MES 鐢熶骇浠诲姟涓庡伐鑹哄弬鏁版ā鏉垮叧鑱�
+-- 鎵ц鍓嶈纭瀛楁涓嶅瓨鍦紱MySQL 涓嶆敮鎸� ALTER TABLE ADD COLUMN IF NOT EXISTS銆�
+ALTER TABLE mes_pro_task ADD COLUMN param_template_id bigint DEFAULT NULL COMMENT '宸ヨ壓鍙傛暟妯℃澘缂栧彿' AFTER process_id;
+ALTER TABLE mes_pro_route_process ADD COLUMN param_template_id bigint DEFAULT NULL COMMENT '宸ヨ壓鍙傛暟妯℃澘缂栧彿' AFTER process_id;
+ALTER TABLE mes_pro_work_order_process ADD COLUMN param_template_id bigint DEFAULT NULL COMMENT '宸ヨ壓鍙傛暟妯℃澘缂栧彿' AFTER process_id;
+
+CREATE INDEX idx_mes_pro_work_order_param_record_task_id
+    ON mes_pro_work_order_param_record (task_id);
+CREATE INDEX idx_mes_pro_work_order_param_record_detail_record_id
+    ON mes_pro_work_order_param_record_detail (record_id);
diff --git a/yudao-module-ai/pom.xml b/yudao-module-ai/pom.xml
index fda0405..1a904ed 100644
--- a/yudao-module-ai/pom.xml
+++ b/yudao-module-ai/pom.xml
@@ -20,9 +20,6 @@
     </description>
     <properties>
         <spring-ai.version>2.0.0</spring-ai.version>
-        <!-- https://mvnrepository.com/artifact/com.alibaba.cloud.ai/spring-ai-alibaba -->
-        <alibaba-ai.version>2.0.0-M1.1</alibaba-ai.version>
-        <tinyflow.version>1.2.6</tinyflow.version>
     </properties>
 
     <dependencies>
@@ -36,12 +33,6 @@
             <artifactId>yudao-module-system</artifactId>
             <version>${revision}</version>
         </dependency>
-        <dependency>
-            <groupId>cn.iocoder.boot</groupId>
-            <artifactId>yudao-module-infra</artifactId>
-            <version>${revision}</version>
-        </dependency>
-
         <!-- 涓氬姟缁勪欢 -->
 
         <dependency>
@@ -61,25 +52,7 @@
             <artifactId>yudao-spring-boot-starter-mybatis</artifactId>
         </dependency>
 
-        <!-- Job 鐩稿叧 -->
-        <dependency>
-            <groupId>cn.iocoder.boot</groupId>
-            <artifactId>yudao-spring-boot-starter-job</artifactId>
-        </dependency>
-
-        <!-- Test 娴嬭瘯鐩稿叧 -->
-        <dependency>
-            <groupId>cn.iocoder.boot</groupId>
-            <artifactId>yudao-spring-boot-starter-test</artifactId>
-        </dependency>
-
-        <!-- 宸ュ叿绫荤浉鍏� -->
-        <dependency>
-            <groupId>cn.iocoder.boot</groupId>
-            <artifactId>yudao-spring-boot-starter-excel</artifactId>
-        </dependency>
-
-        <!-- Spring AI Model 妯″瀷鎺ュ叆 -->
+        <!-- Spring AI 妯″瀷鎺ュ叆锛氱粺涓�璧� OpenAI 鍏煎鎺ュ彛锛圖eepSeek/閫氫箟鍗冮棶绛夛級 -->
         <dependency>
             <groupId>org.springframework.ai</groupId>
             <artifactId>spring-ai-starter-model-openai</artifactId>
@@ -91,50 +64,7 @@
                 </exclusion>
             </exclusions>
         </dependency>
-        <dependency>
-            <groupId>org.springframework.ai</groupId>
-            <artifactId>spring-ai-starter-model-anthropic</artifactId>
-            <version>${spring-ai.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.ai</groupId>
-            <artifactId>spring-ai-starter-model-deepseek</artifactId>
-            <version>${spring-ai.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.ai</groupId>
-            <artifactId>spring-ai-starter-model-google-genai</artifactId>
-            <version>${spring-ai.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.ai</groupId>
-            <artifactId>spring-ai-starter-model-ollama</artifactId>
-            <version>${spring-ai.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.ai</groupId>
-            <artifactId>spring-ai-starter-model-stability-ai</artifactId>
-            <version>${spring-ai.version}</version>
-        </dependency>
-        <!-- 鍚戦噺瀛樺偍锛歨ttps://db-engines.com/en/ranking/vector+dbms -->
-        <dependency>
-            <!-- Qdrant锛歨ttps://qdrant.tech/ -->
-            <groupId>org.springframework.ai</groupId>
-            <artifactId>spring-ai-starter-vector-store-qdrant</artifactId>
-            <version>${spring-ai.version}</version>
-        </dependency>
-
-        <dependency>
-            <!-- Redis锛歨ttps://redis.io/docs/latest/develop/get-started/vector-database/ -->
-            <groupId>org.springframework.ai</groupId>
-            <artifactId>spring-ai-starter-vector-store-redis</artifactId>
-            <version>${spring-ai.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>cn.iocoder.boot</groupId>
-            <artifactId>yudao-spring-boot-starter-redis</artifactId>
-        </dependency>
-
+        <!-- Milvus 鍚戦噺瀛樺偍 -->
         <dependency>
             <!-- Milvus锛歨ttps://milvus.io/ -->
             <groupId>org.springframework.ai</groupId>
@@ -174,80 +104,6 @@
             <version>5.4.0</version>
         </dependency>
 
-        <!-- MCP 鐩稿叧 -->
-        <!--
-            鐗规畩璇存槑锛氫笉鑳戒娇鐢� spring-ai-starter-mcp-server-webflux 鎴� spring-ai-starter-mcp-client-webflux 锛侊紒锛�
-            鍘熷洜锛氶」鐩娇鐢ㄤ簡 SpringMVC锛岃�屼笉鏄� WebFlux銆傚紩鍏ヤ笂杩� 2 涓紝浼氬鑷� SSE Server 澶辨晥銆�
-        -->
-        <dependency>
-            <!-- 鏈嶅姟绔� -->
-            <groupId>org.springframework.ai</groupId>
-            <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
-            <version>${spring-ai.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>io.swagger.core.v3</groupId>
-                    <artifactId>swagger-annotations-jakarta</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.ai</groupId>
-            <artifactId>spring-ai-autoconfigure-mcp-server-common</artifactId>
-            <version>${spring-ai.version}</version>
-        </dependency>
-        <dependency>
-            <!-- 瀹㈡埛绔� -->
-            <groupId>org.springframework.ai</groupId>
-            <artifactId>spring-ai-starter-mcp-client</artifactId>
-            <version>${spring-ai.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.ai</groupId>
-            <artifactId>spring-ai-autoconfigure-mcp-client-common</artifactId>
-            <version>${spring-ai.version}</version>
-        </dependency>
-
-        <!-- TinyFlow锛欰I 宸ヤ綔娴� -->
-        <dependency>
-            <groupId>dev.tinyflow</groupId>
-            <artifactId>tinyflow-java-core</artifactId>
-            <version>${tinyflow.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.jfinal</groupId>
-                    <artifactId>enjoy</artifactId>
-                </exclusion>
-                <exclusion>
-                    <!-- 瑙e喅 https://gitee.com/zhijiantianya/ruoyi-vue-pro/pulls/1318/ 闂 -->
-                    <groupId>com.agentsflex</groupId>
-                    <artifactId>agents-flex-store-elasticsearch</artifactId>
-                </exclusion>
-                <exclusion>
-                    <!-- 瑙e喅 https://t.zsxq.com/pCBZC 闂 -->
-                    <groupId>com.agentsflex</groupId>
-                    <artifactId>agents-flex-search-engine-es</artifactId>
-                </exclusion>
-                <exclusion>
-                    <!-- TODO @鑺嬭壙锛氭殏鏃剁Щ闄� groovy锛屽拰 iot 鍐茬獊 -->
-                    <groupId>org.codehaus.groovy</groupId>
-                    <artifactId>groovy-all</artifactId>
-                </exclusion>
-                <!-- 瑙e喅鍜� logback 鐨勬棩蹇楀啿绐� -->
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-simple</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.logging.log4j</groupId>
-                    <artifactId>log4j-slf4j-impl</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-reload4j</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
     </dependencies>
 
 </project>
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/config/AiAutoConfiguration.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/config/AiAutoConfiguration.java
index 7f22950..9ae280b 100644
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/config/AiAutoConfiguration.java
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/config/AiAutoConfiguration.java
@@ -13,11 +13,8 @@
 import org.springframework.ai.openai.OpenAiChatOptions;
 import org.springframework.ai.openai.OpenAiEmbeddingModel;
 import org.springframework.ai.openai.OpenAiEmbeddingOptions;
-import org.springframework.ai.retry.RetryUtils;
 import org.springframework.ai.tokenizer.JTokkitTokenCountEstimator;
 import org.springframework.ai.tokenizer.TokenCountEstimator;
-import org.springframework.ai.vectorstore.qdrant.autoconfigure.QdrantVectorStoreProperties;
-import org.springframework.ai.vectorstore.redis.autoconfigure.RedisVectorStoreProperties;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -30,11 +27,7 @@
  * 鍚戦噺搴撻厤缃 yudao.ai.vector-store 鑺傜偣锛屼笉鍐嶄緷璧� Spring AI 鐨� Milvus 鑷姩閰嶇疆灞炴��
  */
 @Configuration
-@EnableConfigurationProperties({
-        YudaoAiProperties.class,
-        QdrantVectorStoreProperties.class,
-        RedisVectorStoreProperties.class
-})
+@EnableConfigurationProperties(YudaoAiProperties.class)
 @Slf4j
 public class AiAutoConfiguration {
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java
index 6c758eb..0b6ba8a 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java
@@ -5,6 +5,7 @@
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 @Schema(description = "绠$悊鍚庡彴 - MES 蹇�熸姤宸� Request VO")
 @Data
@@ -24,6 +25,9 @@
     @Schema(description = "涓嶈壇鍝佹暟閲�", example = "2")
     private BigDecimal unqualifiedQuantity;
 
+    @Schema(description = "宸ヨ壓鍙傛暟鍊�")
+    private List<MesProFeedbackSaveReqVO.ParamValue> paramValues;
+
     @Schema(description = "澶囨敞", example = "蹇�熸姤宸�")
     private String remark;
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java
index 2deb3fd..ce71bf4 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java
@@ -6,6 +6,7 @@
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Schema(description = "绠$悊鍚庡彴 - MES 鐢熶骇鎶ュ伐鏂板/淇敼 Request VO")
 @Data
@@ -84,6 +85,19 @@
     @NotNull(message = "瀹℃牳浜轰笉鑳戒负绌�")
     private Long approveUserId;
 
+    @Schema(description = "宸ヨ壓鍙傛暟鍊�")
+    private List<ParamValue> paramValues;
+
+    @Data
+    public static class ParamValue {
+        @Schema(description = "浠诲姟鍙傛暟璁板綍鏄庣粏缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED)
+        @NotNull(message = "鍙傛暟鏄庣粏涓嶈兘涓虹┖")
+        private Long detailId;
+
+        @Schema(description = "鍙傛暟鍊�")
+        private String value;
+    }
+
     @Schema(description = "澶囨敞", example = "澶囨敞")
     private String remark;
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessRespVO.java
index 935d463..1966158 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessRespVO.java
@@ -19,6 +19,9 @@
     @Schema(description = "宸ュ簭缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private Long processId;
 
+    @Schema(description = "宸ヨ壓鍙傛暟妯℃澘缂栧彿", example = "1")
+    private Long paramTemplateId;
+
     @Schema(description = "宸ュ簭缂栫爜")
     private String processCode;
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessSaveReqVO.java
index 17f71e2..4df7990 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessSaveReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/route/vo/process/MesProRouteProcessSaveReqVO.java
@@ -21,6 +21,9 @@
     @NotNull(message = "宸ュ簭缂栧彿涓嶈兘涓虹┖")
     private Long processId;
 
+    @Schema(description = "宸ヨ壓鍙傛暟妯℃澘缂栧彿", example = "1")
+    private Long paramTemplateId;
+
     @Schema(description = "搴忓彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     @NotNull(message = "搴忓彿涓嶈兘涓虹┖")
     private Integer sort;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskSaveReqVO.java
index 82cdb6b..f089a13 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskSaveReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskSaveReqVO.java
@@ -28,6 +28,9 @@
     @Schema(description = "宸ュ簭缂栧彿", example = "1")
     private Long processId; // 缂栬緫鏃讹紝鍙笉浼犻��
 
+    @Schema(description = "宸ヨ壓鍙傛暟妯℃澘缂栧彿", example = "1")
+    private Long paramTemplateId;
+
     @Schema(description = "浜у搧鐗╂枡缂栧彿", example = "100")
     private Long itemId; // 缂栬緫鏃讹紝鍙笉浼犻��
 
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/route/MesProRouteProcessDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/route/MesProRouteProcessDO.java
index 99dd4d0..2ab2669 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/route/MesProRouteProcessDO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/route/MesProRouteProcessDO.java
@@ -41,6 +41,10 @@
      */
     private Long processId;
     /**
+     * 宸ヨ壓鍙傛暟妯℃澘缂栧彿
+     */
+    private Long paramTemplateId;
+    /**
      * 搴忓彿
      */
     private Integer sort;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskDO.java
index 9adcf53..edea2e0 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskDO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/task/MesProTaskDO.java
@@ -69,6 +69,10 @@
      */
     private Long processId;
     /**
+     * 宸ヨ壓鍙傛暟妯℃澘缂栧彿
+     */
+    private Long paramTemplateId;
+    /**
      * 浜у搧鐗╂枡缂栧彿
      *
      * 鍏宠仈 {@link MesMdItemDO#getId()}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderProcessDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderProcessDO.java
index 4ca8b28..8f34075 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderProcessDO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkOrderProcessDO.java
@@ -40,6 +40,10 @@
      */
     private Long processId;
     /**
+     * 宸ヨ壓鍙傛暟妯℃澘缂栧彿
+     */
+    private Long paramTemplateId;
+    /**
      * 搴忓彿
      */
     private Integer sort;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderParamRecordMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderParamRecordMapper.java
index adbefc4..69dfec2 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderParamRecordMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderParamRecordMapper.java
@@ -27,6 +27,13 @@
                 .orderByDesc(MesProWorkOrderParamRecordDO::getId));
     }
 
+    default MesProWorkOrderParamRecordDO selectFirstByTaskId(Long taskId) {
+        return selectOne(new LambdaQueryWrapperX<MesProWorkOrderParamRecordDO>()
+                .eq(MesProWorkOrderParamRecordDO::getTaskId, taskId)
+                .orderByAsc(MesProWorkOrderParamRecordDO::getId)
+                .last("LIMIT 1"));
+    }
+
     default List<MesProWorkOrderParamRecordDO> selectListByWorkOrderId(Long workOrderId) {
         return selectList(new LambdaQueryWrapperX<MesProWorkOrderParamRecordDO>()
                 .eq(MesProWorkOrderParamRecordDO::getWorkOrderId, workOrderId)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
index 3d3022f..e8fdc37 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
@@ -29,6 +29,7 @@
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
+import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderParamRecordService;
 import cn.iocoder.yudao.module.mes.service.wm.itemconsume.MesWmItemConsumeService;
 import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService;
 import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceService;
@@ -72,6 +73,9 @@
     @Resource
     private MesProWorkOrderService workOrderService;
     @Resource
+    @Lazy
+    private MesProWorkOrderParamRecordService paramRecordService;
+    @Resource
     private MesProRouteProcessService routeProcessService;
     @Resource
     private MesProWorkOrderBomService workOrderBomService;
@@ -109,6 +113,7 @@
                 .setStatus(MesProFeedbackStatusEnum.PREPARE.getStatus())
                 .setItemId(task.getItemId());
         feedbackMapper.insert(feedback);
+        saveParamValues(task.getId(), createReqVO.getParamValues());
         return feedback.getId();
     }
 
@@ -123,6 +128,16 @@
         MesProFeedbackDO updateObj = BeanUtils.toBean(updateReqVO, MesProFeedbackDO.class)
                 .setItemId(task.getItemId());
         feedbackMapper.updateById(updateObj);
+        saveParamValues(task.getId(), updateReqVO.getParamValues());
+    }
+
+    private void saveParamValues(Long taskId, List<MesProFeedbackSaveReqVO.ParamValue> paramValues) {
+        if (CollUtil.isEmpty(paramValues)) {
+            return;
+        }
+        paramRecordService.updateTaskParamValues(taskId,
+                paramValues.stream().map(MesProFeedbackSaveReqVO.ParamValue::getDetailId).toList(),
+                paramValues.stream().map(MesProFeedbackSaveReqVO.ParamValue::getValue).toList());
     }
 
     @Override
@@ -509,6 +524,7 @@
                 .setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus())
                 .setRemark(reqVO.getRemark());
         feedbackMapper.insert(feedback);
+        saveParamValues(task.getId(), reqVO.getParamValues());
         // 5. 杩斿洖缁撴灉
         MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(task.getWorkOrderId());
         return new MesProFeedbackQuickCreateRespVO()
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java
index d13aa2c..5f82736 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java
@@ -33,6 +33,7 @@
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO;
 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService;
+import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderParamRecordService;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -107,6 +108,9 @@
     @Lazy
     private MesProWorkOrderProcessService workOrderProcessService;
     @Resource
+    @Lazy
+    private MesProWorkOrderParamRecordService workOrderParamRecordService;
+    @Resource
     private MesMdAutoCodeRecordService autoCodeRecordService;
     @Resource
     private MesMdWorkstationMachineService workstationMachineService;
@@ -146,7 +150,10 @@
         }
         // 2.2 鎻掑叆
         taskMapper.insert(task);
-        
+        if (task.getParamTemplateId() != null) {
+            workOrderParamRecordService.createTaskParamRecord(task.getId(), task.getParamTemplateId());
+        }
+
         // 2.3 淇濆瓨鎸囧畾鎶ュ伐浜哄憳
         updateTaskAssignees(task.getId(), createReqVO.getAssigneeUserIds());
         
@@ -257,6 +264,7 @@
                 result.add(new MesProRouteProcessDO()
                         .setRouteId(routeId)
                         .setProcessId(wp.getProcessId())
+                        .setParamTemplateId(wp.getParamTemplateId())
                         .setSort(wp.getSort())
                         .setKeyFlag(wp.getKeyFlag())
                         .setCheckFlag(wp.getCheckFlag())
@@ -384,6 +392,15 @@
         validateTaskExists(id);
         // 鏇存柊鏁伴噺
         taskMapper.updateProducedQuantity(id, incrProducedQuantity, incrQualifyQuantity, incrUnqualifyQuantity);
+        MesProTaskDO task = taskMapper.selectById(id);
+        if (task != null) {
+            LocalDateTime now = LocalDateTime.now();
+            MesProTaskDO timeUpdate = new MesProTaskDO().setId(id).setLastFeedbackTime(now);
+            if (task.getFirstFeedbackTime() == null) {
+                timeUpdate.setFirstFeedbackTime(now);
+            }
+            taskMapper.updateById(timeUpdate);
+        }
     }
 
     @Override
@@ -477,9 +494,13 @@
                     .setName(buildTaskName(item, workOrder.getQuantity()))
                     .setCode(autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.PRO_TASK_CODE.getCode()))
                     .setStatus(MesProTaskStatusEnum.PREPARE.getStatus())
+                    .setParamTemplateId(rp.getParamTemplateId())
                     .setClientId(workOrder.getClientId())
                     .setColorCode(rp.getColorCode());
             taskMapper.insert(task);
+            if (task.getParamTemplateId() != null) {
+                workOrderParamRecordService.createTaskParamRecord(task.getId(), task.getParamTemplateId());
+            }
             taskIds.add(task.getId());
         }
         // 7. 鏇存柊宸ュ崟宸叉帓浜ф暟閲�
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordService.java
index d2918c8..344dc04 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordService.java
@@ -25,6 +25,11 @@
     Long createParamRecord(Long workOrderId, @Valid MesProWorkOrderParamRecordSaveReqVO createReqVO);
 
     /**
+     * 鏍规嵁妯℃澘涓虹敓浜т换鍔″浐鍖栧弬鏁板揩鐓�
+     */
+    Long createTaskParamRecord(Long taskId, Long templateId);
+
+    /**
      * 鏇存柊宸ュ崟鍙傛暟璁板綍锛堜粎鏇存柊濉啓鍊硷紝涓嶆崲妯℃澘锛�
      *
      * @param updateReqVO 鏇存柊淇℃伅
@@ -64,4 +69,9 @@
      */
     List<MesProWorkOrderParamRecordDO> getParamRecordListByWorkOrderId(Long workOrderId);
 
+    /**
+     * 鏇存柊浠诲姟鍙傛暟璁板綍涓殑鎶ュ伐鍊�
+     */
+    void updateTaskParamValues(Long taskId, List<Long> detailIds, List<String> values);
+
 }
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordServiceImpl.java
index c202af7..baea293 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderParamRecordServiceImpl.java
@@ -53,6 +53,42 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public Long createTaskParamRecord(Long taskId, Long templateId) {
+        MesProTaskDO task = mesProTaskService.getTask(taskId);
+        if (task == null || templateId == null) {
+            return null;
+        }
+        MesProWorkOrderDO workOrder = mesProWorkOrderService.getWorkOrder(task.getWorkOrderId());
+        MesPdProcessParamTemplateDO template = templateService.validateProcessParamTemplateExists(templateId);
+        List<MesPdProcessParamTemplateDetailDO> details = templateService.getProcessParamTemplateDetailListByTemplateId(templateId);
+        if (CollUtil.isEmpty(details)) {
+            throw exception(PRO_WORK_ORDER_PARAM_RECORD_TEMPLATE_NO_DETAIL);
+        }
+        MesProWorkOrderParamRecordDO record = MesProWorkOrderParamRecordDO.builder()
+                .workOrderId(workOrder != null ? workOrder.getId() : task.getWorkOrderId())
+                .taskId(taskId)
+                .templateId(template.getId())
+                .templateCode(template.getTemplateCode())
+                .templateName(template.getTemplateName())
+                .recordNo("TASK-" + taskId)
+                .remark("鐢熶骇浠诲姟鎺掍骇鏃剁敓鎴愮殑鍙傛暟蹇収")
+                .build();
+        paramRecordMapper.insert(record);
+        paramRecordDetailMapper.insertBatch(details.stream().map(detail -> MesProWorkOrderParamRecordDetailDO.builder()
+                .recordId(record.getId())
+                .templateDetailId(detail.getId())
+                .paramCode(detail.getParamCode())
+                .paramName(detail.getParamName())
+                .paramType(detail.getParamType())
+                .unitMeasureId(detail.getUnitMeasureId())
+                .paramValue(null)
+                .remark(detail.getRemark())
+                .build()).toList());
+        return record.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public Long createParamRecord(Long taskId, MesProWorkOrderParamRecordSaveReqVO createReqVO) {
         // 1. 鏍¢獙宸ュ崟瀛樺湪
 
@@ -191,6 +227,29 @@
         return paramRecordMapper.selectListByWorkOrderId(workOrderId);
     }
 
+    @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;
+        }
+        List<MesProWorkOrderParamRecordDetailDO> details = paramRecordDetailMapper.selectListByRecordId(record.getId());
+        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));
+            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);
+            paramRecordDetailMapper.updateById(detail);
+        }
+    }
+
     // ==================== 鏍¢獙鏂规硶 ====================
 
     private MesProWorkOrderParamRecordDO validateParamRecordExists(Long id) {
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java
index 073b4e6..410834a 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderProcessServiceImpl.java
@@ -151,6 +151,7 @@
         for (MesProRouteProcessDO routeProcess : routeProcessList) {
             processList.add(MesProWorkOrderProcessDO.builder()
                     .processId(routeProcess.getProcessId())
+                    .paramTemplateId(routeProcess.getParamTemplateId())
                     .sort(routeProcess.getSort())
                     .nextProcessId(routeProcess.getNextProcessId())
                     .linkType(routeProcess.getLinkType())

--
Gitblit v1.9.3