From 0e420d68f407fde240709ac1800da20b0bb99490 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期二, 09 六月 2026 16:06:16 +0800
Subject: [PATCH] feat:反审核操作。可以对已审核的订单进行反审核,反审核的时候可以选择作废还是重新生成一条,并记录反审核描述。选择作废的话则不生成新增订单。选择重新生成的话则跳转到新增台账页面对反审核的销售产品进行编辑保存重新生成一条新增的订单。反审核的订单即使是发货了还是可以反审核,并且需要将对应的入库、出库、发货进行作废。

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java |   91 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 91 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index 0854853..9c7f2a2 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -3357,6 +3357,97 @@
      * 2. 澶嶅埗鍘熼攢鍞彴璐﹀強浜у搧鏁版嵁锛岀敓鎴愭柊鐨勫彴璐�
      * 3. 瀵瑰師鍙拌处鐨勫簱瀛樻暟鎹繘琛屽弽鍚戞搷浣�
      */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<Long> counterReview(CounterReviewDto dto) {
+        if (dto == null || CollectionUtils.isEmpty(dto.getIds())) {
+            throw new ServiceException("璇烽�夋嫨瑕佸弽瀹℃牳鐨勮鍗�");
+        }
+        if (dto.getCounterReviewType() == null || (dto.getCounterReviewType() != 1 && dto.getCounterReviewType() != 2)) {
+            throw new ServiceException("璇烽�夋嫨鍙嶅鏍哥被鍨嬶細浣滃簾鎴栭噸鏂扮敓鎴�");
+        }
+        if (dto.getCounterReviewDesc() == null || dto.getCounterReviewDesc().trim().isEmpty()) {
+            throw new ServiceException("璇疯緭鍏ュ弽瀹℃牳鎻忚堪");
+        }
+
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        List<Long> newLedgerIds = new ArrayList<>();
+
+        for (Long id : dto.getIds()) {
+            SalesLedger originalLedger = salesLedgerMapper.selectById(id);
+            if (originalLedger == null) {
+                throw new ServiceException("璁㈠崟涓嶅瓨鍦紝鏃犳硶鍙嶅鏍�");
+            }
+            if (originalLedger.getReviewStatus() == null || originalLedger.getReviewStatus() != 1) {
+                throw new ServiceException("璁㈠崟" + originalLedger.getSalesContractNo() + "涓嶆槸宸插鏍哥姸鎬侊紝鏃犳硶鍙嶅鏍�");
+            }
+
+            // 1. 鏍囪鍘熻鍗曚负宸插弽瀹�
+            originalLedger.setReviewStatus(2);
+            originalLedger.setCounterReviewTime(LocalDateTime.now());
+            originalLedger.setCounterReviewPerson(loginUser.getUser().getNickName());
+            originalLedger.setCounterReviewPersonId(loginUser.getUserId());
+            originalLedger.setCounterReviewType(dto.getCounterReviewType());
+            originalLedger.setCounterReviewDesc(dto.getCounterReviewDesc());
+            salesLedgerMapper.updateById(originalLedger);
+
+            // 2. 浣滃簾搴撳瓨锛氬叆搴撴墸鍑忋�佸嚭搴撳鍔犮�佸垹闄よ褰�
+            processOriginalOrderStock(id);
+
+            // 3. 娓呴櫎璐ㄦ璁板綍
+            clearQualityInspectRecords(id);
+
+            // 4. 娓呴櫎鍙戣揣淇℃伅鍜屽彂璐у鎵硅褰�
+            clearShippingAndApprovalRecords(id);
+
+            // 5. 鍙栨秷瀹℃壒娴佺▼
+            cancelApproveProcesses(id, originalLedger.getSalesContractNo());
+
+            // 6. 閲嶆柊鐢熸垚锛氬垱寤烘柊鍙拌处鍓湰
+            if (dto.getCounterReviewType() == 2) {
+                SalesLedger newLedger = new SalesLedger();
+                BeanUtils.copyProperties(originalLedger, newLedger);
+                newLedger.setId(null);
+                newLedger.setSalesContractNo(generateSalesContractNo());
+                newLedger.setDeliveryStatus(1);
+                newLedger.setStockStatus(0);
+                newLedger.setReviewStatus(0);
+                newLedger.setCounterReviewTime(null);
+                newLedger.setCounterReviewPerson(null);
+                newLedger.setCounterReviewPersonId(null);
+                newLedger.setCounterReviewType(null);
+                newLedger.setCounterReviewDesc(null);
+                salesLedgerMapper.insert(newLedger);
+
+                // 澶嶅埗浜у搧鍒版柊鍙拌处
+                List<SalesLedgerProduct> originalProducts = salesLedgerProductMapper.selectList(
+                    Wrappers.<SalesLedgerProduct>lambdaQuery()
+                        .eq(SalesLedgerProduct::getSalesLedgerId, id)
+                );
+                for (SalesLedgerProduct originalProduct : originalProducts) {
+                    SalesLedgerProduct newProduct = new SalesLedgerProduct();
+                    BeanUtils.copyProperties(originalProduct, newProduct);
+                    newProduct.setId(null);
+                    newProduct.setSalesLedgerId(newLedger.getId());
+                    newProduct.setStockedQuantity(BigDecimal.ZERO);
+                    newProduct.setShippedQuantity(BigDecimal.ZERO);
+                    newProduct.setUnqualifiedStockedQuantity(BigDecimal.ZERO);
+                    newProduct.setUnqualifiedShippedQuantity(BigDecimal.ZERO);
+                    newProduct.setReturnQuality(BigDecimal.ZERO);
+                    newProduct.setAvailableQuality(newProduct.getQuantity().subtract(newProduct.getReturnQuality()));
+                    newProduct.setProductStockStatus(0);
+                    newProduct.fillRemainingQuantity();
+                    salesLedgerProductMapper.insert(newProduct);
+                }
+                newLedgerIds.add(newLedger.getId());
+            }
+        }
+        return newLedgerIds;
+    }
+
+    /**
+     * 鏃х増鍙嶅澶勭悊锛堝吋瀹� addOrUpdateSalesLedger 涓� reviewStatus=2 鐨勮皟鐢級
+     */
     private void handleCounterReview(SalesLedger salesLedger) {
         // 1. 璁剧疆鍙嶅鐩稿叧淇℃伅
         LoginUser loginUser = SecurityUtils.getLoginUser();

--
Gitblit v1.9.3