| 2026-03-20 | gongchunyi | ![]() |
| 2026-03-20 | gongchunyi | ![]() |
| 2026-03-20 | gongchunyi | ![]() |
| 2026-03-20 | gongchunyi | ![]() |
| 2026-03-20 | gongchunyi | ![]() |
| 2026-03-20 | gongchunyi | ![]() |
| 2026-03-20 | gongchunyi | ![]() |
| 2026-03-20 | gongchunyi | ![]() |
| 2026-03-20 | gongchunyi | ![]() |
| 2026-03-20 | gongchunyi | ![]() |
| 2026-03-20 | gongchunyi | ![]() |
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`; @@ -423,4 +334,84 @@ ADD COLUMN `param_format` varchar(255) DEFAULT NULL COMMENT 'åæ°æ ¼å¼', ADD COLUMN `value_mode` tinyint DEFAULT '1' COMMENT '弿¨¡å¼(1åå¼ 2åºé´)', ADD COLUMN `unit` varchar(50) DEFAULT NULL COMMENT 'åä½', ADD COLUMN `remark` varchar(255) DEFAULT NULL COMMENT '夿³¨'; ADD COLUMN `remark` varchar(255) DEFAULT NULL COMMENT '夿³¨'; 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`, 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/ProcessRouteItemInstanceServiceImpl.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/ProductOrderController.java
@@ -1,13 +1,13 @@ package com.ruoyi.production.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.domain.R; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.pojo.ProcessRoute; import com.ruoyi.production.dto.ProductOrderSourceDto; import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.service.ProductOrderService; import io.swagger.annotations.Api; @@ -16,7 +16,6 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @RequestMapping("/productOrder") @@ -48,8 +47,14 @@ @PostMapping("/revoke") @ApiOperation("æ¤åç产计å") public R revoke(@RequestBody ProductOrder productOrder) { return R.ok(productOrderService.revoke(productOrder)); public R revoke(@RequestBody List<Long> ids) { return R.ok(productOrderService.revoke(ids)); } @ApiOperation("å é¤ç产订å") @DeleteMapping("/{id}") public R delete(@PathVariable("id") Long ids) { return R.ok(productOrderService.delete(ids)); } /** @@ -76,9 +81,11 @@ return R.ok(productOrderService.addProductOrder(productOrder)); } @ApiOperation("å é¤ç产订å") @DeleteMapping("/{ids}") public R delete(@PathVariable("ids") Long[] ids) { return R.ok(productOrderService.delete(ids)); @GetMapping("/productOrderSource/{orderId}") @ApiOperation("æ¥çç产订å对åºçç产计å") public AjaxResult productOrderSource(@PathVariable Long orderId) { List<ProductOrderSourceDto> list = productOrderService.productOrderSource(orderId); return AjaxResult.success(list); } } src/main/java/com/ruoyi/production/controller/ProductStructureController.java
@@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.*; import java.util.Arrays; import java.util.List; @RequestMapping("productStructure") @RestController @@ -27,9 +28,9 @@ @ApiOperation("æ°å¢BOMåé") @PostMapping() public R addOrUpdate(@RequestBody ProductStructureDto productStructureDto){ return R.ok(productStructureService.addProductStructureDto(productStructureDto)); @PostMapping("/{bomId}") public R addOrUpdate(@PathVariable Integer bomId, @RequestBody List<ProductStructureDto> list){ return R.ok(productStructureService.addProductStructureDto(bomId, list)); } @ApiOperation("BOMæ¥çåé详æ ") src/main/java/com/ruoyi/production/controller/ProductionOrderAppendixController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ package com.ruoyi.production.controller; 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/{orderId}") @ApiOperation("æ°å¢/æ´æ°BOMåéç»æ") public AjaxResult addOrUpdateBomStructs(@PathVariable Long orderId, @RequestBody List<ProductionOrderStructureDto> list) { productionOrderStructureService.addOrUpdateBomStructs(orderId, list); return AjaxResult.success(); } } src/main/java/com/ruoyi/production/dto/ProductOrderSourceDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ package com.ruoyi.production.dto; import com.ruoyi.productionPlan.dto.ProductionPlanDto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; /** * <br> * çäº§è®¢åæ¥æº-主ç产计å * </br> * * @author deslrey * @version 1.0 * @since 2026/03/20 */ @Data @ApiModel(value = "ProductOrderSourceDto", description = "çäº§è®¢åæ¥æº-主ç产计å") public class ProductOrderSourceDto { @ApiModelProperty("ç³è¯·åç¼å·") private String applyNo; @ApiModelProperty("主çäº§è®¡åæ°æ®") private List<ProductionPlanDto> productPlans; } 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,42 @@ 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; @ApiModelProperty("å·¥åºåç§°") private String processName; @ApiModelProperty("产ååç§°") private String productName; @ApiModelProperty("产åè§æ ¼") private String model; } src/main/java/com/ruoyi/production/enums/ProductOrderStatusEnum.java
@@ -43,13 +43,20 @@ } /** * 夿æ¯å¦å 许å é¤ï¼1ã4ï¼ * 夿æ¯å¦å 许å é¤ï¼4ï¼ */ public static boolean canDelete(Integer code) { return WAIT.getCode().equals(code) || CANCEL.getCode().equals(code); } /** * 夿æ¯å¦å 许æ¤åï¼1ï¼ */ public static boolean canRevoke(Integer code) { return WAIT.getCode().equals(code); } /** * 夿æ¯å¦å·²å¼å§ç产ï¼2ã3ï¼ */ public static boolean isStarted(Integer code) { src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
@@ -3,8 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.production.dto.ProductBomDto; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.ProductOrderSourceDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.pojo.ProcessRoute; import com.ruoyi.production.pojo.ProductOrder; @@ -27,4 +27,6 @@ Integer countCompleted(@Param("startDate") String startDate, @Param("endDate") String endDate); Integer countPending(@Param("startDate") String startDate, @Param("endDate") String endDate); List<ProductOrderSourceDto> productOrderSource(@Param("orderId") Long orderId); } 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,21 @@ package com.ruoyi.production.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.production.dto.ProductionOrderStructureDto; import com.ruoyi.production.pojo.ProductionOrderStructure; import java.util.List; /** * <p> * ç产订åç»å®çBOMå表 Mapper æ¥å£ * </p> * * @author deslrey * @since 2026-03-20 */ public interface ProductionOrderStructureMapper extends BaseMapper<ProductionOrderStructure> { List<ProductionOrderStructureDto> listByOrderId(Long orderId); } 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(Long orderId, List<ProductionOrderStructureDto> list); } src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -3,8 +3,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.production.dto.ProductBomDto; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.ProductOrderSourceDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.pojo.ProcessRoute; import com.ruoyi.production.pojo.ProductOrder; @@ -21,7 +21,7 @@ /** * æ¤åç产计å */ Boolean revoke(ProductOrder productOrder); Boolean revoke(List<Long> ids); List<ProcessRoute> listProcessRoute(Long productModelId); @@ -31,5 +31,7 @@ Long insertProductOrder(ProductOrder productOrder); Boolean delete(Long[] id); Boolean delete(Long id); List<ProductOrderSourceDto> productOrderSource(Long orderId); } src/main/java/com/ruoyi/production/service/ProductStructureService.java
@@ -10,7 +10,7 @@ public interface ProductStructureService extends IService<ProductStructure> { Boolean addProductStructureDto(ProductStructureDto productStructureDto); Boolean addProductStructureDto(Integer bomId, List<ProductStructureDto> list); List<ProductStructureDto> listByBomId(Integer bomId); src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -1,19 +1,20 @@ package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; 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.procurementrecord.utils.StockUtils; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.ProductOrderSourceDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.enums.ProductOrderStatusEnum; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.IProductionOrderAppendixService; import com.ruoyi.production.service.ProductOrderService; import com.ruoyi.productionPlan.mapper.ProductOrderPlanMapper; import com.ruoyi.productionPlan.mapper.ProductionPlanMapper; @@ -76,7 +77,7 @@ private StockUtils stockUtils; @Autowired private AppendixService appendixService; private IProductionOrderAppendixService productionOrderAppendixService; @Override public IPage<ProductOrderDto> pageProductOrder(Page<ProductOrder> page, ProductOrderDto productOrder) { @@ -137,25 +138,48 @@ @Override @Transactional(rollbackFor = Exception.class) public Boolean revoke(ProductOrder productOrder) { // todo 夿æ¯å¦äº§çæ¥å·¥ä¿¡æ¯ // æ¥è¯¢åå¹¶çç产计å List<ProductOrderPlan> productOrderPlans = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, productOrder.getId())); if (productOrderPlans.isEmpty()) { throw new RuntimeException("åå¹¶çç产计åä¸åå¨"); public Boolean revoke(List<Long> ids) { List<ProductOrder> orders = productOrderMapper.selectBatchIds(ids); if (orders.isEmpty()) { throw new RuntimeException("ç产订åä¸åå¨"); } for (ProductOrder order : orders) { if (!ProductOrderStatusEnum.canRevoke(order.getStatus())) { throw new RuntimeException("åªæãå¾ å¼å§ãç¶æç订åæå¯ä»¥æ¤å"); } } // åéç产计å List<ProductOrderPlan> productOrderPlans = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, ids)); for (ProductOrderPlan productOrderPlan : productOrderPlans) { ProductionPlan productionPlan = productionPlanMapper.selectById(productOrderPlan.getProductionPlanId()); productionPlan.setAssignedQuantity(productionPlan.getAssignedQuantity().subtract(productOrderPlan.getAssignedQuantity())); productionPlanMapper.updateById(productionPlan); if (productionPlan != null) { BigDecimal newAssigned = productionPlan.getAssignedQuantity().subtract(productOrderPlan.getAssignedQuantity()); if (newAssigned.compareTo(BigDecimal.ZERO) < 0) { newAssigned = BigDecimal.ZERO; } productionPlan.setAssignedQuantity(newAssigned); BigDecimal volume = productionPlan.getVolume() == null ? BigDecimal.ZERO : productionPlan.getVolume(); int status; if (newAssigned.compareTo(BigDecimal.ZERO) == 0) { status = 0; // æªä¸å } else if (newAssigned.compareTo(volume) < 0) { status = 1; // é¨åä¸å } else { status = 2; // å·²ä¸å } productionPlan.setStatus(status); productionPlanMapper.updateById(productionPlan); } } // å é¤å ³èå ³ç³» productOrderPlanMapper.delete(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, productOrder.getId())); // å é¤è®¢å productOrderMapper.deleteById(productOrder.getId()); // todo å é¤è®¢åä¸çå·¥èºè·¯çº¿å表 return null; // å°è®¢åç¶ææ¹ä¸ºå·²åæ¶ for (ProductOrder order : orders) { order.setStatus(ProductOrderStatusEnum.CANCEL.getCode()); } updateBatchById(orders); return true; } @Override @@ -192,20 +216,18 @@ @Override @Transactional(rollbackFor = Exception.class) public Boolean delete(Long[] ids) { List<ProductOrder> orders = productOrderMapper.selectList(Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getId, ids)); public Boolean delete(Long id) { ProductOrder order = productOrderMapper.selectById(id); if (orders.isEmpty()) { if (order == null) { throw new RuntimeException("ç产订åä¸åå¨"); } for (ProductOrder order : orders) { if (!ProductOrderStatusEnum.canDelete(order.getStatus())) { throw new RuntimeException("åªæãå¾ å¼å§ã已忶ãç¶æç订åæå¯ä»¥å é¤"); } if (!ProductOrderStatusEnum.canDelete(order.getStatus())) { throw new RuntimeException("åªæãå¾ å¼å§ã已忶ãç¶æç订åæå¯ä»¥å é¤"); } // æ¯å¦å·²ç产 List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery().in(ProductWorkOrder::getProductOrderId, ids)); List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery().eq(ProductWorkOrder::getProductOrderId, id)); if (!productWorkOrders.isEmpty()) { List<Long> workOrderIds = productWorkOrders.stream() @@ -218,11 +240,11 @@ } // å é¤å·¥å productWorkOrderMapper.delete(Wrappers.<ProductWorkOrder>lambdaQuery().in(ProductWorkOrder::getProductOrderId, ids)); productWorkOrderMapper.delete(Wrappers.<ProductWorkOrder>lambdaQuery().eq(ProductWorkOrder::getProductOrderId, id)); } // åéç产计å List<ProductOrderPlan> productOrderPlans = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, ids)); List<ProductOrderPlan> productOrderPlans = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().eq(ProductOrderPlan::getProductOrderId, id)); for (ProductOrderPlan productOrderPlan : productOrderPlans) { ProductionPlan productionPlan = productionPlanMapper.selectById(productOrderPlan.getProductionPlanId()); @@ -253,19 +275,13 @@ } // å é¤ä¸é´è¡¨ productOrderPlanMapper.delete(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, ids)); productOrderPlanMapper.delete(Wrappers.<ProductOrderPlan>lambdaQuery().eq(ProductOrderPlan::getProductOrderId, id)); // å é¤é表çå·¥èºè·¯çº¿ä¸BOM for (Long id : ids) { ProductOrder productOrder = baseMapper.selectById(id); appendixService.deleteData(productOrder.getId(), productOrder.getRouteId()); } // productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>().in(ProductProcessRouteItem::getProductOrderId, ids)); // productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>().in(ProductProcessRoute::getProductOrderId, ids)); productionOrderAppendixService.deleteData(order.getId(), order.getRouteId()); // å é¤è®¢å productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>().in(ProductOrder::getId, ids)); productOrderMapper.deleteById(id); return true; } @@ -300,5 +316,17 @@ return "SC" + datePrefix + String.format("%04d", sequence); } @Override public List<ProductOrderSourceDto> productOrderSource(Long orderId) { if (orderId == null) { throw new ServiceException("æ¥è¯¢è®¢åæ°æ®ä¸è½ä¸ºç©º"); } ProductOrder productOrder = getById(orderId); if (productOrder == null) { throw new ServiceException("æ¥è¯¢å¤±è´¥,ç产订åä¸åå¨"); } List<ProductOrderSourceDto> list = baseMapper.productOrderSource(orderId); return list; } } src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
@@ -25,13 +25,14 @@ @Override @Transactional public Boolean addProductStructureDto(ProductStructureDto dto) { public Boolean addProductStructureDto(Integer bomId, List<ProductStructureDto> list) { Integer bomId = dto.getBomId(); // å°æ æå¹³å // æå¹³åä¼ å ¥çæ List<ProductStructureDto> flatDtoList = new ArrayList<>(); flattenTree(dto.getChildren(), flatDtoList); for (ProductStructureDto root : list) { flatDtoList.add(root); flattenTree(root.getChildren(), flatDtoList); } // æ¥è¯¢æ°æ®åºä¸å·²æç BOM æ°æ® List<ProductStructure> dbList = this.list(new LambdaQueryWrapper<ProductStructure>().eq(ProductStructure::getBomId, bomId)); @@ -65,13 +66,13 @@ entity.setBomId(bomId); if (psDto.getId() == null) { // æ°å¢ entity.setId(null); entity.setParentId(null); insertList.add(entity); tempEntityMap.put(psDto.getTempId(), entity); if (psDto.getTempId() != null) { tempEntityMap.put(psDto.getTempId(), entity); } } else { // æ´æ° updateList.add(entity); } } @@ -83,32 +84,27 @@ // ååæ°å¢èç¹ parentId List<ProductStructure> parentFixList = new ArrayList<>(); // çå®çç¶èç¹ ID Long realParentId; for (ProductStructureDto psDto : flatDtoList) { if (psDto.getId() != null) continue; ProductStructure child = tempEntityMap.get(psDto.getTempId()); if (child == null) continue; String parentTempId = psDto.getParentTempId(); if (psDto.getId() == null && parentTempId != null && !parentTempId.isEmpty()) { ProductStructure child = tempEntityMap.get(psDto.getTempId()); if (parentTempId != null && !parentTempId.isEmpty()) { if (tempEntityMap.containsKey(parentTempId)) { // ç¶èç¹æ¯æ°èç¹ realParentId = tempEntityMap.get(parentTempId).getId(); } else { // ç¶èç¹æ¯èèç¹ try { realParentId = Long.valueOf(parentTempId); } catch (NumberFormatException e) { realParentId = 0L; } } child.setParentId(realParentId); parentFixList.add(child); } else if (psDto.getId() == null) { // 妿 parentTempId 为空ï¼åæ¯é¡¶çº§èç¹ ProductStructure child = tempEntityMap.get(psDto.getTempId()); } else { child.setParentId(0L); parentFixList.add(child); } parentFixList.add(child); } if (!parentFixList.isEmpty()) { 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
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,190 @@ 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.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.ProductProcess; import com.ruoyi.production.pojo.ProductProcessParam; import com.ruoyi.production.pojo.ProductionOrderRouteItem; import com.ruoyi.production.pojo.ProductionOrderRouteItemParam; import com.ruoyi.production.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; 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 ProductionOrderRouteItemServiceImpl extends ServiceImpl<ProductionOrderRouteItemMapper, ProductionOrderRouteItem> implements IProductionOrderRouteItemService { @Resource private ProductProcessService productProcessService; @Resource private IProductionOrderRouteItemParamService productionOrderRouteItemParamService; @Resource private ProcessRouteItemParamService processRouteItemParamService; @Resource private ProductProcessParamService productProcessParamService; @Override 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 -> { ProductionOrderRouteItemDto dto = new ProductionOrderRouteItemDto(); BeanUtils.copyProperties(item, dto); if (item.getProcessId() != null) { ProductProcess process = productProcessService.getById(item.getProcessId()); if (process != null) { dto.setProcessName(process.getName()); } } return dto; }).collect(Collectors.toList()); } @Override public void addProcessItem(ProductionOrderRouteItemDto dto) { if (dto == null) { throw new ServiceException("æ°å¢æ°æ®ä¸è½ä¸ºç©º"); } if (dto.getOrderId() == null) { throw new ServiceException("ç产订åIDä¸è½ä¸ºç©º"); } if (dto.getProcessId() == null) { throw new ServiceException("å·¥åºIDä¸è½ä¸ºç©º"); } ProductionOrderRouteItem entity = new ProductionOrderRouteItem(); BeanUtils.copyProperties(dto, entity); entity.setId(null); entity.setTenantId(SecurityUtils.getLoginUser().getTenantId()); entity.setCreateTime(LocalDateTime.now()); // åå½å订å䏿大 dragSort + 1 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); // è¿ç§»è¯¥å·¥åºçåºç¡åæ° List<ProductProcessParam> processParams = productProcessParamService.list( new LambdaQueryWrapper<ProductProcessParam>().eq(ProductProcessParam::getProcessId, dto.getProcessId())); if (!processParams.isEmpty()) { List<ProductionOrderRouteItemParam> orderParams = processParams.stream().map(p -> { ProductionOrderRouteItemParam op = new ProductionOrderRouteItemParam(); BeanUtils.copyProperties(p, op, "id"); op.setOrderId(dto.getOrderId()); op.setRouteItemId(entity.getId()); op.setProcessParamId(p.getId()); return op; }).collect(Collectors.toList()); productionOrderRouteItemParamService.saveBatch(orderParams); } } @Override public void updateProcessItem(ProductionOrderRouteItemDto dto) { if (dto == null || dto.getId() == null) { throw new ServiceException("æ´æ°æ°æ®æIDä¸è½ä¸ºç©º"); } ProductionOrderRouteItem old = getById(dto.getId()); if (old == null) { throw new ServiceException("æ°æ®ä¸åå¨"); } // å·¥åºåæ´ï¼å 餿§åæ°é表ï¼è¿ç§»æ°å·¥åºåæ° if (dto.getProcessId() != null && !dto.getProcessId().equals(old.getProcessId())) { // å é¤å·¥èºè·¯çº¿å·¥åºåæ°é表 productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>() .eq(ProductionOrderRouteItemParam::getOrderId, old.getOrderId()) .eq(ProductionOrderRouteItemParam::getRouteItemId, old.getId())); // è¿ç§»æ°å·¥åºç product_process_param List<ProductProcessParam> processParams = productProcessParamService.list( new LambdaQueryWrapper<ProductProcessParam>().eq(ProductProcessParam::getProcessId, dto.getProcessId())); if (!processParams.isEmpty()) { List<ProductionOrderRouteItemParam> newInstances = processParams.stream().map(p -> { ProductionOrderRouteItemParam instance = new ProductionOrderRouteItemParam(); BeanUtils.copyProperties(p, instance, "id"); instance.setOrderId(old.getOrderId()); instance.setRouteItemId(old.getId()); instance.setProcessParamId(p.getId()); return instance; }).collect(Collectors.toList()); productionOrderRouteItemParamService.saveBatch(newInstances); } } ProductionOrderRouteItem entity = new ProductionOrderRouteItem(); BeanUtils.copyProperties(dto, entity); entity.setUpdateTime(LocalDateTime.now()); updateById(entity); } @Override public void deleteProcessItem(Long id) { if (id == null) { throw new ServiceException("IDä¸è½ä¸ºç©º"); } ProductionOrderRouteItem old = getById(id); if (old == null) { throw new ServiceException("æ°æ®ä¸åå¨"); } // å é¤å·¥èºè·¯çº¿å·¥åºåæ°é表 productionOrderRouteItemParamService.remove(new LambdaQueryWrapper<ProductionOrderRouteItemParam>() .eq(ProductionOrderRouteItemParam::getOrderId, old.getOrderId()) .eq(ProductionOrderRouteItemParam::getRouteItemId, id)); removeById(id); } @Override public void sortProcessItem(ProductionOrderRouteItemDto dto) { if (dto == null || dto.getId() == null) { throw new ServiceException("æ°æ®æIDä¸è½ä¸ºç©º"); } ProductionOrderRouteItem old = getById(dto.getId()); if (old == null) { throw new ServiceException("æ°æ®ä¸åå¨"); } 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++) { ProductionOrderRouteItem item = items.get(i); int newSort = i + 1; if (!item.getId().equals(old.getId())) { if (!Integer.valueOf(newSort).equals(item.getDragSort())) { item.setDragSort(newSort); updateById(item); } } else { old.setDragSort(newSort); updateById(old); } } } } } src/main/java/com/ruoyi/production/service/impl/ProductionOrderStructureServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,145 @@ 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.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<ProductionOrderStructureDto> dtoList = baseMapper.listByOrderId(orderId); 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(Long orderId, List<ProductionOrderStructureDto> list) { // æå¹³ååç«¯ä¼ å ¥çæ List<ProductionOrderStructureDto> flatList = new ArrayList<>(); for (ProductionOrderStructureDto root : list) { flatList.add(root); flattenTree(root.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(); org.springframework.beans.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<>(); Long realParentId; 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()) { 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/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
@@ -7,7 +7,6 @@ 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; @@ -18,6 +17,7 @@ import com.ruoyi.production.enums.ProductOrderStatusEnum; import com.ruoyi.production.pojo.ProductMaterialSku; import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.service.IProductionOrderAppendixService; import com.ruoyi.production.service.ProductMaterialService; import com.ruoyi.production.service.ProductMaterialSkuService; import com.ruoyi.production.service.ProductOrderService; @@ -79,7 +79,7 @@ private ProductMaterialService productMaterialService; @Autowired private AppendixService appendixService; private IProductionOrderAppendixService productionOrderAppendixService; /** * 忥éï¼ç¡®ä¿æå¨å宿¶ä»»å¡ä¸åæ¶æ§è¡ @@ -153,10 +153,10 @@ // å½ä¸åç产å为ç åææ¿æï¼å°±æåBOMåéä¸å·¥èºè·¯çº¿åéæ°æ®åå ¥å°éè¡¨ä¸ if ("ç å".equals(productionPlanDto.getProductName())) { productOrder.setRouteId(appendixService.populateBlocks(orderId, productionPlanDto)); productOrder.setRouteId(productionOrderAppendixService.populateBlocks(orderId, productionPlanDto)); } if ("æ¿æ".equals(productionPlanDto.getProductName())) { productOrder.setRouteId(appendixService.populatePlates(orderId, productionPlanDto)); productOrder.setRouteId(productionOrderAppendixService.populatePlates(orderId, productionPlanDto)); } // æ´æ°ç»å®çå·¥èºè·¯çº¿ productOrderService.updateById(productOrder); @@ -181,11 +181,9 @@ if (assignedVolume.add(remainingVolume).compareTo(productionPlanDto.getTotalAssignedQuantity()) >= 0) { // æåä¸ä¸ªè®¡åï¼åé å©ä½æ¹æ° BigDecimal lastRemainingVolume = productionPlanDto.getTotalAssignedQuantity().subtract(assignedVolume); plan.setStatus(1); plan.setAssignedQuantity(plan.getAssignedQuantity().add(lastRemainingVolume)); if (plan.getAssignedQuantity().compareTo(plan.getVolume()) >= 0) { plan.setStatus(2); } BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO).add(lastRemainingVolume); plan.setAssignedQuantity(assignedQuantity); plan.setStatus(assignedQuantity.compareTo(plan.getVolume()) >= 0 ? 2 : 1); productOrderPlan.setAssignedQuantity(lastRemainingVolume); productionPlanMapper.updateById(plan); productOrderPlanMapper.insert(productOrderPlan); @@ -193,11 +191,9 @@ } // åé å½åè®¡åæ¹æ° plan.setStatus(1); if (remainingVolume.compareTo(BigDecimal.ZERO) <= 0) { plan.setStatus(2); } plan.setAssignedQuantity(plan.getAssignedQuantity().add(remainingVolume)); BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO).add(remainingVolume); plan.setAssignedQuantity(assignedQuantity); plan.setStatus(assignedQuantity.compareTo(plan.getVolume()) >= 0 ? 2 : 1); productOrderPlan.setAssignedQuantity(remainingVolume); // æ´æ°ç产计å productionPlanMapper.updateById(plan); @@ -205,6 +201,19 @@ productOrderPlanMapper.insert(productOrderPlan); assignedVolume = assignedVolume.add(remainingVolume); } for (ProductionPlan plan : plans) { BigDecimal assignedQuantity = Optional.ofNullable(plan.getAssignedQuantity()).orElse(BigDecimal.ZERO); BigDecimal volume = Optional.ofNullable(plan.getVolume()).orElse(BigDecimal.ZERO); if (assignedQuantity.compareTo(BigDecimal.ZERO) <= 0) { plan.setStatus(0); } else if (assignedQuantity.compareTo(volume) >= 0) { plan.setStatus(2); } else { plan.setStatus(1); } productionPlanMapper.updateById(plan); } return true; } src/main/resources/mapper/appendix/ProcessRouteItemInstanceMapper.xml
ÎļþÒÑɾ³ý src/main/resources/mapper/appendix/ProcessRouteItemParamInstanceMapper.xml
ÎļþÒÑɾ³ý src/main/resources/mapper/appendix/ProductStructureInstanceMapper.xml
ÎļþÒÑɾ³ý src/main/resources/mapper/production/ProcessRouteMapper.xml
@@ -26,25 +26,31 @@ <if test="c.dictCode != null"> and ps.dict_code = #{c.dictCode} </if> <if test="c.status != null"> and ps.status = #{c.status} </if> 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) WHERE pr.status = 1 and 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> src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -14,6 +14,19 @@ <result property="status" column="status"/> </resultMap> <resultMap id="ProductOrderSourceMap" type="com.ruoyi.production.dto.ProductOrderSourceDto"> <id property="applyNo" column="apply_no"/> <result property="applyNo" column="apply_no"/> <collection property="productPlans" ofType="com.ruoyi.productionPlan.dto.ProductionPlanDto" autoMapping="true"> <id property="id" column="plan_id"/> <result property="materialCode" column="material_code"/> <result property="productName" column="product_name"/> <result property="model" column="model"/> <result property="unit" column="unit"/> <result property="totalAssignedQuantity" column="total_assigned_quantity"/> </collection> </resultMap> <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto"> SELECT po.id, @@ -40,7 +53,11 @@ FROM product_order po LEFT JOIN process_route pr ON po.route_id = pr.id LEFT JOIN product_bom pb ON pr.bom_id = pb.id LEFT JOIN product_order_plan pop ON po.id = pop.product_order_id LEFT JOIN ( SELECT product_order_id, MIN(production_plan_id) AS production_plan_id FROM product_order_plan GROUP BY product_order_id ) pop ON po.id = pop.product_order_id LEFT JOIN production_plan pp ON pop.production_plan_id = pp.id LEFT JOIN product_material_sku pms ON pms.id = pp.product_material_sku_id LEFT JOIN product_material pm ON pm.id = pms.product_id @@ -104,4 +121,25 @@ AND create_time <= #{endDate} AND complete_quantity < quantity </select> <select id="productOrderSource" resultMap="ProductOrderSourceMap" parameterType="java.lang.Long"> SELECT pp.id AS plan_id, pp.apply_no, pp.*, pop.assigned_quantity AS total_assigned_quantity, sku.material_code, sku.model, pm.product_name, pm.unit FROM product_order_plan pop LEFT JOIN production_plan pp ON pop.production_plan_id = pp.id LEFT JOIN product_material_sku sku ON pp.product_material_sku_id = sku.id LEFT JOIN product_material pm ON sku.product_id = pm.id WHERE pop.product_order_id = #{orderId} ORDER BY pp.apply_no </select> </mapper> src/main/resources/mapper/production/ProductStructureMapper.xml
@@ -20,7 +20,7 @@ ps.process_id, pp.name AS process_name, pm.product_name AS productName, pm.unit, ps.unit, pms.model FROM product_structure ps 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,35 @@ <?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> <select id="listByOrderId" resultType="com.ruoyi.production.dto.ProductionOrderStructureDto" parameterType="java.lang.Long"> SELECT s.*, pp.name AS process_name, pm.product_name AS product_name, sku.model AS model FROM production_order_structure s LEFT JOIN product_process pp ON pp.id = s.process_id LEFT JOIN product_material_sku sku ON sku.id = s.product_model_id LEFT JOIN product_material pm ON pm.id = sku.product_id WHERE s.order_id = #{orderId} </select> </mapper>