src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -13,40 +13,96 @@
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
    </resultMap>
<!--    旧sql-->
    <!--    <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto">-->
    <!--        select po.*,-->
    <!--        sl.sales_contract_no,-->
    <!--        sl.customer_name,-->
    <!--        p.product_name as product_category,-->
    <!--        pm.model as specification_model,-->
    <!--        pm.unit,-->
    <!--        ppr.process_route_code,-->
    <!--        pb.bom_no,-->
    <!--        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus,-->
    <!--        DATEDIFF(sl.delivery_date, CURDATE()) AS delivery_days_diff,-->
    <!--        sl.delivery_date,-->
    <!--        CASE-->
    <!--        WHEN shipping_status_counts.total_count = 0 THEN false-->
    <!--        WHEN shipping_status_counts.unshipped_count = 0 THEN true-->
    <!--        ELSE false-->
    <!--        END AS is_fh-->
    <!--        from product_order po-->
    <!--        left join sales_ledger sl on po.sales_ledger_id = sl.id-->
    <!--        LEFT JOIN (-->
    <!--        SELECT sales_ledger_id,-->
    <!--        COUNT(*) as total_count,-->
    <!--        SUM(CASE WHEN status != '已发货' THEN 1 ELSE 0 END) as unshipped_count-->
    <!--        FROM shipping_info-->
    <!--        GROUP BY sales_ledger_id-->
    <!--        ) shipping_status_counts ON sl.id = shipping_status_counts.sales_ledger_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 sales_ledger_product slp on po.sale_ledger_product_id = slp.id and slp.type = 1-->
    <!--        left join (-->
    <!--        select max(id) as id, product_order_id-->
    <!--        from product_process_route-->
    <!--        group by product_order_id-->
    <!--        ) ppr_latest on po.id = ppr_latest.product_order_id-->
    <!--        left join product_process_route ppr on ppr.id = ppr_latest.id-->
    <!--        left join product_bom pb on pb.id = ppr.bom_id-->
    <!--        <where>-->
    <!--            <if test="c.npsNo != null and c.npsNo != ''">-->
    <!--                and po.nps_no like concat('%',#{c.npsNo},'%')-->
    <!--            </if>-->
    <!--            <if test="c.salesContractNo != null and c.salesContractNo != ''">-->
    <!--                and sl.sales_contract_no like concat('%',#{c.salesContractNo},'%')-->
    <!--            </if>-->
    <!--            <if test="c.customerName != null and c.customerName != ''">-->
    <!--                and sl.customer_name like concat('%',#{c.customerName},'%')-->
    <!--            </if>-->
    <!--            <if test="c.productCategory != null and c.productCategory != ''">-->
    <!--                and slp.product_category like concat('%',#{c.productCategory},'%')-->
    <!--            </if>-->
    <!--            <if test="c.specificationModel != null and c.specificationModel != ''">-->
    <!--                and slp.specification_model like concat('%',#{c.specificationModel},'%')-->
    <!--            </if>-->
    <!--            <if test="c.startTime != null and c.endTime != null">-->
    <!--                and po.create_time between #{c.startTime} and #{c.endTime}-->
    <!--            </if>-->
    <!--        </where>-->
    <!--    </select>-->
<!--    新sql 用中间表sales_ledger_production_ref进行关联sales_ledger和product_order,查询出所有关联的sales_ledger_no和customer_name。交期,交期偏差,是否发货由于一个生产订单对应多个销售订单,导致无法正常显示,暂时省略-->
    <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto">
        select po.*,
        sl.sales_contract_no,
        sl.customer_name,
        GROUP_CONCAT(DISTINCT sl.sales_contract_no SEPARATOR ',') AS sales_contract_no,
        GROUP_CONCAT(DISTINCT sl.customer_name SEPARATOR ',') AS customer_name,
        p.product_name as product_category,
        pm.model as specification_model,
        pm.unit,
        ppr.process_route_code,
        pb.bom_no,
        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus,
        DATEDIFF(sl.delivery_date, CURDATE()) AS delivery_days_diff,
        sl.delivery_date,
        CASE
        WHEN shipping_status_counts.total_count = 0 THEN false
        WHEN shipping_status_counts.unshipped_count = 0 THEN true
        ELSE false
        END AS is_fh
        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus
        from product_order po
        left join sales_ledger sl on po.sales_ledger_id = sl.id
        left join sales_ledger_production_ref ref on po.id = ref.product_order_id
        left join sales_ledger sl on ref.sales_ledger_id = sl.id
        LEFT JOIN (
        SELECT sales_ledger_id,
        COUNT(*) as total_count,
        SUM(CASE WHEN status != '已发货' THEN 1 ELSE 0 END) as unshipped_count
        FROM shipping_info
        GROUP BY sales_ledger_id
        ) shipping_status_counts ON sl.id = shipping_status_counts.sales_ledger_id
            left join product_model pm on po.product_model_id = pm.id
            left join product p on pm.product_id = p.id
        GROUP BY sales_ledger_id) shipping_status_counts
        ON sl.id = shipping_status_counts.sales_ledger_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 sales_ledger_product slp on po.sale_ledger_product_id = slp.id and slp.type = 1
        left join (
        select max(id) as id, product_order_id
        from product_process_route
        group by product_order_id
        ) ppr_latest on po.id = ppr_latest.product_order_id
        group by product_order_id) ppr_latest on po.id = ppr_latest.product_order_id
        left join product_process_route ppr on ppr.id = ppr_latest.id
        left join product_bom pb on pb.id = ppr.bom_id
        <where>
@@ -69,7 +125,10 @@
                and po.create_time between #{c.startTime} and #{c.endTime}
            </if>
        </where>
        GROUP BY po.id
    </select>
    <select id="listProcessRoute" resultType="com.ruoyi.production.pojo.ProcessRoute">
        select pr.*
        from process_route pr
@@ -84,35 +143,124 @@
               ps.unit_quantity * po.quantity as demandedQuantity,
               ps.unit,
               p.product_name,
               pp.name as  process_name,
               pp.name                        as process_name,
               pm.product_id,
               pm.model
        from
            product_structure ps
                left join product_model pm on ps.product_model_id = pm.id
                left join product p on pm.product_id = p.id
                left join product_process pp on ps.process_id = pp.id
                left join product_process_route ppr on ps.bom_id = ppr.bom_id
                left join product_order po on po.id = ppr.product_order_id
        from product_structure ps
                 left join product_model pm on ps.product_model_id = pm.id
                 left join product p on pm.product_id = p.id
                 left join product_process pp on ps.process_id = pp.id
                 left join product_process_route ppr on ps.bom_id = ppr.bom_id
                 left join product_order po on po.id = ppr.product_order_id
        where ppr.product_order_id = #{orderId}
        order by ps.id
    </select>
    <select id="countCreated" resultType="java.lang.Integer">
        SELECT count(1) FROM product_order
        WHERE create_time &gt;= #{startDate} AND create_time &lt;= #{endDate}
        SELECT count(1)
        FROM product_order
        WHERE create_time &gt;= #{startDate}
          AND create_time &lt;= #{endDate}
    </select>
    <select id="countCompleted" resultType="java.lang.Integer">
        SELECT count(1) FROM product_order
        WHERE end_time &gt;= #{startDate} AND end_time &lt;= #{endDate}
        SELECT count(1)
        FROM product_order
        WHERE end_time &gt;= #{startDate}
          AND end_time &lt;= #{endDate}
          AND complete_quantity &gt;= quantity
    </select>
    <select id="countPending" resultType="java.lang.Integer">
        SELECT count(1) FROM product_order
        WHERE create_time &gt;= #{startDate} AND create_time &lt;= #{endDate}
        SELECT count(1)
        FROM product_order
        WHERE create_time &gt;= #{startDate}
          AND create_time &lt;= #{endDate}
          AND complete_quantity &lt; quantity
    </select>
    <select id="listByProductModelId" resultType="com.ruoyi.production.dto.ProductOrderDto">
        select po.*,
        sl.sales_contract_no,
        sl.customer_name,
        p.product_name as product_category,
        pm.model as specification_model,
        pm.unit,
        ppr.process_route_code,
        pb.bom_no,
        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus,
        DATEDIFF(sl.delivery_date, CURDATE()) AS delivery_days_diff,
        sl.delivery_date,
        CASE
        WHEN shipping_status_counts.total_count = 0 THEN false
        WHEN shipping_status_counts.unshipped_count = 0 THEN true
        ELSE false
        END AS is_fh
        from product_order po
        left join sales_ledger sl on po.sales_ledger_id = sl.id
        LEFT JOIN (SELECT sales_ledger_id,
        COUNT(*) as total_count,
        SUM(CASE WHEN status != '已发货' THEN 1 ELSE 0 END) as unshipped_count
        FROM shipping_info
        GROUP BY sales_ledger_id) shipping_status_counts
        ON sl.id = shipping_status_counts.sales_ledger_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 sales_ledger_product slp on po.sale_ledger_product_id = slp.id and slp.type = 1
        left join (select max(id) as id, product_order_id
        from product_process_route
        group by product_order_id) ppr_latest on po.id = ppr_latest.product_order_id
        left join product_process_route ppr on ppr.id = ppr_latest.id
        left join product_bom pb on pb.id = ppr.bom_id
        <where>
            <if test="productModelIds != null and productModelIds.size() > 0">
                po.product_model_id IN
                <foreach collection="productModelIds" open="(" separator="," close=")" item="item">
                    #{item}
                </foreach>
            </if>
        </where>
    </select>
    <select id="listByProductOrderId" resultType="com.ruoyi.production.dto.ProductOrderDto">
        select po.*,
        sl.sales_contract_no,
        sl.customer_name,
        p.product_name as product_category,
        pm.model as specification_model,
        pm.unit,
        ppr.process_route_code,
        pb.bom_no,
        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus,
        DATEDIFF(sl.delivery_date, CURDATE()) AS delivery_days_diff,
        sl.delivery_date,
        CASE
        WHEN shipping_status_counts.total_count = 0 THEN false
        WHEN shipping_status_counts.unshipped_count = 0 THEN true
        ELSE false
        END AS is_fh
        from product_order po
        left join sales_ledger sl on po.sales_ledger_id = sl.id
        LEFT JOIN (SELECT sales_ledger_id,
        COUNT(*) as total_count,
        SUM(CASE WHEN status != '已发货' THEN 1 ELSE 0 END) as unshipped_count
        FROM shipping_info
        GROUP BY sales_ledger_id) shipping_status_counts
        ON sl.id = shipping_status_counts.sales_ledger_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 sales_ledger_product slp on po.sale_ledger_product_id = slp.id and slp.type = 1
        left join (select max(id) as id, product_order_id
        from product_process_route
        group by product_order_id) ppr_latest on po.id = ppr_latest.product_order_id
        left join product_process_route ppr on ppr.id = ppr_latest.id
        left join product_bom pb on pb.id = ppr.bom_id
        <where>
            <if test="productOrderIds != null and productOrderIds.size() > 0">
                po.id IN
                <foreach collection="productOrderIds" open="(" separator="," close=")" item="item">
                    #{item}
                </foreach>
            </if>
        </where>
    </select>
</mapper>