huminmin
3 天以前 2495a8e1f71b6a0908a423765aaafd9ae0140d0c
生成生产订单与生产计划关联表
已添加6个文件
已修改8个文件
239 ■■■■■ 文件已修改
doc/宁夏-中盛建材.sql 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductOrderController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductOrderService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/controller/ProductOrderPlanController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/mapper/ProductOrderPlanMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/pojo/ProductOrderPlan.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/ProductOrderPlanService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/impl/ProductOrderPlanServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/productionPlan/ProductOrderPlanMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>