From 768b011a17b9e63e4b6570989824152145952eda Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期三, 08 四月 2026 17:30:06 +0800
Subject: [PATCH] feat: 排产指派工人进行报工

---
 src/main/resources/mapper/production/ProductWorkOrderMapper.xml                       |   35 +++++++----
 src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java      |   39 ++++++++++--
 src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java                         |   24 ++++++++
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |   27 +++++++-
 doc/长治-祥雨远见.sql                                                                       |    5 +
 5 files changed, 107 insertions(+), 23 deletions(-)

diff --git "a/doc/\351\225\277\346\262\273-\347\245\245\351\233\250\350\277\234\350\247\201.sql" "b/doc/\351\225\277\346\262\273-\347\245\245\351\233\250\350\277\234\350\247\201.sql"
new file mode 100644
index 0000000..8a82d43
--- /dev/null
+++ "b/doc/\351\225\277\346\262\273-\347\245\245\351\233\250\350\277\234\350\247\201.sql"
@@ -0,0 +1,5 @@
+ALTER TABLE `product_work_order`
+    ADD COLUMN `worker_id`          bigint       NULL COMMENT '鎸囨淳宸ヤ汉ID',
+    ADD COLUMN `worker_name`        varchar(100) NULL COMMENT '鎸囨淳宸ヤ汉濮撳悕',
+    ADD COLUMN `handover_user_id`   bigint       NULL COMMENT '浜ゆ帴浜哄憳ID',
+    ADD COLUMN `handover_user_name` varchar(100) NULL COMMENT '浜ゆ帴浜哄憳鍚嶇О';
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
index 4efc694..5b9f4c6 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
@@ -122,4 +122,28 @@
     private BigDecimal completeQuantity;
 
 
+    /**
+     * 鎸囨淳宸ヤ汉ID
+     */
+    @ApiModelProperty(value = "鎸囨淳宸ヤ汉ID")
+    private Long workerId;
+
+    /**
+     * 鎸囨淳宸ヤ汉濮撳悕
+     */
+    @ApiModelProperty(value = "鎸囨淳宸ヤ汉濮撳悕")
+    private String workerName;
+
+    /**
+     * 浜ゆ帴浜哄憳ID
+     */
+    @ApiModelProperty(value = "浜ゆ帴浜哄憳ID")
+    private Long handoverUserId;
+
+    /**
+     * 浜ゆ帴浜哄憳鍚嶇О
+     */
+    @ApiModelProperty(value = "浜ゆ帴浜哄憳鍚嶇О")
+    private String handoverUserName;
+
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
index 4a68ce8..9d96984 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -7,10 +7,9 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.deepoove.poi.XWPFTemplate;
-import com.deepoove.poi.config.Configure;
 import com.deepoove.poi.data.PictureRenderData;
 import com.deepoove.poi.data.Pictures;
-import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.MatrixToImageWriter;
 import com.ruoyi.production.dto.ProductWorkOrderDto;
 import com.ruoyi.production.mapper.ProductWorkOrderFileMapper;
@@ -18,8 +17,8 @@
 import com.ruoyi.production.pojo.ProductWorkOrder;
 import com.ruoyi.production.pojo.ProductWorkOrderFile;
 import com.ruoyi.production.service.ProductWorkOrderService;
-import com.ruoyi.quality.pojo.QualityInspectParam;
-import lombok.AllArgsConstructor;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -46,16 +45,42 @@
     @Value("${file.temp-dir}")
     private String tempDir;
 
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
     @Override
     public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
         return productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder);
     }
 
     @Override
-    public int updateProductWorkOrder(ProductWorkOrderDto productWorkOrderDto) {
-        return productWorkOrdermapper.updateById(productWorkOrderDto);
-    }
+    @Transactional(rollbackFor = Exception.class)
+    public int updateProductWorkOrder(ProductWorkOrderDto dto) {
+        if (dto == null) {
+            throw new ServiceException("鎸囨淳澶辫触,鏁版嵁涓嶈兘涓虹┖");
+        }
+        if (dto.getWorkerId() == null) {
+            throw new ServiceException("鎸囨淳澶辫触,鎸囨淳宸ヤ汉涓嶈兘涓虹┖");
+        }
+        SysUser worker = sysUserMapper.selectUserById(dto.getWorkerId());
+        if (worker == null) {
+            throw new ServiceException("鎸囨淳澶辫触,鎸囨淳宸ヤ汉涓嶅瓨鍦�");
+        }
 
+        if (dto.getHandoverUserId() != null) {
+            if (dto.getWorkerId().equals(dto.getHandoverUserId())) {
+                throw new ServiceException("浜ゆ帴澶辫触,浜ゆ帴浜轰笉鑳戒笌鎸囨淳宸ヤ汉鐩稿悓");
+            }
+            SysUser handoverUser = sysUserMapper.selectUserById(dto.getHandoverUserId());
+            if (handoverUser == null) {
+                throw new ServiceException("浜ゆ帴澶辫触,浜ゆ帴浜哄憳涓嶅瓨鍦�");
+            }
+            dto.setHandoverUserName(handoverUser.getNickName());
+        }
+        dto.setWorkerName(worker.getNickName());
+
+        return productWorkOrdermapper.updateById(dto);
+    }
     @Override
     public void down(HttpServletResponse response, ProductWorkOrder productWorkOrder) {
         ProductWorkOrderDto productWorkOrderDto = productWorkOrdermapper.getProductWorkOrderFlowCard(productWorkOrder.getId());
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index fa34114..d3712b1 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -92,6 +92,25 @@
 
     @Override
     public Boolean addProductMain(ProductionProductMainDto dto) {
+        ProductWorkOrder workOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
+        if (workOrder == null) {
+            throw new ServiceException("鎶ュ伐澶辫触,宸ュ崟涓嶅瓨鍦�");
+        }
+        Long currentUserId = dto.getUserId();
+        Long workerId = workOrder.getWorkerId();
+        Long handoverUserId = workOrder.getHandoverUserId();
+        boolean isWorker = workerId != null && workerId.equals(currentUserId);
+        boolean isHandover = handoverUserId != null && handoverUserId.equals(currentUserId);
+
+        if (!isWorker) {
+            // 涓嶆槸鎸囨淳宸ヤ汉
+            if (handoverUserId == null) {
+                throw new ServiceException("鎶ュ伐澶辫触,褰撳墠宸ュ崟鏈氦鎺�,鍙湁鎸囨淳宸ヤ汉鍙互鎶ュ伐");
+            }
+            if (!isHandover) {
+                throw new ServiceException("鎶ュ伐澶辫触,浣犱笉鏄宸ュ崟鐨勪氦鎺ヤ汉鍛�");
+            }
+        }
         SysUser user = userMapper.selectUserById(dto.getUserId());
         ProductionProductMain productionProductMain = new ProductionProductMain();
         //褰撳墠宸ヨ壓璺嚎瀵瑰簲鐨勫伐搴忚鎯�
@@ -207,7 +226,7 @@
                                 qualityInspectParamMapper.insert(param);
                             });
                 }
