package com.ruoyi.order.util.task;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson2.util.UUIDUtils;
|
import com.alibaba.nacos.common.utils.UuidUtils;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
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.StringUtils;
|
import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
|
import com.ruoyi.integration.api.model.TransactionRecord;
|
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
|
import com.ruoyi.order.api.model.TChargingBill;
|
import com.ruoyi.order.api.model.TChargingOrder;
|
import com.ruoyi.order.api.model.TChargingOrderRefund;
|
import com.ruoyi.order.api.vo.TransactionRecordMessageVO;
|
import com.ruoyi.order.service.TChargingBillService;
|
import com.ruoyi.order.service.TChargingOrderRefundService;
|
import com.ruoyi.order.service.TChargingOrderService;
|
import com.ruoyi.order.util.mongodb.service.TransactionRecordService;
|
import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.logging.log4j.core.util.UuidUtil;
|
import org.apache.poi.util.StringUtil;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.boot.web.context.WebServerInitializedEvent;
|
import org.springframework.context.ApplicationListener;
|
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.Resource;
|
import java.time.LocalDate;
|
import java.time.LocalDateTime;
|
import java.time.ZoneId;
|
import java.time.format.DateTimeFormatter;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Random;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author zhibing.pu
|
* @date 2023/7/11 8:39
|
*/
|
@Slf4j
|
@Component
|
public class TaskUtil implements ApplicationListener<WebServerInitializedEvent> {
|
|
@Resource
|
private TChargingBillService chargingBillService;
|
@Resource
|
private SiteClient siteClient;
|
@Resource
|
private TChargingOrderService chargingOrderService;
|
|
@Resource
|
private TChargingOrderRefundService chargingOrderRefundService;
|
|
@Resource
|
private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService;
|
|
@Resource
|
private TransactionRecordService transactionRecordService;
|
|
private Integer port = null;
|
|
|
//十分钟循环执行的定时任务
|
@Scheduled(fixedRate = 1000 * 60 * 10)
|
public void taskTenMinutes() {
|
if(null != port && port == 5400){
|
List<TChargingOrder> failedStartupOrder = chargingOrderService.findFailedStartupOrder();
|
log.info("定时任务执行,查询到启动失败的订单数量:{}", failedStartupOrder.size());
|
for (TChargingOrder order : failedStartupOrder) {
|
//查询是否有充电信息
|
List<UploadRealTimeMonitoringData> dataByOrderCode = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode());
|
log.info("充电实时数据:{}", JSON.toJSONString(dataByOrderCode));
|
//没有充电数据,则执行退款
|
if(null == dataByOrderCode || dataByOrderCode.isEmpty()){
|
log.info("定时任务执行,查询到启动失败的订单,执行退款:{}", order.getCode());
|
chargingOrderService.refund(order.getCode());
|
int num = 0;
|
while (true){
|
TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getChargingOrderId, order.getId()));
|
if(null != one && 2 == one.getRefundStatus()){
|
order.setStatus(-1);
|
chargingOrderService.updateById(order);
|
break;
|
}
|
try {
|
Thread.sleep(5000);
|
} catch (InterruptedException e) {
|
throw new RuntimeException(e);
|
}
|
num++;
|
if(num > 10){
|
break;
|
}
|
}
|
}
|
}
|
//处理退款中的数据
|
List<TChargingOrder> stoppedOrder = chargingOrderService.findStoppedOrder();
|
log.info("定时任务执行,查询到停止中的订单数量:{}", stoppedOrder.size());
|
for (TChargingOrder order : stoppedOrder) {
|
TransactionRecord one = transactionRecordService.findOne(order.getCode());
|
if(null != one){
|
log.info("定时任务执行,查询到停止中的订单账单数据:{}", JSON.toJSONString(one));
|
TransactionRecordMessageVO vo = new TransactionRecordMessageVO();
|
BeanUtils.copyProperties(one, vo);
|
R r = chargingOrderService.endChargeBillingCharge(vo);
|
log.info("定时任务执行,停止中的订单处理结果:{}", JSON.toJSONString(r));
|
}
|
}
|
//处理状态为充电中,但硬件已完成的订单
|
List<TChargingOrder> chargingOrder = chargingOrderService.findChargingOrder();
|
log.info("定时任务执行,查询到充电中的订单数量:{}", chargingOrder.size());
|
for (TChargingOrder order : chargingOrder) {
|
TransactionRecord one = transactionRecordService.findOne(order.getCode());
|
if(null != one && StringUtils.isNotEmpty(one.getResult())){
|
log.info("定时任务执行,查询到充电中的订单账单数据:{}", JSON.toJSONString(one));
|
TransactionRecordMessageVO vo = new TransactionRecordMessageVO();
|
BeanUtils.copyProperties(one, vo);
|
R r = chargingOrderService.endChargeBillingCharge(vo);
|
log.info("定时任务执行,充电中的订单处理结果:{}", JSON.toJSONString(r));
|
}
|
}
|
}
|
}
|
|
|
@Scheduled(cron = "0 0 0 2 * ?")
|
public void taskMonth() {
|
if(null != port && port == 5400){
|
try {
|
// 获取上个月的开始和结束日期
|
LocalDate firstDayOfLastMonth = LocalDate.now().minusMonths(1).
|
withDayOfMonth(2);
|
String string = firstDayOfLastMonth.toString();
|
// 将-替换为空字符串
|
string = string.replace("-", "");
|
// 生成一次全站订单
|
TChargingBill tChargingBill = new TChargingBill();
|
// 订单生成规则JSD+20231201(账单所属月份)+1131304205(随机10位数)+001(当月账单序号,每月重置)
|
Random random = new Random();
|
String randomDigits = random.ints(10, 0, 10) // 生成10个随机数字,范围在0-9
|
.mapToObj(String::valueOf)
|
.collect(Collectors.joining()); // 将其连接成一个字符串
|
tChargingBill.setCode("JSD"+string+randomDigits );
|
tChargingBill.setType(1);
|
tChargingBill.setSiteId(0);
|
tChargingBill.setBillTime(LocalDateTime.now());
|
tChargingBill.setStatus(1);
|
tChargingBill.setOrderState(2);
|
tChargingBill.setBillType(1);
|
System.err.println("定时任务生成充电算帐单:全站");
|
chargingBillService.save(tChargingBill);
|
// 生成一次全站订单
|
TChargingBill tChargingBill1 = new TChargingBill();
|
// 订单生成规则JSD+20231201(账单所属月份)+1131304205(随机10位数)+001(当月账单序号,每月重置)
|
Random random1 = new Random();
|
String randomDigits1 = random1.ints(10, 0, 10) // 生成10个随机数字,范围在0-9
|
.mapToObj(String::valueOf)
|
.collect(Collectors.joining()); // 将其连接成一个字符串
|
tChargingBill1.setCode("JSD"+string+randomDigits1 );
|
tChargingBill1.setType(1);
|
tChargingBill1.setSiteId(0);
|
tChargingBill1.setBillTime(LocalDateTime.now());
|
tChargingBill1.setStatus(1);
|
tChargingBill1.setOrderState(2);
|
tChargingBill1.setBillType(2);
|
System.err.println("定时任务生成账户结算帐单:全站");
|
chargingBillService.save(tChargingBill1);
|
System.err.println("定时任务生成各个站点结算帐单");
|
List<Integer> collect = siteClient.getSiteAll().getData().stream().map(Site::getId).collect(Collectors.toList());
|
// 充电算帐单
|
List<TChargingBill> tChargingBills = new ArrayList<>();
|
// 账户结算账单
|
List<TChargingBill> tChargingBills1 = new ArrayList<>();
|
for (int i = 0; i < collect.size(); i++) {
|
TChargingBill tChargingBill2 = new TChargingBill();
|
Random random2 = new Random();
|
String randomDigits2 = random2.ints(10, 0, 10) // 生成10个随机数字,范围在0-9
|
.mapToObj(String::valueOf)
|
.collect(Collectors.joining()); // 将其连接成一个字符串
|
tChargingBill2.setCode("JSD"+string+randomDigits2+(i+1) );
|
tChargingBill2.setType(2);
|
List<TChargingOrder> list = chargingOrderService.lambdaQuery()
|
.eq(TChargingOrder::getSiteId, collect.get(i)).list();
|
if (list.isEmpty()){
|
continue;
|
}
|
tChargingBill2.setSiteId(collect.get(i));
|
tChargingBill2.setBillTime(LocalDateTime.now());
|
tChargingBill2.setBillType(1);
|
tChargingBill2.setStatus(1);
|
tChargingBill2.setOrderState(2);
|
tChargingBills.add(tChargingBill2);
|
TChargingBill tChargingBill3 = new TChargingBill();
|
Random random3 = new Random();
|
String randomDigits3 = random3.ints(10, 0, 10) // 生成10个随机数字,范围在0-9
|
.mapToObj(String::valueOf)
|
.collect(Collectors.joining()); // 将其连接成一个字符串
|
tChargingBill3.setCode("JSD"+string+randomDigits3+(i+1) );
|
tChargingBill3.setType(2);
|
tChargingBill3.setSiteId(collect.get(i));
|
tChargingBill3.setBillTime(LocalDateTime.now());
|
tChargingBill3.setBillType(2);
|
tChargingBill3.setStatus(1);
|
tChargingBill3.setOrderState(2);
|
tChargingBills1.add(tChargingBill3);
|
}
|
System.err.println("列表"+tChargingBills);
|
if (!tChargingBills.isEmpty())chargingBillService.saveBatch(tChargingBills);
|
if (!tChargingBills1.isEmpty())chargingBillService.saveBatch(tChargingBills1);
|
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
// 每个月最后一天23点执行的定时任务
|
@Scheduled(cron = "0 0 23 * * ?")
|
public void taskLastDay() {
|
if(null != port && port == 5400){
|
try {
|
// 获取上个月的开始和结束日期
|
LocalDate firstDayOfLastMonth = LocalDate.now().minusMonths(1).
|
withDayOfMonth(1);
|
LocalDate lastDayOfLastMonth = LocalDate.now().minusMonths(1).
|
withDayOfMonth(firstDayOfLastMonth.lengthOfMonth());
|
// 将 LocalDate 转换为 LocalDateTime,并设定时间为一天的开始
|
LocalDateTime startDateTime = firstDayOfLastMonth.atStartOfDay();
|
LocalDateTime endDateTime = lastDayOfLastMonth.atTime(23, 59, 59); // 设定到最后一秒
|
// 构建查询条件
|
LambdaQueryWrapper<TChargingBill> queryWrapper = new LambdaQueryWrapper<>();
|
queryWrapper.ge(TChargingBill::getBillTime,
|
Date.from(startDateTime.atZone(ZoneId.systemDefault()).toInstant()))
|
.le(TChargingBill::getBillTime,
|
Date.from(endDateTime.atZone(ZoneId.systemDefault()).toInstant())); // 使用 le 包括最后一天的记录
|
List<TChargingBill> list = chargingBillService.list(queryWrapper);
|
for (TChargingBill tChargingBill : list) {
|
tChargingBill.setStatus(2);
|
}
|
chargingBillService.updateBatchById(list);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
@Override
|
public void onApplicationEvent(WebServerInitializedEvent event) {
|
port = event.getWebServer().getPort();
|
System.out.println("端口号:" + port);
|
}
|
}
|