From 5929fa552fd2d8cf9d4cad0d519c89728e4a6ada Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期一, 23 三月 2026 16:03:16 +0800
Subject: [PATCH] Merge branch 'dev_衡阳_鹏创电子' of http://114.132.189.42:9002/r/product-inventory-management-after into dev_衡阳_鹏创电子

---
 src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java             |    2 
 .gitignore                                                                              |    3 +
 src/main/java/com/ruoyi/production/service/ProductInspectionRecordService.java          |    7 ++
 src/main/java/com/ruoyi/production/dto/ProductInspectionRecordDto.java                  |    7 ++
 src/main/java/com/ruoyi/production/controller/ProductInspectionRecordController.java    |   15 +++++
 src/main/java/com/ruoyi/quality/service/IQualityTestStandardService.java                |    2 
 src/main/java/com/ruoyi/quality/mapper/QualityTestStandardParamMapper.java              |    3 +
 src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java                        |    8 ++
 src/main/java/com/ruoyi/production/pojo/ProductInspectionRecord.java                    |    8 ++
 src/main/resources/mapper/quality/QualityTestStandardParamMapper.xml                    |    8 ++
 src/main/java/com/ruoyi/production/service/impl/ProductInspectionRecordServiceImpl.java |   98 ++++++++++++++++++++++++++++++++
 src/main/resources/mapper/system/SysUserMapper.xml                                      |   12 ++++
 src/main/java/com/ruoyi/quality/service/impl/QualityTestStandardServiceImpl.java        |    6 -
 13 files changed, 172 insertions(+), 7 deletions(-)

diff --git a/.gitignore b/.gitignore
index b60b03f..736dc01 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,6 +25,9 @@
 *.iml
 *.ipr
 
+### vscode ###
+.vscode
+
 ### JRebel ###
 rebel.xml
 ### NetBeans ###
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
index af8fe1d..8a9f1fe 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -440,6 +440,8 @@
                 return "鍗遍櫓浣滀笟瀹℃壒";
             case 9:
                 return "鍏ュ簱瀹℃壒";
+            case 10:
+                return "閫氱煡";
         }
         return null;
     }
diff --git a/src/main/java/com/ruoyi/production/controller/ProductInspectionRecordController.java b/src/main/java/com/ruoyi/production/controller/ProductInspectionRecordController.java
index 0ac5c53..4548b54 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductInspectionRecordController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductInspectionRecordController.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
@@ -14,6 +15,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -34,6 +36,11 @@
     @Log(title = "宸℃璁板綍 鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
     public AjaxResult page(ProductInspectionRecordDto productInspectionRecord, Page<ProductInspectionRecord> page) {
         LambdaQueryWrapper<ProductInspectionRecord> ew = Wrappers.<ProductInspectionRecord>lambdaQuery();
+        ew.eq(StringUtils.isNotEmpty(productInspectionRecord.getProcess()), ProductInspectionRecord::getProcess, productInspectionRecord.getProcess())
+                .eq(StringUtils.isNotEmpty(productInspectionRecord.getProcessId()), ProductInspectionRecord::getProcessId, productInspectionRecord.getProcessId())
+                .between(Objects.nonNull(productInspectionRecord.getStartTime()) && Objects.nonNull(productInspectionRecord.getEndTime()),
+                        ProductInspectionRecord::getInspectionTime, productInspectionRecord.getStartTime(),
+                        productInspectionRecord.getEndTime());
         return AjaxResult.success(productInspectionRecordService.page(page, ew));
     }
 
@@ -61,4 +68,12 @@
         productInspectionRecordService.removeBatchByIds(ids);
         return AjaxResult.success();
     }
+
+    @ApiOperation("宸℃璁板綍 閫氱煡")
+    @PostMapping("/notify")
+    @Log(title = "宸℃璁板綍 閫氱煡", businessType = BusinessType.OTHER)
+    public AjaxResult notify(@RequestBody List<Long> ids) {
+        productInspectionRecordService.notify(ids);
+        return AjaxResult.success("鍙戦�侀�氱煡鎴愬姛");
+    }
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ProductInspectionRecordDto.java b/src/main/java/com/ruoyi/production/dto/ProductInspectionRecordDto.java
index 07fc8ca..d452822 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductInspectionRecordDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductInspectionRecordDto.java
@@ -1,7 +1,10 @@
 package com.ruoyi.production.dto;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.production.pojo.ProductInspectionRecord;
 import lombok.Data;
