package com.ruoyi.order.controller; 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.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.TOrderInvoiceVO; import com.ruoyi.order.export.*; import com.ruoyi.order.service.*; 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; /** *

* 前端控制器 *

* * @author xiaochen * @since 2024-08-07 */ @Api(tags = "充电算帐单") @RestController @RequestMapping("/chargingBill") public class ChargingBillController { @Resource private TChargingBillService chargingBillService; @Resource private SiteClient siteClient; @Resource private TChargingOrderService chargingOrderService; @Resource private TChargingOrderRefundService tChargingOrderRefundService; @Resource private TChargingBillService tChargingBillService; @GetMapping(value = "/test") public R accountAdd() { // List list = tChargingBillService.lambdaQuery().list(); // for (TChargingBill tChargingBill : list) { // tChargingBill.setStatus(2); // } // tChargingBillService.updateBatchById(list); // List list = chargingOrderService.lambdaQuery().list(); // for (TChargingOrder chargingOrder : list) { // chargingOrder.setSharingAmount(new BigDecimal("0")); // List 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 accountBillList(@RequestBody ChargingListQuery dto) { AccountListVO accountListVO = new AccountListVO(); ChargingBillVO res = chargingBillService.chargingBillList1(dto); List records = res.getList().getRecords(); accountListVO.setBillCount(records.size()); accountListVO.setTotalAmount(res.getPaymentAmount().subtract(res.getRefundAmount()).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 chargingBillList(@RequestBody ChargingListQuery dto) { ChargingBillVO res = chargingBillService.chargingBillList(dto); return AjaxResult.success(res); } @PostMapping(value = "/chargingBillListR") public R chargingBillListR(@RequestBody ChargingListQuery dto) { ChargingBillVO res = chargingBillService.chargingBillList(dto); return R.ok(res); } @GetMapping(value = "/chargingBillListExport") public R 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) { ChargingBillVO res = chargingBillService.chargingBillList(dto); List list = res.getList().getRecords(); List 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 list = res.getList().getRecords(); List 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 chargingBillExports = new ArrayList<>(); List chargingBillRefundExports = new ArrayList<>(); List 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 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 eq = new QueryWrapper() .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 tChargingOrders = chargingOrderService.list(eq); // 累加支付金额 BigDecimal bigDecimal = new BigDecimal("0"); BigDecimal bigDecimal1 = new BigDecimal("0.006"); int i =1; for (TChargingOrder tChargingOrder : tChargingOrders) { // 账单信息 paymentAmount = paymentAmount.add(tChargingOrder.getRechargeAmount()); commissionAmount = commissionAmount.add(tChargingOrder.getPaymentAmount().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 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 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).subtract(commissionAmount) .subtract(sharingAmount).setScale(2, BigDecimal.ROUND_DOWN)); chargingBillExports.add(chargingBillExport); // 导出 List> sheetsList = new ArrayList<>(); for (int i1 = 1; i1 <= 3; i1++) { String sheetName=""; switch (i1){ case 1: sheetName= "账单信息"; Map 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 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 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 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(); } } } }