guyue
2025-08-01 e9771fd8d8c68eb6753ce19726286302a64bbc5f
开票时按照订单的分公司生成不同发票
2个文件已修改
170 ■■■■■ 已修改文件
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Invoice.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/InvoiceServiceImpl.java 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Invoice.java
@@ -84,6 +84,9 @@
    @TableField("insertTime")
    private Date insertTime;
    @TableField("companyId")
    private Integer companyId;
    public Integer getId() {
        return id;
    }
@@ -196,6 +199,13 @@
        this.insertTime = insertTime;
    }
    public Integer getCompanyId() {
        return companyId;
    }
    public void setCompanyId(Integer companyId) {
        this.companyId = companyId;
    }
    @Override
    public String toString() {
        return "Invoice{" +
@@ -213,6 +223,7 @@
                ", userId=" + userId +
                ", state=" + state +
                ", insertTime=" + insertTime +
                ", companyId=" + companyId +
                '}';
    }
}
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;
                }
            }
        }