mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-20 02:55:04 +08:00
Merge branch 'dev' into feature-integrated_with_JCPP
This commit is contained in:
@@ -66,8 +66,15 @@ public class BusinessStationInfoController extends BaseController {
|
||||
public RestApiResponse<?> getStationStatisticsInfos(@RequestBody StationStatisticsInfoDTO dto) {
|
||||
RestApiResponse<?> response = null;
|
||||
try {
|
||||
List<StationStatisticsInfosVO> stationStatisticsInfos = pileStationInfoService.getStationStatisticsInfos(dto);
|
||||
response = new RestApiResponse<>(ImmutableMap.of("stationStatisticsInfos", stationStatisticsInfos));
|
||||
// List<StationStatisticsInfosVO> stationStatisticsInfos = pileStationInfoService.getStationStatisticsInfos(dto);
|
||||
// 获取登录账号信息
|
||||
LoginUserDetailVO loginUserDetail = UserUtils.getLoginUserDetail();
|
||||
List<String> 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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -181,6 +181,13 @@ public interface PileStationInfoService {
|
||||
*/
|
||||
List<StationStatisticsInfosVO> getStationStatisticsInfos(StationStatisticsInfoDTO dto);
|
||||
|
||||
/**
|
||||
* 获取站点统计信息V2
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
public StationStatisticsInfosVO getStationStatisticsInfosV2(StationStatisticsInfoDTO dto);
|
||||
|
||||
/**
|
||||
* 获取站点运营分析信息(7天、30天)
|
||||
* @param dto
|
||||
|
||||
@@ -1005,6 +1005,61 @@ public class PileStationInfoServiceImpl implements PileStationInfoService {
|
||||
return resultList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取站点统计信息V2
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public StationStatisticsInfosVO getStationStatisticsInfosV2(StationStatisticsInfoDTO dto) {
|
||||
List<String> stationIds = dto.getStationIds();
|
||||
String startTime = dto.getStartTime();
|
||||
String endTime = dto.getEndTime();
|
||||
// 根据站点ids查询充电统计信息
|
||||
List<SettleOrderReport> 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<String, Object> 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))
|
||||
.stationIds(stationIds)
|
||||
.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天)
|
||||
*
|
||||
|
||||
@@ -6,6 +6,7 @@ import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 站点统计信息数据
|
||||
@@ -50,32 +51,37 @@ public class StationStatisticsInfosVO {
|
||||
private String connectorAvailability;
|
||||
|
||||
/**
|
||||
* 充电中的设备数量
|
||||
* 充电中的枪口数量
|
||||
*/
|
||||
private Integer chargingConnectorNum;
|
||||
|
||||
/**
|
||||
* 空闲中的设备数量
|
||||
* 空闲中的枪口数量
|
||||
*/
|
||||
private Integer freeConnectorNum;
|
||||
|
||||
/**
|
||||
* 占用中的设备数量
|
||||
* 占用中的枪口数量
|
||||
*/
|
||||
private Integer occupiedConnectorNum;
|
||||
|
||||
/**
|
||||
* 挂起中的设备数量
|
||||
* 挂起中的枪口数量
|
||||
*/
|
||||
private Integer hangingConnectorNum;
|
||||
|
||||
/**
|
||||
* 离线设备数量
|
||||
* 离线枪口数量
|
||||
*/
|
||||
private Integer offlineConnectorNum;
|
||||
|
||||
/**
|
||||
* 故障桩数量
|
||||
* 故障枪口数量
|
||||
*/
|
||||
private Integer faultConnectorNum;
|
||||
|
||||
/**
|
||||
* 站点idList
|
||||
*/
|
||||
private List<String> stationIds;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user