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` | ä»»å¡è¯¦æ | 馿¬¡åæè¿ä¸æ¬¡æ£å¼æ¥å·¥æ¶é´ | ## ä¸å¡è§å说æ | åºæ¯ | è§å | |---|---| | æ åæ°æ¨¡æ¿ | 任塿£å¸¸çæï¼æ¥å·¥ä¸è¦æ±åæ°å¼ | | æåæ°æ¨¡æ¿ | ä»»å¡çææ¶åºåæ¨¡æ¿æç»å¿«ç §ï¼æ¥å·¥æä»»å¡æç»å¡«ååæ° | | 模æ¿åç»ä¿®æ¹ | ä¸å½±åå·²æä»»å¡åæ°å¿«ç §åå·²å¡«åæ¥å·¥å¼ | | åæ°æç»ç¼å·ä¸å±äºå½åä»»å¡ | å端æç»ä¿å | | å®¡æ¹æè´¨æ£åè° | åªå¤çæ¥å·¥åç产æ°éï¼ä¸éæ°çæåæ°è®°å½ | | æ£å¼æ¥å·¥å | ä»»å¡åæ°ä½ä¸ºåå²è®°å½ä¿çï¼ä¸è¦çåå¿«ç § | ## 注æäºé¡¹ - æ¥å·¥é¡µé¢åºå æ ¹æ®ä»»å¡åæ°è®°å½è·ååæ°å®ä¹ï¼å以æç» `detailId` æäº¤å¼ã - ä¸è¦å°æ¨¡æ¿æç»ç¼å·å½ä½æ¥å·¥åæ°æç»ç¼å·ä½¿ç¨ã - æ°å¼ãæ¥æãå¸å°çåæ°çè¾å ¥æ ¼å¼åºä¸åæ°ç±»åä¿æä¸è´ã - `paramValues` 为空ä¸ä»£è¡¨å é¤åæ°è®°å½ï¼æ²¡ææ¨¡æ¿ç任塿ä¸çæåæ°è®°å½ã 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); 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> @@ -79,7 +70,7 @@ <artifactId>yudao-spring-boot-starter-excel</artifactId> </dependency> <!-- Spring AI Model æ¨¡åæ¥å ¥ --> <!-- Spring AI æ¨¡åæ¥å ¥ï¼ç»ä¸èµ° OpenAI å ¼å®¹æ¥å£ï¼DeepSeek/éä¹åé®çï¼ --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-openai</artifactId> @@ -91,50 +82,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> <!-- åéåå¨ï¼https://db-engines.com/en/ranking/vector+dbms --> <dependency> <!-- Qdrantï¼https://qdrant.tech/ --> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-vector-store-qdrant</artifactId> <version>${spring-ai.version}</version> </dependency> <dependency> <!-- Redisï¼https://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ï¼https://milvus.io/ --> <groupId>org.springframework.ai</groupId> @@ -174,80 +122,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ï¼AI 工使µ --> <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> <!-- è§£å³ https://gitee.com/zhijiantianya/ruoyi-vue-pro/pulls/1318/ é®é¢ --> <groupId>com.agentsflex</groupId> <artifactId>agents-flex-store-elasticsearch</artifactId> </exclusion> <exclusion> <!-- è§£å³ 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> <!-- è§£å³å 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> 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 { 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; } 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; 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; 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; 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; // ç¼è¾æ¶ï¼å¯ä¸ä¼ é 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; 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()} 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; 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) 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() 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. æ´æ°å·¥åå·²æäº§æ°é 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); } 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) { 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())