guoyujie
2025-09-04 48bd9e20aa649145c9bf643e375c0cd86f7bb800
north-glass-erp/src/main/resources/mapper/pp/Report.xml
@@ -788,32 +788,77 @@
    </select>
    <select id="yieldMp">
        SELECT opd.process,
               o.order_id,
               o.customer_name,
               o.project,
               od.product_name,
               ROUND(SUM(distinct opd.reporting_work_num) * od.area, 2)                               as finishedArea
                ,
               ROUND(SUM(distinct opd.broken_num) * od.area, 2)                                       as brokenArea,
               (ROUND(SUM(distinct opd.reporting_work_num) * od.area, 2) +
                ROUND(SUM(distinct opd.broken_num) * od.area, 2))                                     as area,
               CONCAT(ROUND(ROUND(ROUND(SUM(distinct opd.reporting_work_num) * od.area, 2) /
                                  (ROUND(SUM(distinct opd.reporting_work_num) * od.area, 2) +
                                   ROUND(SUM(distinct opd.broken_num) * od.area, 2)), 2) * 100), '%') as finished
        FROM sd.`order` AS o
                 LEFT JOIN sd.order_detail AS od ON od.order_id = o.order_id
                 LEFT JOIN flow_card AS fc ON fc.order_id = od.order_id
            AND fc.order_number = fc.order_number
                 LEFT JOIN sd.order_process_detail AS opd ON opd.order_id = fc.order_id
            AND opd.process_id = fc.process_id
            AND opd.order_number = fc.order_number
            AND opd.technology_number = fc.technology_number
        WHERE opd.reporting_work_num > 0
          and o.create_order>0
          and  DATE_FORMAT((o.create_time), '%Y-%m-%d') BETWEEN #{selectTime1} and #{selectTime2}
          AND position(#{selectProcesses} IN opd.process)
        GROUP BY opd.process, o.order_id
        SELECT
        t.reporting_work_time,
        t.this_process as process,
        t.process_id,
        t.project,
        t.batch,
        SUM(t.completed_quantity) as completedQuantity,
        SUM(t.area) as completedArea,
        SUM(t.breakageQuantity) as breakageQuantity,
        SUM(t.breakageArea) as breakageArea,
        t.responsibleTeam,
        CONCAT(ROUND(ROUND(SUM(t.area)/(SUM(t.area) + SUM(t.breakageArea)),2)*100), '%') as finished,
        t.product_name
        FROM
        (
        SELECT
        rw.reporting_work_time,
        rw.this_process,
        o.project,
        o.batch,
        rw.process_id,
        rwd.completed_quantity AS completed_quantity,
        ROUND(MAX(ogd.child_width) * MAX(ogd.child_height) * rwd.completed_quantity / 1000000, 2) AS area,
        IFNULL(dd.breakage_quantity,0) as breakageQuantity,
        IFNULL(ROUND(MAX(ogd.child_width) * MAX(ogd.child_height) * dd.breakage_quantity / 1000000, 2),0) AS breakageArea,
        IFNULL(dd.responsible_team,'') as responsibleTeam,
        od.product_name
        FROM
        reporting_work AS rw
        LEFT JOIN reporting_work_detail AS rwd
        ON rwd.reporting_work_id = rw.reporting_work_id
        LEFT JOIN damage_details as dd on dd.reporting_work_id = rw.reporting_work_id
        LEFT JOIN flow_card AS fc
        ON fc.order_id = rw.order_id
        AND fc.process_id = rw.process_id
        AND fc.order_number = rwd.order_number
        AND fc.technology_number = rwd.technology_number
        LEFT JOIN sd.order_glass_detail AS ogd
        ON ogd.order_id = fc.order_id
        AND ogd.order_number = fc.order_number
        AND ogd.technology_number = fc.technology_number
        LEFT JOIN sd.order_detail AS od
        ON od.order_id = ogd.order_id
        AND od.order_number = ogd.order_number
        LEFT JOIN sd.`order` AS o
        ON o.order_id = od.order_id
        WHERE
        o.create_order > 0
        AND rw.reviewed_state >= 0
        AND rwd.completed_quantity + IFNULL(dd.breakage_quantity,0)> 0
        AND rw.reporting_work_time &gt;= #{selectTime1}
        AND rw.reporting_work_time &lt; #{selectTime2}
        AND rw.this_process = #{selectProcesses}
        GROUP BY
        rw.reporting_work_id,
        rw.process_id,
        rw.this_process,
        rw.teams_groups_name,
        rwd.order_number,
        rwd.technology_number
        ) t
        GROUP BY
        t.reporting_work_time,
        t.this_process,
        t.process_id,
        t.responsibleTeam
        ORDER BY
        t.this_process,
        t.process_id,
        t.reporting_work_time
    </select>
    <select id="productionScheduleMp">
@@ -1417,7 +1462,15 @@
        AND rwd.completed_quantity > 0
        AND rw.reporting_work_time &gt;= #{selectTime1}
        AND rw.reporting_work_time &lt;  #{selectTime2}
        AND POSITION(#{selectProcesses} IN rw.this_process)
        <choose>
            <!-- 有传工序:精确匹配 -->
            <when test="selectProcesses != null and selectProcesses != ''">
                AND rw.this_process = #{selectProcesses}
            </when>
            <!-- 未传工序:不加限制,查所有) -->
            <otherwise>
            </otherwise>
        </choose>
        <if test="teamOutputDTO.thisProcess != null and teamOutputDTO.thisProcess != ''">
            AND rw.this_process REGEXP #{teamOutputDTO.thisProcess}
        </if>
@@ -3061,7 +3114,7 @@
                        group by opd.process_id,opd.technology_number,opd.process) as bb
                  GROUP BY bb.process_id,bb.technology_number) as b
       on a.process_id = b.process_id and a.technology_number = b.technology_number
       order by a.process_id
       order by a.process_id,a.order_number,a.technology_number
    </select>
