From 357a487c7cfa0bca316e25b260154658f9592ea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Mon, 12 Aug 2024 14:50:42 +0800 Subject: [PATCH] 'commit' --- .../ChargeOrderMannageController.java | 4 - .../task/service/HandleOrderTarckService.java | 559 ++++++++++-------- 业务梳理/关于补单操作.md | 93 +++ ...特收到的需求、分析与现状.docx | Bin 658838 -> 659073 bytes 4 files changed, 395 insertions(+), 261 deletions(-) create mode 100644 业务梳理/关于补单操作.md diff --git a/Ylt/ms-admin/src/main/java/com/charge/orderbk/controller/ChargeOrderMannageController.java b/Ylt/ms-admin/src/main/java/com/charge/orderbk/controller/ChargeOrderMannageController.java index 41b78aa..29055da 100644 --- a/Ylt/ms-admin/src/main/java/com/charge/orderbk/controller/ChargeOrderMannageController.java +++ b/Ylt/ms-admin/src/main/java/com/charge/orderbk/controller/ChargeOrderMannageController.java @@ -1,7 +1,6 @@ package com.charge.orderbk.controller; import com.charge.orderbk.client.TaskServiceApi; -import com.charge.orderbk.dao.StationDOMapper; import com.github.pagehelper.PageInfo; import com.charge.orderbk.model.*; import com.charge.orderbk.service.ChargeOrderMannageService; @@ -22,9 +21,6 @@ public class ChargeOrderMannageController { @Autowired ChargeOrderMannageService chargeOrderMannageService; - @Autowired - StationDOMapper stationDOMapper; - @Autowired private TaskServiceApi taskServiceApi; /** diff --git a/Ylt/ms-task/src/main/java/com/charge/task/service/HandleOrderTarckService.java b/Ylt/ms-task/src/main/java/com/charge/task/service/HandleOrderTarckService.java index 713027a..ccb4be6 100644 --- a/Ylt/ms-task/src/main/java/com/charge/task/service/HandleOrderTarckService.java +++ b/Ylt/ms-task/src/main/java/com/charge/task/service/HandleOrderTarckService.java @@ -96,33 +96,35 @@ public class HandleOrderTarckService { .build(); - /**处理未上报的订单 将它挂起*/ - public void handleUnReportOrder(){ + /** + * 处理未上报的订单 将它挂起 + */ + public void handleUnReportOrder() { List unReportedOrderList = equipmentChargeOrderTrackDOMapper.queryUnReportedOrder(ToolDateTime.curTimeAgo(2));/**查询卡单信息*/ - Stream.iterate(0,i->i+1).limit(unReportedOrderList.size()).forEach(i->{ - EquipmentChargeOrderDO queryParam = new EquipmentChargeOrderDO(); + Stream.iterate(0, i -> i + 1).limit(unReportedOrderList.size()).forEach(i -> { + EquipmentChargeOrderDO queryParam = new EquipmentChargeOrderDO(); queryParam.setOrderNo(unReportedOrderList.get(i)); EquipmentChargeOrderDO equipmentChargeOrderDO = equipmentChargeOrderDOMapper.selectOne(queryParam); - if (equipmentChargeOrderDO != null){ - if ("2".equals(equipmentChargeOrderDO.getPayStatus().toString())){ - equipmentChargeOrderDO.setState((byte)3); + if (equipmentChargeOrderDO != null) { + if ("2".equals(equipmentChargeOrderDO.getPayStatus().toString())) { + equipmentChargeOrderDO.setState((byte) 3); equipmentChargeOrderDO.setFinishCode(200); equipmentChargeOrderDO.setCancelCode(6); equipmentChargeOrderDO.setCancelType(4); equipmentChargeOrderDO.setCancelTime(ToolDateTime.getDate()); equipmentChargeOrderDO.setCancelMsg("已结束订单又被唤起"); - equipmentChargeOrderDO.setId(equipmentChargeOrderDO.getId()); - equipmentChargeOrderDO.setUpdateTime(ToolDateTime.getDate()); + equipmentChargeOrderDO.setId(equipmentChargeOrderDO.getId()); + equipmentChargeOrderDO.setUpdateTime(ToolDateTime.getDate()); equipmentChargeOrderDOMapper.updateByPrimaryKeySelective(equipmentChargeOrderDO); } - if ("0".equals(equipmentChargeOrderDO.getPayStatus().toString())){ - equipmentChargeOrderDO.setState((byte)5); + if ("0".equals(equipmentChargeOrderDO.getPayStatus().toString())) { + equipmentChargeOrderDO.setState((byte) 5); equipmentChargeOrderDO.setCancelCode(5); equipmentChargeOrderDO.setCancelType(3); equipmentChargeOrderDO.setCancelTime(ToolDateTime.getDate()); equipmentChargeOrderDO.setCancelMsg("订单挂起"); - equipmentChargeOrderDO.setId(equipmentChargeOrderDO.getId()); - equipmentChargeOrderDO.setUpdateTime(ToolDateTime.getDate()); + equipmentChargeOrderDO.setId(equipmentChargeOrderDO.getId()); + equipmentChargeOrderDO.setUpdateTime(ToolDateTime.getDate()); equipmentChargeOrderDOMapper.updateByPrimaryKeySelective(equipmentChargeOrderDO); // 共享用户,挂起订单解冻用户 UserDO userDO = userDOMapper.querUserInfoById(equipmentChargeOrderDO.getUserId().intValue()); @@ -133,7 +135,9 @@ public class HandleOrderTarckService { } - /**批量处理挂起订单,进行补单*/ + /** + * 批量处理挂起订单,进行补单 + */ // public void completeUnReportOrder(){ // List hangUpOrderList = equipmentChargeOrderDOMapper.queryHangUpOrder();//查询挂起订单 // Stream.iterate(0,i->i+1).limit(hangUpOrderList.size()).forEach(i->{ @@ -144,12 +148,11 @@ public class HandleOrderTarckService { // } // }); // } - - public void completeUnReportOrder(){ + public void completeUnReportOrder() { Date startDate = ToolDateTime.startDateByDay(new Date(), -1); Date endDate = ToolDateTime.endDateByDay(startDate); - List hangUpOrderList = equipmentChargeOrderDOMapper.queryHangUpOrder(startDate, endDate);//查询挂起订单 - Stream.iterate(0,i->i+1).limit(hangUpOrderList.size()).forEach(i->{ + List hangUpOrderList = equipmentChargeOrderDOMapper.queryHangUpOrder(startDate, endDate);//查询挂起订单 + Stream.iterate(0, i -> i + 1).limit(hangUpOrderList.size()).forEach(i -> { asyncTaskService.completeUnReportOrder(hangUpOrderList.get(i)); }); } @@ -157,13 +160,13 @@ public class HandleOrderTarckService { /** * 新版本计算补单 */ - public void completeUnReportOrderV2(){ + public void completeUnReportOrderV2() { //处理前60天的挂起订单 Date startDate = ToolDateTime.startDateByDay(new Date(), -60); Date endDate = ToolDateTime.startDateByDay(new Date(), 0); // Date endDate = ToolDateTime.endDateByDay(new Date()); - List hangUpOrderList = equipmentChargeOrderDOMapper.queryHangUpOrder(startDate, endDate);//查询挂起订单 - Stream.iterate(0, i -> i + 1).limit(hangUpOrderList.size()).forEach(i->{ + List hangUpOrderList = equipmentChargeOrderDOMapper.queryHangUpOrder(startDate, endDate);//查询挂起订单 + Stream.iterate(0, i -> i + 1).limit(hangUpOrderList.size()).forEach(i -> { asyncTaskService.completeUnReportOrder(hangUpOrderList.get(i)); }); } @@ -173,18 +176,42 @@ public class HandleOrderTarckService { */ public void completeUnReportReverseOrder() { //处理指定 ~ 指定时间三天前 时间内的反向挂起的订单 + // #{code} = push_reverse_orders.duration + // select value from t_biz_parameter where state = 1 and code = #{code} order by id desc limit 1 + // select value from t_biz_parameter where state = 1 and code = 'push_reverse_orders.duration' order by id desc limit 1 + // 返回值 : 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)); - Date endDate = DateUtil.offset(new Date(), DateField.HOUR_OF_DAY, -hour); - - List hangUpOrderList = equipmentChargeOrderDOMapper.queryHangUpReverseOrder(startDate, endDate);//查询挂起订单 - Stream.iterate(0, i -> i + 1).limit(hangUpOrderList.size()).forEach(i->{ + 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天前 + //查询这段时间内挂起的工单 + /** + + + o.state = 5 订单状态 0 创建中 1准备充电中 2 充电中 3完成 4 取消 5挂起 6需要手动补单 7结算中 + is_hlht=1 是否是互联互通站点 1是 0不是 , 注意:这里只处理了互联互通的!因为is_hlht=1,也就是说不是互联互通的挂单,调用这个接口补单是无效的!!! + */ + List hangUpOrderList = equipmentChargeOrderDOMapper.queryHangUpReverseOrder(startDate, endDate);//查询挂起订单 + + Stream.iterate(0, i -> i + 1).limit(hangUpOrderList.size()).forEach(i -> { CompletableFuture> sendCoupon = CompletableFuture.supplyAsync(() -> { + //处理挂起订单进行补单 asyncTaskService.completeUnReportReverseOrder(hangUpOrderList.get(i)); return null; }, handleReverseService); - }); } @@ -194,18 +221,20 @@ public class HandleOrderTarckService { public void handleInSettlementOrder() { //指定时间,24小时之前结算中的订单 Date time = DateUtil.offset(new Date(), DateField.HOUR_OF_DAY, -24); - List inSettlementOrderList = equipmentChargeOrderDOMapper.queryInSettlementOrder(time); - inSettlementOrderList.forEach(p->{ + List inSettlementOrderList = equipmentChargeOrderDOMapper.queryInSettlementOrder(time); + inSettlementOrderList.forEach(p -> { try { - asyncTaskService.handleInSettlementOrder(p.getPlatformOrderNo(),p.getPayStatus().intValue()); - }catch (Exception e){ - log.error("处理结算中正向订单失败,原因:{}",e); + asyncTaskService.handleInSettlementOrder(p.getPlatformOrderNo(), p.getPayStatus().intValue()); + } catch (Exception e) { + log.error("处理结算中正向订单失败,原因:{}", e); } }); } - /**补单结算*/ - public void addSettle(EquipmentChargeOrderDO orderInfo,EquipmentOrder equipmentOrder,String equipmentSn){ + /** + * 补单结算 + */ + public void addSettle(EquipmentChargeOrderDO orderInfo, EquipmentOrder equipmentOrder, String equipmentSn) { String chargeDegree = orderInfo.getChargeDegree().toString(); String chargeBeginTime = ToolDateTime.dateToDateString(orderInfo.getChargeBeginTime()); String chargeEndTime = ToolDateTime.dateToDateString(orderInfo.getChargeEndTime()); @@ -217,144 +246,150 @@ public class HandleOrderTarckService { String actualPayAmount = settleValue.optString("fee"); String orderNo = orderInfo.getOrderNo(); if ("1000".equals(settleCode)) { - orderInfo = settle(orderInfo,settleValue); + orderInfo = settle(orderInfo, settleValue); JSONObject outlayValue = financeServiceApi.chargeOrderOutlay(actualPayAmount, - orderNo, - activityFee, - isActivity, - orderInfo.getChargeServiceAmount().toString(), - Double.valueOf(chargeDegree), - orderInfo.getReceivableTotalFee().toString());//充电扣费 + orderNo, + activityFee, + isActivity, + orderInfo.getChargeServiceAmount().toString(), + Double.valueOf(chargeDegree), + orderInfo.getReceivableTotalFee().toString());//充电扣费 String outlayCode = outlayValue.optString("code"); if ("1000".equals(outlayCode)) { - orderInfo = outlay(orderInfo,outlayValue); + orderInfo = outlay(orderInfo, outlayValue); equipmentChargeOrderDOMapper.updateByPrimaryKeySelective(orderInfo); //补单后推送账单 - hlhtMqProducer.chargeBillsProducer(msgMq( equipmentOrder, chargeBeginTime, chargeEndTime, orderNo, chargeDegree, - equipmentSn, chargeTimesDegree)); + hlhtMqProducer.chargeBillsProducer(msgMq(equipmentOrder, chargeBeginTime, chargeEndTime, orderNo, chargeDegree, + equipmentSn, chargeTimesDegree)); } } } - /**补全订单的计费信息*/ - private EquipmentChargeOrderDO settle(EquipmentChargeOrderDO orderInfo, JSONObject settleValue){ + /** + * 补全订单的计费信息 + */ + private EquipmentChargeOrderDO settle(EquipmentChargeOrderDO orderInfo, JSONObject settleValue) { String invoiceFee = settleValue.optString("invoiceFee"); String totalElectricFee = settleValue.optString("electricFee"); String totalServiceFee = settleValue.optString("serviceFee"); String chargeSettleType = settleValue.optString("chargeSettleType"); BigDecimal serviceFee = new BigDecimal(totalServiceFee); - String receivableElectricFee = settleValue.optString("oriElectricFee");//应收电费 - String receivableServiceFee = settleValue.optString("oriServiceFee");//应收服务费 - String receivableTotalFee = settleValue.optString("oriTotalFee");//应收总金额 - Integer settleFlag = settleValue.optInt("settleFlag"); - String activityServiceFee = settleValue.optString("activityServiceFee"); - String activityElectricFee = settleValue.optString("activityElectricFee"); - String chargeUnitServiceFee = settleValue.optString("serviceFeeUnitPrice"); - String chargeUnitPrice = settleValue.optString("electricityBill"); - String chargeUnitCost = settleValue.optString("costUnitPrice"); - String chargeElecfeeCostAmount = settleValue.optString("costFee"); - String chargeElecfeeCostAmounts = settleValue.optString("totalCostFee"); - Object orderDetail = settleValue.opt("detail"); - orderInfo.setState((byte)3); + String receivableElectricFee = settleValue.optString("oriElectricFee");//应收电费 + String receivableServiceFee = settleValue.optString("oriServiceFee");//应收服务费 + String receivableTotalFee = settleValue.optString("oriTotalFee");//应收总金额 + Integer settleFlag = settleValue.optInt("settleFlag"); + String activityServiceFee = settleValue.optString("activityServiceFee"); + String activityElectricFee = settleValue.optString("activityElectricFee"); + String chargeUnitServiceFee = settleValue.optString("serviceFeeUnitPrice"); + String chargeUnitPrice = settleValue.optString("electricityBill"); + String chargeUnitCost = settleValue.optString("costUnitPrice"); + String chargeElecfeeCostAmount = settleValue.optString("costFee"); + String chargeElecfeeCostAmounts = settleValue.optString("totalCostFee"); + Object orderDetail = settleValue.opt("detail"); + orderInfo.setState((byte) 3); orderInfo.setChargeServiceAmount(serviceFee); orderInfo.setChargeElecfeeAmount(new BigDecimal(totalElectricFee)); orderInfo.setChargeSettleType(Byte.parseByte(chargeSettleType)); orderInfo.setInvoiceFee(new BigDecimal(invoiceFee)); - orderInfo.setTicketStatus((byte)0); - orderInfo.setActivityServiceFee(new BigDecimal(activityServiceFee)); - orderInfo.setActivityElectricFee(new BigDecimal(activityElectricFee)); - orderInfo.setSettlementType(settleFlag.byteValue()); - orderInfo.setReceivableElectricFee(new BigDecimal(receivableElectricFee)); - orderInfo.setReceivableServiceFee(new BigDecimal(Double.parseDouble(receivableServiceFee))); - orderInfo.setReceivableTotalFee(new BigDecimal(Double.parseDouble(receivableTotalFee))); - if ("1".equals(chargeSettleType)){ //全时段 + orderInfo.setTicketStatus((byte) 0); + orderInfo.setActivityServiceFee(new BigDecimal(activityServiceFee)); + orderInfo.setActivityElectricFee(new BigDecimal(activityElectricFee)); + orderInfo.setSettlementType(settleFlag.byteValue()); + orderInfo.setReceivableElectricFee(new BigDecimal(receivableElectricFee)); + orderInfo.setReceivableServiceFee(new BigDecimal(Double.parseDouble(receivableServiceFee))); + orderInfo.setReceivableTotalFee(new BigDecimal(Double.parseDouble(receivableTotalFee))); + if ("1".equals(chargeSettleType)) { //全时段 orderInfo.setChargeUnitPrice(new BigDecimal(chargeUnitPrice)); orderInfo.setChargeUnitCost(new BigDecimal(chargeUnitCost)); orderInfo.setChargeUnitServiceFee(new BigDecimal(chargeUnitServiceFee)); orderInfo.setChargeElecfeeCostAmount(new BigDecimal(chargeElecfeeCostAmount)); orderInfo.setChargeSettleType(Byte.parseByte(chargeSettleType)); } - if ("2".equals(chargeSettleType)){ + if ("2".equals(chargeSettleType)) { orderInfo.setChargeElecfeeCostAmount(new BigDecimal(chargeElecfeeCostAmounts)); orderInfo.setChargeSettleType(Byte.parseByte(chargeSettleType)); int zeroResult = new BigDecimal(0.0).compareTo(new BigDecimal(orderInfo.getChargeDegree())); - if (zeroResult != 0){ - BigDecimal avgServiceFeeUnitPrice = new BigDecimal(receivableServiceFee).divide(new BigDecimal(orderInfo.getChargeDegree()),2,BigDecimal.ROUND_HALF_UP); - BigDecimal avgChargeUnitPrice = new BigDecimal(receivableElectricFee).divide(new BigDecimal(orderInfo.getChargeDegree()),2,BigDecimal.ROUND_HALF_UP); + if (zeroResult != 0) { + BigDecimal avgServiceFeeUnitPrice = new BigDecimal(receivableServiceFee).divide(new BigDecimal(orderInfo.getChargeDegree()), 2, BigDecimal.ROUND_HALF_UP); + BigDecimal avgChargeUnitPrice = new BigDecimal(receivableElectricFee).divide(new BigDecimal(orderInfo.getChargeDegree()), 2, BigDecimal.ROUND_HALF_UP); orderInfo.setChargeUnitPrice(avgChargeUnitPrice); orderInfo.setChargeUnitCost(avgChargeUnitPrice); orderInfo.setChargeUnitServiceFee(avgServiceFeeUnitPrice); - }else{ + } else { orderInfo.setChargeUnitPrice(new BigDecimal(0.00)); orderInfo.setChargeUnitCost(new BigDecimal(0.00)); orderInfo.setChargeUnitServiceFee(new BigDecimal(0.00)); } JSONArray subPeriods = JSONArray.fromObject(orderDetail);//分时段信息记录 - insertOrderDetail(orderInfo.getOrderNo(),subPeriods); + insertOrderDetail(orderInfo.getOrderNo(), subPeriods); } equipmentChargeOrderDOMapper.updateByPrimaryKeySelective(orderInfo); return orderInfo; } - /**补全订单的结算信息*/ - private EquipmentChargeOrderDO outlay(EquipmentChargeOrderDO orderInfo,JSONObject outlayValue){ + /** + * 补全订单的结算信息 + */ + private EquipmentChargeOrderDO outlay(EquipmentChargeOrderDO orderInfo, JSONObject outlayValue) { String payAmount = outlayValue.optString("pay_amount"); String actualPayAmount = outlayValue.optString("actual_pay_amount"); String couponAmount = outlayValue.optString("coupon_amount"); String eleFeeCoupon = outlayValue.optString("eleFeeCoupon"); String serviceCouponFee = outlayValue.optString("serviceCouponFee"); - String userCouponId = outlayValue.optString("user_coupon_id"); - String activityServiceFee = outlayValue.optString("activityServiceFee"); - String activityElectricFee = outlayValue.optString("activityElectricFee"); - String serviceFee = outlayValue.optString("serviceFee"); - String electricFee = outlayValue.optString("electricFee"); + String userCouponId = outlayValue.optString("user_coupon_id"); + String activityServiceFee = outlayValue.optString("activityServiceFee"); + String activityElectricFee = outlayValue.optString("activityElectricFee"); + String serviceFee = outlayValue.optString("serviceFee"); + String electricFee = outlayValue.optString("electricFee"); orderInfo.setId(orderInfo.getId()); - orderInfo.setPayStatus((byte)2); - orderInfo.setPayMethod((byte)0); + orderInfo.setPayStatus((byte) 2); + orderInfo.setPayMethod((byte) 0); orderInfo.setPayAmount(new BigDecimal(payAmount)); orderInfo.setPayTime(new Date()); - orderInfo.setActualPayAmount(new BigDecimal(actualPayAmount)); - orderInfo.setActivityServiceFee(new BigDecimal(activityServiceFee)); - orderInfo.setActivityElectricFee(new BigDecimal(activityElectricFee)); - orderInfo.setChargeServiceAmount(new BigDecimal(serviceFee)); - orderInfo.setChargeElecfeeAmount(new BigDecimal(electricFee)); - orderInfo.setReportTime(new Date()); - if(orderInfo.getSettlementType() != 0){ //使用了套餐 + orderInfo.setActualPayAmount(new BigDecimal(actualPayAmount)); + orderInfo.setActivityServiceFee(new BigDecimal(activityServiceFee)); + orderInfo.setActivityElectricFee(new BigDecimal(activityElectricFee)); + orderInfo.setChargeServiceAmount(new BigDecimal(serviceFee)); + orderInfo.setChargeElecfeeAmount(new BigDecimal(electricFee)); + orderInfo.setReportTime(new Date()); + if (orderInfo.getSettlementType() != 0) { //使用了套餐 orderInfo.setCouponAmount(new BigDecimal(couponAmount)); } - if(!userCouponId.equals("")) { //用户 优惠劵id + if (!userCouponId.equals("")) { //用户 优惠劵id orderInfo.setCouponAmount(new BigDecimal(couponAmount)); orderInfo.setElecfeeCouponAmount(new BigDecimal(eleFeeCoupon)); orderInfo.setServicefeeCouponAmount(new BigDecimal(serviceCouponFee)); orderInfo.setUserCouponId(Long.parseLong(userCouponId)); - orderInfo.setCouponType((byte)0); + orderInfo.setCouponType((byte) 0); } return orderInfo; } - /**记录订单的分时信息*/ - public void insertOrderDetail(String orderNo,JSONArray detailJSONArray){ + /** + * 记录订单的分时信息 + */ + public void insertOrderDetail(String orderNo, JSONArray detailJSONArray) { try { - for (int i=0 ; i < detailJSONArray.size() ;i++){ + for (int i = 0; i < detailJSONArray.size(); i++) { JSONObject myjObject = detailJSONArray.getJSONObject(i); Double serviceFee = myjObject.optDouble("serviceFee"); Double degree = myjObject.optDouble("degree"); Double electricFee = myjObject.optDouble("electricFee"); Double costFee = myjObject.optDouble("costFee"); Double serviceFeeUnitPrice = myjObject.optDouble("serviceFeeUnitPrice"); - Double electricityBill = myjObject.optDouble("electricityBill"); - Double costUnitPrice = myjObject.optDouble("costUnitPrice"); - Double activityServiceFee = myjObject.optDouble("activityServiceFee"); - Double activityElectricFee = myjObject.optDouble("activityElectricFee"); - String startTime = myjObject.optString("startTime"); - String endTime = myjObject.optString("endTime"); - String couponDegree = myjObject.optString("couponDegree").equals("") ? "0.00" : myjObject.optString("couponDegree");//优惠度数 - Double cardUnitService = myjObject.optDouble("cardUnitService");//套餐服务费单价 - Double cardUnitEle = myjObject.optDouble("cardUnitEle");//套餐电费单价 - String cardEleFee = myjObject.optString("cardEleFee").equals("") ? "0.00" : myjObject.optString("cardEleFee");//套餐电费 - String cardServiceFee = myjObject.optString("cardServiceFee").equals("") ? "0.00" : myjObject.optString("cardServiceFee");//套餐服务费 - String cardFee = myjObject.optString("cardFee").equals("") ? "0.00" : myjObject.optString("cardFee");//套餐总金额 - Integer timeFlag = myjObject.optInt("timeFlag"); + Double electricityBill = myjObject.optDouble("electricityBill"); + Double costUnitPrice = myjObject.optDouble("costUnitPrice"); + Double activityServiceFee = myjObject.optDouble("activityServiceFee"); + Double activityElectricFee = myjObject.optDouble("activityElectricFee"); + String startTime = myjObject.optString("startTime"); + String endTime = myjObject.optString("endTime"); + String couponDegree = myjObject.optString("couponDegree").equals("") ? "0.00" : myjObject.optString("couponDegree");//优惠度数 + Double cardUnitService = myjObject.optDouble("cardUnitService");//套餐服务费单价 + Double cardUnitEle = myjObject.optDouble("cardUnitEle");//套餐电费单价 + String cardEleFee = myjObject.optString("cardEleFee").equals("") ? "0.00" : myjObject.optString("cardEleFee");//套餐电费 + String cardServiceFee = myjObject.optString("cardServiceFee").equals("") ? "0.00" : myjObject.optString("cardServiceFee");//套餐服务费 + String cardFee = myjObject.optString("cardFee").equals("") ? "0.00" : myjObject.optString("cardFee");//套餐总金额 + Integer timeFlag = myjObject.optInt("timeFlag"); EquipmentChargeOrderDetailDO equipmentChargeOrderDetailDO = new EquipmentChargeOrderDetailDO(orderNo, degree, new BigDecimal(serviceFee), new BigDecimal(electricFee), new BigDecimal(costFee), new BigDecimal(serviceFeeUnitPrice), new BigDecimal(electricityBill), new BigDecimal(costUnitPrice), new BigDecimal(activityServiceFee), @@ -369,165 +404,175 @@ public class HandleOrderTarckService { } public ChargeBillsBO msgMq(EquipmentOrder equipmentOrder, - String chargeBeginTime, - String chargeEndTime, - String orderNo, - String chargeDegree, - String equipmentSn, - double[] chargeTimesDegree){ + String chargeBeginTime, + String chargeEndTime, + String orderNo, + String chargeDegree, + String equipmentSn, + double[] chargeTimesDegree) { ChargeBillsBO chargeBillsBO = new ChargeBillsBO(); chargeBillsBO.setOrderNo(orderNo); chargeBillsBO.setDegree(chargeDegree); chargeBillsBO.setEquipmentSn(equipmentSn); chargeBillsBO.setTimeAndDegree(chargeTimesDegree); - chargeBillsBO.setBeginDegree(equipmentOrder.getChargeBeginDegree()+""); - chargeBillsBO.setEndDegree(equipmentOrder.getChargeEndDegree()+""); - chargeBillsBO.setUsedTime(equipmentOrder.getChargeDuration()+""); - chargeBillsBO.setSocStart(equipmentOrder.getChargeBeginSoc()+""); - chargeBillsBO.setSocEnd(equipmentOrder.getChargeEndSoc()+""); + chargeBillsBO.setBeginDegree(equipmentOrder.getChargeBeginDegree() + ""); + chargeBillsBO.setEndDegree(equipmentOrder.getChargeEndDegree() + ""); + chargeBillsBO.setUsedTime(equipmentOrder.getChargeDuration() + ""); + chargeBillsBO.setSocStart(equipmentOrder.getChargeBeginSoc() + ""); + chargeBillsBO.setSocEnd(equipmentOrder.getChargeEndSoc() + ""); chargeBillsBO.setStopReason("5"); chargeBillsBO.setStopReasonMsg("补单结束"); - chargeBillsBO.setStartType(equipmentOrder.getBootMode()+""); + chargeBillsBO.setStartType(equipmentOrder.getBootMode() + ""); chargeBillsBO.setStartTime(chargeBeginTime); chargeBillsBO.setStartTime(chargeEndTime); - chargeBillsBO.setConnectorNo(equipmentOrder.getPlugNo()+""); + chargeBillsBO.setConnectorNo(equipmentOrder.getPlugNo() + ""); chargeBillsBO.setVin(equipmentOrder.getChargeVin()); chargeBillsBO.setChargeDetectionFlag("0"); return chargeBillsBO; } - /**判断订单类型*/ - private EquipmentChargeOrderDO judgeOrderType(EquipmentChargeOrderDO orderInfo){ + /** + * 判断订单类型 + */ + private EquipmentChargeOrderDO judgeOrderType(EquipmentChargeOrderDO orderInfo) { PlatformDO platformInfo = platformDOMapper.getPlatformInfoByUserId(orderInfo.getUserId().intValue()); - if (platformInfo != null){ - orderInfo.setOrderType((byte)4); - }else { + if (platformInfo != null) { + orderInfo.setOrderType((byte) 4); + } else { Integer userType = userDOMapper.getUserType(orderInfo.getUserId().intValue()); orderInfo.setOrderType(userType.byteValue()); } return orderInfo; } - /**推送订单停止中到互通互联运营商*/ - public void pullHthlStopResult(String orderNo,Integer userId){ + /** + * 推送订单停止中到互通互联运营商 + */ + public void pullHthlStopResult(String orderNo, Integer userId) { PlatformDO platformInfo = platformDOMapper.getPlatformInfoByUserId(userId); - if (platformInfo != null){ - if ("101437000".equals(platformInfo.getPlatformCode())){ - hthlNotifyService.notifyStopChargeResult(orderNo,"101437000",3); + if (platformInfo != null) { + if ("101437000".equals(platformInfo.getPlatformCode())) { + hthlNotifyService.notifyStopChargeResult(orderNo, "101437000", 3); } - if ("351021524".equals(platformInfo.getPlatformCode())){ - hthlNotifyService.notifyStopChargeResult(orderNo,"351021524",3); + if ("351021524".equals(platformInfo.getPlatformCode())) { + hthlNotifyService.notifyStopChargeResult(orderNo, "351021524", 3); } - if ("425010765".equals(platformInfo.getPlatformCode())){ - hthlNotifyService.notifyStopChargeResult(orderNo,"425010765",3); + if ("425010765".equals(platformInfo.getPlatformCode())) { + hthlNotifyService.notifyStopChargeResult(orderNo, "425010765", 3); } - if ("MA01H3BQ1".equals(platformInfo.getPlatformCode())){ - hthlNotifyService.notifyStopChargeResult(orderNo,"MA01H3BQ1",3); + if ("MA01H3BQ1".equals(platformInfo.getPlatformCode())) { + hthlNotifyService.notifyStopChargeResult(orderNo, "MA01H3BQ1", 3); } - if ("325616137".equals(platformInfo.getPlatformCode())){ - hthlNotifyService.notifyStopChargeResult(orderNo,"325616137",3); + if ("325616137".equals(platformInfo.getPlatformCode())) { + hthlNotifyService.notifyStopChargeResult(orderNo, "325616137", 3); } - if ("717397615".equals(platformInfo.getPlatformCode())){ - hthlNotifyService.notifyStopChargeResult(orderNo,"717397615",3); + if ("717397615".equals(platformInfo.getPlatformCode())) { + hthlNotifyService.notifyStopChargeResult(orderNo, "717397615", 3); } - if ("MA4KUHJ97".equals(platformInfo.getPlatformCode())){ - hthlNotifyService.notifyStopChargeResult(orderNo,"MA4KUHJ97",3); + if ("MA4KUHJ97".equals(platformInfo.getPlatformCode())) { + hthlNotifyService.notifyStopChargeResult(orderNo, "MA4KUHJ97", 3); } //兼容版 - if (!"101437000".equals(platformInfo.getPlatformCode())&& !"350100001".equals(platformInfo.getPlatformCode())&& - !"351021524".equals(platformInfo.getPlatformCode())&& !"395815801".equals(platformInfo.getPlatformCode())&& - !"425010765".equals(platformInfo.getPlatformCode())&& !"MA01H3BQ1".equals(platformInfo.getPlatformCode())&& - !"325616137".equals(platformInfo.getPlatformCode())&& !"717397615".equals(platformInfo.getPlatformCode())&& - !"MA4KUHJ97".equals(platformInfo.getPlatformCode())){ - hthlNotifyService.notifyStopChargeResult(orderNo,platformInfo.getPlatformCode(),3); + if (!"101437000".equals(platformInfo.getPlatformCode()) && !"350100001".equals(platformInfo.getPlatformCode()) && + !"351021524".equals(platformInfo.getPlatformCode()) && !"395815801".equals(platformInfo.getPlatformCode()) && + !"425010765".equals(platformInfo.getPlatformCode()) && !"MA01H3BQ1".equals(platformInfo.getPlatformCode()) && + !"325616137".equals(platformInfo.getPlatformCode()) && !"717397615".equals(platformInfo.getPlatformCode()) && + !"MA4KUHJ97".equals(platformInfo.getPlatformCode())) { + hthlNotifyService.notifyStopChargeResult(orderNo, platformInfo.getPlatformCode(), 3); } } } - /**推送账单到互通互联运营商*/ - public void pullHthl(String orderNo,Integer userId){ + /** + * 推送账单到互通互联运营商 + */ + public void pullHthl(String orderNo, Integer userId) { PlatformDO platformInfo = platformDOMapper.getPlatformInfoByUserId(userId); - if (platformInfo != null){ - if ("101437000".equals(platformInfo.getPlatformCode())){ - saveOpenapiNotifyOrderInfo(orderNo,"101437000"); - hthlNotifyService.notifyStopChargeResult(orderNo,"101437000",4); - hthlNotifyService.notifyChargeOrderInfo(orderNo,"101437000"); - } - if ("350100001".equals(platformInfo.getPlatformCode())){ - saveOpenapiNotifyOrderInfo(orderNo,"350100001"); - hthlNotifyService.notifyChargeToCaocao(orderNo,"chargeStop"); - } - if ("351021524".equals(platformInfo.getPlatformCode())){ - saveOpenapiNotifyOrderInfo(orderNo,"351021524"); - hthlNotifyService.notifyStopChargeResult(orderNo,"351021524",4); - hthlNotifyService.notifyChargeOrderInfo(orderNo,"351021524"); - } - if ("425010765".equals(platformInfo.getPlatformCode())){ - saveOpenapiNotifyOrderInfo(orderNo,"425010765"); - hthlNotifyService.notifyStopChargeResult(orderNo,"425010765",4); - hthlNotifyService.notifyChargeOrderInfo(orderNo,"425010765"); - } - if ("MA01H3BQ1".equals(platformInfo.getPlatformCode())){ - saveOpenapiNotifyOrderInfo(orderNo,"MA01H3BQ1"); - hthlNotifyService.notifyStopChargeResult(orderNo,"MA01H3BQ1",4); - hthlNotifyService.notifyChargeOrderInfo(orderNo,"MA01H3BQ1"); - } - if ("325616137".equals(platformInfo.getPlatformCode())){ - saveOpenapiNotifyOrderInfo(orderNo,"325616137"); - hthlNotifyService.notifyStopChargeResult(orderNo,"325616137",4); - hthlNotifyService.notifyChargeOrderInfo(orderNo,"325616137"); - } - if ("717397615".equals(platformInfo.getPlatformCode())){ - saveOpenapiNotifyOrderInfo(orderNo,"717397615"); - hthlNotifyService.notifyStopChargeResult(orderNo,"717397615",4); - hthlNotifyService.notifyChargeOrderInfo(orderNo,"717397615"); - } - if ("MA4KUHJ97".equals(platformInfo.getPlatformCode())){ - saveOpenapiNotifyOrderInfo(orderNo,"MA4KUHJ97"); - hthlNotifyService.notifyStopChargeResult(orderNo,"MA4KUHJ97",4); - hthlNotifyService.notifyChargeOrderInfo(orderNo,"MA4KUHJ97"); + if (platformInfo != null) { + if ("101437000".equals(platformInfo.getPlatformCode())) { + saveOpenapiNotifyOrderInfo(orderNo, "101437000"); + hthlNotifyService.notifyStopChargeResult(orderNo, "101437000", 4); + hthlNotifyService.notifyChargeOrderInfo(orderNo, "101437000"); + } + if ("350100001".equals(platformInfo.getPlatformCode())) { + saveOpenapiNotifyOrderInfo(orderNo, "350100001"); + hthlNotifyService.notifyChargeToCaocao(orderNo, "chargeStop"); + } + if ("351021524".equals(platformInfo.getPlatformCode())) { + saveOpenapiNotifyOrderInfo(orderNo, "351021524"); + hthlNotifyService.notifyStopChargeResult(orderNo, "351021524", 4); + hthlNotifyService.notifyChargeOrderInfo(orderNo, "351021524"); + } + if ("425010765".equals(platformInfo.getPlatformCode())) { + saveOpenapiNotifyOrderInfo(orderNo, "425010765"); + hthlNotifyService.notifyStopChargeResult(orderNo, "425010765", 4); + hthlNotifyService.notifyChargeOrderInfo(orderNo, "425010765"); + } + if ("MA01H3BQ1".equals(platformInfo.getPlatformCode())) { + saveOpenapiNotifyOrderInfo(orderNo, "MA01H3BQ1"); + hthlNotifyService.notifyStopChargeResult(orderNo, "MA01H3BQ1", 4); + hthlNotifyService.notifyChargeOrderInfo(orderNo, "MA01H3BQ1"); + } + if ("325616137".equals(platformInfo.getPlatformCode())) { + saveOpenapiNotifyOrderInfo(orderNo, "325616137"); + hthlNotifyService.notifyStopChargeResult(orderNo, "325616137", 4); + hthlNotifyService.notifyChargeOrderInfo(orderNo, "325616137"); + } + if ("717397615".equals(platformInfo.getPlatformCode())) { + saveOpenapiNotifyOrderInfo(orderNo, "717397615"); + hthlNotifyService.notifyStopChargeResult(orderNo, "717397615", 4); + hthlNotifyService.notifyChargeOrderInfo(orderNo, "717397615"); + } + if ("MA4KUHJ97".equals(platformInfo.getPlatformCode())) { + saveOpenapiNotifyOrderInfo(orderNo, "MA4KUHJ97"); + hthlNotifyService.notifyStopChargeResult(orderNo, "MA4KUHJ97", 4); + hthlNotifyService.notifyChargeOrderInfo(orderNo, "MA4KUHJ97"); } //兼容版 - if (!"101437000".equals(platformInfo.getPlatformCode())&& !"350100001".equals(platformInfo.getPlatformCode())&& - !"351021524".equals(platformInfo.getPlatformCode())&& !"395815801".equals(platformInfo.getPlatformCode())&& - !"425010765".equals(platformInfo.getPlatformCode())&& !"MA01H3BQ1".equals(platformInfo.getPlatformCode())&& - !"325616137".equals(platformInfo.getPlatformCode())&& !"717397615".equals(platformInfo.getPlatformCode())&& - !"MA4KUHJ97".equals(platformInfo.getPlatformCode())){ - saveOpenapiNotifyOrderInfo(orderNo,platformInfo.getPlatformCode()); - hthlNotifyService.notifyStopChargeResult(orderNo,platformInfo.getPlatformCode(),4); - hthlNotifyService.notifyChargeOrderInfo(orderNo,platformInfo.getPlatformCode()); + if (!"101437000".equals(platformInfo.getPlatformCode()) && !"350100001".equals(platformInfo.getPlatformCode()) && + !"351021524".equals(platformInfo.getPlatformCode()) && !"395815801".equals(platformInfo.getPlatformCode()) && + !"425010765".equals(platformInfo.getPlatformCode()) && !"MA01H3BQ1".equals(platformInfo.getPlatformCode()) && + !"325616137".equals(platformInfo.getPlatformCode()) && !"717397615".equals(platformInfo.getPlatformCode()) && + !"MA4KUHJ97".equals(platformInfo.getPlatformCode())) { + saveOpenapiNotifyOrderInfo(orderNo, platformInfo.getPlatformCode()); + hthlNotifyService.notifyStopChargeResult(orderNo, platformInfo.getPlatformCode(), 4); + hthlNotifyService.notifyChargeOrderInfo(orderNo, platformInfo.getPlatformCode()); } } } - /**补全停止前最新一次的订单信息*/ - public EquipmentChargeOrderDO beforeStopLastOrderInfo(EquipmentOrder equipmentOrder,EquipmentChargeOrderDO orderInfo){ + /** + * 补全停止前最新一次的订单信息 + */ + public EquipmentChargeOrderDO beforeStopLastOrderInfo(EquipmentOrder equipmentOrder, EquipmentChargeOrderDO orderInfo) { String timeShare = timeShareComputeStr(equipmentOrder.getMultiChargeDegree()); orderInfo.setChargeTimesDegree(timeShare); orderInfo.setChargeEndTime(equipmentOrder.getChargeEndTime()); orderInfo.setChargeDuration(equipmentOrder.getChargeDuration()); orderInfo.setChargeBeginDegree(equipmentOrder.getChargeBeginDegree()); - orderInfo.setChargeEndDegree(equipmentOrder.getChargeEndDegree()); - orderInfo.setChargeDegree(equipmentOrder.getChargeDegree()); - orderInfo.setChargeBeginSoc(Double.valueOf(equipmentOrder.getChargeBeginSoc()).intValue()); - orderInfo.setChargeEndSoc(Double.valueOf(equipmentOrder.getChargeEndSoc()).intValue()); - orderInfo.setChargeCurSoc(Double.valueOf(equipmentOrder.getChargeEndSoc()).intValue()); - orderInfo.setChargeStrategy(equipmentOrder.getChargeStrategy()); - orderInfo.setChargeStrategyParam(equipmentOrder.getChargeStrategyParam()); - orderInfo.setBootMode(equipmentOrder.getBootMode()); - orderInfo.setChargeVin(equipmentOrder.getChargeVin()); - orderInfo.setChargeAh(equipmentOrder.getChargeDegree()*100); - orderInfo.setFinishCode(44); - orderInfo.setFinishType(2); - orderInfo.setFinishMsg("补单结束"); - orderInfo.setFinishTime(ToolDateTime.getDate()); + orderInfo.setChargeEndDegree(equipmentOrder.getChargeEndDegree()); + orderInfo.setChargeDegree(equipmentOrder.getChargeDegree()); + orderInfo.setChargeBeginSoc(Double.valueOf(equipmentOrder.getChargeBeginSoc()).intValue()); + orderInfo.setChargeEndSoc(Double.valueOf(equipmentOrder.getChargeEndSoc()).intValue()); + orderInfo.setChargeCurSoc(Double.valueOf(equipmentOrder.getChargeEndSoc()).intValue()); + orderInfo.setChargeStrategy(equipmentOrder.getChargeStrategy()); + orderInfo.setChargeStrategyParam(equipmentOrder.getChargeStrategyParam()); + orderInfo.setBootMode(equipmentOrder.getBootMode()); + orderInfo.setChargeVin(equipmentOrder.getChargeVin()); + orderInfo.setChargeAh(equipmentOrder.getChargeDegree() * 100); + orderInfo.setFinishCode(44); + orderInfo.setFinishType(2); + orderInfo.setFinishMsg("补单结束"); + orderInfo.setFinishTime(ToolDateTime.getDate()); return orderInfo; } - /**保存第三方平台订单到第三方平台推送表*/ - private void saveOpenapiNotifyOrderInfo(String orderNo,String platformCode){ + /** + * 保存第三方平台订单到第三方平台推送表 + */ + private void saveOpenapiNotifyOrderInfo(String orderNo, String platformCode) { Integer count = openapiNotifyOrderInfoDOMapper.countOpenapiNotifyOrderInfo(orderNo); //第三方平台需要推送的订单 - if (count == 0){ + if (count == 0) { OpenapiNotifyOrderInfoDO openapiNotifyOrderInfoDO = new OpenapiNotifyOrderInfoDO(); openapiNotifyOrderInfoDO.setOrderNo(orderNo); openapiNotifyOrderInfoDO.setPlatformCode(platformCode); @@ -536,10 +581,12 @@ public class HandleOrderTarckService { } } - /**处理分时段电量*/ - private String timeShareComputeStr(double[] chargeTimesDegree){ + /** + * 处理分时段电量 + */ + private String timeShareComputeStr(double[] chargeTimesDegree) { StringBuilder chargeTimesDegreeStr = new StringBuilder(); - Stream.iterate(0,i->i+1).limit(chargeTimesDegree.length).forEach(i->{ + Stream.iterate(0, i -> i + 1).limit(chargeTimesDegree.length).forEach(i -> { chargeTimesDegreeStr.append(chargeTimesDegree[i]); if (i < chargeTimesDegree.length - 1) { chargeTimesDegreeStr.append(","); @@ -549,19 +596,18 @@ public class HandleOrderTarckService { } - - - - /**充电中订单挂起*/ - public void chargeIngeSuspend(){ - Date nowTime=new Date(); - List hangUpOrderList = equipmentChargeOrderDOMapper.queryTimeOutOrderToStateTwo(Tools.getDayTime());//查询充电中订单 - for(EquipmentChargeOrderDO order:hangUpOrderList){ - Date updateTime=order.getUpdateTime(); - if(null!=updateTime){ - Long sec= dateDiff(nowTime,updateTime); - if(sec >= 900) { - equipmentChargeOrderDOMapper.editeOrderState(5,order.getOrderNo(),Tools.getDayTime(),"订单进行挂起"); + /** + * 充电中订单挂起 + */ + public void chargeIngeSuspend() { + Date nowTime = new Date(); + List hangUpOrderList = equipmentChargeOrderDOMapper.queryTimeOutOrderToStateTwo(Tools.getDayTime());//查询充电中订单 + for (EquipmentChargeOrderDO order : hangUpOrderList) { + Date updateTime = order.getUpdateTime(); + if (null != updateTime) { + Long sec = dateDiff(nowTime, updateTime); + if (sec >= 900) { + equipmentChargeOrderDOMapper.editeOrderState(5, order.getOrderNo(), Tools.getDayTime(), "订单进行挂起"); // 共享用户,挂起订单解冻用户 UserDO userDO = userDOMapper.querUserInfoById(order.getUserId().intValue()); removeFreezeUser(userDO); @@ -571,16 +617,15 @@ public class HandleOrderTarckService { } - public static Long dateDiff(Date start,Date end) { + public static Long dateDiff(Date start, Date end) { // 按照传入的格式生成一个simpledateformate对象 - long interval=0; + long interval = 0; try { interval = (start.getTime() - end.getTime()) / 1000; - } - catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } - return interval; + return interval; } @@ -591,10 +636,10 @@ public class HandleOrderTarckService { //查询需要处理的订单列表 List equipmentChargeOrderDOList = equipmentChargeOrderDOMapper.queryAbnormalOrder(); //从redis中获取数据,进行处理 - for(EquipmentChargeOrderDO equipmentChargeOrderDO : equipmentChargeOrderDOList) { + for (EquipmentChargeOrderDO equipmentChargeOrderDO : equipmentChargeOrderDOList) { String platformOrderNo = equipmentChargeOrderDO.getPlatformOrderNo(); - String jsonString = tokenService.getToken(platformOrderNo); - if(jsonString == null || "".equals(jsonString)) { + String jsonString = tokenService.getToken(platformOrderNo); + if (jsonString == null || "".equals(jsonString)) { continue; } JSONObject jsonObject = JSONObject.fromObject(jsonString); @@ -606,15 +651,15 @@ public class HandleOrderTarckService { String orderNo = equipmentChargeOrderDO.getOrderNo(); //进行异常订单的处理,不扣费 JSONObject outlay = financeServiceApi.getHlhtAbnormalOrder(totalMoney.toString(), - orderNo, - "0", "0", - totalServiceMoney.toString(), - totalPower, totalMoney.toString()); + orderNo, + "0", "0", + totalServiceMoney.toString(), + totalPower, totalMoney.toString()); updateExceptionOrderOutlayInfo(outlay, notifyChargeOrderInfoBO, orderNo); // 启明共享用户 解除冻结状态 UserDO userDO = userDOMapper.querUserInfoById(equipmentChargeOrderDO.getUserId().intValue()); - if (userDO.getSharedUser()==1){ - Boolean b=userAccountStateService.removeFreezeUser(equipmentChargeOrderDO.getUserId().intValue()); + if (userDO.getSharedUser() == 1) { + Boolean b = userAccountStateService.removeFreezeUser(equipmentChargeOrderDO.getUserId().intValue()); log.info("定时任务处理已完成、未支付订单完成不扣费,解冻启明共享用户,结果:{}", b); } } @@ -752,24 +797,24 @@ public class HandleOrderTarckService { OrderTrackInfo orderTrackInfo = orderTrackInfoDao.findOne(order.getOrderNo()); //轨迹日志为空,则全部补推 - if(orderTrackInfo == null) { + if (orderTrackInfo == null) { hlhtMqProducer.chargeBillsProducer(new ChargeBillsBO(order.getOrderNo())); hlhtMqProducer.chargeBillsProducerMonitor(order.getStationId(), new ChargeBillsBO(order.getOrderNo())); hlhtMqProducer.chargeBillsProducerProvincialMonitor(order, new ChargeBillsBO(order.getOrderNo())); } //渠道方补推 - if(!orderTrackInfo.getPushChannelFlag()) { + if (!orderTrackInfo.getPushChannelFlag()) { hlhtMqProducer.chargeBillsProducer(new ChargeBillsBO(order.getOrderNo())); } //监管平台补推 - if(!orderTrackInfo.getPushMonitor()) { + if (!orderTrackInfo.getPushMonitor()) { hlhtMqProducer.chargeBillsProducerMonitor(order.getStationId(), new ChargeBillsBO(order.getOrderNo())); } //省监管平台补推 - if(!orderTrackInfo.getPushProvincialMonitor()) { + if (!orderTrackInfo.getPushProvincialMonitor()) { hlhtMqProducer.chargeBillsProducerProvincialMonitor(order, new ChargeBillsBO(order.getOrderNo())); } @@ -780,23 +825,23 @@ public class HandleOrderTarckService { @Async public void pushOrderToMonitor(DateTime beginTime, DateTime endTime, Integer scrollSize, String operatorIds) { List operatorIdList = null; - if(StringUtils.isNotBlank(operatorIds)){ + if (StringUtils.isNotBlank(operatorIds)) { operatorIdList = Arrays.asList(operatorIds.split(",")); } - final Long total = equipmentChargeOrderDOMapper.selectCountByDate(beginTime,endTime,operatorIdList); + final Long total = equipmentChargeOrderDOMapper.selectCountByDate(beginTime, endTime, operatorIdList); - if(Objects.equals(total,0L)|| Objects.isNull(total)){ + if (Objects.equals(total, 0L) || Objects.isNull(total)) { return; } final ForkJoinPool pool = new ForkJoinPool(THREAD_NUM); - final Long transCount = pool.invoke(new OrderTransTask(0L, total, Objects.isNull(scrollSize)?5000:scrollSize, - beginTime, endTime, equipmentChargeOrderDOMapper, hlhtMqProducer,operatorIdList)); + final Long transCount = pool.invoke(new OrderTransTask(0L, total, Objects.isNull(scrollSize) ? 5000 : scrollSize, + beginTime, endTime, equipmentChargeOrderDOMapper, hlhtMqProducer, operatorIdList)); log.info("完成订单补推, 期望总数:{}, 实际总数:{}", total, transCount); } - private void removeFreezeUser(UserDO userDO){ - if(userDO.getSharedUser() == 1) { + private void removeFreezeUser(UserDO userDO) { + if (userDO.getSharedUser() == 1) { Boolean removeFreezeUserResult = userAccountStateService.removeFreezeUser(userDO.getId().intValue()); log.info("挂起订单,解冻用户返回结果:{}", removeFreezeUserResult); } diff --git a/业务梳理/关于补单操作.md b/业务梳理/关于补单操作.md new file mode 100644 index 0000000..b31722a --- /dev/null +++ b/业务梳理/关于补单操作.md @@ -0,0 +1,93 @@ +```java + @Scheduled(cron = "0 0 3 * * ?") + public void completeUnReportReverseOrder() { + try{ + log.info("批量处理挂起反向订单,进行补单"); + handleOrderTarckService.completeUnReportReverseOrder(); + }catch (Exception e){ + log.error("批量处理挂起反向订单,进行补单失败,原因:", e); + e.printStackTrace(); + } + } +``` + +定时了定时任务每天$3$点进行挂起反向订单的补单操作。 + +```java + /** + * 批量处理挂起反向订单,进行补单 + */ + public void completeUnReportReverseOrder() { + //处理指定 ~ 指定时间三天前 时间内的反向挂起的订单 + // #{code} = push_reverse_orders.duration + // select value from t_biz_parameter where state = 1 and code = #{code} order by id desc limit 1 + // select value from t_biz_parameter where state = 1 and code = 'push_reverse_orders.duration' order by id desc limit 1 + // 返回值 : 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天前 + //查询这段时间内挂起的工单 + /** + + + o.state = 5 订单状态 0 创建中 1准备充电中 2 充电中 3完成 4 取消 5挂起 6需要手动补单 7结算中 + is_hlht=1 是否是互联互通站点 1是 0不是 , 注意:这里只处理了互联互通的!因为is_hlht=1,也就是说不是互联互通的挂单,调用这个接口补单是无效的!!! + */ + List hangUpOrderList = equipmentChargeOrderDOMapper.queryHangUpReverseOrder(startDate, endDate);//查询挂起订单 + + Stream.iterate(0, i -> i + 1).limit(hangUpOrderList.size()).forEach(i -> { + CompletableFuture> sendCoupon = CompletableFuture.supplyAsync(() -> { + //处理挂起订单进行补单 + asyncTaskService.completeUnReportReverseOrder(hangUpOrderList.get(i)); + return null; + }, handleReverseService); + }); + } +``` + +从$JAVA$代码来看,依赖这个接口实现补单功能有两个问题: + +- 它只能实现$72$小时的补单,为什么一定要强调$72$小时呢?为什么不是$24$小时或者$1$小时呢? +- 它只能实现互联互通的补单,对于直连桩的无效,因为它根本就没有查询直联桩的补单信息! + +```java +/** + * 处理反向互通挂起订单 + */ + public void completeUnReportReverseOrder(EquipmentChargeOrderDO orderDO) { + try { + //从mongo上获取最后一次推送的账单数据 + NotificationChargeOrderInfoReqMongoDO notificationChargeOrderInfoReqMongoDO = notificationChargeOrderInfoReqDao.findOne(orderDO.getOrderNo()); + if(notificationChargeOrderInfoReqMongoDO != null) { + completeWithPushedOrder(orderDO, notificationChargeOrderInfoReqMongoDO); + return; + } + + //若是没有,则从mongo中获取最后一次充电中推送的数据 进行结算 + ReverseOrderInfo reverseOrderInfo = reverseOrderInfoDao.findOne(orderDO.getOrderNo()); + if(reverseOrderInfo != null) { + completeWithLastPushedOrder(orderDO, reverseOrderInfo); + } + + } catch (Exception e) { + addOrderTrack(orderDO.getOrderNo(), orderDO.getUserId(), orderDO.getConnectorId().toString(), (byte) 3, (byte) 0, "补单失败,补单异常,异常信息"); + log.error("反向订单" + orderDO.getOrderNo() + "补单异常,异常信息:", e); + } + + } +``` + diff --git a/业务梳理/驿来特收到的需求、分析与现状.docx b/业务梳理/驿来特收到的需求、分析与现状.docx index 9dbe6ada9cf4b708f41d0a94220743e86a81c16e..e1309531f4769ea6329957632ba17aa3fd0cf8be 100644 GIT binary patch delta 8670 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 QppIA|T9j!t(97)q0G6aQV*mgE delta 8389 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 NAuM=X_;;rO`XBL=r8xiq