diff --git a/jsowell-common/src/main/java/com/jsowell/common/core/redis/RedisCache.java b/jsowell-common/src/main/java/com/jsowell/common/core/redis/RedisCache.java index bb68aec62..d3aa91741 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/core/redis/RedisCache.java +++ b/jsowell-common/src/main/java/com/jsowell/common/core/redis/RedisCache.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Component; import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** * spring redis 工具类 @@ -603,4 +604,44 @@ public class RedisCache { redisTemplate.opsForList().trim(redisKey, 0, 9); } + /** + * 批量获取 Redis List 中每个 key 对应的最后一条数据 + * + * @param keys Redis 键集合 + * @param 返回值类型 + * @return Map,key 为 Redis 键,value 为对应 List 的最后一条数据 + */ + public Map multiGetLastListValue(final List keys) { + if (keys == null || keys.isEmpty()) { + return new HashMap<>(); + } + + Map result = new HashMap<>(); + for (String key : keys) { + if (StringUtils.isNotBlank(key)) { + // 使用 index -1 获取 List 的最后一个元素 + T lastValue = (T) redisTemplate.opsForList().index(key, -1); + if (lastValue != null) { + result.put(key, lastValue); + } + } + } + return result; + } + + /** + * 获取 Redis List 中指定 key 的最后一条数据 + * + * @param key Redis 键 + * @param 返回值类型 + * @return List 的最后一条数据,如果 key 不存在或 List 为空则返回 null + */ + public T getLastListValue(final String key) { + if (StringUtils.isBlank(key)) { + return null; + } + // 使用 index -1 获取 List 的最后一个元素 + return (T) redisTemplate.opsForList().index(key, -1); + } + } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderBasicInfoMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderBasicInfoMapper.java index a76301982..ac1b17c66 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderBasicInfoMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderBasicInfoMapper.java @@ -450,4 +450,11 @@ public interface OrderBasicInfoMapper { * @return */ List getInsuranceAmount(@Param("dto") IndexQueryDTO dto); + + /** + * 批量查询充电枪信息 + * @param chargingConnectorCodeList + * @return + */ + List batchQueryChargingConnectorInfo(@Param("pileConnectorCodes") List chargingConnectorCodeList); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileConnectorInfoMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileConnectorInfoMapper.java index 5aea037a5..d5a24cb0a 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileConnectorInfoMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileConnectorInfoMapper.java @@ -136,6 +136,14 @@ public interface PileConnectorInfoMapper { */ List batchSelectConnectorList(@Param("stationIds") List stationIds); + /** + * 此方法与上面方法一样,只是多加了status字段 + * @param stationIds + * @param status + * @return + */ + List batchSelectConnectorListByStatus(@Param("stationIds") List stationIds, @Param("status") String status); + /** * 查询异常设备数量 * @param stationId diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java index 480adba37..2f3354732 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java @@ -652,4 +652,18 @@ public interface OrderBasicInfoService{ * @return */ List getInsuranceAmount(IndexQueryDTO dto); + + /** + * 批量查询充电枪信息 + * @param chargingConnectorCodeList + * @return + */ + List batchQueryChargingConnectorInfo(List chargingConnectorCodeList); + + /** + * 批量查询充电枪实时数据 + * @param transactionCodeList + * @return + */ + List getRealTimeMonitorDataList(List transactionCodeList); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index 2407a4a23..c42971041 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -6245,5 +6245,64 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { public List getInsuranceAmount(IndexQueryDTO dto) { return orderBasicInfoMapper.getInsuranceAmount(dto); } + + /** + * 批量查询充电枪口信息 + * @param chargingConnectorCodeList + * @return + */ + @Override + public List batchQueryChargingConnectorInfo(List chargingConnectorCodeList) { + // 这个infoVOs只有简单数据,没有充电中数据 + List infoVOS = orderBasicInfoMapper.batchQueryChargingConnectorInfo(chargingConnectorCodeList); + + List transactionCodes = infoVOS.stream() + .map(BusinessOrderDetailInfoVO::getTransactionCode) + .collect(Collectors.toList()); + List list = getRealTimeMonitorDataList(transactionCodes); + + Map bMap = list.stream() + .collect(Collectors.toMap( + RealTimeMonitorData::getPileConnectorCode, + x -> x, + (existing, replacement) -> existing // 如果有重复key,保留第一个 + )); + for (BusinessOrderDetailInfoVO infoVO : infoVOS) { + String pileConnectorCode = infoVO.getPileConnectorCode(); + if (pileConnectorCode != null && bMap.containsKey(pileConnectorCode)) { + RealTimeMonitorData realTimeMonitorData = bMap.get(pileConnectorCode); + + infoVO.setChargeDegree(realTimeMonitorData.getChargingDegree()); + infoVO.setChargeTime(realTimeMonitorData.getSumChargingTime()); + infoVO.setEndSOC(realTimeMonitorData.getSOC()); + infoVO.setTimeRemaining(realTimeMonitorData.getTimeRemaining()); + } + } + return infoVOS; + } + + + /** + * 批量查询实时监控数据 + * @param transactionCodeList + * @return + */ + @Override + public List getRealTimeMonitorDataList(List transactionCodeList) { + List resultList = new ArrayList<>(); + List redisKeys = new ArrayList<>(); + for (String transactionCode : transactionCodeList) { + // 截取枪口编号 + String pileConnectorCode = transactionCode.substring(0, 16); + redisKeys.add(CacheConstants.PILE_REAL_TIME_MONITOR_DATA + pileConnectorCode + "_" + transactionCode); + } + // 批量查询多个key值的数据 key: redisKey, value: 最后一条实时数据 + Map map = redisCache.multiGetLastListValue(redisKeys); + // 循环该map + for (Map.Entry entry : map.entrySet()) { + resultList.add(entry.getValue()); + } + return resultList; + } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileConnectorInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileConnectorInfoServiceImpl.java index 7a51ab997..8d0953a34 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileConnectorInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileConnectorInfoServiceImpl.java @@ -20,6 +20,7 @@ import com.jsowell.common.enums.ykc.PileStatusEnum; import com.jsowell.common.enums.ykc.ReturnCodeEnum; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.util.DateUtils; +import com.jsowell.common.util.PageUtils; import com.jsowell.common.util.SecurityUtils; import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.spring.SpringUtils; @@ -34,9 +35,12 @@ import com.jsowell.pile.dto.business.QueryConnectorInfoDTO; import com.jsowell.pile.mapper.PileBasicInfoMapper; import com.jsowell.pile.mapper.PileConnectorInfoMapper; import com.jsowell.pile.service.*; +import com.jsowell.pile.util.UserUtils; import com.jsowell.pile.vo.base.ConnectorInfoVO; +import com.jsowell.pile.vo.base.LoginUserDetailVO; import com.jsowell.pile.vo.uniapp.business.BusinessConnectorDetailVO; import com.jsowell.pile.vo.uniapp.business.BusinessConnectorInfoVO; +import com.jsowell.pile.vo.uniapp.business.BusinessOrderDetailInfoVO; import com.jsowell.pile.vo.web.PileConnectorInfoVO; import com.jsowell.pile.vo.web.PileDetailVO; import com.jsowell.pile.vo.web.PileModelInfoVO; @@ -1053,57 +1057,120 @@ public class PileConnectorInfoServiceImpl implements PileConnectorInfoService { /** * 查询站点枪口列表 + * * @param dto * @return */ @Override public BusinessConnectorInfoVO getConnectorListByStationAndStatus(QueryConnectorInfoDTO dto) { + List list = new ArrayList<>(); + PileConnectorInfoVO info = null; + int pageNum = dto.getPageNum() == 0 ? 1 : dto.getPageNum(); + int pageSize = dto.getPageSize() == 0 ? 10 : dto.getPageSize(); // 获取登录账号信息 - Long deptId = SecurityUtils.getDeptId(); - List stationIds = pileMerchantInfoService.queryByMerchantDeptIds(Lists.newArrayList(String.valueOf(deptId))); + LoginUserDetailVO loginUserDetail = UserUtils.getLoginUserDetail(); + List merchantIdList = loginUserDetail.getFirstMerchantIdList(); + List stationInfos = pileStationInfoService.getStationInfosByMerchantIds(merchantIdList); + // 获取站点ids + List longStationIds = stationInfos.stream() + .map(PileStationInfo::getId) + .collect(Collectors.toList()); + + List stationIds = longStationIds.stream() + .map(String::valueOf) // 或 s -> Long.parseLong(s) + .collect(Collectors.toList()); + String connectorStatus = dto.getConnectorStatus(); - int pageNum = dto.getPageNum(); - int pageSize = dto.getPageSize(); BusinessConnectorInfoVO vo = new BusinessConnectorInfoVO(); - // 根据站点ids查询枪口列表(有缓存) - List connectorInfoVOS = batchSelectConnectorList(stationIds); - // 筛选出枪口编号 - List pileConnectorCodeList = connectorInfoVOS.stream() - .map(ConnectorInfoVO::getPileConnectorCode) - .collect(Collectors.toList()); - // 批量获取某状态的枪口数量 - Map connectorStatusNumMap = getConnectorStatus(pileConnectorCodeList); - Integer offlineNum = connectorStatusNumMap.get("offlineNum"); - Integer freeNum = connectorStatusNumMap.get("freeNum"); - Integer occupiedNum = connectorStatusNumMap.get("occupiedNum"); - Integer chargingNum = connectorStatusNumMap.get("chargingNum"); - Integer faultNum = connectorStatusNumMap.get("faultNum"); + // 根据站点ids、枪口状态查询枪口列表(有缓存) + PageUtils.startPage(pageNum, pageSize); + // List connectorInfoVOS = batchSelectConnectorList(stationIds); + List connectorInfoVOS = pileConnectorInfoMapper.batchSelectConnectorListByStatus(stationIds, connectorStatus); - vo.setConnectorNum(pileConnectorCodeList.size()); - vo.setOfflineConnectorNum(offlineNum); - vo.setFreeConnectorNum(freeNum); - vo.setOccupiedConnectorNum(occupiedNum); - vo.setChargingConnectorNum(chargingNum); - vo.setFaultConnectorNum(faultNum); + // 初始化对象 + List chargingConnectorCodeList = new ArrayList<>(); // 充电中枪口 pileConnectorCodeList + int offlineNum = 0; + int freeNum = 0; + int occupiedNum = 0; + int chargingNum = 0; + int faultNum = 0; - List longStationIds = stationIds.stream() - .map(Long::parseLong) // 或 s -> Long.parseLong(s) - .collect(Collectors.toList()); + for (ConnectorInfoVO connectorInfoVO : connectorInfoVOS) { + String pileConnectorCode = connectorInfoVO.getPileConnectorCode(); + String status = connectorInfoVO.getConnectorStatus(); + + info = new PileConnectorInfoVO(); + if (StringUtils.equals(status, PileConnectorDataBaseStatusEnum.OFF_NETWORK.getValue())) { + // 离网 + offlineNum += 1; + info.setPileConnectorCode(pileConnectorCode); + info.setStatus(Integer.parseInt(PileConnectorDataBaseStatusEnum.OFF_NETWORK.getValue())); + + list.add(info); + } + if (StringUtils.equals(status, PileConnectorDataBaseStatusEnum.FREE.getValue())) { + // 空闲 + freeNum += 1; + info.setPileConnectorCode(pileConnectorCode); + info.setStatus(Integer.parseInt(PileConnectorDataBaseStatusEnum.FREE.getValue())); + + list.add(info); + } + if (StringUtils.equals(status, PileConnectorDataBaseStatusEnum.OCCUPIED_NOT_CHARGED.getValue())) { + // 占用未充电 + occupiedNum += 1; + info.setPileConnectorCode(pileConnectorCode); + info.setStatus(Integer.parseInt(PileConnectorDataBaseStatusEnum.OCCUPIED_NOT_CHARGED.getValue())); + + list.add(info); + } + if (StringUtils.equals(status, PileConnectorDataBaseStatusEnum.OCCUPIED_CHARGING.getValue())) { + // 充电中 + chargingNum += 1; + chargingConnectorCodeList.add(pileConnectorCode); + } + if (StringUtils.equals(status, PileConnectorDataBaseStatusEnum.FAULT.getValue())) { + // 故障 + faultNum += 1; + info.setPileConnectorCode(pileConnectorCode); + info.setStatus(Integer.parseInt(PileConnectorDataBaseStatusEnum.FAULT.getValue())); + + list.add(info); + } + + vo.setConnectorNum(connectorInfoVOS.size()); + vo.setOfflineConnectorNum(offlineNum); + vo.setFreeConnectorNum(freeNum); + vo.setOccupiedConnectorNum(occupiedNum); + vo.setChargingConnectorNum(chargingNum); + vo.setFaultConnectorNum(faultNum); - // 根据站点id和枪口状态查询枪口列表 - QueryConnectorListDTO queryConnectorListDTO = QueryConnectorListDTO.builder() - .pageNum(pageNum) - .pageSize(pageSize) - .stationIdList(longStationIds) - .build(); - List pileConnectorInfoVOList = getConnectorInfoListByParams(queryConnectorListDTO); - if (connectorStatus != null) { - // 筛选出符合状态的数据 - pileConnectorInfoVOList = pileConnectorInfoVOList.stream() - .filter(x -> x.getStatus() == Integer.parseInt(connectorStatus)) - .collect(Collectors.toList()); } - vo.setPileConnectorInfoVOList(pileConnectorInfoVOList); + // 如果充电中的枪列表不为空 + if (CollectionUtils.isNotEmpty(chargingConnectorCodeList)) { + // 根据充电中的枪口List批量获取充电中的枪口信息 + List infoVOS = orderBasicInfoService.batchQueryChargingConnectorInfo(chargingConnectorCodeList); + Map bMap = infoVOS.stream() + .collect(Collectors.toMap( + BusinessOrderDetailInfoVO::getPileConnectorCode, + x -> x, + (existing, replacement) -> existing // 如果有重复key,保留第一个 + )); + for (PileConnectorInfoVO pileConnectorInfoVO : list) { + String pileConnectorCode = pileConnectorInfoVO.getPileConnectorCode(); + if (pileConnectorCode != null && bMap.containsKey(pileConnectorCode)) { + BusinessOrderDetailInfoVO businessOrderDetailInfoVO = bMap.get(pileConnectorCode); + + pileConnectorInfoVO.setStatus(Integer.parseInt(PileConnectorDataBaseStatusEnum.OCCUPIED_CHARGING.getValue())); + pileConnectorInfoVO.setChargingDegree(new BigDecimal(businessOrderDetailInfoVO.getChargeDegree())); + pileConnectorInfoVO.setChargingTime(businessOrderDetailInfoVO.getChargeTime()); + pileConnectorInfoVO.setSOC(businessOrderDetailInfoVO.getEndSOC()); + pileConnectorInfoVO.setTimeRemaining(businessOrderDetailInfoVO.getTimeRemaining()); + + } + } + } + vo.setPileConnectorInfoVOList(list); return vo; } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/business/BusinessOrderDetailInfoVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/business/BusinessOrderDetailInfoVO.java index 00e46aba4..e641a8671 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/business/BusinessOrderDetailInfoVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/business/BusinessOrderDetailInfoVO.java @@ -25,6 +25,11 @@ public class BusinessOrderDetailInfoVO { private String pileConnectorCode; + /** + * 交易流水号 + */ + private String transactionCode; + /** * 充电次数 */ @@ -185,4 +190,9 @@ public class BusinessOrderDetailInfoVO { */ private String memberId; + /** + * 剩余时间 + */ + private String timeRemaining; + } diff --git a/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml index 090eadf1d..251d10fea 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/OrderBasicInfoMapper.xml @@ -3521,4 +3521,17 @@ and `settlement_time` BETWEEN #{dto.startTime,jdbcType=VARCHAR} and #{dto.endTime,jdbcType=VARCHAR} group by DATE_FORMAT(settlement_time, '%Y-%m-%d'); + + diff --git a/jsowell-pile/src/main/resources/mapper/pile/PileConnectorInfoMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/PileConnectorInfoMapper.xml index 9dc1f336f..66708a382 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/PileConnectorInfoMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/PileConnectorInfoMapper.xml @@ -319,4 +319,27 @@ AND t1.del_flag = '0' + + \ No newline at end of file