From 346d463346701e8714b3a3a3ebb21e21960b5484 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 20 三月 2026 15:06:47 +0800
Subject: [PATCH] feat: 查看生产订单对应的生产计划来源

---
 src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java            |    4 +
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java |   14 +++++++
 src/main/resources/mapper/production/ProductOrderMapper.xml                  |   40 ++++++++++++++++++-
 src/main/java/com/ruoyi/production/controller/ProductOrderController.java    |   11 ++++-
 src/main/java/com/ruoyi/production/service/ProductOrderService.java          |    4 +
 src/main/java/com/ruoyi/production/dto/ProductOrderSourceDto.java            |   28 ++++++++++++++
 6 files changed, 93 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
index 0bfbfec..8592f25 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -1,13 +1,13 @@
 package com.ruoyi.production.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.basic.pojo.Customer;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.production.dto.ProductOrderDto;
-import com.ruoyi.production.pojo.ProcessRoute;
+import com.ruoyi.production.dto.ProductOrderSourceDto;
 import com.ruoyi.production.pojo.ProductOrder;
 import com.ruoyi.production.service.ProductOrderService;
 import io.swagger.annotations.Api;
@@ -16,7 +16,6 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
-import java.math.BigDecimal;
 import java.util.List;
 
 @RequestMapping("/productOrder")
@@ -82,5 +81,11 @@
         return R.ok(productOrderService.addProductOrder(productOrder));
     }
 
+    @GetMapping("/productOrderSource/{orderId}")
+    @ApiOperation("鏌ョ湅鐢熶骇璁㈠崟瀵瑰簲鐨勭敓浜ц鍒�")
+    public AjaxResult productOrderSource(@PathVariable Long orderId) {
+        List<ProductOrderSourceDto> list = productOrderService.productOrderSource(orderId);
+        return AjaxResult.success(list);
+    }
 
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ProductOrderSourceDto.java b/src/main/java/com/ruoyi/production/dto/ProductOrderSourceDto.java
new file mode 100644
index 0000000..1bdab15
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProductOrderSourceDto.java
@@ -0,0 +1,28 @@
+package com.ruoyi.production.dto;
+
+import com.ruoyi.productionPlan.dto.ProductionPlanDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * <br>
+ * 鐢熶骇璁㈠崟鏉ユ簮-涓荤敓浜ц鍒�
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/03/20
+ */
+@Data
+@ApiModel(value = "ProductOrderSourceDto", description = "鐢熶骇璁㈠崟鏉ユ簮-涓荤敓浜ц鍒�")
+public class ProductOrderSourceDto {
+
+    @ApiModelProperty("鐢宠鍗曠紪鍙�")
+    private String applyNo;
+
+    @ApiModelProperty("涓荤敓浜ц鍒掓暟鎹�")
+    private List<ProductionPlanDto> productPlans;
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
index d9dd4be..84da613 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
@@ -3,8 +3,8 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.production.dto.ProductBomDto;
 import com.ruoyi.production.dto.ProductOrderDto;
+import com.ruoyi.production.dto.ProductOrderSourceDto;
 import com.ruoyi.production.dto.ProductStructureDto;
 import com.ruoyi.production.pojo.ProcessRoute;
 import com.ruoyi.production.pojo.ProductOrder;
@@ -27,4 +27,6 @@
     Integer countCompleted(@Param("startDate") String startDate, @Param("endDate") String endDate);
 
     Integer countPending(@Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    List<ProductOrderSourceDto> productOrderSource(@Param("orderId") Long orderId);
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductOrderService.java b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
index 612ecd8..1a2edcf 100644
--- a/src/main/java/com/ruoyi/production/service/ProductOrderService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -3,8 +3,8 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.production.dto.ProductBomDto;
 import com.ruoyi.production.dto.ProductOrderDto;
+import com.ruoyi.production.dto.ProductOrderSourceDto;
 import com.ruoyi.production.dto.ProductStructureDto;
 import com.ruoyi.production.pojo.ProcessRoute;
 import com.ruoyi.production.pojo.ProductOrder;
@@ -32,4 +32,6 @@
     Long insertProductOrder(ProductOrder productOrder);
 
     Boolean delete(Long id);
+
+    List<ProductOrderSourceDto> productOrderSource(Long orderId);
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
index 094d016..ef1db88 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -6,8 +6,10 @@
 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.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.dto.ProductOrderDto;
+import com.ruoyi.production.dto.ProductOrderSourceDto;
 import com.ruoyi.production.dto.ProductStructureDto;
 import com.ruoyi.production.enums.ProductOrderStatusEnum;
 import com.ruoyi.production.mapper.*;
@@ -314,5 +316,17 @@
         return "SC" + datePrefix + String.format("%04d", sequence);
     }
 
+    @Override
+    public List<ProductOrderSourceDto> productOrderSource(Long orderId) {
+        if (orderId == null) {
+            throw new ServiceException("鏌ヨ璁㈠崟鏁版嵁涓嶈兘涓虹┖");
+        }
+        ProductOrder productOrder = getById(orderId);
+        if (productOrder == null) {
+            throw new ServiceException("鏌ヨ澶辫触,鐢熶骇璁㈠崟涓嶅瓨鍦�");
+        }
 
+        List<ProductOrderSourceDto> list = baseMapper.productOrderSource(orderId);
+        return list;
+    }
 }