-            }else {
+            } else {
                 //鐩存帴鍏ュ簱
                 stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
             }
@@ -264,10 +283,10 @@
     public Boolean removeProductMain(Long id) {
         //鍒ゆ柇璇ユ潯鎶ュ伐鏄惁涓嶅悎鏍煎鐞�,濡傛灉涓嶅悎鏍煎鐞嗕簡锛屽垯涓嶅厑璁稿垹闄�
         List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, id));
-        if (qualityInspects.size() > 0){
+        if (qualityInspects.size() > 0) {
             List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList(Wrappers.<QualityUnqualified>lambdaQuery()
                     .in(QualityUnqualified::getInspectId, qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList())));
-            if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState()==1) {
+            if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState() == 1) {
                 throw new ServiceException("璇ユ潯鎶ュ伐宸茬粡涓嶅悎鏍煎鐞嗕簡锛屼笉鍏佽鍒犻櫎");
             }
         }
@@ -321,7 +340,7 @@
                     new LambdaQueryWrapper<QualityInspectParam>()
                             .eq(QualityInspectParam::getInspectId, q.getId()));
             qualityInspectMapper.deleteById(q.getId());
-                stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
+            stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
         });
 
         // 鍒犻櫎浜у嚭璁板綍
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
index 14b883e..86d7512 100644
--- a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -5,17 +5,24 @@
 <mapper namespace="com.ruoyi.production.mapper.ProductWorkOrderMapper">
 
     <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductWorkOrder">
-        <result column="id" property="id"/>
+        <id column="id" property="id"/>
         <result column="product_process_route_item_id" property="productProcessRouteItemId"/>
+        <result column="product_order_id" property="productOrderId"/>
         <result column="create_time" property="createTime"/>
         <result column="update_time" property="updateTime"/>
         <result column="work_order_no" property="workOrderNo"/>
         <result column="status" property="status"/>
         <result column="tenant_id" property="tenantId"/>
-        <result column="actual_end_time" property="planStartTime"/>
+        <result column="plan_start_time" property="planStartTime"/>
         <result column="plan_end_time" property="planEndTime"/>
         <result column="actual_start_time" property="actualStartTime"/>
-        <result column="actualEndTime" property="actualEndTime"/>
+        <result column="actual_end_time" property="actualEndTime"/>
+        <result column="plan_quantity" property="planQuantity"/>
+        <result column="complete_quantity" property="completeQuantity"/>
+        <result column="worker_id" property="workerId"/>
+        <result column="worker_name" property="workerName"/>
+        <result column="handover_user_id" property="handoverUserId"/>
+        <result column="handover_user_name" property="handoverUserName"/>
     </resultMap>
 
     <select id="pageProductWorkOrder" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
@@ -39,16 +46,20 @@
         LEFT JOIN product_model pm ON pm.id = ppri.product_model_id
         LEFT JOIN product p ON p.id = pm.product_id
         where 1=1
-            <if test="c.workOrderNo != null and c.workOrderNo != ''">
-               and pwo.work_order_no like concat('%',#{c.workOrderNo},'%')
-            </if>
-            <if test="c.planStartTime != null and c.planEndTime != null">
-                and DATE(pwo.create_time) between #{c.planStartTime} and #{c.planEndTime}
-            </if>
-            <if test="c.productOrderId != null and c.productOrderId != ''">
-               and pwo.product_order_id = #{c.productOrderId}
-            </if>
+        <if test="c.workOrderNo != null and c.workOrderNo != ''">
+            and pwo.work_order_no like concat('%',#{c.workOrderNo},'%')
+        </if>
+        <if test="c.workerName != null and c.workerName != ''">
+            and (pwo.worker_name like concat('%',#{c.workerName},'%') or pwo.handover_user_name like concat('%',#{c.workerName},'%'))
+        </if>
+        <if test="c.planStartTime != null and c.planEndTime != null">
+            and DATE(pwo.create_time) between #{c.planStartTime} and #{c.planEndTime}
+        </if>
+        <if test="c.productOrderId != null and c.productOrderId != ''">
+            and pwo.product_order_id = #{c.productOrderId}
+        </if>
     </select>
+
     <select id="getProductWorkOrderFlowCard" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
         SELECT
         pwo.*,

--
Gitblit v1.9.3