main^2
黄海 11 months ago
parent bca946549b
commit 24530b023d

@ -22,6 +22,7 @@ import java.util.stream.Stream;
/**
*
*
* @author hzh
* @date 2023/6/6
*/
@ -41,50 +42,73 @@ public class ManualOrderStatusHandlerController {
@ApiOperation("批量处理挂起正向订单,进行补单")
@PostMapping("/completeUnReportOrder")
public ResultVO completeUnReportOrder(String startDate,String endDate){
public ResultVO completeUnReportOrder(String startDate, String endDate) {
Date startTime = ToolDateTime.startDateByDay(new Date(), -60);
Date endTime = ToolDateTime.startDateByDay(new Date(), 0);
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
if (StringUtils.isNotEmpty(startDate)){
if (StringUtils.isNotEmpty(startDate)) {
startTime = format.parse(startDate);
}
if (StringUtils.isNotEmpty(endDate)){
if (StringUtils.isNotEmpty(endDate)) {
endTime = format.parse(endDate);
}
} catch (ParseException e) {
return ResultVO.custom("时间格式错误",500);
return ResultVO.custom("时间格式错误", 500);
}
//查询挂起订单
List<EquipmentChargeOrderDO> hangUpOrderList = equipmentChargeOrderDOMapper.queryHangUpOrder(startTime, endTime);
Stream.iterate(0, i -> i + 1).limit(hangUpOrderList.size()).forEach(i->{
List<EquipmentChargeOrderDO> hangUpOrderList = equipmentChargeOrderDOMapper.queryHangUpOrder(startTime, endTime);
Stream.iterate(0, i -> i + 1).limit(hangUpOrderList.size()).forEach(i -> {
asyncTaskService.completeUnReportOrder(hangUpOrderList.get(i));
});
return ResultVO.success();
}
//【2024-08-13 Modify by HuangHai】
@ApiOperation("批量处理挂起反向订单,进行补单")
@PostMapping("/completeUnReportReverseOrder")
public ResultVO completeUnReportReverseOrder(){
handleOrderTarckService.completeUnReportReverseOrder();
public ResultVO completeUnReportReverseOrder(String startDate, String endDate) {
Date startTime = ToolDateTime.startDateByDay(new Date(), -60);
Date endTime = ToolDateTime.startDateByDay(new Date(), 0);
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
if (StringUtils.isNotEmpty(startDate)) {
startTime = format.parse(startDate);
}
if (StringUtils.isNotEmpty(endDate)) {
endTime = format.parse(endDate);
}
} catch (ParseException e) {
return ResultVO.custom("时间格式错误", 500);
}
handleOrderTarckService.completeUnReportReverseOrder(startTime,endTime);
return ResultVO.success();
}
// @ApiOperation("批量处理挂起反向订单,进行补单")
// @PostMapping("/completeUnReportReverseOrder")
// public ResultVO completeUnReportReverseOrder(){
// handleOrderTarckService.completeUnReportReverseOrder();
// return ResultVO.success();
// }
@ApiOperation("启明:批量处理结算中正向订单,进行结算、扣费")
@PostMapping("/handleInSettlementOrder")
public ResultVO handleInSettlementOrder(String time){
public ResultVO handleInSettlementOrder(String time) {
Date endTime = new Date();
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
if (StringUtils.isNotEmpty(time)){
if (StringUtils.isNotEmpty(time)) {
endTime = format.parse(time);
}
} catch (ParseException e) {
return ResultVO.custom("时间格式错误",500);
return ResultVO.custom("时间格式错误", 500);
}
List<EquipmentChargeOrderDO> inSettlementOrderList = equipmentChargeOrderDOMapper.queryInSettlementOrder(endTime);
inSettlementOrderList.forEach(p->{asyncTaskService.handleInSettlementOrder(p.getPlatformOrderNo(),p.getPayStatus().intValue());});
List<EquipmentChargeOrderDO> inSettlementOrderList = equipmentChargeOrderDOMapper.queryInSettlementOrder(endTime);
inSettlementOrderList.forEach(p -> {
asyncTaskService.handleInSettlementOrder(p.getPlatformOrderNo(), p.getPayStatus().intValue());
});
return ResultVO.success();
}

@ -103,56 +103,70 @@ public class AsyncTaskService {
.setWorkQueue(new LinkedBlockingQueue<>(100))
.build();
// @Async(value = "asyncTaskExecutor")
public void completeUnReportOrderOld(EquipmentChargeOrderDO hangUpOrderList) {
try {
EquipmentOrder equipmentOrder = equipmentOrderDao.findOne(hangUpOrderList.getOrderNo());//查询订单下发结束命令前的最新一笔订单信息
if (equipmentOrder == null) {
log.info("completeUnReportOrder补单订单号:{},mongo未查询到信息", hangUpOrderList.getOrderNo());
equipmentChargeOrderDOMapper.setPatchStateByOrderNo(hangUpOrderList.getOrderNo());
return;
}
if (!"0".equals(hangUpOrderList.getPayStatus().toString())) {
log.info("completeUnReportOrder补单订单号:{},已经支付", hangUpOrderList.getOrderNo());
return;
}
log.info("订单号{},补单开始", hangUpOrderList.getOrderNo());
EquipmentChargeOrderDO lastOrderInfo = beforeStopLastOrderInfo(equipmentOrder, hangUpOrderList);
addSettle(lastOrderInfo, equipmentOrder, equipmentOrder.getEquipmentSn()); //补单
log.info("订单号{},补单结束", hangUpOrderList.getOrderNo());
} catch (Exception e) {
log.error("订单号" + hangUpOrderList.getOrderNo() + ",补单异常,异常信息:", e);
}
}
/**
*
*
* @param hangUpOrderList
*/
@Async(value = "asyncTaskExecutor")
public void completeUnReportOrder(EquipmentChargeOrderDO hangUpOrderList) {
//EquipmentChargeOrderDO :订单表 t_equipment_charge_order
// hangUpOrderList :似乎是挂起的订单列表,为什么是列表呢?不是一条记录,一个订单吗?
try {
//通过t_equipment_charge_order表中查找order_no=2020092315154430479
//在后到MongoDb中去查找订单信息
EquipmentOrder equipmentOrder = equipmentOrderDao.findOne(hangUpOrderList.getOrderNo());//查询订单下发结束命令前的最新一笔订单信息
if (equipmentOrder == null) {
log.info("completeUnReportOrder补单失败订单号:{},mongo未查询到信息", hangUpOrderList.getOrderNo());
//把mongo无记录的订单的状态置为需要手动补单的订单
//mysql数据表t_equipment_charge_order修改
/**
-- 0 1 2 3 4 5 6 7
UPDATE t_equipment_charge_order SET state = 6 WHERE order_no = #{orderNo}
*/
equipmentChargeOrderDOMapper.setPatchStateByOrderNo(hangUpOrderList.getOrderNo());
return;
}
/**
t_equipment_charge_order
pay_status 0 1 2 3
*/
if ("2".equals(hangUpOrderList.getPayStatus().toString())) {
log.info("completeUnReportOrder补单失败订单号:{},已经支付", hangUpOrderList.getOrderNo());
//记录日志 : t_equipment_charge_order_track
//order_no:订单号
//user_id:用户ID
//connector_sn:枪号
//state:状态 0创建中 1启动中 2充电中 3充电完成 4充电异常 5订单挂起 7结算中 101扫码启动(设备认证) 102用户启动充电 103用户主动停止
//succ_stat 操作结果 0 成功 1失败
addOrderTrack(hangUpOrderList.getOrderNo(), hangUpOrderList.getUserId(), hangUpOrderList.getConnectorId().toString(), (byte) 3, (byte) 0, "补单失败,订单已经支付,无法进行二次结算");
return;
}
//查询流水,若是已有流水,则不进行二次结算
// t_equipment_charge_order
// select count(*) from t_account_water where order_id = #{orderNo} and type = 1
// type=1 类型 0充值 1充电扣款 2充值赠送 3后台充值 4退款 5后台转出 6后台转入 7账户清零 8用户申请退款 9退款驳回
// 查询流水,若是已有流水,则不进行二次结算
Integer count = equipmentChargeOrderDOMapper.getWaterCountByOrderNo(hangUpOrderList.getOrderNo());
if(count > 0) {
if (count > 0) {
log.info("completeUnReportOrder补单失败订单号:{},订单已有流水,无法进行二次结算", hangUpOrderList.getOrderNo());
//记录日志
addOrderTrack(hangUpOrderList.getOrderNo(), hangUpOrderList.getUserId(), hangUpOrderList.getConnectorId().toString(), (byte) 3, (byte) 0, "补单失败,订单已有流水,无法进行二次结算");
return ;
return;
}
log.info("订单号{},补单开始", hangUpOrderList.getOrderNo());
//补全停止前最新一次的订单信息
//equipmentOrder : 来自MongoDb
//hangUpOrderList: 来自Mysql中需要补单的订单
EquipmentChargeOrderDO lastOrderInfo = beforeStopLastOrderInfo(equipmentOrder, hangUpOrderList);
//执行新版本的补单操作
addSettleV2(lastOrderInfo, equipmentOrder, equipmentOrder.getEquipmentSn()); //补单
log.info("订单号{},补单结束", hangUpOrderList.getOrderNo());
} catch (Exception e) {
//记录日志
addOrderTrack(hangUpOrderList.getOrderNo(), hangUpOrderList.getUserId(), hangUpOrderList.getConnectorId().toString(), (byte) 3, (byte) 0, "补单失败,补单异常,异常信息");
log.error("订单号" + hangUpOrderList.getOrderNo() + ",补单异常,异常信息:", e);
}
@ -165,14 +179,14 @@ public class AsyncTaskService {
try {
//从mongo上获取最后一次推送的账单数据
NotificationChargeOrderInfoReqMongoDO notificationChargeOrderInfoReqMongoDO = notificationChargeOrderInfoReqDao.findOne(orderDO.getOrderNo());
if(notificationChargeOrderInfoReqMongoDO != null) {
if (notificationChargeOrderInfoReqMongoDO != null) {
completeWithPushedOrder(orderDO, notificationChargeOrderInfoReqMongoDO);
return;
}
//若是没有则从mongo中获取最后一次充电中推送的数据 进行结算
ReverseOrderInfo reverseOrderInfo = reverseOrderInfoDao.findOne(orderDO.getOrderNo());
if(reverseOrderInfo != null) {
if (reverseOrderInfo != null) {
completeWithLastPushedOrder(orderDO, reverseOrderInfo);
}
@ -182,13 +196,16 @@ public class AsyncTaskService {
}
}
@Async(value = "asyncTaskExecutor")
public void handleInSettlementOrder(String startChargeSeq,Integer payStatus){
openApiServiceApi.handleInSettlementOrder(startChargeSeq,payStatus);
public void handleInSettlementOrder(String startChargeSeq, Integer payStatus) {
openApiServiceApi.handleInSettlementOrder(startChargeSeq, payStatus);
}
/**
*
* @param orderDO
*
* @param orderDO
* @param reverseOrderInfo
*/
private void completeWithLastPushedOrder(EquipmentChargeOrderDO orderDO, ReverseOrderInfo reverseOrderInfo) {
@ -220,7 +237,8 @@ public class AsyncTaskService {
/**
*
* @param orderDO
*
* @param orderDO
* @param pushedOrderDO
*/
private void completeWithPushedOrder(EquipmentChargeOrderDO orderDO, NotificationChargeOrderInfoReqMongoDO pushedOrderDO) {
@ -285,7 +303,7 @@ public class AsyncTaskService {
joinActivityRebate(orderDTO.getUserId().toString(), orderDO.getOrderNo(), "0", "0", "", "1");
//推送碳大脑
if (flag){
if (flag) {
openApiServiceApi.pushOrderCarbonCrain(orderDO.getOrderNo());
}
@ -301,6 +319,7 @@ public class AsyncTaskService {
/**
*
*
* @return
*/
private EquipmentChargeOrderDO updateOrderOutlayInfoReverseV2(NotifyChargeOrderInfoBO notifyChargeOrderInfoBO, EquipmentChargeOrderDTO orderDTO, EquipmentChargeOrderDO orderInfo) {
@ -364,7 +383,8 @@ public class AsyncTaskService {
/**
* -
* @param orderNo
*
* @param orderNo
* @param chargeDetail
*/
private void insertOrderDetailReverse(String orderNo, List<ChargeDetailDTO> chargeDetail) {
@ -406,8 +426,8 @@ public class AsyncTaskService {
long chargeStartTime = getCurrentMinute(chargeDetail.get(i).getDetailStartTime());
//查询当前的detail的开始时间的所属计费时段
for(PriceRule priceRule : lpr) {
if(priceRule.getStartTime().longValue() <= chargeStartTime && priceRule.getEndTime().longValue() > chargeStartTime) {
for (PriceRule priceRule : lpr) {
if (priceRule.getStartTime().longValue() <= chargeStartTime && priceRule.getEndTime().longValue() > chargeStartTime) {
timeFlag = priceRule.getTimeFlag();
}
}
@ -431,6 +451,7 @@ public class AsyncTaskService {
/**
*
*
* @param detailStartTime
* @return
*/
@ -528,37 +549,59 @@ public class AsyncTaskService {
*
*/
public EquipmentChargeOrderDO beforeStopLastOrderInfo(EquipmentOrder equipmentOrder, EquipmentChargeOrderDO orderInfo) {
//处理分时段电量, 通俗点说就是把一个Double[]转化为一个以逗号分隔开的字符串
String timeShare = timeShareComputeStr(equipmentOrder.getMultiChargeDegree());
orderInfo.setChargeBeginTime(Optional.ofNullable(equipmentOrder.getChargeBeginTime()).orElse(orderInfo.getChargeBeginTime()));
//充电分时度数
orderInfo.setChargeTimesDegree(timeShare);
//充电开始时间
orderInfo.setChargeBeginTime(Optional.ofNullable(equipmentOrder.getChargeBeginTime()).orElse(orderInfo.getChargeBeginTime()));
//充电结束时间
orderInfo.setChargeEndTime(equipmentOrder.getChargeEndTime());
//充电时长
orderInfo.setChargeDuration(equipmentOrder.getChargeDuration());
//充电开始度数
orderInfo.setChargeBeginDegree(equipmentOrder.getChargeBeginDegree());
//充电结束度数
orderInfo.setChargeEndDegree(equipmentOrder.getChargeEndDegree());
//充电度数
orderInfo.setChargeDegree(equipmentOrder.getChargeDegree());
//充电开始soc
orderInfo.setChargeBeginSoc(Double.valueOf(equipmentOrder.getChargeBeginSoc()).intValue());
//充电结束soc
orderInfo.setChargeEndSoc(Double.valueOf(equipmentOrder.getChargeEndSoc()).intValue());
//充电当前soc
orderInfo.setChargeCurSoc(Double.valueOf(equipmentOrder.getChargeEndSoc()).intValue());
//充电策略
orderInfo.setChargeStrategy(equipmentOrder.getChargeStrategy());
//充电策略参数
orderInfo.setChargeStrategyParam(equipmentOrder.getChargeStrategyParam());
//启动方式 0本地刷卡启动 1后台启动 2本地管理员启动
orderInfo.setBootMode(equipmentOrder.getBootMode());
//车辆vin码
orderInfo.setChargeVin(equipmentOrder.getChargeVin());
//充电电量
orderInfo.setChargeAh(equipmentOrder.getChargeDegree() * 100);
//结束编码
orderInfo.setFinishCode(44);
//结束类型
orderInfo.setFinishType(2);
//结束原因
orderInfo.setFinishMsg("补单结束");
//订单结束时间
orderInfo.setFinishTime(ToolDateTime.getDate());
return orderInfo;
}
/**
*
* @param orderNo
* @param userId id
*
* @param orderNo
* @param userId id
* @param connectorSn
* @param state 0 1 2 3 4 5 101() 102 103
* @param succStat 0 1
* @param failReason
* @param state 0 1 2 3 4 5 101() 102 103
* @param succStat 0 1
* @param failReason
*/
public void addOrderTrack(String orderNo, Long userId, String connectorSn, Byte state, Byte succStat, String failReason) {
EquipmentChargeOrderTrackDO trackDO = new EquipmentChargeOrderTrackDO();
@ -605,8 +648,8 @@ public class AsyncTaskService {
if (settle.getCode() != 1000 || settle.getData() == null) {
// hangOrder(orderInfo.getOrderNo(), "补单结算失败,计费失败,原因:" + settle.getMsg(), settle.getCode());
log.error("补单结算订单:{}计费失败,原因:{}", orderInfo.getOrderNo(), settle.getMsg());
addOrderTrack(orderInfo.getOrderNo(), orderInfo.getUserId(), orderInfo.getConnectorId().toString(), (byte)3, (byte) 0, "补单结算失败,计费失败,原因:" + settle.getMsg());
return ;
addOrderTrack(orderInfo.getOrderNo(), orderInfo.getUserId(), orderInfo.getConnectorId().toString(), (byte) 3, (byte) 0, "补单结算失败,计费失败,原因:" + settle.getMsg());
return;
}
//获取订单返回的计费信息
@ -650,7 +693,7 @@ public class AsyncTaskService {
joinActivityRebate(orderInfo.getUserId().toString(), orderInfo.getOrderNo(), "0", "0", "", "1");
//推送碳大脑
if (flag){
if (flag) {
openApiServiceApi.pushOrderCarbonCrain(orderInfo.getOrderNo());
}
}
@ -667,6 +710,7 @@ public class AsyncTaskService {
/**
* orderDTO
*
* @param settle
* @return
*/
@ -679,6 +723,7 @@ public class AsyncTaskService {
/**
*
*
* @param orderDTO
* @param orderInfo
* @return
@ -718,11 +763,11 @@ public class AsyncTaskService {
orderInfo.setUpdateTime(now);
//若是有使用优惠券,则进行优惠券的处理
if(orderDTO.getUserCouponId() != null && orderDTO.getUserCouponId() != 0) {
if (orderDTO.getUserCouponId() != null && orderDTO.getUserCouponId() != 0) {
UserCouponDO userCouponDO = userCouponDOMapper.selectByPrimaryKey(orderDTO.getUserCouponId());
//无限制优惠券不更新状态
//非无限制的优惠券才进行优惠券状态的更新
if(userCouponDO.getIsLimitNum() != 1) {
if (userCouponDO.getIsLimitNum() != 1) {
userCouponDO.setState("1");
userCouponDO.setUtilityTime(DateUtil.formatDateTime(now));
userCouponDO.setUpdateTime(now);
@ -733,7 +778,7 @@ public class AsyncTaskService {
equipmentChargeOrderDOMapper.updateByPrimaryKeySelective(orderInfo);
//插入详单数据
if(orderDTO.getChargeSettleType() == 2 && orderDTO.getDetailDOList().size() > 0) {
if (orderDTO.getChargeSettleType() == 2 && orderDTO.getDetailDOList().size() > 0) {
equipmentChargeOrderDetailDOMapper.insertList(orderDTO.getDetailDOList());
}
@ -742,7 +787,8 @@ public class AsyncTaskService {
/**
*
* @param orderDTO
*
* @param orderDTO
* @param orderInfo
*/
private EquipmentChargeOrderDO updateOrderSettleInfoV2(EquipmentChargeOrderDTO orderDTO, EquipmentChargeOrderDO orderInfo) {
@ -773,12 +819,13 @@ public class AsyncTaskService {
/**
*
*
* @param chargeTimesDegree
* @return
*/
private Double[] getFinalChargeTimesDegree(double[] chargeTimesDegree) {
Double[] timeShare = new Double[chargeTimesDegree.length];
for (int i = 0; i < chargeTimesDegree.length; i++){
for (int i = 0; i < chargeTimesDegree.length; i++) {
timeShare[i] = chargeTimesDegree[i];
}
return timeShare;
@ -786,8 +833,9 @@ public class AsyncTaskService {
/**
*
*
* @param orderNo
* @param msg
* @param msg
* @param code
*/
private void hangOrder(String orderNo, String msg, Integer code) {
@ -1005,6 +1053,7 @@ public class AsyncTaskService {
/**
*
*
* @param orderDTO
* @param orderInfo
*/

@ -171,10 +171,16 @@ public class HandleOrderTarckService {
});
}
//【2024-08-13 Modify by HuangHai】
/**
*
*/
public void completeUnReportReverseOrder() {
public void completeUnReportReverseOrder(){
Date startDate = ToolDateTime.startDateByDay(new Date(), -60);
Date endDate = ToolDateTime.startDateByDay(new Date(), 0);
completeUnReportReverseOrder(startDate,endDate);
}
public void completeUnReportReverseOrder(Date startDate,Date endDate) {
//处理指定 ~ 指定时间三天前 时间内的反向挂起的订单
// #{code} = push_reverse_orders.duration
// select value from t_biz_parameter where state = 1 and code = #{code} order by id desc limit 1
@ -182,8 +188,8 @@ public class HandleOrderTarckService {
// 返回值 72 小时
String time = equipmentChargeOrderDOMapper.getReverseFinishTime(Constant.REVERSE_ORDER_TIME);
int hour = new BigDecimal(time).intValue();
Date startDate = DateUtil.offset(new Date(), DateField.HOUR_OF_DAY, -(hour + 720));//33天之内的
Date endDate = DateUtil.offset(new Date(), DateField.HOUR_OF_DAY, -hour);//72小时前也就是3天前
//Date startDate = DateUtil.offset(new Date(), DateField.HOUR_OF_DAY, -(hour + 720));//33天之内的
//Date endDate = DateUtil.offset(new Date(), DateField.HOUR_OF_DAY, -hour);//72小时前也就是3天前
//查询这段时间内挂起的工单
/**
<select id="queryHangUpReverseOrder" resultMap="BaseResultMap">

Loading…
Cancel
Save