From cf8f608ecbd99aa224a9ff964ba31dee79ec65e3 Mon Sep 17 00:00:00 2001 From: yjh_yyds <2944425955@qq.com> Date: Mon, 1 Jul 2024 09:31:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E9=BB=91=E5=90=8D=E5=8D=95?= =?UTF-8?q?=E3=80=81=E5=8F=8C=E6=9E=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CDNotificationStationInfoController.java | 16 +- .../NotificationChargeOrderInfoTask.java | 2 + .../src/main/resources/bootstrap.yml | 4 +- ruoyi-auth/src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 6 +- .../src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- .../XhpcClearingHistoryOrderServiceImpl.java | 1 + .../src/main/resources/bootstrap.yml | 4 +- .../src/main/resources/bootstrap.yml | 4 +- .../XhpcChargingPileController.java | 2 +- .../XhpcTimingChargingModelServiceImpl.java | 24 ++ .../XhpcTimingChargingPowerServiceImpl.java | 2 +- .../src/main/resources/bootstrap.yml | 4 +- .../mapper/XhpcTimingChargingModelMapper.xml | 3 +- .../mapper/XhpcTimingChargingPowerMapper.xml | 8 +- .../api/dto/XhpcTimingChargingModelDto.java | 2 + .../domain/XhpcTimingChargingModel.java | 4 + .../domain/XhpcTimingChargingPowerModel.java | 2 + .../src/main/resources/bootstrap.yml | 4 +- .../order/api/XhpcChargeOrderController.java | 15 +- .../order/api/XhpcPileOrderController.java | 46 ++- .../XhpcPileRegularInspectController.java | 2 +- .../XhpcStopChargingOrderController.java | 4 - .../xhpc/order/domain/XhpcChargeOrder.java | 11 + .../order/mapper/XhpcChargeOrderMapper.java | 39 ++- .../service/IXhpcChargeOrderService.java | 13 + .../impl/XhpcChargeOrderServiceImpl.java | 273 +++++++++++++++- .../XhpcPileRegularInspectServiceImpl.java | 76 ++--- .../impl/XhpcRealTimeOrderServiceImpl.java | 87 ++++- .../src/main/resources/bootstrap.yml | 10 +- .../mapper/XhpcChargeOrderMapper.xml | 81 +++++ .../controller/AlipayPaymentController.java | 117 +++++-- .../controller/WxPaymentController.java | 114 +++++-- .../XhpcRefundOriginalOrderController.java | 2 +- .../XhpcUserAccountStatementMapper.java | 1 + .../src/main/resources/bootstrap.yml | 4 +- .../mapper/XhpcUserAccountStatementMapper.xml | 7 + .../pp/controller/ChargingController.java | 16 +- .../xhpc/pp/controller/PileController.java | 1 + .../xhpc/pp/controller/StationController.java | 1 - .../logic/BmsReqChargerOutputDataLogic.java | 108 ++++++- .../com/xhpc/pp/logic/OrderDataLogic.java | 5 +- .../pp/logic/PileConfigReplyDataLogic.java | 4 +- .../pp/logic/PileStartChargingDataLogic.java | 24 -- .../xhpc/pp/logic/RateModelValidateLogic.java | 6 +- .../com/xhpc/pp/logic/RealtimeDataLogic.java | 20 -- .../pp/logic/RemoteStartReplyDataLogic.java | 8 - .../com/xhpc/pp/logic/ServiceMainLogic.java | 4 - .../java/com/xhpc/pp/server/HBCheckTask.java | 2 - .../xhpc/pp/utils/security/CP56Time2a.java | 12 +- .../src/main/resources/bootstrap.yml | 4 +- .../mapper/XhpcDeviceMessageMapper.xml | 2 +- .../controller/XhpcAppUserController.java | 119 ++++--- .../controller/XhpcBlacklistController.java | 62 ++++ .../com/xhpc/user/domain/XhpcBlacklist.java | 74 +++++ .../xhpc/user/mapper/XhpcAppUserMapper.java | 5 + .../xhpc/user/mapper/XhpcBlacklistMapper.java | 27 ++ .../user/service/IXhpcAppUserUserService.java | 6 + .../user/service/IXhpcBlacklistService.java | 21 ++ .../service/impl/XhpcAppUserServiceImpl.java | 30 ++ .../impl/XhpcBlacklistServiceImpl.java | 120 +++++++ .../src/main/resources/bootstrap.yml | 4 +- .../resources/mapper/XhpcAppUserMapper.xml | 24 ++ .../resources/mapper/XhpcBlacklistMapper.xml | 303 ++++++++++++++++++ .../resources/mapper/XhpcCommonMapper.xml | 12 + .../src/main/resources/bootstrap.yml | 4 +- 70 files changed, 1748 insertions(+), 298 deletions(-) create mode 100644 xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcBlacklistController.java create mode 100644 xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/domain/XhpcBlacklist.java create mode 100644 xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/mapper/XhpcBlacklistMapper.java create mode 100644 xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/IXhpcBlacklistService.java create mode 100644 xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/impl/XhpcBlacklistServiceImpl.java create mode 100644 xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcBlacklistMapper.xml diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/api/CDNotificationStationInfoController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/api/CDNotificationStationInfoController.java index b8153cc3..616f491b 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/api/CDNotificationStationInfoController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/cdjgpc/api/CDNotificationStationInfoController.java @@ -1,6 +1,7 @@ package com.xhpc.evcs.cdjgpc.api; import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.JsonProcessingException; import com.xhpc.common.api.PowerPileService; import com.xhpc.common.api.dto.ChargingStationDto; @@ -774,7 +775,7 @@ public class CDNotificationStationInfoController extends CoreDispatcher { Map map =new HashMap<>(); map.put("PageNo","1"); - map.put("PageSize","10"); + map.put("PageSize","20"); String data = JSONUtil.toJSONString(map); //String data111 = Aes128Cbc.encrypt(data, "8LpncubmWiPCzY3V", "av6A8QdnRaVRMXu6"); @@ -784,18 +785,13 @@ public class CDNotificationStationInfoController extends CoreDispatcher { "MA25CNM38", "MA6DFCTD5", SECRET_TOKEN_TYPE_IN).orElse(null); String result = okYu(commonRequest, "/query_stations_info", authSecretTokenOut,"MA25CNM38"); - + JSONObject jsonObject = JSONObject.parseObject(result); + String string = jsonObject.get("Data").toString(); System.out.println("==========result=============="+result); - -// String rawData = "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"; -// String dataSecret="8LpncubmWiPCzY3V"; -// String dataSecretIV="av6A8QdnRaVRMXu6"; -// String data = Aes128Cbc.encrypt(rawData, dataSecret, dataSecretIV); - -// System.out.println("==========data=============="+data); - + String data1 =Aes128Cbc.decryptString(string, "8LpncubmWiPCzY3V", "av6A8QdnRaVRMXu6"); + System.out.println("==========data1=============="+data1); }catch (Exception e){ e.printStackTrace(); } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfoTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfoTask.java index 14ac23c8..15f16185 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfoTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfoTask.java @@ -103,6 +103,8 @@ public class NotificationChargeOrderInfoTask extends CoreDispatcher { CommonRequest commonRequest = new CommonRequest<>(); commonRequest.setData(data); String responseBody = ok(commonRequest, "/notification_charge_order_info", authSecretTokenOut); + + return DTOJsonHelper.parseResponseData(responseBody, ChargeOrderInfoResponse.class, authSecretTokenOut); } diff --git a/evcs-modules/evcs-core/src/main/resources/bootstrap.yml b/evcs-modules/evcs-core/src/main/resources/bootstrap.yml index 11df6db5..a0dda8bc 100644 --- a/evcs-modules/evcs-core/src/main/resources/bootstrap.yml +++ b/evcs-modules/evcs-core/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-auth/src/main/resources/bootstrap.yml b/ruoyi-auth/src/main/resources/bootstrap.yml index 62be9823..39b4ae7d 100644 --- a/ruoyi-auth/src/main/resources/bootstrap.yml +++ b/ruoyi-auth/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-gateway/src/main/resources/bootstrap.yml b/ruoyi-gateway/src/main/resources/bootstrap.yml index 5bbe74ea..902c9297 100644 --- a/ruoyi-gateway/src/main/resources/bootstrap.yml +++ b/ruoyi-gateway/src/main/resources/bootstrap.yml @@ -16,10 +16,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 @@ -35,7 +35,7 @@ spring: datasource: ds1: nacos: - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 dataId: sentinel-ruoyi-gateway groupId: DEFAULT_GROUP data-type: json diff --git a/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml index 020707b3..b5bedcae 100644 --- a/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml index d6293b3a..f455ff02 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-modules/ruoyi-job/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-job/src/main/resources/bootstrap.yml index bb947c6e..f8eb4379 100644 --- a/ruoyi-modules/ruoyi-job/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-job/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml index d0362649..bbd4382c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-visual/ruoyi-monitor/src/main/resources/bootstrap.yml b/ruoyi-visual/ruoyi-monitor/src/main/resources/bootstrap.yml index 09a81fa8..e063163e 100644 --- a/ruoyi-visual/ruoyi-monitor/src/main/resources/bootstrap.yml +++ b/ruoyi-visual/ruoyi-monitor/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/XhpcClearingHistoryOrderServiceImpl.java b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/XhpcClearingHistoryOrderServiceImpl.java index d43c5db8..bf453179 100644 --- a/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/XhpcClearingHistoryOrderServiceImpl.java +++ b/xhpc-modules/xhpc-activity/src/main/java/com/xhpc/activity/service/impl/XhpcClearingHistoryOrderServiceImpl.java @@ -145,6 +145,7 @@ public class XhpcClearingHistoryOrderServiceImpl extends BaseService implements writer.addHeaderAlias("endSoc", "结算SOC"); writer.addHeaderAlias("startTime", "开始充电时间"); writer.addHeaderAlias("endTime", "结束充电时间"); + writer.addHeaderAlias("totalPower", "电量"); // 默认的,未添加alias的属性也会写出,如果想只写出加了别名的字段,可以调用此方法排除之 writer.setOnlyAlias(true); // 一次性写出内容,使用默认样式,强制输出标题 diff --git a/xhpc-modules/xhpc-activity/src/main/resources/bootstrap.yml b/xhpc-modules/xhpc-activity/src/main/resources/bootstrap.yml index 0f17bfa1..f2b7e48a 100644 --- a/xhpc-modules/xhpc-activity/src/main/resources/bootstrap.yml +++ b/xhpc-modules/xhpc-activity/src/main/resources/bootstrap.yml @@ -19,10 +19,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 127.0.0.1:8858 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: 127.0.0.1:8858 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/xhpc-modules/xhpc-card/src/main/resources/bootstrap.yml b/xhpc-modules/xhpc-card/src/main/resources/bootstrap.yml index 7b26271c..2a4e98a5 100644 --- a/xhpc-modules/xhpc-card/src/main/resources/bootstrap.yml +++ b/xhpc-modules/xhpc-card/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/controller/XhpcChargingPileController.java b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/controller/XhpcChargingPileController.java index 4fc447b5..fac28b43 100644 --- a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/controller/XhpcChargingPileController.java +++ b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/controller/XhpcChargingPileController.java @@ -244,7 +244,7 @@ public class XhpcChargingPileController extends BaseController { if(powerNumber<1 || powerNumber>100){ return AjaxResult.error("充电桩最大允许输出功率1~100之内"); } - REDIS.setCacheObject(serialNumber+":powerNumber",powerNumber); + redisService.setCacheObject("pile:"+serialNumber+":powerNumber",powerNumber); R r = powerPileService.pileConfigSettings(serialNumber,powerNumber.toString()); if(r.getCode() !=200){ return AjaxResult.error(r.getMsg()); diff --git a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcTimingChargingModelServiceImpl.java b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcTimingChargingModelServiceImpl.java index e92c1f73..bc779fcf 100644 --- a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcTimingChargingModelServiceImpl.java +++ b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcTimingChargingModelServiceImpl.java @@ -163,6 +163,20 @@ public class XhpcTimingChargingModelServiceImpl extends BaseService implements I xhpcTimingChargingModel.setCreateTime(new Date()); xhpcTimingChargingModel.setChargingStationId(chargingStationId); xhpcTimingChargingModel.setPhone(xhpcTimingChargingModelDto.getPhone()); + + Integer[] chargingPileIds = xhpcTimingChargingModelDto.getChargingPileIds(); + String PileIds =""; + for (int i = 0; i 1){ + PileIds =PileIds+chargingPileIds[i]; + }else if(chargingPileIds.length==1){ + PileIds =chargingPileIds[i]+""; + }else{ + PileIds =PileIds+","+chargingPileIds[i]; + } + } + xhpcTimingChargingModel.setPileIds(PileIds); + if(xhpcTimingChargingModelDto.getTimingChargingModelId() !=null){ xhpcTimingChargingModel.setTimingChargingModelId(xhpcTimingChargingModelDto.getTimingChargingModelId()); xhpcTimingChargingModelMapper.updateXhpcTimingChargingModel(xhpcTimingChargingModel); @@ -415,6 +429,16 @@ public class XhpcTimingChargingModelServiceImpl extends BaseService implements I } //查询是否是未执行状态 map = xhpcTimingChargingModelMapper.getXhpcTimingChargingModelMapById(timingChargingModelId,loginUser.getTenantId()); + + if(map.get("pileIds")!=null){ + String[] split = map.get("pileIds").toString().split(","); + Integer [] piles =new Integer [split.length]; + for (int i = 0; i > xhpcRateList = xhpcTimingChargingModelMapper.getXhpcTimingChargingRateList(timingChargingModelId); diff --git a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcTimingChargingPowerServiceImpl.java b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcTimingChargingPowerServiceImpl.java index 97642df2..f1af9be1 100644 --- a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcTimingChargingPowerServiceImpl.java +++ b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcTimingChargingPowerServiceImpl.java @@ -88,7 +88,7 @@ public class XhpcTimingChargingPowerServiceImpl implements IXhpcTimingChargingPo String st =""; for (int i = 0; i 1){ - st =st+chargingPileIds[i]+","; + st =st+chargingPileIds[i]; }else if(chargingPileIds.length==1){ st =chargingPileIds[i]+""; }else{ diff --git a/xhpc-modules/xhpc-charging-station/src/main/resources/bootstrap.yml b/xhpc-modules/xhpc-charging-station/src/main/resources/bootstrap.yml index 4263af98..df6f2994 100644 --- a/xhpc-modules/xhpc-charging-station/src/main/resources/bootstrap.yml +++ b/xhpc-modules/xhpc-charging-station/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/xhpc-modules/xhpc-charging-station/src/main/resources/mapper/XhpcTimingChargingModelMapper.xml b/xhpc-modules/xhpc-charging-station/src/main/resources/mapper/XhpcTimingChargingModelMapper.xml index 3679916f..1dedd1a3 100644 --- a/xhpc-modules/xhpc-charging-station/src/main/resources/mapper/XhpcTimingChargingModelMapper.xml +++ b/xhpc-modules/xhpc-charging-station/src/main/resources/mapper/XhpcTimingChargingModelMapper.xml @@ -599,7 +599,8 @@ tcm.timing_time as timingTime, tcm.status as status, tcm.create_time as createTime, - tcm.phone as phone + tcm.phone as phone, + tcm.pile_ids as pileIds from xhpc_timing_charging_model as tcm left join xhpc_charging_station as cs on cs.charging_station_id = tcm.charging_station_id where tcm.timing_charging_model_id =#{timingChargingModelId} diff --git a/xhpc-modules/xhpc-charging-station/src/main/resources/mapper/XhpcTimingChargingPowerMapper.xml b/xhpc-modules/xhpc-charging-station/src/main/resources/mapper/XhpcTimingChargingPowerMapper.xml index 7d878332..4a10391d 100644 --- a/xhpc-modules/xhpc-charging-station/src/main/resources/mapper/XhpcTimingChargingPowerMapper.xml +++ b/xhpc-modules/xhpc-charging-station/src/main/resources/mapper/XhpcTimingChargingPowerMapper.xml @@ -159,9 +159,13 @@ diff --git a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/dto/XhpcTimingChargingModelDto.java b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/dto/XhpcTimingChargingModelDto.java index 06dd964a..1ff9deba 100644 --- a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/dto/XhpcTimingChargingModelDto.java +++ b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/dto/XhpcTimingChargingModelDto.java @@ -20,4 +20,6 @@ public class XhpcTimingChargingModelDto extends XhpcTimingChargingModel { //默认时段费率 String defaultPeriodId; + + } diff --git a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcTimingChargingModel.java b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcTimingChargingModel.java index 91753050..96ab627f 100644 --- a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcTimingChargingModel.java +++ b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcTimingChargingModel.java @@ -56,4 +56,8 @@ public class XhpcTimingChargingModel extends BaseEntity { private String tenantId; private String phone; + + private String pileIds; + + private Integer [] chargingPileIds; } diff --git a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcTimingChargingPowerModel.java b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcTimingChargingPowerModel.java index 9792747a..b7ffe51c 100644 --- a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcTimingChargingPowerModel.java +++ b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcTimingChargingPowerModel.java @@ -61,5 +61,7 @@ public class XhpcTimingChargingPowerModel extends BaseEntity { private String pileIds; + private String chargingStationName; + private Integer [] chargingPileIds; } diff --git a/xhpc-modules/xhpc-general/src/main/resources/bootstrap.yml b/xhpc-modules/xhpc-general/src/main/resources/bootstrap.yml index dbb21612..a42b67b3 100644 --- a/xhpc-modules/xhpc-general/src/main/resources/bootstrap.yml +++ b/xhpc-modules/xhpc-general/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/api/XhpcChargeOrderController.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/api/XhpcChargeOrderController.java index 5018c20c..1f66613c 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/api/XhpcChargeOrderController.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/api/XhpcChargeOrderController.java @@ -1,5 +1,6 @@ package com.xhpc.order.api; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.xhpc.common.api.WebSocketService; @@ -14,6 +15,7 @@ import com.xhpc.order.service.IXhpcChargeOrderService; import com.xhpc.order.service.IXhpcHistoryOrderService; import com.xhpc.system.api.model.LoginUser; import io.swagger.annotations.Api; +import org.apache.ibatis.annotations.Param; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -24,10 +26,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @author yuyang @@ -221,7 +220,6 @@ public class XhpcChargeOrderController extends BaseController { * @param userId * @param serialNumber 终端编码 * @param type 1 微信 - * @param type 1 微信 * @return */ @GetMapping("/cycStartUp") @@ -250,4 +248,11 @@ public class XhpcChargeOrderController extends BaseController { return iXhpcChargeOrderService.chargingCapacityStartUp(request,userId, serialNumber, type,chargingCapacity); } + @GetMapping("/ceshi") + public AjaxResult ceshi(String phone,String vin, String plateNnum,Long chargingStationId,String time){ + String format = DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"); + int blacklistUser = iXhpcChargeOrderService.getBlacklistUser(phone, vin, plateNnum, chargingStationId, format); + return AjaxResult.success(blacklistUser); + } + } 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 55c27e83..cc66398f 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 @@ -335,7 +335,7 @@ public class XhpcPileOrderController extends BaseController { //停止充电 xhpcChargeOrder.setRemark("充电桩校验故障"); xhpcChargeOrderService.updateXhpcChargeOrder(xhpcChargeOrder); - powerPileService.stopCharging(orderNo, substring,orderNo.substring(0, 16), "0A"); + powerPileService.stopCharging(orderNo, substring,orderNo.substring(0, 16), "0C"); System.out.println("=====================p平台下发停止充电=============================="+xhpcChargeOrder.getSerialNumber()); return R.fail(500,"充电桩校验故障"); } @@ -538,7 +538,12 @@ public class XhpcPileOrderController extends BaseController { xhpcChargeOrder.setEndTime(date); xhpcChargeOrder.setChargingTime("0分"); xhpcChargeOrder.setChargingDegree(bigDecimal1); - xhpcChargeOrder.setType("199"); + + if(cacheMap.get("stopReasonHex")!=null){ + xhpcChargeOrder.setType(cacheMap.get("stopReasonHex").toString()); + }else{ + xhpcChargeOrder.setType("199"); + } xhpcChargeOrder.setAmountCharged(bigDecimal1); xhpcChargeOrder.setChargingTimeNumber(0L); xhpcChargeOrderService.updateXhpcChargeOrder(xhpcChargeOrder); @@ -557,7 +562,7 @@ public class XhpcPileOrderController extends BaseController { xhpcHistoryOrder.setMeterValueEndEvcs(cacheOrderData.getElectricMeterEnd().doubleValue()); xhpcHistoryOrder.setVinNormal(xhpcChargeOrder.getVinNormal()); xhpcHistoryOrder.setType(1); - + xhpcHistoryOrder.setChargingMode(xhpcChargeOrder.getChargingMode()); Map userMessage =new HashMap<>(); if(!UserTypeUtil.INTERNET_TYPE.equals(source)||(UserTypeUtil.INTERNET_TYPE.equals(source) && userId>1000)){ @@ -906,6 +911,23 @@ public class XhpcPileOrderController extends BaseController { // }else{ // xhpcHistoryOrderService.addXhpcChargeOrder(null,orderNo,1); // } + //双枪修改逻辑,查询是否是双枪 + if(xhpcChargeOrder.getSunchaStatus()!=0){ + String userType =UserTypeUtil.USER; + if(UserTypeUtil.COMMUNIT_TYPE==xhpcChargeOrder.getSource()){ + userType =UserTypeUtil.COMMUNIT; + }else if(UserTypeUtil.CUSTOMERS_TYPE==xhpcChargeOrder.getSource()){ + userType =UserTypeUtil.CUSTOMERS; + } + Map map = new HashMap<>(); + if(xhpcChargeOrder.getSunchaStatus()==1){ + map.put("aBalanceStatus",2); + }else{ + map.put("bBalanceStatus",2); + } + String key = "user:" + xhpcChargeOrder.getUserId() + userType + ".order"; + redisService.setCacheMap(key,map); + } Date date = new Date(); xhpcChargeOrder.setStatus(2); xhpcChargeOrder.setEndTime(date); @@ -947,6 +969,24 @@ public class XhpcPileOrderController extends BaseController { if(status==0){ xhpcChargeOrder.setStatus(0); xhpcChargeOrder.setStartTime(date); + //查询是否是双枪 + if(xhpcChargeOrder.getSunchaStatus()!=0){ + String userType =UserTypeUtil.USER; + if(UserTypeUtil.COMMUNIT_TYPE==xhpcChargeOrder.getSource()){ + userType =UserTypeUtil.COMMUNIT; + }else if(UserTypeUtil.CUSTOMERS_TYPE==xhpcChargeOrder.getSource()){ + userType =UserTypeUtil.CUSTOMERS; + } + + Map map = new HashMap<>(); + if(xhpcChargeOrder.getSunchaStatus()==1){ + map.put("aBalanceStatus",0); + }else{ + map.put("bBalanceStatus",0); + } + String key = "user:" + xhpcChargeOrder.getUserId() + userType + ".order"; + redisService.setCacheMap(key,map); + } } else{ xhpcChargeOrder.setStatus(-1); xhpcChargeOrder.setDelFlag(1); diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcPileRegularInspectController.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcPileRegularInspectController.java index 89919512..2ef80f27 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcPileRegularInspectController.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcPileRegularInspectController.java @@ -52,7 +52,7 @@ public class XhpcPileRegularInspectController extends BaseController { //费率定时任务 @GetMapping("/getRateTime") - @Scheduled(cron = "0 0/4 * * * ?") + //@Scheduled(cron = "0 0/4 * * * ?") public void getRateTime() { xhpcPileRegularInspectService.getRateTime(); diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcStopChargingOrderController.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcStopChargingOrderController.java index da807c62..5768e86f 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcStopChargingOrderController.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcStopChargingOrderController.java @@ -64,10 +64,6 @@ public class XhpcStopChargingOrderController extends BaseController { if(cacheMap.get("version") !=null){ version =cacheMap.get("version").toString(); } - System.out.println("=================111========停止充电命令已下发==================停止 充电=================="+serialNumberOrderMap); - System.out.println("=================111========停止充电命令已下发==================停止 充电=================="+serialNumberOrderMap); - System.out.println("=================111========停止充电命令已下发==================停止 充电=================="+serialNumberOrderMap); - R r = powerPileService.stopCharging(serialNumberOrderMap, serialNumberOrderMap.substring(0,14), serialNumberOrderMap.substring(0,16), version); if(r.getCode()==200){ diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/domain/XhpcChargeOrder.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/domain/XhpcChargeOrder.java index 3d3d2c07..fc4b790e 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/domain/XhpcChargeOrder.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/domain/XhpcChargeOrder.java @@ -157,6 +157,9 @@ public class XhpcChargeOrder extends BaseEntity { private String vinNormal; private Integer chargingCapacity; + + private Integer sunchaStatus; + public Integer getStopReasonEvcs() { return stopReasonEvcs; @@ -494,4 +497,12 @@ public class XhpcChargeOrder extends BaseEntity { public void setChargingCapacity(Integer chargingCapacity) { this.chargingCapacity = chargingCapacity; } + + public Integer getSunchaStatus() { + return sunchaStatus; + } + + public void setSunchaStatus(Integer sunchaStatus) { + this.sunchaStatus = sunchaStatus; + } } diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/mapper/XhpcChargeOrderMapper.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/mapper/XhpcChargeOrderMapper.java index 071dac47..c0d9f0d1 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/mapper/XhpcChargeOrderMapper.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/mapper/XhpcChargeOrderMapper.java @@ -52,6 +52,15 @@ public interface XhpcChargeOrderMapper { */ int updateUserBalance(@Param("userId")Long userId, @Param("balance")BigDecimal balance); + /** + * 双枪修改金额 + * @param userId + * @param balance + * @param sunchaStatus + * @return + */ + int updateUserSunchaBalance(@Param("userId")Long userId, @Param("balance")BigDecimal balance, @Param("sunchaStatus")Integer sunchaStatus); + /** * 社区用户修改余额 * @param userId @@ -60,7 +69,14 @@ public interface XhpcChargeOrderMapper { */ int updateCommunityBalance(@Param("userId")Long userId, @Param("balance")BigDecimal balance); - + /** + * 双枪修改金额 + * @param userId + * @param balance + * @param sunchaStatus + * @return + */ + int updateCommunitySunchaBalance(@Param("userId")Long userId, @Param("balance")BigDecimal balance, @Param("sunchaStatus")Integer sunchaStatus); /** * B端用户修改余额 * @param userId @@ -68,6 +84,15 @@ public interface XhpcChargeOrderMapper { * @return */ int updateCustomersBalance(@Param("userId")Long userId, @Param("balance")BigDecimal balance); + /** + * 双枪修改金额 + * @param userId + * @param balance + * @param sunchaStatus + * @return + */ + int updateCustomersSunchaBalance(@Param("userId")Long userId, @Param("balance")BigDecimal balance, @Param("sunchaStatus")Integer sunchaStatus); + /** * 更新川逸充用户余额 @@ -248,5 +273,17 @@ public interface XhpcChargeOrderMapper { //获取充电站信息 Map getChargingStationById(@Param("chargingStationId")Long chargingStationId); + //修改账户金额C端 + int updateXhpcAppUser(@Param("userId")Long userId,@Param("aBalance")BigDecimal aBalance,@Param("bBalance")BigDecimal bBalance); + + //修改账户金额社区用户 + int updateXhpcCommunityPersonnel(@Param("userId")Long userId,@Param("aBalance")BigDecimal aBalance,@Param("bBalance")BigDecimal bBalance); + + //修改账户金额B端用户 + int updateXhpcCustomersPersonnel(@Param("userId")Long userId,@Param("aBalance")BigDecimal aBalance,@Param("bBalance")BigDecimal bBalance); + + //查询是否可以充电 + int getBlacklistUser(@Param("phone")String phone,@Param("vin")String vin,@Param("plateNnum")String plateNnum,@Param("chargingStationId")Long chargingStationId,@Param("time")String time); + } diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/IXhpcChargeOrderService.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/IXhpcChargeOrderService.java index 4ddb5565..c02ad948 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/IXhpcChargeOrderService.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/IXhpcChargeOrderService.java @@ -5,6 +5,7 @@ import com.xhpc.common.core.web.domain.AjaxResult; import com.xhpc.common.domain.XhpcRate; import com.xhpc.order.domain.XhpcChargeOrder; import com.xhpc.order.domain.XhpcOrderRedisRecord; +import org.apache.ibatis.annotations.Param; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; @@ -114,6 +115,11 @@ public interface IXhpcChargeOrderService { */ int updateUserBalance(Long userId, BigDecimal balance,Integer source,String tenantId); + /** + * 修改双枪余额 + */ + int updateUserSunchaBalance(Long userId, BigDecimal balance,Integer source,String tenantId,Integer sunchaStatus); + /** * 获取运营商信息 * @param chargingStationId @@ -216,4 +222,11 @@ public interface IXhpcChargeOrderService { */ AjaxResult chargingCapacityStartUp(HttpServletRequest request, Long userId, String serialNumber, Integer type,Integer chargingCapacity); + + /** + * 判断用户是否在充电中 + */ + String countXhpcRealTimeOrder(Long userId,Integer source,String tenantId); + + int getBlacklistUser(String phone,String vin,String plateNnum,Long chargingStationId,String time); } 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 7a4f6da9..c2530384 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 @@ -191,6 +191,7 @@ public class XhpcChargeOrderServiceImpl extends BaseService implements IXhpcChar return AjaxResult.error(UserTypeUtil.LOGIN_TYPE, "此账号不能在该场站充电,请使用手机号登录"); } } + xhpcChargeOrder.setDriverId(userMessage.get("phone").toString()); String pattern = "^([0-9]{16})"; Pattern compile = Pattern.compile(pattern); @@ -226,10 +227,16 @@ public class XhpcChargeOrderServiceImpl extends BaseService implements IXhpcChar if (Integer.parseInt(userMessage.get("isRefundApplication").toString()) != 0) { return AjaxResult.error(1101, "你有申请退款订单在审核中,需要充电请取消申请退款"); } - //充电用户是否在充电中 - String i = xhpcChargeOrderMapper.countXhpcRealTimeOrder(userId,userType,tenantId); - if (!"".equals(i) && i!=null) { - return AjaxResult.error(1102, "车辆正在充电,请查询车辆充电信息"); +// String i = xhpcChargeOrderMapper.countXhpcRealTimeOrder(userId,userType,tenantId); +// if (!"".equals(i) && i!=null) { +// return AjaxResult.error(1102, "车辆正在充电,请查询车辆充电信息"); +// } + if(Integer.valueOf(userMessage.get("sunchaSwitch").toString()) ==0){ + //充电用户是否在充电中 + String i = xhpcChargeOrderMapper.countXhpcRealTimeOrder(userId,userType,tenantId); + if (!"".equals(i) && i!=null) { + return AjaxResult.error(1102, "车辆正在充电,请查询车辆充电信息"); + } } //终端状态是否空闲 //是否插枪 @@ -273,6 +280,15 @@ public class XhpcChargeOrderServiceImpl extends BaseService implements IXhpcChar } } + //判断是否可以充电(黑名单) + int blacklistUser = xhpcChargeOrderMapper.getBlacklistUser(userMessage.get("phone").toString(), userMessage.get("vinSpecCode").toString(), userMessage.get("vehicleName").toString(), xhpcTerminal.getChargingStationId(), DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); + if(blacklistUser>0){ + return AjaxResult.error(1104, "该车辆暂停充电,请联系客服"); + } + + if(Integer.valueOf(userMessage.get("sunchaSwitch").toString()) !=0){ + return startUpSuncha(userMessage,xhpcChargeOrder,xhpcTerminal,tenantId,userType,terminalSerialNumber,type); + } //余额 String balance = new BigDecimal(userMessage.get("balance").toString()).multiply(new BigDecimal(100)).toString(); //获取桩信息 @@ -332,6 +348,12 @@ public class XhpcChargeOrderServiceImpl extends BaseService implements IXhpcChar } logger.info("<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>:"+number); logger.info("<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>:"+startChargingData.getSoc()); + + + + + + //创建充电订单(充电启动soc初始值,结束是获取,并修改状态) xhpcChargeOrder.setChargingStationId(xhpcTerminal.getChargingStationId()); @@ -496,6 +518,19 @@ public class XhpcChargeOrderServiceImpl extends BaseService implements IXhpcChar return 0; } + @Override + public int updateUserSunchaBalance(Long userId, BigDecimal balance, Integer source, String tenantId,Integer sunchaStatus) { + //修改用户余额 + if(UserTypeUtil.USER_TYPE.equals(source)){ + return xhpcChargeOrderMapper.updateUserSunchaBalance(userId, balance,sunchaStatus); + }else if (UserTypeUtil.COMMUNIT_TYPE.equals(source)){ + return xhpcChargeOrderMapper.updateCommunitySunchaBalance(userId, balance,sunchaStatus); + }else if(UserTypeUtil.CUSTOMERS_TYPE.equals(source)){ + return xhpcChargeOrderMapper.updateCustomersSunchaBalance(userId, balance,sunchaStatus); + } + return 0; + } + @Override public Map getOperatorMessage(Long chargingStationId) { @@ -562,6 +597,9 @@ public class XhpcChargeOrderServiceImpl extends BaseService implements IXhpcChar r.setMsg("场站不支持该流量方充电"); return r; } + + + StartChargingData startChargingData = new StartChargingData(); //500000 equals 500 yuan startChargingData.setBalance(chargingAmt * 100); @@ -639,7 +677,13 @@ public class XhpcChargeOrderServiceImpl extends BaseService implements IXhpcChar } } - + //判断是否可以充电(黑名单) + int blacklistUser = xhpcChargeOrderMapper.getBlacklistUser(driverId, null, plateNum, xhpcTerminal.getChargingStationId(), DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); + if(blacklistUser>0){ + r.setCode(500); + r.setMsg("该车辆暂停充电,请联系客服"); + return r; + } //启动充电 //订单流水号 终端号+年月日时分秒+自增4位 共32位 @@ -1817,6 +1861,225 @@ public class XhpcChargeOrderServiceImpl extends BaseService implements IXhpcChar return AjaxResult.error(UserTypeUtil.LOGIN_TYPE, "请确认设备网络状况正常和枪正确插好后重新尝试"); } + @Override + public String countXhpcRealTimeOrder(Long userId, Integer source, String tenantId) { + return xhpcChargeOrderMapper.countXhpcRealTimeOrder(userId,source,tenantId); + } + + @Override + public int getBlacklistUser(String phone, String vin, String plateNnum, Long chargingStationId, String time) { + + return xhpcChargeOrderMapper.getBlacklistUser(phone, vin, plateNnum, chargingStationId, time); + } + + //判断双枪启规则 + private AjaxResult startUpSuncha(Map userMessage,XhpcChargeOrder xhpcChargeOrder,XhpcTerminal xhpcTerminal,String tenantId,Integer source,String terminalSerialNumber,Integer type){ + + //余额 + String balance = new BigDecimal(userMessage.get("balance").toString()).multiply(new BigDecimal(100)).toString(); + + Long appUserId = Long.valueOf(userMessage.get("appUserId").toString()); + //获取桩信息 + Map xhpcChargingPileById =xhpcChargeOrderMapper.getXhpcChargingPileById(xhpcTerminal.getChargingPileId(),tenantId); + + String userType =UserTypeUtil.USER; + if(UserTypeUtil.COMMUNIT_TYPE==source){ + userType =UserTypeUtil.COMMUNIT; + }else if(UserTypeUtil.CUSTOMERS_TYPE==source){ + userType =UserTypeUtil.CUSTOMERS; + } + //判断是否有车充电 + Map cacheMap = redisService.getCacheMap("user:" + appUserId + userType + ".order"); + if(cacheMap!=null){ + boolean a =true; //A账户未启动 + boolean b =true; //b账户未启动 + //查看AB账户启动情况 + if(cacheMap.get("aBalanceStatus")!=null){ + Integer status = Integer.valueOf(cacheMap.get("aBalanceStatus").toString()); + if(status==0 || status==2){ + a =false; + } + } + if(cacheMap.get("bBalanceStatus")!=null){ + Integer status = Integer.valueOf(cacheMap.get("bBalanceStatus").toString()); + if(status==0 || status==2){ + b =false; + } + } + if(a && b){ + //账号金额平分,修改账号金额 + BigDecimal aBigDecimal = new BigDecimal(userMessage.get("balance").toString()).divide(new BigDecimal(2)).setScale(0, BigDecimal.ROUND_UP); + + BigDecimal bBigDecimal =new BigDecimal(userMessage.get("balance").toString()).subtract(aBigDecimal); + + if(UserTypeUtil.USER_TYPE==source){ + xhpcChargeOrderMapper.updateXhpcAppUser(appUserId,aBigDecimal,bBigDecimal); + }else if(UserTypeUtil.COMMUNIT_TYPE==source){ + xhpcChargeOrderMapper.updateXhpcCommunityPersonnel(appUserId,aBigDecimal,bBigDecimal); + }else if(UserTypeUtil.CUSTOMERS_TYPE==source){ + xhpcChargeOrderMapper.updateXhpcCustomersPersonnel(appUserId,aBigDecimal,bBigDecimal); + } + String key = "user:" + appUserId + userType + ".order"; + redisService.deleteObject(key); + + return getAjaxResult(userMessage, xhpcChargeOrder, xhpcTerminal, tenantId, source, terminalSerialNumber, type, xhpcChargingPileById, appUserId, userType, aBigDecimal.multiply(new BigDecimal(100)).toString(),1); + }else if(a){ + BigDecimal bigDecimal = new BigDecimal(userMessage.get("aBalance").toString()); + return getAjaxResult(userMessage, xhpcChargeOrder, xhpcTerminal, tenantId, source, terminalSerialNumber, type, xhpcChargingPileById, appUserId, userType, bigDecimal.multiply(new BigDecimal(100)).toString(),1); + }else{ + BigDecimal bigDecimal = new BigDecimal(userMessage.get("bBalance").toString()); + return getAjaxResult(userMessage, xhpcChargeOrder, xhpcTerminal, tenantId, source, terminalSerialNumber, type, xhpcChargingPileById, appUserId, userType, bigDecimal.multiply(new BigDecimal(100)).toString(),2); + } + }else{ + //账号金额平分,修改账号金额 + BigDecimal aBigDecimal = new BigDecimal(balance).divide(new BigDecimal(2)).setScale(0, BigDecimal.ROUND_UP); + + BigDecimal bBigDecimal =new BigDecimal(balance).subtract(aBigDecimal); + if(UserTypeUtil.USER_TYPE==source){ + xhpcChargeOrderMapper.updateXhpcAppUser(appUserId,aBigDecimal,bBigDecimal); + }else if(UserTypeUtil.COMMUNIT_TYPE==source){ + xhpcChargeOrderMapper.updateXhpcCommunityPersonnel(appUserId,aBigDecimal,bBigDecimal); + }else if(UserTypeUtil.CUSTOMERS_TYPE==source){ + xhpcChargeOrderMapper.updateXhpcCustomersPersonnel(appUserId,aBigDecimal,bBigDecimal); + } + return getAjaxResult(userMessage, xhpcChargeOrder, xhpcTerminal, tenantId, source, terminalSerialNumber, type, xhpcChargingPileById, appUserId, userType, aBigDecimal.toString(),1); + } + } + + private AjaxResult getAjaxResult(Map userMessage, XhpcChargeOrder xhpcChargeOrder, XhpcTerminal xhpcTerminal, String tenantId, Integer source, String terminalSerialNumber, Integer type, Map xhpcChargingPileById, Long appUserId, String userType, String bigDecimal,Integer sunchaStatus) { + //启动充电 + StartChargingData startChargingData = new StartChargingData(); + //订单流水号 终端号+年月日时分秒+自增4位 共32位 + String orderNo = genOrder(terminalSerialNumber); + + startChargingData.setOrderNo(orderNo); + if(userMessage.get("phone") !=null){ + startChargingData.setTel(userMessage.get("phone").toString()); + xhpcChargeOrder.setDriverId(userMessage.get("phone").toString()); + } + startChargingData.setPileNo(xhpcTerminal.getPileSerialNumber()); + startChargingData.setGunId(xhpcTerminal.getSerialNumber().substring(14)); + startChargingData.setBalance(Double.valueOf(bigDecimal).intValue()); + if(xhpcChargingPileById.get("communicationProtocolVersion")!=null && !"".equals(xhpcChargingPileById.get("communicationProtocolVersion").toString())){ + startChargingData.setVersion(xhpcChargingPileById.get("communicationProtocolVersion").toString()); + }else{ + startChargingData.setVersion("0A"); + } + //用户、桩、平台(最小的) + int number =0; + if(!"".equals(userMessage.get("socUser")) && userMessage.get("socUser") !=null && userMessage.get("socProtect") !=null && !"0".equals(userMessage.get("socProtect").toString())){ + number =Integer.parseInt(userMessage.get("socUser").toString()); + logger.info("=========用户、桩、平台(最小的)===number==="+number); + } + //平台 + String soc = redisService.getCacheObject("global:"+ tenantId +":SOC"); + logger.info("=========用户、桩、平台(最小的)===soc==="+soc); + if(!"".equals(soc) && soc!=null){ + if(number!=0){ + if(Integer.parseInt(soc)-number<0){ + number=Integer.parseInt(soc); + logger.info("=========用户、桩、平台(最小的)1===number==="+number); + } + }else{ + number=Integer.parseInt(soc); + logger.info("=========用户、桩、平台(最小的)2===number==="+number); + } + } + Map operatorMessage = xhpcChargeOrderMapper.getOperatorMessage(xhpcTerminal.getChargingStationId()); + if(operatorMessage !=null && operatorMessage.get("soc") !=null && !"".equals(operatorMessage.get("soc"))){ + if(number!=0){ + if(Integer.parseInt(operatorMessage.get("soc").toString())-number<0){ + number=Integer.parseInt(operatorMessage.get("soc").toString()); + logger.info("=========用户、桩、平台(最小的)3===number==="+number); + } + }else{ + number=Integer.parseInt(operatorMessage.get("soc").toString()); + logger.info("=========用户、桩、平台(最小的)4===number==="+number); + } + } + if(number !=0){ + startChargingData.setSoc(number); + } + logger.info("<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>:"+number); + logger.info("<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>:"+startChargingData.getSoc()); + //创建充电订单(充电启动soc初始值,结束是获取,并修改状态) + + xhpcChargeOrder.setChargingStationId(xhpcTerminal.getChargingStationId()); + xhpcChargeOrder.setUserId(appUserId); + xhpcChargeOrder.setTerminalId(xhpcTerminal.getTerminalId()); + xhpcChargeOrder.setGunId(xhpcTerminal.getSerialNumber()); + xhpcChargeOrder.setSerialNumber(orderNo); + xhpcChargeOrder.setSource(source); + xhpcChargeOrder.setStatus(-1); + xhpcChargeOrder.setTenantId(tenantId); + + if (xhpcChargingPileById != null && xhpcChargingPileById.get("power") != null) { + xhpcChargeOrder.setPower(xhpcChargingPileById.get("power").toString()); + } + if (type == 1) { + xhpcChargeOrder.setChargingMode("微信"); + } else if (type == 2){ + xhpcChargeOrder.setChargingMode("支付宝"); + }else{ + xhpcChargeOrder.setChargingMode("App"); + } + xhpcChargeOrder.setCreateTime(Calendar.getInstance().getTime()); + xhpcChargeOrder.setType("91"); + if(sunchaStatus==1){ + xhpcChargeOrder.setSunchaStatus(1); + }else{ + xhpcChargeOrder.setSunchaStatus(2); + } + //获取车牌 + Map xhpcUserVehicleMessage = xhpcChargeOrderMapper.getXhpcUserVehicleMessage(xhpcChargeOrder.getUserId(), xhpcChargeOrder.getSource()); + if(xhpcUserVehicleMessage !=null && xhpcUserVehicleMessage.get("vehicleName") !=null){ + xhpcChargeOrder.setPlateNum(xhpcUserVehicleMessage.get("vehicleName").toString()); + } + xhpcChargeOrderMapper.addXhpcChargeOrder(xhpcChargeOrder); + + String finalUserType = userType; + executorService.execute(new Runnable() { + @Override + public void run() { + R r1 = powerPileService.startCharging(startChargingData); + logger.info("<<<<<<<<<<<<<<<<<<<<<<<<双枪充电返回>>>>>>>>>>>>>>>>>"); + //添加缓存数据 + String key = "user:" + appUserId + finalUserType + ".order"; + Map map = new HashMap<>(); + if(sunchaStatus==1){ + map.put("aBalance", bigDecimal); + map.put("aBalanceStatus",-1); + }else{ + map.put("bBalance", bigDecimal); + map.put("bBalanceStatus",-1); + } + + redisService.setCacheMap(key,map); + if(r1.getCode() == 200){ + try{ + xhpcChargeOrder.setRateModelId(Long.valueOf(r1.getData().toString())); + xhpcChargeOrderMapper.updateXhpcChargeOrder(xhpcChargeOrder); + //插一帧实时数据 + extracted(xhpcChargeOrder); + //修改双枪缓存状态 + if(sunchaStatus==1){ + map.put("aBalanceStatus",0); + }else{ + map.put("bBalanceStatus",0); + } + redisService.setCacheMap(key,map); + }catch (Exception e){ + e.printStackTrace(); + logger.error("update order[{}] failed.", orderNo); + } + } + } + }); + logger.info("<<<<<<<<<1111<<<<<<<<<<双枪启动<<<<>>>>>>>>>>>>>>>>:" + orderNo+"用户id:"+ appUserId); + return AjaxResult.success(); + } + + public static void main(String[] args) { try{ // //String alipayPublicKey1 = getAlipayPublicKey("C:\\Users\\Administrator\\Downloads\\alipayCertPublicKey_RSA2.crt"); diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcPileRegularInspectServiceImpl.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcPileRegularInspectServiceImpl.java index 775e023c..6a5dd507 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcPileRegularInspectServiceImpl.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcPileRegularInspectServiceImpl.java @@ -60,29 +60,29 @@ public class XhpcPileRegularInspectServiceImpl extends BaseService implements IX return AjaxResult.error(500, "请重新登录"); } - if(xhpcPileRegularInspect.getVersionNumberTime()==null || "".equals(xhpcPileRegularInspect.getVersionNumberTime())){ - return AjaxResult.error(500, "版本号检查时间必填"); - } +// if(xhpcPileRegularInspect.getVersionNumberTime()==null || "".equals(xhpcPileRegularInspect.getVersionNumberTime())){ +// return AjaxResult.error(500, "版本号检查时间必填"); +// } if(xhpcPileRegularInspect.getTimingPriceTime()==null || "".equals(xhpcPileRegularInspect.getTimingPriceTime())){ return AjaxResult.error(500, "校时校价时间必填"); } - if(xhpcPileRegularInspect.getRateTime()==null || "".equals(xhpcPileRegularInspect.getRateTime())){ - return AjaxResult.error(500, "费率时间必填"); - } - if(xhpcPileRegularInspect.getCopyingAdministratorTime()==null || "".equals(xhpcPileRegularInspect.getCopyingAdministratorTime())){ - return AjaxResult.error(500, "定期抄发给管理员时间必填"); - } - try{ - String[] split = xhpcPileRegularInspect.getVersionNumberTime().split(","); - for (int i = 0; i 24){ - return AjaxResult.error(500, "版本号检查时间格式不对"); - } - } - }catch (Exception e){ - return AjaxResult.error(500, "版本号检查时间格式不对"); - } +// if(xhpcPileRegularInspect.getRateTime()==null || "".equals(xhpcPileRegularInspect.getRateTime())){ +// return AjaxResult.error(500, "费率时间必填"); +// } +// if(xhpcPileRegularInspect.getCopyingAdministratorTime()==null || "".equals(xhpcPileRegularInspect.getCopyingAdministratorTime())){ +// return AjaxResult.error(500, "定期抄发给管理员时间必填"); +// } +// try{ +// String[] split = xhpcPileRegularInspect.getVersionNumberTime().split(","); +// for (int i = 0; i 24){ +// return AjaxResult.error(500, "版本号检查时间格式不对"); +// } +// } +// }catch (Exception e){ +// return AjaxResult.error(500, "版本号检查时间格式不对"); +// } try{ String[] split = xhpcPileRegularInspect.getTimingPriceTime().split(","); for (int i = 0; i 24){ - return AjaxResult.error(500, "定期抄发给管理员时间格式不对"); - } - } - }catch (Exception e){ - return AjaxResult.error(500, "定期抄发给管理员时间格式不对"); - } +// try{ +// String[] split = xhpcPileRegularInspect.getRateTime().split(","); +// for (int i = 0; i 24){ +// return AjaxResult.error(500, "定期抄发给管理员时间格式不对"); +// } +// } +// }catch (Exception e){ +// return AjaxResult.error(500, "定期抄发给管理员时间格式不对"); +// } try{ - String[] split = xhpcPileRegularInspect.getCopyingAdministratorTime().split(","); - for (int i = 0; i 24){ - return AjaxResult.error(500, "费率式不对"); - } - } +// String[] split = xhpcPileRegularInspect.getCopyingAdministratorTime().split(","); +// for (int i = 0; i 24){ +// return AjaxResult.error(500, "费率式不对"); +// } +// } if(xhpcPileRegularInspect.getPileRegularInspectId()==null){ Map map = xhpcPileRegularInspectMapper.getPileRegularInspectTenantId(tenantId); if(map !=null){ 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 cff62b68..d9917cab 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 @@ -1323,6 +1323,7 @@ public class XhpcRealTimeOrderServiceImpl extends BaseService implements IXhpcRe final String refundTypes =refundType; Map xhpcChargingPile = xhpcChargeOrderService.getXhpcChargingPile(xhpcChargeOrder.getTerminalId()); // 另起线程处理业务上传redis数据 + BigDecimal finalActPrice = actPrice; executorService.execute(new Runnable() { @Override public void run() { @@ -1391,11 +1392,85 @@ public class XhpcRealTimeOrderServiceImpl extends BaseService implements IXhpcRe addPileEndOrder(xhpcHistoryOrder, xhpcChargeOrder, xhpcChargeOrder.getSerialNumber(),1); if(!UserTypeUtil.INTERNET_TYPE.equals(source)){ try{ - //充电结算后自动申请退款 - if(userMessage !=null && "1".equals(userMessage.get("isRefund").toString()) && map !=null){ - if(UserTypeUtil.CHARGING_MODE_WX.equals(xhpcChargeOrder.getChargingMode()) ||UserTypeUtil.CHARGING_MODE_ZFB.equals(xhpcChargeOrder.getChargingMode()) ){ - if(UserTypeUtil.USER_TYPE.equals(source) || UserTypeUtil.COMMUNIT_TYPE.equals(source)){ - refundOrderService.sendNotice(balance2,openids,xhpcChargeOrder.getSource(),refundTypes,xhpcChargeOrder.getUserId().toString(),xhpcChargeOrder.getTenantId(),"充电结算自动申请退款"); + + //双枪修改逻辑,查询是否是双枪 + if(xhpcChargeOrder.getSunchaStatus()!=0){ + String userType =UserTypeUtil.USER; + if(UserTypeUtil.COMMUNIT_TYPE==xhpcChargeOrder.getSource()){ + userType =UserTypeUtil.COMMUNIT; + }else if(UserTypeUtil.CUSTOMERS_TYPE==xhpcChargeOrder.getSource()){ + userType =UserTypeUtil.CUSTOMERS; + } + Map map = new HashMap<>(); + String key = "user:" + xhpcChargeOrder.getUserId() + userType + ".order"; + Map cacheMap = redisService.getCacheMap(key); + + if(xhpcChargeOrder.getSunchaStatus()==1){ + map.put("aBalanceStatus",1); + BigDecimal aBalance = new BigDecimal(cacheMap.get("aBalance").toString()).divide(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_CEILING); + BigDecimal subtract = aBalance.subtract(finalActPrice); + map.put("aBalance",subtract.multiply(new BigDecimal(100)).toString()); + xhpcChargeOrderService.updateUserSunchaBalance(userId, subtract,xhpcChargeOrder.getSource(),xhpcChargeOrder.getTenantId(),1); + }else{ + map.put("bBalanceStatus",1); + BigDecimal bBalance = new BigDecimal(cacheMap.get("bBalance").toString()).divide(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_CEILING); + BigDecimal subtract = bBalance.subtract(finalActPrice); + map.put("bBalance",subtract.multiply(new BigDecimal(100)).toString()); + xhpcChargeOrderService.updateUserSunchaBalance(userId, subtract,xhpcChargeOrder.getSource(),xhpcChargeOrder.getTenantId(),2); + } + redisService.setCacheMap(key,map); + boolean a =true; //A账户未有充电中、异常订单 + boolean b =true; //b账户未有充电中、异常订单 + //查询所有状态 + if(cacheMap.get("aBalanceStatus")!=null){ + Integer status = Integer.valueOf(cacheMap.get("aBalanceStatus").toString()); + if(status==0 || status==2){ + a =false; + } + } + if(cacheMap.get("bBalanceStatus")!=null){ + Integer status = Integer.valueOf(cacheMap.get("bBalanceStatus").toString()); + if(status==0 || status==2){ + b =false; + } + } + if(a && b){ + String i = xhpcChargeOrderService.countXhpcRealTimeOrder(xhpcChargeOrder.getUserId(),xhpcChargeOrder.getSource(),xhpcChargeOrder.getTenantId()); + if (!"".equals(i) && i!=null) { + //"车辆正在充电,请查询车辆充电信息" + }else{ + //退款,判断A+B账号金额 = 总金额 + R user = userTypeService.getUser(null, userId, source, null, tenantId); + if(user !=null && user.getData() !=null ){ + Map userMap = (Map)user.getData(); + if (userMap == null || userMap.get("balance") == null) { + //获取用户信息失败 + }else{ + BigDecimal balance = new BigDecimal(userMap.get("balance").toString()); + BigDecimal aBalance = new BigDecimal(userMap.get("aBalance").toString()); + BigDecimal bBbalance = new BigDecimal(userMap.get("bBbalance").toString()); + if(balance.compareTo(aBalance.add(bBbalance))==0){ + //退款 + if(userMessage !=null && "1".equals(userMessage.get("isRefund").toString()) && map !=null){ + if(UserTypeUtil.CHARGING_MODE_WX.equals(xhpcChargeOrder.getChargingMode()) ||UserTypeUtil.CHARGING_MODE_ZFB.equals(xhpcChargeOrder.getChargingMode()) ){ + if(UserTypeUtil.USER_TYPE.equals(source) || UserTypeUtil.COMMUNIT_TYPE.equals(source)){ + refundOrderService.sendNotice(balance2,openids,xhpcChargeOrder.getSource(),refundTypes,xhpcChargeOrder.getUserId().toString(),xhpcChargeOrder.getTenantId(),"充电结算自动申请退款"); + redisService.deleteObject(key); + } + } + } + } + } + } + } + } + }else{ + //充电结算后自动申请退款 + if(userMessage !=null && "1".equals(userMessage.get("isRefund").toString()) && map !=null){ + if(UserTypeUtil.CHARGING_MODE_WX.equals(xhpcChargeOrder.getChargingMode()) ||UserTypeUtil.CHARGING_MODE_ZFB.equals(xhpcChargeOrder.getChargingMode()) ){ + if(UserTypeUtil.USER_TYPE.equals(source) || UserTypeUtil.COMMUNIT_TYPE.equals(source)){ + refundOrderService.sendNotice(balance2,openids,xhpcChargeOrder.getSource(),refundTypes,xhpcChargeOrder.getUserId().toString(),xhpcChargeOrder.getTenantId(),"充电结算自动申请退款"); + } } } } @@ -1421,6 +1496,8 @@ public class XhpcRealTimeOrderServiceImpl extends BaseService implements IXhpcRe evcsService.getCYCNotificationConnectorChargeStatus(orderMap); logger.info("<<<<<<<<<22<<<<<<<川逸充,调用订单结束推送>>>>>>>>>>>>>orderMap>>>>"+orderMap.toString()); } + + } }); //小华充电二台子社区充电站 道闸 diff --git a/xhpc-modules/xhpc-order/src/main/resources/bootstrap.yml b/xhpc-modules/xhpc-order/src/main/resources/bootstrap.yml index 8fd67a26..063176da 100644 --- a/xhpc-modules/xhpc-order/src/main/resources/bootstrap.yml +++ b/xhpc-modules/xhpc-order/src/main/resources/bootstrap.yml @@ -14,15 +14,15 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} -#logging: -# level: -# com.xhpc.order.mapper: debug +logging: + level: + com.xhpc.order.mapper: debug diff --git a/xhpc-modules/xhpc-order/src/main/resources/mapper/XhpcChargeOrderMapper.xml b/xhpc-modules/xhpc-order/src/main/resources/mapper/XhpcChargeOrderMapper.xml index dd01d7ed..613432e1 100644 --- a/xhpc-modules/xhpc-order/src/main/resources/mapper/XhpcChargeOrderMapper.xml +++ b/xhpc-modules/xhpc-order/src/main/resources/mapper/XhpcChargeOrderMapper.xml @@ -34,6 +34,7 @@ + @@ -144,13 +145,42 @@ update xhpc_app_user set balance=#{balance} where app_user_id=#{userId} + + + update xhpc_app_user + + a_balance = #{balance} + b_balance = #{balance} + + where app_user_id=#{userId} + + update xhpc_community_personnel set surplus_money=#{balance} where community_personnel_id=#{userId} + + + update xhpc_community_personnel + + a_balance = #{balance} + b_balance = #{balance} + + where community_personnel_id=#{userId} + + update xhpc_customers_personnel set surplus_money=#{balance} where customers_personnel_id=#{userId} + + update xhpc_customers_personnel + + a_balance = #{balance} + b_balance = #{balance} + + where customers_personnel_id=#{userId} + + update xhpc_app_internet_user set balance=#{balance} where app_internet_user_id=#{userId} @@ -279,6 +309,9 @@ charging_capacity, + + suncha_status, + @@ -365,6 +398,9 @@ #{chargingCapacity}, + + #{sunchaStatus}, + @@ -821,4 +857,49 @@ from xhpc_charging_station xcs where xcs.charging_station_id =#{chargingStationId} + + + update xhpc_app_user set a_balance=#{aBalance}, b_balance =#{bBalance} where app_user_id=#{userId} + + + + update xhpc_community_personnel set a_balance=#{aBalance}, b_balance =#{bBalance} where community_personnel_id=#{userId} + + + + update xhpc_customers_personnel set a_balance=#{aBalance}, b_balance =#{bBalance} where customers_personnel_id=#{userId} + + + diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java index 69fd1fd8..58148150 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java @@ -22,6 +22,7 @@ import com.xhpc.common.data.down.StartChargingData; import com.xhpc.common.domain.XhpcRechargeOrder; import com.xhpc.common.log.annotation.Log; import com.xhpc.common.log.enums.BusinessType; +import com.xhpc.common.redis.service.RedisService; import com.xhpc.common.security.service.TokenService; import com.xhpc.common.util.UserTypeUtil; import com.xhpc.payment.domain.AlipayNotifyParam; @@ -74,6 +75,10 @@ public class AlipayPaymentController { private IXhpcCommonPayment xhpcCommonPayment; @Autowired private UserTypeService userTypeService; + @Autowired + private RedisService redisService; + + private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); @@ -303,34 +308,92 @@ public class AlipayPaymentController { R user = userTypeService.getUser(null,userId, source, null, tenantId); if(user !=null && user.getData() !=null){ Map map = (Map)user.getData(); - String balance = StringUtils.valueOf(map.get("balance")); - BigDecimal money = BigDecimal.valueOf(Double.valueOf(balance)).add(xhpcRechargeOrder.getAmount()); - //判断用户是否在充电中 - String serialMumber = xhpcUserAccountStatementMapper.getUserHistotyChargeOrder(xhpcRechargeOrder.getUserId(),source,tenantId); - logger.info("<<<<<<<<<<<<充电终端>>>>>>>>>serialMumber:"+serialMumber); - if(!"".equals(serialMumber) && serialMumber !=null){ - //充电中 - postRefreshBalance(money, serialMumber); - } - if(UserTypeUtil.USER_TYPE.equals(xhpcRechargeOrder.getSource())){ - //增加用户余额 - XhpcAppUser xhpcAppUser = new XhpcAppUser(); - xhpcAppUser.setAppUserId(xhpcRechargeOrder.getUserId()); - xhpcAppUser.setBalance(money); - xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); - XhpcUserAccountStatement xhpcUserAccountStatement = new XhpcUserAccountStatement(); - xhpcUserAccountStatement.setType(StatusConstants.FLOWING_WATER_RECHARGE_TYPE); - xhpcUserAccountStatement.setRechargeOrderId(xhpcRechargeOrder.getRechargeOrderId()); - xhpcUserAccountStatement.setUserId(xhpcRechargeOrder.getUserId()); - xhpcUserAccountStatement.setAmount(xhpcRechargeOrder.getAmount()); - xhpcUserAccountStatement.setRemainingSum(xhpcAppUser.getBalance()); - xhpcUserAccountStatement.setCreateTime(new Date()); - xhpcUserAccountStatement.setRemark("支付宝充值订单!"); - xhpcUserAccountStatementMapper.insert(xhpcUserAccountStatement); + Integer sunchaSwitch = Integer.valueOf(map.get("sunchaSwitch").toString()); + if(sunchaSwitch==0){ + String balance = StringUtils.valueOf(map.get("balance")); + BigDecimal money = BigDecimal.valueOf(Double.valueOf(balance)).add(xhpcRechargeOrder.getAmount()); + //判断用户是否在充电中 + String serialMumber = xhpcUserAccountStatementMapper.getUserHistotyChargeOrder(xhpcRechargeOrder.getUserId(),source,tenantId); + logger.info("<<<<<<<<<<<<充电终端>>>>>>>>>serialMumber:"+serialMumber); + if(!"".equals(serialMumber) && serialMumber !=null){ + //充电中 + postRefreshBalance(money, serialMumber); + } + if(UserTypeUtil.USER_TYPE.equals(xhpcRechargeOrder.getSource())){ + //增加用户余额 + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(xhpcRechargeOrder.getUserId()); + xhpcAppUser.setBalance(money); + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + XhpcUserAccountStatement xhpcUserAccountStatement = new XhpcUserAccountStatement(); + xhpcUserAccountStatement.setType(StatusConstants.FLOWING_WATER_RECHARGE_TYPE); + xhpcUserAccountStatement.setRechargeOrderId(xhpcRechargeOrder.getRechargeOrderId()); + xhpcUserAccountStatement.setUserId(xhpcRechargeOrder.getUserId()); + xhpcUserAccountStatement.setAmount(xhpcRechargeOrder.getAmount()); + xhpcUserAccountStatement.setRemainingSum(xhpcAppUser.getBalance()); + xhpcUserAccountStatement.setCreateTime(new Date()); + xhpcUserAccountStatement.setRemark("支付宝充值订单!"); + xhpcUserAccountStatementMapper.insert(xhpcUserAccountStatement); + }else{ + //增加用户余额 + userTypeService.insertUserBalance(xhpcRechargeOrder.getAmount(),userId,source,tenantId,UserTypeUtil.RECHARGE_ZHB,UserTypeUtil.INSERT_BALANCE,null,xhpcRechargeOrder.getRechargeOrderId()); + } }else{ - //增加用户余额 - userTypeService.insertUserBalance(xhpcRechargeOrder.getAmount(),userId,source,tenantId,UserTypeUtil.RECHARGE_ZHB,UserTypeUtil.INSERT_BALANCE,null,xhpcRechargeOrder.getRechargeOrderId()); + String balance = StringUtils.valueOf(map.get("balance")); + BigDecimal aBigDecimal = xhpcRechargeOrder.getAmount().divide(new BigDecimal(2)).setScale(0, BigDecimal.ROUND_UP); + BigDecimal bBigDecimal =xhpcRechargeOrder.getAmount().subtract(aBigDecimal); + BigDecimal aBalance = new BigDecimal(map.get("aBalance").toString()).add(aBigDecimal); + BigDecimal bBalance = new BigDecimal(map.get("bBalance").toString()).add(bBigDecimal); + String userType =UserTypeUtil.USER; + if(UserTypeUtil.COMMUNIT_TYPE==xhpcRechargeOrder.getSource()){ + userType =UserTypeUtil.COMMUNIT; + }else if(UserTypeUtil.CUSTOMERS_TYPE==xhpcRechargeOrder.getSource()){ + userType =UserTypeUtil.CUSTOMERS; + } + String key = "user:" + xhpcRechargeOrder.getUserId() + userType + ".order"; + + //判断用户是否在充电中 + String serialMumberA = xhpcUserAccountStatementMapper.getUserHistotyChargeOrderSuncha(xhpcRechargeOrder.getUserId(),source,tenantId,1); + if(!"".equals(serialMumberA) && serialMumberA !=null){ + //充电中 + postRefreshBalance(aBalance, serialMumberA); + Map mapA = new HashMap<>(); + map.put("aBalance", aBalance); + redisService.setCacheMap(key,mapA); + } + String serialMumberB = xhpcUserAccountStatementMapper.getUserHistotyChargeOrderSuncha(xhpcRechargeOrder.getUserId(),source,tenantId,2); + if(!"".equals(serialMumberB) && serialMumberB !=null){ + //充电中 + postRefreshBalance(bBalance, serialMumberB); + Map mapA = new HashMap<>(); + map.put("bBalance", bBalance); + redisService.setCacheMap(key,mapA); + } + + BigDecimal money = BigDecimal.valueOf(Double.valueOf(balance)).add(xhpcRechargeOrder.getAmount()); + if(UserTypeUtil.USER_TYPE.equals(xhpcRechargeOrder.getSource())){ + //增加用户余额 + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(xhpcRechargeOrder.getUserId()); + xhpcAppUser.setBalance(money); + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + XhpcUserAccountStatement xhpcUserAccountStatement = new XhpcUserAccountStatement(); + xhpcUserAccountStatement.setType(StatusConstants.FLOWING_WATER_RECHARGE_TYPE); + xhpcUserAccountStatement.setRechargeOrderId(xhpcRechargeOrder.getRechargeOrderId()); + xhpcUserAccountStatement.setUserId(xhpcRechargeOrder.getUserId()); + xhpcUserAccountStatement.setAmount(xhpcRechargeOrder.getAmount()); + xhpcUserAccountStatement.setRemainingSum(xhpcAppUser.getBalance()); + xhpcUserAccountStatement.setCreateTime(new Date()); + xhpcUserAccountStatement.setRemark("支付宝充值订单!"); + xhpcUserAccountStatementMapper.insert(xhpcUserAccountStatement); + }else{ + //增加用户余额 + userTypeService.insertUserBalance(xhpcRechargeOrder.getAmount(),userId,source,tenantId,UserTypeUtil.RECHARGE_ZHB,UserTypeUtil.INSERT_BALANCE,null,xhpcRechargeOrder.getRechargeOrderId()); + } } + + + } } @@ -347,7 +410,7 @@ public class AlipayPaymentController { String s1 =money.multiply(new BigDecimal(100)).toString(); startChargingData.setBalance(Double.valueOf(s1).intValue()); R r = powerPileService.refreshBalance(startChargingData); - logger.info("<<<<<<<<<<<<余额下发>>>>>>>>>"); + logger.info("<<<<<<<<<<<<余额下发>>>>>>>>>"+s1); logger.info("<<<<<<<<<<<<"+r.getCode()+">>>>>>>>>"); logger.info("<<<<<<<<<<<<"+r.getMsg()+">>>>>>>>>"); diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/WxPaymentController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/WxPaymentController.java index 23efccd9..4f4c6b4e 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/WxPaymentController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/WxPaymentController.java @@ -13,6 +13,7 @@ import com.xhpc.common.core.web.domain.AjaxResult; import com.xhpc.common.data.down.StartChargingData; import com.xhpc.common.log.annotation.Log; import com.xhpc.common.log.enums.BusinessType; +import com.xhpc.common.redis.service.RedisService; import com.xhpc.common.security.service.TokenService; import com.xhpc.common.util.UserTypeUtil; import com.xhpc.payment.domain.XhpcAppInternetUser; @@ -80,6 +81,9 @@ public class WxPaymentController { private UserTypeService userTypeService; @Autowired private IXhpcCommonPayment xhpcCommonPayment; + @Autowired + private RedisService redisService; + private static final Logger logger = LoggerFactory.getLogger(WxPaymentController.class); private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); @@ -445,33 +449,89 @@ public class WxPaymentController { R user = userTypeService.getUser(null,userId, source, null, tenantId); if(user !=null && user.getData() !=null){ Map map = (Map)user.getData(); - String balance = StringUtils.valueOf(map.get("balance")); - BigDecimal money = BigDecimal.valueOf(Double.valueOf(balance)).add(xhpcRechargeOrder.getAmount()); - //判断用户是否在充电中 - String serialMumber = xhpcUserAccountStatementMapper.getUserHistotyChargeOrder(xhpcRechargeOrder.getUserId(),source,tenantId); - logger.info("<<<<<<<<<<<<充电终端>>>>>>>>>serialMumber:"+serialMumber); - if(!"".equals(serialMumber) && serialMumber !=null){ - //充电中 - postRefreshBalance(money, serialMumber); - } - if(UserTypeUtil.USER_TYPE.equals(source)){ - //增加用户余额 - XhpcAppUser xhpcAppUser = new XhpcAppUser(); - xhpcAppUser.setAppUserId(xhpcRechargeOrder.getUserId()); - xhpcAppUser.setBalance(money); - xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); - XhpcUserAccountStatement xhpcUserAccountStatement = new XhpcUserAccountStatement(); - xhpcUserAccountStatement.setType(StatusConstants.FLOWING_WATER_RECHARGE_TYPE); - xhpcUserAccountStatement.setRechargeOrderId(xhpcRechargeOrder.getRechargeOrderId()); - xhpcUserAccountStatement.setUserId(xhpcRechargeOrder.getUserId()); - xhpcUserAccountStatement.setAmount(xhpcRechargeOrder.getAmount()); - xhpcUserAccountStatement.setRemainingSum(xhpcAppUser.getBalance()); - xhpcUserAccountStatement.setCreateTime(new Date()); - xhpcUserAccountStatement.setRemark("微信充值订单!"); - xhpcUserAccountStatementMapper.insert(xhpcUserAccountStatement); + Integer sunchaSwitch = Integer.valueOf(map.get("sunchaSwitch").toString()); + if(sunchaSwitch==0){ + String balance = StringUtils.valueOf(map.get("balance")); + BigDecimal money = BigDecimal.valueOf(Double.valueOf(balance)).add(xhpcRechargeOrder.getAmount()); + //判断用户是否在充电中 + String serialMumber = xhpcUserAccountStatementMapper.getUserHistotyChargeOrder(xhpcRechargeOrder.getUserId(),source,tenantId); + logger.info("<<<<<<<<<<<<充电终端>>>>>>>>>serialMumber:"+serialMumber); + if(!"".equals(serialMumber) && serialMumber !=null){ + //充电中 + postRefreshBalance(money, serialMumber); + } + if(UserTypeUtil.USER_TYPE.equals(source)){ + //增加用户余额 + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(xhpcRechargeOrder.getUserId()); + xhpcAppUser.setBalance(money); + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + XhpcUserAccountStatement xhpcUserAccountStatement = new XhpcUserAccountStatement(); + xhpcUserAccountStatement.setType(StatusConstants.FLOWING_WATER_RECHARGE_TYPE); + xhpcUserAccountStatement.setRechargeOrderId(xhpcRechargeOrder.getRechargeOrderId()); + xhpcUserAccountStatement.setUserId(xhpcRechargeOrder.getUserId()); + xhpcUserAccountStatement.setAmount(xhpcRechargeOrder.getAmount()); + xhpcUserAccountStatement.setRemainingSum(xhpcAppUser.getBalance()); + xhpcUserAccountStatement.setCreateTime(new Date()); + xhpcUserAccountStatement.setRemark("微信充值订单!"); + xhpcUserAccountStatementMapper.insert(xhpcUserAccountStatement); + }else{ + //增加用户余额 + userTypeService.insertUserBalance(xhpcRechargeOrder.getAmount(),userId,source,tenantId, UserTypeUtil.RECHARGE_WX,UserTypeUtil.INSERT_BALANCE,null,xhpcRechargeOrder.getRechargeOrderId()); + } }else{ - //增加用户余额 - userTypeService.insertUserBalance(xhpcRechargeOrder.getAmount(),userId,source,tenantId, UserTypeUtil.RECHARGE_WX,UserTypeUtil.INSERT_BALANCE,null,xhpcRechargeOrder.getRechargeOrderId()); + String balance = StringUtils.valueOf(map.get("balance")); + BigDecimal aBigDecimal = xhpcRechargeOrder.getAmount().divide(new BigDecimal(2)).setScale(0, BigDecimal.ROUND_UP); + BigDecimal bBigDecimal =xhpcRechargeOrder.getAmount().subtract(aBigDecimal); + BigDecimal aBalance = new BigDecimal(map.get("aBalance").toString()).add(aBigDecimal); + BigDecimal bBalance = new BigDecimal(map.get("bBalance").toString()).add(bBigDecimal); + String userType =UserTypeUtil.USER; + if(UserTypeUtil.COMMUNIT_TYPE==xhpcRechargeOrder.getSource()){ + userType =UserTypeUtil.COMMUNIT; + }else if(UserTypeUtil.CUSTOMERS_TYPE==xhpcRechargeOrder.getSource()){ + userType =UserTypeUtil.CUSTOMERS; + } + String key = "user:" + xhpcRechargeOrder.getUserId() + userType + ".order"; + + //判断用户是否在充电中 + String serialMumberA = xhpcUserAccountStatementMapper.getUserHistotyChargeOrderSuncha(xhpcRechargeOrder.getUserId(),source,tenantId,1); + if(!"".equals(serialMumberA) && serialMumberA !=null){ + //充电中 + Map mapA = new HashMap<>(); + map.put("aBalance", aBalance); + redisService.setCacheMap(key,mapA); + postRefreshBalance(aBalance, serialMumberA); + } + String serialMumberB = xhpcUserAccountStatementMapper.getUserHistotyChargeOrderSuncha(xhpcRechargeOrder.getUserId(),source,tenantId,2); + if(!"".equals(serialMumberB) && serialMumberB !=null){ + //充电中 + Map mapA = new HashMap<>(); + map.put("bBalance", bBalance); + redisService.setCacheMap(key,mapA); + postRefreshBalance(bBalance, serialMumberB); + } + + BigDecimal money = BigDecimal.valueOf(Double.valueOf(balance)).add(xhpcRechargeOrder.getAmount()); + if(UserTypeUtil.USER_TYPE.equals(source)){ + //增加用户余额 + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(xhpcRechargeOrder.getUserId()); + xhpcAppUser.setBalance(money); + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + XhpcUserAccountStatement xhpcUserAccountStatement = new XhpcUserAccountStatement(); + xhpcUserAccountStatement.setType(StatusConstants.FLOWING_WATER_RECHARGE_TYPE); + xhpcUserAccountStatement.setRechargeOrderId(xhpcRechargeOrder.getRechargeOrderId()); + xhpcUserAccountStatement.setUserId(xhpcRechargeOrder.getUserId()); + xhpcUserAccountStatement.setAmount(xhpcRechargeOrder.getAmount()); + xhpcUserAccountStatement.setRemainingSum(xhpcAppUser.getBalance()); + xhpcUserAccountStatement.setCreateTime(new Date()); + xhpcUserAccountStatement.setRemark("微信充值订单!"); + xhpcUserAccountStatementMapper.insert(xhpcUserAccountStatement); + }else{ + //增加用户余额 + userTypeService.insertUserBalance(xhpcRechargeOrder.getAmount(),userId,source,tenantId, UserTypeUtil.RECHARGE_WX,UserTypeUtil.INSERT_BALANCE,null,xhpcRechargeOrder.getRechargeOrderId()); + } + } } } @@ -490,7 +550,7 @@ public class WxPaymentController { String s1 =money.multiply(new BigDecimal(100)).toString(); startChargingData.setBalance(Double.valueOf(s1).intValue()); R r = powerPileService.refreshBalance(startChargingData); - logger.info("<<<<<<<<<<<<余额下发>>>>>>>>>"); + logger.info("<<<<<<<<<<<<余额下发>>>>>>>>>"+s1); logger.info("<<<<<<<<<<<<"+r.getCode()+">>>>>>>>>"); logger.info("<<<<<<<<<<<<"+r.getMsg()+">>>>>>>>>"); if(r.getCode() !=200){ diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOriginalOrderController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOriginalOrderController.java index 455264c0..9b6a2b5a 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOriginalOrderController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOriginalOrderController.java @@ -411,7 +411,7 @@ public class XhpcRefundOriginalOrderController extends BaseController { //川逸充自动退款 每5分钟一次 - @Scheduled(cron = "0 0/5 * * * ? ") + //@Scheduled(cron = "0 0/5 * * * ? ") @GetMapping("/cycMoneyPage") public void cycMoneyPage(){ logger.info("++++++++++++川逸充没有充电订单自动退款 每5分钟一次++++++++++++++++"); diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcUserAccountStatementMapper.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcUserAccountStatementMapper.java index 324d75fe..195ccdbb 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcUserAccountStatementMapper.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcUserAccountStatementMapper.java @@ -80,4 +80,5 @@ public interface XhpcUserAccountStatementMapper { */ String getUserHistotyChargeOrder(@Param("userId") Long userId,@Param("source") Integer source,@Param("tenantId")String tenantId); + String getUserHistotyChargeOrderSuncha(@Param("userId") Long userId,@Param("source") Integer source,@Param("tenantId")String tenantId,@Param("sunchaStatus")Integer sunchaStatus); } diff --git a/xhpc-modules/xhpc-payment/src/main/resources/bootstrap.yml b/xhpc-modules/xhpc-payment/src/main/resources/bootstrap.yml index 4a2817f0..27bd265a 100644 --- a/xhpc-modules/xhpc-payment/src/main/resources/bootstrap.yml +++ b/xhpc-modules/xhpc-payment/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcUserAccountStatementMapper.xml b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcUserAccountStatementMapper.xml index 2f9be0e6..a5d66b50 100644 --- a/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcUserAccountStatementMapper.xml +++ b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcUserAccountStatementMapper.xml @@ -244,4 +244,11 @@ from xhpc_terminal where terminal_id =(select terminal_id from xhpc_charge_order where user_id = #{userId} and source=#{source} and tenant_id=#{tenantId} and status=0 and del_flag =0 limit 1) + + diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/ChargingController.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/ChargingController.java index 93ccb143..02fd6bbc 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/ChargingController.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/ChargingController.java @@ -418,7 +418,7 @@ public class ChargingController { String pileNo = startChargingData.getPileNo(); String pkey = "pile:".concat(pileNo); - log.info("==================pkey======================"+pkey); + //log.info("==================pkey======================"+pkey); Map cachePile = REDIS.getCacheMap(pkey); R r = checkPile(cachePile); if (r.getCode() == 200) { @@ -542,10 +542,10 @@ public class ChargingController { // Integer FFFF = HexUtils.reverseHexInt("0452"); // System.out.println("51 转化成="+FFFF); - Integer F402 = HexUtils.reverseHexInt("4C"); - System.out.println("F402 转化成="+F402); +// Integer F402 = HexUtils.reverseHexInt("D8400000"); +// System.out.println("F402 转化成="+F402); -// Integer D007 = HexUtils.reverseHexInt("D007"); +// Integer D007 = HexUtils.reverseHexInt("0CF30500"); // System.out.println("D007 转化成="+D007); // // Integer F620 = HexUtils.reverseHexInt("F620"); @@ -591,16 +591,18 @@ public class ChargingController { // System.out.println(df.format(v)); // String s = CP56Time2a.p56toDateStr("C05D2011200318"); -// + // System.out.println("-111-变为--:" + s); // // String s1 = cp56toDateStr("88903507220418"); // // System.out.println("-111-变为--:" + s1); - String ascii = HexUtils.toAscii("4C465A3733464C34374E44303032343535"); +// String ascii = HexUtils.toAscii("4C465A3733464C34374E44303032343535"); +// +// System.out.println("ascii :"+ascii); + - System.out.println("ascii :"+ascii); } } diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/PileController.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/PileController.java index f9798f32..fdd850b0 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/PileController.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/PileController.java @@ -433,6 +433,7 @@ public class PileController { @PostMapping("pile/{pileNo}/{powerNumber}/configSettings") public R pileConfigSettings(@PathVariable("pileNo") String pileNo,@PathVariable("powerNumber") String powerNumber) { + String pkey = "pile:".concat(pileNo); Map cachePile = REDIS.getCacheMap(pkey); R r = checkPileConfig(cachePile); diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/StationController.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/StationController.java index 1c349a58..9fb3f6e0 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/StationController.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/controller/StationController.java @@ -40,7 +40,6 @@ public class StationController { public void addNotificationStationInfo(@RequestParam("stationId")Long stationId){ CDStationInfo xhpcChargingStation = deviceMessageMapper.getXhpcChargingStation(stationId); if(xhpcChargingStation !=null){ - System.out.println("=================生成场站推送数据信息==================="); //场站信息入缓存 String skey = "cdjgpc:station:".concat(stationId.toString())+".notification"; REDIS.deleteObject(skey); diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/BmsReqChargerOutputDataLogic.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/BmsReqChargerOutputDataLogic.java index 57f75311..7f799fe5 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/BmsReqChargerOutputDataLogic.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/BmsReqChargerOutputDataLogic.java @@ -18,6 +18,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.math.BigDecimal; import java.math.RoundingMode; import java.text.NumberFormat; import java.util.Map; @@ -42,10 +43,45 @@ public class BmsReqChargerOutputDataLogic implements ServiceLogic { ObjectMapper objectMapper = new ObjectMapper(); BmsReqChargerOutputData orderData = objectMapper.convertValue(req, BmsReqChargerOutputData.class); + + String hex = (String) req.get("hex"); + int idxStart = 60; + int bmsVoltageRequest = HexUtils.reverseHexInt(hex.substring(idxStart, 4 + idxStart));//BMS 电压需求 + + idxStart = 4 + idxStart; + + int bmsCurrentRequest = HexUtils.reverseHexInt(hex.substring(idxStart, 4 + idxStart));//BMS 电流需求 + idxStart = 6 + idxStart; + + int bmsChargingVolt = HexUtils.reverseHexInt(hex.substring(idxStart, 4 + idxStart));//BMS 充电电压测量值 + idxStart = 4 + idxStart; + int bmsChargingCurrent = HexUtils.reverseHexInt(hex.substring(idxStart, 4 + idxStart));//BMS 充电电流测量值 + + idxStart = 88; + + int pileVoltageOutput = HexUtils.reverseHexInt(hex.substring(idxStart, 4 + idxStart));//电桩电压输出值 + idxStart = 4 + idxStart; + int pileCurrentOutput = HexUtils.reverseHexInt(hex.substring(idxStart, 4 + idxStart));//电桩电流输出值 + + String orderNo = (String) req.get("orderNo"); String orderKey = "order:".concat(orderNo).concat(".bms"); + + + + + orderData.setBmsVoltageRequest(bmsVoltageRequest+""); + orderData.setBmsCurrentRequest(bmsCurrentRequest+""); + + orderData.setBmsChargingVolt(bmsChargingVolt+""); + orderData.setBmsChargingCurrent(bmsChargingCurrent+""); + + orderData.setPileVoltageOutput(pileVoltageOutput+""); + orderData.setPileCurrentOutput(pileCurrentOutput+""); + CacheBmsReqChargerOutputData cacheBmsReqChargerOutputData = translate(orderData); + REDIS.setCacheObject(orderKey, cacheBmsReqChargerOutputData); pileOrderService.pileRimeOrderBms(orderNo); @@ -67,16 +103,44 @@ public class BmsReqChargerOutputDataLogic implements ServiceLogic { cacheBmsReqChargerOutputData.setOrderNo(orderData.getOrderNo()); cacheBmsReqChargerOutputData.setPileNo(orderData.getPileNo()); cacheBmsReqChargerOutputData.setGunId(orderData.getGunId()); - cacheBmsReqChargerOutputData.setBmsVoltageRequest(convertDouble(HexUtils.reverseHexInt(orderData.getBmsVoltageRequest()) * 0.1)); - cacheBmsReqChargerOutputData.setBmsCurrentRequest(convertDouble(HexUtils.reverseHexInt(orderData.getBmsCurrentRequest()) * 0.1)); + cacheBmsReqChargerOutputData.setBmsVoltageRequest(new BigDecimal(orderData.getBmsVoltageRequest()).divide(new BigDecimal(10),BigDecimal.ROUND_DOWN).doubleValue()); + try{ + BigDecimal subtract1 = new BigDecimal(orderData.getBmsCurrentRequest()).divide(new BigDecimal(10), BigDecimal.ROUND_DOWN).subtract(new BigDecimal(400)); + if(subtract1.compareTo(new BigDecimal(0))<0){ + subtract1 =subtract1.abs(); + } + cacheBmsReqChargerOutputData.setBmsCurrentRequest(subtract1.doubleValue()); + }catch (Exception e){ + + } cacheBmsReqChargerOutputData.setBmsChargingMod(HexUtils.reverseHexInt(orderData.getBmsChargingMod())); - cacheBmsReqChargerOutputData.setBmsChargingVolt(convertDouble(HexUtils.reverseHexInt(orderData.getBmsChargingVolt()) * 0.1)); - cacheBmsReqChargerOutputData.setBmsChargingCurrent(convertDouble(HexUtils.reverseHexInt(orderData.getBmsChargingCurrent()) * 0.1)); + cacheBmsReqChargerOutputData.setBmsChargingVolt(new BigDecimal(orderData.getBmsChargingVolt()).divide(new BigDecimal(10),BigDecimal.ROUND_DOWN).doubleValue()); + + try{ + BigDecimal subtract2 = new BigDecimal(orderData.getBmsChargingCurrent()).divide(new BigDecimal(10), BigDecimal.ROUND_DOWN).subtract(new BigDecimal(400)); + if(subtract2.compareTo(new BigDecimal(0))<0){ + subtract2 =subtract2.abs(); + } + cacheBmsReqChargerOutputData.setBmsChargingCurrent(subtract2.doubleValue()); + + }catch (Exception e){ + + } + cacheBmsReqChargerOutputData.setMonoBatteryVolt(convertDouble(Integer.parseInt(orderData.getMonoBatteryVoltGroupId().substring(0, 3), 16) * 0.01)); cacheBmsReqChargerOutputData.setSoc(HexUtils.reverseHexInt(orderData.getSoc())); cacheBmsReqChargerOutputData.setBmsEstRemainingTime(HexUtils.reverseHexInt(orderData.getBmsEstRemainingTime())); - cacheBmsReqChargerOutputData.setPileVoltageOutput(convertDouble(HexUtils.reverseHexInt(orderData.getPileVoltageOutput()) * 0.1)); - cacheBmsReqChargerOutputData.setPileCurrentOutput(convertDouble(HexUtils.reverseHexInt(orderData.getPileVoltageOutput()) * 0.1)); + cacheBmsReqChargerOutputData.setPileVoltageOutput(new BigDecimal(orderData.getPileVoltageOutput()).divide(new BigDecimal(10),BigDecimal.ROUND_DOWN).doubleValue()); + try{ + + BigDecimal subtract = new BigDecimal(orderData.getPileCurrentOutput()).divide(new BigDecimal(10), BigDecimal.ROUND_DOWN).subtract(new BigDecimal(400)); + if(subtract.compareTo(new BigDecimal(0))<0){ + subtract =subtract.abs(); + } + cacheBmsReqChargerOutputData.setPileCurrentOutput(subtract.doubleValue()); + }catch (Exception e){ + + } cacheBmsReqChargerOutputData.setChargingTimeSummary(HexUtils.reverseHexInt(orderData.getChargingTimeSummary())); cacheBmsReqChargerOutputData.setMonoBatteryVoltGroupId(Integer.parseInt(orderData.getMonoBatteryVoltGroupId().substring(3), 16)); cacheBmsReqChargerOutputData.setHex(orderData.getHex()); @@ -94,4 +158,36 @@ public class BmsReqChargerOutputDataLogic implements ServiceLogic { return Double.parseDouble(nf.format(oldVar)); } + + public static void main(String[] args) { + + String hex = "68300C4F0023808360002800010124013106220062138083600028000101420E730C026C0DC30C58012656005801730C00006EB3"; + int idxStart = 64; + int bmsCurrentRequest = HexUtils.reverseHexInt(hex.substring(idxStart, 4 + idxStart));//BMS 电流需求 + System.out.println("===================bmsCurrentRequest========================="+bmsCurrentRequest); + System.out.println("===================bmsCurrentRequest========================="+bmsCurrentRequest); + System.out.println("===================bmsCurrentRequest========================="+bmsCurrentRequest); + idxStart = 88; + + int pileVoltageOutput = HexUtils.reverseHexInt(hex.substring(idxStart, 4 + idxStart));//电桩电压输出值 + System.out.println("===================pileVoltageOutput========================="+pileVoltageOutput); + System.out.println("===================pileVoltageOutput========================="+pileVoltageOutput); + System.out.println("===================pileVoltageOutput========================="+pileVoltageOutput); + idxStart = 4 + idxStart; + int pileCurrentOutput = HexUtils.reverseHexInt(hex.substring(idxStart, 4 + idxStart));//电桩电流输出值 + System.out.println("===================pileCurrentOutput========================="+pileCurrentOutput); + System.out.println("===================pileCurrentOutput========================="+pileCurrentOutput); + System.out.println("===================pileCurrentOutput========================="+pileCurrentOutput); + + BigDecimal subtract1 = new BigDecimal(2904).divide(new BigDecimal(10), BigDecimal.ROUND_DOWN).subtract(new BigDecimal(400)); + if(subtract1.compareTo(new BigDecimal(0))<0){ + subtract1 =subtract1.abs(); + } + System.out.println("===================subtract1========================="+subtract1); + BigDecimal subtract = new BigDecimal(2905).divide(new BigDecimal(10), BigDecimal.ROUND_DOWN).subtract(new BigDecimal(400)); + if(subtract.compareTo(new BigDecimal(0))<0){ + subtract =subtract.abs(); + } + System.out.println("===================subtract========================="+subtract); + } } diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/OrderDataLogic.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/OrderDataLogic.java index 66d04756..a2a33f60 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/OrderDataLogic.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/OrderDataLogic.java @@ -57,9 +57,6 @@ public class OrderDataLogic implements ServiceLogic { public ServiceResult service(ServiceParameter sp) throws Exception { Map req = sp.getParameters(); - log.info("================订单结束报文=============================="); - log.info("================订单结束报文================req=============="+req.toString()); - log.info("================订单结束报文=============================="); ObjectMapper objectMapper = new ObjectMapper(); OrderData orderData = objectMapper.convertValue(req, OrderData.class); String orderNo = orderData.getOrderNo(); @@ -155,6 +152,6 @@ public class OrderDataLogic implements ServiceLogic { Integer stopReasonInt = Integer.valueOf("72", 16); System.out.println(stopReasonInt); String st ="充电完成(0X".concat("72").concat(")"); - System.out.println("==========st==========="+st); + //System.out.println("==========st==========="+st); } } diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/PileConfigReplyDataLogic.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/PileConfigReplyDataLogic.java index 32d82bb6..150db45f 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/PileConfigReplyDataLogic.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/PileConfigReplyDataLogic.java @@ -38,7 +38,9 @@ public class PileConfigReplyDataLogic implements ServiceLogic { int hibsn = Integer.parseInt(hex.substring(idxStart, 2 + idxStart), 16); try{ if(hibsn==1){ - String nacosServer = REDIS.getCacheObject(serialNumber+":powerNumber").toString(); + log.error("进入入库步骤"); + System.out.println(); + String nacosServer = REDIS.getCacheObject("pile:"+serialNumber+":powerNumber").toString(); deviceMessageMapper.updateXhpcChargingPile(serialNumber,Integer.valueOf(nacosServer)); } }catch (Exception e){ diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/PileStartChargingDataLogic.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/PileStartChargingDataLogic.java index 7f6e8462..c4c39a39 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/PileStartChargingDataLogic.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/PileStartChargingDataLogic.java @@ -53,10 +53,8 @@ public class PileStartChargingDataLogic implements ServiceLogic { @Override public ServiceResult service(ServiceParameter sp) throws Exception { - log.info("=============================刷卡启动=======sp================================"+sp.toString()); String resultStr = "00"; String result = ServiceResult.HEX_00; - log.info("=============================刷卡启动=======sp.getParameters================================"+sp.getParameters()); Map req = sp.getParameters(); ObjectMapper objectMapper = new ObjectMapper(); PileStartChargingData pileStartChargingData = objectMapper.convertValue(req, PileStartChargingData.class); @@ -78,30 +76,20 @@ public class PileStartChargingDataLogic implements ServiceLogic { } else { physicCardNo = accountOrCardNo; } - log.info("=============================刷卡启动=======启动================================"+physicCardNo); criteria.andCardidEqualTo(physicCardNo);//.andCorpnoEqualTo(corpNo); // todo remove corpNo alrity List iccardInfos = iccardInfoMapper.selectByExample(example); - log.info("=============================刷卡启动=======返回================================"+iccardInfos.size()); - log.info("=============================刷卡启动=======iccardInfos================================"+iccardInfos.toString()); - log.info("=============================刷卡启动=======返回================================"); if (iccardInfos.size() == 1) { IccardInfo iccardInfo = iccardInfos.get(0); if (iccardInfo.getCardtype() == 0) { resultStr = INVALID_OPERATOR; } else { - log.info("=============================刷卡启动=======调用订单接口================================"); // 调用订单接口 cardNo = iccardInfo.getCardno(); Integer rateModelId = pileStartChargingData.getRateModelId(); // todo not very strict. if (rateModelId == null) rateModelId = ((Long) REDIS.getCacheMapValue("pile:".concat(connectorId.substring(0, 14)), "rateModelId")).intValue(); - log.info("=============================刷卡启动=======调用订单接口================================"+cardNo.toString()); - log.info("=============================刷卡启动=======调用订单接口================================"+connectorId.toString()); - log.info("=============================刷卡启动=======调用订单接口================================"+rateModelId.toString()); R r = cardService.cardStartup(cardNo, connectorId, rateModelId.toString()); - log.info("=============================刷卡启动=======r================================"+r.getCode()); - log.info("=============================刷卡启动=======r================================"+r.getMsg()); int code = r.getCode(); if (code == 200) { result = ServiceResult.HEX_01; @@ -162,10 +150,6 @@ public class PileStartChargingDataLogic implements ServiceLogic { R r = pileOrderService.pileVin(connectorId, vinCode); int code = r.getCode(); - log.info("=============================VIN码充电=======返回================================"); - log.info("=============================VIN码充电=======返回================================"+code); - log.info("=============================VIN码充电=======返回================================"); - if (code == 200) { if(r.getData() == null){ return new ServiceResult(ServiceResult.FAIL); @@ -219,15 +203,9 @@ public class PileStartChargingDataLogic implements ServiceLogic { Integer startFlag = result.equals(ServiceResult.HEX_01) ? 2: 4; - log.info("======================ServiceResult.HEX_01========================="+ServiceResult.HEX_01); - log.info("======================result========================="+result); - log.info("======================startFlag========================="+startFlag); - - String pushOrderKey = "pushOrder:".concat(orderNo); Map pushOrder = REDIS.getCacheMap(pushOrderKey); if (pushOrder != null) { - log.info("======================startChargeSeqStat========================="+startFlag); REDIS.setCacheMapValue(pushOrderKey, "startChargeSeqStat", startFlag); } else { Map map = new HashMap<>(); @@ -244,8 +222,6 @@ public class PileStartChargingDataLogic implements ServiceLogic { deviceMessage.setContent((String) req.get("hex")); deviceMessageMapper.insertByDomain(deviceMessage); - log.info("===========PileStartChargingDataLogic===========发送报文========================="); - return new ServiceResult(HexUtils.toBytes(hex), result); } diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RateModelValidateLogic.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RateModelValidateLogic.java index ae4c84f6..b2b3d772 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RateModelValidateLogic.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RateModelValidateLogic.java @@ -1,7 +1,6 @@ package com.xhpc.pp.logic; import com.xhpc.common.api.dto.ChargingStationDto; -import com.xhpc.common.data.redis.CacheRateModel; import com.xhpc.common.enums.StationDeviceEnum; import com.xhpc.pp.domain.XhpcDeviceMessage; import com.xhpc.pp.mapper.XhpcDeviceMessageMapper; @@ -38,7 +37,6 @@ public class RateModelValidateLogic implements ServiceLogic { Map req = sp.getParameters(); String pileNo = (String) req.get("pileNo"); String rateModelIdStr = req.get("rateModelId").toString(); - System.out.println("=================rateModelIdStr==================="+rateModelIdStr); Map cachePile = REDIS.getCacheMap("pile:".concat(pileNo)); Integer gunNum = (Integer) cachePile.get("gunNum"); @@ -70,13 +68,11 @@ public class RateModelValidateLogic implements ServiceLogic { String skey = "pile:".concat(pileNo).concat(".seqhex"); String seq = seqHex(skey); String resultStr; + if (!"0C".equals(version)){ - System.out.println("=======111==========version==================="+version); resultStr = "680E".concat(seq).concat("0006").concat(pileNo).concat(String.format("%04X", csRateModelId)).concat(hexCode); resultStr = resultStr.concat(CRCCalculator.calcCrc(resultStr)); }else{ - System.out.println("=======2222==========version==================="+version); - System.out.println("=======2222==========version==================="+HexUtils.toHexInt(csRateModelId)); resultStr = "6810".concat(seq).concat("0006").concat(pileNo).concat(HexUtils.toHexInt(csRateModelId)).concat(hexCode); resultStr = resultStr.concat(CRCCalculator.calcCrc(resultStr)); } diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RealtimeDataLogic.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RealtimeDataLogic.java index f9f7faa0..ea2e6f11 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RealtimeDataLogic.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RealtimeDataLogic.java @@ -165,17 +165,11 @@ public class RealtimeDataLogic implements ServiceLogic { cacheOrder.put("lastOrderTime", DateUtil.now()); R r1 = pileOrderService.pileRimeOrder(orderNo); if (r1 == null || (r1.getMsg()!=null && r1.getMsg().contains("无效订单")) || (r1.getCode() >=500 && r1.getCode() != 3886)) { - System.out.println("==========================无效订单============"); - System.out.println("==========================r1.getCode()=================="+r1.getCode()); chargingController.stopInvalidOrder(orderNo); } else { Integer vul = (Integer) cachePile.get("voltageUpperLimits"); Integer cul = (Integer) cachePile.get("currentLimit"); if(vul != null && cul != null && (wc > cul || wv > vul)) { - System.out.println("==========================wc=========停止 充电======充电传电流============"+wc); - System.out.println("==========================cul=========停止 充电=================="+cul); - System.out.println("==========================wv=========停止 充电=================="+wv); - System.out.println("==========================vul=========停止 充电=================="+vul); System.out.println("==========================wc > cul || wv > vul==================停止 充电=================="+pileNo); R r = chargingController.stopCharging(pileNo, gunId, default_version); if (r.getCode() == 200) { @@ -186,8 +180,6 @@ public class RealtimeDataLogic implements ServiceLogic { } else { Integer stopSoc = (Integer) cacheOrder.get("stopSoc"); if (stopSoc != null && socInt >= stopSoc) { - System.out.println("==========================stopSoc===="+stopSoc+"==============停止 充电=================="+pileNo); - System.out.println("==========================socInt====="+socInt+"=============停止 充电=================="+pileNo); R r = chargingController.stopCharging(pileNo, gunId, default_version); String alerted = (String) cacheOrder.get("socalerted"); String tel = (String) cacheOrder.get("tel"); @@ -211,9 +203,6 @@ public class RealtimeDataLogic implements ServiceLogic { Integer amountCharged =cacheRealtimeData.getAmountCharged(); if(chargingDegree < 10000 && amountCharged > 200000){ // 充电度数小于1,并且,充电金额大于10 - System.out.println("==========================chargingDegree < 10000==================停止 充电=================="+pileNo); - System.out.println("==========================chargingDegree < 10000==================停止 充电=================="+pileNo); - System.out.println("==========================chargingDegree < 10000==================停止 充电=================="+pileNo); R r = chargingController.stopCharging(pileNo, gunId, default_version); } @@ -241,9 +230,6 @@ public class RealtimeDataLogic implements ServiceLogic { cacheRealtimeData.getAmountCharged(), cacheRealtimeData.getOrderNo()); chargingController.stopCharging(pileNo, gunId, default_version); - System.out.println("==========================实时数据充电度数:{}, 实时充电金==================停止 充电=================="+pileNo); - System.out.println("==========================实时数据充电度数:{}, 实时充电金==================停止 充电=================="+pileNo); - System.out.println("==========================实时数据充电度数:{}, 实时充电金==================停止 充电=================="+pileNo); } } } @@ -270,9 +256,6 @@ public class RealtimeDataLogic implements ServiceLogic { cacheOrder.put("abnormal", "1.2 lord as orderData"); log.error("abnormal.1.2 order[{}]", orderNo); } - System.out.println("==========================abnormal.1.2 orde==================停止 充电=================="+pileNo); - System.out.println("==========================abnormal.1.2 orde==================停止 充电=================="+pileNo); - System.out.println("==========================abnormal.1.2 orde==================停止 充电=================="+pileNo); chargingController.stopCharging(pileNo, gunId, default_version); cacheOrder.put("status", "空闲>2下发中止"); if (r == null || r.getCode() != 200) { @@ -285,9 +268,6 @@ public class RealtimeDataLogic implements ServiceLogic { REDIS.setCacheMap(orderkey, cacheOrder); } else { if (statusInt == 3) { - System.out.println("==========================statusInt == 3==================停止 充电=================="+pileNo); - System.out.println("==========================statusInt == 3==================停止 充电=================="+pileNo); - System.out.println("==========================statusInt == 3==================停止 充电=================="+pileNo); chargingController.stopCharging(pileNo, gunId, default_version); Integer bpcnt = (Integer) cacheGun.get("pleek.bp.cnt"); cacheGun.put("pleek.bp.cnt", bpcnt==null?1:bpcnt++); diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RemoteStartReplyDataLogic.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RemoteStartReplyDataLogic.java index 54e40626..adcc5310 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RemoteStartReplyDataLogic.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/RemoteStartReplyDataLogic.java @@ -63,10 +63,7 @@ public class RemoteStartReplyDataLogic implements ServiceLogic { REDIS.setCacheMap(gunkey, cacheGun); String pushOrderKey = orderkey.replace("order:", "pushOrder:"); Map pushOrder = REDIS.getCacheMap(pushOrderKey); - log.info("===================11===启动成功或失败===11==RemoteStartReplyDataLogic===================="+remoteStartReplyData.toString()); - log.info("===================222===启动成功或失败===33==RemoteStartReplyDataLogic===================="+remoteStartReplyData.getStartResult()); if (HEX_01.equals(remoteStartReplyData.getStartResult())) { - log.info("======================启动充电成功=====RemoteStartReplyDataLogic===================="); final String orderstarttime = DateUtil.format(Calendar.getInstance().getTime(), NORM_DATETIME_FORMAT); cacheGun.put("pileStartTime", orderstarttime); cacheGun.put("orderstoptime", null); @@ -78,24 +75,19 @@ public class RemoteStartReplyDataLogic implements ServiceLogic { REDIS.setCacheMap(orderkey, cacheOrder); pileOrderService.pileStartup(orderNo, 1, "启动充电成功"); if (pushOrder != null) { - log.info("==========11========RemoteStartReplyDataLogic======11=============="); REDIS.setCacheMapValue(pushOrderKey, "startChargeSeqStat", 2); } else { - log.info("==========22========RemoteStartReplyDataLogic======22=============="); Map map = new HashMap<>(); map.put("startChargeSeqStat", Integer.valueOf(2)); REDIS.setCacheMap(pushOrderKey, map); } } else { - log.info("======================启动成功或失败=====RemoteStartReplyDataLogic===================="); final String remark = frs.get(remoteStartReplyData.getFailReason()); pileOrderService.pileStartup(orderNo, 2, remark == null ? "未知错误" : remark); if (pushOrder != null) { - log.info("==========33========RemoteStartReplyDataLogic======33=============="); REDIS.setCacheMapValue(pushOrderKey, "startChargeSeqStat", 4); } else { - log.info("=========44========RemoteStartReplyDataLogic======44=============="); Map map = new HashMap<>(); map.put("startChargeSeqStat", Integer.valueOf(4)); REDIS.setCacheMap(pushOrderKey, map); diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/ServiceMainLogic.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/ServiceMainLogic.java index f72ae17d..d0f0e57c 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/ServiceMainLogic.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/ServiceMainLogic.java @@ -21,10 +21,6 @@ public class ServiceMainLogic { private Map serviceLogics; public ServiceResult process(ServiceParameter sp) { - log.error("==========getServiceName================"+sp.getServiceName()); - log.error("==========getPileNo================"+sp.getPileNo()); - log.error("==========getParameters================"+sp.getParameters()); - log.error("==========getVersion================"+sp.getVersion()); ServiceResult result; try { ServiceLogic logic = getServiceLogic(sp.getServiceName()); diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/server/HBCheckTask.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/server/HBCheckTask.java index ae54b1bf..bf057e2e 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/server/HBCheckTask.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/server/HBCheckTask.java @@ -37,8 +37,6 @@ public class HBCheckTask { hbtime = hbtime == null ? 0 : hbtime; if ((now - hbtime) > 75000) { String pileId = StrUtil.sub(gunkey.substring(gunkey.lastIndexOf(":") + 1), 0, -2); - System.out.println("================充电桩心跳掉线==========pileId========"+pileId); - System.out.println("================充电桩心跳掉线==========pileId========"+pileId); // if (!DISCONNECTED.equals(cacheGun.get("status"))) { // cacheGun.put("statusInt", OFF_LINE); // cacheGun.put("status", DISCONNECTED); diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/utils/security/CP56Time2a.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/utils/security/CP56Time2a.java index e37df3fb..ed875f79 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/utils/security/CP56Time2a.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/utils/security/CP56Time2a.java @@ -219,8 +219,8 @@ public class CP56Time2a { // String hex = toCp56Hex(time); // System.out.println("--编码1--:" + hex); // System.out.println(HexUtils.toBinaryString("90E223133D0416")); - System.out.println("--下达1--:" + DateUtil.format(cp56toDate("E880380D170518"), NORM_DATETIME_FORMATTER)); - System.out.println("--下达2--:" + DateUtil.format(cp56toDate("A50F3A0D170518"), NORM_DATETIME_FORMATTER)); +// System.out.println("--下达1--:" + DateUtil.format(cp56toDate("E880380D170518"), NORM_DATETIME_FORMATTER)); +// System.out.println("--下达2--:" + DateUtil.format(cp56toDate("A50F3A0D170518"), NORM_DATETIME_FORMATTER)); // System.out.println("toCp56Hex = " + toCp56Hex(cp56toDate("C05D0D171F0116"))); //// System.out.println("--下达2--:" + DateUtil.format(cp56toDate(""), NORM_DATETIME_FORMAT)); // String dateStr = "2017-03-01 22:33:23"; @@ -234,13 +234,13 @@ public class CP56Time2a { // System.out.println(String.format("--编码2--:%s", encode)); // System.out.println("--解码2--:" + decode(HexUtils.toBytes(encode))); - String s = cp56toDateStr("1804080B0E22"); + String s = cp56toDateStr("E0AB0E10190618"); - System.out.println("-111-变为--:" + s); + System.out.println("-时间解析--:" + s); - String s1 = cp56toDateStr("88903507220418"); + String s1 = cp56toDateStr("581B1610190618"); - System.out.println("-111-变为--:" + s1); + System.out.println("-时间解析--:" + s1); } } diff --git a/xhpc-modules/xhpc-power-pile/src/main/resources/bootstrap.yml b/xhpc-modules/xhpc-power-pile/src/main/resources/bootstrap.yml index 0244fca3..224d1f2e 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/resources/bootstrap.yml +++ b/xhpc-modules/xhpc-power-pile/src/main/resources/bootstrap.yml @@ -18,10 +18,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/xhpc-modules/xhpc-power-pile/src/main/resources/mapper/XhpcDeviceMessageMapper.xml b/xhpc-modules/xhpc-power-pile/src/main/resources/mapper/XhpcDeviceMessageMapper.xml index 04884bb7..7de14b13 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/resources/mapper/XhpcDeviceMessageMapper.xml +++ b/xhpc-modules/xhpc-power-pile/src/main/resources/mapper/XhpcDeviceMessageMapper.xml @@ -401,6 +401,6 @@ - update from xhpc_charging_pile set power_number=#{powerNumber} where serial_number =#{serialNumber} + update xhpc_charging_pile set power_number=#{powerNumber} where serial_number =#{serialNumber} diff --git a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java index 85ff9122..1f1467cd 100644 --- a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java +++ b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java @@ -235,47 +235,71 @@ public class XhpcAppUserController extends BaseController { } R r = settingConfigService.settingConfig(1, tenantId); if (r != null && r.getCode() == 200) { - System.out.println("===========111========sessionKey:==============111============="); - Map mapConfig = (Map) r.getData(); - String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + mapConfig.get("wxAppId").toString() + "&secret=" + mapConfig.get("wxAppSecret").toString() + "&js_code=" + jsCode + "&grant_type=authorization_code"; - String result = HttpUtils.get(url); - JSONObject json = JSON.parseObject(result); - //logger.info("========222===========sessionKey:============222==============="); - if (null != json) { - String openid = json.getString("openid"); - String sessionKey = json.getString("session_key"); - //logger.info("========333===========sessionKey:============333==============="); - if (StringUtils.isEmpty(openid)) { - return R.fail(HttpStatus.ERROR_STATUS, "openid获取失败"); + + Map map = new HashMap<>(16); + map.put("openid", "ot6ul4nlSC5ZZOC4rTLS5hedFTGk"); + if (phoneCode != null && !phoneCode.equals("")) { + System.out.println("phoneCode:" + phoneCode); + //小程序登录获取token + String accesToken = "123456"; + //获取手机号 + String phoneCode1 = getPhoneCode(phoneCode, accesToken); + if(phoneCode1 !=null &&!phoneCode1.equals("")){ + map.put("phone", phoneCode1); } - if (StringUtils.isEmpty(sessionKey)) { - return R.fail(HttpStatus.ERROR_STATUS, "openid获取失败"); - } - Map map = new HashMap<>(16); - map.put("openid", openid); - if (phoneCode != null && !phoneCode.equals("")) { - System.out.println("phoneCode:" + phoneCode); - //小程序登录获取token - String accesToken = getAccesToken(mapConfig.get("wxAppId").toString(), mapConfig.get("wxAppSecret").toString()); - //获取手机号 - String phoneCode1 = getPhoneCode(phoneCode, accesToken); - if(phoneCode1 !=null &&!phoneCode1.equals("")){ - map.put("phone", phoneCode1); - } - logger.info("1111phone:"+ phoneCode1); - } -// JSONObject jsonObject = new JSONObject(); -// if ((!"".equals(encryptedData) && encryptedData != null) && (!"".equals(iv) && iv != null)) { -// jsonObject = getPhoneNumber(encryptedData, sessionKey, iv); -// if (jsonObject !=null) { -// map.put("name", jsonObject.get("nickName")); -// map.put("sex", jsonObject.get("gender")); -// map.put("avatar", jsonObject.get("avatarUrl")); -// map.put("phone", jsonObject.get("purePhoneNumber")); -// } -// } - return R.ok(map); + logger.info("1111phone:"+ phoneCode1); } + + return R.ok(map); + + + + + + + + +// System.out.println("===========111========sessionKey:==============111============="); +// Map mapConfig = (Map) r.getData(); +// String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + mapConfig.get("wxAppId").toString() + "&secret=" + mapConfig.get("wxAppSecret").toString() + "&js_code=" + jsCode + "&grant_type=authorization_code"; +// String result = HttpUtils.get(url); +// JSONObject json = JSON.parseObject(result); +// //logger.info("========222===========sessionKey:============222==============="); +// if (null != json) { +// String openid = json.getString("openid"); +// String sessionKey = json.getString("session_key"); +// //logger.info("========333===========sessionKey:============333==============="); +// if (StringUtils.isEmpty(openid)) { +// return R.fail(HttpStatus.ERROR_STATUS, "openid获取失败"); +// } +// if (StringUtils.isEmpty(sessionKey)) { +// return R.fail(HttpStatus.ERROR_STATUS, "openid获取失败"); +// } +// Map map = new HashMap<>(16); +// map.put("openid", openid); +// if (phoneCode != null && !phoneCode.equals("")) { +// System.out.println("phoneCode:" + phoneCode); +// //小程序登录获取token +// String accesToken = getAccesToken(mapConfig.get("wxAppId").toString(), mapConfig.get("wxAppSecret").toString()); +// //获取手机号 +// String phoneCode1 = getPhoneCode(phoneCode, accesToken); +// if(phoneCode1 !=null &&!phoneCode1.equals("")){ +// map.put("phone", phoneCode1); +// } +// logger.info("1111phone:"+ phoneCode1); +// } +//// JSONObject jsonObject = new JSONObject(); +//// if ((!"".equals(encryptedData) && encryptedData != null) && (!"".equals(iv) && iv != null)) { +//// jsonObject = getPhoneNumber(encryptedData, sessionKey, iv); +//// if (jsonObject !=null) { +//// map.put("name", jsonObject.get("nickName")); +//// map.put("sex", jsonObject.get("gender")); +//// map.put("avatar", jsonObject.get("avatarUrl")); +//// map.put("phone", jsonObject.get("purePhoneNumber")); +//// } +//// } +// return R.ok(map); +// } } return R.fail(HttpStatus.ERROR_STATUS, "openid获取失败"); } @@ -579,6 +603,23 @@ public class XhpcAppUserController extends BaseController { return R.fail(HttpStatus.ERROR_STATUS, "修改失败"); } + /** + * 设置小程序用户双枪并充功能 + * @param + */ + @ApiOperation("设置小程序用户双枪并充功能") + @PostMapping("/doubleGunCharging") + public R doubleGunCharging(@RequestBody Map map) { + if (map != null) { + Long userId = Long.parseLong(map.get("userId").toString()); + Integer userType = Integer.parseInt(map.get("userType").toString()); + Integer sunchaSwitch = Integer.parseInt(map.get("sunchaSwitch").toString()); + return iXhpcAppUserUserService.doubleGunCharging(userId, userType, sunchaSwitch); + } + return R.fail(HttpStatus.ERROR_STATUS, "修改失败"); + } + + /** * 设置小程序用户电池保护 * diff --git a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcBlacklistController.java b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcBlacklistController.java new file mode 100644 index 00000000..c73fe25e --- /dev/null +++ b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcBlacklistController.java @@ -0,0 +1,62 @@ +package com.xhpc.user.controller; + +import com.xhpc.common.core.web.controller.BaseController; +import com.xhpc.common.core.web.domain.AjaxResult; +import com.xhpc.common.core.web.page.TableDataInfo; +import com.xhpc.common.log.annotation.Log; +import com.xhpc.common.log.enums.BusinessType; +import com.xhpc.user.domain.XhpcBlacklist; +import com.xhpc.user.domain.XhpcCustomers; +import com.xhpc.user.service.IXhpcBlacklistService; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/blacklist") +public class XhpcBlacklistController extends BaseController { + + @Resource + private IXhpcBlacklistService xhpcBlacklistService; + + @GetMapping("/getList") + public TableDataInfo getList(String phone, String plateNum, String vin, String startTime, String endTime,Integer distinguish){ + + Map params = new HashMap<>(); + params.put("phone", phone); + params.put("plateNum", plateNum); + params.put("vin", vin); + params.put("startTime", startTime); + params.put("endTime", endTime); + params.put("distinguish", distinguish); + List> list = xhpcBlacklistService.getList(params); + return getDataTable(list); + } + + + @PostMapping(value = "/addBlacklist") + public AjaxResult addBlacklist(HttpServletRequest request, @RequestBody XhpcBlacklist xhpcBlacklist) { + return xhpcBlacklistService.addBlacklist(request,xhpcBlacklist); + } + + + @GetMapping(value = "/getBlacklistById") + public AjaxResult getBlacklistById(Long blacklistId) { + return AjaxResult.success(xhpcBlacklistService.getBlacklistById(blacklistId)); + } + + + @GetMapping(value = "/deleteBlacklistById") + public AjaxResult deleteBlacklistById(Long blacklistId) { + xhpcBlacklistService.deleteBlacklistById(blacklistId); + return AjaxResult.success(); + } + + + + +} diff --git a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/domain/XhpcBlacklist.java b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/domain/XhpcBlacklist.java new file mode 100644 index 00000000..a266b4ea --- /dev/null +++ b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/domain/XhpcBlacklist.java @@ -0,0 +1,74 @@ +package com.xhpc.user.domain; + +import com.xhpc.common.core.web.domain.BaseEntity; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.util.Date; + +@Data +public class XhpcBlacklist extends BaseEntity { + + private Long blacklistId; + + /** + * 数据维度 0 地区 1.运营商 2. 运营商地区 + */ + @NotEmpty(message = "数据维度不能为空") + private String dimension; + + /** + * 是否有不参与合作的场站 (0 没有 1有) + */ + private Integer status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + private Integer delFlag; + + /** + * 电站id + */ + private String chargingStationIds; + /** + * 制造厂商 + */ + private String manufacturers; + /** + * 车辆类型 + */ + private String vehicleType; + /** + * 发送机型式 + */ + private String vehicleEngine; + /** + * 企业车型代码 + */ + private String vehicleCode; + /** + * 电话 + */ + private String phone; + /** + * 电话 + */ + private String plateNum; + /** + * 车牌 + */ + private String vin; + /** + * 限制开始时间 + */ + private Date startTime; + /** + * 限制开始时间 + */ + private Date endTime; + /** + * 1 个人 2 车型 + */ + private Integer distinguish; +} diff --git a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/mapper/XhpcAppUserMapper.java b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/mapper/XhpcAppUserMapper.java index ed9cf5d7..c68bd6db 100644 --- a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/mapper/XhpcAppUserMapper.java +++ b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/mapper/XhpcAppUserMapper.java @@ -95,8 +95,13 @@ public interface XhpcAppUserMapper { int updateUserIsRefund(@Param("userId")Long userId, @Param("isRefund")Integer isRefund); + int updateUserSunchaSwitch(@Param("userId")Long userId, @Param("sunchaSwitch")Integer sunchaSwitch); + int updateCommunityIsRefund(@Param("userId")Long userId, @Param("isRefund")Integer isRefund, @Param("socProtect")Integer socProtect, @Param("soc")Integer soc); + int updateCommunityPersonnelSunchaSwitch(@Param("userId")Long userId, @Param("sunchaSwitch")Integer sunchaSwitch, @Param("socProtect")Integer socProtect, @Param("soc")Integer soc); + + int updateCustomersPersonnelSunchaSwitch(@Param("userId")Long userId, @Param("sunchaSwitch")Integer sunchaSwitch, @Param("socProtect")Integer socProtect, @Param("soc")Integer soc); int updateCustomersSocProtect(@Param("userId")Long userId, @Param("socProtect")Integer socProtect, @Param("soc")Integer soc); /** * 记录登录用户的最后一次数据 diff --git a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/mapper/XhpcBlacklistMapper.java b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/mapper/XhpcBlacklistMapper.java new file mode 100644 index 00000000..5fb84668 --- /dev/null +++ b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/mapper/XhpcBlacklistMapper.java @@ -0,0 +1,27 @@ +package com.xhpc.user.mapper; + +import com.xhpc.user.domain.XhpcBlacklist; +import com.xhpc.user.domain.XhpcCustomers; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface XhpcBlacklistMapper { + + List> getList(@Param("params")Map params); + + //判断手机号或者车牌是否重复 + int getPhoneOrVin(@Param("phone")String phone,@Param("plateNum")String plateNum,@Param("blacklistId")Long blacklistId,@Param("distinguish")Integer distinguish); + + + int getManufacturersOrVehicletype(@Param("manufacturers")String manufacturers,@Param("vehicleType")String vehicleType,@Param("vehicleEngine")String vehicleEngine,@Param("vehicleCode")String vehicleCode,@Param("blacklistId")Long blacklistId,@Param("distinguish")Integer distinguish); + + int insertBlacklist(XhpcBlacklist xhpcBlacklist); + + Map getBlacklistById(@Param("blacklistId")Long blacklistId); + + int updateBlacklist(XhpcBlacklist xhpcBlacklist); + + int deleteBlacklistById(@Param("blacklistId")Long blacklistId); +} diff --git a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/IXhpcAppUserUserService.java b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/IXhpcAppUserUserService.java index 373d4e03..3ef611a6 100644 --- a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/IXhpcAppUserUserService.java +++ b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/IXhpcAppUserUserService.java @@ -138,6 +138,12 @@ public interface IXhpcAppUserUserService { */ public R updateIsRefund(Long userId, Integer userType,Integer isRefund); + /** + * 设置小程序用户自动退款功能 + * @return + */ + public R doubleGunCharging(Long userId, Integer userType,Integer sunchaSwitch); + /** * 设置小程序用户电池保护 * @return diff --git a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/IXhpcBlacklistService.java b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/IXhpcBlacklistService.java new file mode 100644 index 00000000..8eb62339 --- /dev/null +++ b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/IXhpcBlacklistService.java @@ -0,0 +1,21 @@ +package com.xhpc.user.service; + +import com.xhpc.common.core.web.domain.AjaxResult; +import com.xhpc.user.domain.XhpcBlacklist; +import com.xhpc.user.domain.XhpcCustomers; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +public interface IXhpcBlacklistService { + + + List> getList(Map params); + + AjaxResult addBlacklist(HttpServletRequest request, XhpcBlacklist xhpcBlacklist); + + Map getBlacklistById(Long blacklistId); + + void deleteBlacklistById(Long blacklistId); +} diff --git a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/impl/XhpcAppUserServiceImpl.java b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/impl/XhpcAppUserServiceImpl.java index 48298bd3..32b5f164 100644 --- a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/impl/XhpcAppUserServiceImpl.java +++ b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/impl/XhpcAppUserServiceImpl.java @@ -828,6 +828,36 @@ public class XhpcAppUserServiceImpl extends BaseService implements IXhpcAppUserU return R.fail(HttpStatus.ERROR_STATUS, "参数错误"); } + @Override + public R doubleGunCharging(Long userId, Integer userType, Integer sunchaSwitch) { + if(sunchaSwitch>2 || sunchaSwitch<0){ + return R.fail(HttpStatus.ERROR_STATUS, "参数错误"); + } + if(userType==0){ + int i = xhpcAppUserMapper.updateUserSunchaSwitch(userId, sunchaSwitch); + if(i>0){ + return R.ok(); + }else{ + return R.fail(HttpStatus.ERROR_STATUS, "修改失败"); + } + }else if(userType==1){ + int i = xhpcAppUserMapper.updateCommunityPersonnelSunchaSwitch(userId, sunchaSwitch,null,null); + if(i>0){ + return R.ok(); + }else{ + return R.fail(HttpStatus.ERROR_STATUS, "修改失败"); + } + }else if(userType==2){ + int i = xhpcAppUserMapper.updateCustomersPersonnelSunchaSwitch(userId, sunchaSwitch,null,null); + if(i>0){ + return R.ok(); + }else{ + return R.fail(HttpStatus.ERROR_STATUS, "修改失败"); + } + } + return R.fail(HttpStatus.ERROR_STATUS, "参数错误"); + } + @Override public R batteryProtect(HttpServletRequest request, Integer soc,Integer socProtect,Integer userType) { LoginUser loginUser = logUserUtils.getLogUser(request); diff --git a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/impl/XhpcBlacklistServiceImpl.java b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/impl/XhpcBlacklistServiceImpl.java new file mode 100644 index 00000000..cb2ce57d --- /dev/null +++ b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/service/impl/XhpcBlacklistServiceImpl.java @@ -0,0 +1,120 @@ +package com.xhpc.user.service.impl; + +import com.xhpc.common.core.domain.R; +import com.xhpc.common.core.utils.SecurityUtils; +import com.xhpc.common.core.web.domain.AjaxResult; +import com.xhpc.common.core.web.service.BaseService; +import com.xhpc.common.security.service.TokenService; +import com.xhpc.user.domain.XhpcBlacklist; +import com.xhpc.user.mapper.XhpcBlacklistMapper; +import com.xhpc.user.service.IMechanismService; +import com.xhpc.user.service.IXhpcBlacklistService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +@Service +public class XhpcBlacklistServiceImpl extends BaseService implements IXhpcBlacklistService { + + @Resource + private XhpcBlacklistMapper xhpcBlacklistMapper; + @Resource + private TokenService tokenService; + @Autowired + private IMechanismService mechanismService; + @Override + public List> getList(Map params) { + startPage(); + return xhpcBlacklistMapper.getList(params); + } + + @Override + public AjaxResult addBlacklist(HttpServletRequest request, XhpcBlacklist xhpcBlacklist) { + R r = judgeXhpcCustomers(xhpcBlacklist); + if(r.getCode()!=200){ + return AjaxResult.error(r.getMsg()); + } + //名称重复不能入库 + Integer distinguish = xhpcBlacklist.getDistinguish(); + if(distinguish==1){ + int phoneOrVin = xhpcBlacklistMapper.getPhoneOrVin(xhpcBlacklist.getPhone(), xhpcBlacklist.getPlateNum(),xhpcBlacklist.getBlacklistId(),distinguish); + if(phoneOrVin >0 ){ + return AjaxResult.error("手机号或者车牌号重复"); + } + }else{ +// int i = xhpcBlacklistMapper.getManufacturersOrVehicletype(xhpcBlacklist.getManufacturers(),null,null,null,xhpcBlacklist.getBlacklistId(),distinguish); +// if(i >0 ){ +// return AjaxResult.error("制造厂商重复"); +// } +// int i1 = xhpcBlacklistMapper.getManufacturersOrVehicletype(null,xhpcBlacklist.getVehicleType(),null,null,xhpcBlacklist.getBlacklistId(),distinguish); +// if(i1 >0 ){ +// return AjaxResult.error("车辆类型重复"); +// } +// int i2 = xhpcBlacklistMapper.getManufacturersOrVehicletype(null,null,xhpcBlacklist.getVehicleEngine(),null,xhpcBlacklist.getBlacklistId(),distinguish); +// if(i2 >0 ){ +// return AjaxResult.error("发动机型式重复"); +// } +// int i3 = xhpcBlacklistMapper.getManufacturersOrVehicletype(null,null,null,xhpcBlacklist.getVehicleCode(),xhpcBlacklist.getBlacklistId(),distinguish); +// if(i3 >0 ){ +// return AjaxResult.error("企业车型代码重复"); +// } + } + + + String chargingStationIds = xhpcBlacklist.getChargingStationIds(); + if("".equals(chargingStationIds) || chargingStationIds ==null){ + xhpcBlacklist.setStatus(0); + }else{ + xhpcBlacklist.setStatus(1); + } + + if(xhpcBlacklist.getBlacklistId() ==null){ + xhpcBlacklistMapper.insertBlacklist(xhpcBlacklist); + if(!"".equals(chargingStationIds) && chargingStationIds !=null){ + mechanismService.addMechanism(Arrays.asList(chargingStationIds.split(",")),xhpcBlacklist.getBlacklistId(),2); + } + }else{ + xhpcBlacklistMapper.updateBlacklist(xhpcBlacklist); + mechanismService.updateMechanism(xhpcBlacklist.getBlacklistId(),2); + if(!"".equals(chargingStationIds) && chargingStationIds !=null){ + mechanismService.addMechanism(Arrays.asList(chargingStationIds.split(",")),xhpcBlacklist.getBlacklistId(),2); + } + } + + + return AjaxResult.success(); + } + + @Override + public Map getBlacklistById(Long blacklistId) { + return xhpcBlacklistMapper.getBlacklistById(blacklistId); + } + + @Override + public void deleteBlacklistById(Long blacklistId) { + xhpcBlacklistMapper.deleteBlacklistById(blacklistId); + } + + public R judgeXhpcCustomers(XhpcBlacklist xhpcBlacklist){ + if(xhpcBlacklist.getDistinguish()==1){ + if(xhpcBlacklist.getPhone()==null || "".equals(xhpcBlacklist.getPhone())){ + return R.fail("电话必填"); + } + if(xhpcBlacklist.getPlateNum()==null || "".equals(xhpcBlacklist.getPlateNum())){ + return R.fail("车牌必填"); + } + } + + if(xhpcBlacklist.getStartTime().getTime()>xhpcBlacklist.getEndTime().getTime()){ + return R.fail("限制充电开始时间大于结束时间"); + } + + + return R.ok(); + } +} diff --git a/xhpc-modules/xhpc-user/src/main/resources/bootstrap.yml b/xhpc-modules/xhpc-user/src/main/resources/bootstrap.yml index f85c5cef..2d9e2aef 100644 --- a/xhpc-modules/xhpc-user/src/main/resources/bootstrap.yml +++ b/xhpc-modules/xhpc-user/src/main/resources/bootstrap.yml @@ -14,10 +14,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcAppUserMapper.xml b/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcAppUserMapper.xml index 6e28fb48..d959e272 100644 --- a/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcAppUserMapper.xml +++ b/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcAppUserMapper.xml @@ -264,6 +264,10 @@ update xhpc_app_user set is_refund=#{isRefund} where app_user_id=#{userId} + + update xhpc_app_user set suncha_switch=#{sunchaSwitch} where app_user_id=#{userId} + + UPDATE xhpc_community_personnel @@ -274,6 +278,26 @@ WHERE community_personnel_id = #{userId} + + UPDATE xhpc_community_personnel + + suncha_switch = #{sunchaSwitch}, + soc_protect = #{socProtect}, + soc = #{soc}, + + WHERE community_personnel_id = #{userId} + + + + UPDATE xhpc_customers_personnel + + suncha_switch = #{sunchaSwitch}, + soc_protect = #{socProtect}, + soc = #{soc}, + + WHERE customers_personnel_id = #{userId} + + UPDATE xhpc_customers_personnel diff --git a/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcBlacklistMapper.xml b/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcBlacklistMapper.xml new file mode 100644 index 00000000..18ce2401 --- /dev/null +++ b/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcBlacklistMapper.xml @@ -0,0 +1,303 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into xhpc_blacklist + + + dimension, + + + status, + + + del_flag, + + + create_time, + + + create_by, + + + update_time, + + + update_by, + + + remark, + + + manufacturers, + + + vehicle_type, + + + vehicle_engine, + + + vehicle_code, + + + vin, + + + plate_num, + + + start_time, + + + end_time, + + + phone, + + + distinguish, + + + + + #{dimension}, + + + #{status}, + + + #{delFlag}, + + + #{createTime}, + + + #{createBy}, + + + #{updateTime}, + + + #{updateBy}, + + + #{remark}, + + + #{manufacturers}, + + + #{vehicleType}, + + + #{vehicleEngine}, + + + #{vehicleCode}, + + + #{vin}, + + + #{plateNum}, + + + #{startTime}, + + + #{endTime}, + + + #{phone}, + + + #{distinguish}, + + + + + + update xhpc_blacklist + + + dimension=#{dimension}, + + + status=#{status}, + + + del_flag=#{delFlag}, + + + create_time=#{createTime}, + + + create_by=#{createBy}, + + + update_time=#{updateTime}, + + + update_by=#{updateBy}, + + + remark=#{remark}, + + + manufacturers=#{manufacturers}, + + + vehicle_type=#{vehicleType}, + + + vehicle_engine=#{vehicleEngine}, + + + vehicle_code=#{vehicleCode}, + + + vin=#{vin}, + + + plate_num= #{plateNum}, + + + start_time= #{startTime}, + + + end_time=#{endTime}, + + + phone= #{phone}, + + + distinguish=#{distinguish}, + + + where blacklist_id=#{blacklistId} + + + + update xhpc_blacklist set del_flag =1 where blacklist_id=#{blacklistId} + + + + + + diff --git a/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcCommonMapper.xml b/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcCommonMapper.xml index a45f4ca1..02f7f30d 100644 --- a/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcCommonMapper.xml +++ b/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcCommonMapper.xml @@ -28,6 +28,10 @@ xau.tenant_id tenantId, xau.soc_protect socProtect, ten.status tenantStatus, + xau.suncha_switch as sunchaSwitch, + xau.a_balance as aBalance, + xau.b_balance as bBalance, + (select vin_spec_code as vinSpecCode from xhpc_user_vehicle where app_user_id = xau.app_user_id and source=0 and del_flag=0 and vin_blacklist !=1 order by type,create_time desc LIMIT 1) as vinSpecCode, (select vehicle_name as vehicleName from xhpc_user_vehicle where app_user_id = xau.app_user_id and source=0 and del_flag=0 and vin_blacklist !=1 order by type,create_time desc LIMIT 1) as vehicleName, xau.create_time as createTime from xhpc_app_user xau @@ -66,6 +70,10 @@ xcp.soc_protect socProtect, ten.status tenantStatus, concat("ST") as userTypeName, + xcp.suncha_switch as sunchaSwitch, + xcp.a_balance as aBalance, + xcp.b_balance as bBalance, + (select vin_spec_code as vinSpecCode from xhpc_user_vehicle where app_user_id = xcp.community_personnel_id and source=2 and del_flag=0 and vin_blacklist !=1 order by type,create_time desc LIMIT 1) as vinSpecCode, (select vehicle_name as vehicleName from xhpc_user_vehicle where app_user_id = xcp.community_personnel_id and source=2 and del_flag=0 and vin_blacklist !=1 order by type,create_time desc LIMIT 1) as vehicleName, (select count(charging_station_id) from xhpc_mechanism where community_id=mechanism_id and source=0 and charging_station_id in (select charging_station_id from xhpc_terminal where 1=1 and del_flag=0 and serial_number=#{serialNumber})) as number, @@ -106,6 +114,10 @@ xcp.soc_protect socProtect, ten.status tenantStatus, concat("BE") as userTypeName, + xcp.suncha_switch as sunchaSwitch, + xcp.a_balance as aBalance, + xcp.b_balance as bBalance, + (select vin_spec_code as vinSpecCode from xhpc_user_vehicle where app_user_id = xcp.customers_personnel_id and source=3 and del_flag=0 and vin_blacklist !=1 order by type,create_time desc LIMIT 1) as vinSpecCode, (select vehicle_name as vehicleName from xhpc_user_vehicle where app_user_id = xcp.customers_personnel_id and source=3 and del_flag=0 and vin_blacklist !=1 order by type,create_time desc LIMIT 1) as vehicleName, (select count(charging_station_id) from xhpc_mechanism where customers_id=mechanism_id and source=1 and charging_station_id in (select charging_station_id from xhpc_terminal where 1=1 and del_flag=0 and serial_number=#{serialNumber})) as number, diff --git a/xhpc-modules/xhpc-wxma/src/main/resources/bootstrap.yml b/xhpc-modules/xhpc-wxma/src/main/resources/bootstrap.yml index 6287bed8..287434f3 100644 --- a/xhpc-modules/xhpc-wxma/src/main/resources/bootstrap.yml +++ b/xhpc-modules/xhpc-wxma/src/main/resources/bootstrap.yml @@ -16,10 +16,10 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 config: # 配置中心地址 - server-addr: mse-e2a05960-nacos-ans.mse.aliyuncs.com:8848 + server-addr: 120.26.46.180:8858 # 配置文件格式 file-extension: yml # 共享配置