From bf9544bcdca56178e7a5dddbfdd55dfdc5872a95 Mon Sep 17 00:00:00 2001 From: "YAS\\29473" <2947326429@qq.com> Date: Fri, 9 Jan 2026 17:28:39 +0800 Subject: [PATCH 1/5] update --- .../handler/yunkuaichong/UploadRealTimeMonitorHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/UploadRealTimeMonitorHandler.java b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/UploadRealTimeMonitorHandler.java index 56f0f65fe..1b8c613a2 100644 --- a/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/UploadRealTimeMonitorHandler.java +++ b/jsowell-netty/src/main/java/com/jsowell/netty/handler/yunkuaichong/UploadRealTimeMonitorHandler.java @@ -386,7 +386,7 @@ public class UploadRealTimeMonitorHandler extends AbstractYkcHandler { // 向mq中发送实时数据消息,给第三方服务消费 CompletableFuture.runAsync(() -> { try { - log.info("向mq中发送实时数据消息供第三方服务消费, realTimeMonitorData:{}", realTimeMonitorData); + log.debug("向mq中发送实时数据消息供第三方服务消费, realTimeMonitorData:{}", realTimeMonitorData); rabbitTemplate.convertAndSend(ThirdPartyRabbitConstants.WCC_THIRDPARTY_NAME,ThirdPartyRabbitConstants.ROUTING_KEY_REALTIME_DATA_PUSH, realTimeMonitorData); } catch (Exception e){ log.error("向mq中发送实时数据消息供第三方服务消费 error, ", e); From 039fe845949d10aa20cd52821f25fe5702463d9c Mon Sep 17 00:00:00 2001 From: "YAS\\29473" <2947326429@qq.com> Date: Sat, 10 Jan 2026 09:33:29 +0800 Subject: [PATCH 2/5] update --- .../src/main/java/com/jsowell/pile/dto/BindingCarNoDTO.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/BindingCarNoDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/BindingCarNoDTO.java index a84dff597..3a8dbd39c 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/BindingCarNoDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/BindingCarNoDTO.java @@ -1,7 +1,9 @@ package com.jsowell.pile.dto; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; @@ -12,6 +14,8 @@ import java.util.List; * @date 2023/3/4 11:39 */ @Data +@NoArgsConstructor +@AllArgsConstructor @Builder public class BindingCarNoDTO { private String id; From cf1e1edb0b0f785dfd8c666bdea6f4592bed592b Mon Sep 17 00:00:00 2001 From: Lemon Date: Tue, 13 Jan 2026 13:24:37 +0800 Subject: [PATCH 3/5] =?UTF-8?q?add=20=E8=BF=90=E8=90=A5=E7=AB=AF=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E8=8E=B7=E5=8F=96=E7=AB=99=E7=82=B9=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3V2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessStationInfoController.java | 11 +++- .../pile/service/PileStationInfoService.java | 7 +++ .../impl/PileStationInfoServiceImpl.java | 54 +++++++++++++++++++ .../business/StationStatisticsInfosVO.java | 12 ++--- 4 files changed, 76 insertions(+), 8 deletions(-) diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/business/BusinessStationInfoController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/business/BusinessStationInfoController.java index 8c622031d..69d15afc6 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/business/BusinessStationInfoController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/business/BusinessStationInfoController.java @@ -66,8 +66,15 @@ public class BusinessStationInfoController extends BaseController { public RestApiResponse getStationStatisticsInfos(@RequestBody StationStatisticsInfoDTO dto) { RestApiResponse response = null; try { - List stationStatisticsInfos = pileStationInfoService.getStationStatisticsInfos(dto); - response = new RestApiResponse<>(ImmutableMap.of("stationStatisticsInfos", stationStatisticsInfos)); + // List stationStatisticsInfos = pileStationInfoService.getStationStatisticsInfos(dto); + // 获取登录账号信息 + LoginUserDetailVO loginUserDetail = UserUtils.getLoginUserDetail(); + List merchantIdList = loginUserDetail.getFirstMerchantIdList(); + if (CollectionUtils.isEmpty(dto.getStationIds())) { + dto.setStationIds(pileStationInfoService.getStationIdsByMerchantIds(merchantIdList)); + } + StationStatisticsInfosVO info = pileStationInfoService.getStationStatisticsInfosV2(dto); + response = new RestApiResponse<>(ImmutableMap.of("stationStatisticsInfo", info)); } catch (Exception e) { logger.error("获取站点统计信息 error", e); response = new RestApiResponse<>(e); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileStationInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileStationInfoService.java index fb0cff20a..b63419dfb 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/PileStationInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/PileStationInfoService.java @@ -181,6 +181,13 @@ public interface PileStationInfoService { */ List getStationStatisticsInfos(StationStatisticsInfoDTO dto); + /** + * 获取站点统计信息V2 + * @param dto + * @return + */ + public StationStatisticsInfosVO getStationStatisticsInfosV2(StationStatisticsInfoDTO dto); + /** * 获取站点运营分析信息(7天、30天) * @param dto diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileStationInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileStationInfoServiceImpl.java index ec15ca07c..59b2b5a35 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileStationInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileStationInfoServiceImpl.java @@ -1005,6 +1005,60 @@ public class PileStationInfoServiceImpl implements PileStationInfoService { return resultList; } + /** + * 获取站点统计信息V2 + * @param dto + * @return + */ + @Override + public StationStatisticsInfosVO getStationStatisticsInfosV2(StationStatisticsInfoDTO dto) { + List stationIds = dto.getStationIds(); + String startTime = dto.getStartTime(); + String endTime = dto.getEndTime(); + // 根据站点ids查询充电统计信息 + List settleOrderReports = settleOrderReportService.queryOrderReport(stationIds, startTime, endTime); + // 初始化统计值 + BigDecimal chargeDegree = BigDecimal.ZERO; + BigDecimal chargeAmount = BigDecimal.ZERO; + int orderQuantity = 0; + for (SettleOrderReport settleOrderReport : settleOrderReports) { + chargeDegree = chargeDegree.add(settleOrderReport.getUseElectricity()); + chargeAmount = chargeAmount.add(settleOrderReport.getTotalAmount()); + orderQuantity += Integer.parseInt(settleOrderReport.getChargeNum()); + } + // 批量查询站点中枪口的状态 + Map connectorStatusNum = pileConnectorInfoService.getConnectorStatusNum(stationIds, null); + // 获取总枪口数量和空闲枪口数量 + int totalConnectorNum = (int) connectorStatusNum.get("totalNum"); + int freeConnectorNum = (int) connectorStatusNum.get("freeNum"); + String connectorAvailability = String.format("%.2f", ((double) freeConnectorNum / totalConnectorNum) * 100) + "%"; + // 获取充电中的枪口数量 + int chargingConnectorNum = (int) connectorStatusNum.get("chargingNum"); + // 获取占用中的枪口数量 + int occupiedConnectorNum = (int) connectorStatusNum.get("occupiedNum"); + // 获取挂起中的枪口数量 + int hangingConnectorNum = (int) connectorStatusNum.get("hangingNum"); + // 获取离线中的枪口数量 + int offlineConnectorNum = (int) connectorStatusNum.get("offlineNum"); + // 获取故障中的枪口数量 + int faultConnectorNum = (int) connectorStatusNum.get("faultNum"); + + StationStatisticsInfosVO vo = StationStatisticsInfosVO.builder() + .stationId(stationIds.get(0)) + .chargeDegree(chargeDegree) + .chargeAmount(chargeAmount) + .orderQuantity(orderQuantity) + .connectorAvailability(connectorAvailability) + .chargingConnectorNum(chargingConnectorNum) + .freeConnectorNum(freeConnectorNum) + .occupiedConnectorNum(occupiedConnectorNum) + .hangingConnectorNum(hangingConnectorNum) + .offlineConnectorNum(offlineConnectorNum) + .faultConnectorNum(faultConnectorNum) + .build(); + return vo; + } + /** * 获取站点运营分析信息(7天、30天) * diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/business/StationStatisticsInfosVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/business/StationStatisticsInfosVO.java index 71bdfa25d..e9835d2c4 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/business/StationStatisticsInfosVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/business/StationStatisticsInfosVO.java @@ -50,32 +50,32 @@ public class StationStatisticsInfosVO { private String connectorAvailability; /** - * 充电中的设备数量 + * 充电中的枪口数量 */ private Integer chargingConnectorNum; /** - * 空闲中的设备数量 + * 空闲中的枪口数量 */ private Integer freeConnectorNum; /** - * 占用中的设备数量 + * 占用中的枪口数量 */ private Integer occupiedConnectorNum; /** - * 挂起中的设备数量 + * 挂起中的枪口数量 */ private Integer hangingConnectorNum; /** - * 离线设备数量 + * 离线枪口数量 */ private Integer offlineConnectorNum; /** - * 故障桩数量 + * 故障枪口数量 */ private Integer faultConnectorNum; } From 021e22c08aba6fbbcbd6f5540eb0986f8fe1bc88 Mon Sep 17 00:00:00 2001 From: Lemon Date: Tue, 13 Jan 2026 14:17:39 +0800 Subject: [PATCH 4/5] =?UTF-8?q?update=20=E8=BF=94=E5=9B=9E=E5=8F=82?= =?UTF-8?q?=E6=95=B0stationId=20-->=20stationIds?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pile/service/impl/PileStationInfoServiceImpl.java | 3 ++- .../pile/vo/uniapp/business/StationStatisticsInfosVO.java | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileStationInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileStationInfoServiceImpl.java index 59b2b5a35..ae6d175e7 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileStationInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileStationInfoServiceImpl.java @@ -1044,7 +1044,8 @@ public class PileStationInfoServiceImpl implements PileStationInfoService { int faultConnectorNum = (int) connectorStatusNum.get("faultNum"); StationStatisticsInfosVO vo = StationStatisticsInfosVO.builder() - .stationId(stationIds.get(0)) + // .stationId(stationIds.get(0)) + .stationIds(stationIds) .chargeDegree(chargeDegree) .chargeAmount(chargeAmount) .orderQuantity(orderQuantity) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/business/StationStatisticsInfosVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/business/StationStatisticsInfosVO.java index e9835d2c4..e0c886ed1 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/business/StationStatisticsInfosVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/uniapp/business/StationStatisticsInfosVO.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; +import java.util.List; /** * 站点统计信息数据 @@ -78,4 +79,9 @@ public class StationStatisticsInfosVO { * 故障枪口数量 */ private Integer faultConnectorNum; + + /** + * 站点idList + */ + private List stationIds; } From 5cf21c10ff9acc4602b4eac20506705b2dd020fd Mon Sep 17 00:00:00 2001 From: Guoqs <123@jsowell.com> Date: Wed, 14 Jan 2026 16:37:47 +0800 Subject: [PATCH 5/5] update --- .../com/jsowell/service/MemberService.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java b/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java index 15950f0b0..98a49dec1 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java @@ -57,6 +57,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cglib.beans.BeanMap; +import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -185,7 +186,8 @@ public class MemberService { throw new BusinessException(ReturnCodeEnum.CODE_OPEN_ID_IS_NULL_ERROR); } - String lockKey = CacheConstants.USER_APP_REGISTER + phoneNumber; + // 锁键包含手机号和运营商ID,确保同一运营商下的同一手机号串行处理,不同运营商互不影响 + String lockKey = CacheConstants.USER_APP_REGISTER + phoneNumber + ":" + firstLevelMerchantId; String requestId = IdUtils.fastUUID(); Boolean isLock = false; try { @@ -193,7 +195,7 @@ public class MemberService { isLock = redisCache.lock(lockKey, requestId, 60); if (!isLock) { // 获取锁失败,说明有其他请求正在处理,提示用户稍候 - log.warn("获取注册锁失败,可能有并发请求正在处理, phoneNumber:{}", phoneNumber); + log.warn("获取注册锁失败,可能有并发请求正在处理, phoneNumber:{}, merchantId:{}", phoneNumber, firstLevelMerchantId); throw new BusinessException(ReturnCodeEnum.CODE_MEMBER_REGISTER_AND_LOGIN_PROCESSING); } @@ -226,7 +228,21 @@ public class MemberService { .build(); memberTransactionDTO.setMemberWalletInfo(memberWalletInfo); } - transactionService.createMember(memberTransactionDTO); + + try { + // 插入会员数据 + transactionService.createMember(memberTransactionDTO); + } catch (DuplicateKeyException e) { + // 捕获数据库唯一索引冲突异常(极端并发情况下的兜底机制) + // 说明该手机号在该运营商下已经被其他并发请求注册了,重新查询获取已存在的会员信息 + log.warn("会员注册时检测到唯一索引冲突,重新查询已存在的会员, phoneNumber:{}, merchantId:{}", phoneNumber, firstLevelMerchantId); + memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(phoneNumber, firstLevelMerchantId); + if (memberBasicInfo == null) { + // 理论上不应该走到这里,如果走到这里说明数据被删除了,抛出异常 + log.error("唯一索引冲突后重新查询会员信息为空, phoneNumber:{}, merchantId:", phoneNumber, firstLevelMerchantId); + throw new BusinessException(ReturnCodeEnum.CODE_MEMBER_REGISTER_AND_LOGIN_ERROR); + } + } } else { boolean updateFlag = false; if (AdapayPayChannelEnum.WX_LITE.getValue().equals(dto.getRequestSource()) && !StringUtils.equals(memberBasicInfo.getOpenId(), openId)) { @@ -255,7 +271,7 @@ public class MemberService { redisCache.unLock(lockKey); } } catch (Exception e) { - log.error("释放注册锁失败, phoneNumber:{}, error:{}", phoneNumber, e.getMessage()); + log.error("释放注册锁失败, phoneNumber:{}, merchantId:{}, error:{}", phoneNumber, firstLevelMerchantId, e.getMessage()); } } }