package com.ruoyi.order.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.time.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.account.api.feignClient.AppUserCarClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.TAppUserCar;
import com.ruoyi.chargingPile.api.domain.SiteMenu;
import com.ruoyi.chargingPile.api.dto.GetSiteListDTO;
import com.ruoyi.chargingPile.api.feignClient.*;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.chargingPile.api.model.TChargingPile;
import com.ruoyi.chargingPile.api.model.TParkingRecord;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.log.enums.OperatorType;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.annotation.Logical;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.dto.ChargingStatisticeDTO;
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.query.ChargingOrderQuery;
import com.ruoyi.common.core.dto.MongoChargingOrderQuery;
import com.ruoyi.order.api.query.TChargingCountQuery;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import com.ruoyi.order.api.vo.*;
import com.ruoyi.order.api.vo.ChargingOrderInfoVO;
import com.ruoyi.order.api.vo.GetChargingOrderByLicensePlate;
import com.ruoyi.order.api.vo.TCharingOrderVO;
import com.ruoyi.order.dto.GetMyChargingOrderList;
import com.ruoyi.order.dto.GetNoInvoicedOrder;
import com.ruoyi.order.dto.MyChargingOrderInfo;
import com.ruoyi.order.dto.MyChargingOrderList;
import com.ruoyi.order.dto.OrderEvaluateVo;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.export.PayOrderExport;
import com.ruoyi.order.export.EnterpriseChargingDetailExport;
import com.ruoyi.order.service.*;
import com.ruoyi.order.util.PreviousSixMonths;
import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService;
import com.ruoyi.order.vo.EndOfChargePageInfo;
import com.ruoyi.order.vo.ChargingSimulationVO;
import com.ruoyi.order.vo.IcbcAdminSubOrderVO;
import com.ruoyi.order.vo.StatisticsOfBatteryVO;
import com.ruoyi.order.vo.UpdateOrderPaymentAmountDto;
import com.ruoyi.order.vo.WatchChargingOrderVo;
import com.ruoyi.other.api.feignClient.RoleSiteClient;
import com.ruoyi.other.api.feignClient.UserSiteClient;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import com.ruoyi.payment.api.vo.IcbcPaymentResp;
import com.ruoyi.payment.api.vo.IcbcRefundResp;
import com.ruoyi.payment.api.vo.IcbcSubOrderRefundResp;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import com.ruoyi.system.api.feignClient.SysUserRoleClient;
import com.ruoyi.system.api.model.SysUserRoleVo;
import io.swagger.annotations.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.net.URLEncoder;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.List;
import java.util.stream.Collectors;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.WebUtils;
import org.apache.poi.ss.usermodel.Workbook;
/**
*
* 前端控制器
*
*
* @author xiaochen
* @since 2024-08-07
*/
@Api(tags = "充电订单")
@RestController
@RequestMapping("/t-charging-order")
public class TChargingOrderController {
private Logger log = LoggerFactory.getLogger(TChargingOrderController.class);
@Resource
private TChargingOrderService chargingOrderService;
@Autowired
private TokenService tokenService;
@Autowired
private TOrderEvaluateService orderEvaluateService;
@Autowired
private TGrantVipService tGrantVipService;
@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;
@Resource
private SiteClient siteClient;
@Resource
private ChargingPileClient chargingPileClient;
@Resource
private ChargingGunClient chargingGunClient;
@Resource
private AppUserCarClient appUserCarClient;
@Resource
private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
@Resource
private TOrderInvoiceService invoiceService;
@Resource
private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService;
@Resource
private PartnerClient partnerClient;
@Resource
private SysUserClient sysUserClient;
@Resource
private UserSiteClient userSiteClient;
@Resource
private RoleSiteClient roleSiteClient;
@Resource
private SysUserRoleClient sysUserRoleClient;
/**
* 远程调用 监管平台查询前一天用能统计
* @return
*/
@ResponseBody
@PostMapping(value = "/getChargingStatistics")
public R> getChargingStatistics(@RequestBody ChargingStatisticeDTO dto) {
List collect = chargingOrderAccountingStrategyService.lambdaQuery().between(TChargingOrderAccountingStrategy::getCreateTime, dto.getStartTime(), dto.getEndTime())
.list().stream().map(TChargingOrderAccountingStrategy::getChargingOrderId).collect(Collectors.toList());
if (!collect.isEmpty()){
List list = chargingOrderService.lambdaQuery()
.in(TChargingOrder::getId,collect).list();
return R.ok(list);
}
return R.ok(new ArrayList());
}
/**
* 远程调用 增加管理后台赠送会员记录
* @return
*/
@ResponseBody
@PostMapping(value = "/management/give/vip")
public R managementGiveVip(@RequestBody TGrantVip grantVip) {
return R.ok(tGrantVipService.save(grantVip));
}
/**
* 远程调用根据枪id 查询最新的订单id 用户后台结束充电
* @param id
* @return
*/
@ResponseBody
@PostMapping(value = "/queryOrderByGunId/{id}")
public R queryOrderByGunId(@PathVariable("id") String id) {
List integers = new ArrayList<>();
integers.add(2);
integers.add(3);
integers.add(4);
TChargingOrder one = chargingOrderService.lambdaQuery()
.eq(TChargingOrder::getChargingGunId, id)
.in(TChargingOrder::getStatus, integers)
.one();
if (one!=null){
return R.ok(one.getId().toString());
}
return R.ok();
}
@RequiresPermissions(value = {"/chargingUserAnalysis"}, logical = Logical.OR)
@ResponseBody
@PostMapping(value = "/enterprise/charging/analysis")
@ApiOperation(value = "企业用户充电分析", tags = {"管理后台-数据分析-企业用户充电分析"})
public R> enterpriseChargingAnalysis(@RequestBody EnterpriseChargingAnalysisQuery query) {
return chargingOrderService.enterpriseChargingAnalysis(query);
}
@RequiresPermissions(value = {"/chargingUserAnalysis"}, logical = Logical.OR)
@ResponseBody
@PostMapping(value = "/enterprise/charging/detail")
@ApiOperation(value = "企业用户充电明细", tags = {"管理后台-数据分析-企业用户充电分析"})
public R> enterpriseChargingDetail(@RequestBody EnterpriseChargingAnalysisQuery query) {
return chargingOrderService.enterpriseChargingDetail(query);
}
@RequiresPermissions(value = {"/chargingUserAnalysis"}, logical = Logical.OR)
@ResponseBody
@PutMapping(value = "/enterprise/charging/detail/export")
@ApiOperation(value = "企业用户充电明细导出", tags = {"管理后台-数据分析-企业用户充电分析"})
public void exportEnterpriseChargingDetail(@RequestBody EnterpriseChargingAnalysisQuery query) {
List records = chargingOrderService.enterpriseChargingDetailExport(query);
List exports = records.stream().map(this::buildEnterpriseChargingDetailExport).collect(Collectors.toList());
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), EnterpriseChargingDetailExport.class, exports);
HttpServletResponse response = WebUtils.response();
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setCharacterEncoding("utf-8");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
try {
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("企业用户充电明细.xls", "utf-8"));
try (ServletOutputStream outputStream = response.getOutputStream()) {
workbook.write(outputStream);
}
workbook.close();
} catch (IOException e) {
log.error("导出企业用户充电明细失败", e);
}
}
private EnterpriseChargingDetailExport buildEnterpriseChargingDetailExport(EnterpriseChargingDetailVO dto) {
EnterpriseChargingDetailExport export = new EnterpriseChargingDetailExport();
export.setCode(dto.getCode());
export.setOrderType(formatEnterpriseOrderType(dto.getOrderType()));
export.setOrderClassification(formatOrderClassification(dto.getOrderClassification()));
export.setSiteName(dto.getSiteName());
export.setTerminalName(dto.getTerminalName());
export.setStatus(formatPayOrderStatus(1, dto.getStatus()));
export.setChargingSecond(dto.getChargingSecond());
export.setTotalAmount(dto.getTotalAmount());
export.setCouponDiscountAmount(dto.getCouponDiscountAmount());
export.setVipDiscountAmount(dto.getVipDiscountAmount());
export.setPaymentAmount(dto.getPaymentAmount());
export.setRefundAmount(dto.getRefundAmount());
export.setPartnerName(dto.getPartnerName());
export.setPhone(dto.getPhone());
export.setOrderSource(formatOrderSource(dto.getOrderSource()));
export.setStartTime(dto.getStartTime() == null ? null : DateUtils.localDateTimeToString(dto.getStartTime()));
export.setEndTime(dto.getEndTime() == null ? null : DateUtils.localDateTimeToString(dto.getEndTime()));
return export;
}
private String formatEnterpriseOrderType(Integer type) {
if (type == null) {
return "-";
}
if (type == 1) {
return "充电订单(小程序)";
}
if (type == 2) {
return "充电订单(刷卡)";
}
return "充电订单";
}
private String formatOrderClassification(Integer type) {
if (type == null) {
return "-";
}
return type == 1 ? "线上订单" : "线下订单";
}
private String formatOrderSource(Integer source) {
if (source == null) {
return "-";
}
if (source == 0) {
return "自有平台";
}
if (source == 1) {
return "第三方平台";
}
if (source == 2) {
return "引流平台";
}
return "其他";
}
@RequiresPermissions(value = {"/invoiceManagement/select_order", "/paymentOrder/order"}, logical = Logical.OR)
@ResponseBody
@PostMapping(value = "/pay/order/list")
@ApiOperation(value = "列表", tags = {"管理后台-支付订单-订单信息"})
public R> payOrderList(@RequestBody PayOrderQueryDto payOrderQueryDto) {
return chargingOrderService.payOrderQuery(payOrderQueryDto);
}
@RequiresPermissions(value = {"/invoiceManagement/select_order", "/invoiceManagement/export", "/paymentOrder/order"}, logical = Logical.OR)
@ResponseBody
@PutMapping(value = "/pay/order/export")
@ApiOperation(value = "导出查看订单列表", tags = {"管理后台-支付订单-订单信息"})
@Log(title = "发票管理查看订单导出", businessType = BusinessType.EXPORT)
public void exportPayOrder(@RequestBody PayOrderQueryDto payOrderQueryDto) {
payOrderQueryDto.setPageCurr(1);
payOrderQueryDto.setPageSize(10000);
R> result = chargingOrderService.payOrderQuery(payOrderQueryDto);
List records = result.getData() == null || result.getData().getRecords() == null
? Collections.emptyList() : result.getData().getRecords();
List exports = records.stream().map(this::buildPayOrderExport).collect(Collectors.toList());
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), PayOrderExport.class, exports);
HttpServletResponse response = WebUtils.response();
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setCharacterEncoding("utf-8");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
try {
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("订单列表.xls", "utf-8"));
try (ServletOutputStream outputStream = response.getOutputStream()) {
workbook.write(outputStream);
}
workbook.close();
} catch (IOException e) {
log.error("导出查看订单列表失败", e);
}
}
private PayOrderExport buildPayOrderExport(PayOrderDto dto) {
PayOrderExport export = new PayOrderExport();
export.setCode(dto.getCode());
export.setType(formatPayOrderType(dto.getType()));
export.setTitle(dto.getTitle());
export.setPhone(dto.getPhone());
export.setOrderStatus(dto.getPayTime() != null ? "订单支付成功" : "订单完成");
export.setStatus(formatPayOrderStatus(dto.getType(), dto.getStatus()));
export.setRefundStatus(dto.getRefundStatus() != null && dto.getRefundStatus() > 0 ? "有退款" : "无退款");
export.setRechargeAmount(dto.getRechargeAmount());
export.setPaymentAmount(dto.getPaymentAmount());
export.setFinalAmount(dto.getFinalAmount());
export.setCreateTime(dto.getCreateTime() == null ? null : DateUtils.localDateTimeToString(dto.getCreateTime()));
export.setEndTime(dto.getEndTime() == null ? null : DateUtils.localDateTimeToString(dto.getEndTime()));
export.setPayTime(dto.getPayTime() == null ? null : DateUtils.localDateTimeToString(dto.getPayTime()));
return export;
}
private String formatPayOrderType(Integer type) {
if (type == null || type < 1 || type > 4) {
return "-";
}
return new String[]{"充电订单", "购物订单", "vip订单", "停车订单"}[type - 1];
}
private String formatPayOrderStatus(Integer type, Integer status) {
if (type == null) {
return "-";
}
if (type == 3) {
return "支付成功";
}
if (status == null) {
return "-";
}
if (type == 1 && status >= 0 && status <= 5) {
return new String[]{"未知", "等待中", "启动中", "充电中", "停止中", "已结束"}[status];
}
if (type == 2 && status >= 1 && status <= 4) {
return new String[]{"待发货", "待收货", "已完成", "已取消"}[status - 1];
}
if (type == 4 && status >= 1 && status <= 3) {
return new String[]{"已进场", "已出场", "已缴费出场"}[status - 1];
}
return "-";
}
public static List testing5(long total, long current, long size, List str){
List result = new ArrayList<>();
//获取初始化分页结构
com.ruoyi.order.util.Page page = new com.ruoyi.order.util.Page().getPage(total, size, current - 1);
//获取集合下标初始值
long startIndex = page.getStartIndex();
//获取集合下标结束值
long endInddex = 0;
if(startIndex + page.getCurrent() >= total || size > total){
endInddex = total;
}else {
endInddex = Math.min(startIndex + page.getSize(), total);
}
//如果输入的开始查询下标大于集合大小,则查询为空值
if(startIndex > total){
result = Collections.emptyList();
}else{
result = str.subList((int)startIndex,(int)endInddex);
}
return result;
}
@ResponseBody
@PostMapping(value = "/pay/order/refund")
@ApiOperation(value = "退款", tags = {"管理后台-支付订单-订单信息"})
public R refund(@RequestBody PayOrderRefundDto payOrderQueryDto) {
return chargingOrderService.payRefund(payOrderQueryDto);
}
@ResponseBody
@PostMapping(value = "/pay/order/special/refund/query")
@RequiresPermissions(value = {"/paymentOrder/specialRefund", "/paymentOrder/specialRefund/refund"}, logical = Logical.OR)
@ApiOperation(value = "特殊退款查询", tags = {"管理后台-支付订单-特殊退款处理"})
public R specialRefundQuery(@RequestBody PayOrderRefundDto payOrderQueryDto) {
return chargingOrderService.getSpecialRefundOrder(payOrderQueryDto);
}
@ResponseBody
@PostMapping(value = "/pay/order/special/refund")
@RequiresPermissions(value = {"/paymentOrder/specialRefund/refund"}, logical = Logical.OR)
@ApiOperation(value = "特殊退款", tags = {"管理后台-支付订单-特殊退款处理"})
public R specialRefund(@RequestBody PayOrderRefundDto payOrderQueryDto) {
return chargingOrderService.specialRefund(payOrderQueryDto);
}
@RequiresPermissions(value = {"/paymentOrder/order"}, logical = Logical.OR)
@ResponseBody
@GetMapping(value = "/pay/order/pay/detail")
@ApiOperation(value = "支付信息", tags = {"管理后台-支付订单-订单信息"})
public R payOrderList(Long orderId, Integer type) {
switch (type) {
case 1:
TChargingOrder byId = chargingOrderService.getById(orderId);
PayOrderInfoDto payOrderInfoDto = new PayOrderInfoDto();
payOrderInfoDto.setOrderId(byId.getId().toString());
payOrderInfoDto.setCode(byId.getCode());
payOrderInfoDto.setTradeNo(byId.getRechargeSerialNumber());
payOrderInfoDto.setPayType(byId.getRechargePaymentType());
payOrderInfoDto.setPayAmount(byId.getPaymentAmount());
payOrderInfoDto.setPayTime(byId.getCreateTime());
payOrderInfoDto.setRefundAmount(byId.getRefundAmount());
payOrderInfoDto.setRechargeAmount(byId.getRechargeAmount());
payOrderInfoDto.setFinalAmount(byId.getRechargeAmount().subtract(byId.getRefundAmount()));
payOrderInfoDto.setPayMethod(byId.getPayMethod());
payOrderInfoDto.setBalancePayAmount(byId.getBalancePayAmount());
payOrderInfoDto.setThirdPayAmount(byId.getThirdPayAmount());
payOrderInfoDto.setBalanceRefundAmount(byId.getBalanceRefundAmount());
payOrderInfoDto.setThirdRefundAmount(byId.getThirdRefundAmount());
return R.ok(payOrderInfoDto);
case 2:
TShoppingOrder byId1 = shoppingOrderService.getById(orderId);
PayOrderInfoDto payOrderInfoDto1 = new PayOrderInfoDto();
payOrderInfoDto1.setOrderId(byId1.getId().toString());
payOrderInfoDto1.setCode(byId1.getCode());
payOrderInfoDto1.setTradeNo(byId1.getSerialNumber());
payOrderInfoDto1.setPayType(byId1.getPaymentType());
payOrderInfoDto1.setPayAmount(byId1.getPaymentAmount());
payOrderInfoDto1.setPayTime(byId1.getCreateTime());
payOrderInfoDto1.setRefundAmount(byId1.getRefundAmount());
payOrderInfoDto1.setRechargeAmount(byId1.getPaymentAmount());
payOrderInfoDto1.setFinalAmount(byId1.getPaymentAmount().subtract(byId1.getRefundAmount()));
return R.ok(payOrderInfoDto1);
case 3:
TVipOrder byId2 = vipOrderService.getById(orderId);
PayOrderInfoDto payOrderInfoDto2 = new PayOrderInfoDto();
payOrderInfoDto2.setOrderId(byId2.getId().toString());
payOrderInfoDto2.setCode(byId2.getCode());
payOrderInfoDto2.setTradeNo(byId2.getSerialNumber());
payOrderInfoDto2.setPayType(byId2.getPaymentType());
payOrderInfoDto2.setPayAmount(byId2.getPaymentAmount());
payOrderInfoDto2.setPayTime(byId2.getCreateTime());
payOrderInfoDto2.setRefundAmount(byId2.getRefundAmount());
payOrderInfoDto2.setRechargeAmount(byId2.getPaymentAmount());
payOrderInfoDto2.setFinalAmount(byId2.getPaymentAmount().subtract(byId2.getRefundAmount()));
return R.ok(payOrderInfoDto2);
//todo luo 停车场订单
case 4:
R recordById = parkingLotClient.getRecordById(orderId);
TParkingRecord byId3 =recordById.getData();
PayOrderInfoDto payOrderInfoDto3 = new PayOrderInfoDto();
payOrderInfoDto3.setOrderId(byId3.getId().toString());
payOrderInfoDto3.setCode(byId3.getCode());
payOrderInfoDto3.setPayTime(byId3.getCreateTime());
payOrderInfoDto3.setRechargeAmount(byId3.getPayment());
return R.ok(payOrderInfoDto3);
}
return R.ok();
}
@ResponseBody
@GetMapping(value = "/pay/order/refund/detail")
@ApiOperation(value = "退款信息", tags = {"管理后台-支付订单-订单信息"})
public R refundDetail(Long orderId, Integer type) {
switch (type) {
case 1:
List byId = chargingOrderRefundService.lambdaQuery().eq(TChargingOrderRefund::getChargingOrderId, orderId).orderByDesc(TChargingOrderRefund::getRefundTime).list();
return R.ok(byId);
case 2:
List list = shoppingOrderRefundService.lambdaQuery().eq(TShoppingOrderRefund::getShoppingOrderId, orderId).orderByDesc(TShoppingOrderRefund::getRefundTime).list();
return R.ok(list);
case 3:
List list1 = vipOrderRefundService.lambdaQuery().eq(TVipOrderRefund::getVipOrderId, orderId).orderByDesc(TVipOrderRefund::getRefundTime).list();
return R.ok(list1);
}
return R.ok();
}
@ResponseBody
@GetMapping(value = "/pay/order/charging")
@ApiOperation(value = "充电信息", tags = {"管理后台-支付订单-订单信息"})
public R refundDetail(Long orderId) {
PayOrderChargingInfo payOrderChargingInfo = new PayOrderChargingInfo();
TChargingOrder byId = chargingOrderService.getById(orderId);
List data = siteClient.getSiteByIds(Collections.singletonList(byId.getSiteId())).getData();
payOrderChargingInfo.setSiteName(data.get(0).getName());
TChargingPile data1 = chargingPileClient.getChargingPileById(byId.getChargingPileId()).getData();
payOrderChargingInfo.setChargingName(data1.getName());
TChargingGun data2 = chargingGunClient.getChargingGunById(byId.getChargingGunId()).getData();
payOrderChargingInfo.setGunName(data2.getName());
payOrderChargingInfo.setCarNum(byId.getPlateNum());
payOrderChargingInfo.setTChargingOrder(byId);
Long count = chargingOrderAccountingStrategyService.lambdaQuery().eq(TChargingOrderAccountingStrategy::getChargingOrderId, orderId).count();
payOrderChargingInfo.setPeriodCount(count);
if (byId.getAppUserCarId()!=null && 0 != byId.getAppUserCarId()) {
List carid = new ArrayList<>();
carid.add(byId.getAppUserCarId());
R> carByIds = appUserCarClient.getCarByIds(carid);
payOrderChargingInfo.setCarNum(carByIds.getData().get(0).getLicensePlate());
}else{
payOrderChargingInfo.setCarNum(byId.getPlateNum());
}
payOrderChargingInfo.setStartTime(byId.getStartTime());
payOrderChargingInfo.setEndTime(byId.getEndTime());
payOrderChargingInfo.setTimeCount(payOrderChargingInfo.calculateDuration());
return R.ok(payOrderChargingInfo);
}
@ResponseBody
@GetMapping(value = "/pay/order/charging/details")
@ApiOperation(value = "充电明细", tags = {"管理后台-支付订单-订单信息"})
public R> chargingDetail(Long orderId) {
TChargingOrder chargingOrder = chargingOrderService.getById(orderId);
List list = chargingOrderAccountingStrategyService.lambdaQuery().eq(TChargingOrderAccountingStrategy::getChargingOrderId, orderId)
.orderByDesc(TChargingOrderAccountingStrategy::getStartTime).list();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
for (TChargingOrderAccountingStrategy tChargingOrderAccountingStrategy : list) {
LocalDateTime createTime = chargingOrder.getStartTime();
String format = createTime.format(formatter);
String startTime = tChargingOrderAccountingStrategy.getStartTime();
if("00:00".equals(startTime)){
createTime = createTime.plusDays(1);
format = createTime.format(formatter);
}
tChargingOrderAccountingStrategy.setStartTime(format+" "+tChargingOrderAccountingStrategy.getStartTime());
tChargingOrderAccountingStrategy.setEndTime(format+" "+tChargingOrderAccountingStrategy.getEndTime());
}
//从新排序
list.sort(new Comparator() {
@Override
public int compare(TChargingOrderAccountingStrategy o1, TChargingOrderAccountingStrategy o2) {
String startTime = o1.getStartTime();
String startTime1 = o2.getStartTime();
LocalDateTime localDateTime = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
LocalDateTime localDateTime1 = LocalDateTime.parse(startTime1, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
if(localDateTime.isBefore(localDateTime1)){
return -1;
}
if(localDateTime.isAfter(localDateTime1)){
return 1;
}
return 0;
}
});
return R.ok(list);
}
@RequiresPermissions(value = {"/paymentOrder/refund", "/paymentOrder/order", "/paymentOrder/specialRefund"}, logical = Logical.OR)
@ResponseBody
@PostMapping(value = "/pay/order/refund/list")
@ApiOperation(value = "列表", tags = {"管理后台-支付订单-退款订单"})
public R> refundList(@RequestBody ChargingRefundDto chargingRefundDto) {
Integer pageCurr = chargingRefundDto.getPageCurr();
Integer pageSize = chargingRefundDto.getPageSize();
// R> refundList = chargingOrderService.getRefundList(chargingRefundDto);
chargingRefundDto.setPageCurr(1);
chargingRefundDto.setPageSize(199999999);
R> refundList1 = chargingOrderService.getRefundList(chargingRefundDto);
Long userId = tokenService.getLoginUser().getUserid();
//如果没传siteId,获取当前登陆人所有的siteIds
List siteIds = new ArrayList<>();
if (userId != null){
List data = siteClient.getSiteListByUserId(userId).getData();
for (GetSiteListDTO datum : data) {
siteIds.add(datum.getId());
}
}
if (siteIds.isEmpty()){
siteIds.add(-1);
}
// 查询当前登陆人按钮权限
SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
Integer roleType = sysUser.getRoleType();
List tChargingOrderRefunds = new ArrayList<>();
for (TChargingOrderRefund record : refundList1.getData().getRecords()) {
if (roleType==1){
tChargingOrderRefunds.add(record);
continue;
}
if (record.getType()!=1){
tChargingOrderRefunds.add(record);
}
TChargingOrder byId = chargingOrderService.getById(record.getOrderId());
record.setUid(record.getId().toString());
if (byId==null){
continue;
}
if (roleType==2&&siteIds.contains(byId.getSiteId())){
tChargingOrderRefunds.add(record);
}
}
PageInfo data = refundList1.getData();
List res1 = testing4(tChargingOrderRefunds.size(), pageCurr, pageSize, tChargingOrderRefunds);
data.setTotal(tChargingOrderRefunds.size());
data.setRecords(res1);
return refundList1;
}
public static List testing4(long total, long current, long size, List str){
List result = new ArrayList<>();
//获取初始化分页结构
com.ruoyi.order.util.Page page = new com.ruoyi.order.util.Page().getPage(total, size, current - 1);
//获取集合下标初始值
long startIndex = page.getStartIndex();
//获取集合下标结束值
long endInddex = 0;
if(startIndex + page.getCurrent() >= total || size > total){
endInddex = total;
}else {
endInddex = Math.min(startIndex + page.getSize(), total);
}
//如果输入的开始查询下标大于集合大小,则查询为空值
if(startIndex > total){
result = Collections.emptyList();
}else{
result = str.subList((int)startIndex,(int)endInddex);
}
return result;
}
@ResponseBody
@PostMapping(value = "/pay/order/refund/list1")
@ApiOperation(value = "列表1", tags = {"管理后台-支付订单-退款订单"})
public R> refundList1(@RequestBody ChargingRefundDto chargingRefundDto) {
return chargingOrderService.getRefundList(chargingRefundDto);
}
@RequiresPermissions(value = {"/chargingPileOrder"}, logical = Logical.OR)
@ResponseBody
@PostMapping(value = "/chargingOrder")
@ApiOperation(value = "充电桩订单列表", tags = {"管理后台-订单管理"})
public AjaxResult chargingOrder(@RequestBody ChargingOrderQuery dto) {
TCharingOrderVO res = chargingOrderService.chargingOrder(dto);
return AjaxResult.success(res);
}
@RequiresPermissions(value = {"/chargingPileOrder"}, logical = Logical.OR)
@ResponseBody
@PostMapping(value = "/chargingOrder/list")
@ApiOperation(value = "充电桩订单分页列表", tags = {"管理后台-订单管理"})
public AjaxResult> chargingOrderList(@RequestBody ChargingOrderQuery dto) {
PageInfo res = chargingOrderService.chargingOrderList(dto);
return AjaxResult.success(res);
}
@RequiresPermissions(value = {"/chargingPileOrder"}, logical = Logical.OR)
@ResponseBody
@PostMapping(value = "/chargingOrder/summary")
@ApiOperation(value = "充电桩订单汇总", tags = {"管理后台-订单管理"})
public AjaxResult chargingOrderSummary(@RequestBody ChargingOrderQuery dto) {
TCharingOrderVO res = chargingOrderService.chargingOrderSummary(dto);
return AjaxResult.success(res);
}
@RequiresPermissions(value = {"/chargingPileOrder"}, logical = Logical.OR)
@ResponseBody
@PostMapping(value = "/balanceIncomeDetail")
@ApiOperation(value = "充电桩订单余额收入明细", tags = {"管理后台-订单管理"})
public AjaxResult> balanceIncomeDetail(@RequestBody ChargingOrderQuery dto) {
List res = chargingOrderService.balanceIncomeDetail(dto);
return AjaxResult.success(res);
}
@RequiresPermissions(value = {"/chargingPileOrder/monitoring_record"}, logical = Logical.OR)
@ResponseBody
@GetMapping(value = "/chargingOrderInfo")
@ApiOperation(value = "充电桩订单列表查看详情", tags = {"管理后台-订单管理"})
public AjaxResult chargingOrderInfo(String strategyId) {
TChargingOrder byId = chargingOrderService.getById(strategyId);
ChargingOrderInfoVO chargingOrderInfoVO = new ChargingOrderInfoVO();
chargingOrderInfoVO.setCdElectronic(byId.getCurrent()!=null?byId.getCurrent().setScale(2, BigDecimal.ROUND_HALF_DOWN)+"":"");
chargingOrderInfoVO.setCdVoltage(byId.getVoltage()!=null?byId.getVoltage().setScale(2, BigDecimal.ROUND_HALF_DOWN)+"":"");
chargingOrderInfoVO.setSurplus(byId.getTotalElectricity()!=null?byId.getTotalElectricity().setScale(2, BigDecimal.ROUND_HALF_DOWN)+"":"");
chargingOrderInfoVO.setTotalPower(byId.getPower()!=null?byId.getPower().setScale(2, BigDecimal.ROUND_HALF_DOWN)+"":"");
if (byId.getAppUserCarId()!=null){
TAppUserCar data = appUserCarClient.getCarById(byId.getAppUserCarId()+"").getData();
if (data!=null){
chargingOrderInfoVO.setLicensePlate(data.getLicensePlate());
chargingOrderInfoVO.setVehicleBrand(data.getVehicleBrand());
chargingOrderInfoVO.setVehicleModel(data.getVehicleModel());
chargingOrderInfoVO.setVehicleUse(data.getVehicleUse());
}
}else{
chargingOrderInfoVO.setLicensePlate(byId.getPlateNum());
}
// 时段总服务费
List list = chargingOrderAccountingStrategyService.lambdaQuery().eq(TChargingOrderAccountingStrategy::getChargingOrderId, strategyId).orderByDesc(TChargingOrderAccountingStrategy::getStartTime).list();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
for (TChargingOrderAccountingStrategy tChargingOrderAccountingStrategy : list) {
LocalDateTime createTime = byId.getStartTime();
String format = createTime.format(formatter);
String startTime = tChargingOrderAccountingStrategy.getStartTime();
if("00:00".equals(startTime)){
createTime = createTime.plusDays(1);
format = createTime.format(formatter);
}
tChargingOrderAccountingStrategy.setStartTime(format+" "+tChargingOrderAccountingStrategy.getStartTime());
tChargingOrderAccountingStrategy.setEndTime(format+" "+tChargingOrderAccountingStrategy.getEndTime());
// if (byId.getVipDiscountAmount()!=null && byId.getServiceCharge().compareTo(BigDecimal.ZERO) != 0){
// BigDecimal multiply = byId.getVipDiscountAmount().divide(byId.getServiceCharge(), 2)
// .multiply(tChargingOrderAccountingStrategy.getPeriodOriginalServicePrice());
// tChargingOrderAccountingStrategy.setVipDiscount(multiply);
// }
// if (byId.getCouponDiscountAmount()!=null && byId.getServiceCharge().compareTo(BigDecimal.ZERO) != 0){
// BigDecimal multiply = byId.getCouponDiscountAmount().divide(byId.getServiceCharge(), 2)
// .multiply(tChargingOrderAccountingStrategy.getPeriodOriginalServicePrice());
// tChargingOrderAccountingStrategy.setCouponDiscount(multiply);
// }
if(null == tChargingOrderAccountingStrategy.getCouponDiscount()){
tChargingOrderAccountingStrategy.setCouponDiscount(BigDecimal.ZERO);
}
}
//从新排序
list.sort(new Comparator() {
@Override
public int compare(TChargingOrderAccountingStrategy o1, TChargingOrderAccountingStrategy o2) {
String startTime = o1.getStartTime();
String startTime1 = o2.getStartTime();
LocalDateTime localDateTime = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
LocalDateTime localDateTime1 = LocalDateTime.parse(startTime1, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
if(localDateTime.isBefore(localDateTime1)){
return -1;
}
if(localDateTime.isAfter(localDateTime1)){
return 1;
}
return 0;
}
});
chargingOrderInfoVO.setList(list);
return AjaxResult.success(chargingOrderInfoVO);
}
@Log(title = "【扫一扫】添加评价", businessType = BusinessType.INSERT,operatorType = OperatorType.MOBILE)
@ResponseBody
@PostMapping(value = "/addEvaluate")
@ApiOperation(value = "添加评价", tags = {"小程序-扫一扫"})
public AjaxResult getMyChargingOrderList(@RequestBody OrderEvaluateVo dto) {
dto.setAppUserId(tokenService.getLoginUserApplet().getUserId());
orderEvaluateService.addOrderEvaluate(dto);
return AjaxResult.success();
}
/**
* 查询用户最近一次充电记录使用的车辆
*
* @param
* @return
*/
@GetMapping(value = "/getCar/{id}")
public R getCar(@PathVariable("id")String id) {
List list = chargingOrderService.list(new LambdaQueryWrapper()
.eq(TChargingOrder::getAppUserId, id)
.isNotNull(TChargingOrder::getAppUserCarId));
if (!list.isEmpty()){
// 最近使用的车辆id
Long size = list.get(0).getAppUserCarId();
return R.ok(size);
}else{
return R.ok(-1L);
}
}
/**
* 查询会员在本月有多少次享受了充电折扣
* @param req
* @return
*/
@PostMapping(value = "/getChargingCount")
public R getChargingCount(@RequestBody TChargingCountQuery req) {
int size = chargingOrderService.list(new LambdaQueryWrapper()
.eq(TChargingOrder::getAppUserId, req.getUserId())
.eq(TChargingOrder::getRechargePaymentStatus, 2)
.between(TChargingOrder::getStartTime, req.getStartTime(), req.getEndTime())).size();
return R.ok(size);
}
//用户订单数量
@PostMapping(value = "/useOrderCount")
public R useOrderCount(@RequestParam("userId") Long userId) {
Long count = chargingOrderService.lambdaQuery().eq(TChargingOrder::getAppUserId, userId).count();
return R.ok(count);
}
//订单详情
@PostMapping(value = "/detail")
public R detail(@RequestParam("orderId") Long orderId) {
return R.ok(chargingOrderService.getById(orderId));
}
@PostMapping(value = "/getList")
public R> getList(@RequestParam("siteId") Integer siteId) {
List list = chargingOrderService.lambdaQuery().eq(TChargingOrder::getSiteId, siteId).list();
return R.ok(list);
}
@PostMapping(value = "/getBySiteIdAndTime")
public R> getBySiteIdAndTime(@RequestBody ChargingPercentProvinceDto chargingPercentProvinceDto) {
List groups = chargingOrderService.chargingOrderGroup(chargingPercentProvinceDto);
return R.ok(groups);
}
/**
* 根据站点id和时间区间查询订单数据
* @param chargingPercentProvinceDto
* @return
*/
@PostMapping(value = "/getOrderBySiteIdAndTime")
public R> getOrderBySiteIdAndTime(@RequestBody ChargingPercentProvinceDto chargingPercentProvinceDto){
LocalDate date1 = chargingPercentProvinceDto.getDate1();
LocalDate date2 = chargingPercentProvinceDto.getDate2();
String tripartitePlatformName = chargingPercentProvinceDto.getTripartitePlatformName();
List list = chargingOrderService.list(new LambdaQueryWrapper().in(TChargingOrder::getSiteId, chargingPercentProvinceDto.getSiteIds())
.between(null != date1 && null != date2, TChargingOrder::getPayTime, date1.atTime(0, 0, 0), date2.atTime(23, 59, 59))
.eq(TChargingOrder::getDelFlag, 0).eq(TChargingOrder::getStatus, 5)
.eq(StringUtils.isNotEmpty(tripartitePlatformName), TChargingOrder::getOrderSource, 2)
.eq(StringUtils.isNotEmpty(tripartitePlatformName), TChargingOrder::getTripartitePlatformName, tripartitePlatformName));
return R.ok(list);
}
/**
* 根据充电枪id获取正在进行中的订单
* @param chargingGunId 充电枪id
* @return
*/
@PostMapping(value = "/getOrderDetailByGunId")
public R getOrderDetailByGunId(@RequestParam("chargingGunId") Integer chargingGunId) {
TChargingOrder one = chargingOrderService.getOne(new LambdaQueryWrapper().eq(TChargingOrder::getChargingGunId, chargingGunId)
.eq(TChargingOrder::getDelFlag, 0).eq(TChargingOrder::getStatus, 3));
return R.ok(one);
}
@ResponseBody
@GetMapping(value = "/getMyChargingOrderList")
@ApiOperation(value = "获取充电记录列表", tags = {"小程序-充电记录"})
public AjaxResult