From 8f30b77a480f8921bffe2bf176bf3479f5bcbedc Mon Sep 17 00:00:00 2001
From: wujianwei <wjw@11.com>
Date: 星期三, 01 四月 2026 16:38:34 +0800
Subject: [PATCH] 新增手动推送应付,应收账单

---
 tms/src/main/java/com/ruoyi/tms/service/impl/TmsReceivableFeeServiceImpl.java |  215 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 213 insertions(+), 2 deletions(-)

diff --git a/tms/src/main/java/com/ruoyi/tms/service/impl/TmsReceivableFeeServiceImpl.java b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsReceivableFeeServiceImpl.java
index 5f066f3..97efd49 100644
--- a/tms/src/main/java/com/ruoyi/tms/service/impl/TmsReceivableFeeServiceImpl.java
+++ b/tms/src/main/java/com/ruoyi/tms/service/impl/TmsReceivableFeeServiceImpl.java
@@ -1,15 +1,33 @@
 package com.ruoyi.tms.service.impl;
 
+import java.io.File;
+import java.io.FileOutputStream;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.enums.SystemDataNoEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.DateUtils;
+
+import com.ruoyi.common.utils.file.DownloadExportUtil;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.config.RuoYiConfig;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.streaming.SXSSFSheet;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.apache.poi.xssf.usermodel.XSSFColor;
 import javax.annotation.Resource;
 
 import com.ruoyi.common.utils.SecurityUtils;
@@ -18,11 +36,21 @@
 import com.ruoyi.tms.domain.*;
 import com.ruoyi.tms.mapper.*;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.core.task.AsyncTaskExecutor;
+import org.springframework.core.task.SimpleAsyncTaskExecutor;
+import org.springframework.web.client.RestTemplate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import com.alibaba.fastjson2.JSON;
 import com.ruoyi.common.utils.PageUtils;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.annotation.DataSource;
@@ -57,7 +85,14 @@
     private TmsArBillMapper tmsArBillMapper;
     @Resource
     private TmsArBillItemMapper tmsArBillItemMapper;
+    
+    @Autowired
+    private RestTemplate restTemplate;
+    @Value("${custom.cwxtApi.url}")
+    private String url;
 
