From f2dff53d76a7e9a23e6a2ecfed58ce978dc41442 Mon Sep 17 00:00:00 2001 From: xuhy <3313886187@qq.com> Date: 星期五, 06 九月 2024 18:22:11 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java | 361 +++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 304 insertions(+), 57 deletions(-) diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java index cfed3a4..d219870 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java @@ -1,29 +1,50 @@ 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.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.order.api.model.TChargingBill; +import com.ruoyi.order.api.model.TChargingOrder; +import com.ruoyi.order.api.query.TOrderInvoiceQuery; +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.model.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.springframework.beans.factory.annotation.Autowired; +import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.BeanUtils; 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.format.DateTimeFormatter; +import java.time.temporal.TemporalAdjusters; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; /** * <p> @@ -39,53 +60,279 @@ 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; - @Resource - private ChargingGunClient chargingGunClient; - @Resource - private AppUserCarClient appUserCarClient; - @Resource - private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; - @ResponseBody - @PostMapping(value = "/chargingList") - @ApiOperation(value = "充电算帐单列表查询", tags = {"管理后台-充电算账单"}) - public AjaxResult<ChargingBillVO> chargingList(@RequestBody ChargingListQuery dto) { + private TChargingOrderService chargingOrderService; - return AjaxResult.success(null); + + @PostMapping(value = "/chargingBillList") + @ApiOperation(value = "充电算帐单列表查询", tags = {"管理后台-充电算账单"}) + 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); + } + @ApiOperation(value = "导出", tags = {"管理后台-充电算账单"}) + @PostMapping("/export") + public void export(@RequestBody ChargingListQuery dto) + { + 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(); + } + } + } + @ApiOperation(value = "下载-未出账", tags = {"管理后台-充电算账单"}) + @GetMapping("/download") + public void download(String uid) + { + List<ChargingBillExport> chargingBillExports = new ArrayList<>(); + List<ChargingBillRefundExport> chargingBillRefundExports = new ArrayList<>(); + List<ChargingBillPayExport> chargingBillPayExports = new ArrayList<>(); + TChargingBill byId = chargingBillService.getById(uid); + ChargingBillExport chargingBillExport = new ChargingBillExport(); + chargingBillExport.setCode(byId.getCode()); + // todo 确认商户类型 + chargingBillExport.setAccountType("商户类型"); + chargingBillExport.setType(byId.getType().toString()); + chargingBillExport.setBillType("月结"); + 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))); + chargingBillExport.setState("未出账"); + 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 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 income = new BigDecimal("0"); + + List<TChargingOrder> tChargingOrders = chargingOrderService.list(eq); + // 累加支付金额 + int i =1; + for (TChargingOrder tChargingOrder : tChargingOrders) { + // 账单信息 + paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount()); + if (tChargingOrder.getRefundStatus()!=null && tChargingOrder.getRefundStatus()==2){ + refundAmount = refundAmount.add(tChargingOrder.getRefundAmount()); + } + // 退款信息 + 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("支付宝小程序支付"); + + } + chargingBillRefundExport.setRechargeSerialNumber(tChargingOrder.getRechargeSerialNumber()); + chargingBillRefundExport.setCode(tChargingOrder.getCode()); + chargingBillRefundExport.setPayTime(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",DateUtils.toDate(tChargingOrder.getPayTime()))); + if (tChargingOrder.getRefundTime()!=null){ + chargingBillRefundExport.setRefundTime(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",DateUtils.toDate(tChargingOrder.getRefundTime()))); + } + chargingBillRefundExport.setRefundMoney(tChargingOrder.getRefundAmount().toString()); + chargingBillRefundExport.setRefundRemark(tChargingOrder.getRefundReason()); + chargingBillRefundExport.setRefundCode(tChargingOrder.getRefundCode()); + chargingBillRefundExport.setRefundSerialNumber(tChargingOrder.getRefundSerialNumber()); + chargingBillRefundExports.add(chargingBillRefundExport); + // 支付信息 + chargingBillPayExport.setId(i+""); + chargingBillPayExport.setRechargeSerialNumber(tChargingOrder.getRechargeSerialNumber()); + chargingBillPayExport.setCode(tChargingOrder.getCode()); + chargingBillPayExport.setPayTime(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",DateUtils.toDate(tChargingOrder.getPayTime()))); + chargingBillPayExport.setPaymentAmount(tChargingOrder.getPaymentAmount().toString()); + chargingBillPayExport.setTotal(""); + chargingBillPayExports.add(chargingBillPayExport); + i++; + } + chargingBillExport.setPaymentAmount(paymentAmount); + chargingBillExport.setRefundAmount(refundAmount); + chargingBillExport.setIncome(paymentAmount.subtract(refundAmount)); + chargingBillExports.add(chargingBillExport); + + // 导出 + List<Map<String, Object>> sheetsList = new ArrayList<>(); + AtomicInteger atomicInteger = new AtomicInteger(); + + for (int i1 = 0; 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(); + } + } } } -- Gitblit v1.7.1