Pu Zhibing
2025-05-15 7a4f9541331bef779a506b38a27ed5c3373c0bec
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java
@@ -1,29 +1,52 @@
package com.ruoyi.order.controller;
import com.ruoyi.account.api.feignClient.AppUserCarClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.alibaba.nacos.shaded.com.google.common.collect.Maps;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.WebUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.security.annotation.Logical;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.query.TOrderInvoiceQuery;
import com.ruoyi.order.api.vo.AccountListVO;
import com.ruoyi.order.api.vo.ChargingBillListVO;
import com.ruoyi.order.api.vo.ChargingBillVO;
import com.ruoyi.order.api.vo.ChargingOrderTimeVO;
import com.ruoyi.order.dto.ChargingBillQuery;
import com.ruoyi.order.dto.ChargingListQuery;
import com.ruoyi.order.api.vo.TOrderInvoiceVO;
import com.ruoyi.order.export.*;
import com.ruoyi.order.service.*;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
 * <p>
@@ -39,53 +62,489 @@
public class ChargingBillController {
    @Resource
    private TChargingOrderService chargingOrderService;
    @Autowired
    private TokenService tokenService;
    @Autowired
    private TOrderEvaluateService orderEvaluateService;
    @Resource
    private WxPaymentClient wxPaymentClient;
    @Resource
    private RedisService redisService;
    @Resource
    private AliPaymentClient aliPaymentClient;
    @Resource
    private TShoppingOrderService shoppingOrderService;
    @Resource
    private AppUserClient appUserClient;
    @Resource
    private TVipOrderService vipOrderService;
    @Resource
    private ParkingLotClient parkingLotClient;
    @Resource
    private TChargingOrderRefundService chargingOrderRefundService;
    @Resource
    private TShoppingOrderRefundService shoppingOrderRefundService;
    @Resource
    private TVipOrderRefundService vipOrderRefundService;
    private TChargingBillService chargingBillService;
    @Resource
    private SiteClient siteClient;
    @Resource
    private ChargingPileClient chargingPileClient;
    private TChargingOrderService chargingOrderService;
    @Resource
    private ChargingGunClient chargingGunClient;
    private TChargingOrderRefundService tChargingOrderRefundService;
    @Resource
    private AppUserCarClient appUserCarClient;
    @Resource
    private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
    @ResponseBody
    @PostMapping(value = "/chargingList")
    private TChargingBillService tChargingBillService;
    @GetMapping(value = "/test")
    public R accountAdd() {
//        List<TChargingBill> list = tChargingBillService.lambdaQuery().list();
//        for (TChargingBill tChargingBill : list) {
//            tChargingBill.setStatus(2);
//        }
//        tChargingBillService.updateBatchById(list);
//        List<TChargingOrder> list = chargingOrderService.lambdaQuery().list();
//        for (TChargingOrder chargingOrder : list) {
//            chargingOrder.setSharingAmount(new BigDecimal("0"));
//            List<TChargingOrderRefund> list1 = tChargingOrderRefundService.lambdaQuery().eq(TChargingOrderRefund::getChargingOrderId, chargingOrder.getId()).list();
//            tChargingOrderRefundService.removeBatchByIds(list1);
//            chargingOrderService.removeById(chargingOrder);
//        }
//        chargingOrderService.updateBatchById(list);
//        TChargingBill tChargingBill = new TChargingBill();
//        Random random = new Random();
//        String randomDigits = random.ints(10, 0, 10) // 生成10个随机数字,范围在0-9
//                .mapToObj(String::valueOf)
//                .collect(Collectors.joining()); // 将其连接成一个字符串
//        tChargingBill.setCode("JSD"+randomDigits );
//        tChargingBill.setType(1);
//        tChargingBill.setSiteId(0);
//        tChargingBill.setBillTime(LocalDateTime.now().plusDays(1));
//        tChargingBill.setStatus(1);
//        tChargingBill.setOrderState(2);
//        tChargingBill.setBillType(1);
//        chargingBillService.save(tChargingBill);
//        TChargingBill tChargingBill1 = new TChargingBill();
//        Random random1 = new Random();
//        String randomDigits1 = random1.ints(10, 0, 10) // 生成10个随机数字,范围在0-9
//                .mapToObj(String::valueOf)
//                .collect(Collectors.joining()); // 将其连接成一个字符串
//        tChargingBill1.setCode("JSD"+randomDigits1);
//        tChargingBill1.setType(2);
//        tChargingBill1.setSiteId(13);
//        tChargingBill1.setBillTime(LocalDateTime.now().plusDays(1));
//        tChargingBill1.setStatus(1);
//        tChargingBill1.setOrderState(2);
//        tChargingBill1.setBillType(1);
//        chargingBillService.save(tChargingBill1);
//
//        TChargingBill tChargingBil3 = new TChargingBill();
//        Random random2 = new Random();
//        String randomDigits2 = random2.ints(10, 0, 10) // 生成10个随机数字,范围在0-9
//                .mapToObj(String::valueOf)
//                .collect(Collectors.joining()); // 将其连接成一个字符串
//        tChargingBil3.setCode("JSD"+randomDigits2 );
//        tChargingBil3.setType(1);
//        tChargingBil3.setSiteId(0);
//        tChargingBil3.setBillTime(LocalDateTime.now().plusDays(1));
//        tChargingBil3.setStatus(1);
//        tChargingBil3.setOrderState(2);
//        tChargingBil3.setBillType(2);
//        chargingBillService.save(tChargingBil3);
//        TChargingBill tChargingBill14 = new TChargingBill();
//        Random random3 = new Random();
//        String randomDigits3 = random3.ints(10, 0, 10) // 生成10个随机数字,范围在0-9
//                .mapToObj(String::valueOf)
//                .collect(Collectors.joining()); // 将其连接成一个字符串
//        tChargingBill14.setCode("JSD"+randomDigits3);
//        tChargingBill14.setType(2);
//        tChargingBill14.setSiteId(13);
//        tChargingBill14.setBillTime(LocalDateTime.now().plusDays(1));
//        tChargingBill14.setStatus(1);
//        tChargingBill14.setOrderState(2);
//        tChargingBill14.setBillType(2);
//        chargingBillService.save(tChargingBill14);
        return R.ok();
    }
    @RequiresPermissions(value = {"/accountSettlementStatement"}, logical = Logical.OR)
    @PostMapping(value = "/accountBillList")
    @ApiOperation(value = "列表查询", tags = {"管理后台-账户结算账单"})
    public R<AccountListVO> accountBillList(@RequestBody ChargingListQuery dto) {
        AccountListVO accountListVO = new AccountListVO();
        ChargingBillVO res = chargingBillService.chargingBillList1(dto);
        List<ChargingBillListVO> records = res.getList().getRecords();
        accountListVO.setBillCount(records.size());
        accountListVO.setTotalAmount(res.getPaymentAmount().subtract(res.getCommissionAmount()).subtract(res.getSharingAmount()).setScale(2, BigDecimal.ROUND_DOWN));
        accountListVO.setPaymentAmount(res.getPaymentAmount().setScale(2, BigDecimal.ROUND_DOWN));
        accountListVO.setRefundAmount(res.getRefundAmount().setScale(2, BigDecimal.ROUND_DOWN));
        accountListVO.setCommissionAmount(res.getCommissionAmount().setScale(2, BigDecimal.ROUND_DOWN));
        accountListVO.setSharingAmount(res.getSharingAmount().setScale(2, BigDecimal.ROUND_DOWN));
        accountListVO.setList(res.getList());
        accountListVO.setOrderList(res.getExportList());
        return R.ok(accountListVO);
    }
    @RequiresPermissions(value = {"/chargeBill"}, logical = Logical.OR)
    @PostMapping(value = "/chargingBillList")
    @ApiOperation(value = "充电算帐单列表查询", tags = {"管理后台-充电算账单"})
    public AjaxResult<ChargingBillVO> chargingList(@RequestBody ChargingListQuery dto) {
    public AjaxResult<ChargingBillVO> chargingBillList(@RequestBody ChargingListQuery dto) {
        ChargingBillVO res = chargingBillService.chargingBillList(dto);
        return AjaxResult.success(res);
    }
    @PostMapping(value = "/chargingBillListR")
    public R<ChargingBillVO> chargingBillListR(@RequestBody ChargingListQuery dto) {
        ChargingBillVO res = chargingBillService.chargingBillList(dto);
        return R.ok(res);
    }
    @GetMapping(value = "/chargingBillListExport")
    public R<ChargingBillVO> chargingBillListExport(String uid) {
        return R.ok(null);
    }
    @RequiresPermissions(value = {"/chargeBill/export"}, logical = Logical.OR)
    @ApiOperation(value = "导出", tags = {"管理后台-充电算账单"})
    @PutMapping("/export")
    public void export(@RequestBody ChargingListQuery dto)
    {
        return AjaxResult.success(null);
        ChargingBillVO res = chargingBillService.chargingBillList(dto);
        List<ChargingBillListVO> list = res.getList().getRecords();
        List<TChargingBillExport> tChargingBillExports = new ArrayList<>();
        for (ChargingBillListVO orderInvoiceVO : list) {
            TChargingBillExport tChargingBillExport = new TChargingBillExport();
            tChargingBillExport.setCode(orderInvoiceVO.getCode());
            tChargingBillExport.setBillType("月账单");
            tChargingBillExport.setType(orderInvoiceVO.getType().toString());
            tChargingBillExport.setBillWeek(orderInvoiceVO.getBillWeek());
            tChargingBillExport.setSiteName(orderInvoiceVO.getSiteName());
            tChargingBillExport.setPaymentAmount(orderInvoiceVO.getPaymentAmount());
            tChargingBillExport.setElectrovalence(orderInvoiceVO.getElectrovalence());
            tChargingBillExport.setServiceCharge(orderInvoiceVO.getServiceCharge());
            tChargingBillExport.setChargingCapacity(orderInvoiceVO.getChargingCapacity());
            Integer chargingSecond = orderInvoiceVO.getChargingSecond();
            // 根据秒数 转换为xx小时xx分钟xx秒 如果小时为0不展示 如果分钟为0则不展示
            // 计算小时、分钟和秒
            int hours = chargingSecond / 60 / 60;
            int minutes = chargingSecond /60 % 60;
            int seconds = 0; // 如果没有秒数,则默认是0
            // 构造结果字符串
            StringBuilder result = new StringBuilder();
            if (hours > 0) {
                result.append(hours).append("小时");
            }
            if (minutes > 0) {
                result.append(minutes).append("分钟");
            }
            if (seconds > 0 || result.length() == 0) { // 如果秒数大于0,或者小时和分钟都为0,则显示秒数
                result.append(seconds).append("秒");
            }
            tChargingBillExport.setChargingTime(result.toString());
            tChargingBillExport.setOrderCount(orderInvoiceVO.getOrderCount());
            tChargingBillExport.setBillTime(orderInvoiceVO.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            tChargingBillExports.add(tChargingBillExport);
        }
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TChargingBillExport.class, tChargingBillExports);
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("月账单-"+res.getCategory()+"-"+res.getBillWeek()+"-"+res.getSiteName()+".xls", "utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @RequiresPermissions(value = {"/accountSettlementStatement/export"}, logical = Logical.OR)
    @ApiOperation(value = "导出", tags = {"管理后台-账户结算账单"})
    @PutMapping("/exportAccount")
    public void exportAccount(@RequestBody ChargingListQuery dto)
    {
        ChargingBillVO res = chargingBillService.chargingBillList1(dto);
        List<ChargingBillListVO> list = res.getList().getRecords();
        List<TChargingBillExport> tChargingBillExports = new ArrayList<>();
        for (ChargingBillListVO orderInvoiceVO : list) {
            TChargingBillExport tChargingBillExport = new TChargingBillExport();
            tChargingBillExport.setCode(orderInvoiceVO.getCode());
            switch (orderInvoiceVO.getOrderState()){
                case 1:
                    tChargingBillExport.setBillType("日账单");
                    break;
                case 2:
                    tChargingBillExport.setBillType("月账单");
                    break;
            }
            tChargingBillExport.setType(orderInvoiceVO.getType().toString());
            tChargingBillExport.setBillWeek(orderInvoiceVO.getBillWeek());
            tChargingBillExport.setSiteName(orderInvoiceVO.getSiteName());
            tChargingBillExport.setPaymentAmount(orderInvoiceVO.getPaymentAmount());
            tChargingBillExport.setElectrovalence(orderInvoiceVO.getElectrovalence());
            tChargingBillExport.setServiceCharge(orderInvoiceVO.getServiceCharge());
            tChargingBillExport.setChargingCapacity(orderInvoiceVO.getChargingCapacity());
            Integer chargingSecond = orderInvoiceVO.getChargingSecond();
            // 根据秒数 转换为xx小时xx分钟xx秒 如果小时为0不展示 如果分钟为0则不展示
            // 计算小时、分钟和秒
            int hours = chargingSecond / 60 / 60;
            int minutes = chargingSecond /60 % 60;
            int seconds = 0; // 如果没有秒数,则默认是0
            // 构造结果字符串
            StringBuilder result = new StringBuilder();
            if (hours > 0) {
                result.append(hours).append("小时");
            }
            if (minutes > 0) {
                result.append(minutes).append("分钟");
            }
            if (seconds > 0 || result.length() == 0) { // 如果秒数大于0,或者小时和分钟都为0,则显示秒数
                result.append(seconds).append("秒");
            }
            tChargingBillExport.setChargingTime(result.toString());
            tChargingBillExport.setOrderCount(orderInvoiceVO.getOrderCount());
            tChargingBillExport.setBillTime(orderInvoiceVO.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            tChargingBillExports.add(tChargingBillExport);
        }
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TChargingBillExport.class, tChargingBillExports);
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("月账单-"+res.getCategory()+"-"+res.getBillWeek()+"-"+res.getSiteName()+".xls", "utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @ApiOperation(value = "下载-未出账", tags = {"管理后台-充电算账单"})
    @PutMapping("/download")
    public void download(@RequestBody ExportUidDto uid)
    {
        List<ChargingBillExport> chargingBillExports = new ArrayList<>();
        List<ChargingBillRefundExport> chargingBillRefundExports = new ArrayList<>();
        List<ChargingBillPayExport> chargingBillPayExports = new ArrayList<>();
        TChargingBill byId = chargingBillService.getById(uid.getUid());
        ChargingBillExport chargingBillExport = new ChargingBillExport();
        chargingBillExport.setCode(byId.getCode());
        chargingBillExport.setAccountType("微信商户");
        chargingBillExport.setType(byId.getType().toString());
        LocalDateTime billTime = byId.getBillTime();
        // 将billTime 减去一个月 转化为yyyy-MM格式字符串
        billTime = billTime.minusMonths(1);
        chargingBillExport.setBillWeek(DateUtils.parseDateToStr("yyyy-MM",DateUtils.toDate(billTime)));
        chargingBillExport.setBillTime(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",DateUtils.toDate(billTime)));
        List<Site> data = siteClient.getSiteByIds(Arrays.asList(byId.getSiteId())).getData();
        if (!data.isEmpty()){
            chargingBillExport.setSiteName(data.get(0).getName());
        }
//        // 根据账单的出账时间 查询上个月的充电订单
        LocalDateTime localDate = byId.getBillTime().minusMonths(1);
//        // 账单周期
//        // 获取 LocalDate 对象
//        LocalDate date = localDate.toLocalDate();
//        // 获取该月份的第一天
//        LocalDate firstDayOfMonth = date.withDayOfMonth(1);
        // 获取 LocalDate 对象
        LocalDate date = localDate.toLocalDate();
            // 获取该月份的第一天
            LocalDate firstDayOfMonth = date.withDayOfMonth(1);
            // 获取该月份的最后一天
            LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
        // 获取该月份的最后一天
//        LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
        QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
                .between("create_time", firstDayOfMonth, lastDayOfMonth)
                .eq("status", 5)
                .eq("recharge_payment_status", 2);
        if (byId.getType() == 2) {
            eq.eq("site_id", byId.getSiteId());
        }
        BigDecimal paymentAmount = new BigDecimal("0");
        BigDecimal refundAmount = new BigDecimal("0");
        BigDecimal commissionAmount = new BigDecimal("0");
        BigDecimal sharingAmount = new BigDecimal("0");
        List<TChargingOrder> tChargingOrders = chargingOrderService.list(eq);
        // 累加支付金额
        BigDecimal bigDecimal = new BigDecimal("0");
        BigDecimal bigDecimal1 = new BigDecimal("0.006");
        int i =1;
        for (TChargingOrder tChargingOrder : tChargingOrders) {
            // 账单信息
            if (!tChargingOrder.getOrderSource().equals(2)){
                chargingBillExport.setPaymentAmount(tChargingOrder.getRechargeAmount());
                paymentAmount = paymentAmount.add(tChargingOrder.getRechargeAmount());
            }else{
                chargingBillExport.setPaymentAmount(tChargingOrder.getServiceCharge()!=null?
                        tChargingOrder.getServiceCharge().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_DOWN)
                        :new BigDecimal("0"));
                paymentAmount = paymentAmount.add(tChargingOrder.getServiceCharge()!=null?
                        tChargingOrder.getServiceCharge().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_DOWN)
                        :new BigDecimal("0"));
            }
            commissionAmount = commissionAmount.add(tChargingOrder.getRechargeAmount().multiply(bigDecimal1).setScale(2, BigDecimal.ROUND_DOWN));
            sharingAmount = sharingAmount.add(tChargingOrder.getSharingAmount()!=null?tChargingOrder.getSharingAmount():new BigDecimal("0"));
            // 退款信息
            ChargingBillRefundExport chargingBillRefundExport = new ChargingBillRefundExport();
            ChargingBillPayExport chargingBillPayExport = new ChargingBillPayExport();
            chargingBillRefundExport.setId(i+"");
            switch (tChargingOrder.getRechargePaymentType()){
                case 1:
                    chargingBillRefundExport.setPlatform("微信");
                    chargingBillRefundExport.setPlatformPay("微信小程序支付");
                    chargingBillPayExport.setPlatform("微信");
                    chargingBillPayExport.setPlatformPay("微信小程序支付");
                    break;
                case 2:
                    chargingBillRefundExport.setPlatform("支付宝");
                    chargingBillRefundExport.setPlatformPay("支付宝小程序支付");
                    chargingBillPayExport.setPlatform("支付宝");
                    chargingBillPayExport.setPlatformPay("支付宝小程序支付");
            }
            List<TChargingOrderRefund> one1 = tChargingOrderRefundService.lambdaQuery()
                    .eq(TChargingOrderRefund::getChargingOrderId, tChargingOrder.getId())
                    .eq(TChargingOrderRefund::getRefundStatus, 2)
                    .list();
            for (TChargingOrderRefund one : one1) {
                refundAmount= refundAmount.add(one.getRefundAmount());
                chargingBillRefundExport.setRechargeSerialNumber(tChargingOrder.getRechargeSerialNumber());
                chargingBillRefundExport.setCode(tChargingOrder.getCode());
                chargingBillRefundExport.setPayTime(tChargingOrder.getCreateTime()!=null?DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",DateUtils.toDate(tChargingOrder.getCreateTime())):"");
                if (one.getRefundTime()!=null){
                    chargingBillRefundExport.setRefundTime(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",DateUtils.toDate(one.getRefundTime())));
                }
                chargingBillRefundExport.setRefundMoney(one.getRefundAmount().toString());
                chargingBillRefundExport.setRefundRemark(one.getRefundReason());
                chargingBillRefundExport.setRefundCode(one.getRefundCode());
                chargingBillRefundExport.setRefundSerialNumber(one.getRefundSerialNumber());
                chargingBillRefundExports.add(chargingBillRefundExport);
            }
            // 支付信息
            chargingBillPayExport.setId(i+"");
            chargingBillPayExport.setRechargeSerialNumber(tChargingOrder.getRechargeSerialNumber());
            chargingBillPayExport.setCode(tChargingOrder.getCode());
            chargingBillPayExport.setPayTime(tChargingOrder.getPayTime()!=null?DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",DateUtils.toDate(tChargingOrder.getPayTime())):"");
            chargingBillPayExport.setPaymentAmount(tChargingOrder.getRechargeAmount().toString());
            chargingBillPayExport.setTotal("");
            chargingBillPayExports.add(chargingBillPayExport);
            i++;
            bigDecimal = bigDecimal.add(tChargingOrder.getRechargeAmount());
        }
        if (!chargingBillPayExports.isEmpty()){
            chargingBillPayExports.get(0).setTotal(bigDecimal+"");
        }
        if (byId.getSiteId()==0){
            chargingBillExport.setSiteName("全站");
        }else{
            List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(byId.getSiteId())).getData();
            if (data1!=null&&(!data1.isEmpty())){
                String name = data1.get(0).getName();
                chargingBillExport.setSiteName(name);
            }
        }
        chargingBillExport.setPaymentAmount(paymentAmount);
        chargingBillExport.setRefundAmount(refundAmount);
        chargingBillExport.setIncome(paymentAmount.subtract(refundAmount)
                .setScale(2, BigDecimal.ROUND_DOWN));
        chargingBillExports.add(chargingBillExport);
        // 导出
        List<Map<String, Object>> sheetsList = new ArrayList<>();
        for (int i1 = 1; i1 <= 3; i1++) {
            String sheetName="";
            switch (i1){
                case 1:
                    sheetName= "账单信息";
                    Map<String, Object> exportMap = Maps.newHashMap();
                    ExportParams exportParams = new ExportParams(null, sheetName, ExcelType.HSSF);
                    // 以下3个参数为API中写死的参数名 分别是sheet配置/导出类(注解定义)/数据集
                    exportMap.put("title", exportParams);
                    exportMap.put("entity", ChargingBillExport.class);
                    exportMap.put("data", chargingBillExports);
                    // 加入多sheet配置列表
                    sheetsList.add(exportMap);
                    break;
                case 2:
                    sheetName= "退款订单";
                    Map<String, Object> exportMap1 = Maps.newHashMap();
                    ExportParams exportParams1 = new ExportParams(null, sheetName, ExcelType.HSSF);
                    // 以下3个参数为API中写死的参数名 分别是sheet配置/导出类(注解定义)/数据集
                    exportMap1.put("title", exportParams1);
                    exportMap1.put("entity", ChargingBillRefundExport.class);
                    exportMap1.put("data", chargingBillRefundExports);
                    // 加入多sheet配置列表
                    sheetsList.add(exportMap1);
                    break;
                case 3:
                    sheetName= "支付记录";
                    Map<String, Object> exportMap2 = Maps.newHashMap();
                    ExportParams exportParams2 = new ExportParams(null, sheetName, ExcelType.HSSF);
                    // 以下3个参数为API中写死的参数名 分别是sheet配置/导出类(注解定义)/数据集
                    exportMap2.put("title", exportParams2);
                    exportMap2.put("entity", ChargingBillPayExport.class);
                    exportMap2.put("data", chargingBillPayExports);
                    // 加入多sheet配置列表
                    sheetsList.add(exportMap2);
                    break;
            }
        }
        if (!chargingBillRefundExports.isEmpty()){
            ChargingBillRefundExport chargingBillRefundExport = chargingBillRefundExports.get(0);
            chargingBillRefundExport.setTotal(refundAmount.toString());
        }
        if (!chargingBillPayExports.isEmpty()){
            ChargingBillPayExport chargingBillPayExport = chargingBillPayExports.get(0);
            chargingBillPayExport.setTotal(refundAmount.toString());
        }
        String type="";
        String type1="";
        switch (byId.getType()){
            case 1:
                type = "全站账单";
                type1 = "全站";
                break;
            case 2:
                type = "各个站点账单";
                List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(byId.getSiteId())).getData();
                if (!data1.isEmpty()){
                    type1 = data.get(0).getName();
                }
                break;
        }
        String s = DateUtils.parseDateToStr("yyyy-MM", DateUtils.toDate(billTime));
        Workbook workbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF);
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("账户结算账单-月账单-"+type+"-"+s+"-"+type1+".xls", "utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}