+    @Autowired
+    private RedisCache redisCache;
     /**
      * 鏌ヨ搴旀敹璐圭敤
      *
@@ -74,6 +109,24 @@
         }});
         tmsReceivableFee.setItems(tmsReceivableFeeItems);
         return tmsReceivableFee;
+    }
+
+
+    @Override
+    public TmsReceivableFee selectTmsReceivableFeeByDispatchNo(String dispatchNo) {
+        TmsReceivableFee tmsReceivableFee = tmsReceivableFeeMapper.selectOne(new LambdaUpdateWrapper<TmsReceivableFee>()
+                .eq(TmsReceivableFee::getDispatchNo, dispatchNo)
+                .ne(TmsReceivableFee::getStatus, 2)
+                .last("limit 1")
+        );
+        if(tmsReceivableFee != null){
+            List<TmsReceivableFeeItem> tmsReceivableFeeItems = tmsReceivableFeeItemMapper.selectTmsReceivableFeeItemList(new TmsReceivableFeeItem() {{
+                setHeadId(tmsReceivableFee.getId());
+            }});
+            tmsReceivableFee.setItems(tmsReceivableFeeItems);
+            return tmsReceivableFee;
+        }
+        return null;
     }
 
     /**
@@ -119,6 +172,16 @@
             return selectTmsReceivableFeeList(tmsReceivableFee);
         });
     }
+
+
+
+
+
+
+
+
+
+
 
 
     /**
@@ -239,7 +302,10 @@
 
         tmsArBill.setSettleAmount(BigDecimal.ZERO);
         tmsReceivableFees.forEach(item ->{
-
+            List<TmsReceivableFeeItem> tmsReceivableFeeItems = tmsReceivableFeeItemMapper.selectTmsReceivableFeeItemList(new TmsReceivableFeeItem() {{
+                setHeadId(item.getId());
+            }});
+            item.setItems(tmsReceivableFeeItems);
             BigDecimal rmbAmount = item.getReceivableHKBAmount()
                     .multiply(exchangeRate)
                     .setScale(2, RoundingMode.HALF_UP);
@@ -248,6 +314,7 @@
 
         });
         tmsArBill.setTmsReceivableFees(tmsReceivableFees);
+        tmsArBill.setActualSettlementAmount(tmsArBill.getSettleAmount());
 
 
         return tmsArBill;
@@ -263,11 +330,14 @@
         tmsArBill.setSettledAmount(BigDecimal.ZERO);
         tmsArBill.setInvoiceStatus(0);
         tmsArBill.setStatus(0);
+        tmsArBill.setPushStatus(0); // 鍒濆鎺ㄩ�佺姸鎬侊細鏈帹閫�
         tmsArBill.setCreateBy(SecurityUtils.getUsername());
         tmsArBillMapper.insertTmsArBill(tmsArBill);
 
         tmsReceivableFeeMapper.update(new LambdaUpdateWrapper<TmsReceivableFee>()
                 .set(TmsReceivableFee::getStatus,1)
+                        .set( TmsReceivableFee::getBillRelationId,tmsArBill.getId())
+                 .set(TmsReceivableFee::getBillRelationNo ,tmsArBill.getSystemNo())
                 .in(TmsReceivableFee::getId, ids)
         );
 
@@ -287,8 +357,149 @@
             return billItem;
         }).collect(Collectors.toList());
         tmsArBillItemMapper.insertTmsArBillItemBatch(rmb);
+
+        // 鍚戝閮ㄧ郴缁熸帹閫佹暟鎹�
+        AsyncTaskExecutor executor = new SimpleAsyncTaskExecutor();
+        executor.execute(() -> pushToExternalSystem(tmsArBill, tmsReceivableFees));
+        
         return AjaxResult.success();
     }
+    
+    /**
+     * 鍚戝閮ㄧ郴缁熸帹閫佹暟鎹�
+     * @param tmsArBill 搴旀敹璐﹀崟
+     * @param tmsReceivableFees 搴旀敹璐圭敤鍒楄〃
+     */
+    @Async
+    protected void pushToExternalSystem(TmsArBill tmsArBill, List<TmsReceivableFee> tmsReceivableFees) {
+        java.util.Map<String, Object> requestBody = new java.util.HashMap<>();
+        try {
+            // 鏋勫缓璇锋眰浣�
+            String apiUrl = url+"/addBill";
+            
+            // 鏋勫缓bill閮ㄥ垎
+            java.util.Map<String, Object> billMap = new java.util.HashMap<>();
+            billMap.put("billName", tmsArBill.getBillName());
+            billMap.put("customerName", tmsArBill.getCustomerName());
+            billMap.put("payee", "");
+            billMap.put("responsiblePerson", "");
+            billMap.put("responsibleLeader", "");
+            billMap.put("settlementMethod", "");
+            billMap.put("businessType", "");
+            billMap.put("promotionRequirement", "");
+            billMap.put("isInternalSettlement", "0");
+            billMap.put("internalSettlementUnit", "");
+            billMap.put("documentCount", tmsReceivableFees.size());
+            billMap.put("totalAmount", tmsArBill.getSettleAmount());
+            billMap.put("currency", "RMB");
+            billMap.put("discountAmount", 0.00);
+            billMap.put("receivedAmount", 0.00);
+            billMap.put("pendingAmount", tmsArBill.getSettleAmount());
+            billMap.put("exchangeRate", tmsArBill.getSettleRate());
+            billMap.put("cnyAmount", tmsArBill.getSettleAmount());
+            billMap.put("periodType", "");
+            billMap.put("businessStartDate", "");
+            billMap.put("businessEndDate", "");
+            billMap.put("billingStartDate", "");
+            billMap.put("billingEndDate", "");
+            billMap.put("billGenerateDate", "");
+            billMap.put("billSendDate", "");
+            billMap.put("billDueDate", "");
+            billMap.put("settlementCategory", "");
+            billMap.put("settlementPeriod", "");
+            billMap.put("status", "0");
+            billMap.put("remark", "");
+            
+            // 鏋勫缓fees閮ㄥ垎
+            List<java.util.Map<String, Object>> feesList = new java.util.ArrayList<>();
+            for (int i = 0; i < tmsReceivableFees.size(); i++) {
+                TmsReceivableFee fee = tmsReceivableFees.get(i);
+                java.util.Map<String, Object> feeMap = new java.util.HashMap<>();
+                feeMap.put("serialNumber", String.format("%03d", i + 1));
+                feeMap.put("relatedBillNo", "");
+                feeMap.put("sourceSystem", "TMS");
+                feeMap.put("businessSector", "0");
+                feeMap.put("documentType", "0");
+                feeMap.put("documentNo", fee.getDispatchNo() != null ? fee.getDispatchNo() : "");
+                feeMap.put("isInternalSettlement", "0");
+                feeMap.put("internalSettlementUnit", "");
+                feeMap.put("customerName", tmsArBill.getCustomerName());
+                feeMap.put("projectName", fee.getProjectName() != null ? fee.getProjectName() : "");
+                feeMap.put("businessTime", fee.getDispatchConfirmTime());
+                feeMap.put("receivableConfirmTime", fee.getDispatchConfirmTime());
+                feeMap.put("receivableAmount", fee.getReceivableRMBAmount().add(fee.getReceivableHKBAmount()));
+                // 鏋勫缓receivableAmountStr
+                BigDecimal rmbAmount = fee.getReceivableRMBAmount();
+                BigDecimal hkbAmount = fee.getReceivableHKBAmount();
+                StringBuilder amountStr = new StringBuilder();
+                if (rmbAmount.compareTo(BigDecimal.ZERO) > 0) {
+                    amountStr.append(rmbAmount).append("浜烘皯甯�");
+                }
+                if (hkbAmount.compareTo(BigDecimal.ZERO) > 0) {
+                    if (amountStr.length() > 0) {
+                        amountStr.append(" ");
+                    }
+                    amountStr.append(hkbAmount).append("娓竵");
+                }
+                feeMap.put("receivableAmountStr", amountStr.toString());
+                feeMap.put("status", "1");
+                feeMap.put("remark", "");
+                
+                // 鏋勫缓feeDetails閮ㄥ垎
+                List<java.util.Map<String, Object>> feeDetailsList = new java.util.ArrayList<>();
+                List<TmsReceivableFeeItem> items = fee.getItems();
+                for (int j = 0; j < items.size(); j++) {
+                    TmsReceivableFeeItem item = items.get(j);
+                    java.util.Map<String, Object> feeDetailMap = new java.util.HashMap<>();
+                    feeDetailMap.put("serialNumber", String.format("%03d", j + 1));
+                    feeDetailMap.put("feeType", item.getFeeType());
+                    feeDetailMap.put("feeName", item.getFeeName());
+                    feeDetailMap.put("billingUnit", "娆�");
+                    feeDetailMap.put("unitPrice", item.getRegisterAmount());
+                    feeDetailMap.put("billingQuantity", item.getRegisterAmount());
+                    feeDetailMap.put("billingAmount", item.getRegisterAmount());
+                    feeDetailMap.put("actualAmount", item.getRegisterAmount());
+                    feeDetailMap.put("currency", item.getCurrency());
+                    feeDetailMap.put("feeRegTime", item.getRegisterTime());
+                    feeDetailMap.put("remark", "");
+                    feeDetailsList.add(feeDetailMap);
+                }
+
+
+                feeMap.put("feeDetails", feeDetailsList);
+                feesList.add(feeMap);
+            }
+            
+            // 鏋勫缓瀹屾暣璇锋眰浣�
+            requestBody.put("bill", billMap);
+            requestBody.put("fees", feesList);
+            
+            // 璁剧疆HTTP澶�
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            HttpEntity<String> entity = new HttpEntity<>(JSON.toJSONString(requestBody), headers);
+            
+            // 鍙戦�丄PI璇锋眰
+            ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.POST, entity, String.class);
+            logger.info("鎺ㄩ�佹暟鎹埌澶栭儴绯荤粺鎴愬姛锛屽搷搴�: {}", response.getBody());
+            
+            // 鏇存柊鎺ㄩ�佺姸鎬佷负鎴愬姛
+            tmsArBill.setPushStatus(2);
+            tmsArBill.setPushTime(DateUtils.getNowDate());
+            tmsArBill.setPushFailReason(null);
+            tmsArBillMapper.updateTmsArBill(tmsArBill);
+        } catch (Exception e) {
+            logger.error("鎺ㄩ�佹暟鎹埌澶栭儴绯荤粺澶辫触锛岃处鍗旾D: {}, 瀹㈡埛: {}", 
+                tmsArBill.getId(), tmsArBill.getCustomerName(), e);
+            logger.debug("鎺ㄩ�佸け璐ョ殑璇锋眰鏁版嵁: {}", JSON.toJSONString(requestBody));
+            
+            // 鏇存柊鎺ㄩ�佺姸鎬佷负澶辫触
+            tmsArBill.setPushStatus(3);
+            tmsArBill.setPushTime(DateUtils.getNowDate());
+            tmsArBill.setPushFailReason(e.getMessage());
+            tmsArBillMapper.updateTmsArBill(tmsArBill);
+        }
+    }
 
     /**
      * 鍒犻櫎搴旀敹璐圭敤淇℃伅

--
Gitblit v1.8.0