ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java
@@ -64,17 +64,20 @@ @ApiModelProperty(value = "会员开始时间") @TableField("start_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime startTime; @ApiModelProperty(value = "会员结束时间") @TableField("end_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime endTime; @TableField("create_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingPileFallbackFactory.java
@@ -56,6 +56,12 @@ public R<TChargingPile> getChargingPileById(Integer id) { return R.fail(throwable.getMessage()); } @Override public void updateChargingPileStatus(String code, Integer status) { log.error("修改充电桩状态失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingPileClient.java
@@ -49,4 +49,13 @@ @PostMapping("/t-charging-pile/getChargingPileById/{id}") R<TChargingPile> getChargingPileById(@PathVariable("id") Integer id); /** * 修改充电桩状态 * @param code * @param status */ @PostMapping("/t-charging-pile/updateChargingPileStatus") void updateChargingPileStatus(@RequestParam("code") String code, @RequestParam("status") Integer status); } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/SiteInfoVO.java
@@ -14,6 +14,8 @@ private String name; @ApiModelProperty(value = "桩id") private Integer chargingPileId; @ApiModelProperty(value = "站点id") private Integer siteId; @ApiModelProperty(value = "桩编号") private String number; @ApiModelProperty(value = "充电枪id") ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/GetPlatformStopChargingReply.java
@@ -16,4 +16,8 @@ * 充电枪编号 */ private String charging_gun_code; /** * 充电结束时间 */ private String end_time; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -140,14 +140,19 @@ } @Override public void securityDetection(SecurityDetection securityDetection) { public void securityDetection(SecurityDetectionVO securityDetection) { log.error("修改安全检测数据失败:" + throwable.getMessage()); } @Override public void startChargeSuccessfully(PlatformStartChargingReplyMessage message) { public void startChargeSuccessfully(PlatformStartChargingReplyMessageVO message) { log.error("远程启动充电应答失败:" + throwable.getMessage()); } @Override public void terminateSuccessfulResponse(PlatformStopChargingReplyVO platformStopChargingReply) { log.error("停止充电应答处理失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -160,10 +160,10 @@ * @param success_time */ @PostMapping("/t-charging-order/chargingOrderStartupFailureWxRefund") void chargingOrderStartupFailureWxRefund(@RequestParam("out_trade_no") String out_refund_no, @RequestParam("out_trade_no") String refund_id, @RequestParam("out_trade_no") String tradeState, @RequestParam("out_trade_no") String success_time); void chargingOrderStartupFailureWxRefund(@RequestParam("out_refund_no") String out_refund_no, @RequestParam("refund_id") String refund_id, @RequestParam("tradeState") String tradeState, @RequestParam("success_time") String success_time); /** * 管理后台取消购物订单后退款回调 * @param out_refund_no @@ -177,19 +177,26 @@ @RequestParam("out_trade_no") String tradeState, @RequestParam("out_trade_no") String success_time); //todo 待监听完成后调用此方法 /** * 修改安全检测数据 * @param securityDetection */ @PostMapping("/t-shopping-order/securityDetection") void securityDetection(@RequestBody SecurityDetection securityDetection); @PostMapping("/t-charging-order/securityDetection") void securityDetection(@RequestBody SecurityDetectionVO securityDetection); /** * 远程启动充电应答 * @param message */ @PostMapping("/t-shopping-order/startChargeSuccessfully") void startChargeSuccessfully(PlatformStartChargingReplyMessage message); @PostMapping("/t-charging-order/startChargeSuccessfully") void startChargeSuccessfully(PlatformStartChargingReplyMessageVO message); /** * 停止充电应答处理 * @param platformStopChargingReply */ @PostMapping("/t-charging-order/terminateSuccessfulResponse") void terminateSuccessfulResponse(@RequestBody PlatformStopChargingReplyVO platformStopChargingReply); } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/PlatformStartChargingReplyMessageVO.java
File was renamed from ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/PlatformStartChargingReplyMessage.java @@ -7,7 +7,7 @@ * @Date 2024/10/8 17:16 */ @Data public class PlatformStartChargingReplyMessage { public class PlatformStartChargingReplyMessageVO { private String transaction_serial_number; // 交易流水号 private String charging_pile_code; // 桩编码 private String charging_gun_code; // 抢号 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/PlatformStopChargingReplyVO.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.order.api.vo; import lombok.Data; /** * 远程停机命令回复 **/ @Data public class PlatformStopChargingReplyVO { private String charging_pile_code; // 桩编码 private String charging_gun_code; // 抢号 private Integer stop_result; // 停止结果(0:失败,1:成功) private Integer failure_cause; // 失败原因(0:无,1:设备编号不匹配,2:枪未处于充电状态,3:其他) } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/SecurityDetectionVO.java
File was renamed from ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/SecurityDetection.java @@ -3,7 +3,7 @@ import lombok.Data; @Data public class SecurityDetection { public class SecurityDetectionVO { private String transaction_serial_number; // 交易流水号 private String charging_pile_code; // 桩编码 private String charging_gun_code; // 抢号 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
@@ -109,6 +109,7 @@ TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData(); SiteInfoVO data = chargingPileClient.getSiteInfoByNumber1(chargingPile.getCode().toString()).getData(); data.setChargingGunId(id); data.setSiteId(chargingGun.getId()); data.setChargeMode(chargingGun.getChargeMode()); List<TAppUserCar> cars = appUserCarService.list(new QueryWrapper<TAppUserCar>() .eq("app_user_id",tokenService.getLoginUserApplet().getUserId()) ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java
@@ -25,6 +25,7 @@ import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.log.enums.OperatorType; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.other.api.domain.TVip; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -38,7 +39,9 @@ import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; /** * <p> @@ -55,12 +58,9 @@ private final TChargingPileService chargingPileService; private final TChargingGunService chargingGunService; @Resource private TAccountingStrategyService accountingStrategyService; @Resource private TAccountingStrategyDetailService accountingStrategyDetailService; @Resource private RedisService redisService; @Autowired @@ -205,6 +205,23 @@ TChargingPile chargingPile = chargingPileService.getById(id); return R.ok(chargingPile); } /** * 更新充电桩状态 * @param code * @param status */ @ResponseBody @PostMapping("/updateChargingPileStatus") public void updateChargingPileStatus(@RequestParam("code") String code, @RequestParam("status") Integer status){ TChargingPile chargingPile = chargingPileService.getOne(new LambdaQueryWrapper<TChargingPile>() .eq(TChargingPile::getCode, code).eq(TChargingPile::getDelFlag, 0)); if(null != chargingPile){ chargingPile.setStatus(0 == status ? 1 : 3); chargingPileService.updateById(chargingPile); redisService.getCacheMap("charging_pile_online").put(code, System.currentTimeMillis()); } } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TChargingPileService.java
@@ -106,5 +106,11 @@ * @return */ PageInfo<ChargingGunMonitoring> getChargingGunMonitoring(GetChargingGunMonitoring query); /** * 定时任务修改充电桩状态 */ void updateStatus(); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -27,6 +27,7 @@ import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.integration.api.feignClient.IotInterfaceClient; import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient; @@ -100,6 +101,9 @@ @Resource private IotInterfaceClient iotInterfaceClient; @Resource private RedisService redisService; @@ -544,4 +548,26 @@ } return pageInfo.setRecords(chargingGunMonitoring); } /** * 定时任务修改充电桩状态 */ @Override public void updateStatus() { List<TChargingPile> list = this.list(new LambdaQueryWrapper<TChargingPile>().eq(TChargingPile::getDelFlag, 0)); List<TChargingPile> datas = new ArrayList(); Map<String, Object> charging_pile_online = redisService.getCacheMap("charging_pile_online"); for (TChargingPile chargingPile : list) { Long time = (Long) charging_pile_online.get(chargingPile.getCode()); if(null != time && System.currentTimeMillis() - time > 60000){ chargingPile.setStatus(2); datas.add(chargingPile); } } if(datas.size() > 0){ this.updateBatchById(datas); } } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/TaskUtil.java
New file @@ -0,0 +1,30 @@ package com.ruoyi.chargingPile.util; import com.ruoyi.chargingPile.service.TChargingPileService; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * 定时任务工具类 */ @Component public class TaskUtil { @Resource private TChargingPileService chargingPileService;; /** * 每隔一分钟去处理的定时任务 */ @Scheduled(fixedRate = 1000 * 60) public void taskMinute(){ } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/RuoYiIntegrationApplication.java
@@ -6,6 +6,10 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.annotation.StreamListener; import org.springframework.cloud.stream.messaging.Sink; import org.springframework.cloud.stream.messaging.Source; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -20,6 +24,7 @@ @SpringBootApplication @EnableScheduling//开启定时任务 @EnableTransactionManagement//开启事务 @EnableBinding({ Source.class, Sink.class }) public class RuoYiIntegrationApplication { public static void main(String[] args) { SpringApplication.run(RuoYiIntegrationApplication.class, args); ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java
@@ -126,4 +126,5 @@ * 安全监测 */ public final static String SECURITY_DETECTION ="security_detection"; public static final String CHARGING_MESSAGE ="charging_message"; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
@@ -68,12 +68,15 @@ writer.write("服务id:"+service_id+"\n"); writer.close(); SendResult sendResult; ChargingMessage chargingMessage = new ChargingMessage(); chargingMessage.setServiceId(service_id); // 设备消息下发 String result; switch (service_id){ case SendTagConstant.ONLINE: OnlineMessage onlineMessage = JSON.parseObject(content.toJSONString(),OnlineMessage.class); sendResult = enhanceProduce.onlineMessage(onlineMessage); chargingMessage.setOnlineMessage(onlineMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 // 业务处理 登录认证应答 OnlineReply onlineReply = new OnlineReply(); @@ -89,7 +92,8 @@ break; case SendTagConstant.PING: PingMessage pingMessage = JSON.parseObject(content.toJSONString(),PingMessage.class); sendResult = enhanceProduce.pingMessage(pingMessage); chargingMessage.setPingMessage(pingMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 Pong pong = new Pong(); pong.setCharging_pile_code(pingMessage.getCharging_pile_code()); @@ -100,17 +104,20 @@ break; case SendTagConstant.END_CHARGE: EndChargeMessage endChargeMessage = JSON.parseObject(content.toJSONString(),EndChargeMessage.class); sendResult = enhanceProduce.endChargeMessage(endChargeMessage); chargingMessage.setEndChargeMessage(endChargeMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.ERROR_MESSAGE: ErrorMessageMessage errorMessageMessage = JSON.parseObject(content.toJSONString(),ErrorMessageMessage.class); sendResult = enhanceProduce.errorMessageMessage(errorMessageMessage); chargingMessage.setErrorMessageMessage(errorMessageMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.BILLING_MODE_VERIFY: BillingModeVerifyMessage billingModeVerifyMessage = JSON.parseObject(content.toJSONString(),BillingModeVerifyMessage.class); sendResult = enhanceProduce.billingModeVerifyMessage(billingModeVerifyMessage); chargingMessage.setBillingModeVerifyMessage(billingModeVerifyMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 BillingModeVerifyReply billingModeVerifyReply = new BillingModeVerifyReply(); if(billingModeVerifyMessage.getBilling_model_code().equals("0")){ @@ -137,7 +144,8 @@ break; case SendTagConstant.ACQUISITION_BILLING_MODE: AcquisitionBillingModeMessage acquisitionBillingModeMessage = JSON.parseObject(content.toJSONString(),AcquisitionBillingModeMessage.class); sendResult = enhanceProduce.acquisitionBillingModeMessage(acquisitionBillingModeMessage); chargingMessage.setAcquisitionBillingModeMessage(acquisitionBillingModeMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 计费模型请求应答 1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段 List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(acquisitionBillingModeMessage.getCharging_pile_code().substring(0,14)).getData(); Map<Integer, TAccountingStrategyDetail> strategyPrice = StrategyUtil.getStrategyPrice(accountingStrategyDetails); @@ -154,40 +162,48 @@ break; case SendTagConstant.UPLOAD_REAL_TIME_MONITORING_DATA: UploadRealTimeMonitoringDataMessage uploadRealTimeMonitoringDataMessage = JSON.parseObject(content.toJSONString(),UploadRealTimeMonitoringDataMessage.class); sendResult = enhanceProduce.uploadRealTimeMonitoringDataMessage(uploadRealTimeMonitoringDataMessage); chargingMessage.setUploadRealTimeMonitoringDataMessage(uploadRealTimeMonitoringDataMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.CHARGING_HANDSHAKE: ChargingHandshakeMessage chargingHandshakeMessage = JSON.parseObject(content.toJSONString(),ChargingHandshakeMessage.class); sendResult = enhanceProduce.chargingHandshakeMessage(chargingHandshakeMessage); chargingMessage.setChargingHandshakeMessage(chargingHandshakeMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.PARAMETER_SETTING: ParameterSettingMessage parameterSettingMessage = JSON.parseObject(content.toJSONString(),ParameterSettingMessage.class); sendResult = enhanceProduce.parameterSettingMessage(parameterSettingMessage); chargingMessage.setParameterSettingMessage(parameterSettingMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); break; case SendTagConstant.BMS_ABORT: BmsAbortMessage bmsAbortMessage = JSON.parseObject(content.toJSONString(),BmsAbortMessage.class); sendResult = enhanceProduce.bmsAbortMessage(bmsAbortMessage); chargingMessage.setBmsAbortMessage(bmsAbortMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.MOTOR_ABORT: MotorAbortMessage motorAbortMessage = JSON.parseObject(content.toJSONString(),MotorAbortMessage.class); sendResult = enhanceProduce.motorAbortMessage(motorAbortMessage); chargingMessage.setMotorAbortMessage(motorAbortMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); break; case SendTagConstant.BMS_DEMAND_AND_CHARGER_EXPORTATION: BmsDemandAndChargerExportationMessage bmsDemandAndChargerExportationMessage = JSON.parseObject(content.toJSONString(),BmsDemandAndChargerExportationMessage.class); sendResult = enhanceProduce.bmsDemandAndChargerExportationMessage(bmsDemandAndChargerExportationMessage); chargingMessage.setBmsDemandAndChargerExportationMessage(bmsDemandAndChargerExportationMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.BMS_INFORMATION: BmsInformationMessage bmsInformationMessage = JSON.parseObject(content.toJSONString(),BmsInformationMessage.class); sendResult = enhanceProduce.bmsInformationMessage(bmsInformationMessage); chargingMessage.setBmsInformationMessage(bmsInformationMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.CHARGING_PILE_STARTS_CHARGING: ChargingPileStartsChargingMessage chargingPileStartsChargingMessage = JSON.parseObject(content.toJSONString(),ChargingPileStartsChargingMessage.class); sendResult = enhanceProduce.chargingPileStartsChargingMessage(chargingPileStartsChargingMessage); chargingMessage.setChargingPileStartsChargingMessage(chargingPileStartsChargingMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 PlatformConfirmationCharging platformConfirmationCharging = new PlatformConfirmationCharging(); platformConfirmationCharging.setCharging_pile_code(chargingPileStartsChargingMessage.getCharging_pile_code()); @@ -200,17 +216,20 @@ break; case SendTagConstant.PLATFORM_START_CHARGING_REPLY: PlatformStartChargingReplyMessage platformStartChargingReplyMessage = JSON.parseObject(content.toJSONString(),PlatformStartChargingReplyMessage.class); sendResult = enhanceProduce.platformStartChargingReplyMessage(platformStartChargingReplyMessage); chargingMessage.setPlatformStartChargingReplyMessage(platformStartChargingReplyMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.PLATFORM_STOP_CHARGING_REPLY: PlatformStopChargingReplyMessage platformStopChargingReplyMessage = JSON.parseObject(content.toJSONString(),PlatformStopChargingReplyMessage.class); sendResult = enhanceProduce.platformStopChargingReplyMessage(platformStopChargingReplyMessage); chargingMessage.setPlatformStopChargingReplyMessage(platformStopChargingReplyMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.TRANSACTION_RECORD: TransactionRecordMessage transactionRecordMessage = JSON.parseObject(content.toJSONString(),TransactionRecordMessage.class); sendResult = enhanceProduce.transactionRecordMessage(transactionRecordMessage); chargingMessage.setTransactionRecordMessage(transactionRecordMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 ConfirmTransactionRecord confirmTransactionRecord = new ConfirmTransactionRecord(); confirmTransactionRecord.setTransaction_serial_number(transactionRecordMessage.getTransaction_serial_number()); @@ -219,27 +238,32 @@ break; case SendTagConstant.UPDATE_BALANCE_REPLY: UpdateBalanceReplyMessage updateBalanceReplyMessage = JSON.parseObject(content.toJSONString(),UpdateBalanceReplyMessage.class); sendResult = enhanceProduce.updateBalanceReplyMessage(updateBalanceReplyMessage); chargingMessage.setUpdateBalanceReplyMessage(updateBalanceReplyMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.SYNCHRONIZE_OFFLINE_CARD_REPLY: SynchronizeOfflineCardReplyMessage synchronizeOfflineCardReplyMessage = JSON.parseObject(content.toJSONString(),SynchronizeOfflineCardReplyMessage.class); sendResult = enhanceProduce.synchronizeOfflineCardReplyMessage(synchronizeOfflineCardReplyMessage); chargingMessage.setSynchronizeOfflineCardReplyMessage(synchronizeOfflineCardReplyMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.CLEAR_OFFLINE_CARD_REPLY: ClearOfflineCardReplyMessage clearOfflineCardReplyMessage = JSON.parseObject(content.toJSONString(),ClearOfflineCardReplyMessage.class); sendResult = enhanceProduce.clearOfflineCardReplyMessage(clearOfflineCardReplyMessage); chargingMessage.setClearOfflineCardReplyMessage(clearOfflineCardReplyMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.WORKING_PARAMETER_SETTING_REPLY: WorkingParameterSettingReplyMessage workingParameterSettingReplyMessage = JSON.parseObject(content.toJSONString(),WorkingParameterSettingReplyMessage.class); sendResult = enhanceProduce.workingParameterSettingReplyMessage(workingParameterSettingReplyMessage); chargingMessage.setWorkingParameterSettingReplyMessage(workingParameterSettingReplyMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.TIMING_SETTING: TimingSettingMessage timingSettingMessage = JSON.parseObject(content.toJSONString(),TimingSettingMessage.class); sendResult = enhanceProduce.timingSettingMessage(timingSettingMessage); chargingMessage.setTimingSettingMessage(timingSettingMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 对时设置应答 TimingSettingReply timingSettingReply = new TimingSettingReply(); timingSettingReply.setCharging_pile_code(timingSettingMessage.getCharging_pile_code()); @@ -248,37 +272,44 @@ break; case SendTagConstant.SETUP_BILLING_MODEL_REPLY: SetupBillingModelReplyMessage setupBillingModelReplyMessage = JSON.parseObject(content.toJSONString(),SetupBillingModelReplyMessage.class); sendResult = enhanceProduce.setupBillingModelReplyMessage(setupBillingModelReplyMessage); chargingMessage.setSetupBillingModelReplyMessage(setupBillingModelReplyMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.GROUND_LOCK_REAL_TIME_DATA: GroundLockRealTimeDataMessage groundLockRealTimeDataMessage = JSON.parseObject(content.toJSONString(),GroundLockRealTimeDataMessage.class); sendResult = enhanceProduce.groundLockRealTimeDataMessage(groundLockRealTimeDataMessage); chargingMessage.setGroundLockRealTimeDataMessage(groundLockRealTimeDataMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.CHARGING_PILE_RETURNS_GROUND_LOCK_DATA: ChargingPileReturnsGroundLockDataMessage chargingPileReturnsGroundLockDataMessage = JSON.parseObject(content.toJSONString(),ChargingPileReturnsGroundLockDataMessage.class); sendResult = enhanceProduce.chargingPileReturnsGroundLockDataMessage(chargingPileReturnsGroundLockDataMessage); chargingMessage.setChargingPileReturnsGroundLockDataMessage(chargingPileReturnsGroundLockDataMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.PLATFORM_RESTART_REPLY: PlatformRestartReplyMessage platformRestartReplyMessage = JSON.parseObject(content.toJSONString(),PlatformRestartReplyMessage.class); sendResult = enhanceProduce.platformRestartReplyMessage(platformRestartReplyMessage); chargingMessage.setPlatformRestartReplyMessage(platformRestartReplyMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.QR_CODE_DELIVERY_REPLY: QrCodeDeliveryReplyMessage qrCodeDeliveryReplyMessage = JSON.parseObject(content.toJSONString(),QrCodeDeliveryReplyMessage.class); sendResult = enhanceProduce.qrCodeDeliveryReplyMessage(qrCodeDeliveryReplyMessage); chargingMessage.setQrCodeDeliveryReplyMessage(qrCodeDeliveryReplyMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; case SendTagConstant.SECURITY_DETECTION: SecurityDetectionMessage securityDetectionMessage = JSON.parseObject(content.toJSONString(),SecurityDetectionMessage.class); sendResult = enhanceProduce.securityDetectionMessage(securityDetectionMessage); chargingMessage.setSecurityDetectionMessage(securityDetectionMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; default: PlatformRemoteUpdateReplyMessage platformRemoteUpdateReplyMessage = JSON.parseObject(content.toJSONString(),PlatformRemoteUpdateReplyMessage.class); sendResult = enhanceProduce.platformRemoteUpdateReplyMessage(platformRemoteUpdateReplyMessage); chargingMessage.setPlatformRemoteUpdateReplyMessage(platformRemoteUpdateReplyMessage); sendResult = enhanceProduce.chargingMessage(chargingMessage); // 响应硬件 break; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java
@@ -10,6 +10,8 @@ import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; @Service @@ -39,8 +41,9 @@ */ @Override public PlatformStopChargingReply getPlatformStopChargingReply(GetPlatformStopChargingReply query) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); List<PlatformStopChargingReply> platformStopChargingReplies = mongoTemplate.find(new Query().addCriteria(Criteria.where("charging_pile_code").is(query.getCharging_pile_code()) .and("charging_gun_code").is(query.getCharging_gun_code())), PlatformStopChargingReply.class); .and("charging_gun_code").is(query.getCharging_gun_code()).and("create_time").lte(sdf.format(new Date())).and("create_time").gte(query.getEnd_time())), PlatformStopChargingReply.class); return platformStopChargingReplies.size() > 0 ? platformStopChargingReplies.get(0) : null; } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/base/BaseMessage.java
@@ -27,4 +27,9 @@ * 重试次数,用于判断重试次数,超过重试次数发送异常警告 */ protected Integer retryTimes = 0; /** * 服务id */ protected String serviceId; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java
@@ -35,11 +35,6 @@ @Autowired private EndChargeService endChargeService; @Autowired private MessageUtil messageUtil; @Autowired private IotMessageProduce iotMessageProduce; @Resource private ChargingOrderClient chargingOrderClient; ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/PlatformStartChargingReplyMessageListener.java
@@ -6,6 +6,7 @@ import com.ruoyi.integration.rocket.model.PlatformStartChargingReplyMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.vo.PlatformStartChargingReplyMessageVO; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.MessageModel; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; @@ -44,7 +45,7 @@ BeanUtils.copyProperties(message,platformStartChargingReply); platformStartChargingReplyService.create(platformStartChargingReply); // 业务处理 com.ruoyi.order.api.vo.PlatformStartChargingReplyMessage message1 = new com.ruoyi.order.api.vo.PlatformStartChargingReplyMessage(); PlatformStartChargingReplyMessageVO message1 = new PlatformStartChargingReplyMessageVO(); BeanUtils.copyProperties(message, message1); chargingOrderClient.startChargeSuccessfully(message1); } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java
@@ -33,10 +33,6 @@ @Autowired private TimingSettingService timingSettingService; @Autowired private IotMessageProduce iotMessageProduce; @Autowired private MessageUtil messageUtil; @Override protected void handleMessage(TimingSettingMessage message) throws Exception { // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/ChargingMessage.java
New file @@ -0,0 +1,44 @@ package com.ruoyi.integration.rocket.model; import com.ruoyi.integration.rocket.base.BaseMessage; import lombok.Data; import org.apache.poi.ss.formula.functions.T; @Data public class ChargingMessage extends BaseMessage { private AcquisitionBillingModeMessage acquisitionBillingModeMessage; private BillingModeVerifyMessage billingModeVerifyMessage; private BmsAbortMessage bmsAbortMessage; private BmsDemandAndChargerExportationMessage bmsDemandAndChargerExportationMessage; private BmsInformationMessage bmsInformationMessage; private ChargingHandshakeMessage chargingHandshakeMessage; private ChargingMessage chargingMessage; private ChargingPileReturnsGroundLockDataMessage chargingPileReturnsGroundLockDataMessage; private ChargingPileStartsChargingMessage chargingPileStartsChargingMessage; private ClearOfflineCardReplyMessage clearOfflineCardReplyMessage; private EndChargeMessage endChargeMessage; private ErrorMessageMessage errorMessageMessage; private GroundLockRealTimeDataMessage groundLockRealTimeDataMessage; private MotorAbortMessage motorAbortMessage; private OnlineMessage onlineMessage; private ParameterSettingMessage parameterSettingMessage; private PingMessage pingMessage; private PlatformRemoteUpdateReplyMessage platformRemoteUpdateReplyMessage; private PlatformRestartReplyMessage platformRestartReplyMessage; private PlatformStartChargingReplyMessage platformStartChargingReplyMessage; private PlatformStopChargingReplyMessage platformStopChargingReplyMessage; private QrCodeDeliveryMessage qrCodeDeliveryMessage; private QrCodeDeliveryReplyMessage qrCodeDeliveryReplyMessage; private QueryOfflineCardReplyMessage queryOfflineCardReplyMessage; private SecurityDetectionMessage securityDetectionMessage; private SetupBillingModelReplyMessage setupBillingModelReplyMessage; private SynchronizeOfflineCardReplyMessage synchronizeOfflineCardReplyMessage; private TimingSettingMessage timingSettingMessage; private TimingSettingReplyMessage timingSettingReplyMessage; private TransactionRecordMessage transactionRecordMessage; private UpdateBalanceReplyMessage updateBalanceReplyMessage; private UploadRealTimeMonitoringDataMessage uploadRealTimeMonitoringDataMessage; private WorkingParameterSettingReplyMessage workingParameterSettingReplyMessage; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/GroundLockRealTimeDataMessage.java
@@ -1,6 +1,7 @@ package com.ruoyi.integration.rocket.model; import com.ruoyi.integration.rocket.base.BaseMessage; import lombok.AllArgsConstructor; import lombok.Data; import lombok.experimental.Accessors; import org.springframework.data.mongodb.core.mapping.Document; ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
New file @@ -0,0 +1,501 @@ package com.ruoyi.integration.rocket.produce; import com.alibaba.fastjson.JSON; import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient; import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient; import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient; import com.ruoyi.chargingPile.api.feignClient.FaultMessageClient; import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TFaultMessage; import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode; import com.ruoyi.integration.api.model.*; import com.ruoyi.integration.iotda.constant.SendTagConstant; import com.ruoyi.integration.iotda.enums.ServiceIdMenu; import com.ruoyi.integration.iotda.utils.tools.CP56Time2aConverter; import com.ruoyi.integration.mongodb.service.*; import com.ruoyi.integration.rocket.model.*; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.PlatformStartChargingReplyMessageVO; import com.ruoyi.order.api.vo.PlatformStopChargingReplyVO; import com.ruoyi.order.api.vo.SecurityDetectionVO; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.MessageModel; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.stream.annotation.StreamListener; import org.springframework.cloud.stream.messaging.Sink; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.Date; import java.util.Objects; @Slf4j @Component @RocketMQMessageListener( messageModel = MessageModel.CLUSTERING, consumerGroup = "charge_charging_message", topic = "charge_charging_message", selectorExpression = "charging_message", consumeThreadMax = 5 //默认是64个线程并发消息,配置 consumeThreadMax 参数指定并发消费线程数,避免太大导致资源不够 ) public class ChargingMessageListener extends EnhanceMessageHandler<ChargingMessage> implements RocketMQListener<ChargingMessage> { @Autowired private AcquisitionBillingModeService acquisitionBillingModeService; @Autowired private BillingModeVerifyService billingModeVerifyService; @Autowired private BmsAbortService bmsAbortService; @Resource private ChargingOrderClient chargingOrderClient; @Autowired private BmsDemandAndChargerExportationService bmsDemandAndChargerExportationService; @Autowired private OnlineService onlineService; @Autowired private PingService pingService; @Autowired private EndChargeService endChargeService; @Autowired private ErrorMessageMessageService errorMessageMessageService; @Autowired private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService; @Resource private AccountingStrategyDetailClient accountingStrategyDetailClient; @Resource private ChargingGunClient chargingGunClient; @Resource private FaultMessageClient faultMessageClient; @Autowired private ChargingHandshakeService chargingHandshakeService; @Autowired private ParameterSettingService parameterSettingService; @Autowired private MotorAbortService motorAbortService; @Autowired private BmsInformationService bmsInformationService; @Autowired private ChargingPileStartsChargingService chargingPileStartsChargingService; @Autowired private PlatformStartChargingReplyService platformStartChargingReplyService; @Autowired private PlatformStopChargingReplyService platformStopChargingReplyService; @Autowired private TransactionRecordService transactionRecordService; @Autowired private UpdateBalanceReplyService updateBalanceReplyService; @Autowired private SynchronizeOfflineCardReplyService synchronizeOfflineCardReplyService; @Autowired private ClearOfflineCardReplyService clearOfflineCardReplyService; @Autowired private WorkingParameterSettingReplyService workingParameterSettingReplyService; @Autowired private TimingSettingService timingSettingService; @Autowired private SetupBillingModelReplyService setupBillingModelReplyService; @Autowired private GroundLockRealTimeDataService groundLockRealTimeDataService; @Autowired private ChargingPileReturnsGroundLockDataService chargingPileReturnsGroundLockDataService; @Autowired private PlatformRestartReplyService platformRestartReplyService; @Autowired private PlatformRemoteUpdateReplyService platformRemoteUpdateReplyService; @Autowired private QrCodeDeliveryReplyService qrCodeDeliveryReplyService; @Autowired private SecurityDetectionService securityDetectionService; @Resource private ChargingPileClient chargingPileClient; @StreamListener("input") @Override protected void handleMessage(ChargingMessage message) throws Exception { String serviceId = message.getServiceId(); if(!StringUtils.hasLength(serviceId)){ return; } switch (serviceId){ case SendTagConstant.ONLINE: OnlineMessage onlineMessage = message.getOnlineMessage(); log.info("充电桩登录认证业务消息处理:{}",onlineMessage); // 持久化消息 Online online = new Online(); BeanUtils.copyProperties(onlineMessage,online); onlineService.create(online); break; case SendTagConstant.PING: PingMessage pingMessage = message.getPingMessage(); log.info("充电桩心跳包-业务消息处理:{}",pingMessage); // 持久化消息 Ping ping = new Ping(); BeanUtils.copyProperties(pingMessage,ping); pingService.create(ping); chargingPileClient.updateChargingPileStatus(pingMessage.getCharging_pile_code(), pingMessage.getCharging_gun_status()); break; case SendTagConstant.END_CHARGE: EndChargeMessage endChargeMessage = message.getEndChargeMessage(); log.info("充电结束-业务消息处理:{}",endChargeMessage); // 持久化消息 EndCharge endCharge = new EndCharge(); BeanUtils.copyProperties(endChargeMessage,endCharge); endChargeService.create(endCharge); // 业务处理 chargingOrderClient.endCharge(endCharge.getTransaction_serial_number()); break; case SendTagConstant.ERROR_MESSAGE: ErrorMessageMessage errorMessageMessage1 = message.getErrorMessageMessage(); log.info("错误报文-业务消息处理:{}",errorMessageMessage1); // 持久化消息 ErrorMessageMessage errorMessageMessage = new ErrorMessageMessage(); BeanUtils.copyProperties(errorMessageMessage1,errorMessageMessage); errorMessageMessageService.create(errorMessageMessage); break; case SendTagConstant.BILLING_MODE_VERIFY: BillingModeVerifyMessage billingModeVerifyMessage = message.getBillingModeVerifyMessage(); log.info("计费模型验证请求-业务消息处理:{}",billingModeVerifyMessage); // 持久化消息 BillingModeVerify billingModeVerify = new BillingModeVerify(); BeanUtils.copyProperties(billingModeVerifyMessage,billingModeVerify); billingModeVerifyService.create(billingModeVerify); break; case SendTagConstant.ACQUISITION_BILLING_MODE: AcquisitionBillingModeMessage acquisitionBillingModeMessage = message.getAcquisitionBillingModeMessage(); log.info("充电桩计费模型请求-业务消息处理:{}",acquisitionBillingModeMessage); // 持久化消息 AcquisitionBillingMode acquisitionBillingMode = new AcquisitionBillingMode(); BeanUtils.copyProperties(acquisitionBillingModeMessage,acquisitionBillingMode); acquisitionBillingModeService.create(acquisitionBillingMode); break; case SendTagConstant.UPLOAD_REAL_TIME_MONITORING_DATA: UploadRealTimeMonitoringDataMessage uploadRealTimeMonitoringDataMessage = message.getUploadRealTimeMonitoringDataMessage(); log.info("上传实时监测数据-业务消息处理:{}",uploadRealTimeMonitoringDataMessage); // 持久化消息 UploadRealTimeMonitoringData uploadRealTimeMonitoringData = new UploadRealTimeMonitoringData(); BeanUtils.copyProperties(uploadRealTimeMonitoringDataMessage,uploadRealTimeMonitoringData); // 查询mogondb上一条数据 UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(uploadRealTimeMonitoringDataMessage.getTransaction_serial_number()); // 查询订单 TChargingOrder chargingOrder = chargingOrderClient.getOrderByCode(uploadRealTimeMonitoringDataMessage.getTransaction_serial_number()).getData(); // 查询当前时间段的计费策略 TAccountingStrategyDetail accountingStrategyDetail = accountingStrategyDetailClient.getDetailBySiteId(chargingOrder.getSiteId()).getData(); uploadRealTimeMonitoringData.setElectrovalence_all(accountingStrategyDetail.getElectrovalence()); uploadRealTimeMonitoringData.setService_charge(accountingStrategyDetail.getServiceCharge()); if (Objects.nonNull(data)) { uploadRealTimeMonitoringData.setLast_time(data.getLast_time()); uploadRealTimeMonitoringData.setPeriod_electric_price(uploadRealTimeMonitoringDataMessage.getPaid_amount().divide(data.getPaid_amount())); uploadRealTimeMonitoringData.setPeriod_charging_degree(uploadRealTimeMonitoringDataMessage.getCharging_degree().divide(data.getCharging_degree())); uploadRealTimeMonitoringData.setPeriod_service_price(uploadRealTimeMonitoringDataMessage.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP)); }else { log.info("首次上传实时监测数据"); uploadRealTimeMonitoringData.setPeriod_electric_price(uploadRealTimeMonitoringDataMessage.getPaid_amount()); uploadRealTimeMonitoringData.setPeriod_charging_degree(uploadRealTimeMonitoringDataMessage.getCharging_degree()); uploadRealTimeMonitoringData.setPeriod_service_price(uploadRealTimeMonitoringDataMessage.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP)); } uploadRealTimeMonitoringDataService.create(uploadRealTimeMonitoringData); // 业务处理 UploadRealTimeMonitoringDataQuery query = new UploadRealTimeMonitoringDataQuery(); BeanUtils.copyProperties(uploadRealTimeMonitoringData, query); chargingOrderClient.chargeMonitoring(query); GetChargingGunByCode code = new GetChargingGunByCode(); code.setCharging_pile_code(uploadRealTimeMonitoringDataMessage.getCharging_pile_code()); code.setCharging_gun_code(uploadRealTimeMonitoringDataMessage.getCharging_gun_code()); TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData(); if(Objects.nonNull(chargingGun)){ // 存储状态信息 TFaultMessage faultMessage = new TFaultMessage(); if(uploadRealTimeMonitoringDataMessage.getCharging_gun_status().equals(0) || uploadRealTimeMonitoringDataMessage.getCharging_gun_status().equals(1)){ faultMessage.setSiteId(chargingGun.getSiteId()); faultMessage.setChargingPileId(chargingGun.getChargingPileId()); faultMessage.setChargingGunId(chargingGun.getId()); switch (uploadRealTimeMonitoringDataMessage.getCharging_gun_status()){ case 0: faultMessage.setStatus(1); chargingGun.setStatus(1); break; case 1: faultMessage.setStatus(2); chargingGun.setStatus(7); break; } faultMessage.setDownTime(LocalDateTime.now()); faultMessageClient.createFaultMessage(faultMessage); }else { switch (uploadRealTimeMonitoringDataMessage.getCharging_gun_status()){ case 2: chargingGun.setStatus(2); break; case 3: chargingGun.setStatus(4); break; } // 空闲 充电 查询是否该设备之前存在离线记录或者故障记录 faultMessage = faultMessageClient.getFaultMessageByGunId(chargingGun.getId()).getData(); if(Objects.nonNull(faultMessage)){ faultMessage.setEndTime(LocalDateTime.now()); faultMessageClient.updateFaultMessage(faultMessage); } } chargingGunClient.updateChargingGunById(chargingGun); } break; case SendTagConstant.CHARGING_HANDSHAKE: ChargingHandshakeMessage chargingHandshakeMessage = message.getChargingHandshakeMessage(); log.info("充电握手-业务消息处理:{}",chargingHandshakeMessage); // 持久化消息 ChargingHandshake chargingHandshake = new ChargingHandshake(); BeanUtils.copyProperties(chargingHandshakeMessage,chargingHandshake); chargingHandshakeService.create(chargingHandshake); break; case SendTagConstant.PARAMETER_SETTING: ParameterSettingMessage parameterSettingMessage = message.getParameterSettingMessage(); log.info("业务消息处理:{}",parameterSettingMessage); // 持久化消息 ParameterSetting parameterSetting = new ParameterSetting(); BeanUtils.copyProperties(parameterSettingMessage,parameterSetting); parameterSettingService.create(parameterSetting); break; case SendTagConstant.BMS_ABORT: BmsAbortMessage bmsAbortMessage = message.getBmsAbortMessage(); log.info("充电阶段BMS中止-业务消息处理:{}",bmsAbortMessage); // 持久化消息 BmsAbort bmsAbort = new BmsAbort(); BeanUtils.copyProperties(bmsAbortMessage,bmsAbort); bmsAbortService.create(bmsAbort); // 业务处理 chargingOrderClient.excelEndCharge(bmsAbort.getTransaction_serial_number()); break; case SendTagConstant.MOTOR_ABORT: MotorAbortMessage motorAbortMessage = message.getMotorAbortMessage(); log.info("充电阶段充电机中止-业务消息处理:{}",motorAbortMessage); // 持久化消息 MotorAbort motorAbort = new MotorAbort(); BeanUtils.copyProperties(motorAbortMessage,motorAbort); motorAbortService.create(motorAbort); // 业务处理 chargingOrderClient.excelEndCharge(motorAbort.getTransaction_serial_number()); break; case SendTagConstant.BMS_DEMAND_AND_CHARGER_EXPORTATION: BmsDemandAndChargerExportationMessage bmsDemandAndChargerExportationMessage = message.getBmsDemandAndChargerExportationMessage(); log.info("充电过程BMS需求、充电机输出-业务消息处理:{}",bmsDemandAndChargerExportationMessage); // 持久化消息 BmsDemandAndChargerExportation bmsDemandAndChargerExportation = new BmsDemandAndChargerExportation(); BeanUtils.copyProperties(bmsDemandAndChargerExportationMessage,bmsDemandAndChargerExportation); bmsDemandAndChargerExportationService.create(bmsDemandAndChargerExportation); // 业务处理 TChargingOrder chargingOrderBms = chargingOrderClient.getOrderByCode(bmsDemandAndChargerExportationMessage.getTransaction_serial_number()).getData(); if(Objects.nonNull(chargingOrderBms)){ chargingOrderBms.setNeedElec(bmsDemandAndChargerExportationMessage.getBms_current_requirements()); chargingOrderClient.updateChargingOrder(chargingOrderBms); } break; case SendTagConstant.BMS_INFORMATION: BmsInformationMessage bmsInformationMessage = message.getBmsInformationMessage(); log.info("充电过程BMS信息-业务消息处理:{}",bmsInformationMessage); // 持久化消息 BmsInformation bmsInformation = new BmsInformation(); BeanUtils.copyProperties(bmsInformationMessage,bmsInformation); bmsInformationService.create(bmsInformation); break; case SendTagConstant.CHARGING_PILE_STARTS_CHARGING: ChargingPileStartsChargingMessage chargingPileStartsChargingMessage = message.getChargingPileStartsChargingMessage(); log.info("充电桩主动申请启动充电-业务消息处理:{}",chargingPileStartsChargingMessage); // 持久化消息 ChargingPileStartsCharging chargingPileStartsCharging = new ChargingPileStartsCharging(); BeanUtils.copyProperties(chargingPileStartsChargingMessage,chargingPileStartsCharging); chargingPileStartsChargingService.create(chargingPileStartsCharging); break; case SendTagConstant.PLATFORM_START_CHARGING_REPLY: PlatformStartChargingReplyMessage platformStartChargingReplyMessage = message.getPlatformStartChargingReplyMessage(); log.info("远程启机命令回复-业务消息处理:{}",platformStartChargingReplyMessage); // 持久化消息 PlatformStartChargingReply platformStartChargingReply = new PlatformStartChargingReply(); BeanUtils.copyProperties(platformStartChargingReplyMessage,platformStartChargingReply); platformStartChargingReplyService.create(platformStartChargingReply); // 业务处理 PlatformStartChargingReplyMessageVO message1 = new com.ruoyi.order.api.vo.PlatformStartChargingReplyMessageVO(); BeanUtils.copyProperties(platformStartChargingReplyMessage, message1); chargingOrderClient.startChargeSuccessfully(message1); break; case SendTagConstant.PLATFORM_STOP_CHARGING_REPLY: PlatformStopChargingReplyMessage platformStopChargingReplyMessage = message.getPlatformStopChargingReplyMessage(); log.info("远程停机命令回复-业务消息处理:{}",platformStopChargingReplyMessage); // 持久化消息 PlatformStopChargingReply platformStopChargingReply = new PlatformStopChargingReply(); BeanUtils.copyProperties(platformStopChargingReplyMessage,platformStopChargingReply); platformStopChargingReplyService.create(platformStopChargingReply); PlatformStopChargingReplyVO platformStopChargingReply1 = new PlatformStopChargingReplyVO(); BeanUtils.copyProperties(platformStopChargingReply, platformStopChargingReply1); chargingOrderClient.terminateSuccessfulResponse(platformStopChargingReply1); break; case SendTagConstant.TRANSACTION_RECORD: TransactionRecordMessage transactionRecordMessage = message.getTransactionRecordMessage(); log.info("交易记录-业务消息处理:{}",transactionRecordMessage); // 持久化消息 TransactionRecord transactionRecord = new TransactionRecord(); BeanUtils.copyProperties(transactionRecordMessage,transactionRecord); transactionRecordService.create(transactionRecord); // 业务处理 TChargingOrder chargingOrderRecord = chargingOrderClient.getOrderByCode(transactionRecordMessage.getTransaction_serial_number()).getData(); if(Objects.nonNull(chargingOrderRecord)){ chargingOrderRecord.setTotalElectricity(transactionRecordMessage.getTotal_electricity()); chargingOrderClient.updateChargingOrder(chargingOrderRecord); } break; case SendTagConstant.UPDATE_BALANCE_REPLY: UpdateBalanceReplyMessage updateBalanceReplyMessage = message.getUpdateBalanceReplyMessage(); log.info("余额更新应答-业务消息处理:{}",updateBalanceReplyMessage); // 持久化消息 UpdateBalanceReply updateBalanceReply = new UpdateBalanceReply(); BeanUtils.copyProperties(updateBalanceReplyMessage,updateBalanceReply); updateBalanceReplyService.create(updateBalanceReply); break; case SendTagConstant.SYNCHRONIZE_OFFLINE_CARD_REPLY: SynchronizeOfflineCardReplyMessage synchronizeOfflineCardReplyMessage = message.getSynchronizeOfflineCardReplyMessage(); log.info("卡数据同步应答-业务消息处理:{}",synchronizeOfflineCardReplyMessage); // 持久化消息 SynchronizeOfflineCardReply synchronizeOfflineCardReply = new SynchronizeOfflineCardReply(); BeanUtils.copyProperties(synchronizeOfflineCardReplyMessage,synchronizeOfflineCardReply); synchronizeOfflineCardReplyService.create(synchronizeOfflineCardReply); break; case SendTagConstant.CLEAR_OFFLINE_CARD_REPLY: ClearOfflineCardReplyMessage clearOfflineCardReplyMessage = message.getClearOfflineCardReplyMessage(); log.info("离线卡数据清除应答-业务消息处理:{}",clearOfflineCardReplyMessage); // 持久化消息 ClearOfflineCardReply clearOfflineCardReply = new ClearOfflineCardReply(); BeanUtils.copyProperties(clearOfflineCardReplyMessage,clearOfflineCardReply); clearOfflineCardReplyService.create(clearOfflineCardReply); break; case SendTagConstant.WORKING_PARAMETER_SETTING_REPLY: WorkingParameterSettingReplyMessage workingParameterSettingReplyMessage = message.getWorkingParameterSettingReplyMessage(); log.info("充电桩工作参数设置应答-业务消息处理:{}",workingParameterSettingReplyMessage); // 持久化消息 WorkingParameterSettingReply workingParameterSettingReply = new WorkingParameterSettingReply(); BeanUtils.copyProperties(workingParameterSettingReplyMessage,workingParameterSettingReply); workingParameterSettingReplyService.create(workingParameterSettingReply); break; case SendTagConstant.TIMING_SETTING: TimingSettingMessage timingSettingMessage = message.getTimingSettingMessage(); log.info("对时设置-业务消息处理:{}",timingSettingMessage); // 持久化消息 TimingSetting timingSetting = new TimingSetting(); BeanUtils.copyProperties(timingSettingMessage,timingSetting); timingSettingService.create(timingSetting); break; case SendTagConstant.SETUP_BILLING_MODEL_REPLY: SetupBillingModelReplyMessage setupBillingModelReplyMessage = message.getSetupBillingModelReplyMessage(); log.info("计费模型应答-业务消息处理:{}",setupBillingModelReplyMessage); // 持久化消息 SetupBillingModelReply setupBillingModelReply = new SetupBillingModelReply(); BeanUtils.copyProperties(setupBillingModelReplyMessage,setupBillingModelReply); setupBillingModelReplyService.create(setupBillingModelReply); break; case SendTagConstant.GROUND_LOCK_REAL_TIME_DATA: GroundLockRealTimeDataMessage groundLockRealTimeDataMessage = message.getGroundLockRealTimeDataMessage(); log.info("地锁数据上送(充电桩上送)-业务消息处理:{}",groundLockRealTimeDataMessage); // 持久化消息 GroundLockRealTimeData groundLockRealTimeData = new GroundLockRealTimeData(); BeanUtils.copyProperties(groundLockRealTimeDataMessage,groundLockRealTimeData); groundLockRealTimeDataService.create(groundLockRealTimeData); break; case SendTagConstant.CHARGING_PILE_RETURNS_GROUND_LOCK_DATA: ChargingPileReturnsGroundLockDataMessage chargingPileReturnsGroundLockDataMessage = message.getChargingPileReturnsGroundLockDataMessage(); log.info("充电桩返回数据(上行)-业务消息处理:{}",chargingPileReturnsGroundLockDataMessage); // 持久化消息 ChargingPileReturnsGroundLockData chargingPileReturnsGroundLockData = new ChargingPileReturnsGroundLockData(); BeanUtils.copyProperties(chargingPileReturnsGroundLockDataMessage,chargingPileReturnsGroundLockData); chargingPileReturnsGroundLockDataService.create(chargingPileReturnsGroundLockData); break; case SendTagConstant.PLATFORM_RESTART_REPLY: PlatformRestartReplyMessage platformRestartReplyMessage = message.getPlatformRestartReplyMessage(); log.info("远程重启应答-业务消息处理:{}",platformRestartReplyMessage); // 持久化消息 PlatformRestartReply platformRestartReply = new PlatformRestartReply(); BeanUtils.copyProperties(platformRestartReplyMessage,platformRestartReply); platformRestartReplyService.create(platformRestartReply); break; case SendTagConstant.QR_CODE_DELIVERY_REPLY: QrCodeDeliveryReplyMessage qrCodeDeliveryReplyMessage = message.getQrCodeDeliveryReplyMessage(); log.info("二维码下发应答-业务消息处理:{}",qrCodeDeliveryReplyMessage); QrCodeDeliveryReply qrCodeDeliveryReply = new QrCodeDeliveryReply(); BeanUtils.copyProperties(qrCodeDeliveryReplyMessage,qrCodeDeliveryReply); qrCodeDeliveryReplyService.create(qrCodeDeliveryReply); break; case SendTagConstant.SECURITY_DETECTION: SecurityDetectionMessage securityDetectionMessage = message.getSecurityDetectionMessage(); log.info("安全监测-业务消息处理:{}",securityDetectionMessage); SecurityDetection securityDetection = new SecurityDetection(); BeanUtils.copyProperties(securityDetectionMessage,securityDetection); securityDetectionService.create(securityDetection); SecurityDetectionVO securityDetection1 = new SecurityDetectionVO(); BeanUtils.copyProperties(securityDetection, securityDetection1); chargingOrderClient.securityDetection(securityDetection1); break; default: PlatformRemoteUpdateReplyMessage platformRemoteUpdateReplyMessage = message.getPlatformRemoteUpdateReplyMessage(); log.info("远程更新应答-业务消息处理:{}",platformRemoteUpdateReplyMessage); PlatformRemoteUpdateReply platformRemoteUpdateReply = new PlatformRemoteUpdateReply(); BeanUtils.copyProperties(platformRemoteUpdateReplyMessage,platformRemoteUpdateReply); platformRemoteUpdateReplyService.create(platformRemoteUpdateReply); break; } } @Override protected void handleMaxRetriesExceeded(ChargingMessage message) { // 当超过指定重试次数消息时此处方法会被调用 // 生产中可以进行回退或其他业务操作 log.error("消息消费失败,请执行后续处理"); } /** * 是否执行重试机制 */ @Override protected boolean isRetry() { return true; } @Override protected boolean throwException() { // 是否抛出异常,false搭配retry自行处理异常 return false; } /** * 若需要处理消息过滤,在父级中进行统一处理,或者在此处实现之后,自行处理 * @param message 待处理消息 * @return true: 本次消息被过滤,false:不过滤 */ @Override protected boolean filter(ChargingMessage message) { // 此处可做消息过滤 return false; } /** * 监听消费消息,不需要执行业务处理,委派给父类做基础操作,父类做完基础操作后会调用子类的实际处理类型 */ @Override public void onMessage(ChargingMessage message) { super.dispatchMessage(message); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java
@@ -343,4 +343,15 @@ return rocketMQEnhanceTemplate.send(TOPIC+SendTagConstant.SECURITY_DETECTION, SendTagConstant.SECURITY_DETECTION, message); } /** * 充电桩登录认证 */ public SendResult chargingMessage(ChargingMessage message) { // 设置业务key message.setKey(UUID.randomUUID().toString()); // 设置消息来源,便于查询 message.setSource(SendTagConstant.CHARGING_MESSAGE); return rocketMQEnhanceTemplate.send(TOPIC+SendTagConstant.CHARGING_MESSAGE, SendTagConstant.CHARGING_MESSAGE, message); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -53,6 +53,7 @@ import com.ruoyi.order.dto.OrderEvaluateVo; import com.ruoyi.order.dto.*; import com.ruoyi.order.service.*; import com.ruoyi.order.service.impl.TChargingOrderServiceImpl; import com.ruoyi.order.util.PreviousSixMonths; import com.ruoyi.payment.api.feignClient.AliPaymentClient; import com.ruoyi.payment.api.feignClient.WxPaymentClient; @@ -63,6 +64,8 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.models.auth.In; import jdk.nashorn.internal.runtime.ListAdapter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import io.swagger.annotations.ApiOperation; @@ -94,6 +97,8 @@ @RestController @RequestMapping("/t-charging-order") public class TChargingOrderController { private Logger log = LoggerFactory.getLogger(TChargingOrderController.class); @Resource private TChargingOrderService chargingOrderService; @@ -465,7 +470,7 @@ */ @ResponseBody @PostMapping(value = "/securityDetection") public void securityDetection(@RequestBody SecurityDetection securityDetection){ public void securityDetection(@RequestBody SecurityDetectionVO securityDetection){ chargingOrderService.securityDetection(securityDetection); } @@ -475,7 +480,8 @@ */ @ResponseBody @PostMapping(value = "/startChargeSuccessfully") public void startChargeSuccessfully(@RequestBody PlatformStartChargingReplyMessage message){ public void startChargeSuccessfully(@RequestBody PlatformStartChargingReplyMessageVO message){ log.error("-------------------远程启动充电请求应答-------------------:" + message); chargingOrderService.startChargeSuccessfully(message); } @@ -509,10 +515,10 @@ */ @ResponseBody @PostMapping(value = "/chargingOrderStartupFailureWxRefund") public void chargingOrderStartupFailureWxRefund(@RequestParam("out_trade_no") String out_refund_no, @RequestParam("out_trade_no") String refund_id, @RequestParam("out_trade_no") String tradeState, @RequestParam("out_trade_no") String success_time){ public void chargingOrderStartupFailureWxRefund(@RequestParam("out_refund_no") String out_refund_no, @RequestParam("refund_id") String refund_id, @RequestParam("tradeState") String tradeState, @RequestParam("success_time") String success_time){ chargingOrderService.chargingOrderStartupFailureWxRefund(out_refund_no, refund_id, tradeState, success_time); } @@ -555,6 +561,20 @@ public AjaxResult stopCharging(@PathVariable String id) { return chargingOrderService.stopCharging(id); } /** * 停止充电应答处理逻辑 * @param platformStopChargingReply */ @PostMapping("/terminateSuccessfulResponse") public void terminateSuccessfulResponse(@RequestBody PlatformStopChargingReplyVO platformStopChargingReply){ log.error("-------------------远程停止充电请求应答-------------------:" + platformStopChargingReply); chargingOrderService.terminateSuccessfulResponse(platformStopChargingReply); } @ResponseBody @GetMapping(value = "/six/charge") ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -17,10 +17,6 @@ import com.ruoyi.order.api.vo.*; import com.ruoyi.order.dto.*; import com.ruoyi.order.vo.ChargingOrderListInfoVO; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; import java.util.Map; @@ -83,14 +79,14 @@ * 安全检测数据 * @param securityDetection */ void securityDetection(SecurityDetection securityDetection); void securityDetection(SecurityDetectionVO securityDetection); /** * 启动充电应发 * @param message */ void startChargeSuccessfully(PlatformStartChargingReplyMessage message); void startChargeSuccessfully(PlatformStartChargingReplyMessageVO message); /** @@ -119,6 +115,15 @@ * @return */ AjaxResult stopCharging(String id); /** * 停止充电应答结果处理 * @param platformStopChargingReply */ void terminateSuccessfulResponse(PlatformStopChargingReplyVO platformStopChargingReply); TCharingOrderVO chargingOrder(ChargingOrderQuery dto); ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -38,7 +38,7 @@ import com.ruoyi.order.api.query.SettlementListQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.*; import com.ruoyi.order.api.vo.SecurityDetection; import com.ruoyi.order.api.vo.PlatformStopChargingReplyVO; import com.ruoyi.order.dto.*; import com.ruoyi.order.mapper.TChargingOrderMapper; import com.ruoyi.order.mapper.TSettlementConfirmMapper; @@ -627,6 +627,9 @@ } } } electrovalence = electrovalence.setScale(2, RoundingMode.HALF_EVEN); discountAmount = discountAmount.setScale(2, RoundingMode.HALF_EVEN); chargingOrder.setChargeAmount(electrovalence); chargingOrder.setVipDiscountAmount(discountAmount); this.updateById(chargingOrder); @@ -641,9 +644,9 @@ //使用订单id作为逻辑卡号 platformStartCharging.setCard_number(chargingOrder.getId().toString()); platformStartCharging.setAccount_balance(electrovalence); System.err.println("-------------------远程调起开始充电请求-------------------"); System.err.println(platformStartCharging.toString()); log.error(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------"); log.error(platformStartCharging.toString()); sendMessageClient.platformStartCharging(platformStartCharging); //异步线程检测远程启动的应答结果。如果失败,则需要全额退款 @@ -685,8 +688,8 @@ } List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData(); System.err.println(code + ":-------------------开始检查调起充电结果-------------------"); System.err.println(data.toString()); log.error(code + ":-------------------开始检查调起充电结果-------------------"); log.error(data.toString()); if(data.size() != 0){ PlatformStartChargingReply platformStartChargingReply = data.get(1); Integer startup_result = platformStartChargingReply.getStartup_result(); @@ -725,7 +728,7 @@ redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); return true; }else{ log.error(code + ":未上传开启充电结果........"); log.error(code + ":-------------------未上传开启充电结果-------------------"); Integer counter = boot_failed_map.get(code); PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); @@ -762,7 +765,7 @@ * @param securityDetection */ @Override public void securityDetection(SecurityDetection securityDetection){ public void securityDetection(SecurityDetectionVO securityDetection){ GetChargingGunByCode code = new GetChargingGunByCode(); code.setCharging_pile_code(securityDetection.getCharging_pile_code()); code.setCharging_gun_code(securityDetection.getCharging_gun_code()); @@ -782,7 +785,7 @@ * @param message */ @Override public void startChargeSuccessfully(PlatformStartChargingReplyMessage message) { public void startChargeSuccessfully(PlatformStartChargingReplyMessageVO message) { Integer startup_result = message.getStartup_result(); Integer failure_cause = message.getFailure_cause(); TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, message.getTransaction_serial_number())); @@ -796,7 +799,6 @@ preChargeCheck1.setInsulationTesting(true); preChargeCheck1.setSecureConnectionDetection(preChargeCheck1.getSecureConnectionDetection()); preChargeCheck1.setStartupSuccess(1); redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS); } if(0 == startup_result){ //启动失败 @@ -812,6 +814,7 @@ order.setStatus(3); order.setStartTime(LocalDateTime.now()); } redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS); this.updateById(order); } @@ -820,6 +823,7 @@ * @param code */ public void refund(String code){ log.error(code + ":-------------------充电启动失败,执行退款-------------------"); TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code)); if(chargingOrder.getStatus() == 2){ Integer rechargePaymentType = chargingOrder.getRechargePaymentType(); @@ -954,9 +958,13 @@ public AjaxResult stopCharging(String id) { TChargingOrder chargingOrder = this.getById(id); Integer status = chargingOrder.getStatus(); if(status != 3){ return AjaxResult.error("还未开始充电"); } if(status == 4 || status == 5){ return AjaxResult.error("不能重复操作"); } chargingOrder.setEndTime(LocalDateTime.now()); chargingOrder.setStatus(4); chargingOrder.setEndMode(1); this.updateById(chargingOrder); @@ -1017,7 +1025,7 @@ } } } String code1 = chargingOrder.getCode(); //异步线程处理停机 ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1); @@ -1029,12 +1037,17 @@ platformStopCharging.setCharging_pile_code(chargingPile.getCode()); platformStopCharging.setCharging_gun_code(chargingGun.getCode()); sendMessageClient.platformStopCharging(platformStopCharging); log.error(code1 + ":-------------------远程停止充电请求-------------------"); log.error(platformStopCharging.toString()); //开始查询停机应答,成功后开始计费费用 for (int i = 0; i < 60; i++) { GetPlatformStopChargingReply query = new GetPlatformStopChargingReply(); query.setCharging_gun_code(chargingGun.getCode()); query.setCharging_pile_code(chargingPile.getCode()); query.setEnd_time(chargingOrder.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); PlatformStopChargingReply reply = platformStopChargingReplyClient.getPlatformStopChargingReply(query).getData(); log.error(code1 + ":-------------------查询远程停止充电应答-------------------"); log.error(reply.toString()); if(null == reply){ try { Thread.sleep(1000); @@ -1043,7 +1056,12 @@ } continue; } TChargingOrder chargingOrder1 = this.getById(id); if(chargingOrder1.getStatus() != 3){ break; } if(0 == reply.getStop_result()){ String failure_cause = ""; switch (reply.getFailure_cause()){ @@ -1060,8 +1078,13 @@ failure_cause = "其他"; break; } log.error("停机失败:订单号:{},失败原因:{}", chargingOrder.getCode(), failure_cause); throw new RuntimeException(failure_cause); log.error(code1 + ":停机失败:订单号:{},失败原因:{}", chargingOrder.getCode(), failure_cause); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } continue; } // 将枪状态重置为空闲 @@ -1069,6 +1092,7 @@ chargingGunClient.updateChargingGunById(chargingGun); //计算费用,处理退款 endCharge(chargingOrder); log.error(code1 + ":-------------------远程停止充电请求成功-------------------"); break; } }); @@ -1125,8 +1149,56 @@ return AjaxResult.success(); } /** * 停止充电应答结果处理 * @param platformStopChargingReply */ @Override public void terminateSuccessfulResponse(PlatformStopChargingReplyVO platformStopChargingReply){ GetChargingGunByCode code = new GetChargingGunByCode(); code.setCharging_gun_code(platformStopChargingReply.getCharging_gun_code()); code.setCharging_pile_code(platformStopChargingReply.getCharging_pile_code()); TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData(); TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, chargingGun.getId()) .orderByDesc(TChargingOrder::getEndTime).eq(TChargingOrder::getRechargePaymentStatus, 2).last(" limit 0, 1")); if(null != order && order.getStatus() != 3){ return; } String code1 = order.getCode(); if(0 == platformStopChargingReply.getStop_result()){ String failure_cause = ""; switch (platformStopChargingReply.getFailure_cause()){ case 0: failure_cause = "无"; break; case 1: failure_cause = "设备编号不匹配"; break; case 2: failure_cause = "枪未处于充电状态"; break; case 3: failure_cause = "其他"; break; } log.error(code1 + ":停机失败:订单号:{},失败原因:{}", order.getCode(), failure_cause); return; } // 将枪状态重置为空闲 chargingGun.setStatus(2); chargingGunClient.updateChargingGunById(chargingGun); //计算费用,处理退款 endCharge(order); } /** * 手动结束后的费用计算和退款逻辑 */