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.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.order.api.model.ExportUidDto;
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.AccountListVO;
import com.ruoyi.order.api.vo.ChargingBillListVO;
import com.ruoyi.order.api.vo.ChargingBillVO;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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;
/**
*
* 前端控制器
*
*
* @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;
@PostMapping(value = "/accountBillList")
@ApiOperation(value = "列表查询", tags = {"管理后台-账户结算账单"})
public R accountBillList(@RequestBody ChargingListQuery dto) {
AccountListVO accountListVO = new AccountListVO();
ChargingBillVO res = chargingBillService.chargingBillList1(dto);
ChargingBillVO res1 = chargingBillService.chargingBillList1(dto);
List records = res1.getList().getRecords();
accountListVO.setBillCount(records.size());
accountListVO.setTotalAmount(
res1.getPaymentAmount().subtract(res1.getRefundAmount()==null?BigDecimal.ZERO:res1.getRefundAmount())
.subtract(res1.getCommissionAmount()==null?BigDecimal.ZERO:res1.getCommissionAmount())
.subtract(res1.getSharingAmount()==null?BigDecimal.ZERO:res1.getSharingAmount()));
accountListVO.setPaymentAmount(res1.getPaymentAmount());
accountListVO.setRefundAmount(res1.getRefundAmount());
accountListVO.setCommissionAmount(res1.getCommissionAmount());
accountListVO.setSharingAmount(res1.getSharingAmount());
accountListVO.setList(res.getList());
return R.ok(accountListVO);
}
@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);
}
@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();
}
}
}
@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());
// 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 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 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 income = new BigDecimal("0");
List 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