From 22b57a30be7f73e13585ae4bd4925f0c66846ba9 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 11 六月 2026 14:52:57 +0800
Subject: [PATCH] feat(production): 优化工单查询接口按订单维度分组并新增订单明细查询

---
 src/main/resources/mapper/production/ProductionOperationTaskMapper.xml |  190 ++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 160 insertions(+), 30 deletions(-)

diff --git a/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml b/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
index ebafa7a..4b0b12d 100644
--- a/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
@@ -21,41 +21,92 @@
         <result column="dept_id" property="deptId" />
     </resultMap>
 
+    <!-- 鎸夌敓浜ц鍗曞垎缁勭殑宸ュ崟鍒嗛〉鏌ヨ -->
     <select id="pageProductionOperationTask" resultType="com.ruoyi.production.bean.vo.ProductionOperationTaskVo">
-        select pot.*,
-               po.nps_no as npsNo,
-               p.product_name as productName,
-               pm.model as model,
-               pm.unit as unit,
-               poro.operation_name as operationName,
-        ROUND(pot.complete_quantity / pot.plan_quantity * 100, 2) AS completionStatus,
-        CASE
-            WHEN pot.work_order_no LIKE 'FG%' THEN '杩斿伐杩斾慨'
-            ELSE '姝e父'
-            END AS work_order_type
-        from production_operation_task pot
-                 left join production_order po on pot.production_order_id = po.id
-                 left join production_order_routing_operation poro on pot.production_order_routing_operation_id = poro.id
-                 left join product_model pm on pm.id = ifnull(poro.product_model_id, po.product_model_id)
-                 left join product p on pm.product_id = p.id
+        SELECT
+            po.id                   AS productionOrderId,
+            po.nps_no               AS npsNo,
+            po.is_end_order         AS endOrder,
+            p.product_name          AS productName,
+            pm.model                AS model,
+            pm.unit                 AS unit,
+            GROUP_CONCAT(DISTINCT poro.operation_name ORDER BY poro.drag_sort, poro.operation_name SEPARATOR ',') AS operationName,
+            COUNT(DISTINCT pot.id)  AS productionTaskCount,
+            po.quantity             AS planQuantity,
+            po.complete_quantity    AS completeQuantity,
+            po.complete_quantity    AS goodQuantity,
+            SUM(IFNULL(scrapStat.scrapQty, 0)) AS scrapQty,
+            ROUND(IFNULL(po.complete_quantity, 0) / NULLIF(po.quantity, 0) * 100, 2) AS completionStatus,
+            MAX(poro.type)          AS type,
+            CASE WHEN SUM(CASE WHEN pot.work_order_no LIKE 'FG%' THEN 1 ELSE 0 END) > 0
+                THEN '杩斿伐杩斾慨' ELSE '姝e父' END AS workOrderType,
+            GROUP_CONCAT(DISTINCT pot.work_order_no ORDER BY pot.work_order_no SEPARATOR ',') AS workOrderNo,
+            MIN(pot.plan_start_time)   AS planStartTime,
+            MAX(pot.plan_end_time)     AS planEndTime,
+            MIN(pot.actual_start_time) AS actualStartTime,
+            MAX(pot.actual_end_time)   AS actualEndTime,
+            MAX(pot.status)            AS status
+        FROM production_operation_task pot
+            LEFT JOIN production_order po ON pot.production_order_id = po.id
+            LEFT JOIN production_order_routing_operation poro ON pot.production_order_routing_operation_id = poro.id
+            LEFT JOIN product_model pm ON pm.id = po.product_model_id
+            LEFT JOIN product p ON pm.product_id = p.id
+            LEFT JOIN (
+                SELECT ppm.production_operation_task_id AS taskId,
+                       SUM(IFNULL(ppo.scrap_qty, 0)) AS scrapQty
+                FROM production_product_main ppm
+                    LEFT JOIN production_product_output ppo ON ppo.production_product_main_id = ppm.id
+                GROUP BY ppm.production_operation_task_id
+            ) scrapStat ON scrapStat.taskId = pot.id
         <where>
