From 846f8e416e86ee5f5f33da0977d605f355bcf75a Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期五, 08 八月 2025 15:15:16 +0800
Subject: [PATCH] 修改bug

---
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/InvoiceServiceImpl.java |  159 +++++++++++++++++++++++++++++++++-------------------
 1 files changed, 100 insertions(+), 59 deletions(-)

diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/InvoiceServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/InvoiceServiceImpl.java
index e0b0e66..4855d4b 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/InvoiceServiceImpl.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/InvoiceServiceImpl.java
@@ -15,14 +15,13 @@
 import com.stylefeng.guns.modular.system.service.IInvoiceService;
 import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
 import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 
 @Service
@@ -54,74 +53,116 @@
     @Override
     public void invoicing(Invoice invoice, String order, Integer uid) throws Exception {
         JSONArray jsonArray = JSON.parseArray(order);
-        BigDecimal sum = new BigDecimal(0);
-        for(int i = 0; i < jsonArray.size(); i++){
+        // 1. 按companyId分组存放订单(key: companyId, value: 该公司的所有订单)
+        Map<Integer, List<JSONObject>> companyOrdersMap = new HashMap<>();
+        for (int i = 0; i < jsonArray.size(); i++) {
             JSONObject jsonObject = jsonArray.getJSONObject(i);
             Integer orderType = jsonObject.getIntValue("type");
             Integer orderId = jsonObject.getIntValue("id");
-            switch (orderType){
-                case 1://专车
-                    OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
-                    sum=sum.add(new BigDecimal(orderPrivateCar.getPayMoney()));
+            Integer companyId = null;
+
+            // 2. 获取每个订单的companyId
+            switch (orderType) {
+                case 1: // 专车
+                    OrderPrivateCar privateCar = orderPrivateCarService.selectById(orderId);
+                    companyId = privateCar.getCompanyId();
                     break;
-                case 2://出租车
-                    OrderTaxi orderTaxi = orderTaxiService.selectById(orderId);
-                    sum=sum.add(new BigDecimal(orderTaxi.getPayMoney()));
+                case 2: // 出租车
+                    OrderTaxi taxi = orderTaxiService.selectById(orderId);
+                    companyId = taxi.getCompanyId();
                     break;
-                case 3://跨城出行
-                    OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId);
-                    sum=sum.add(new BigDecimal(orderCrossCity.getPayMoney()));
+                case 3: // 跨城出行
+                    OrderCrossCity crossCity = orderCrossCityService.selectById(orderId);
+                    companyId = crossCity.getCompanyId();
                     break;
-                case 4://同城小件物流
-                    OrderLogistics orderLogistics = orderLogisticsService.selectById(orderId);
-                    sum=sum.add(new BigDecimal(orderLogistics.getPayMoney()));
-                    break;
-                case 5://跨城小件物流
-                    OrderLogistics orderLogistics1 = orderLogisticsService.selectById(orderId);
-                    sum=sum.add(new BigDecimal(orderLogistics1.getPayMoney()));
+                case 4: // 同城小件物流
+                case 5: // 跨城小件物流
+                    OrderLogistics logistics = orderLogisticsService.selectById(orderId);
+                    companyId = logistics.getCompanyId();
                     break;
             }
+
+            // 3. 将订单按companyId分组
+            if (companyId == null) {
+                throw new Exception("订单ID=" + orderId + "未找到关联公司");
+            }
+            companyOrdersMap.computeIfAbsent(companyId, k -> new ArrayList<>()).add(jsonObject);
         }
+        // 4. 为每个公司单独创建发票
+        for (Map.Entry<Integer, List<JSONObject>> entry : companyOrdersMap.entrySet()) {
+            Integer companyId = entry.getKey();
+            List<JSONObject> companyOrders = entry.getValue();
 
-        invoice.setOrderNum(jsonArray.size());
-        invoice.setMoney(sum.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
-        invoice.setUserId(uid);
-        invoice.setInsertTime(new Date());
-        invoice.setState(1);
-        this.insert(invoice);
-        // TODO: 2020/6/9 调用开发票第三方SDK
+            // 计算该公司订单的总金额
+            BigDecimal sum = new BigDecimal(0);
+            for (JSONObject orderJson : companyOrders) {
+                Integer orderType = orderJson.getIntValue("type");
+                Integer orderId = orderJson.getIntValue("id");
 
+                switch (orderType) {
+                    case 1:
+                        OrderPrivateCar privateCar = orderPrivateCarService.selectById(orderId);
+                        sum = sum.add(new BigDecimal(privateCar.getPayMoney()));
+                        break;
+                    case 2:
+                        OrderTaxi taxi = orderTaxiService.selectById(orderId);
+                        sum = sum.add(new BigDecimal(taxi.getPayMoney()));
+                        break;
+                    case 3:
+                        OrderCrossCity crossCity = orderCrossCityService.selectById(orderId);
+                        sum = sum.add(new BigDecimal(crossCity.getPayMoney()));
+                        break;
+                    case 4:
+                    case 5:
+                        OrderLogistics logistics = orderLogisticsService.selectById(orderId);
+                        sum = sum.add(new BigDecimal(logistics.getPayMoney()));
+                        break;
+                }
+            }
 
-        for(int i = 0; i < jsonArray.size(); i++){
-            JSONObject jsonObject = jsonArray.getJSONObject(i);
-            Integer orderType = jsonObject.getIntValue("type");
-            Integer orderId = jsonObject.getIntValue("id");
-            switch (orderType){
-                case 1://专车
-                    OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
-                    orderPrivateCar.setInvoiceId(invoice.getId());
-                    orderPrivateCarService.updateById(orderPrivateCar);
-                    break;
-                case 2://出租车
-                    OrderTaxi orderTaxi = orderTaxiService.selectById(orderId);
-                    orderTaxi.setInvoiceId(invoice.getId());
-                    orderTaxiService.updateById(orderTaxi);
-                    break;
-                case 3://跨城出行
-                    OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId);
-                    orderCrossCity.setInvoiceId(invoice.getId());
-                    orderCrossCityService.updateById(orderCrossCity);
-                    break;
-                case 4://同城小件物流
-                    OrderLogistics orderLogistics = orderLogisticsService.selectById(orderId);
-                    orderLogistics.setInvoiceId(invoice.getId());
-                    orderLogisticsService.updateById(orderLogistics);
-                    break;
-                case 5://跨城小件物流
-                    OrderLogistics orderLogistics1 = orderLogisticsService.selectById(orderId);
-                    orderLogistics1.setInvoiceId(invoice.getId());
-                    orderLogisticsService.updateById(orderLogistics1);
-                    break;
+            // 创建该公司的发票(复制原invoice的基础信息,覆盖companyId和金额)
+            Invoice companyInvoice = new Invoice();
+            // 复制原发票的非金额相关字段(如发票类型、抬头等)
+            BeanUtils.copyProperties(invoice, companyInvoice, "id", "money", "orderNum", "insertTime", "state", "companyId");
+            companyInvoice.setCompanyId(companyId); // 关联公司ID
+            companyInvoice.setOrderNum(companyOrders.size()); // 该公司的订单数量
+            companyInvoice.setMoney(sum.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); // 该公司的总金额
+            companyInvoice.setUserId(uid);
+            companyInvoice.setInsertTime(new Date());
+            companyInvoice.setState(1);
+            this.insert(companyInvoice); // 保存发票
+
+            // 调用第三方开票SDK(按公司发票单独开票)
+            // TODO: 调用开发票第三方SDK,传入companyInvoice参数
+
+            // 5. 将该公司的订单关联到对应的发票ID
+            for (JSONObject orderJson : companyOrders) {
+                Integer orderType = orderJson.getIntValue("type");
+                Integer orderId = orderJson.getIntValue("id");
+
+                switch (orderType) {
+                    case 1:
+                        OrderPrivateCar privateCar = orderPrivateCarService.selectById(orderId);
+                        privateCar.setInvoiceId(companyInvoice.getId());
+                        orderPrivateCarService.updateById(privateCar);
+                        break;
+                    case 2:
+                        OrderTaxi taxi = orderTaxiService.selectById(orderId);
+                        taxi.setInvoiceId(companyInvoice.getId());
+                        orderTaxiService.updateById(taxi);
+                        break;
+                    case 3:
+                        OrderCrossCity crossCity = orderCrossCityService.selectById(orderId);
+                        crossCity.setInvoiceId(companyInvoice.getId());
+                        orderCrossCityService.updateById(crossCity);
+                        break;
+                    case 4:
+                    case 5:
+                        OrderLogistics logistics = orderLogisticsService.selectById(orderId);
+                        logistics.setInvoiceId(companyInvoice.getId());
+                        orderLogisticsService.updateById(logistics);
+                        break;
+                }
             }
         }
 

--
Gitblit v1.7.1