@@ -3153,4 +3206,67 @@
                 c.process_id
        order by c.process_id, c.order_number, c.technology_number
    </select>
    <select id="yieldProcessMp">
        select
            rw.this_process as process,
            rw.completedQuantity,
            IFNULL(dd.breakageQuantity,0) as breakageQuantity,
            rw.completedArea,
            IFNULL(dd.breakageArea,0) as breakageArea,
            CONCAT(ROUND(TRUNCATE(rw.completedArea/(rw.completedArea + IFNULL(dd.breakageArea,0)),2)*100), '%') as finished
        from
            (
                select
                    tb.process as this_process,
                    SUM(tb.completedQuantity) as completedQuantity,
                    ROUND(SUM(completedArea),2) as completedArea
                from (
                         SELECT
                             rw.process_id,
                             rw.this_process                                   AS process,
                             rw.teams_groups_name                               AS teamsGroupsName,
                             rwd.order_number                                   AS orderNumber,
                             MAX(bd.nickname)                                   AS nickname,
                             /* 仅当 nickname 为空时才显示 technology_number,否则为 NULL */
                             MIN(CASE WHEN bd.nickname IS NULL THEN rwd.technology_number ELSE NULL END) AS technologyNumber,
                             COALESCE((rwd.completed_quantity), 0)           AS completedQuantity,
                             ROUND(COALESCE((rwd.child_width * rwd.child_height * rwd.completed_quantity),0)/1000000, 2)
                                 AS completedArea
                         FROM reporting_work rw
                                  LEFT JOIN reporting_work_detail rwd
                                            ON rwd.reporting_work_id = rw.reporting_work_id
                                  LEFT JOIN sd.basic_data bd
                                            ON bd.basic_name = rw.this_process
                         WHERE rw.reporting_work_time &gt;= #{selectTime1}
                           AND rw.reporting_work_time &lt; #{selectTime2}
                           AND rw.reviewed_state &gt;= 0
                         GROUP BY
                             rw.reporting_work_id,
                             rw.process_id,
                             rw.this_process,
                             rw.teams_groups_name,
                             rwd.order_number,
                             CASE WHEN bd.nickname IS NULL THEN rwd.technology_number ELSE NULL END
                         ORDER BY rw.process_id,
                                  rw.this_process, rw.teams_groups_name, rwd.order_number,
                                  CASE WHEN bd.nickname IS NULL THEN rwd.technology_number ELSE NULL END
                     ) as tb
                GROUP BY tb.process
            ) as rw
                left join
            (
                select dd.responsible_process,sum(dd.breakage_quantity) as breakageQuantity
                     ,ROUND(SUM((rwd.child_width) * (rwd.child_height) * dd.breakage_quantity / 1000000), 2) as breakageArea
                from reporting_work rw left join damage_details dd on dd.reporting_work_id = rw.reporting_work_id
                                       LEFT JOIN reporting_work_detail rwd on rwd.reporting_work_id = dd.reporting_work_id and rwd.order_number = dd.order_number and rwd.technology_number  = dd.technology_number
                where rw.reporting_work_time &gt;= #{selectTime1}
                  AND rw.reporting_work_time &lt; #{selectTime2}
                  AND rw.reviewed_state &gt;= 0 and dd.available =0
                GROUP BY dd.responsible_process
            ) as dd on  rw.this_process = dd.responsible_process
    </select>
</mapper>