-            <if test="c != null and c.id != null">
-                and pot.id = #{c.id}
+            <if test="c != null and c.npsNo != null and c.npsNo != ''">
+                AND po.nps_no LIKE CONCAT('%', #{c.npsNo}, '%')
             </if>
             <if test="c != null and c.productionOrderId != null">
-                and pot.production_order_id = #{c.productionOrderId}
-            </if>
-            <if test="c != null and c.productionOrderRoutingOperationId != null">
-                and pot.production_order_routing_operation_id = #{c.productionOrderRoutingOperationId}
-            </if>
-            <if test="c != null and c.status != null">
-                and pot.status = #{c.status}
-            </if>
-            <if test="c != null and c.workOrderNo != null and c.workOrderNo != ''">
-                and pot.work_order_no like concat('%', #{c.workOrderNo}, '%')
+                AND pot.production_order_id = #{c.productionOrderId}
             </if>
         </where>
-        order by pot.id desc
+        GROUP BY po.id
+        ORDER BY po.id DESC
+    </select>
+
+    <!-- 鏍规嵁璁㈠崟ID鏌ヨ宸ュ崟鍒楄〃 -->
+    <select id="listByOrderId" resultType="com.ruoyi.production.bean.vo.ProductionOperationTaskVo">
+        SELECT
+            pot.id,
+            pot.work_order_no                   AS workOrderNo,
+            pot.plan_start_time                 AS planStartTime,
+            pot.plan_end_time                   AS planEndTime,
+            pot.actual_start_time               AS actualStartTime,
+            pot.actual_end_time                 AS actualEndTime,
+            pot.status,
+            pot.production_order_id             AS productionOrderId,
+            pot.plan_quantity                   AS planQuantity,
+            pot.complete_quantity               AS completeQuantity,
+            po.nps_no                           AS npsNo,
+            po.is_end_order                     AS endOrder,
+            p.product_name                      AS productName,
+            pm.model                            AS model,
+            pm.unit                             AS unit,
+            poro.operation_name                 AS operationName,
+            poro.type                           AS type,
+            CASE WHEN pot.work_order_no LIKE 'FG%' THEN '杩斿伐杩斾慨' ELSE '姝e父' END AS workOrderType,
+            IFNULL(scrapStat.scrapQty, 0)       AS scrapQty,
+            ROUND(IFNULL(pot.complete_quantity, 0) / NULLIF(pot.plan_quantity, 0) * 100, 2) AS completionStatus
+        FROM production_operation_task pot
+            LEFT JOIN production_order po ON pot.production_order_id = po.id
+            LEFT JOIN production_order_routing_operation poro ON pot.production_order_routing_operation_id = poro.id
+            LEFT JOIN product_model pm ON pm.id = IFNULL(poro.product_model_id, po.product_model_id)
+            LEFT JOIN product p ON pm.product_id = p.id
+            LEFT JOIN (
+                SELECT ppm.production_operation_task_id AS taskId,
+                       SUM(IFNULL(ppo.scrap_qty, 0)) AS scrapQty
+                FROM production_product_main ppm
+                    LEFT JOIN production_product_output ppo ON ppo.production_product_main_id = ppm.id
+                GROUP BY ppm.production_operation_task_id
+            ) scrapStat ON scrapStat.taskId = pot.id
+        WHERE pot.production_order_id = #{orderId}
+        ORDER BY pot.id DESC
     </select>
 
     <select id="selectTaskStatisticsByDate" resultType="com.ruoyi.home.dto.ProductionTaskStatisticsDto">
@@ -94,7 +145,7 @@
         select poro.operation_name as processName,
                sum(ifnull(ppi.input_quantity, 0)) as totalInput,
                sum(ifnull(ppo.scrap_qty, 0)) as totalScrap,
-               sum(ifnull(ppo.quantity, 0) - ifnull(ppo.scrap_qty, 0)) as totalOutput
+               sum(greatest(ifnull(ppo.quantity, 0) - ifnull(ppo.scrap_qty, 0), 0)) as totalOutput
         from production_product_output ppo
                  inner join production_product_main ppm on ppo.production_product_main_id = ppm.id
                  inner join production_operation_task pot on ppm.production_operation_task_id = pot.id
@@ -120,4 +171,83 @@
         group by poro.technology_operation_id, poro.operation_name
     </select>
 
+    <select id="getProductWorkOrderFlowCard" resultType="com.ruoyi.production.bean.dto.ProductionOperationTaskDto">
+        SELECT pot.*,
+               poro.operation_name AS processName,
+               pm.model AS model,
+               pm.unit AS unit,
+               p.product_name AS productName,
+               po.nps_no AS productOrderNpsNo,
+               ROUND(IFNULL(pot.complete_quantity, 0) / NULLIF(pot.plan_quantity, 0) * 100, 2) AS completionStatus,
+               IFNULL(scrapStat.scrapQty, 0) AS scrapQty
+        FROM production_operation_task pot
+                 LEFT JOIN production_order po ON pot.production_order_id = po.id
+                 LEFT JOIN production_order_routing_operation poro ON pot.production_order_routing_operation_id = poro.id
+                 LEFT JOIN product_model pm ON pm.id = ifnull(poro.product_model_id, po.product_model_id)
+                 LEFT JOIN product p ON p.id = pm.product_id
+                 LEFT JOIN (
+            SELECT ppm.production_operation_task_id AS taskId,
+                   SUM(IFNULL(ppo.scrap_qty, 0)) AS scrapQty
+            FROM production_product_main ppm
+                     LEFT JOIN production_product_output ppo ON ppo.production_product_main_id = ppm.id
+            GROUP BY ppm.production_operation_task_id
+        ) scrapStat ON scrapStat.taskId = pot.id
+        WHERE pot.id = #{id}
+    </select>
+
+    <select id="getOperation" resultType="com.ruoyi.production.bean.vo.ProductionOperationTaskVo">
+        select poro.operation_name as operationName,
+               max(poro.type) as type,
+               count(pot.id) as productionTaskCount,
+               sum(ifnull(pot.plan_quantity, 0)) as planQuantity,
+               sum(ifnull(pot.complete_quantity, 0)) as completeQuantity,
+               sum(ifnull(pot.complete_quantity, 0)) as goodQuantity,
+               sum(ifnull(outputStat.scrapQty, 0)) as scrapQty,
+               round(
+                   case
+                       when sum(ifnull(pot.plan_quantity, 0)) = 0 then 0
+                       else (sum(ifnull(pot.complete_quantity, 0)) + sum(ifnull(outputStat.scrapQty, 0)))
+                           / sum(ifnull(pot.plan_quantity, 0)) * 100
+                       end,
+                   2
+               ) as completionStatus
+        from production_operation_task pot
+                 left join production_order_routing_operation poro on pot.production_order_routing_operation_id = poro.id
+                 left join (
+            select ppm.production_operation_task_id as taskId,
+                   sum(ifnull(ppo.scrap_qty, 0)) as scrapQty
+            from production_product_main ppm
+                     left join production_product_output ppo on ppo.production_product_main_id = ppm.id
+            group by ppm.production_operation_task_id
+        ) outputStat on outputStat.taskId = pot.id
+        <where>
+            <if test="c != null and c.startDate != null">
+                and date(pot.create_time) &gt;= #{c.startDate}
+            </if>
+            <if test="c != null and c.endDate != null">
+                and date(pot.create_time) &lt;= #{c.endDate}
+            </if>
+            <if test="c != null and c.planStartTime != null">
+                and pot.plan_start_time &gt;= #{c.planStartTime}
+            </if>
+            <if test="c != null and c.planEndTime != null">
+                and pot.plan_end_time &lt;= #{c.planEndTime}
+            </if>
+            <if test="c != null and c.productionOrderId != null">
+                and pot.production_order_id = #{c.productionOrderId}
+            </if>
+            <if test="c != null and c.productionOrderRoutingOperationId != null">
+                and pot.production_order_routing_operation_id = #{c.productionOrderRoutingOperationId}
+            </if>
+            <if test="c != null and c.status != null">
+                and pot.status = #{c.status}
+            </if>
+            <if test="c != null and c.processName != null and c.processName != ''">
+                and poro.operation_name like concat('%', #{c.processName}, '%')
+            </if>
+        </where>
+        group by poro.operation_name
+        order by min(poro.drag_sort), poro.operation_name
+    </select>
+
 </mapper>

--
Gitblit v1.9.3