liding
2026-04-23 8e4456bfa6dc84a1c37c13ee515fa9d6347cc480
fix:1.生产计划 2.生产订单
已修改11个文件
364 ■■■■ 文件已修改
src/main/java/com/ruoyi/production/bean/dto/ProductionOrderDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/vo/ProductionPlanVo.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionPlanMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionPlan.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java 94 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOrderMapper.xml 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionPlanMapper.xml 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionOrderDto.java
@@ -1,10 +1,12 @@
package com.ruoyi.production.bean.dto;
import com.ruoyi.production.pojo.ProductionOrder;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
@Schema(name = "ProductionOrderDto", description = "生产订单查询对象")
public class ProductionOrderDto extends ProductionOrder {
}
src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java
@@ -31,6 +31,13 @@
    private String productName;
    /**
     * 客户名称
     */
    @Schema(description = "客户名称")
    @Excel(name = "客户名称")
    private String customerName;
    /**
     * 产品规格
     */
    @Schema(description = "产品规格")
src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
@@ -2,21 +2,29 @@
import com.ruoyi.basic.dto.StorageBlobVO;
import com.ruoyi.production.pojo.ProductionOrder;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
@Schema(name = "ProductionOrderVo", description = "生产订单返回对象")
public class ProductionOrderVo extends ProductionOrder {
    @Schema(description = "销售合同号")
    private String salesContractNo;
    @Schema(description = "客户名称")
    private String customerName;
    @Schema(description = "产品名称")
    private String productName;
    @Schema(description = "规格型号")
    private String model;
    @Schema(description = "工艺路线编码")
    private String processRouteCode;
    @Schema(description = "产品图片")
    private List<StorageBlobVO> productImages;
}
src/main/java/com/ruoyi/production/bean/vo/ProductionPlanVo.java
@@ -1,10 +1,26 @@
package com.ruoyi.production.bean.vo;
import com.ruoyi.production.pojo.ProductionPlan;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
@Schema(name = "ProductionPlanVo", description = "生产计划返回对象")
public class ProductionPlanVo extends ProductionPlan {
    @Schema(description = "物料编码")
    private String materialCode;
    @Schema(description = "产品名称")
    private String productName;
    @Schema(description = "规格型号")
    private String model;
    @Schema(description = "单位")
    private String unit;
    @Schema(description = "关联产品物料ID")
    private Long productMaterialId;
}
src/main/java/com/ruoyi/production/mapper/ProductionPlanMapper.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.production.bean.dto.ProductionPlanDto;
import com.ruoyi.production.bean.vo.ProductionPlanVo;
import com.ruoyi.production.pojo.ProductionPlan;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -21,7 +22,7 @@
@Mapper
public interface ProductionPlanMapper extends BaseMapper<ProductionPlan> {
    IPage<ProductionPlanDto> listPage(Page page, @Param("c") ProductionPlanDto productionPlanDto);
    IPage<ProductionPlanVo> listPage(Page<ProductionPlanDto> page, @Param("c") ProductionPlanDto productionPlanDto);
    List<ProductionPlanDto> selectWithMaterialByIds(@Param("ids") List<Long> ids);
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java
@@ -75,7 +75,7 @@
    @TableField(fill = FieldFill.INSERT)
    private Long deptId;
    @Schema(description = "计划完成时间。选填;按生产计划生成订单时,系统会优先自动带出交期。")
    @Schema(description = "计划完成时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate planCompleteTime;
src/main/java/com/ruoyi/production/pojo/ProductionPlan.java
@@ -1,13 +1,13 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
@@ -34,7 +34,7 @@
    private String mpsNo;
    @Schema(description = "需求日期")
    private LocalDateTime requiredDate;
    private LocalDate requiredDate;
    @Schema(description = "备注")
    private String remark;
@@ -61,10 +61,6 @@
    @Schema(description = "需求数量")
    private BigDecimal qtyRequired;
    @Schema(description = "状态")
    @TableLogic
    private String state;
    @Schema(description = "是否下发制造订单")
    private Boolean issued;
@@ -75,7 +71,7 @@
    private String isAudit;
    @Schema(description = "承诺日期")
    private LocalDateTime promisedDeliveryDate;
    private LocalDate promisedDeliveryDate;
    @Schema(description = "申请单编号")
    private String applyNo;
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -15,60 +15,24 @@
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.production.bean.dto.ProductionOrderDto;
import com.ruoyi.production.bean.vo.ProductionOrderVo;
import com.ruoyi.production.mapper.ProductionBomStructureMapper;
import com.ruoyi.production.mapper.ProductionOperationTaskMapper;
import com.ruoyi.production.mapper.ProductionOrderBomMapper;
import com.ruoyi.production.mapper.ProductionOrderMapper;
import com.ruoyi.production.mapper.ProductionOrderPickMapper;
import com.ruoyi.production.mapper.ProductionOrderPickRecordMapper;
import com.ruoyi.production.mapper.ProductionOrderRoutingMapper;
import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper;
import com.ruoyi.production.mapper.ProductionOrderRoutingOperationParamMapper;
import com.ruoyi.production.mapper.ProductionPlanMapper;
import com.ruoyi.production.mapper.ProductionProductMainMapper;
import com.ruoyi.production.pojo.ProductionOrderPick;
import com.ruoyi.production.pojo.ProductionOrderPickRecord;
import com.ruoyi.production.pojo.ProductionBomStructure;
import com.ruoyi.production.pojo.ProductionOperationTask;
import com.ruoyi.production.pojo.ProductionOrder;
import com.ruoyi.production.pojo.ProductionOrderBom;
import com.ruoyi.production.pojo.ProductionOrderRouting;
import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam;
import com.ruoyi.production.pojo.ProductionPlan;
import com.ruoyi.production.pojo.ProductionProductMain;
import com.ruoyi.production.enums.ProductOrderStatusEnum;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProductionOrderService;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.production.service.ProductionOrderService;
import com.ruoyi.technology.mapper.TechnologyBomMapper;
import com.ruoyi.technology.mapper.TechnologyBomStructureMapper;
import com.ruoyi.technology.mapper.TechnologyRoutingMapper;
import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper;
import com.ruoyi.technology.mapper.TechnologyRoutingOperationParamMapper;
import com.ruoyi.technology.pojo.TechnologyBom;
import com.ruoyi.technology.pojo.TechnologyBomStructure;
import com.ruoyi.technology.pojo.TechnologyRouting;
import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
import com.ruoyi.technology.pojo.TechnologyRoutingOperationParam;
import com.ruoyi.technology.mapper.*;
import com.ruoyi.technology.pojo.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
@Service
@@ -591,10 +555,10 @@
            return null;
        }
        if (productionPlan.getPromisedDeliveryDate() != null) {
            return productionPlan.getPromisedDeliveryDate().toLocalDate();
            return productionPlan.getPromisedDeliveryDate();
        }
        if (productionPlan.getRequiredDate() != null) {
            return productionPlan.getRequiredDate().toLocalDate();
            return productionPlan.getRequiredDate();
        }
        return null;
    }
src/main/java/com/ruoyi/production/service/impl/ProductionPlanServiceImpl.java
@@ -13,7 +13,6 @@
import com.ruoyi.production.bean.dto.ProductionPlanDto;
import com.ruoyi.production.bean.dto.ProductionPlanImportDto;
import com.ruoyi.production.bean.vo.ProductionPlanVo;
import com.ruoyi.production.enums.ProductOrderStatusEnum;
import com.ruoyi.production.mapper.ProductionOrderMapper;
import com.ruoyi.production.mapper.ProductionPlanMapper;
import com.ruoyi.production.pojo.ProductionOrder;
@@ -42,14 +41,7 @@
    @Override
    public IPage<ProductionPlanVo> listPage(Page<ProductionPlanDto> page, ProductionPlanDto productionPlanDto) {
        IPage<ProductionPlanVo> planVoIPage = productionPlanMapper.listPage(page, productionPlanDto)
                .convert(dto -> {
                    ProductionPlanVo vo = new ProductionPlanVo();
                    BeanUtils.copyProperties(dto, vo);
                    return vo;
                });
        return planVoIPage;
        return productionPlanMapper.listPage(page, productionPlanDto);
    }
    /**
@@ -85,7 +77,89 @@
        ProductionOrder productionOrder = new ProductionOrder();
        productionOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity());
        productionOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime());
        productionOrder.setStatus(ProductOrderStatusEnum.WAIT.getCode());
//        // 叠加剩余方数
//        BigDecimal totalRemainingVolume = plans.stream()
//                .map(ProductionPlan::getRemainingVolume)
//                .filter(Objects::nonNull)
//                .reduce(BigDecimal.ZERO, BigDecimal::add);
//        // 判断下发数量是否大于等于剩余方数
//        if (productionPlanDto.getTotalAssignedQuantity().compareTo(totalRemainingVolume) > 0) {
//            throw new BaseException("操作失败,下发数量不能大于剩余方数");
//        }
//
//        // 创建生产订单
//        ProductOrder productOrder = new ProductOrder();
//        productOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity());
//        productOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime());
//        productOrder.setStatus(ProductOrderStatusEnum.WAIT.getCode());
//        productOrder.setStrength(productionPlanDto.getStrength());
//        productOrder.setProductMaterialSkuId(plans.get(0).getProductMaterialSkuId());
//
//        Long orderId = productOrderService.insertProductOrder(productOrder);
//
//        //  当下发的产品为砌块或板材,就拉取BOM子集与工艺路线子集数据存入到附表中
//        if ("砌块".equals(productionPlanDto.getProductName())) {
//            productOrder.setRouteId(productionOrderAppendixService.populateBlocks(orderId, productionPlanDto));
//        }
//        if ("板材".equals(productionPlanDto.getProductName())) {
//            productOrder.setRouteId(productionOrderAppendixService.populatePlates(orderId, productionPlanDto));
//        }
//        //  更新绑定的工艺路线
//        productOrderService.updateById(productOrder);
//
//        // 根据下发数量,从第一个生产计划开始分配方数
//        BigDecimal assignedVolume = BigDecimal.ZERO;
//        for (ProductionPlan plan : plans) {
//            BigDecimal volume = plan.getVolume();
//            if (volume == null) {
//                continue;
//            }
//            // 计算剩余方数
//            BigDecimal remainingVolume = plan.getRemainingVolume();
//            if (remainingVolume.compareTo(BigDecimal.ZERO) <= 0) {
//                continue;
//            }
//
//            ProductOrderPlan productOrderPlan = new ProductOrderPlan();
//            productOrderPlan.setProductOrderId(productOrder.getId());
//            productOrderPlan.setProductionPlanId(plan.getId());
//
//            if (assignedVolume.add(remainingVolume).compareTo(productionPlanDto.getTotalAssignedQuantity()) >= 0) {
//                // 最后一个计划,分配剩余方数
//                BigDecimal lastRemainingVolume = productionPlanDto.getTotalAssignedQuantity().subtract(assignedVolume);
//                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);
//                break;
//            }
//
//            // 分配当前计划方数
//            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);
//            // 创建关联关系
//            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/production/ProductionOrderMapper.xml
@@ -19,8 +19,121 @@
        <result column="sale_ledger_product_id" property="saleLedgerProductId" />
        <result column="create_user" property="createUser" />
        <result column="dept_id" property="deptId" />
        <result column="plan_complete_time" property="planCompleteTime" />
        <result column="status" property="status" />
    </resultMap>
    <resultMap id="ProductionOrderVoResultMap" type="com.ruoyi.production.bean.vo.ProductionOrderVo" extends="BaseResultMap">
        <result column="salesContractNo" property="salesContractNo" />
        <result column="customerName" property="customerName" />
        <result column="productName" property="productName" />
        <result column="model" property="model" />
        <result column="processRouteCode" property="processRouteCode" />
    </resultMap>
    <sql id="ProductionOrderVoColumns">
        po.id,
        po.sales_ledger_id,
        po.production_plan_ids,
        po.product_model_id,
        po.nps_no,
        po.create_time,
        po.update_time,
        po.technology_routing_id,
        po.quantity,
        po.complete_quantity,
        po.start_time,
        po.end_time,
        po.sale_ledger_product_id,
        po.create_user,
        po.dept_id,
        po.plan_complete_time,
        po.status,
        sl.sales_contract_no as salesContractNo,
        sl.customer_name as customerName,
        p.product_name as productName,
        pm.model as model,
        tr.process_route_code as processRouteCode
    </sql>
    <sql id="ProductionOrderVoFrom">
        from production_order po
                 left join sales_ledger sl on po.sales_ledger_id = sl.id
                 left join product_model pm on po.product_model_id = pm.id
                 left join product p on pm.product_id = p.id
                 left join technology_routing tr on po.technology_routing_id = tr.id
    </sql>
    <sql id="ProductionOrderWhere">
        <where>
            <if test="c != null">
                <if test="c.id != null">
                    and po.id = #{c.id}
                </if>
                <if test="c.salesLedgerId != null">
                    and po.sales_ledger_id = #{c.salesLedgerId}
                </if>
                <if test="c.productModelId != null">
                    and po.product_model_id = #{c.productModelId}
                </if>
                <if test="c.technologyRoutingId != null">
                    and po.technology_routing_id = #{c.technologyRoutingId}
                </if>
                <if test="c.saleLedgerProductId != null">
                    and po.sale_ledger_product_id = #{c.saleLedgerProductId}
                </if>
                <if test="c.status != null">
                    and po.status = #{c.status}
                </if>
                <if test="c.createUser != null">
                    and po.create_user = #{c.createUser}
                </if>
                <if test="c.deptId != null">
                    and po.dept_id = #{c.deptId}
                </if>
                <if test="c.npsNo != null and c.npsNo != ''">
                    and po.nps_no like concat('%', #{c.npsNo}, '%')
                </if>
                <if test="c.productionPlanIds != null and c.productionPlanIds != ''">
                    and po.production_plan_ids like concat('%', #{c.productionPlanIds}, '%')
                </if>
                <if test="c.planCompleteTime != null">
                    and po.plan_complete_time = #{c.planCompleteTime}
                </if>
                <if test="c.startTime != null">
                    and po.start_time &gt;= #{c.startTime}
                </if>
                <if test="c.endTime != null">
                    and po.end_time &lt;= #{c.endTime}
                </if>
            </if>
        </where>
    </sql>
    <select id="pageProductionOrder" resultMap="ProductionOrderVoResultMap">
        select
        <include refid="ProductionOrderVoColumns" />
        <include refid="ProductionOrderVoFrom" />
        <include refid="ProductionOrderWhere" />
        order by po.id desc
    </select>
    <select id="listProductionOrder" resultMap="ProductionOrderVoResultMap">
        select
        <include refid="ProductionOrderVoColumns" />
        <include refid="ProductionOrderVoFrom" />
        <include refid="ProductionOrderWhere" />
        order by po.id desc
    </select>
    <select id="getProductionOrderInfo" resultMap="ProductionOrderVoResultMap">
        select
        <include refid="ProductionOrderVoColumns" />
        <include refid="ProductionOrderVoFrom" />
        where po.id = #{id}
        limit 1
    </select>
    <select id="selectProgressOrders" resultType="com.ruoyi.home.dto.ProductionProgressOrderDto">
        select po.nps_no,
               sl.sales_contract_no,
src/main/resources/mapper/production/ProductionPlanMapper.xml
@@ -14,49 +14,25 @@
        <result column="update_user" property="updateUser"/>
        <result column="product_model_id" property="productModelId"/>
        <result column="qty_required" property="qtyRequired"/>
        <result column="state" property="state"/>
        <result column="issued" property="issued"/>
        <result column="source" property="source"/>
        <result column="is_audit" property="isAudit"/>
        <result column="promised_delivery_date" property="promisedDeliveryDate"/>
    </resultMap>
    <select id="listPage" resultType="com.ruoyi.production.bean.dto.ProductionPlanDto">
    <select id="listPage" resultType="com.ruoyi.production.bean.vo.ProductionPlanVo">
        SELECT
        pp.*,
        pms.material_code AS materialCode,
        pms.model,
        pmdl.model,
        pms.product_id AS productMaterialId,
        pm.product_name AS productName,
        pm.unit
        p.product_name AS productName,
        pmdl.unit
        FROM production_plan pp
        left join product_material_sku pms on pp.product_material_sku_id = pms.id
        left join product_material pm on pms.product_id = pm.id
        WHERE 1 = 1
        <if test="c.customerName != null and c.customerName != '' ">
            AND pp.customer_name LIKE CONCAT('%',#{c.customerName},'%')
        </if>
        <if test="c.productName != null and c.productName != '' ">
            AND pm.product_name LIKE CONCAT('%',#{c.productName},'%')
        </if>
        <if test="c.materialCode != null and c.materialCode != '' ">
            AND pms.material_code LIKE CONCAT('%',#{c.materialCode},'%')
        </if>
        <if test="c.model != null and c.model != '' ">
            AND pms.model LIKE CONCAT('%',#{c.model},'%')
        </if>
        <if test="c.status != null">
            AND pp.status =#{c.status}
        </if>
        <if test="c.applyNo != null and c.applyNo != '' ">
            AND pp.apply_no LIKE CONCAT('%',#{c.applyNo},'%')
        </if>
        <if test="c.startDate != null">
            AND pp.start_date &gt;= DATE_FORMAT(#{c.startDate},'%Y-%m-%d')
        </if>
        <if test="c.endDate != null">
            AND pp.end_date &lt;= DATE_FORMAT(#{c.endDate},'%Y-%m-%d')
        </if>
        left join product_model pmdl on pp.product_model_id = pmdl.id
        left join product p on pmdl.product_id = p.id
        ORDER BY COALESCE(pp.form_modified_time, pp.id) DESC
    </select>
@@ -64,12 +40,14 @@
        SELECT
        pp.*,
        pms.material_code AS materialCode,
        pms.model,
        pm.product_name AS productName,
        pm.unit
        pmdl.model,
        p.product_name AS productName,
        pmdl.unit,
        pms.product_id AS productMaterialId
        FROM production_plan pp
        LEFT JOIN product_material_sku pms ON pp.product_material_sku_id = pms.id
        LEFT JOIN product_material pm ON pms.product_id = pm.id
        LEFT JOIN product_model pmdl ON pp.product_model_id = pmdl.id
        LEFT JOIN product p ON pmdl.product_id = p.id
        WHERE pp.id IN
        <foreach collection="ids" item="id" open="(" separator="," close=")">
            #{id}
@@ -80,13 +58,14 @@
        SELECT
        pp.*,
        pms.material_code AS materialCode,
        pms.model,
        pmdl.model,
        pms.product_id AS productMaterialId,
        pm.product_name AS productName,
        pm.unit
        p.product_name AS productName,
        pmdl.unit
        FROM production_plan pp
        left join product_material_sku pms on pp.product_material_sku_id = pms.id
        left join product_material pm on pms.product_id = pm.id
        left join product_model pmdl on pp.product_model_id = pmdl.id
        left join product p on pmdl.product_id = p.id
        WHERE pp.id = #{productionPlanId}
    </select>
</mapper>