package com.ruoyi.order.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.feignClient.*;
import com.ruoyi.account.api.model.*;
import com.ruoyi.account.api.vo.GetAppUserVipDetail;
import com.ruoyi.account.api.vo.GetInviteUser;
import com.ruoyi.chargingPile.api.dto.GetSiteListDTO;
import com.ruoyi.chargingPile.api.feignClient.*;
import com.ruoyi.chargingPile.api.model.*;
import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode;
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.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.integration.api.feignClient.ChargingHandshakeClient;
import com.ruoyi.integration.api.feignClient.PlatformStartChargingReplyClient;
import com.ruoyi.integration.api.feignClient.SendMessageClient;
import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
import com.ruoyi.integration.api.model.ChargingHandshake;
import com.ruoyi.integration.api.model.PlatformStartCharging;
import com.ruoyi.integration.api.model.PlatformStartChargingReply;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.integration.api.feignClient.*;
import com.ruoyi.integration.api.model.*;
import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
import com.ruoyi.integration.api.vo.StartChargeResult;
import com.ruoyi.order.api.dto.SettlementConfirmAdd;
import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient;
import com.ruoyi.order.api.feignClient.AccountingStrategyOrderClient;
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.query.ChargingOrderQuery;
import com.ruoyi.order.api.query.SettlementListQuery;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import com.ruoyi.order.api.vo.*;
import com.ruoyi.order.api.vo.PlatformStopChargingReplyVO;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.mapper.TChargingOrderMapper;
import com.ruoyi.order.mapper.TSettlementConfirmMapper;
import com.ruoyi.order.service.TChargingOrderAccountingStrategyService;
import com.ruoyi.order.service.TChargingOrderRefundService;
import com.ruoyi.order.service.TChargingOrderService;
import com.ruoyi.order.service.TOrderEvaluateService;
import com.ruoyi.order.service.*;
import com.ruoyi.order.vo.EndOfChargePageInfo;
import com.ruoyi.other.api.domain.*;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.other.api.domain.TVip;
import com.ruoyi.other.api.feignClient.*;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import com.ruoyi.payment.api.model.RefundReq;
import com.ruoyi.payment.api.model.RefundResp;
import com.ruoyi.payment.api.model.WxPaymentRefundModel;
import com.ruoyi.payment.api.vo.*;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import io.seata.spring.annotation.GlobalTransactional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.crypto.MacSpi;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.time.temporal.ChronoUnit;
import java.time.temporal.WeekFields;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author xiaochen
* @since 2024-08-07
*/
@Service
public class TChargingOrderServiceImpl extends ServiceImpl implements TChargingOrderService {
private Logger log = LoggerFactory.getLogger(TChargingOrderServiceImpl.class);
@Resource
private ChargingGunClient chargingGunClient;
@Resource
private TSettlementConfirmMapper tSettlementConfirmMapper;
@Resource
private PartnerClient partnerClient;
@Resource
private SiteClient siteClient;
@Resource
private AppUserCarClient appUserCarClient;
@Resource
private AppUserClient appUserClient;
@Resource
private ChargingPileClient chargingPileClient;
@Resource
private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
@Resource
private TokenService tokenService;
@Resource
private WxPaymentClient wxPaymentClient;
@Resource
private AliPaymentClient aliPaymentClient;
@Resource
private AppCouponClient appCouponClient;
@Resource
private AppUserVipDetailClient appUserVipDetailClient;
@Resource
private RedisService redisService;
@Resource
private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient;
@Resource
private TCECClient tcecClient;
@Resource
private SendMessageClient sendMessageClient;
@Resource
private TOrderEvaluateService orderEvaluateService;
@Resource
private AccountingStrategyDetailClient accountingStrategyDetailClient;
@Resource
private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient;
@Resource
private AccountingStrategyClient accountingStrategyClient;
@Resource
private PlatformStartChargingReplyClient platformStartChargingReplyClient;
@Resource
private TChargingOrderRefundService chargingOrderRefundService;
@Resource
private PlatformStopChargingReplyClient platformStopChargingReplyClient;
@Resource
private AccountingStrategyOrderService accountingStrategyOrderService;
@Resource
private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService;
@Resource
private InviteUserClient inviteUserClient;
@Resource
private AppUserIntegralChangeClient appUserIntegralChangeClient;
@Resource
private IntegralRuleClient integralRuleClient;
@Resource
private VipClient vipClient;
@Resource
private UserTagClient userTagClient;
@Resource
private AppUserTagClient appUserTagClient;
@Resource
private SecurityDetectionClient securityDetectionClient;
@Resource
private BmsDemandAndChargerExportationClient bmsDemandAndChargerExportationClient;
//计数器
private Map counter_map = new HashMap<>();
//计数器
private Map boot_failed_map = new HashMap<>();
@Resource
private OperatorClient operatorClient;
@Resource
private TransactionRecordClient transactionRecordClient;
/**
* 获取小程序充电记录列表数据
* @param query
* @return
*/
@Override
public Map getMyChargingOrderList(GetMyChargingOrderList query) {
Long appUserId = tokenService.getLoginUserApplet().getUserId();
Map map = new HashMap<>();
int size = this.baseMapper.getMyChargingOrderList(appUserId, 1, null, null).size();
map.put("number", size);
query.setPageCurr((query.getPageCurr() - 1) * query.getPageSize());
List list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), query.getPageCurr(), query.getPageSize());
List orderLists = new ArrayList<>();
for (TChargingOrder tChargingOrder : list) {
MyChargingOrderList myChargingOrderList = new MyChargingOrderList();
myChargingOrderList.setId(tChargingOrder.getId().toString());
myChargingOrderList.setStatus(tChargingOrder.getStatus());
Site site = siteClient.getSiteByIds(Arrays.asList(tChargingOrder.getSiteId())).getData().get(0);
myChargingOrderList.setTitle(site.getName());
myChargingOrderList.setChargingDegree(tChargingOrder.getChargingCapacity());
String name = chargingGunClient.getAllName(tChargingOrder.getChargingGunId()).getData();
myChargingOrderList.setChargingGunId(tChargingOrder.getChargingGunId());
myChargingOrderList.setName(name);
myChargingOrderList.setEndMode(tChargingOrder.getEndMode());
BigDecimal payMoney = tChargingOrder.getStatus() < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount();
myChargingOrderList.setPayMoney(payMoney);
myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
long count = orderEvaluateService.count(new LambdaQueryWrapper().eq(TOrderEvaluate::getOrderType, 1)
.eq(TOrderEvaluate::getOrderId, tChargingOrder.getId()).eq(TOrderEvaluate::getDelFlag, 0));
myChargingOrderList.setEvaluate(count + 1L);
orderLists.add(myChargingOrderList);
}
list = this.baseMapper.getMyChargingOrderList(appUserId, query.getType(), null, null);
map.put("list", orderLists);
map.put("totle", list.size());
return map;
}
/**
* 获取充电订单明细
* @param id 订单id
* @return
*/
@Override
public MyChargingOrderInfo getMyChargingOrderInfo(String id) {
TChargingOrder chargingOrder = this.getById(id);
MyChargingOrderInfo myChargingOrderInfo = new MyChargingOrderInfo();
myChargingOrderInfo.setId(id);
myChargingOrderInfo.setCode(chargingOrder.getCode());
myChargingOrderInfo.setCreateTime(chargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
myChargingOrderInfo.setStatus(chargingOrder.getStatus());
Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0);
myChargingOrderInfo.setTitle(site.getName());
TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
myChargingOrderInfo.setChargeMode(chargingGun.getChargeMode());
String name = chargingGunClient.getAllName(chargingOrder.getChargingGunId()).getData();
myChargingOrderInfo.setName(name);
if(Objects.nonNull(chargingOrder.getAppUserCarId())){
TAppUserCar tAppUserCar = appUserCarClient.getCarById(chargingOrder.getAppUserCarId().toString()).getData();
if(null != tAppUserCar){
myChargingOrderInfo.setLicensePlate(tAppUserCar.getLicensePlate());
}else{
myChargingOrderInfo.setLicensePlate("无");
}
}else{
myChargingOrderInfo.setLicensePlate(chargingOrder.getPlateNum());
}
myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
myChargingOrderInfo.setOrderAmount(chargingOrder.getOrderAmount());
myChargingOrderInfo.setPaymentAmount(chargingOrder.getPaymentAmount());
myChargingOrderInfo.setRechargeAmount(chargingOrder.getRechargeAmount());
myChargingOrderInfo.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount());
myChargingOrderInfo.setVipDiscountAmount(chargingOrder.getVipDiscountAmount());
myChargingOrderInfo.setRefundAmount(chargingOrder.getRefundAmount());
List stageCost = chargingOrderAccountingStrategyService.list(
new LambdaQueryWrapper().eq(TChargingOrderAccountingStrategy::getChargingOrderId, id)
.orderByAsc(TChargingOrderAccountingStrategy::getStartTime)
);
myChargingOrderInfo.setStageCost(stageCost);
List dataList = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData();
if(null != dataList){
//在MongoDB中获取数据
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
List dataLists = new ArrayList<>();
String t = "";
for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : dataList) {
if(!sdf.format(uploadRealTimeMonitoringData.getCreate_time()).equals(t)){
dataLists.add(uploadRealTimeMonitoringData);
t = sdf.format(uploadRealTimeMonitoringData.getCreate_time());
}
}
List time = dataLists.stream().map(s -> sdf.format(s.getCreate_time())).collect(Collectors.toList());
List outputVoltage = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_voltage).collect(Collectors.toList());
List outputCurrent = dataLists.stream().map(UploadRealTimeMonitoringData::getOutput_current).collect(Collectors.toList());
List