| | |
| | | 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> |
| | |
| | | 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("发票导出.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(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |