doc/ÄþÏÄ-ÖÐÊ¢½¨²Ä.sql
@@ -276,3 +276,102 @@ ALTER TABLE `product-inventory-management-zsjc`.`process_route` ADD COLUMN `dict_code` bigint NOT NULL COMMENT '产åç±»ååå ¸ç¼ç ' AFTER `status`; ALTER TABLE `product-inventory-management-zsjc`.`product_order` ADD COLUMN `status` int NULL COMMENT 'ç¶æï¼1.å¾ å¼å§ã2.è¿è¡ä¸ã3.已宿ã4.已忶ï¼' AFTER `plan_complete_time`; DROP TABLE IF EXISTS `process_route_item_instance`; CREATE TABLE `process_route_item_instance` ( `id` bigint NOT NULL AUTO_INCREMENT, `route_id` bigint NOT NULL DEFAULT 0 COMMENT 'å·¥èºè·¯çº¿id', `product_model_id` bigint NULL DEFAULT 0 COMMENT '产åid', `process_id` bigint NOT NULL DEFAULT 0 COMMENT 'å·¥åºid', `tenant_id` bigint NOT NULL COMMENT 'ç§æ·id', `create_time` datetime NULL DEFAULT NULL COMMENT 'å½å ¥æ¶é´', `update_time` datetime NULL DEFAULT NULL COMMENT 'æ´æ°æ¶é´', `drag_sort` int NULL DEFAULT NULL COMMENT 'æå¨æåº', `is_quality` tinyint(1) NULL DEFAULT 1 COMMENT 'æ¯å¦è´¨æ£å·¥åº', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 83 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'å·¥èºè·¯çº¿åé-é表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for process_route_item_param_instance -- ---------------------------- DROP TABLE IF EXISTS `process_route_item_param_instance`; CREATE TABLE `process_route_item_param_instance` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主é®ID', `route_item_id` bigint NOT NULL COMMENT 'å ³èå·¥èºè·¯çº¿æç»ID (process_route_item.id)', `param_id` bigint NOT NULL COMMENT 'å ³èåºç¡åæ°å®ä¹ID (base_param.id)', `process_param_id` bigint NULL DEFAULT NULL COMMENT 'æ¥æºå·¥åºåæ°ID', `standard_value` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'æ¤è·¯çº¿èç¹è®¾å®çæ åå¼', `min_value` decimal(10, 2) NULL DEFAULT NULL COMMENT 'æ¤è·¯çº¿èç¹è®¾å®çæ åæå°å¼', `max_value` decimal(10, 2) NULL DEFAULT NULL COMMENT 'æ¤è·¯çº¿èç¹è®¾å®çæ åæå¤§å¼', `is_required` tinyint NOT NULL DEFAULT 0 COMMENT 'æ¯å¦å¿ å¡«', `sort` int NOT NULL DEFAULT 0 COMMENT 'æåº', `tenant_id` bigint NULL DEFAULT NULL COMMENT 'ç§æ·ID', `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) USING BTREE, INDEX `idx_route_item_id` (`route_item_id` ASC) USING BTREE, INDEX `idx_param_id` (`param_id` ASC) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 178 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'å·¥èºè·¯çº¿å·¥åºåæ°-é表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for product_process_param_instance -- ---------------------------- DROP TABLE IF EXISTS `product_process_param_instance`; CREATE TABLE `product_process_param_instance` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主é®ID', `process_id` bigint NOT NULL COMMENT 'æå±å·¥åºID (product_process.id)', `param_id` bigint NOT NULL COMMENT 'å ³èåºç¡åæ°ID (base_param.id)', `standard_value` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '卿¤å·¥åºè®¾å®çæ åå¼(å弿¨¡å¼)', `min_value` decimal(10, 2) NULL DEFAULT NULL COMMENT '卿¤å·¥åºè®¾å®çæ åæå°å¼(åºé´æ¨¡å¼)', `max_value` decimal(10, 2) NULL DEFAULT NULL COMMENT '卿¤å·¥åºè®¾å®çæ åæå¤§å¼(åºé´æ¨¡å¼)', `is_required` tinyint NOT NULL DEFAULT 0 COMMENT '卿¤å·¥åºä¸æ¯å¦å¿ å¡«(0-å¦, 1-æ¯)', `sort` int NOT NULL DEFAULT 0 COMMENT 'æåºå·', `tenant_id` bigint NULL DEFAULT NULL COMMENT 'ç§æ·ID', `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', PRIMARY KEY (`id`) USING BTREE, INDEX `idx_process_id` (`process_id` ASC) USING BTREE, INDEX `idx_param_id` (`param_id` ASC) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 61 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'å·¥åºç»å®åæ°-é表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for product_structure_instance -- ---------------------------- DROP TABLE IF EXISTS `product_structure_instance`; CREATE TABLE `product_structure_instance` ( `id` bigint NOT NULL AUTO_INCREMENT, `parent_id` bigint NULL DEFAULT NULL COMMENT 'ç¶èç¹ID', `product_model_id` bigint NULL DEFAULT NULL COMMENT '产åid', `process_id` bigint NULL DEFAULT NULL COMMENT 'å·¥åºid', `unit_quantity` decimal(16, 4) NOT NULL COMMENT 'åä½äº§åºéè¦æ°é', `demanded_quantity` decimal(16, 4) NULL DEFAULT NULL COMMENT 'éæ±æ°é', `unit` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'åä½', `tenant_id` bigint NULL DEFAULT NULL COMMENT 'ç§æ·id', `bom_id` bigint NOT NULL COMMENT 'bomçid', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'BOMåé-é表' ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; src/main/java/com/ruoyi/appendix/controller/AppendixController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.appendix.controller; import io.swagger.annotations.Api; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <br> * BOM-å·¥èºè·¯çº¿é表æ§å¶å± * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 14:44 */ @RestController @RequestMapping("/appendix") @Api("BOM-å·¥èºè·¯çº¿é表æ§å¶å±") public class AppendixController { } src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.appendix.controller; import io.swagger.annotations.Api; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <br> * å·¥èºè·¯çº¿åé-é表æ§å¶å± * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:07 */ @RestController @RequestMapping("/processRouteItemInstance") @Api("èºè·¯çº¿åé-é表æ§å¶å±") public class ProcessRouteItemInstanceController { } src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package com.ruoyi.appendix.controller; import io.swagger.annotations.Api; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <br> * å·¥èºè·¯çº¿å·¥åºåæ°æ¥å£ * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:14 */ @Api(tags = "å·¥èºè·¯çº¿å·¥åºåæ°æ¥å£") @RestController @RequestMapping("/processRouteItemParamInstance") public class ProcessRouteItemParamInstanceController { } src/main/java/com/ruoyi/appendix/controller/ProductProcessParamInstanceController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.appendix.controller; import io.swagger.annotations.Api; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <br> * å·¥åºç»å®åæ°-é表Controller * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:19 */ @Api(tags = "å·¥åºç»å®åæ°æ¥å£") @RestController @RequestMapping("/productProcessParamInstance") public class ProductProcessParamInstanceController { } src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.appendix.controller; import io.swagger.annotations.Api; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <br> * BOMåé-é表Controller * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:22 */ @Api(tags = "BOMç»ææ¥å£") @RestController @RequestMapping("/productStructureInstance") public class ProductStructureInstanceController { } src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemInstanceMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.appendix.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.appendix.pojo.ProcessRouteItemInstance; /** * <br> * å·¥èºè·¯çº¿åé-é表Mapper * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:02 */ public interface ProcessRouteItemInstanceMapper extends BaseMapper<ProcessRouteItemInstance> { } src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemParamInstanceMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.appendix.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance; /** * <br> * å·¥èºè·¯çº¿å·¥åºåæ°-é表Mapper * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:10 */ public interface ProcessRouteItemParamInstanceMapper extends BaseMapper<ProcessRouteItemParamInstance> { } src/main/java/com/ruoyi/appendix/mapper/ProductProcessParamInstanceMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.appendix.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.appendix.pojo.ProductProcessParamInstance; /** * <br> * å·¥åºç»å®åæ°-é表Mapper * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:15 */ public interface ProductProcessParamInstanceMapper extends BaseMapper<ProductProcessParamInstance> { } src/main/java/com/ruoyi/appendix/mapper/ProductStructureInstanceMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.appendix.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.appendix.pojo.ProductStructureInstance; /** * <br> * BOMåé-é表Mapper * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:20 */ public interface ProductStructureInstanceMapper extends BaseMapper<ProductStructureInstance> { } src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,58 @@ package com.ruoyi.appendix.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; /** * <br> * å·¥èºè·¯çº¿åé-é表 * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 11:43 */ @Data @TableName("process_route_item_instance") @Api(tags = "å·¥èºè·¯çº¿åé-é表") public class ProcessRouteItemInstance { @TableId(type = IdType.AUTO) private Long id; @ApiModelProperty("å·¥èºè·¯çº¿id") private Long routeId; @ApiModelProperty("产åid") private Long productModelId; @ApiModelProperty("å·¥åºid") private Long processId; @ApiModelProperty("ç§æ·id") private Long tenantId; @ApiModelProperty("å½å ¥æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @ApiModelProperty("æ´æ°æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; @ApiModelProperty("æå¨æåº") private Integer dragSort; @ApiModelProperty("æ¯å¦è´¨æ£å·¥åº") private Integer isQuality; } src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,69 @@ package com.ruoyi.appendix.pojo; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; /** * <br> * å·¥èºè·¯çº¿å·¥åºåæ°-é表 * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:09 */ @Data @TableName("process_route_item_param_instance") @Api(tags = "å·¥èºè·¯çº¿å·¥åºåæ°-é表") public class ProcessRouteItemParamInstance { @TableId(type = IdType.AUTO) @ApiModelProperty("主é®ID") private Long id; @ApiModelProperty("å ³èå·¥èºè·¯çº¿æç»ID") private Long routeItemId; @ApiModelProperty("å ³èåºç¡åæ°å®ä¹ID") private Long paramId; @ApiModelProperty("æ¥æºå·¥åºåæ°ID") private Long processParamId; @ApiModelProperty("æ åå¼") private String standardValue; @ApiModelProperty("æå°å¼") private BigDecimal minValue; @ApiModelProperty("æå¤§å¼") private BigDecimal maxValue; @ApiModelProperty("æ¯å¦å¿ å¡«") private Integer isRequired; @ApiModelProperty("æåº") private Integer sort; @ApiModelProperty("ç§æ·ID") private Long tenantId; @ApiModelProperty("å建æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty("æ´æ°æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; } src/main/java/com/ruoyi/appendix/pojo/ProductProcessParamInstance.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,67 @@ package com.ruoyi.appendix.pojo; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; /** * <br> * å·¥åºç»å®åæ°-é表 * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:14 */ @Data @TableName("product_process_param_instance") @Api(tags = "å·¥åºç»å®åæ°-é表") public class ProductProcessParamInstance { @TableId(type = IdType.AUTO) @ApiModelProperty("主é®ID") private Long id; @ApiModelProperty("æå±å·¥åºID") private Long processId; @ApiModelProperty("å ³èåºç¡åæ°ID") private Long paramId; @ApiModelProperty("æ åå¼(å弿¨¡å¼)") private String standardValue; @ApiModelProperty("æå°å¼(åºé´æ¨¡å¼)") private BigDecimal minValue; @ApiModelProperty("æå¤§å¼(åºé´æ¨¡å¼)") private BigDecimal maxValue; @ApiModelProperty("æ¯å¦å¿ å¡«(0-å¦,1-æ¯)") private Boolean isRequired; @ApiModelProperty("æåºå·") private Integer sort; @ApiModelProperty("ç§æ·ID") private Long tenantId; @ApiModelProperty("å建æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty("æ´æ°æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; } src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,53 @@ package com.ruoyi.appendix.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * <br> * BOMåé-é表 * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:20 */ @Data @TableName("product_structure_instance") @Api(tags = "BOMåé-é表") public class ProductStructureInstance { @TableId(type = IdType.AUTO) @ApiModelProperty("主é®ID") private Long id; @ApiModelProperty("ç¶èç¹ID") private Long parentId; @ApiModelProperty("产åID") private Long productModelId; @ApiModelProperty("å·¥åºID") private Long processId; @ApiModelProperty("åä½äº§åºéè¦æ°é") private BigDecimal unitQuantity; @ApiModelProperty("éæ±æ°é") private BigDecimal demandedQuantity; @ApiModelProperty("åä½") private String unit; @ApiModelProperty("ç§æ·ID") private Long tenantId; @ApiModelProperty("BOM ID") private Long bomId; } src/main/java/com/ruoyi/appendix/service/AppendixService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,45 @@ package com.ruoyi.appendix.service; import com.ruoyi.productionPlan.dto.ProductionPlanDto; /** * <br> * BOM-å·¥èºè·¯çº¿é表Serviceæ¥å£ * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 14:45 */ public interface AppendixService { /** * å°å¯¹åºçå·¥èºè·¯çº¿åéä¸ç»å®çBOMåéå¡«å å°éè¡¨ä¸ * * @param productOrderId ç产订åID * @param processRouteId å·¥èºè·¯çº¿ID */ void populateData(Long productOrderId, Long processRouteId); /** * ç»ä¸åçç åæå对åºçå·¥èºè·¯çº¿åéä¸ç»å®çBOMåéå¡«å å°éè¡¨ä¸ * * @param productionPlanDto 产å详æ */ Long populateBlocks(ProductionPlanDto productionPlanDto); /** * ç»ä¸åçæ¿ææå对åºçå·¥èºè·¯çº¿åéä¸ç»å®çBOMåéå¡«å å°éè¡¨ä¸ * * @param productionPlanDto 产å详æ */ Long populatePlates(ProductionPlanDto productionPlanDto); /** * å é¤è¯¥è®¢åæºå¸¦çéè¡¨æ°æ® * * @param processRouteId å·¥èºè·¯çº¿ID */ void deleteData(Long processRouteId); } src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.appendix.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.appendix.pojo.ProcessRouteItemInstance; /** * <br> *å·¥èºè·¯çº¿åé-é表Service * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:07 */ public interface ProcessRouteItemInstanceService extends IService<ProcessRouteItemInstance> { } src/main/java/com/ruoyi/appendix/service/ProcessRouteItemParamInstanceService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.appendix.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance; /** * <br> * å·¥èºè·¯çº¿å·¥åºåæ°-é表Service * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:11 */ public interface ProcessRouteItemParamInstanceService extends IService<ProcessRouteItemParamInstance> { } src/main/java/com/ruoyi/appendix/service/ProductProcessParamInstanceService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.appendix.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.appendix.pojo.ProductProcessParamInstance; /** * <br> * å·¥åºç»å®åæ°-é表Serviceæ¥å£ * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:16 */ public interface ProductProcessParamInstanceService extends IService<ProductProcessParamInstance> { } src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.appendix.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.appendix.pojo.ProductStructureInstance; /** * <br> * BOMåé-é表Serviceæ¥å£ * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:21 */ public interface ProductStructureInstanceService extends IService<ProductStructureInstance> { } src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,216 @@ package com.ruoyi.appendix.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.appendix.pojo.ProcessRouteItemInstance; import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance; import com.ruoyi.appendix.pojo.ProductProcessParamInstance; import com.ruoyi.appendix.pojo.ProductStructureInstance; import com.ruoyi.appendix.service.*; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.*; import com.ruoyi.productionPlan.dto.ProductionPlanDto; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; import java.util.stream.Collectors; /** * <br> * BOM-å·¥èºè·¯çº¿é表Serviceæ¥å£å®ç°ç±» * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 14:45 */ @Slf4j @Service public class AppendixServiceImpl implements AppendixService { @Resource private ProcessRouteItemInstanceService processRouteItemInstanceService; @Resource private ProcessRouteItemParamInstanceService processRouteItemParamInstanceService; @Resource private ProductProcessParamInstanceService productProcessParamInstanceService; @Resource private ProductStructureInstanceService productStructureInstanceService; @Resource private ProcessRouteService processRouteService; @Resource private ProcessRouteItemService processRouteItemService; @Resource private ProcessRouteItemParamService processRouteItemParamService; @Resource private ProductProcessParamService productProcessParamService; @Resource private ProductStructureService productStructureService; @Resource private ProductOrderService productOrderService; @Override public Long populateBlocks(ProductionPlanDto productionPlanDto) { if (productionPlanDto == null) { throw new ServiceException("ä¸åæ°æ®ä¸è½ä¸ºç©º"); } if (StringUtils.isEmpty(productionPlanDto.getStrength())) { throw new ServiceException("ç åç产åç±»åä¸è½ä¸ºç©º"); } ProcessRoute processRoute = processRouteService.latestTypeDate(productionPlanDto.getProductName(), productionPlanDto.getStrength()); if (processRoute == null) { log.info("ä¸å产åã{}ãæªæ¥è¯¢åºå·¥èºè·¯çº¿", productionPlanDto.getProductName()); return null; } migration(processRoute); return processRoute.getId(); } @Override public Long populatePlates(ProductionPlanDto productionPlanDto) { if (productionPlanDto == null) { throw new ServiceException("ä¸åæ°æ®ä¸è½ä¸ºç©º"); } // æ¿æä¸åºå强度ï¼strengthä¼ null ProcessRoute processRoute = processRouteService.latestTypeDate(productionPlanDto.getProductName(), null); if (processRoute == null) { log.info("ä¸å产åã{}ãæªæ¥è¯¢åºå·¥èºè·¯çº¿", productionPlanDto.getProductName()); return null; } migration(processRoute); return processRoute.getId(); } @Override public void populateData(Long productOrderId, Long processRouteId) { ProcessRoute processRoute = processRouteService.getById(processRouteId); if (processRoute == null) { log.info("ç产订åã{}ãæªæ¥è¯¢åºå·¥èºè·¯çº¿ã{}ã", productOrderId, processRouteId); return; } migration(processRoute); // ååå·¥èºè·¯çº¿idå°ç产订å ProductOrder productOrder = new ProductOrder(); productOrder.setId(productOrderId); productOrder.setRouteId(processRouteId); productOrderService.updateById(productOrder); } @Override public void deleteData(Long processRouteId) { // æ¥åºå·¥èºè·¯çº¿åéï¼ç¨äºå ³èå é¤åæ°é表 List<ProcessRouteItem> itemList = processRouteItemService.list(new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRouteId)); if (itemList != null && !itemList.isEmpty()) { List<Long> itemIds = itemList.stream().map(ProcessRouteItem::getId).collect(Collectors.toList()); List<Long> processIds = itemList.stream().map(ProcessRouteItem::getProcessId).collect(Collectors.toList()); // å é¤å·¥èºè·¯çº¿å·¥åºåæ°é表 processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>().in(ProcessRouteItemParamInstance::getRouteItemId, itemIds)); // å é¤å·¥åºç»å®åæ°é表 productProcessParamInstanceService.remove(new LambdaQueryWrapper<ProductProcessParamInstance>().in(ProductProcessParamInstance::getProcessId, processIds)); } // å é¤å·¥èºè·¯çº¿åéé表 processRouteItemInstanceService.remove( new LambdaQueryWrapper<ProcessRouteItemInstance>().eq(ProcessRouteItemInstance::getRouteId, processRouteId)); // å é¤BOMåéé表 ProcessRoute processRoute = processRouteService.getById(processRouteId); if (processRoute != null && processRoute.getBomId() != null) { productStructureInstanceService.remove(new LambdaQueryWrapper<ProductStructureInstance>().eq(ProductStructureInstance::getBomId, processRoute.getBomId())); } } /** * æ ¹æ®å·¥èºè·¯çº¿è¿ç§»åå¼ éè¡¨æ°æ® */ private void migration(ProcessRoute processRoute) { // è¿ç§»å·¥èºè·¯çº¿åéè¡¨æ°æ® List<ProcessRouteItem> processRouteItemList = processRouteItemService.list(new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRoute.getId())); migrationProcessRouteItem(processRouteItemList); // è¿ç§»å·¥èºè·¯çº¿å ç»å®çå·¥åºåå·¥åºåæ° if (processRouteItemList != null && !processRouteItemList.isEmpty()) { for (ProcessRouteItem item : processRouteItemList) { List<ProcessRouteItemParam> paramList = processRouteItemParamService.list(new LambdaQueryWrapper<ProcessRouteItemParam>().eq(ProcessRouteItemParam::getRouteItemId, item.getId())); migrationProcessRouteItemParam(paramList); List<ProductProcessParam> processParamList = productProcessParamService.list(new LambdaQueryWrapper<ProductProcessParam>().eq(ProductProcessParam::getProcessId, item.getProcessId())); migrationProductProcessParam(processParamList); } } // è¿ç§»BOMåéè¡¨æ°æ® if (processRoute.getBomId() != null) { List<ProductStructure> structureList = productStructureService.list(new LambdaQueryWrapper<ProductStructure>().eq(ProductStructure::getBomId, processRoute.getBomId())); migrationProductStructure(structureList); } } private void migrationProcessRouteItem(List<ProcessRouteItem> list) { if (list == null || list.isEmpty()) { return; } List<ProcessRouteItemInstance> instances = list.stream().map(item -> { ProcessRouteItemInstance instance = new ProcessRouteItemInstance(); BeanUtils.copyProperties(item, instance, "id"); instance.setIsQuality(item.getIsQuality() != null && item.getIsQuality() ? 1 : 0); return instance; }).collect(Collectors.toList()); processRouteItemInstanceService.saveBatch(instances); } private void migrationProcessRouteItemParam(List<ProcessRouteItemParam> list) { if (list == null || list.isEmpty()) { return; } List<ProcessRouteItemParamInstance> instances = list.stream().map(item -> { ProcessRouteItemParamInstance instance = new ProcessRouteItemParamInstance(); BeanUtils.copyProperties(item, instance, "id"); return instance; }).collect(Collectors.toList()); processRouteItemParamInstanceService.saveBatch(instances); } private void migrationProductProcessParam(List<ProductProcessParam> list) { if (list == null || list.isEmpty()) { return; } List<ProductProcessParamInstance> instances = list.stream().map(item -> { ProductProcessParamInstance instance = new ProductProcessParamInstance(); BeanUtils.copyProperties(item, instance, "id"); instance.setIsRequired(item.getIsRequired() != null && item.getIsRequired() == 1); return instance; }).collect(Collectors.toList()); productProcessParamInstanceService.saveBatch(instances); } private void migrationProductStructure(List<ProductStructure> list) { if (list == null || list.isEmpty()) { return; } List<ProductStructureInstance> instances = list.stream().map(item -> { ProductStructureInstance instance = new ProductStructureInstance(); BeanUtils.copyProperties(item, instance, "id"); instance.setBomId(item.getBomId() != null ? item.getBomId().longValue() : null); return instance; }).collect(Collectors.toList()); productStructureInstanceService.saveBatch(instances); } } src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package com.ruoyi.appendix.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.appendix.mapper.ProcessRouteItemInstanceMapper; import com.ruoyi.appendix.pojo.ProcessRouteItemInstance; import com.ruoyi.appendix.service.ProcessRouteItemInstanceService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** * <br> * å·¥èºè·¯çº¿åé-é表Serviceå®ç°ç±» * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:08 */ @Slf4j @Service public class ProcessRouteItemInstanceServiceImpl extends ServiceImpl<ProcessRouteItemInstanceMapper, ProcessRouteItemInstance> implements ProcessRouteItemInstanceService { } src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemParamInstanceServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.appendix.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.appendix.mapper.ProcessRouteItemParamInstanceMapper; import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance; import com.ruoyi.appendix.service.ProcessRouteItemParamInstanceService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** * <br> * å·¥èºè·¯çº¿å·¥åºåæ°-é表Serviceå®ç°ç±» * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:12 */ @Slf4j @Service public class ProcessRouteItemParamInstanceServiceImpl extends ServiceImpl<ProcessRouteItemParamInstanceMapper, ProcessRouteItemParamInstance> implements ProcessRouteItemParamInstanceService { } src/main/java/com/ruoyi/appendix/service/impl/ProductProcessParamInstanceServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.appendix.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.appendix.mapper.ProductProcessParamInstanceMapper; import com.ruoyi.appendix.pojo.ProductProcessParamInstance; import com.ruoyi.appendix.service.ProductProcessParamInstanceService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** * <br> * å·¥åºç»å®åæ°-é表Serviceå®ç°ç±» * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:18 */ @Slf4j @Service public class ProductProcessParamInstanceServiceImpl extends ServiceImpl<ProductProcessParamInstanceMapper, ProductProcessParamInstance> implements ProductProcessParamInstanceService { } src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.appendix.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.appendix.mapper.ProductStructureInstanceMapper; import com.ruoyi.appendix.pojo.ProductStructureInstance; import com.ruoyi.appendix.service.ProductStructureInstanceService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** * <br> * BOMåé-é表Serviceå®ç°ç±» * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:21 */ @Slf4j @Service public class ProductStructureInstanceServiceImpl extends ServiceImpl<ProductStructureInstanceMapper, ProductStructureInstance> implements ProductStructureInstanceService { } src/main/java/com/ruoyi/production/mapper/ProcessRouteMapper.java
@@ -12,4 +12,6 @@ public interface ProcessRouteMapper extends BaseMapper<ProcessRoute> { IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page,@Param("c") ProcessRouteDto processRouteDto); ProcessRoute latestTypeDate(String productName, String strength); } src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -33,6 +33,7 @@ private Long workOrderId; @ApiModelProperty(value = "ç产订åid") @TableField(exist = false) private Long productOrderId; @ApiModelProperty(value = "æ¥å·¥ç¶æ") src/main/java/com/ruoyi/production/service/ProcessRouteService.java
@@ -18,4 +18,6 @@ int batchDelete(List<Long> ids); List<ProductStructureDto> getRouteBom(Long id); ProcessRoute latestTypeDate(String productName, String strength); } src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -106,4 +106,9 @@ } return list; } @Override public ProcessRoute latestTypeDate(String productName, String strength) { return baseMapper.latestTypeDate(productName, strength); } } src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.appendix.service.AppendixService; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.ProductStructureDto; @@ -73,6 +74,9 @@ @Autowired private StockUtils stockUtils; @Autowired private AppendixService appendixService; @Override public IPage<ProductOrderDto> pageProductOrder(Page<ProductOrder> page, ProductOrderDto productOrder) { @@ -241,9 +245,14 @@ // å é¤ä¸é´è¡¨ productOrderPlanMapper.delete(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, ids)); // TODO: å é¤é表çå·¥èºè·¯çº¿ä¸BOM productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>().in(ProductProcessRouteItem::getProductOrderId, ids)); productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>().in(ProductProcessRoute::getProductOrderId, ids)); // å é¤é表çå·¥èºè·¯çº¿ä¸BOM for (Long id : ids) { ProductOrder productOrder = baseMapper.selectById(id); appendixService.deleteData(productOrder.getRouteId()); } // productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>().in(ProductProcessRouteItem::getProductOrderId, ids)); // productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>().in(ProductProcessRoute::getProductOrderId, ids)); // å é¤è®¢å productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>().in(ProductOrder::getId, ids)); src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.appendix.service.AppendixService; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.StringUtils; @@ -77,6 +78,9 @@ @Autowired private ProductMaterialService productMaterialService; @Autowired private AppendixService appendixService; /** * 忥éï¼ç¡®ä¿æå¨å宿¶ä»»å¡ä¸åæ¶æ§è¡ */ @@ -143,6 +147,14 @@ productOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity()); productOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime()); productOrder.setStatus(ProductOrderStatusEnum.WAIT.getCode()); // å½ä¸åç产å为ç åææ¿æï¼å°±æåBOMåéä¸å·¥èºè·¯çº¿åéæ°æ®åå ¥å°éè¡¨ä¸ if ("ç å".equals(productionPlanDto.getProductName())) { productOrder.setRouteId(appendixService.populateBlocks(productionPlanDto)); } if ("æ¿æ".equals(productionPlanDto.getProductName())) { productOrder.setRouteId(appendixService.populatePlates(productionPlanDto)); } productOrderService.addProductOrder(productOrder); // æ ¹æ®ä¸åæ°éï¼ä»ç¬¬ä¸ä¸ªç产计åå¼å§åé æ¹æ° src/main/resources/mapper/appendix/ProcessRouteItemInstanceMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.appendix.mapper.ProcessRouteItemInstanceMapper"> <resultMap id="ProcessRouteItemInstanceMap" type="com.ruoyi.appendix.pojo.ProcessRouteItemInstance"> <id property="id" column="id"/> <result property="routeId" column="route_id"/> <result property="productModelId" column="product_model_id"/> <result property="processId" column="process_id"/> <result property="tenantId" column="tenant_id"/> <result property="createTime" column="create_time"/> <result property="updateTime" column="update_time"/> <result property="dragSort" column="drag_sort"/> <result property="isQuality" column="is_quality"/> </resultMap> </mapper> src/main/resources/mapper/appendix/ProcessRouteItemParamInstanceMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,23 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.appendix.mapper.ProcessRouteItemParamInstanceMapper"> <resultMap id="BaseResultMap" type="com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance"> <id property="id" column="id"/> <result property="routeItemId" column="route_item_id"/> <result property="paramId" column="param_id"/> <result property="processParamId" column="process_param_id"/> <result property="standardValue" column="standard_value"/> <result property="minValue" column="min_value"/> <result property="maxValue" column="max_value"/> <result property="isRequired" column="is_required"/> <result property="sort" column="sort"/> <result property="tenantId" column="tenant_id"/> <result property="createTime" column="create_time"/> <result property="updateTime" column="update_time"/> </resultMap> </mapper> src/main/resources/mapper/appendix/ProductProcessParamInstanceMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.appendix.mapper.ProductProcessParamInstanceMapper"> <resultMap id="BaseResultMap" type="com.ruoyi.appendix.pojo.ProductProcessParamInstance"> <id property="id" column="id"/> <result property="processId" column="process_id"/> <result property="paramId" column="param_id"/> <result property="standardValue" column="standard_value"/> <result property="minValue" column="min_value"/> <result property="maxValue" column="max_value"/> <result property="isRequired" column="is_required"/> <result property="sort" column="sort"/> <result property="tenantId" column="tenant_id"/> <result property="createTime" column="create_time"/> <result property="updateTime" column="update_time"/> </resultMap> </mapper> src/main/resources/mapper/appendix/ProductStructureInstanceMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.appendix.mapper.ProductStructureInstanceMapper"> <resultMap id="BaseResultMap" type="com.ruoyi.appendix.pojo.ProductStructureInstance"> <id property="id" column="id"/> <result property="parentId" column="parent_id"/> <result property="productModelId" column="product_model_id"/> <result property="processId" column="process_id"/> <result property="unitQuantity" column="unit_quantity"/> <result property="demandedQuantity" column="demanded_quantity"/> <result property="unit" column="unit"/> <result property="tenantId" column="tenant_id"/> <result property="bomId" column="bom_id"/> </resultMap> </mapper> src/main/resources/mapper/production/ProcessRouteMapper.xml
@@ -29,4 +29,24 @@ order by ps.id </select> <select id="latestTypeDate" resultType="com.ruoyi.production.pojo.ProcessRoute"> SELECT * FROM process_route pr WHERE pr.dict_code = (SELECT d.dict_code FROM sys_dict_data d WHERE d.dict_label = <choose> <when test="strength != null and strength != ''"> CONCAT(#{productName}, '-', #{strength}) </when> <otherwise> #{productName} </otherwise> </choose> AND d.dict_type = 'product_type' LIMIT 1) ORDER BY pr.create_time DESC LIMIT 1 </select> </mapper>