+
+import java.time.LocalDateTime;
 
 /**
  * @author yuan
@@ -10,4 +13,8 @@
  */
 @Data
 public class ProductInspectionRecordDto extends ProductInspectionRecord {
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime startTime;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime endTime;
 }
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductInspectionRecord.java b/src/main/java/com/ruoyi/production/pojo/ProductInspectionRecord.java
index da04ebe..efb5628 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductInspectionRecord.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductInspectionRecord.java
@@ -35,6 +35,9 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
+    @ApiModelProperty("宸ュ簭id")
+    private String processId;
+
     @ApiModelProperty("宸ュ簭")
     private String process;
 
@@ -50,7 +53,12 @@
     @ApiModelProperty("鍒ゅ畾锛坹es鍚堟牸 / no涓嶅悎鏍硷級")
     private String judgement;
 
+    @ApiModelProperty("涓嶅悎鏍艰鍗�")
+    private String unqualifiedOrder;
+
     @ApiModelProperty("宸℃鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime inspectionTime;
 
     @ApiModelProperty("宸℃鍛�")
diff --git a/src/main/java/com/ruoyi/production/service/ProductInspectionRecordService.java b/src/main/java/com/ruoyi/production/service/ProductInspectionRecordService.java
index e3a3b62..029e723 100644
--- a/src/main/java/com/ruoyi/production/service/ProductInspectionRecordService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductInspectionRecordService.java
@@ -2,6 +2,7 @@
 
 import com.ruoyi.production.pojo.ProductInspectionRecord;
 import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +14,10 @@
  */
 public interface ProductInspectionRecordService extends IService<ProductInspectionRecord> {
 
+    /**
+     * 鍙戦�佸贰妫�璁板綍閫氱煡
+     *
+     * @param ids 宸℃璁板綍ID鍒楄〃
+     */
+    void notify(List<Long> ids);
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductInspectionRecordServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductInspectionRecordServiceImpl.java
index 5320a0e..44acb36 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductInspectionRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductInspectionRecordServiceImpl.java
@@ -1,10 +1,21 @@
 package com.ruoyi.production.service.impl;
 
-import com.ruoyi.production.pojo.ProductInspectionRecord;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.production.mapper.ProductInspectionRecordMapper;
+import com.ruoyi.production.pojo.ProductInspectionRecord;
 import com.ruoyi.production.service.ProductInspectionRecordService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.project.system.domain.SysNotice;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
+import com.ruoyi.project.system.service.ISysNoticeService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * <p>
@@ -14,7 +25,90 @@
  * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
  * @since 2026-03-16 04:16:32
  */
+@Slf4j
 @Service
-public class ProductInspectionRecordServiceImpl extends ServiceImpl<ProductInspectionRecordMapper, ProductInspectionRecord> implements ProductInspectionRecordService {
+public class ProductInspectionRecordServiceImpl extends ServiceImpl<ProductInspectionRecordMapper, ProductInspectionRecord>
+        implements ProductInspectionRecordService {
 
+    private static final String OP_POST_CODE = "op";
+
+    @Autowired
+    private SysUserMapper userMapper;
+
+    @Autowired
+    private ISysNoticeService noticeService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void notify(List<Long> ids) {
+        if (ids == null || ids.isEmpty()) {
+            return;
+        }
+
+        // 1. 鏌ヨ宸℃璁板綍
+        List<ProductInspectionRecord> records = listByIds(ids);
+        if (records == null || records.isEmpty()) {
+            log.warn("鏈壘鍒板搴旂殑宸℃璁板綍, ids={}", ids);
+            return;
+        }
+
+        // 2. 鏌ヨ宀椾綅涓簅p鐨勭敤鎴�
+        List<SysUser> opUsers = userMapper.selectUserListByPostCode(OP_POST_CODE);
+        if (opUsers == null || opUsers.isEmpty()) {
+            log.warn("鏈壘鍒板矖浣嶇紪鐮佷负[{}]鐨勭敤鎴�", OP_POST_CODE);
+            return;
+        }
+
+        // 3. 鑾峰彇褰撳墠鐢ㄦ埛淇℃伅
+        Long currentUserId = SecurityUtils.getLoginUser().getUserId();
+        Long tenantId = SecurityUtils.getLoginUser().getTenantId();
+
+        // 4. 涓烘瘡鏉″贰妫�璁板綍鍙戦�侀�氱煡
+        List<SysNotice> notices = new ArrayList<>();
+        for (ProductInspectionRecord record : records) {
+            // 杩囨护鍑轰笉鍚堟牸鐨勮褰�
+            if (!"no".equalsIgnoreCase(record.getJudgement())) {
+                continue;
+            }
+
+            // 鏋勫缓娑堟伅鍐呭锛歺xx鐢熶骇璁㈠崟锛寈x宸ュ簭锛寈x妫�楠岄」涓嶅悎鏍硷紝璇峰強鏃跺宸ヨ壓鍙婂弬鏁板仛璋冩暣锛�
+            String productionOrder = record.getUnqualifiedOrder();
+            String process = record.getProcess();
+            String inspectionItem = record.getInspectionItem();
+
+            StringBuilder messageBuilder = new StringBuilder();
+            if (productionOrder != null && !productionOrder.isEmpty()) {
+                messageBuilder.append(productionOrder).append("鐢熶骇璁㈠崟锛�");
+            }
+            if (process != null && !process.isEmpty()) {
+                messageBuilder.append(process).append("宸ュ簭锛�");
+            }
+            if (inspectionItem != null && !inspectionItem.isEmpty()) {
+                messageBuilder.append(inspectionItem).append("妫�楠岄」涓嶅悎鏍硷紝");
+            }
+            messageBuilder.append("璇峰強鏃跺宸ヨ壓鍙婂弬鏁板仛璋冩暣锛�");
+
+            String title = "宸℃涓嶅悎鏍奸�氱煡";
+            String message = messageBuilder.toString();
+
+            // 涓烘瘡涓猳p宀椾綅鐢ㄦ埛鍒涘缓閫氱煡
+            for (SysUser opUser : opUsers) {
+                SysNotice notice = new SysNotice();
+                notice.setNoticeType("1");
+                notice.setNoticeTitle(title);
+                notice.setNoticeContent(message);
+                notice.setStatus("0");
+                notice.setConsigneeId(opUser.getUserId());
+                notice.setSenderId(currentUserId);
+                notice.setTenantId(tenantId);
+                notices.add(notice);
+            }
+        }
+
+        // 5. 鎵归噺淇濆瓨閫氱煡
+        if (!notices.isEmpty()) {
+            noticeService.saveBatch(notices);
+            log.info("宸插彂閫亄}鏉″贰妫�涓嶅悎鏍奸�氱煡缁檣}涓猳p宀椾綅鐢ㄦ埛", notices.size(), opUsers.size());
+        }
+    }
 }
diff --git a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java b/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
index 5507b3f..c6c7bf2 100644
--- a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
+++ b/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
@@ -156,4 +156,12 @@
     List<Long> getUserByRole(@Param("role") String role);
 
     List<Long> getUserByPerms(@Param("perms") List<String> perms);
+
+    /**
+     * 鏍规嵁宀椾綅缂栫爜鏌ヨ鐢ㄦ埛ID鍒楄〃
+     *
+     * @param postCode 宀椾綅缂栫爜
+     * @return 鐢ㄦ埛ID鍒楄〃
+     */
+    List<SysUser> selectUserListByPostCode(@Param("postCode") String postCode);
 }
diff --git a/src/main/java/com/ruoyi/quality/mapper/QualityTestStandardParamMapper.java b/src/main/java/com/ruoyi/quality/mapper/QualityTestStandardParamMapper.java
index 2823c49..95d236c 100644
--- a/src/main/java/com/ruoyi/quality/mapper/QualityTestStandardParamMapper.java
+++ b/src/main/java/com/ruoyi/quality/mapper/QualityTestStandardParamMapper.java
@@ -1,5 +1,6 @@
 package com.ruoyi.quality.mapper;
 
+import com.ruoyi.quality.pojo.QualityTestStandard;
 import com.ruoyi.quality.pojo.QualityTestStandardParam;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
@@ -20,4 +21,6 @@
 public interface QualityTestStandardParamMapper extends BaseMapper<QualityTestStandardParam> {
 
     List<QualityTestStandardParam> selectListByProductId(@Param("productId") Long productId);
+
+    List<QualityTestStandardParam> selectParameterItemByProcessOrCategory(@Param("id") Long id, @Param("inspectType") Integer inspectType);
 }
diff --git a/src/main/java/com/ruoyi/quality/service/IQualityTestStandardService.java b/src/main/java/com/ruoyi/quality/service/IQualityTestStandardService.java
index 08e3d82..99ca906 100644
--- a/src/main/java/com/ruoyi/quality/service/IQualityTestStandardService.java
+++ b/src/main/java/com/ruoyi/quality/service/IQualityTestStandardService.java
@@ -26,5 +26,5 @@
 
     int delQualityTestStandard(List<Integer> ids);
 
-    List<QualityTestStandard> getParameterItemByProcessOrCategory(Long id, Integer inspectType);
+    List<QualityTestStandardParam> getParameterItemByProcessOrCategory(Long id, Integer inspectType);
 }
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityTestStandardServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityTestStandardServiceImpl.java
index 837d292..bec6aea 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityTestStandardServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityTestStandardServiceImpl.java
@@ -90,10 +90,8 @@
     }
 
     @Override
