doc/ÄþÏÄ-ÖÐÊ¢½¨²Ä.sql
@@ -281,95 +281,6 @@ 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', `order_id` bigint DEFAULT NULL COMMENT 'ç产订åID', `route_item_id` bigint NOT NULL COMMENT 'å ³èå·¥èºè·¯çº¿æç»ID (process_route_item.id)', `process_param_id` bigint DEFAULT NULL COMMENT 'æ¥æºå·¥åºåæ°ID', `param_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'åæ°å¯ä¸æ è¯', `param_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'åæ°åç§°', `param_type` tinyint NOT NULL COMMENT 'åæ°ç±»å(1æ°å 2ææ¬ 3䏿鿩 4æ¶é´)', `param_format` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'åæ°æ ¼å¼', `value_mode` tinyint DEFAULT '1' COMMENT '弿¨¡å¼(1åå¼ 2åºé´)', `unit` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'åä½', `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '夿³¨', `standard_value` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'æ åå¼', `min_value` decimal(10, 2) DEFAULT NULL COMMENT 'æ¤è·¯çº¿èç¹è®¾å®çæ åæå°å¼', `max_value` decimal(10, 2) DEFAULT NULL COMMENT 'æ¤è·¯çº¿èç¹è®¾å®çæ åæå¤§å¼', `is_required` tinyint NOT NULL DEFAULT '0' COMMENT 'æ¯å¦å¿ å¡«', `sort` int NOT NULL DEFAULT '0' COMMENT 'æåº', `tenant_id` bigint DEFAULT NULL COMMENT 'ç§æ·ID', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', PRIMARY KEY (`id`) USING BTREE, KEY `idx_route_item_id` (`route_item_id`) USING BTREE, KEY `idx_param_key` (`param_key`) ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC COMMENT ='å·¥èºè·¯çº¿å·¥åºåæ°å®ä¾è¡¨'; -- ---------------------------- -- 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; ALTER TABLE `process_route_item_instance` ADD COLUMN `order_id` bigint NOT NULL COMMENT 'ç产订åid' AFTER `id`, ADD INDEX `idx_order_id` (`order_id`); ALTER TABLE `process_route_item_param_instance` ADD COLUMN `order_id` bigint NOT NULL COMMENT 'ç产订åid' AFTER `id`, ADD INDEX `idx_order_id` (`order_id`); ALTER TABLE `product_structure_instance` ADD COLUMN `order_id` bigint NOT NULL COMMENT 'ç产订åid' AFTER `id`, ADD INDEX `idx_order_id` (`order_id`); ALTER TABLE `product-inventory-management-zsjc`.`product_order` ADD COLUMN `strength` varchar(255) NULL COMMENT '产åç±»å' AFTER `plan_complete_time`; @@ -427,4 +338,80 @@ ALTER TABLE `product-inventory-management-zsjc`.`product_structure` MODIFY COLUMN `unit_quantity` decimal(20, 15) NOT NULL COMMENT 'åä½äº§åºéè¦æ°é' AFTER `process_id`, MODIFY COLUMN `demanded_quantity` decimal(20, 15) NULL DEFAULT NULL COMMENT 'éæ±æ°é' AFTER `unit_quantity`, MODIFY COLUMN `demanded_quantity` decimal(20, 15) NULL DEFAULT NULL COMMENT 'éæ±æ°é' AFTER `unit_quantity`, CREATE TABLE `production_order_route_item` ( `id` bigint NOT NULL AUTO_INCREMENT, `order_id` bigint NOT NULL COMMENT 'ç产订åid', `route_id` bigint NOT NULL DEFAULT '0' COMMENT 'å·¥èºè·¯çº¿id', `product_model_id` bigint DEFAULT '0' COMMENT '产åid', `process_id` bigint NOT NULL DEFAULT '0' COMMENT 'å·¥åºid', `tenant_id` bigint NOT NULL COMMENT 'ç§æ·id', `create_time` datetime DEFAULT NULL COMMENT 'å½å ¥æ¶é´', `update_time` datetime DEFAULT NULL COMMENT 'æ´æ°æ¶é´', `drag_sort` int DEFAULT NULL COMMENT 'æå¨æåº', `is_quality` tinyint(1) DEFAULT '1' COMMENT 'æ¯å¦è´¨æ£å·¥åº', PRIMARY KEY (`id`) USING BTREE, KEY `idx_order_id` (`order_id`) ) ENGINE = InnoDB AUTO_INCREMENT = 83 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC COMMENT ='ç产订åç»å®çå·¥èºè·¯çº¿--å·¥åºè¡¨'; CREATE TABLE `production_order_route_item_param` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主é®ID', `order_id` bigint DEFAULT NULL COMMENT 'ç产订åID', `route_item_id` bigint NOT NULL COMMENT 'å ³èå·¥èºè·¯çº¿æç»ID (production_order_route_item.id)', `process_param_id` bigint DEFAULT NULL COMMENT 'æ¥æºå·¥åºåæ°ID', `param_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'åæ°å¯ä¸æ è¯', `param_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'åæ°åç§°', `param_type` tinyint NOT NULL COMMENT 'åæ°ç±»å(1æ°å 2ææ¬ 3䏿鿩 4æ¶é´)', `param_format` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'åæ°æ ¼å¼', `value_mode` tinyint DEFAULT '1' COMMENT '弿¨¡å¼(1åå¼ 2åºé´)', `unit` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'åä½', `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '夿³¨', `standard_value` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'æ åå¼', `min_value` decimal(10, 2) DEFAULT NULL COMMENT 'æ¤è·¯çº¿èç¹è®¾å®çæ åæå°å¼', `max_value` decimal(10, 2) DEFAULT NULL COMMENT 'æ¤è·¯çº¿èç¹è®¾å®çæ åæå¤§å¼', `is_required` tinyint NOT NULL DEFAULT '0' COMMENT 'æ¯å¦å¿ å¡«', `sort` int NOT NULL DEFAULT '0' COMMENT 'æåº', `tenant_id` bigint DEFAULT NULL COMMENT 'ç§æ·ID', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', PRIMARY KEY (`id`) USING BTREE, KEY `idx_route_item_id` (`route_item_id`) USING BTREE, KEY `idx_param_key` (`param_key`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC COMMENT ='ç产订åç»å®çå·¥èºè·¯çº¿å·¥åº--åæ°è¡¨'; CREATE TABLE `production_order_structure` ( `id` bigint NOT NULL AUTO_INCREMENT, `order_id` bigint NOT NULL COMMENT 'ç产订åid', `parent_id` bigint DEFAULT NULL COMMENT 'ç¶èç¹ID', `product_model_id` bigint DEFAULT NULL COMMENT '产åid', `process_id` bigint DEFAULT NULL COMMENT 'å·¥åºid', `unit_quantity` decimal(16, 4) NOT NULL COMMENT 'åä½äº§åºéè¦æ°é', `demanded_quantity` decimal(16, 4) DEFAULT NULL COMMENT 'éæ±æ°é', `unit` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'åä½', `tenant_id` bigint DEFAULT NULL COMMENT 'ç§æ·id', `bom_id` bigint NOT NULL COMMENT 'bomçid', PRIMARY KEY (`id`) USING BTREE, KEY `idx_order_id` (`order_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC COMMENT ='ç产订åç»å®çBOMå表'; DROP TABLE IF EXISTS process_route_item_instance; DROP TABLE IF EXISTS process_route_item_param_instance; DROP TABLE IF EXISTS product_structure_instance; src/main/java/com/ruoyi/appendix/controller/AppendixController.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemInstanceController.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/controller/ProcessRouteItemParamInstanceController.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/controller/ProductStructureInstanceController.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemInstanceDto.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/dto/ProcessRouteItemParamInstanceDto.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/dto/ProductStructureInstanceDto.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemInstanceMapper.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/mapper/ProcessRouteItemParamInstanceMapper.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/mapper/ProductStructureInstanceMapper.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemInstance.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/pojo/ProcessRouteItemParamInstance.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/pojo/ProductStructureInstance.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/service/ProcessRouteItemInstanceService.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/service/ProcessRouteItemParamInstanceService.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/service/ProductStructureInstanceService.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemParamInstanceServiceImpl.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/appendix/service/impl/ProductStructureInstanceServiceImpl.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/production/controller/ProductionOrderAppendixController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,40 @@ package com.ruoyi.production.controller; import com.ruoyi.appendix.service.AppendixService; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.service.IProductionOrderAppendixService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * <br> * BOM-å·¥èºè·¯çº¿é表æ§å¶å± * </br> * * @author deslrey * @version 1.0 * @since 2026/03/20 */ @RestController @RequestMapping("/appendix") @Api("BOM-å·¥èºè·¯çº¿é表æ§å¶å±") public class ProductionOrderAppendixController { @Resource private IProductionOrderAppendixService iProductionOrderAppendixService; @PostMapping("/bindingRoute") @ApiOperation("ç产订åç»å®å·¥èºè·¯çº¿") public AjaxResult bindingRoute(@RequestBody ProductOrder productOrder) { iProductionOrderAppendixService.populateData(productOrder); return AjaxResult.success(); } } src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,64 @@ package com.ruoyi.production.controller; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.production.dto.ProductionOrderRouteItemDto; import com.ruoyi.production.service.IProductionOrderRouteItemService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * <p> * ç产订åç»å®çå·¥èºè·¯çº¿--å·¥åºè¡¨ å端æ§å¶å¨ * </p> * * @author deslrey * @since 2026-03-20 */ @RestController @RequestMapping("/productionOrderRouteItem") @Api(tags = "å·¥èºè·¯çº¿å·¥åºæ¥å£") public class ProductionOrderRouteItemController { @Resource private IProductionOrderRouteItemService productionOrderRouteItemService; @GetMapping("/list/{orderId}") @ApiOperation("è·åå·¥åºå表") public AjaxResult getProcessItem(@PathVariable Long orderId) { List<ProductionOrderRouteItemDto> list = productionOrderRouteItemService.getProcessItem(orderId); return AjaxResult.success(list); } @PostMapping("/add") @ApiOperation("æ°å¢å·¥åº") public AjaxResult addProcessItem(@RequestBody ProductionOrderRouteItemDto dto) { productionOrderRouteItemService.addProcessItem(dto); return AjaxResult.success(); } @PutMapping("/update") @ApiOperation("ä¿®æ¹å·¥åº") public AjaxResult updateProcessItem(@RequestBody ProductionOrderRouteItemDto dto) { productionOrderRouteItemService.updateProcessItem(dto); return AjaxResult.success(); } @DeleteMapping("/delete/{id}") @ApiOperation("å é¤å·¥åº") public AjaxResult deleteProcessItem(@PathVariable Long id) { productionOrderRouteItemService.deleteProcessItem(id); return AjaxResult.success(); } @PostMapping("/sort") @ApiOperation("å·¥åºæåº") public AjaxResult sortProcessItem(@RequestBody ProductionOrderRouteItemDto dto) { productionOrderRouteItemService.sortProcessItem(dto); return AjaxResult.success(); } } src/main/java/com/ruoyi/production/controller/ProductionOrderRouteItemParamController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,57 @@ package com.ruoyi.production.controller; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.production.dto.ProductionOrderRouteItemParamDto; import com.ruoyi.production.service.IProductionOrderRouteItemParamService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * <p> * ç产订åç»å®çå·¥èºè·¯çº¿å·¥åº--åæ°è¡¨ å端æ§å¶å¨ * </p> * * @author deslrey * @since 2026-03-20 */ @Api(tags = "å·¥èºè·¯çº¿å·¥åºåæ°æ¥å£") @RestController @RequestMapping("/productionOrderRouteItemParam") public class ProductionOrderRouteItemParamController { @Resource private IProductionOrderRouteItemParamService productionOrderRouteItemParamService; @GetMapping("/list") @ApiOperation("ç产订å-è·åå·¥åºç»å®çåæ°å表") public AjaxResult routeItemParamList(@RequestParam("orderId") Long orderId, @RequestParam("routeItemId") Long routeItemId) { List<ProductionOrderRouteItemParamDto> list = productionOrderRouteItemParamService.routeItemParamList(orderId, routeItemId); return AjaxResult.success(list); } @PostMapping("/add") @ApiOperation("ç产订å-å·¥åºæ°å¢åæ°") public AjaxResult addRouteItemParam(@RequestBody ProductionOrderRouteItemParamDto dto) { productionOrderRouteItemParamService.addRouteItemParam(dto); return AjaxResult.success(); } @PutMapping("/update") @ApiOperation("ç产订å-å·¥åºæ´æ°åæ°") public AjaxResult updateRouteItemParam(@RequestBody ProductionOrderRouteItemParamDto dto) { productionOrderRouteItemParamService.updateRouteItemParam(dto); return AjaxResult.success(); } @DeleteMapping("/delete/{id}") @ApiOperation("ç产订å-å·¥åºå é¤åæ°") public AjaxResult deleteRouteItemParam(@PathVariable Long id) { productionOrderRouteItemParamService.deleteRouteItemParam(id); return AjaxResult.success(); } } src/main/java/com/ruoyi/production/controller/ProductionOrderStructureController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,43 @@ package com.ruoyi.production.controller; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.production.dto.ProductionOrderStructureDto; import com.ruoyi.production.service.IProductionOrderStructureService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * <p> * ç产订åç»å®çBOMå表 å端æ§å¶å¨ * </p> * * @author deslrey * @since 2026-03-20 */ @Api(tags = "BOMç»ææ¥å£") @RestController @RequestMapping("/productionOrderStructure") public class ProductionOrderStructureController { @Resource private IProductionOrderStructureService productionOrderStructureService; @GetMapping("/getBomStructs/{orderId}") @ApiOperation("æ ¹æ®ç产订åIDè·åç»å®çBOMåéç»ææ ") public AjaxResult getBomStructs(@PathVariable Long orderId) { List<ProductionOrderStructureDto> list = productionOrderStructureService.listByOrderId(orderId); return AjaxResult.success(list); } @PutMapping("/addOrUpdateBomStructs") @ApiOperation("æ°å¢/æ´æ°BOMåéç»æ") public AjaxResult addOrUpdateBomStructs(@RequestBody ProductionOrderStructureDto instanceDto) { productionOrderStructureService.addOrUpdateBomStructs(instanceDto); return AjaxResult.success(); } } src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,23 @@ package com.ruoyi.production.dto; import com.ruoyi.production.pojo.ProductionOrderRouteItem; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; /** * <br> * ç产订åç»å®çå·¥èºè·¯çº¿--å·¥åºè¡¨Dto * </br> * * @author deslrey * @since 2026/03/20 */ @Data @EqualsAndHashCode(callSuper = false) public class ProductionOrderRouteItemDto extends ProductionOrderRouteItem { @ApiModelProperty("å·¥åºåç§°") private String processName; } src/main/java/com/ruoyi/production/dto/ProductionOrderRouteItemParamDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package com.ruoyi.production.dto; import com.ruoyi.production.pojo.ProductionOrderRouteItemParam; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; /** * <br> * ç产订åç»å®çå·¥èºè·¯çº¿å·¥åº--åæ°è¡¨Dto * </br> * * @author deslrey * @version 1.0 * @since 2026/03/20 10:11 */ @Data @EqualsAndHashCode(callSuper = false) public class ProductionOrderRouteItemParamDto extends ProductionOrderRouteItemParam { @ApiModelProperty("å·¥åºID") private Long processId; @ApiModelProperty("åºæ¬åæ°ID") private Long paramId; } src/main/java/com/ruoyi/production/dto/ProductionOrderStructureDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,34 @@ package com.ruoyi.production.dto; import com.ruoyi.production.pojo.ProductionOrderStructure; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.ArrayList; import java.util.List; /** * <br> * ç产订åç»å®çBOMå表Dto * </br> * * @author deslrey * @version 1.0 * @since 2026/03/20 10:12 */ @Data @EqualsAndHashCode(callSuper = false) public class ProductionOrderStructureDto extends ProductionOrderStructure { @ApiModelProperty("åç±»") private List<ProductionOrderStructureDto> children = new ArrayList<>(); @ApiModelProperty("临æ¶ID") private String tempId; @ApiModelProperty("ç¶èç¹ä¸´æ¶ID") private String parentTempId; } src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.production.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.production.pojo.ProductionOrderRouteItem; /** * <p> * ç产订åç»å®çå·¥èºè·¯çº¿--å·¥åºè¡¨ Mapper æ¥å£ * </p> * * @author deslrey * @since 2026-03-20 */ public interface ProductionOrderRouteItemMapper extends BaseMapper<ProductionOrderRouteItem> { } src/main/java/com/ruoyi/production/mapper/ProductionOrderRouteItemParamMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.production.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.production.pojo.ProductionOrderRouteItemParam; /** * <p> * ç产订åç»å®çå·¥èºè·¯çº¿å·¥åº--åæ°è¡¨ Mapper æ¥å£ * </p> * * @author deslrey * @since 2026-03-20 */ public interface ProductionOrderRouteItemParamMapper extends BaseMapper<ProductionOrderRouteItemParam> { } src/main/java/com/ruoyi/production/mapper/ProductionOrderStructureMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.production.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.production.pojo.ProductionOrderStructure; /** * <p> * ç产订åç»å®çBOMå表 Mapper æ¥å£ * </p> * * @author deslrey * @since 2026-03-20 */ public interface ProductionOrderStructureMapper extends BaseMapper<ProductionOrderStructure> { } src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItem.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,69 @@ package com.ruoyi.production.pojo; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; import java.io.Serializable; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * <p> * ç产订åç»å®çå·¥èºè·¯çº¿--å·¥åºè¡¨ * </p> * * @author deslrey * @since 2026-03-20 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("production_order_route_item") @ApiModel(value="ProductionOrderRouteItem对象", description="ç产订åç»å®çå·¥èºè·¯çº¿--å·¥åºè¡¨") public class ProductionOrderRouteItem implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty(value = "ç产订åid") private Long orderId; @ApiModelProperty(value = "å·¥èºè·¯çº¿id") private Long routeId; @ApiModelProperty(value = "产åid") private Long productModelId; @ApiModelProperty(value = "å·¥åºid") private Long processId; @ApiModelProperty(value = "ç§æ·id") private Long tenantId; @ApiModelProperty(value = "å½å ¥æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @ApiModelProperty(value = "æ´æ°æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; @ApiModelProperty(value = "æå¨æåº") private Integer dragSort; @ApiModelProperty(value = "æ¯å¦è´¨æ£å·¥åº(0å¦ 1æ¯)") private Integer isQuality; } src/main/java/com/ruoyi/production/pojo/ProductionOrderRouteItemParam.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,97 @@ package com.ruoyi.production.pojo; import java.math.BigDecimal; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDateTime; import java.io.Serializable; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; /** * <p> * ç产订åç»å®çå·¥èºè·¯çº¿å·¥åº--åæ°è¡¨ * </p> * * @author deslrey * @since 2026-03-20 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("production_order_route_item_param") @ApiModel(value="ProductionOrderRouteItemParam对象", description="ç产订åç»å®çå·¥èºè·¯çº¿å·¥åº--åæ°è¡¨") public class ProductionOrderRouteItemParam implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主é®ID") @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty(value = "ç产订åID") private Long orderId; @ApiModelProperty(value = "å ³èå·¥èºè·¯çº¿æç»ID (production_order_route_item.id)") private Long routeItemId; @ApiModelProperty(value = "æ¥æºå·¥åºåæ°ID") private Long processParamId; @ApiModelProperty(value = "åæ°å¯ä¸æ è¯") private String paramKey; @ApiModelProperty(value = "åæ°åç§°") private String paramName; @ApiModelProperty(value = "åæ°ç±»å(1æ°å 2ææ¬ 3䏿鿩 4æ¶é´)") private Integer paramType; @ApiModelProperty(value = "åæ°æ ¼å¼") private String paramFormat; @ApiModelProperty(value = "弿¨¡å¼(1åå¼ 2åºé´)") private Integer valueMode; @ApiModelProperty(value = "åä½") private String unit; @ApiModelProperty(value = "夿³¨") private String remark; @ApiModelProperty(value = "æ åå¼") private String standardValue; @ApiModelProperty(value = "æ¤è·¯çº¿èç¹è®¾å®çæ åæå°å¼") private BigDecimal minValue; @ApiModelProperty(value = "æ¤è·¯çº¿èç¹è®¾å®çæ åæå¤§å¼") private BigDecimal maxValue; @ApiModelProperty(value = "æ¯å¦å¿ å¡«") private Boolean isRequired; @ApiModelProperty(value = "æåº") private Integer sort; @ApiModelProperty(value = "ç§æ·ID") private Long tenantId; @ApiModelProperty(value = "å建æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty(value = "æ´æ°æ¶é´") @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/production/pojo/ProductionOrderStructure.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,62 @@ package com.ruoyi.production.pojo; import java.math.BigDecimal; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.io.Serializable; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * <p> * ç产订åç»å®çBOMå表 * </p> * * @author deslrey * @since 2026-03-20 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("production_order_structure") @ApiModel(value="ProductionOrderStructure对象", description="ç产订åç»å®çBOMå表") public class ProductionOrderStructure implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty(value = "ç产订åid") private Long orderId; @ApiModelProperty(value = "ç¶èç¹ID") private Long parentId; @ApiModelProperty(value = "产åid") private Long productModelId; @ApiModelProperty(value = "å·¥åºid") private Long processId; @ApiModelProperty(value = "åä½äº§åºéè¦æ°é") private BigDecimal unitQuantity; @ApiModelProperty(value = "éæ±æ°é") private BigDecimal demandedQuantity; @ApiModelProperty(value = "åä½") private String unit; @ApiModelProperty(value = "ç§æ·id") private Long tenantId; @ApiModelProperty(value = "bomçid") private Long bomId; } src/main/java/com/ruoyi/production/service/IProductionOrderAppendixService.java
ÎļþÃû´Ó src/main/java/com/ruoyi/appendix/service/AppendixService.java ÐÞ¸Ä @@ -1,4 +1,4 @@ package com.ruoyi.appendix.service; package com.ruoyi.production.service; import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.productionPlan.dto.ProductionPlanDto; @@ -10,9 +10,9 @@ * * @author deslrey * @version 1.0 * @since 2026/03/18 14:45 * @since 2026/03/20 */ public interface AppendixService { public interface IProductionOrderAppendixService { /** * å°å¯¹åºçå·¥èºè·¯çº¿åéä¸ç»å®çBOMåéå¡«å å°éè¡¨ä¸ src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemParamService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.ruoyi.production.service; import com.ruoyi.production.dto.ProductionOrderRouteItemParamDto; import com.ruoyi.production.pojo.ProductionOrderRouteItemParam; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; /** * <p> * ç产订åç»å®çå·¥èºè·¯çº¿å·¥åº--åæ°è¡¨ æå¡ç±» * </p> * * @author deslrey * @since 2026-03-20 */ public interface IProductionOrderRouteItemParamService extends IService<ProductionOrderRouteItemParam> { List<ProductionOrderRouteItemParamDto> routeItemParamList(Long orderId, Long routeItemId); void addRouteItemParam(ProductionOrderRouteItemParamDto dto); void updateRouteItemParam(ProductionOrderRouteItemParamDto dto); void deleteRouteItemParam(Long id); } src/main/java/com/ruoyi/production/service/IProductionOrderRouteItemService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ package com.ruoyi.production.service; import com.ruoyi.production.dto.ProductionOrderRouteItemDto; import com.ruoyi.production.pojo.ProductionOrderRouteItem; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; /** * <p> * ç产订åç»å®çå·¥èºè·¯çº¿--å·¥åºè¡¨ æå¡ç±» * </p> * * @author deslrey * @since 2026-03-20 */ public interface IProductionOrderRouteItemService extends IService<ProductionOrderRouteItem> { List<ProductionOrderRouteItemDto> getProcessItem(Long orderId); void addProcessItem(ProductionOrderRouteItemDto dto); void updateProcessItem(ProductionOrderRouteItemDto dto); void deleteProcessItem(Long id); void sortProcessItem(ProductionOrderRouteItemDto dto); } src/main/java/com/ruoyi/production/service/IProductionOrderStructureService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.production.service; import com.ruoyi.production.dto.ProductionOrderStructureDto; import com.ruoyi.production.pojo.ProductionOrderStructure; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; /** * <p> * ç产订åç»å®çBOMå表 æå¡ç±» * </p> * * @author deslrey * @since 2026-03-20 */ public interface IProductionOrderStructureService extends IService<ProductionOrderStructure> { List<ProductionOrderStructureDto> listByOrderId(Long orderId); void addOrUpdateBomStructs(ProductionOrderStructureDto instanceDto); } src/main/java/com/ruoyi/production/service/impl/ProductionOrderAppendixServiceImpl.java
ÎļþÃû´Ó src/main/java/com/ruoyi/appendix/service/impl/AppendixServiceImpl.java ÐÞ¸Ä @@ -1,10 +1,6 @@ package com.ruoyi.appendix.service.impl; package com.ruoyi.production.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.ProductStructureInstance; import com.ruoyi.appendix.service.*; import com.ruoyi.basic.service.BaseParamService; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; @@ -23,25 +19,25 @@ /** * <br> * BOM-å·¥èºè·¯çº¿é表Serviceæ¥å£å®ç°ç±» * * </br> * * @author deslrey * @version 1.0 * @since 2026/03/18 14:45 * @since 2026/03/20 */ @Slf4j @Service public class AppendixServiceImpl implements AppendixService { public class ProductionOrderAppendixServiceImpl implements IProductionOrderAppendixService { @Resource private ProcessRouteItemInstanceService processRouteItemInstanceService; private IProductionOrderRouteItemService productionOrderRouteItemService; @Resource private ProcessRouteItemParamInstanceService processRouteItemParamInstanceService; private IProductionOrderRouteItemParamService productionOrderRouteItemParamService; @Resource private ProductStructureInstanceService productStructureInstanceService; private IProductionOrderStructureService productionOrderStructureService; @Resource private BaseParamService baseParamService; @@ -114,20 +110,20 @@ @Override public void deleteData(Long orderId, Long processRouteId) { // å é¤å·¥èºè·¯çº¿å·¥åºåæ°é表 processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>() .eq(ProcessRouteItemParamInstance::getOrderId, orderId)); productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>() .eq(ProductionOrderRouteItemParam::getOrderId, orderId)); // å é¤å·¥èºè·¯çº¿åéé表 processRouteItemInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemInstance>() .eq(ProcessRouteItemInstance::getOrderId, orderId) .eq(ProcessRouteItemInstance::getRouteId, processRouteId)); productionOrderRouteItemService.remove(new LambdaQueryWrapper<ProductionOrderRouteItem>() .eq(ProductionOrderRouteItem::getOrderId, orderId) .eq(ProductionOrderRouteItem::getRouteId, processRouteId)); // å é¤BOMåéé表 ProcessRoute processRoute = processRouteService.getById(processRouteId); if (processRoute != null && processRoute.getBomId() != null) { productStructureInstanceService.remove(new LambdaQueryWrapper<ProductStructureInstance>() .eq(ProductStructureInstance::getOrderId, orderId) .eq(ProductStructureInstance::getBomId, processRoute.getBomId())); productionOrderStructureService.remove(new LambdaQueryWrapper<ProductionOrderStructure>() .eq(ProductionOrderStructure::getOrderId, orderId) .eq(ProductionOrderStructure::getBomId, processRoute.getBomId())); } } @@ -138,12 +134,12 @@ // è¿ç§»å·¥èºè·¯çº¿åéè¡¨æ°æ®ï¼è¿åæ§id->æ°instanceæ å° List<ProcessRouteItem> processRouteItemList = processRouteItemService.list( new LambdaQueryWrapper<ProcessRouteItem>().eq(ProcessRouteItem::getRouteId, processRoute.getId())); Map<Long, ProcessRouteItemInstance> routeItemOldIdMap = migrationProcessRouteItem(orderId, processRouteItemList); Map<Long, ProductionOrderRouteItem> routeItemOldIdMap = migrationProcessRouteItem(orderId, processRouteItemList); // è¿ç§»å·¥èºè·¯çº¿å ç»å®çå·¥åºåæ° if (processRouteItemList != null && !processRouteItemList.isEmpty()) { for (ProcessRouteItem item : processRouteItemList) { ProcessRouteItemInstance newInstance = routeItemOldIdMap.get(item.getId()); ProductionOrderRouteItem newInstance = routeItemOldIdMap.get(item.getId()); Long newRouteItemInstanceId = newInstance != null ? newInstance.getId() : item.getId(); List<ProcessRouteItemParam> paramList = processRouteItemParamService.list( @@ -160,13 +156,13 @@ } } private Map<Long, ProcessRouteItemInstance> migrationProcessRouteItem(Long orderId, List<ProcessRouteItem> list) { Map<Long, ProcessRouteItemInstance> oldIdMap = new HashMap<>(); private Map<Long, ProductionOrderRouteItem> migrationProcessRouteItem(Long orderId, List<ProcessRouteItem> list) { Map<Long, ProductionOrderRouteItem> oldIdMap = new HashMap<>(); if (list == null || list.isEmpty()) { return oldIdMap; } List<ProcessRouteItemInstance> instances = list.stream().map(item -> { ProcessRouteItemInstance instance = new ProcessRouteItemInstance(); List<ProductionOrderRouteItem> instances = list.stream().map(item -> { ProductionOrderRouteItem instance = new ProductionOrderRouteItem(); BeanUtils.copyProperties(item, instance, "id"); instance.setIsQuality(item.getIsQuality() != null && item.getIsQuality() ? 1 : 0); instance.setOrderId(orderId); @@ -175,7 +171,7 @@ } return instance; }).collect(Collectors.toList()); processRouteItemInstanceService.saveBatch(instances); productionOrderRouteItemService.saveBatch(instances); return oldIdMap; } @@ -183,23 +179,23 @@ if (list == null || list.isEmpty()) { return; } List<ProcessRouteItemParamInstance> instances = list.stream().map(item -> { ProcessRouteItemParamInstance instance = new ProcessRouteItemParamInstance(); List<ProductionOrderRouteItemParam> instances = list.stream().map(item -> { ProductionOrderRouteItemParam instance = new ProductionOrderRouteItemParam(); BeanUtils.copyProperties(item, instance, "id"); instance.setOrderId(orderId); instance.setRouteItemId(newRouteItemInstanceId); return instance; }).collect(Collectors.toList()); processRouteItemParamInstanceService.saveBatch(instances); productionOrderRouteItemParamService.saveBatch(instances); } private void migrationProductStructure(Long orderId, List<ProductStructure> list) { if (list == null || list.isEmpty()) { return; } Map<Long, ProductStructureInstance> oldIdMap = new HashMap<>(); List<ProductStructureInstance> instances = list.stream().map(item -> { ProductStructureInstance instance = new ProductStructureInstance(); Map<Long, ProductionOrderStructure> oldIdMap = new HashMap<>(); List<ProductionOrderStructure> instances = list.stream().map(item -> { ProductionOrderStructure instance = new ProductionOrderStructure(); BeanUtils.copyProperties(item, instance, "id"); instance.setBomId(item.getBomId() != null ? item.getBomId().longValue() : null); instance.setOrderId(orderId); @@ -208,7 +204,7 @@ } return instance; }).collect(Collectors.toList()); productStructureInstanceService.saveBatch(instances); productionOrderStructureService.saveBatch(instances); // æ°å¢åæidï¼æ§id->æ°idï¼ä¿®æ£parentId Map<Long, Long> oldToNewId = new HashMap<>(); @@ -218,12 +214,12 @@ } }); List<ProductStructureInstance> toUpdate = instances.stream() List<ProductionOrderStructure> toUpdate = instances.stream() .filter(i -> i.getParentId() != null && oldToNewId.containsKey(i.getParentId())) .peek(i -> i.setParentId(oldToNewId.get(i.getParentId()))) .collect(Collectors.toList()); if (!toUpdate.isEmpty()) { productStructureInstanceService.updateBatchById(toUpdate); productionOrderStructureService.updateBatchById(toUpdate); } } } src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemParamServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,122 @@ package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.pojo.BaseParam; import com.ruoyi.basic.service.BaseParamService; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.production.dto.ProductionOrderRouteItemParamDto; import com.ruoyi.production.mapper.ProductionOrderRouteItemParamMapper; import com.ruoyi.production.pojo.ProductionOrderRouteItemParam; import com.ruoyi.production.service.IProductionOrderRouteItemParamService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; /** * <p> * ç产订åç»å®çå·¥èºè·¯çº¿å·¥åº--åæ°è¡¨ æå¡å®ç°ç±» * </p> * * @author deslrey * @since 2026-03-20 */ @Slf4j @Service public class ProductionOrderRouteItemParamServiceImpl extends ServiceImpl<ProductionOrderRouteItemParamMapper, ProductionOrderRouteItemParam> implements IProductionOrderRouteItemParamService { @Autowired private BaseParamService baseParamService; @Override public List<ProductionOrderRouteItemParamDto> routeItemParamList(Long orderId, Long routeItemId) { List<ProductionOrderRouteItemParam> list = list(new LambdaQueryWrapper<ProductionOrderRouteItemParam>() .eq(ProductionOrderRouteItemParam::getOrderId, orderId) .eq(ProductionOrderRouteItemParam::getRouteItemId, routeItemId) .orderByAsc(ProductionOrderRouteItemParam::getSort)); return list.stream().map(item -> { ProductionOrderRouteItemParamDto dto = new ProductionOrderRouteItemParamDto(); BeanUtils.copyProperties(item, dto); return dto; }).collect(Collectors.toList()); } @Override @Transactional(rollbackFor = Exception.class) public void addRouteItemParam(ProductionOrderRouteItemParamDto dto) { if (dto == null) { throw new ServiceException("æ°å¢æ°æ®ä¸è½ä¸ºç©º"); } if (dto.getOrderId() == null) { throw new ServiceException("ç产订åIDä¸è½ä¸ºç©º"); } if (dto.getRouteItemId() == null) { throw new ServiceException("å·¥èºè·¯çº¿æç»IDä¸è½ä¸ºç©º"); } Long tenantId = SecurityUtils.getLoginUser().getTenantId(); BaseParam baseParam = baseParamService.getById(dto.getParamId()); if (baseParam == null) { throw new ServiceException("æ°å¢åæ°ä¸åå¨"); } ProductionOrderRouteItemParam entity = new ProductionOrderRouteItemParam(); BeanUtils.copyProperties(dto, entity); entity.setId(null); entity.setOrderId(dto.getOrderId()); entity.setRouteItemId(dto.getRouteItemId()); entity.setIsRequired(dto.getIsRequired()); // åå½å订å+路线æç»ä¸æå¤§ sort + 1 ProductionOrderRouteItemParam maxSortItem = getOne(new LambdaQueryWrapper<ProductionOrderRouteItemParam>() .select(ProductionOrderRouteItemParam::getSort) .eq(ProductionOrderRouteItemParam::getOrderId, dto.getOrderId()) .eq(ProductionOrderRouteItemParam::getRouteItemId, dto.getRouteItemId()) .orderByDesc(ProductionOrderRouteItemParam::getSort) .last("limit 1")); entity.setSort(maxSortItem != null && maxSortItem.getSort() != null ? maxSortItem.getSort() + 1 : 1); entity.setParamKey(baseParam.getParamKey()); entity.setParamName(baseParam.getParamName()); entity.setParamFormat(baseParam.getParamFormat()); entity.setParamType(baseParam.getParamType()); entity.setValueMode(baseParam.getValueMode()); entity.setUnit(baseParam.getUnit()); entity.setRemark(baseParam.getRemark()); entity.setTenantId(tenantId); entity.setCreateTime(LocalDateTime.now()); save(entity); } @Override public void updateRouteItemParam(ProductionOrderRouteItemParamDto dto) { if (dto == null || dto.getId() == null) { throw new ServiceException("æ´æ°æ°æ®æIDä¸è½ä¸ºç©º"); } if (getById(dto.getId()) == null) { throw new ServiceException("æ°æ®ä¸åå¨"); } ProductionOrderRouteItemParam entity = new ProductionOrderRouteItemParam(); BeanUtils.copyProperties(dto, entity); entity.setUpdateTime(LocalDateTime.now()); updateById(entity); } @Override @Transactional(rollbackFor = Exception.class) public void deleteRouteItemParam(Long id) { if (id == null) { throw new ServiceException("IDä¸è½ä¸ºç©º"); } if (getById(id) == null) { throw new ServiceException("æ°æ®ä¸åå¨"); } removeById(id); } } src/main/java/com/ruoyi/production/service/impl/ProductionOrderRouteItemServiceImpl.java
ÎļþÃû´Ó src/main/java/com/ruoyi/appendix/service/impl/ProcessRouteItemInstanceServiceImpl.java ÐÞ¸Ä @@ -1,17 +1,17 @@ package com.ruoyi.appendix.service.impl; package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.appendix.dto.ProcessRouteItemInstanceDto; import com.ruoyi.appendix.mapper.ProcessRouteItemInstanceMapper; import com.ruoyi.appendix.pojo.ProcessRouteItemInstance; import com.ruoyi.appendix.pojo.ProcessRouteItemParamInstance; import com.ruoyi.appendix.service.ProcessRouteItemInstanceService; import com.ruoyi.appendix.service.ProcessRouteItemParamInstanceService; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.production.dto.ProductionOrderRouteItemDto; import com.ruoyi.production.mapper.ProductionOrderRouteItemMapper; import com.ruoyi.production.pojo.ProcessRouteItemParam; import com.ruoyi.production.pojo.ProductProcess; import com.ruoyi.production.pojo.ProductionOrderRouteItem; import com.ruoyi.production.pojo.ProductionOrderRouteItemParam; import com.ruoyi.production.service.IProductionOrderRouteItemParamService; import com.ruoyi.production.service.IProductionOrderRouteItemService; import com.ruoyi.production.service.ProcessRouteItemParamService; import com.ruoyi.production.service.ProductProcessService; import lombok.extern.slf4j.Slf4j; @@ -24,34 +24,33 @@ import java.util.stream.Collectors; /** * <br> * å·¥èºè·¯çº¿åé-é表Serviceå®ç°ç±» * </br> * <p> * ç产订åç»å®çå·¥èºè·¯çº¿--å·¥åºè¡¨ æå¡å®ç°ç±» * </p> * * @author deslrey * @version 1.0 * @since 2026/03/18 13:08 * @since 2026-03-20 */ @Slf4j @Service public class ProcessRouteItemInstanceServiceImpl extends ServiceImpl<ProcessRouteItemInstanceMapper, ProcessRouteItemInstance> implements ProcessRouteItemInstanceService { public class ProductionOrderRouteItemServiceImpl extends ServiceImpl<ProductionOrderRouteItemMapper, ProductionOrderRouteItem> implements IProductionOrderRouteItemService { @Resource private ProductProcessService productProcessService; @Resource private ProcessRouteItemParamInstanceService processRouteItemParamInstanceService; private IProductionOrderRouteItemParamService productionOrderRouteItemParamService; @Resource private ProcessRouteItemParamService processRouteItemParamService; @Override public List<ProcessRouteItemInstanceDto> getProcessItem(Long orderId) { List<ProcessRouteItemInstance> list = list(new LambdaQueryWrapper<ProcessRouteItemInstance>() .eq(ProcessRouteItemInstance::getOrderId, orderId) .orderByAsc(ProcessRouteItemInstance::getDragSort)); public List<ProductionOrderRouteItemDto> getProcessItem(Long orderId) { List<ProductionOrderRouteItem> list = list(new LambdaQueryWrapper<ProductionOrderRouteItem>() .eq(ProductionOrderRouteItem::getOrderId, orderId) .orderByAsc(ProductionOrderRouteItem::getDragSort)); return list.stream().map(item -> { ProcessRouteItemInstanceDto dto = new ProcessRouteItemInstanceDto(); ProductionOrderRouteItemDto dto = new ProductionOrderRouteItemDto(); BeanUtils.copyProperties(item, dto); if (item.getProcessId() != null) { ProductProcess process = productProcessService.getById(item.getProcessId()); @@ -64,7 +63,7 @@ } @Override public void addProcessItem(ProcessRouteItemInstanceDto dto) { public void addProcessItem(ProductionOrderRouteItemDto dto) { if (dto == null) { throw new ServiceException("æ°å¢æ°æ®ä¸è½ä¸ºç©º"); } @@ -74,51 +73,51 @@ if (dto.getProcessId() == null) { throw new ServiceException("å·¥åºIDä¸è½ä¸ºç©º"); } ProcessRouteItemInstance entity = new ProcessRouteItemInstance(); ProductionOrderRouteItem entity = new ProductionOrderRouteItem(); BeanUtils.copyProperties(dto, entity); entity.setId(null); entity.setTenantId(SecurityUtils.getLoginUser().getTenantId()); entity.setCreateTime(LocalDateTime.now()); // åå½å订å䏿大 dragSort + 1 ProcessRouteItemInstance maxSortItem = getOne(new LambdaQueryWrapper<ProcessRouteItemInstance>() .eq(ProcessRouteItemInstance::getOrderId, dto.getOrderId()) .orderByDesc(ProcessRouteItemInstance::getDragSort) ProductionOrderRouteItem maxSortItem = getOne(new LambdaQueryWrapper<ProductionOrderRouteItem>() .eq(ProductionOrderRouteItem::getOrderId, dto.getOrderId()) .orderByDesc(ProductionOrderRouteItem::getDragSort) .last("limit 1")); entity.setDragSort(maxSortItem != null && maxSortItem.getDragSort() != null ? maxSortItem.getDragSort() + 1 : 1); save(entity); } @Override public void updateProcessItem(ProcessRouteItemInstanceDto dto) { public void updateProcessItem(ProductionOrderRouteItemDto dto) { if (dto == null || dto.getId() == null) { throw new ServiceException("æ´æ°æ°æ®æIDä¸è½ä¸ºç©º"); } ProcessRouteItemInstance old = getById(dto.getId()); ProductionOrderRouteItem old = getById(dto.getId()); if (old == null) { throw new ServiceException("æ°æ®ä¸åå¨"); } // å·¥åºåæ´ï¼å 餿§åæ°é表ï¼è¿ç§»æ°å·¥åºåæ° if (dto.getProcessId() != null && !dto.getProcessId().equals(old.getProcessId())) { // å é¤å·¥èºè·¯çº¿å·¥åºåæ°é表 processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>() .eq(ProcessRouteItemParamInstance::getOrderId, old.getOrderId()) .eq(ProcessRouteItemParamInstance::getRouteItemId, old.getId())); productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>() .eq(ProductionOrderRouteItemParam::getOrderId, old.getOrderId()) .eq(ProductionOrderRouteItemParam::getRouteItemId, old.getId())); // è¿ç§»æ°å·¥åºç process_route_item_param List<ProcessRouteItemParam> routeItemParams = processRouteItemParamService.list( new LambdaQueryWrapper<ProcessRouteItemParam>().eq(ProcessRouteItemParam::getRouteItemId, old.getId())); if (!routeItemParams.isEmpty()) { List<ProcessRouteItemParamInstance> newInstances = routeItemParams.stream().map(p -> { ProcessRouteItemParamInstance instance = new ProcessRouteItemParamInstance(); List<ProductionOrderRouteItemParam> newInstances = routeItemParams.stream().map(p -> { ProductionOrderRouteItemParam instance = new ProductionOrderRouteItemParam(); BeanUtils.copyProperties(p, instance, "id"); instance.setOrderId(old.getOrderId()); return instance; }).collect(Collectors.toList()); processRouteItemParamInstanceService.saveBatch(newInstances); productionOrderRouteItemParamService.saveBatch(newInstances); } } ProcessRouteItemInstance entity = new ProcessRouteItemInstance(); ProductionOrderRouteItem entity = new ProductionOrderRouteItem(); BeanUtils.copyProperties(dto, entity); entity.setUpdateTime(LocalDateTime.now()); updateById(entity); @@ -129,35 +128,35 @@ if (id == null) { throw new ServiceException("IDä¸è½ä¸ºç©º"); } ProcessRouteItemInstance old = getById(id); ProductionOrderRouteItem old = getById(id); if (old == null) { throw new ServiceException("æ°æ®ä¸åå¨"); } // å é¤å·¥èºè·¯çº¿å·¥åºåæ°é表 processRouteItemParamInstanceService.remove(new LambdaQueryWrapper<ProcessRouteItemParamInstance>() .eq(ProcessRouteItemParamInstance::getOrderId, old.getOrderId()) .eq(ProcessRouteItemParamInstance::getRouteItemId, id)); productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>() .eq(ProductionOrderRouteItemParam::getOrderId, old.getOrderId()) .eq(ProductionOrderRouteItemParam::getRouteItemId, id)); removeById(id); } @Override public void sortProcessItem(ProcessRouteItemInstanceDto dto) { public void sortProcessItem(ProductionOrderRouteItemDto dto) { if (dto == null || dto.getId() == null) { throw new ServiceException("æ°æ®æIDä¸è½ä¸ºç©º"); } ProcessRouteItemInstance old = getById(dto.getId()); ProductionOrderRouteItem old = getById(dto.getId()); if (old == null) { throw new ServiceException("æ°æ®ä¸åå¨"); } List<ProcessRouteItemInstance> items = list(new LambdaQueryWrapper<ProcessRouteItemInstance>() .eq(ProcessRouteItemInstance::getOrderId, old.getOrderId()) .orderByAsc(ProcessRouteItemInstance::getDragSort)); List<ProductionOrderRouteItem> items = list(new LambdaQueryWrapper<ProductionOrderRouteItem>() .eq(ProductionOrderRouteItem::getOrderId, old.getOrderId()) .orderByAsc(ProductionOrderRouteItem::getDragSort)); Integer targetPosition = dto.getDragSort(); if (targetPosition != null && targetPosition >= 1) { items.removeIf(item -> item.getId().equals(old.getId())); items.add(targetPosition - 1, old); for (int i = 0; i < items.size(); i++) { ProcessRouteItemInstance item = items.get(i); ProductionOrderRouteItem item = items.get(i); int newSort = i + 1; if (!item.getId().equals(old.getId())) { if (!Integer.valueOf(newSort).equals(item.getDragSort())) { src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,151 @@ package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.production.dto.ProductionOrderStructureDto; import com.ruoyi.production.mapper.ProductionOrderStructureMapper; import com.ruoyi.production.pojo.ProductionOrderStructure; import com.ruoyi.production.service.IProductionOrderStructureService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; /** * <p> * ç产订åç»å®çBOMå表 æå¡å®ç°ç±» * </p> * * @author deslrey * @since 2026-03-20 */ @Slf4j @Service public class ProductionOrderStructureServiceImpl extends ServiceImpl<ProductionOrderStructureMapper, ProductionOrderStructure> implements IProductionOrderStructureService { @Override public List<ProductionOrderStructureDto> listByOrderId(Long orderId) { List<ProductionOrderStructure> list = list(new LambdaQueryWrapper<ProductionOrderStructure>().eq(ProductionOrderStructure::getOrderId, orderId)); List<ProductionOrderStructureDto> dtoList = list.stream().map(item -> { ProductionOrderStructureDto dto = new ProductionOrderStructureDto(); BeanUtils.copyProperties(item, dto); return dto; }).collect(Collectors.toList()); Map<Long, ProductionOrderStructureDto> map = new HashMap<>(); for (ProductionOrderStructureDto node : dtoList) { map.put(node.getId(), node); } List<ProductionOrderStructureDto> tree = new ArrayList<>(); for (ProductionOrderStructureDto node : dtoList) { Long parentId = node.getParentId(); if (parentId == null || !map.containsKey(parentId)) { tree.add(node); } else { map.get(parentId).getChildren().add(node); } } return tree; } @Override public void addOrUpdateBomStructs(ProductionOrderStructureDto instanceDto) { Long orderId = instanceDto.getOrderId(); // æå¹³ååç«¯ä¼ å ¥çæ List<ProductionOrderStructureDto> flatList = new ArrayList<>(); flattenTree(instanceDto.getChildren(), flatList); // æ¥è¯¢æ°æ®åºå·²ææ°æ® List<ProductionOrderStructure> dbList = list(new LambdaQueryWrapper<ProductionOrderStructure>() .eq(ProductionOrderStructure::getOrderId, orderId)); // å端已æidéå Set<Long> frontendIds = flatList.stream() .map(ProductionOrderStructureDto::getId) .filter(Objects::nonNull) .collect(Collectors.toSet()); // éè¦å é¤çèç¹ Set<Long> deleteIds = dbList.stream() .map(ProductionOrderStructure::getId) .filter(id -> !frontendIds.contains(id)) .collect(Collectors.toSet()); if (!deleteIds.isEmpty()) { removeByIds(deleteIds); } List<ProductionOrderStructure> insertList = new ArrayList<>(); List<ProductionOrderStructure> updateList = new ArrayList<>(); Map<String, ProductionOrderStructure> tempEntityMap = new HashMap<>(); for (ProductionOrderStructureDto dto : flatList) { ProductionOrderStructure entity = new ProductionOrderStructure(); BeanUtils.copyProperties(dto, entity); entity.setOrderId(orderId); if (dto.getId() == null) { entity.setId(null); entity.setParentId(null); insertList.add(entity); if (dto.getTempId() != null) { tempEntityMap.put(dto.getTempId(), entity); } } else { updateList.add(entity); } } if (!insertList.isEmpty()) { saveBatch(insertList); } // ååæ°å¢èç¹ç parentId List<ProductionOrderStructure> parentFixList = new ArrayList<>(); for (ProductionOrderStructureDto dto : flatList) { if (dto.getId() != null) continue; ProductionOrderStructure child = tempEntityMap.get(dto.getTempId()); if (child == null) continue; String parentTempId = dto.getParentTempId(); if (parentTempId != null && !parentTempId.isEmpty()) { Long realParentId; if (tempEntityMap.containsKey(parentTempId)) { realParentId = tempEntityMap.get(parentTempId).getId(); } else { try { realParentId = Long.valueOf(parentTempId); } catch (NumberFormatException e) { realParentId = 0L; } } child.setParentId(realParentId); } else { child.setParentId(0L); } parentFixList.add(child); } if (!parentFixList.isEmpty()) { updateBatchById(parentFixList); } if (!updateList.isEmpty()) { updateBatchById(updateList); } } private void flattenTree(List<ProductionOrderStructureDto> source, List<ProductionOrderStructureDto> result) { if (source == null) return; for (ProductionOrderStructureDto node : source) { result.add(node); flattenTree(node.getChildren(), result); } } } src/main/resources/mapper/production/ProductionOrderRouteItemMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ <?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.production.mapper.ProductionOrderRouteItemMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionOrderRouteItem"> <id column="id" property="id"/> <result column="order_id" property="orderId"/> <result column="route_id" property="routeId"/> <result column="product_model_id" property="productModelId"/> <result column="process_id" property="processId"/> <result column="tenant_id" property="tenantId"/> <result column="create_time" property="createTime"/> <result column="update_time" property="updateTime"/> <result column="drag_sort" property="dragSort"/> <result column="is_quality" property="isQuality"/> </resultMap> </mapper> src/main/resources/mapper/production/ProductionOrderRouteItemParamMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ <?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.production.mapper.ProductionOrderRouteItemParamMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionOrderRouteItemParam"> <id column="id" property="id"/> <result column="order_id" property="orderId"/> <result column="route_item_id" property="routeItemId"/> <result column="process_param_id" property="processParamId"/> <result column="param_key" property="paramKey"/> <result column="param_name" property="paramName"/> <result column="param_type" property="paramType"/> <result column="param_format" property="paramFormat"/> <result column="value_mode" property="valueMode"/> <result column="unit" property="unit"/> <result column="remark" property="remark"/> <result column="standard_value" property="standardValue"/> <result column="min_value" property="minValue"/> <result column="max_value" property="maxValue"/> <result column="is_required" property="isRequired"/> <result column="sort" property="sort"/> <result column="tenant_id" property="tenantId"/> <result column="create_time" property="createTime"/> <result column="update_time" property="updateTime"/> </resultMap> </mapper> src/main/resources/mapper/production/ProductionOrderStructureMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ <?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.production.mapper.ProductionOrderStructureMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionOrderStructure"> <id column="id" property="id"/> <result column="order_id" property="orderId"/> <result column="parent_id" property="parentId"/> <result column="product_model_id" property="productModelId"/> <result column="process_id" property="processId"/> <result column="unit_quantity" property="unitQuantity"/> <result column="demanded_quantity" property="demandedQuantity"/> <result column="unit" property="unit"/> <result column="tenant_id" property="tenantId"/> <result column="bom_id" property="bomId"/> </resultMap> </mapper>