From ffb7c59cadfb8a043a41849fd6d093f7967ea4cb Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 06 八月 2026 10:24:59 +0800
Subject: [PATCH] feat(quality): 增加不合格品拒收处理功能

---
 src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java                      |    8 ++
 src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java       |   44 ++++++++++++++
 src/main/java/com/ruoyi/project/system/service/ISysUserService.java                   |    8 ++
 docs/quality_unqualified_reject.md                                                    |   63 +++++++++++++++++++++
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |    1 
 src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java           |    6 ++
 src/main/java/com/ruoyi/project/system/controller/SysUserController.java              |   17 +++++
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java          |    1 
 src/main/java/com/ruoyi/quality/utils/QualityInspectHelper.java                       |    1 
 src/main/resources/mapper/system/SysUserMapper.xml                                    |   19 +++--
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java             |    1 
 11 files changed, 161 insertions(+), 8 deletions(-)

diff --git a/docs/quality_unqualified_reject.md b/docs/quality_unqualified_reject.md
new file mode 100644
index 0000000..8706199
--- /dev/null
+++ b/docs/quality_unqualified_reject.md
@@ -0,0 +1,63 @@
+# 鍘熸枡妫�楠屼笉鍚堟牸澶勭悊-鎷掓敹
+
+## 娑夊強椤甸潰
+
+- 涓嶅悎鏍肩鐞嗗鐞嗗脊绐楋紙鍘熸枡妫�楠岋級
+
+## API
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /quality/qualityUnqualified/deal | 涓嶅悎鏍肩鐞嗗鐞嗭紙鏂板"鎷掓敹"閫夐」锛� |
+
+**璇锋眰鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| id | Long | 鏄� | 涓嶅悎鏍艰褰旾D |
+| dealResult | String | 鏄� | 澶勭悊缁撴灉锛屾柊澧�"鎷掓敹"閫夐」 |
+| dealName | String | 鍚� | 澶勭悊浜� |
+| dealTime | Date | 鍚� | 澶勭悊鏃ユ湡 |
+
+**鍝嶅簲锛�** `{ "code": 200, "msg": "鎿嶄綔鎴愬姛" }`
+
+## 鍓嶇淇敼鐐�
+
+### 1. 涓嶅悎鏍煎鐞嗗脊绐� - 澶勭悊缁撴灉涓嬫媺妗�
+
+鍦ㄥ師鏂欐楠岋紙inspectType=0锛夌殑涓嶅悎鏍煎鐞嗗脊绐椾腑锛屽鐞嗙粨鏋滀笅鎷夋鏂板"鎷掓敹"閫夐」锛�
+
+```html
+<el-select v-model="form.dealResult" placeholder="璇烽�夋嫨澶勭悊缁撴灉">
+  <el-option label="鎶ュ簾" value="鎶ュ簾" />
+  <el-option label="璁╂鏀捐" value="璁╂鏀捐" />
+  <el-option label="鎷掓敹" value="鎷掓敹" />  <!-- 鏂板 -->
+</el-select>
+```
+
+### 2. 鍒楄〃/璇︽儏 - 澶勭悊缁撴灉灞曠ず
+
+鍒楄〃椤靛拰璇︽儏椤电殑 `dealResult` 瀛楁闇�鏀寔鏄剧ず"鎷掓敹"鐘舵�侊細
+
+```html
+<el-table-column prop="dealResult" label="澶勭悊缁撴灉">
+  <template slot-scope="scope">
+    <el-tag v-if="scope.row.dealResult === '鎷掓敹'" type="danger">鎷掓敹</el-tag>
+    <span v-else>{{ scope.row.dealResult }}</span>
+  </template>
+</el-table-column>
+```
+
+### 3. 澶勭悊閫昏緫
+
+鍓嶇璋冪敤 `/quality/qualityUnqualified/deal` 鎺ュ彛鏃讹紝`dealResult` 浼犲�� `"鎷掓敹"` 鍗冲彲锛屽悗绔細鑷姩锛�
+- 鍒涘缓閲囪喘閫�璐у崟锛坄purchase_return_orders`锛夛紝閫�璐ф柟寮�=鎷掓敹锛坮eturnType=1锛�
+- 鍒涘缓閲囪喘閫�璐т骇鍝佹槑缁嗭紙`purchase_return_order_products`锛�
+- 涓嶅叆搴擄紙涓嶄骇鐢熷叆搴�/鍑哄簱璁板綍锛�
+- 鏇存柊涓嶅悎鏍艰褰曠姸鎬佷负"宸插鐞�"
+
+## 娉ㄦ剰浜嬮」
+
+- "鎷掓敹"閫夐」浠呭鍘熸枡妫�楠岋紙inspectType=0锛夌殑涓嶅悎鏍艰褰曟湁鏁�
+- 鎷掓敹鍚庝細鑷姩鐢熸垚閲囪喘閫�璐у崟鍙凤紙CGTL鍓嶇紑锛夛紝鍙湪閲囪喘閫�璐ч〉闈㈡煡鐪�
+- 鎷掓敹涓嶄細浜х敓浠讳綍搴撳瓨鍙樺姩锛岀墿鍝佺洿鎺ラ��鍥炰緵搴斿晢
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 00a340e..3887ec7 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -332,6 +332,7 @@
                 qualityInspect.setInspectState(0);
                 qualityInspect.setInspectType(inspectType);
                 qualityInspect.setProductMainId(productionProductMain.getId());
+                qualityInspect.setCheckCompany("鏂扮枂澶х綏绱犻┈閾冭柉鍒跺搧鏈夐檺鍏徃");
                 qualityInspect.setProductModelId(productModel.getId());
                 qualityInspectMapper.insert(qualityInspect);
                 List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process);
diff --git a/src/main/java/com/ruoyi/project/system/controller/SysUserController.java b/src/main/java/com/ruoyi/project/system/controller/SysUserController.java
index 9e15e50..a2184de 100644
--- a/src/main/java/com/ruoyi/project/system/controller/SysUserController.java
+++ b/src/main/java/com/ruoyi/project/system/controller/SysUserController.java
@@ -210,6 +210,23 @@
     }
 
     /**
+     * 涓�閿噸缃墍鏈夌敤鎴峰瘑鐮侊紙浠呰秴绾х鐞嗗憳锛�
+     */
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE)
+    @PostMapping("/resetAllPwd")
+    public AjaxResult resetAllPwd()
+    {
+        if (!SysUser.isAdmin(getUserId()))
+        {
+            return error("浠呰秴绾х鐞嗗憳鍙墽琛屾鎿嶄綔");
+        }
+        String defaultPassword = "12345";
+        String encryptedPwd = SecurityUtils.encryptPassword(defaultPassword);
+        int rows = userService.resetAllUserPwd(encryptedPwd);
+        return success("宸查噸缃� " + rows + " 涓敤鎴风殑瀵嗙爜涓� " + defaultPassword);
+    }
+
+    /**
      * 鐘舵�佷慨鏀�
      */
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
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..cac0004 100644
--- a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
+++ b/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
@@ -110,6 +110,14 @@
     public int resetUserPwd(@Param("userName") String userName, @Param("password") String password);
 
     /**
+     * 閲嶇疆鎵�鏈夋湭鍒犻櫎鐢ㄦ埛鐨勫瘑鐮�
+     *
+     * @param password 瀵嗙爜
+     * @return 缁撴灉
+     */
+    public int resetAllUserPwd(@Param("password") String password);
+
+    /**
      * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛
      *
      * @param userId 鐢ㄦ埛ID
diff --git a/src/main/java/com/ruoyi/project/system/service/ISysUserService.java b/src/main/java/com/ruoyi/project/system/service/ISysUserService.java
index e3be5f4..08b7bef 100644
--- a/src/main/java/com/ruoyi/project/system/service/ISysUserService.java
+++ b/src/main/java/com/ruoyi/project/system/service/ISysUserService.java
@@ -179,6 +179,14 @@
     public int resetUserPwd(String userName, String password);
 
     /**
+     * 閲嶇疆鎵�鏈夌敤鎴峰瘑鐮佷负榛樿鍊�
+     *
+     * @param password 榛樿瀵嗙爜锛堟槑鏂囷級
+     * @return 缁撴灉
+     */
+    public int resetAllUserPwd(String password);
+
+    /**
      * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛
      * 
      * @param userId 鐢ㄦ埛ID
diff --git a/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java b/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java
index 01addd4..1e4c486 100644
--- a/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java
+++ b/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java
@@ -360,6 +360,12 @@
         return userMapper.resetUserPwd(userName, password);
     }
 
+    @Override
+    public int resetAllUserPwd(String password)
+    {
+        return userMapper.resetAllUserPwd(password);
+    }
+
     /**
      * 鏂板鐢ㄦ埛瑙掕壊淇℃伅
      * 
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index 49bd0a5..2fc86ec 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -425,6 +425,7 @@
         qualityInspect.setUnit(saleProduct.getUnit());
         qualityInspect.setQuantity(saleProduct.getQuantity());
         qualityInspect.setWarehouse(saleProduct.getStorageLocation());
+        qualityInspect.setCheckCompany("鏂扮枂澶х綏绱犻┈閾冭柉鍒跺搧鏈夐檺鍏徃");
         qualityInspectMapper.insert(qualityInspect);
         List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(saleProduct.getProductId(), 0,null);
         if (qualityTestStandard.size()>0){
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
index b3d93b8..d696912 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -7,9 +7,16 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
+import com.ruoyi.purchase.mapper.PurchaseReturnOrderProductsMapper;
+import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
+import com.ruoyi.purchase.pojo.PurchaseLedger;
+import com.ruoyi.purchase.pojo.PurchaseReturnOrderProducts;
+import com.ruoyi.purchase.pojo.PurchaseReturnOrders;
 import com.ruoyi.production.mapper.ProductionOperationTaskMapper;
 import com.ruoyi.production.mapper.ProductionOrderMapper;
 import com.ruoyi.production.mapper.ProductionOrderRoutingMapper;
@@ -30,10 +37,12 @@
 import com.ruoyi.stock.service.StockUninventoryService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import jakarta.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -54,6 +63,9 @@
     private final ProductionOperationTaskMapper productionOperationTaskMapper;
     private final StockUninventoryService stockUninventoryService;
     private final StockInRecordService stockInRecordService;
+    private final PurchaseReturnOrdersMapper purchaseReturnOrdersMapper;
+    private final PurchaseReturnOrderProductsMapper purchaseReturnOrderProductsMapper;
+    private final PurchaseLedgerMapper purchaseLedgerMapper;
 
     @Override
     public IPage<QualityUnqualified> qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) {
@@ -68,6 +80,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int deal(QualityUnqualified qualityUnqualified) {
         QualityUnqualified unqualified = qualityUnqualifiedMapper.selectById(qualityUnqualified.getId());
         QualityInspect qualityInspect = qualityInspectService.getById(unqualified.getInspectId());
@@ -106,6 +119,9 @@
                 case "璁╂鏀捐":
                     stockUtils.addStock(modelId, unqualified.getQuantity(),
                             StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+                    break;
+                case "鎷掓敹":
+                    createRejectPurchaseReturn(qualityInspect, qualityUnqualified);
                     break;
                 default:
                     break;
@@ -226,6 +242,34 @@
         return value == null ? BigDecimal.ZERO : value;
     }
 
+    private void createRejectPurchaseReturn(QualityInspect qualityInspect, QualityUnqualified qualityUnqualified) {
+        if (qualityInspect == null) {
+            throw new ServiceException("鎵嬪姩鏂板鐨勪笉鍚堟牸璁板綍涓嶆敮鎸佹嫆鏀跺鐞嗭紝璇烽�夋嫨鎶ュ簾鎴栬姝ユ斁琛�");
+        }
+        Long supplierId = null;
+        Long purchaseLedgerId = qualityInspect.getPurchaseLedgerId();
+        if (purchaseLedgerId != null) {
+            PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(purchaseLedgerId);
+            if (purchaseLedger != null) {
+                supplierId = purchaseLedger.getSupplierId();
+            }
+        }
+        PurchaseReturnOrders returnOrder = new PurchaseReturnOrders();
+        returnOrder.setReturnType(1);
+        returnOrder.setSupplierId(supplierId);
+        returnOrder.setPurchaseLedgerId(purchaseLedgerId);
+        returnOrder.setPreparedAt(LocalDate.now());
+        returnOrder.setReturnUserName(qualityUnqualified.getDealName());
+        returnOrder.setRemark("鍘熸枡妫�楠屼笉鍚堟牸-鎷掓敹");
+        returnOrder.setNo(OrderUtils.countTodayByCreateTime(purchaseReturnOrdersMapper, "CGTL", "no", LocalDateTime.now()));
+        purchaseReturnOrdersMapper.insert(returnOrder);
+        PurchaseReturnOrderProducts product = new PurchaseReturnOrderProducts();
+        product.setPurchaseReturnOrderId(returnOrder.getId());
+        product.setReturnQuantity(qualityUnqualified.getQuantity());
+        product.setStockInRecordId(0L);
+        purchaseReturnOrderProductsMapper.insert(product);
+    }
+
     private String resolveProductionBatchNo(Long productionProductMainId,
                                             Long qualityInspectId,
                                             Long productModelId) {
diff --git a/src/main/java/com/ruoyi/quality/utils/QualityInspectHelper.java b/src/main/java/com/ruoyi/quality/utils/QualityInspectHelper.java
index bc19a02..d8d87d2 100644
--- a/src/main/java/com/ruoyi/quality/utils/QualityInspectHelper.java
+++ b/src/main/java/com/ruoyi/quality/utils/QualityInspectHelper.java
@@ -48,6 +48,7 @@
         qualityInspect.setProductModelId(saleProduct.getProductModelId());
         qualityInspect.setUnit(saleProduct.getUnit());
         qualityInspect.setQuantity(saleProduct.getQuantity());
+        qualityInspect.setCheckCompany("鏂扮枂澶х綏绱犻┈閾冭柉鍒跺搧鏈夐檺鍏徃");
         qualityInspectMapper.insert(qualityInspect);
 
         List<QualityTestStandard> qualityTestStandardList = qualityTestStandardMapper
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index afa8098..f158675 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -181,6 +181,7 @@
         }
         qualityInspectDto.setModel(productModel.getModel());
         qualityInspectDto.setUnit(productModel.getUnit());
+        qualityInspectDto.setCheckCompany("鏂扮枂澶х綏绱犻┈閾冭柉鍒跺搧鏈夐檺鍏徃");
 
         // 鍒濆鍖栫┖鐨勬楠屽弬鏁板垪琛�
         qualityInspectDto.setQualityInspectParams(new ArrayList<>());
diff --git a/src/main/resources/mapper/system/SysUserMapper.xml b/src/main/resources/mapper/system/SysUserMapper.xml
index ea68745..cb3681e 100644
--- a/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/src/main/resources/mapper/system/SysUserMapper.xml
@@ -97,7 +97,7 @@
 		</if>
 		<!-- 鏁版嵁鑼冨洿杩囨护 -->
 		${params.dataScope}
-		ORDER BY u.create_time DESC
+		ORDER BY u.create_time DESC, u.user_id DESC
 	</select>
 
 	<select id="selectAllocatedList" parameterType="com.ruoyi.project.system.domain.SysUser" resultMap="SysUserResult">
@@ -131,20 +131,20 @@
 		</if>
 		<!-- 鏁版嵁鑼冨洿杩囨护 -->
 		${params.dataScope}
-		ORDER BY u.create_time DESC
+		ORDER BY u.create_time DESC, u.user_id DESC
 	</select>
 
 	<select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
 	    <include refid="selectUserVo"/>
 		where u.user_name = #{userName} and u.del_flag = '0'
-		ORDER BY u.create_time DESC
+		ORDER BY u.create_time DESC, u.user_id DESC
 	</select>
 
 	<select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
 		<include refid="selectUserVo"/>
 		where u.user_id = #{userId}
 		and u.del_flag = '0'
-		ORDER BY u.create_time DESC
+		ORDER BY u.create_time DESC, u.user_id DESC
 	</select>
 
 	<select id="checkUserNameUnique" parameterType="String" resultMap="SysUserResult">
@@ -169,7 +169,7 @@
             </if>
             and u.del_flag = '0'
         </where>
-        ORDER BY u.create_time DESC
+        ORDER BY u.create_time DESC, u.user_id DESC
     </select>
 	<select id="selectRegistrantIds" resultType="com.ruoyi.project.system.domain.SysUser">
 		SELECT user_id, nick_name FROM sys_user
@@ -184,7 +184,7 @@
 				1=0  <!-- 绌哄垪琛ㄦ椂杩斿洖绌虹粨鏋� -->
 			</if>
 		</where>
-		ORDER BY sys_user.create_time DESC
+		ORDER BY sys_user.create_time DESC, sys_user.user_id DESC
 	</select>
 	<select id="selectUsersByIds" resultType="com.ruoyi.project.system.domain.SysUser">
 		SELECT user_id, nick_name
@@ -194,7 +194,7 @@
 			#{id}
 		</foreach>
 		and del_flag = '0'
-		ORDER BY sys_user.create_time DESC
+		ORDER BY sys_user.create_time DESC, sys_user.user_id DESC
 	</select>
 	<select id="selectUserByNickName" resultType="com.ruoyi.project.system.domain.SysUser"
 			parameterType="java.lang.String">
@@ -266,6 +266,9 @@
 	<update id="resetUserPwd" parameterType="com.ruoyi.project.system.domain.SysUser">
  		update sys_user set password = #{password} where user_name = #{userName}
 	</update>
+		<update id="resetAllUserPwd">
+			update sys_user set password = #{password} where del_flag = '0'
+		</update>
 
 	<delete id="deleteUserById" parameterType="Long">
  		update sys_user set del_flag = '2' where user_id = #{userId}
@@ -288,7 +291,7 @@
 		  and sr.status = '0'
 		  and su.status = '0'
 		  and su.del_flag = '0'
-		ORDER BY su.create_time DESC
+		ORDER BY su.create_time DESC, su.user_id DESC
 	</select>
 	<select id="getUserByPerms" resultType="java.lang.Long">
 		select distinct t5.user_id

--
Gitblit v1.9.3