From f453d8afbdb8f56a3dd5cb7fbc97990e8b4352bd Mon Sep 17 00:00:00 2001 From: yuyang <2265829957@qq.com> Date: Tue, 31 Aug 2021 19:47:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A8=A1=E6=9D=BF=E5=92=8C?= =?UTF-8?q?=E7=BB=93=E7=AE=97=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/api/XhpcPileOrderController.java | 359 +----------------- .../XhpcHistoryOrderController.java | 2 +- .../controller/XhpcStatisticsController.java | 39 ++ .../domain/XhpcStatisticsTimeInterval.java | 312 +++++++++++++++ .../order/service/IStatisticsService.java | 10 + .../service/IXhpcRealTimeOrderService.java | 41 +- .../service/impl/StatisticsServiceImpl.java | 12 + .../impl/XhpcChargeOrderServiceImpl.java | 3 +- .../impl/XhpcHistoryOrderServiceImpl.java | 6 - .../impl/XhpcRealTimeOrderServiceImpl.java | 88 ++++- .../mapper/XhpcHistoryOrderMapper.xml | 1 + .../socket/OrderNotificationWebSocket.java | 24 +- 12 files changed, 503 insertions(+), 394 deletions(-) create mode 100644 xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcStatisticsController.java create mode 100644 xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/domain/XhpcStatisticsTimeInterval.java create mode 100644 xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/IStatisticsService.java create mode 100644 xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/StatisticsServiceImpl.java diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/api/XhpcPileOrderController.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/api/XhpcPileOrderController.java index 97858303..669af46b 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/api/XhpcPileOrderController.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/api/XhpcPileOrderController.java @@ -197,7 +197,7 @@ public class XhpcPileOrderController extends BaseController { xhpcChargeOrder.setEndTime(date); xhpcChargeOrder.setUpdateTime(date); xhpcChargeOrderService.updateXhpcChargeOrder(xhpcChargeOrder); - Map map = addOrderTime(cacheRealtimeData, xhpcChargeOrder, orderNo, 1); + Map map = xhpcRealTimeOrderService.addOrderTime(cacheRealtimeData, xhpcChargeOrder, orderNo, 1); JSONObject json = new JSONObject(map); //消息对了内容 rabbimt(userId + "##" + json); @@ -284,7 +284,6 @@ public class XhpcPileOrderController extends BaseController { int startSoc = cacheOrderData.getStartSoc(); int endSoc = cacheOrderData.getEndSoc(); - xhpcChargeOrder.setStartSoc(startSoc + ""); xhpcChargeOrder.setEndSoc(endSoc + ""); int status = cacheOrderData.getStatus(); @@ -324,173 +323,11 @@ public class XhpcPileOrderController extends BaseController { xhpcChargeOrder.setStatus(2); //异常原因 xhpcChargeOrder.setErroRemark("桩异常:" + stopReason + ">>>>用户id:" + userId + "为空"); + xhpcChargeOrderService.updateXhpcChargeOrder(xhpcChargeOrder); + R.ok(); } - BigDecimal balance = new BigDecimal(userMessage.get("balance").toString()).divide(new BigDecimal(100)); - - //电站活动抵扣--抵扣的总金额 - BigDecimal promotionDiscount = new BigDecimal(0); - //实际价格-用户支付的钱 - BigDecimal actPrice =money; - //流量方总金额抽成 - BigDecimal internetCommission =new BigDecimal(0); - //流量方服务费抽成 - BigDecimal internetSvcCommission =new BigDecimal(0); - //平台总金额抽成 - BigDecimal platformCommission =new BigDecimal(0); - //平台服务费抽成 - BigDecimal platformSvcCommission =new BigDecimal(0); - //运维总抽成 - BigDecimal operationCommission =new BigDecimal(0); - //运维服务费抽成 - BigDecimal operationSvcCommission =new BigDecimal(0); - - //判断是C端用户还是流量端用户 - if (xhpcChargeOrder.getSource() == 0) { - String state = ""; - BigDecimal discount = new BigDecimal(0); - //用户第几次充电 - int count = xhpcChargeOrderService.getCount(userId,xhpcChargeOrder.getChargeOrderId()); - if (count == 0) { - //活动折扣 - Map promotion = xhpcChargeOrderService.getPromotion(); - if (promotion != null && promotion.get("state") != null && promotion.get("discount") != null) { - //state 1.总金额 2.电费 3.服务费 discount 折扣率 - state = promotion.get("state").toString(); - discount =new BigDecimal(promotion.get("discount").toString()); - } - } - if(!"".equals(state)){ - //查看是否优惠为0 - boolean fan = true; - if(discount.compareTo(new BigDecimal(0))==0){ - fan=false; - } - if("1".equals(state)){ - //总金额 - if(fan){ - promotionDiscount=money.multiply(discount); - actPrice = money.subtract(promotionDiscount); - surplusPowerPrice = surplusPowerPrice.subtract(promotionDiscount.divide(new BigDecimal(2))); - surplusServicePrice= surplusServicePrice.subtract(promotionDiscount.divide(new BigDecimal(2))); - } - }else if("2".equals(state)){ - if(fan){ - //电费 - promotionDiscount =powerPrice.multiply(balance); - actPrice = money.subtract(promotionDiscount); - surplusPowerPrice=surplusPowerPrice.subtract(promotionDiscount); - } - }else if("3".equals(state)){ - if(fan){ - //服务费 - promotionDiscount = servicePrice.multiply(balance); - actPrice = money.subtract(promotionDiscount); - surplusServicePrice =surplusServicePrice.subtract(promotionDiscount); - } - } - } - xhpcHistoryOrder.setInternetCommission(internetCommission); - xhpcHistoryOrder.setInternetSvcCommission(internetSvcCommission); - }else{ - //流量方,未实现 - } - - //获取运营商 - Map operatorMessage = xhpcChargeOrderService.getOperatorMessage(xhpcChargeOrder.getChargingStationId()); - if(operatorMessage !=null){ - if(operatorMessage.get("maintenanceCommissionRate") !=null && operatorMessage.get("commissionType") !=null && operatorMessage.get("platformCommissionRate") !=null){ - Integer commissionType = (Integer) operatorMessage.get("commissionType"); - //运维提成 - BigDecimal maintenanceCommissionRate = new BigDecimal(operatorMessage.get("maintenanceCommissionRate").toString()).divide(new BigDecimal(100)); - //平台提成 - BigDecimal platformCommissionRate = new BigDecimal(operatorMessage.get("platformCommissionRate").toString()).divide(new BigDecimal(100)); - //提成类型(0总金额提成 1服务费提成) - if(commissionType==0){ - BigDecimal multiply1 = surplusPowerPrice.multiply(platformCommissionRate); - BigDecimal multiply2 = surplusServicePrice.multiply(platformCommissionRate); - platformCommission = multiply1.add(multiply2); - //剩下的钱 - surplusPowerPrice = surplusPowerPrice.subtract(multiply1); - surplusServicePrice = surplusServicePrice.subtract(multiply2); - BigDecimal multiply3 = surplusPowerPrice.multiply(maintenanceCommissionRate); - BigDecimal multiply4 = surplusServicePrice.multiply(maintenanceCommissionRate); - operationCommission = multiply1.add(multiply2); - //剩下的钱 - surplusPowerPrice = surplusPowerPrice.subtract(multiply3); - surplusServicePrice = surplusServicePrice.subtract(multiply4); - - }else if(commissionType==1){ - BigDecimal multiply2 = surplusServicePrice.multiply(platformCommissionRate); - platformSvcCommission=multiply2; - //剩下的钱 - surplusServicePrice = surplusServicePrice.subtract(multiply2); - - BigDecimal multiply4 = surplusServicePrice.multiply(maintenanceCommissionRate); - operationCommission = multiply4; - //剩下的钱 - surplusServicePrice = surplusServicePrice.subtract(multiply4); - } - }else{ - //订单异常 - xhpcChargeOrder.setStatus(2); - //异常原因 - xhpcChargeOrder.setErroRemark("桩异常:" + stopReason + ">>>>用户id:" + userId + "为空" + ">>>>运营商数据为空"); - } - } - Long chargeOrderId = xhpcChargeOrder.getChargeOrderId(); - xhpcHistoryOrder.setChargeOrderId(chargeOrderId); - xhpcHistoryOrder.setChargingStationId(xhpcChargeOrder.getChargingStationId()); - xhpcHistoryOrder.setUserId(userId); - xhpcHistoryOrder.setTerminalId(xhpcChargeOrder.getTerminalId()); - xhpcHistoryOrder.setSerialNumber(xhpcChargeOrder.getSerialNumber()); - xhpcHistoryOrder.setStartSoc(xhpcChargeOrder.getStartSoc()); - xhpcHistoryOrder.setReconciliationStatus(0); - xhpcHistoryOrder.setSortingStatus(0); - xhpcHistoryOrder.setType(1); - //订单总价---运维服务费抽成 - xhpcHistoryOrder.setTotalPrice(money.setScale(2, BigDecimal.ROUND_HALF_UP)); - xhpcHistoryOrder.setPromotionDiscount(promotionDiscount.setScale(2, BigDecimal.ROUND_HALF_UP)); - xhpcHistoryOrder.setActPrice(actPrice.setScale(2, BigDecimal.ROUND_HALF_UP)); - xhpcHistoryOrder.setActPowerPrice(surplusPowerPrice.setScale(2, BigDecimal.ROUND_HALF_UP)); - xhpcHistoryOrder.setActServicePrice(surplusServicePrice.setScale(2, BigDecimal.ROUND_HALF_UP)); - xhpcHistoryOrder.setInternetCommission(internetCommission.setScale(2, BigDecimal.ROUND_HALF_UP)); - xhpcHistoryOrder.setInternetSvcCommission(internetSvcCommission.setScale(2, BigDecimal.ROUND_HALF_UP)); - xhpcHistoryOrder.setPlatformCommission(platformCommission.setScale(2, BigDecimal.ROUND_HALF_UP)); - xhpcHistoryOrder.setPlatformSvcCommisssion(platformSvcCommission.setScale(2, BigDecimal.ROUND_HALF_UP)); - xhpcHistoryOrder.setOperationCommission(operationCommission.setScale(2, BigDecimal.ROUND_HALF_UP)); - xhpcHistoryOrder.setOperationSvcCommission(operationSvcCommission.setScale(2, BigDecimal.ROUND_HALF_UP)); - xhpcHistoryOrder.setStartSoc(startSoc+""); - xhpcHistoryOrder.setEndSoc(endSoc+""); - xhpcHistoryOrder.setReconciliationStatus(0); - xhpcHistoryOrder.setCreateTime(date); - - //扣除用户实际消费金额,添加消费记录 - Map user = xhpcChargeOrderService.getUserMessage(userId); - //剩余的钱 - BigDecimal balance1 =(BigDecimal) user.get("balance"); - BigDecimal subtract = balance1.subtract(actPrice); - int i = xhpcChargeOrderService.updateUserBalance(userId, subtract); - if(i==0){ - //扣钱失败 - xhpcHistoryOrder.setStatus(2); - xhpcHistoryOrder.setRemark("扣钱失败"); - }else{ - xhpcHistoryOrderService.insert(xhpcHistoryOrder); - addPileEndOrder(xhpcHistoryOrder, xhpcChargeOrder, cacheMap, orderNo); - //添加流水 - xhpcChargeOrderService.addUserAccountStatement(userId, actPrice.negate(), subtract, xhpcChargeOrder.getChargeOrderId(), 3, date); - try{ - //发送短信 - if(user.get("phone") !=null){ - String content = "【小华停止充电】尊敬的用户,你的爱车已停止充电,电量为:" + endSoc + "%,总费用为:" + actPrice + "元,充电费用明细,请查询小华充电小程序,谢谢。"; - smsService.sendNotice(user.get("phone").toString(),content); - } - }catch (Exception e){ - logger.info("<<<<<<<<<<<<<<<<发送短信失败>>>>>>>>>>>>>>>>>"); - } - - } - xhpcChargeOrderService.updateXhpcChargeOrder(xhpcChargeOrder); + //结算 + xhpcRealTimeOrderService.addSettlement(powerPrice,servicePrice,money,surplusPowerPrice,surplusServicePrice,xhpcChargeOrder,userId,userMessage,1); Map map = new HashMap<>(); map.put("code", 500); map.put("userId", userId); @@ -503,192 +340,6 @@ public class XhpcPileOrderController extends BaseController { return R.ok(); } - - private void addPileEndOrder(XhpcHistoryOrder xhpcHistoryOrder, XhpcChargeOrder xhpcChargeOrder, - Map cacheMap, String orderNo) { - - Date date = new Date(); - Long chargeOrderId = xhpcChargeOrder.getChargeOrderId(); - //删除实时数据,获取最新的实时数据 - xhpcRealTimeOrderService.deleteRealTimeOrder(xhpcChargeOrder.getChargeOrderId()); - //添加新的实时数据 - List list = (List) cacheMap.get("realtimeDataList"); - if (list != null && list.size() > 0) { - for (CacheRealtimeData cacheRealtimeData : list) { - addOrderTime(cacheRealtimeData, xhpcChargeOrder, orderNo, 2); - } - } - //添加redis到数据库 - XhpcOrderRedisRecord xhpcOrderRedisRecord =new XhpcOrderRedisRecord(); - xhpcOrderRedisRecord.setChargeOrderId(chargeOrderId); - xhpcOrderRedisRecord.setHistoryOrderOd(xhpcHistoryOrder.getHistoryOrderId()); - if(cacheMap.get("endSoc") !=null){ - xhpcOrderRedisRecord.setEndSoc(cacheMap.get("endSoc").toString()); - } - if(cacheMap.get("status") !=null){ - xhpcOrderRedisRecord.setStatus(cacheMap.get("status").toString()); - } - if(cacheMap.get("balance") !=null){ - xhpcOrderRedisRecord.setBalance(cacheMap.get("balance").toString()); - } - if(cacheMap.get("tel") !=null){ - xhpcOrderRedisRecord.setTel(cacheMap.get("tel").toString()); - } - if(cacheMap.get("startSoc") !=null){ - xhpcOrderRedisRecord.setStartSoc(cacheMap.get("startSoc").toString()); - } - if(cacheMap.get("startResult") !=null){ - xhpcOrderRedisRecord.setStartResult(cacheMap.get("startResult").toString()); - } - if(cacheMap.get("realtimeDataList") !=null){ - xhpcOrderRedisRecord.setRealtimeDataList(cacheMap.get("realtimeDataList").toString()); - } - if(cacheMap.get("remainingTime") !=null){ - xhpcOrderRedisRecord.setRemainingTime(cacheMap.get("remainingTime").toString()); - } - if(cacheMap.get("rateModelId") !=null){ - xhpcOrderRedisRecord.setRateModelId(cacheMap.get("rateModelId").toString()); - } - if(cacheMap.get("lt5alerted") !=null){ - xhpcOrderRedisRecord.setLt5alerted(cacheMap.get("lt5alerted").toString()); - } - if(cacheMap.get("orderData") !=null){ - xhpcOrderRedisRecord.setOrderData(cacheMap.get("orderData").toString()); - } - xhpcOrderRedisRecord.setCreateTime(date); - xhpcChargeOrderService.addXhpcOrderRedisRecord(xhpcOrderRedisRecord); - - //删除redis - //redisService.deleteObject("order:"+orderNo); - logger.info("<<<<<<<<<<<<<<<<订单结束回调成功>>>>>>>>>>>>>>>>>"); - logger.info("<<<<<<<<<<<<<<<<订单结束回调成功>>>>>>>>>>>>>>>>>"); - logger.info("<<<<<<<<<<<<<<<<订单结束回调成功>>>>>>>>>>>>>>>>>"); - } - - /** - * 添加实时数据 - * - * @param cacheRealtimeData - * @param xhpcChargeOrder - * @param orderNo 订单号 - * @param type 1.实时数据回调 2.结算回调 - * @return - */ - private Map addOrderTime(CacheRealtimeData cacheRealtimeData, XhpcChargeOrder xhpcChargeOrder, - String orderNo, Integer type) { - - Map map = new HashMap<>(); - Date date = new Date(); - Long chargeOrderId = xhpcChargeOrder.getChargeOrderId(); - XhpcRealTimeOrder xhpcRealTimeOrder = new XhpcRealTimeOrder(); - xhpcRealTimeOrder.setChargingOrderId(xhpcChargeOrder.getChargeOrderId()); - xhpcRealTimeOrder.setTransactionNumber(orderNo); - xhpcRealTimeOrder.setPileNumber(cacheRealtimeData.getPileNo()); - String gunId = cacheRealtimeData.getGunId(); - xhpcRealTimeOrder.setGunNumber(gunId); - if("00".equals(cacheRealtimeData.getPileGunStatus())){ - xhpcRealTimeOrder.setPileGunStatus(0); - }else if("01".equals(cacheRealtimeData.getPileGunStatus())){ - xhpcRealTimeOrder.setPileGunStatus(1); - }else{ - xhpcRealTimeOrder.setPileGunStatus(2); - } - if("00".equals(cacheRealtimeData.getVehicleGunStatus())){ - xhpcRealTimeOrder.setVehicleGunStatus(0); - }else{ - xhpcRealTimeOrder.setVehicleGunStatus(1); - } - BigDecimal v = new BigDecimal(cacheRealtimeData.getWorkingVoltage()).divide(new BigDecimal(10)); - BigDecimal c = new BigDecimal(cacheRealtimeData.getWorkingCurrent()).divide(new BigDecimal(10)); - xhpcRealTimeOrder.setVoltage(v); - xhpcRealTimeOrder.setElectricCurrent(c); - xhpcRealTimeOrder.setGunLineTemperature(cacheRealtimeData.getGunLineTemperature()); - xhpcRealTimeOrder.setGunLineNumber(cacheRealtimeData.getGunLineNumber()); - Integer soc = cacheRealtimeData.getSoc(); - xhpcRealTimeOrder.setSoc(soc.toString()); - xhpcRealTimeOrder.setMaxTemperature(cacheRealtimeData.getMaxTemperature()); - Integer chargingTime = cacheRealtimeData.getChargingTime(); - if(chargingTime>60){ - int hours = chargingTime / 60; - int mins = (chargingTime-(hours*60)) % 60; - xhpcRealTimeOrder.setChargingTime(hours+"时"+mins+"分"); - }else{ - xhpcRealTimeOrder.setChargingTime(chargingTime+"分"); - } - Integer remainingTime = cacheRealtimeData.getRemainingTime(); - if(remainingTime>60){ - int hours = remainingTime / 60; - double mins = (remainingTime-(hours*60))/60; - xhpcRealTimeOrder.setRemainingTime(hours+"时"+new BigDecimal(mins).setScale(0)+"分"); - }else{ - double mins = (double)(remainingTime/60); - xhpcRealTimeOrder.setRemainingTime(new BigDecimal(mins).setScale(0)+"分"); - } - BigDecimal decimal = new BigDecimal(10000); - BigDecimal divide = new BigDecimal(cacheRealtimeData.getLossChargingDegree()).divide(decimal); - BigDecimal chargingDegree = new BigDecimal(cacheRealtimeData.getChargingDegree()).divide(decimal); - xhpcRealTimeOrder.setChargingDegree(chargingDegree); - xhpcRealTimeOrder.setLossChargingDegree(divide); - BigDecimal amountCharged = new BigDecimal(cacheRealtimeData.getAmountCharged()).divide(decimal); - xhpcRealTimeOrder.setAmountCharged(amountCharged); - xhpcRealTimeOrder.setHardwareFault(cacheRealtimeData.getHardwareFault()); - if ("00".equals(cacheRealtimeData.getStatus())) { - xhpcRealTimeOrder.setStatus(0); - } else if ("01".equals(cacheRealtimeData.getStatus())) { - xhpcRealTimeOrder.setStatus(1); - } else if ("02".equals(cacheRealtimeData.getStatus())) { - xhpcRealTimeOrder.setStatus(2); - } else { - xhpcRealTimeOrder.setStatus(3); - } - xhpcRealTimeOrder.setCreateTime(date); - xhpcRealTimeOrder.setUserId(xhpcChargeOrder.getUserId()); - Long chargingStationId = xhpcChargeOrder.getChargingStationId(); - xhpcRealTimeOrder.setChargingStationId(chargingStationId); - - xhpcRealTimeOrderService.addXhpcRealTimeOrder(xhpcRealTimeOrder); - //实时数据存入MYsql、soc、电流、电压 - - XhpcChargeOrderSoc xhpcChargeOrderSoc = new XhpcChargeOrderSoc(); - xhpcChargeOrderSoc.setChargeOrderId(chargeOrderId); - xhpcChargeOrderSoc.setSoc(soc.toString()); - xhpcChargeOrderSoc.setCreateTime(date); - xhpcRealTimeOrderService.addSOC(xhpcChargeOrderSoc); - - XhpcChargeOrderCurrent xhpcChargeOrderCurrent =new XhpcChargeOrderCurrent(); - xhpcChargeOrderCurrent.setChargeOrderId(chargeOrderId); - xhpcChargeOrderCurrent.setCurrent(c.toString()); - xhpcChargeOrderCurrent.setCreateTime(date); - xhpcRealTimeOrderService.addCurrent(xhpcChargeOrderCurrent); - - XhpcChargeOrderVoltage xhpcChargeOrderVoltage =new XhpcChargeOrderVoltage(); - xhpcChargeOrderVoltage.setChargeOrderId(chargeOrderId); - xhpcChargeOrderVoltage.setVoltage(v.toString()); - xhpcChargeOrderVoltage.setCreateTime(date); - xhpcRealTimeOrderService.addVoltage(xhpcChargeOrderVoltage); - if(type==1){ - map.put("code", 200); - map.put("message", "实时数据"); - map.put("userId", xhpcChargeOrder.getUserId()); - Map data = new HashMap<>(); - data.put("amountCharged",divide); - data.put("gunNumber",gunId); - data.put("chargingOrderId",chargeOrderId); - data.put("soc",soc); - data.put("chargingTime",xhpcRealTimeOrder.getChargingTime()); - data.put("electricCurrent",c); - data.put("voltage", v); - data.put("power", xhpcChargeOrder.getPower()); - data.put("chargingDegree", chargingDegree); - data.put("remainingTime",xhpcRealTimeOrder.getRemainingTime()); - data.put("serialNumber",orderNo.substring(0,16)); - data.put("parkingInstructions","在非充电情况下占用车位按照0.30元/分钟收费"); - map.put("data", data); - } - return map; - } - - /** * @param status 状态 * @param remark 备注 diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcHistoryOrderController.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcHistoryOrderController.java index f6129f29..f115a976 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcHistoryOrderController.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcHistoryOrderController.java @@ -21,7 +21,7 @@ import java.util.Map; */ @RestController @RequestMapping("/histotyOrder") -@Api(value = "历史订单清接口", tags = "历史订单接口") +@Api(value = "历史订单接口", tags = "历史订单接口") public class XhpcHistoryOrderController extends BaseController { @Autowired diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcStatisticsController.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcStatisticsController.java new file mode 100644 index 00000000..c185d31a --- /dev/null +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcStatisticsController.java @@ -0,0 +1,39 @@ +package com.xhpc.order.controller; + +import com.xhpc.common.core.web.controller.BaseController; +import com.xhpc.common.core.web.domain.BaseEntity; +import com.xhpc.common.core.web.page.TableDataInfo; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author yuyang + * @date 2021/8/31 16:20 + * @Version 1.0 + */ +@RestController +@RequestMapping("/statistics") +@Api(value = "统计接口", tags = "统计接口") +public class XhpcStatisticsController extends BaseController { + + /** + * 小时统计 + */ + @GetMapping("/getTimeIntervalPage") + public TableDataInfo getTimeIntervalPage(String phone, String transactionNumber, @RequestParam("status")Integer status, String chargingStationName, Long operatorId, Integer source, String startTime, String endTime, @RequestParam("userId") Long userId, Integer type) + { + startPage(); + //List> listPage = xhpcHistoryOrderService.getListPage(phone, transactionNumber, status, chargingStationName, operatorId, source, startTime, endTime, userId, type); + return getDataTable(new ArrayList<>()); + } + + + +} diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/domain/XhpcStatisticsTimeInterval.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/domain/XhpcStatisticsTimeInterval.java new file mode 100644 index 00000000..4f59ee54 --- /dev/null +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/domain/XhpcStatisticsTimeInterval.java @@ -0,0 +1,312 @@ +package com.xhpc.order.domain; + +import com.xhpc.common.core.web.domain.BaseEntity; + +import java.math.BigDecimal; + +/** + * 时段订单统计 + * @author yuyang + * @date 2021/8/31 14:43 + * @Version 1.0 + */ +public class XhpcStatisticsTimeInterval extends BaseEntity { + + /** + * 时段订单统计id + */ + private Long statisticsTimeIntervalId; + + /** + * 24个时段每个时段 每个时段一小时 + */ + private Integer status; + /** + * 电量 + */ + private BigDecimal chargingDegree; + /** + * 充电时长(小时) + */ + private BigDecimal chargingTime; + /** + * 充电次数 + */ + private Integer chargingNumber; + /** + * 电费 + */ + private BigDecimal powerPrice; + /** + * 服务费 + */ + private BigDecimal servicePrice; + /** + * 订单总价 + */ + private BigDecimal totalPrice; + /** + * 电站活动抵扣--抵扣的总金额 + */ + private BigDecimal promotionDiscount; + /** + * 实际价格-用户支付的钱 + */ + private BigDecimal actPrice; + /** + * 实收电费-运营商电费 + */ + private BigDecimal actPowerPrice; + /** + * 实收服务费-运营商服务费 + */ + private BigDecimal actServicePrice; + /** + * 流量方总金额抽成 + */ + private BigDecimal internetCommission; + /** + * 流量方服务费抽成 + */ + private BigDecimal internetSvcCommission; + /** + * 平台总金额抽成 + */ + private BigDecimal platformCommission; + /** + * 平台服务费抽成 + */ + private BigDecimal platformSvcCommisssion; + /** + * 运维总抽成 + */ + private BigDecimal operationCommission; + /** + * 运维服务费抽成 + */ + private BigDecimal operationSvcCommission; + /** + * 0 平台 1 运营商 2流量方 + */ + private Integer type; + /** + * 运营商和流量方id + */ + private BigDecimal operatorInternetId; + /** + * 删除标志(0代表存在 2代表删除) + */ + private Integer delFlag; + + + public Long getStatisticsTimeIntervalId() { + + return statisticsTimeIntervalId; + } + + public void setStatisticsTimeIntervalId(Long statisticsTimeIntervalId) { + + this.statisticsTimeIntervalId = statisticsTimeIntervalId; + } + + public Integer getStatus() { + + return status; + } + + public void setStatus(Integer status) { + + this.status = status; + } + + public BigDecimal getChargingDegree() { + + return chargingDegree; + } + + public void setChargingDegree(BigDecimal chargingDegree) { + + this.chargingDegree = chargingDegree; + } + + public BigDecimal getChargingTime() { + + return chargingTime; + } + + public void setChargingTime(BigDecimal chargingTime) { + + this.chargingTime = chargingTime; + } + + public Integer getChargingNumber() { + + return chargingNumber; + } + + public void setChargingNumber(Integer chargingNumber) { + + this.chargingNumber = chargingNumber; + } + + public BigDecimal getPowerPrice() { + + return powerPrice; + } + + public void setPowerPrice(BigDecimal powerPrice) { + + this.powerPrice = powerPrice; + } + + public BigDecimal getServicePrice() { + + return servicePrice; + } + + public void setServicePrice(BigDecimal servicePrice) { + + this.servicePrice = servicePrice; + } + + public BigDecimal getTotalPrice() { + + return totalPrice; + } + + public void setTotalPrice(BigDecimal totalPrice) { + + this.totalPrice = totalPrice; + } + + public BigDecimal getPromotionDiscount() { + + return promotionDiscount; + } + + public void setPromotionDiscount(BigDecimal promotionDiscount) { + + this.promotionDiscount = promotionDiscount; + } + + public BigDecimal getActPrice() { + + return actPrice; + } + + public void setActPrice(BigDecimal actPrice) { + + this.actPrice = actPrice; + } + + public BigDecimal getActPowerPrice() { + + return actPowerPrice; + } + + public void setActPowerPrice(BigDecimal actPowerPrice) { + + this.actPowerPrice = actPowerPrice; + } + + public BigDecimal getActServicePrice() { + + return actServicePrice; + } + + public void setActServicePrice(BigDecimal actServicePrice) { + + this.actServicePrice = actServicePrice; + } + + public BigDecimal getInternetCommission() { + + return internetCommission; + } + + public void setInternetCommission(BigDecimal internetCommission) { + + this.internetCommission = internetCommission; + } + + public BigDecimal getInternetSvcCommission() { + + return internetSvcCommission; + } + + public void setInternetSvcCommission(BigDecimal internetSvcCommission) { + + this.internetSvcCommission = internetSvcCommission; + } + + public BigDecimal getPlatformCommission() { + + return platformCommission; + } + + public void setPlatformCommission(BigDecimal platformCommission) { + + this.platformCommission = platformCommission; + } + + public BigDecimal getPlatformSvcCommisssion() { + + return platformSvcCommisssion; + } + + public void setPlatformSvcCommisssion(BigDecimal platformSvcCommisssion) { + + this.platformSvcCommisssion = platformSvcCommisssion; + } + + public BigDecimal getOperationCommission() { + + return operationCommission; + } + + public void setOperationCommission(BigDecimal operationCommission) { + + this.operationCommission = operationCommission; + } + + public BigDecimal getOperationSvcCommission() { + + return operationSvcCommission; + } + + public void setOperationSvcCommission(BigDecimal operationSvcCommission) { + + this.operationSvcCommission = operationSvcCommission; + } + + public Integer getType() { + + return type; + } + + public void setType(Integer type) { + + this.type = type; + } + + public BigDecimal getOperatorInternetId() { + + return operatorInternetId; + } + + public void setOperatorInternetId(BigDecimal operatorInternetId) { + + this.operatorInternetId = operatorInternetId; + } + + public Integer getDelFlag() { + + return delFlag; + } + + public void setDelFlag(Integer delFlag) { + + this.delFlag = delFlag; + } + +} diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/IStatisticsService.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/IStatisticsService.java new file mode 100644 index 00000000..f41c87e4 --- /dev/null +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/IStatisticsService.java @@ -0,0 +1,10 @@ +package com.xhpc.order.service; + +/** + * @author yuyang + * @date 2021/8/31 16:21 + * @Version 1.0 + */ +public interface IStatisticsService { + +} diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/IXhpcRealTimeOrderService.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/IXhpcRealTimeOrderService.java index c82b97bc..5653d7cc 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/IXhpcRealTimeOrderService.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/IXhpcRealTimeOrderService.java @@ -1,10 +1,8 @@ package com.xhpc.order.service; import com.xhpc.common.core.web.domain.AjaxResult; -import com.xhpc.order.domain.XhpcChargeOrderCurrent; -import com.xhpc.order.domain.XhpcChargeOrderSoc; -import com.xhpc.order.domain.XhpcChargeOrderVoltage; -import com.xhpc.order.domain.XhpcRealTimeOrder; +import com.xhpc.common.data.redis.CacheRealtimeData; +import com.xhpc.order.domain.*; import java.math.BigDecimal; import java.util.ArrayList; @@ -103,4 +101,39 @@ public interface IXhpcRealTimeOrderService { * @return */ AjaxResult getExamine(Long chargingOrderId, BigDecimal powerPrice,BigDecimal servicePrice); + + + /** + * 结算订单 + * @param powerPrice + * @param servicePrice + * @param money + * @param surplusPowerPrice + * @param surplusServicePrice + * @param xhpcChargeOrder + * @param userId + * @param userMessage + * @param type 0 不发短信 1发短信 + */ + void addSettlement(BigDecimal powerPrice, BigDecimal servicePrice, BigDecimal money, BigDecimal surplusPowerPrice, BigDecimal surplusServicePrice, XhpcChargeOrder xhpcChargeOrder, Long userId, Map userMessage,Integer type); + + /** + * 添加redis到数据库 + * @param xhpcHistoryOrder + * @param xhpcChargeOrder + * @param orderNo + * @param type 1.审核 2.自动结算 + */ + void addPileEndOrder(XhpcHistoryOrder xhpcHistoryOrder, XhpcChargeOrder xhpcChargeOrder, String orderNo, Integer type); + /** + * 添加实时数据 + * + * @param cacheRealtimeData + * @param xhpcChargeOrder + * @param orderNo 订单号 + * @param type 1.实时数据回调 2.结算回调 + * @return + */ + Map addOrderTime(CacheRealtimeData cacheRealtimeData, XhpcChargeOrder xhpcChargeOrder, + String orderNo, Integer type); } diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/StatisticsServiceImpl.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/StatisticsServiceImpl.java new file mode 100644 index 00000000..b90331be --- /dev/null +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/StatisticsServiceImpl.java @@ -0,0 +1,12 @@ +package com.xhpc.order.service.impl; + +import com.xhpc.order.service.IStatisticsService; + +/** + * @author yuyang + * @date 2021/8/31 16:22 + * @Version 1.0 + */ +public class StatisticsServiceImpl implements IStatisticsService { + +} diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcChargeOrderServiceImpl.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcChargeOrderServiceImpl.java index 07c5d373..d97c1b93 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcChargeOrderServiceImpl.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcChargeOrderServiceImpl.java @@ -21,6 +21,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import java.math.BigDecimal; +import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Map; @@ -134,7 +135,7 @@ public class XhpcChargeOrderServiceImpl implements IXhpcChargeOrderService { //启动充电 StartChargingData startChargingData = new StartChargingData(); //订单流水号 终端号+年月日时分秒+自增4位 共32位 - Date date = new Date(); + Date date = Calendar.getInstance().getTime(); String format = DateUtil.format(date, "yyMMddHHmmss"); //自增 String orderNo = serialNumber + format + StaticBeanUtil.seqDec("gun:" + serialNumber + ".seqdec"); diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcHistoryOrderServiceImpl.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcHistoryOrderServiceImpl.java index 36e6f4d1..5558ac23 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcHistoryOrderServiceImpl.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcHistoryOrderServiceImpl.java @@ -75,7 +75,6 @@ public class XhpcHistoryOrderServiceImpl implements IXhpcHistoryOrderService { * 历史信息费率时段 */ private Map getRateTime(String serialNumber,String actPrice){ - Map map =new HashMap<>(); BigDecimal powerPriceTotal =new BigDecimal(0); BigDecimal servicePriceTotal =new BigDecimal(0); //累计充电时间、计费模型、开始时间、结束时间、已充金额 @@ -83,11 +82,8 @@ public class XhpcHistoryOrderServiceImpl implements IXhpcHistoryOrderService { Long rateModelId = chargeOrder.getRateModelId(); Date startTime2 = chargeOrder.getStartTime(); Date updateTime2 = chargeOrder.getEndTime(); - BigDecimal amountCharged = chargeOrder.getAmountCharged(); //充电度数 BigDecimal chargingDegree = chargeOrder.getChargingDegree(); - //每分钟充电度数=累计时间/60 - BigDecimal chargingTimeNumber = chargeOrder.getChargingDegree(); List> list =new ArrayList<>(); //1时间没有跨天 long betweenDay = DateUtil.between(startTime2, updateTime2, DateUnit.DAY); @@ -116,8 +112,6 @@ public class XhpcHistoryOrderServiceImpl implements IXhpcHistoryOrderService { //算出相差时间,分 double time = (updateTime2.getTime()-startTime2.getTime())/60000; BigDecimal decimal = new BigDecimal(time).setScale(2); - //每分钟多少度 - BigDecimal degree =chargingDegree.divide(decimal,2,BigDecimal.ROUND_HALF_UP); //获取费率时间段 String startTime = DateUtil.formatTime(startTime2); String endTime = DateUtil.formatTime(updateTime2); diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcRealTimeOrderServiceImpl.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcRealTimeOrderServiceImpl.java index 5adb80ff..6a3e515f 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcRealTimeOrderServiceImpl.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcRealTimeOrderServiceImpl.java @@ -12,6 +12,8 @@ import com.xhpc.order.mapper.XhpcRealTimeOrderMapper; import com.xhpc.order.service.IXhpcChargeOrderService; import com.xhpc.order.service.IXhpcHistoryOrderService; import com.xhpc.order.service.IXhpcRealTimeOrderService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -37,10 +39,12 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService { private IXhpcHistoryOrderService xhpcHistoryOrderService; @Autowired - private SmsService smsService; + private RedisService redisService; @Autowired - private RedisService redisService; + private SmsService smsService; + + private static final Logger logger = LoggerFactory.getLogger(XhpcRealTimeOrderServiceImpl.class); @Override public List> list(String phone, String transactionNumber, Integer source, String chargingStationName, String terminalName, Long operatorId, String startTime, String endTime,Integer status,Long userId,Integer type) { @@ -160,10 +164,6 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService { } xhpcChargeOrder.setStatus(3); xhpcChargeOrder.setAmountCharged(money); - //生成一条历史订单 - XhpcHistoryOrder xhpcHistoryOrder = new XhpcHistoryOrder(); - xhpcHistoryOrder.setPowerPriceTotal(powerPrice); - xhpcHistoryOrder.setServicePriceTotal(servicePrice); Long userId = xhpcChargeOrder.getUserId(); Map userMessage = xhpcChargeOrderService.getUserMessage(userId); if (userMessage == null || userMessage.get("balance") == null) { @@ -171,7 +171,32 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService { xhpcChargeOrder.setStatus(2); //异常原因 xhpcChargeOrder.setErroRemark("用户id:" + userId + "为空"); + xhpcChargeOrderService.updateXhpcChargeOrder(xhpcChargeOrder); + return AjaxResult.error("用户id:" + userId + "为空"); } + //生成一条历史订单 + addSettlement(powerPrice, servicePrice, money, surplusPowerPrice, surplusServicePrice, xhpcChargeOrder, userId, userMessage,0); + + return AjaxResult.success(); + } + + /** + * 结算订单 + * @param powerPrice + * @param servicePrice + * @param money + * @param surplusPowerPrice + * @param surplusServicePrice + * @param xhpcChargeOrder + * @param userId + * @param userMessage + * @param type 0 不发短信 1发短信 + */ + @Override + public void addSettlement(BigDecimal powerPrice, BigDecimal servicePrice, BigDecimal money, BigDecimal surplusPowerPrice, BigDecimal surplusServicePrice, XhpcChargeOrder xhpcChargeOrder, Long userId, Map userMessage,Integer type) { + XhpcHistoryOrder xhpcHistoryOrder =new XhpcHistoryOrder(); + xhpcHistoryOrder.setPowerPriceTotal(powerPrice); + xhpcHistoryOrder.setServicePriceTotal(servicePrice); BigDecimal balance = new BigDecimal(userMessage.get("balance").toString()).divide(new BigDecimal(100)); //电站活动抵扣--抵扣的总金额 BigDecimal promotionDiscount = new BigDecimal(0); @@ -309,7 +334,6 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService { xhpcHistoryOrder.setReconciliationStatus(0); Date date = new Date(); xhpcHistoryOrder.setCreateTime(date); - //扣除用户实际消费金额,添加消费记录 Map user = xhpcChargeOrderService.getUserMessage(userId); //剩余的钱 @@ -318,17 +342,24 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService { int i = xhpcChargeOrderService.updateUserBalance(userId, subtract); if(i==0){ //扣钱失败 - xhpcHistoryOrder.setStatus(2); - xhpcHistoryOrder.setRemark("扣钱失败"); + xhpcChargeOrder.setStatus(2); + xhpcChargeOrder.setErroRemark("扣钱失败"); }else{ xhpcHistoryOrderService.insert(xhpcHistoryOrder); - // addPileEndOrder(xhpcHistoryOrder, xhpcChargeOrder, xhpcChargeOrder.getSerialNumber()); + addPileEndOrder(xhpcHistoryOrder, xhpcChargeOrder, xhpcChargeOrder.getSerialNumber(),1); //添加流水 xhpcChargeOrderService.addUserAccountStatement(userId, actPrice.negate(), subtract, xhpcChargeOrder.getChargeOrderId(), 3, date); + try{ + //发送短信 + if(user.get("phone") !=null){ + String content = "【小华停止充电】尊敬的用户,你的爱车已停止充电,电量为:" + xhpcChargeOrder.getEndSoc() + "%,总费用为:" + actPrice + "元,充电费用明细,请查询小华充电小程序,谢谢。"; + smsService.sendNotice(user.get("phone").toString(),content); + } + }catch (Exception e){ + logger.info("<<<<<<<<<<<<<<<<发送短信失败>>>>>>>>>>>>>>>>>"); + } } xhpcChargeOrderService.updateXhpcChargeOrder(xhpcChargeOrder); - - return AjaxResult.success(); } @@ -388,7 +419,8 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService { xhpcRealTimeOrderMapper.deleteChargeVoltage(chargingOrderId); } - private void addPileEndOrder(XhpcHistoryOrder xhpcHistoryOrder, XhpcChargeOrder xhpcChargeOrder,String orderNo) { + @Override + public void addPileEndOrder(XhpcHistoryOrder xhpcHistoryOrder, XhpcChargeOrder xhpcChargeOrder, String orderNo,Integer type) { Map cacheMap = redisService.getCacheMap("order:" + orderNo); Date date = new Date(); Long chargeOrderId = xhpcChargeOrder.getChargeOrderId(); @@ -398,7 +430,7 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService { List list = (List) cacheMap.get("realtimeDataList"); if (list != null && list.size() > 0) { for (CacheRealtimeData cacheRealtimeData : list) { - addOrderTime(cacheRealtimeData, xhpcChargeOrder, orderNo, 2); + addOrderTime(cacheRealtimeData, xhpcChargeOrder, orderNo, type); } } //添加redis到数据库 @@ -443,7 +475,9 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService { //删除redis //redisService.deleteObject("order:"+orderNo); - + logger.info("<<<<<<<<<<<<<<<<订单结束回调成功>>>>>>>>>>>>>>>>>"); + logger.info("<<<<<<<<<<<<<<<<订单结束回调成功>>>>>>>>>>>>>>>>>"); + logger.info("<<<<<<<<<<<<<<<<订单结束回调成功>>>>>>>>>>>>>>>>>"); } @@ -457,7 +491,8 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService { * @param type 1.实时数据回调 2.结算回调 * @return */ - private void addOrderTime(CacheRealtimeData cacheRealtimeData, XhpcChargeOrder xhpcChargeOrder, + @Override + public Map addOrderTime(CacheRealtimeData cacheRealtimeData, XhpcChargeOrder xhpcChargeOrder, String orderNo, Integer type) { Map map = new HashMap<>(); @@ -549,6 +584,25 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService { xhpcChargeOrderVoltage.setVoltage(v.toString()); xhpcChargeOrderVoltage.setCreateTime(date); addVoltage(xhpcChargeOrderVoltage); - + if(type==1){ + map.put("code", 200); + map.put("message", "实时数据"); + map.put("userId", xhpcChargeOrder.getUserId()); + Map data = new HashMap<>(); + data.put("amountCharged",divide); + data.put("gunNumber",gunId); + data.put("chargingOrderId",chargeOrderId); + data.put("soc",soc); + data.put("chargingTime",xhpcRealTimeOrder.getChargingTime()); + data.put("electricCurrent",c); + data.put("voltage", v); + data.put("power", xhpcChargeOrder.getPower()); + data.put("chargingDegree", chargingDegree); + data.put("remainingTime",xhpcRealTimeOrder.getRemainingTime()); + data.put("serialNumber",orderNo.substring(0,16)); + data.put("parkingInstructions","在非充电情况下占用车位按照0.30元/分钟收费"); + map.put("data", data); + } + return map; } } diff --git a/xhpc-modules/xhpc-order/src/main/resources/mapper/XhpcHistoryOrderMapper.xml b/xhpc-modules/xhpc-order/src/main/resources/mapper/XhpcHistoryOrderMapper.xml index c03db44b..dd987ef3 100644 --- a/xhpc-modules/xhpc-order/src/main/resources/mapper/XhpcHistoryOrderMapper.xml +++ b/xhpc-modules/xhpc-order/src/main/resources/mapper/XhpcHistoryOrderMapper.xml @@ -361,6 +361,7 @@ and ho.charge_order_id =#{chargingOrderId} + order by ho.create_time desc