From 98b09eae533537dc9a5277aa6374bd7d35cfe5c4 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期四, 19 六月 2025 09:20:03 +0800 Subject: [PATCH] 修改bug和定时任务 --- ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java | 217 ++++++++++++++++++++++++++++++++--------------------- 1 files changed, 130 insertions(+), 87 deletions(-) diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java index b9b4859..8af0146 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java @@ -19,6 +19,7 @@ import com.ruoyi.chargingPile.dto.GetChargingGunMonitoring; import com.ruoyi.chargingPile.mapper.TChargingPileMapper; import com.ruoyi.chargingPile.service.*; +import com.ruoyi.chargingPile.util.mongodb.service.UploadRealTimeMonitoringDataService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; @@ -26,10 +27,7 @@ import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; -import com.ruoyi.integration.api.feignClient.IntegrationClient; -import com.ruoyi.integration.api.feignClient.IotInterfaceClient; -import com.ruoyi.integration.api.feignClient.SendMessageClient; -import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient; +import com.ruoyi.integration.api.feignClient.*; import com.ruoyi.integration.api.model.QrCodeDelivery; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import com.ruoyi.integration.api.vo.AddDevice; @@ -45,6 +43,8 @@ import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.feignClient.SysUserRoleClient; import com.ruoyi.system.api.model.SysUserRoleVo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -64,11 +64,15 @@ * @author xiaochen * @since 2024-08-06 */ +@Slf4j @Service public class TChargingPileServiceImpl extends ServiceImpl<TChargingPileMapper, TChargingPile> implements TChargingPileService { @Resource private TChargingGunService chargingGunService; + + @Resource + private TCECClient tcecClient; @Resource private SysUserClient sysUserClient; @@ -95,7 +99,7 @@ private AppUserCarClient appUserCarClient; @Resource - private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient; + private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService; @Resource private SysUserRoleClient sysUserRoleClient; @@ -104,7 +108,7 @@ private IotInterfaceClient iotInterfaceClient; @Resource - private RedisService redisService; + private RedisTemplate redisTemplate; @Resource private TFaultMessageService faultMessageService; @@ -182,22 +186,29 @@ return AjaxResult.error("设备编号已存在"); } //调用华为Iot创建设备 - AddDevice addDevice = new AddDevice(); - addDevice.setProductId("66da68d21837002b28b34ec0"); - addDevice.setNodeId(chargingPile.getCode()); - addDevice.setDeviceName(chargingPile.getName()); - addDevice.setDescription(chargingPile.getNumber().toString()); - AddDeviceResp deviceResp = iotInterfaceClient.addDevice(addDevice).getData(); - if(null != deviceResp){ - int httpStatusCode = deviceResp.getHttpStatusCode(); - if(httpStatusCode == 201){ - chargingPile.setIotdDeviceId(deviceResp.getDeviceId()); + ShowDeviceResp showDeviceResp = iotInterfaceClient.showDeviceRequest(chargingPile.getCode()).getData(); + if(null == showDeviceResp){ + //调用华为Iot创建设备 + AddDevice addDevice = new AddDevice(); + addDevice.setProductId("66da68d21837002b28b34ec0"); + addDevice.setNodeId(chargingPile.getCode()); + addDevice.setDeviceName(chargingPile.getName()); + addDevice.setDescription(chargingPile.getNumber().toString()); + AddDeviceResp deviceResp = iotInterfaceClient.addDevice(addDevice).getData(); + if(null != deviceResp){ + int httpStatusCode = deviceResp.getHttpStatusCode(); + if(httpStatusCode == 201){ + chargingPile.setIotdDeviceId(deviceResp.getDeviceId()); + }else{ + log.error("华为创建设备失败" + JSON.toJSONString(deviceResp)); + return AjaxResult.error("华为创建设备失败"); + } }else{ log.error("华为创建设备失败" + JSON.toJSONString(deviceResp)); return AjaxResult.error("华为创建设备失败"); } }else{ - return AjaxResult.error("华为创建设备失败"); + chargingPile.setIotdDeviceId(showDeviceResp.getDeviceId()); } this.save(chargingPile); return AjaxResult.success(); @@ -302,6 +313,7 @@ TChargingGun chargingGun1 = new TChargingGun(); chargingGun1.setId(chargingGun.getId()); chargingGun1.setFullNumber(chargingPile.getCode() + chargingGun.getCode()); + chargingGun1.setSiteId(chargingPile.getSiteId()); chargingGunService.updateById(chargingGun1); //下发硬件充电二维码 @@ -315,6 +327,7 @@ qrCodeDelivery.setQr_code(code_prefix + chargingPile.getCode() + chargingGun.getCode()); sendMessageClient.qrCodeDelivery(qrCodeDelivery); } + tcecClient.superviseNotificationStationInfo(chargingPile.getSiteId()); return AjaxResult.success(); } @@ -378,33 +391,47 @@ @Override public List<TChargingPileVO> getChargingGunList(Integer siteId,Integer type) { - List<TChargingPileVO> chargingPileVOS = this.baseMapper.getChargingGunList(siteId); LambdaQueryWrapper<TChargingGun> wrapper = new LambdaQueryWrapper<>(); if(Objects.nonNull(type)){ wrapper.eq(TChargingGun::getChargeMode, type); } wrapper.eq(TChargingGun::getSiteId, siteId); List<TChargingGun> chargingGuns = chargingGunService.list(wrapper); - // 查询充电枪信息 - chargingPileVOS.forEach(item -> { - List<TChargingGun> chargingGunList = chargingGuns.stream().filter(gun -> gun.getChargingPileId().equals(item.getId())).collect(Collectors.toList()); - for (TChargingGun chargingGun : chargingGunList) { - if(chargingGun.getStatus().equals(4)){ - // 查询正在充电的单子的实时记录 - TChargingOrder chargingOrder = chargingOrderClient.getOrderDetailByGunId(chargingGun.getId()).getData(); - if(Objects.nonNull(chargingOrder)){ - UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData(); - chargingGun.setSoc(uploadRealTimeMonitoringData.getSoc()); - }else { + Set<Integer> collect = chargingGuns.stream().map(TChargingGun::getChargingPileId).collect(Collectors.toSet()); + List<TChargingPileVO> chargingPileVOS = new ArrayList<>(); + if(collect.size() > 0){ + List<TChargingPile> tChargingPiles = this.baseMapper.selectBatchIds(collect); + for (TChargingPile tChargingPile : tChargingPiles) { + TChargingPileVO vo = new TChargingPileVO(); + List<TChargingGun> chargingGunList = chargingGuns.stream().filter(gun -> gun.getChargingPileId().equals(tChargingPile.getId())).collect(Collectors.toList()); + for (TChargingGun chargingGun : chargingGunList) { + if(chargingGun.getStatus().equals(4)){ + // 查询正在充电的单子的实时记录 + TChargingOrder chargingOrder = chargingOrderClient.getOrderDetailByGunId(chargingGun.getId()).getData(); + if(Objects.nonNull(chargingOrder)){ + UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode()); + if(null != uploadRealTimeMonitoringData){ + chargingGun.setSoc(uploadRealTimeMonitoringData.getSoc()); + }else{ + chargingGun.setSoc(0); + } + }else { + chargingGun.setSoc(100); + } + } + if(chargingGun.getStatus().equals(5)){ chargingGun.setSoc(100); } } - if(chargingGun.getStatus().equals(5)){ - chargingGun.setSoc(100); - } + vo.setChargingGunList(chargingGunList); + vo.setId(tChargingPile.getId()); + vo.setCode(tChargingPile.getCode()); + vo.setName(tChargingPile.getName()); + vo.setNumber(tChargingPile.getNumber()); + chargingPileVOS.add(vo); + } - item.setChargingGunList(chargingGunList); - }); + } return chargingPileVOS; } @@ -479,12 +506,12 @@ chargeTrend.put("value", value1); chargeMonitoring.setChargeTrend(chargeTrend); - //每日利用率=当日充电度数/(总桩数量*桩总功率*24小时) + //每日利用率=当日充电度数/(桩总功率*24小时) List<TChargingPile> list = this.list(new LambdaQueryWrapper<TChargingPile>().in(TChargingPile::getSiteId, siteIds).eq(TChargingPile::getDelFlag, 0)); BigDecimal v = list.stream().map(TChargingPile::getRatedPower).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(4, RoundingMode.HALF_EVEN); List<Double> data = chargingOrderAccountingStrategyClient.getDailyChargingDegree(6, siteIds).getData(); List<Double> value2 = new ArrayList<>(); - BigDecimal multiply = new BigDecimal(list.size()).multiply(v).multiply(new BigDecimal(24)); + BigDecimal multiply = v.multiply(new BigDecimal(24)); for (Double datum : data) { if(list.size() == 0){ value2.add(0D); @@ -608,9 +635,11 @@ if(null != appUserCarId){ TAppUserCar tAppUserCar = appUserCarClient.getCarByIds(Arrays.asList(appUserCarId)).getData().get(0); gunMonitoring.setLicensePlate(tAppUserCar.getLicensePlate()); + }else{ + gunMonitoring.setLicensePlate(chargingOrder.getPlateNum()); } - UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData(); + UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode()); gunMonitoring.setChargingRatio(BigDecimal.valueOf(data.getSoc())); gunMonitoring.setElectricQuantity(data.getCharging_degree().toString()); gunMonitoring.setSoc(data.getSoc().toString()); @@ -676,61 +705,75 @@ */ @Override public void updateStatus() { - Map<String, Object> charging_gun_online = redisService.getCacheMap("charging_gun_online"); - Set<String> keySet = charging_gun_online.keySet(); - List<TChargingGun> list = new ArrayList<>(); - if(keySet.size() > 0){ - list = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getDelFlag, 0).in(TChargingGun::getFullNumber, keySet)); + //查询出redis集合汇总符合条件的数据 + Set keys = redisTemplate.opsForHash().keys("charging_gun_online"); + List<String> fullNumbers = new ArrayList<>(); + keys.forEach(key -> { + Long time = (Long) redisTemplate.opsForHash().get("charging_gun_online", key); + if(null != time && System.currentTimeMillis() - time > 300000){ + log.info("设备编号:{} 已离线", key); + log.info("间隔时间", System.currentTimeMillis() - time); + fullNumbers.add(key.toString()); + } + }); + if(fullNumbers.size() == 0){ + return; } + + //处理符合条件的数据,修改设备状态 + List<TChargingGun> list = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getFullNumber, fullNumbers).eq(TChargingGun::getDelFlag, 0)); for (TChargingGun chargingGun : list) { - Long time = (Long) charging_gun_online.get(chargingGun.getFullNumber()); - if(null != time && System.currentTimeMillis() - time > 60000){ - TChargingGun chargingGun1 = new TChargingGun(); - chargingGun1.setId(chargingGun.getId()); - chargingGun1.setStatus(1); - chargingGunService.updateById(chargingGun1); - - //桩处于正常,桩所属的枪都处于非正常,修改桩状态为异常 - TChargingPile chargingPile = this.getById(chargingGun.getChargingPileId()); - List<TChargingGun> list1 = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getChargingPileId, chargingPile.getId()).eq(TChargingGun::getDelFlag, 0)); - int size = list1.stream().filter(s -> s.getStatus() == 1 || s.getStatus() == 7).collect(Collectors.toList()).size(); - if(chargingPile.getStatus() == 1 && list1.size() == size){ - TChargingPile chargingPile1 = new TChargingPile(); - chargingPile1.setId(chargingGun.getChargingPileId()); - chargingPile1.setStatus(2); - this.updateById(chargingPile1); + TChargingGun chargingGun1 = new TChargingGun(); + chargingGun1.setId(chargingGun.getId()); + chargingGun1.setStatus(1); + chargingGunService.updateById(chargingGun1); + new Thread(new Runnable() { + @Override + public void run() { + //推送状态给三方平台 + tcecClient.pushChargingGunStatus(chargingGun1.getFullNumber(), chargingGun1.getStatus()); } + }).start(); + + //桩处于正常,桩所属的枪都处于非正常,修改桩状态为异常 + TChargingPile chargingPile = this.getById(chargingGun.getChargingPileId()); + List<TChargingGun> list1 = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getChargingPileId, chargingPile.getId()).eq(TChargingGun::getDelFlag, 0)); + int size = list1.stream().filter(s -> s.getStatus() == 1 || s.getStatus() == 7).collect(Collectors.toList()).size(); + if(chargingPile.getStatus() == 1 && list1.size() == size){ + TChargingPile chargingPile1 = new TChargingPile(); + chargingPile1.setId(chargingGun.getChargingPileId()); + chargingPile1.setStatus(2); + this.updateById(chargingPile1); + } + + //添加记录 + TFaultMessage faultMessage = faultMessageService.getOne(new LambdaQueryWrapper<TFaultMessage>().eq(TFaultMessage::getChargingPileId, chargingGun.getChargingPileId()) + .eq(TFaultMessage::getChargingGunId, chargingGun.getId()).eq(TFaultMessage::getStatus, 1).eq(TFaultMessage::getDelFlag, 0).isNull(TFaultMessage::getEndTime)); + if(null == faultMessage){ + faultMessage = new TFaultMessage(); + faultMessage.setSiteId(chargingGun.getSiteId()); + faultMessage.setChargingPileId(chargingGun.getChargingPileId()); + faultMessage.setChargingGunId(chargingGun.getId()); + faultMessage.setStatus(1); + faultMessage.setDownTime(LocalDateTime.now()); + faultMessage.setCreateTime(LocalDateTime.now()); + faultMessage.setDelFlag(false); + faultMessage.setContent("设备离线"); + faultMessageService.save(faultMessage); - //添加记录 - TFaultMessage faultMessage = faultMessageService.getOne(new LambdaQueryWrapper<TFaultMessage>().eq(TFaultMessage::getChargingPileId, chargingGun.getChargingPileId()) - .eq(TFaultMessage::getChargingGunId, chargingGun.getId()).eq(TFaultMessage::getStatus, 1).eq(TFaultMessage::getDelFlag, 0).isNull(TFaultMessage::getEndTime)); - if(null == faultMessage){ - faultMessage = new TFaultMessage(); - faultMessage.setSiteId(chargingGun.getSiteId()); - faultMessage.setChargingPileId(chargingGun.getChargingPileId()); - faultMessage.setChargingGunId(chargingGun.getId()); - faultMessage.setStatus(1); - faultMessage.setDownTime(LocalDateTime.now()); - faultMessage.setCreateTime(LocalDateTime.now()); - faultMessage.setDelFlag(false); - faultMessage.setContent("设备离线"); - faultMessageService.save(faultMessage); - - // 发送故障短信 - Site site = siteService.getById(faultMessage.getSiteId()); - String siteName = site.getName(); - SendMessageDTO sendMessageDTO = new SendMessageDTO(); - sendMessageDTO.setPhone(site.getPhone()); - sendMessageDTO.setSite(site.getName()); - sendMessageDTO.setChargeGun(chargingPile.getNumber() + ""); - sendMessageDTO.setType(3); - String result = appUserClient.sendMessage(sendMessageDTO).getData(); - if(siteName.length()>10){ - siteName = siteName.substring(0,10); - } - chargingPileNotificationService.saveData(4,faultMessage.getSiteId(),faultMessage.getChargingPileId(),site.getPhone(),"检测到"+siteName+"..."+chargingPile.getNumber()+"号桩设备离线,请及时查看处理!"); - + // 发送故障短信 + Site site = siteService.getById(faultMessage.getSiteId()); + String siteName = site.getName(); + SendMessageDTO sendMessageDTO = new SendMessageDTO(); + sendMessageDTO.setPhone(site.getPhone()); + sendMessageDTO.setSite(site.getName()); + sendMessageDTO.setChargeGun(chargingPile.getNumber() + ""); + sendMessageDTO.setType(3); + String result = appUserClient.sendMessage(sendMessageDTO).getData(); + if(siteName.length()>10){ + siteName = siteName.substring(0,10); } + chargingPileNotificationService.saveData(4,faultMessage.getSiteId(),faultMessage.getChargingPileId(),site.getPhone(),"检测到"+siteName+"..."+chargingPile.getNumber()+"号桩设备离线,请及时查看处理!"); } } } -- Gitblit v1.7.1