diff --git a/src/main/resources/mapper/production/ProductOrderMapper.xml b/src/main/resources/mapper/production/ProductOrderMapper.xml
index 1862e33..ed6c187 100644
--- a/src/main/resources/mapper/production/ProductOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -14,6 +14,19 @@
         <result property="status" column="status"/>
     </resultMap>
 
+    <resultMap id="ProductOrderSourceMap" type="com.ruoyi.production.dto.ProductOrderSourceDto">
+        <id property="applyNo" column="apply_no"/>
+        <result property="applyNo" column="apply_no"/>
+        <collection property="productPlans" ofType="com.ruoyi.productionPlan.dto.ProductionPlanDto" autoMapping="true">
+            <id property="id" column="plan_id"/>
+            <result property="materialCode" column="material_code"/>
+            <result property="productName" column="product_name"/>
+            <result property="model" column="model"/>
+            <result property="unit" column="unit"/>
+            <result property="totalAssignedQuantity" column="total_assigned_quantity"/>
+        </collection>
+    </resultMap>
+
     <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto">
         SELECT
         po.id,
@@ -41,9 +54,9 @@
         LEFT JOIN process_route pr ON po.route_id = pr.id
         LEFT JOIN product_bom pb ON pr.bom_id = pb.id
         LEFT JOIN (
-            SELECT product_order_id, MIN(production_plan_id) AS production_plan_id
-            FROM product_order_plan
-            GROUP BY product_order_id
+        SELECT product_order_id, MIN(production_plan_id) AS production_plan_id
+        FROM product_order_plan
+        GROUP BY product_order_id
         ) pop ON po.id = pop.product_order_id
         LEFT JOIN production_plan pp ON pop.production_plan_id = pp.id
         LEFT JOIN product_material_sku pms ON pms.id = pp.product_material_sku_id
@@ -108,4 +121,25 @@
           AND create_time &lt;= #{endDate}
           AND complete_quantity &lt; quantity
     </select>
+
+    <select id="productOrderSource" resultMap="ProductOrderSourceMap"
+            parameterType="java.lang.Long">
+        SELECT pp.id                 AS plan_id,
+               pp.apply_no,
+               pp.*,
+               pop.assigned_quantity AS total_assigned_quantity,
+               sku.material_code,
+               sku.model,
+               pm.product_name,
+               pm.unit
+
+        FROM product_order_plan pop
+                 LEFT JOIN production_plan pp ON pop.production_plan_id = pp.id
+                 LEFT JOIN product_material_sku sku ON pp.product_material_sku_id = sku.id
+                 LEFT JOIN product_material pm ON sku.product_id = pm.id
+
+        WHERE pop.product_order_id = #{orderId}
+        ORDER BY pp.apply_no
+
+    </select>
 </mapper>

--
Gitblit v1.9.3