-    public List<QualityTestStandard> getParameterItemByProcessOrCategory(Long id, Integer inspectType) {
-        return baseMapper.selectList(Wrappers.<QualityTestStandard>lambdaQuery()
-                .eq(Objects.nonNull(id),QualityTestStandard::getProcessId, id)
-                .eq(QualityTestStandard::getInspectType, inspectType));
+    public List<QualityTestStandardParam> getParameterItemByProcessOrCategory(Long id, Integer inspectType) {
+        return qualityTestStandardParamMapper.selectParameterItemByProcessOrCategory(id, inspectType);
     }
 
 
diff --git a/src/main/resources/mapper/quality/QualityTestStandardParamMapper.xml b/src/main/resources/mapper/quality/QualityTestStandardParamMapper.xml
index 837bc26..7c52f9d 100644
--- a/src/main/resources/mapper/quality/QualityTestStandardParamMapper.xml
+++ b/src/main/resources/mapper/quality/QualityTestStandardParamMapper.xml
@@ -23,5 +23,13 @@
         left join quality_test_standard_binding t3 on t2.id = t3.test_standard_id
         where t3.product_id = #{productId}
     </select>
+    <select id="selectParameterItemByProcessOrCategory"
+            resultType="com.ruoyi.quality.pojo.QualityTestStandardParam">
+        select *
+        from quality_test_standard qts
+        left join quality_test_standard_param qtsp on qts.id = qtsp.test_standard_id
+        where qts.process_id = #{id}
+        and qts.inspect_type = #{inspectType}
+    </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/system/SysUserMapper.xml b/src/main/resources/mapper/system/SysUserMapper.xml
index d837b7e..6073e01 100644
--- a/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/src/main/resources/mapper/system/SysUserMapper.xml
@@ -298,4 +298,16 @@
 		</if>
 	</select>
 
+	<!-- 鏍规嵁宀椾綅缂栫爜鏌ヨ鐢ㄦ埛鍒楄〃 -->
+	<select id="selectUserListByPostCode" resultType="com.ruoyi.project.system.domain.SysUser">
+		SELECT DISTINCT u.user_id, u.user_name, u.nick_name, u.phonenumber, u.status, u.tenant_id
+		FROM sys_user u
+		LEFT JOIN sys_user_post up ON u.user_id = up.user_id
+		LEFT JOIN sys_post p ON up.post_id = p.post_id
+		WHERE u.del_flag = '0'
+		  AND u.status = '0'
+		  AND p.post_code = #{postCode}
+		  AND p.status = '0'
+	</select>
+
 </mapper>

--
Gitblit v1.9.3