package com.ruoyi.order.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
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.dto.GetSiteListDTO;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
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.chargingPile.api.vo.SiteVO;
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.DateUtils;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.BasePage;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
import com.ruoyi.integration.api.model.ChargingOrderAndUploadRealTimeMonitoringDataDto;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.query.ChargingOrderQuery;
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.ChargingOrderVO;
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.service.*;
import com.ruoyi.order.service.impl.TChargingOrderServiceImpl;
import com.ruoyi.order.util.PreviousSixMonths;
import com.ruoyi.order.vo.EndOfChargePageInfo;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import com.ruoyi.payment.api.vo.AliQueryOrder;
import com.ruoyi.payment.api.vo.WxRefundNotifyResp;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.models.auth.In;
import jdk.nashorn.internal.runtime.ListAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.*;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 前端控制器
*
*
* @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;
@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;
/**
* 远程调用根据枪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();
}
@ResponseBody
@PostMapping(value = "/pay/order/list")
@ApiOperation(value = "列表", tags = {"管理后台-支付订单-订单信息"})
public R> payOrderList(@RequestBody PayOrderQueryDto payOrderQueryDto) {
return chargingOrderService.payOrderQuery(payOrderQueryDto);
}
@ResponseBody
@PostMapping(value = "/pay/order/refund")
@ApiOperation(value = "退款", tags = {"管理后台-支付订单-订单信息"})
public R refund(@RequestBody PayOrderRefundDto payOrderQueryDto) {
return chargingOrderService.payRefund(payOrderQueryDto);
}
@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.getPayTime());
payOrderInfoDto.setRefundAmount(byId.getRefundAmount());
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.getPayTime());
payOrderInfoDto1.setRefundAmount(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.getPayTime());
payOrderInfoDto2.setRefundAmount(byId2.getRefundAmount());
return R.ok(payOrderInfoDto2);
//todo luo 停车场订单
// case 4:
// TParkingRecord byId3 = parkingLotClient.getRecordById(orderId).getData();
// PayOrderInfoDto payOrderInfoDto3 = new PayOrderInfoDto();
// payOrderInfoDto3.setOrderId(byId3.getId().toString());
// payOrderInfoDto3.setCode(byId3.getCode());
// payOrderInfoDto3.setTradeNo(byId3);
// payOrderInfoDto3.setPayType(0);
// payOrderInfoDto3.setPayAmount(new BigDecimal("0"));
// payOrderInfoDto3.setPayTime(LocalDateTime.now());
// payOrderInfoDto3.setRefundAmount(new BigDecimal("0"));
}
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());
if (byId.getAppUserCarId()!=null) {
List data3 = appUserCarClient.getCarByIds(Collections.singletonList(byId.getAppUserCarId())).getData();
payOrderChargingInfo.setCarNum(data3.get(0).getLicensePlate());
}
return R.ok();
}
@ResponseBody
@GetMapping(value = "/pay/order/charging/details")
@ApiOperation(value = "充电明细", tags = {"管理后台-支付订单-订单信息"})
public R> chargingDetail(Long orderId) {
List list = chargingOrderAccountingStrategyService.lambdaQuery().eq(TChargingOrderAccountingStrategy::getChargingOrderId, orderId).orderByDesc(TChargingOrderAccountingStrategy::getStartTime).list();
return R.ok(list);
}
@ResponseBody
@PostMapping(value = "/pay/order/refund/list")
@ApiOperation(value = "列表", tags = {"管理后台-支付订单-退款订单"})
public R> refundList(@RequestBody ChargingRefundDto chargingRefundDto) {
return chargingOrderService.getRefundList(chargingRefundDto);
}
@ResponseBody
@PostMapping(value = "/pay/order/refund/list1")
@ApiOperation(value = "列表1", tags = {"管理后台-支付订单-退款订单"})
public R> refundList1(@RequestBody ChargingRefundDto chargingRefundDto) {
return chargingOrderService.getRefundList(chargingRefundDto);
}
@ResponseBody
@PostMapping(value = "/chargingOrder")
@ApiOperation(value = "充电桩订单列表", tags = {"管理后台-订单管理"})
public AjaxResult chargingOrder(@RequestBody ChargingOrderQuery dto) {
List data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
dto.setUserIds(data);
TCharingOrderVO res = chargingOrderService.chargingOrder(dto);
return AjaxResult.success(res);
}
@ResponseBody
@PostMapping(value = "/chargingOrderInfo")
@ApiOperation(value = "充电桩订单列表查看详情", tags = {"管理后台-订单管理"})
public AjaxResult chargingOrderInfo(String orderId) {
ChargingOrderInfoVO chargingOrderInfoVO = new ChargingOrderInfoVO();
chargingOrderInfoVO.setCdElectronic("");
chargingOrderInfoVO.setCdVoltage("");
chargingOrderInfoVO.setSurplus("");
chargingOrderInfoVO.setTotalPower("");
chargingOrderInfoVO.setLicensePlate("");
chargingOrderInfoVO.setVehicleBrand("");
chargingOrderInfoVO.setVehicleModel("");
chargingOrderInfoVO.setVehicleUse("");
List tChargingOrderAccountingStrategies = new ArrayList<>();
chargingOrderInfoVO.setList(tChargingOrderAccountingStrategies);
return AjaxResult.success(chargingOrderInfoVO);
}
@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 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