doc/ÄþÏÄ-ÖÐÊ¢½¨²Ä.sql
@@ -92,5 +92,18 @@ add assigned_quantity DECIMAL(10, 4) default 0 not null COMMENT 'ä¸åæ°é'; alter table product_order add plan_complete_time datetime(0) NULL DEFAULT NULL COMMENT '计å宿æ¶é´', add combine_production_plan_ids varchar(500) default 'åå¹¶ç产计åid' not null; add plan_complete_time datetime(0) NULL DEFAULT NULL COMMENT '计å宿æ¶é´'; # ç产订åä¸ç产计åå ³è表 drop table if exists product_order_plan; create table product_order_plan ( id bigint auto_increment primary key, product_order_id bigint not null default 0 comment 'ç产订åid', production_plan_id bigint not null default 0 comment 'ç产计åid', create_time datetime null comment 'å½å ¥æ¶é´', update_time datetime null comment 'æ´æ°æ¶é´', index idx_product_order_id (product_order_id), index idx_production_plan_id (production_plan_id), unique idx_product_order_production_plan (product_order_id, production_plan_id) ); src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -46,6 +46,12 @@ return R.ok(productOrderService.listProcessRoute(productModelId)); } @PostMapping("/revoke") @ApiOperation("æ¤åç产计å") public R revoke(@RequestBody ProductOrder productOrder) { return R.ok(productOrderService.revoke(productOrder)); } /** * 导åºç产订å */ src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -32,6 +32,9 @@ @ApiModelProperty(value = "å·¥åid") private Long workOrderId; @ApiModelProperty(value = "ç产订åid") private Long productOrderId; @ApiModelProperty(value = "æ¥å·¥ç¶æ") private Integer status; src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -18,6 +18,11 @@ int bindingRoute(ProductOrder productOrder); /** * æ¤åç产计å */ Boolean revoke(ProductOrder productOrder); List<ProcessRoute> listProcessRoute(Long productModelId); List<ProductStructureDto> listProcessBom(Long orderId); src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -123,6 +123,18 @@ } @Override public Boolean revoke(ProductOrder productOrder) { //夿æ¯å¦äº§çå·¥å List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(Wrappers.<ProductionProductMain>lambdaQuery().eq(ProductionProductMain::getProductOrderId, productOrder.getId())); if (!productionProductMains.isEmpty()) { throw new RuntimeException("ç产订åå·²ç»æ¥å·¥,ä¸è½æ¤é"); } // æ¥è¯¢åå¹¶çç产计å return null; } @Override public List<ProcessRoute> listProcessRoute(Long productModelId) { return productOrderMapper.listProcessRoute(productModelId); } src/main/java/com/ruoyi/productionPlan/controller/ProductOrderPlanController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.productionPlan.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-03-11 03:02:58 */ @RestController @RequestMapping("/productOrderPlan") public class ProductOrderPlanController { } src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java
@@ -67,7 +67,7 @@ @Log(title = "æ´æ°ç产计å", businessType = BusinessType.UPDATE) @ApiOperation("æ´æ°ç产计å") public AjaxResult update(@RequestBody ProductionPlanDto productionPlanDto) { return AjaxResult.success(productionPlanService.updateById(productionPlanDto)); return AjaxResult.success(productionPlanService.update(productionPlanDto)); } @DeleteMapping("") src/main/java/com/ruoyi/productionPlan/mapper/ProductOrderPlanMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.productionPlan.mapper; import com.ruoyi.productionPlan.pojo.ProductOrderPlan; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; /** * <p> * Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-03-11 03:02:58 */ @Mapper public interface ProductOrderPlanMapper extends BaseMapper<ProductOrderPlan> { } src/main/java/com/ruoyi/productionPlan/pojo/ProductOrderPlan.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,47 @@ package com.ruoyi.productionPlan.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; /** * <p> * * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-03-11 03:02:58 */ @Getter @Setter @TableName("product_order_plan") @ApiModel(value = "ProductOrderPlan对象", description = "") public class ProductOrderPlan implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty("ç产订åid") private Long productOrderId; @ApiModelProperty("ç产计åid") private Long productionPlanId; @ApiModelProperty("å½å ¥æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty("æ´æ°æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; } src/main/java/com/ruoyi/productionPlan/service/ProductOrderPlanService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.productionPlan.service; import com.ruoyi.productionPlan.pojo.ProductOrderPlan; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-03-11 03:02:58 */ public interface ProductOrderPlanService extends IService<ProductOrderPlan> { } src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java
@@ -44,6 +44,16 @@ boolean add(ProductionPlanDto productionPlanDto); /** * æ´æ°ç产计å */ boolean update(ProductionPlanDto productionPlanDto); /** * å é¤ç产计å */ boolean delete(List<Long> ids); /** * æç §äº§åç±»å«æ±æ»ç»è®¡éæ±é */ List<ProductionPlanSummaryDto> summaryByProductType(ProductionPlanSummaryDto query); src/main/java/com/ruoyi/productionPlan/service/impl/ProductOrderPlanServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.productionPlan.service.impl; import com.ruoyi.productionPlan.pojo.ProductOrderPlan; import com.ruoyi.productionPlan.mapper.ProductOrderPlanMapper; import com.ruoyi.productionPlan.service.ProductOrderPlanService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * æå¡å®ç°ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-03-11 03:02:58 */ @Service public class ProductOrderPlanServiceImpl extends ServiceImpl<ProductOrderPlanMapper, ProductOrderPlan> implements ProductOrderPlanService { } src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
@@ -5,9 +5,11 @@ import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; 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.common.exception.ServiceException; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.http.HttpUtils; @@ -18,7 +20,9 @@ import com.ruoyi.productionPlan.dto.ProductionPlanDto; import com.ruoyi.productionPlan.dto.ProductionPlanImportDto; import com.ruoyi.productionPlan.dto.ProductionPlanSummaryDto; import com.ruoyi.productionPlan.mapper.ProductOrderPlanMapper; import com.ruoyi.productionPlan.mapper.ProductionPlanMapper; import com.ruoyi.productionPlan.pojo.ProductOrderPlan; import com.ruoyi.productionPlan.pojo.ProductionPlan; import com.ruoyi.productionPlan.service.ProductionPlanService; import lombok.extern.slf4j.Slf4j; @@ -62,6 +66,9 @@ @Autowired private ProductOrderService productOrderService; @Autowired private ProductOrderPlanMapper productOrderPlanMapper; /** * 忥éï¼ç¡®ä¿æå¨å宿¶ä»»å¡ä¸åæ¶æ§è¡ */ @@ -104,15 +111,13 @@ // æ ¡éªæ¯å¦åå¨ä¸åç产ååç§° String firstProductName = plans.get(0).getProductName(); if (plans.stream().anyMatch(p -> !p.getProductName().equals(firstProductName))) { log.warn("å并失败ï¼åå¨ä¸åç产ååç§°"); return false; throw new BaseException("å并失败ï¼åå¨ä¸åç产ååç§°"); } // æ ¡éªæ¯å¦åå¨ä¸åç产åè§æ ¼ String firstProductSpec = plans.get(0).getProductSpec(); if (plans.stream().anyMatch(p -> !p.getProductSpec().equals(firstProductSpec))) { log.warn("å并失败ï¼åå¨ä¸åç产åè§æ ¼"); return false; throw new BaseException("å并失败ï¼åå¨ä¸åç产åè§æ ¼"); } @@ -123,6 +128,7 @@ .reduce(BigDecimal.ZERO, BigDecimal::add); // 夿ä¸åæ°éæ¯å¦å¤§äºçäºæ¹æ° if (productionPlanDto.getTotalAssignedQuantity().compareTo(totalVolume) > 0) { log.warn("æä½å¤±è´¥ï¼ä¸åæ°éä¸è½å¤§äºæ¹æ°"); return false; } @@ -138,6 +144,7 @@ if (assignedVolume.add(volume).compareTo(productionPlanDto.getTotalAssignedQuantity()) >= 0) { // æåä¸ä¸ªè®¡åï¼åé å©ä½æ¹æ° plan.setAssignedQuantity(productionPlanDto.getTotalAssignedQuantity().subtract(assignedVolume)); productionPlanMapper.updateById(plan); break; } @@ -149,11 +156,16 @@ // å建ç产订å ProductOrder productOrder = new ProductOrder(); String combineIds = StringUtils.join(productionPlanDto.getIds(), ","); productOrder.setCombineProductionPlanIds(combineIds); productOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity()); productOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime()); productOrderService.addProductOrder(productOrder); for (Long planId : productionPlanDto.getIds()) { ProductOrderPlan productOrderPlan = new ProductOrderPlan(); productOrderPlan.setProductOrderId(productOrder.getId()); productOrderPlan.setProductionPlanId(planId); productOrderPlanMapper.insert(productOrderPlan); } return true; } @@ -165,6 +177,33 @@ return true; } @Override @Transactional(rollbackFor = Exception.class) public boolean update(ProductionPlanDto productionPlanDto) { // æ¥è¯¢æ¯å¦æå ³è订å boolean hasProductOrderPlan = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().eq(ProductOrderPlan::getProductionPlanId, productionPlanDto.getId())).stream().anyMatch(p -> p.getProductOrderId() != null); if (hasProductOrderPlan) { // å¦æå ³èï¼æ¹æ°åªè½éå¢ ProductionPlan currentPlan = productionPlanMapper.selectById(productionPlanDto.getId()); if (productionPlanDto.getVolume().compareTo(currentPlan.getVolume()) < 0) { throw new BaseException("æ¹æ°ä¸è½éå"); } } return productionPlanMapper.updateById(productionPlanDto) > 0; } @Override @Transactional(rollbackFor = Exception.class) public boolean delete(List<Long> ids) { // 妿æå ³è订åï¼åä¸è½å é¤ if (productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductionPlanId, ids)).stream().anyMatch(p -> p.getProductOrderId() != null)) { throw new BaseException("å é¤å¤±è´¥ï¼åå¨å ³è订å"); } return productionPlanMapper.deleteBatchIds(ids) > 0; } /** * åæ¥æ°æ® */ src/main/resources/mapper/productionPlan/ProductOrderPlanMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ <?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.productionPlan.mapper.ProductOrderPlanMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.productionPlan.pojo.ProductOrderPlan"> <id column="id" property="id" /> <result column="product_order_id" property="productOrderId" /> <result column="production_plan_id" property="productionPlanId" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> </resultMap> </mapper>