|
|
@@ -0,0 +1,489 @@
|
|
|
+package com.zsElectric.boot.business.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import com.zsElectric.boot.charging.entity.*;
|
|
|
+import com.zsElectric.boot.business.mapper.ThirdPartyEquipmentInfoMapper;
|
|
|
+import com.zsElectric.boot.business.mapper.ThirdPartyStationInfoMapper;
|
|
|
+import com.zsElectric.boot.charging.mapper.ThirdPartyConnectorInfoMapper;
|
|
|
+import com.zsElectric.boot.charging.mapper.ThirdPartyEquipmentPricePolicyMapper;
|
|
|
+import com.zsElectric.boot.charging.mapper.ThirdPartyPolicyInfoMapper;
|
|
|
+import com.zsElectric.boot.business.model.query.ThirdPartyEquipmentInfoQuery;
|
|
|
+import com.zsElectric.boot.business.model.query.ThirdPartyStationInfoQuery;
|
|
|
+import com.zsElectric.boot.business.model.vo.PartyStationInfoVO;
|
|
|
+import com.zsElectric.boot.business.model.vo.ThirdPartyEquipmentInfoVO;
|
|
|
+import com.zsElectric.boot.business.model.vo.ThirdPartyStationInfoVO;
|
|
|
+import com.zsElectric.boot.business.service.ThirdPartyChargingService;
|
|
|
+import com.zsElectric.boot.charging.vo.ChargingPricePolicyVO;
|
|
|
+import com.zsElectric.boot.charging.vo.QueryStationsInfoVO;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.Comparator;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 第三方充电站/充电桩/价格策略统一服务实现
|
|
|
+ *
|
|
|
+ * @author system
|
|
|
+ * @since 2025-12-15
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class ThirdPartyChargingServiceImpl implements ThirdPartyChargingService {
|
|
|
+
|
|
|
+ private final ThirdPartyStationInfoMapper stationInfoMapper;
|
|
|
+ private final ThirdPartyEquipmentInfoMapper equipmentInfoMapper;
|
|
|
+ private final ThirdPartyConnectorInfoMapper connectorInfoMapper;
|
|
|
+ private final ThirdPartyEquipmentPricePolicyMapper pricePolicyMapper;
|
|
|
+ private final ThirdPartyPolicyInfoMapper policyInfoMapper;
|
|
|
+ private final ObjectMapper objectMapper;
|
|
|
+
|
|
|
+ // ==================== 充电站信息查询 ====================
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<ThirdPartyStationInfoVO> getStationInfoPage(ThirdPartyStationInfoQuery queryParams) {
|
|
|
+ // 构建分页
|
|
|
+ Page<ThirdPartyStationInfoVO> page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize());
|
|
|
+
|
|
|
+ // 调用Mapper联表查询
|
|
|
+ return stationInfoMapper.selectStationInfoPage(page, queryParams);
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 充电桩信息查询 ====================
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<ThirdPartyEquipmentInfoVO> getEquipmentInfoPage(ThirdPartyEquipmentInfoQuery queryParams) {
|
|
|
+ // 构建分页
|
|
|
+ Page<ThirdPartyEquipmentInfoVO> page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize());
|
|
|
+
|
|
|
+ // 调用Mapper联表查询
|
|
|
+ return equipmentInfoMapper.selectEquipmentInfoPage(page, queryParams);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<PartyStationInfoVO> getPartyStationInfo() {
|
|
|
+ // 查询所有设备信息
|
|
|
+ List<ThirdPartyEquipmentInfo> equipmentInfos = equipmentInfoMapper.selectList(null);
|
|
|
+
|
|
|
+ // 获取所有不重复的充电站ID
|
|
|
+ List<String> stationIds = equipmentInfos.stream()
|
|
|
+ .map(ThirdPartyEquipmentInfo::getStationId)
|
|
|
+ .distinct()
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ if (stationIds.isEmpty()) {
|
|
|
+ return List.of();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询充电站信息
|
|
|
+ List<ThirdPartyStationInfo> stationInfos = stationInfoMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<ThirdPartyStationInfo>()
|
|
|
+ .in(ThirdPartyStationInfo::getStationId, stationIds)
|
|
|
+ );
|
|
|
+
|
|
|
+ // 转换为VO
|
|
|
+ return stationInfos.stream()
|
|
|
+ .map(station -> {
|
|
|
+ PartyStationInfoVO vo = new PartyStationInfoVO();
|
|
|
+ vo.setId(station.getId());
|
|
|
+ vo.setStationName(station.getStationName());
|
|
|
+ return vo;
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 充电站数据保存 ====================
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void saveStationsInfo(QueryStationsInfoVO queryStationsInfoVO) {
|
|
|
+ if (queryStationsInfoVO == null || CollectionUtils.isEmpty(queryStationsInfoVO.getStationInfos())) {
|
|
|
+ log.warn("充电站信息为空,跳过存储");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<StationInfo> stationInfos = queryStationsInfoVO.getStationInfos();
|
|
|
+ log.info("开始保存充电站信息,总数: {}", stationInfos.size());
|
|
|
+
|
|
|
+ for (StationInfo stationInfo : stationInfos) {
|
|
|
+ try {
|
|
|
+ // 保存充电站信息
|
|
|
+ saveStationInfo(stationInfo);
|
|
|
+
|
|
|
+ // 保存设备信息
|
|
|
+ if (!CollectionUtils.isEmpty(stationInfo.getEquipmentInfos())) {
|
|
|
+ for (EquipmentInfo equipmentInfo : stationInfo.getEquipmentInfos()) {
|
|
|
+ saveEquipmentInfo(equipmentInfo, stationInfo.getStationID());
|
|
|
+
|
|
|
+ // 保存接口信息
|
|
|
+ if (!CollectionUtils.isEmpty(equipmentInfo.getConnectorInfos())) {
|
|
|
+ for (ConnectorInfo connectorInfo : equipmentInfo.getConnectorInfos()) {
|
|
|
+ saveConnectorInfo(connectorInfo, equipmentInfo.getEquipmentID(), stationInfo.getStationID());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("保存充电站信息失败, stationId: {}", stationInfo.getStationID(), e);
|
|
|
+ throw new RuntimeException("保存充电站信息失败: " + stationInfo.getStationID(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("充电站信息保存完成");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存充电站信息
|
|
|
+ */
|
|
|
+ private void saveStationInfo(StationInfo stationInfo) {
|
|
|
+ // 查询是否已存在
|
|
|
+ ThirdPartyStationInfo existingStation = stationInfoMapper.selectOne(
|
|
|
+ new LambdaQueryWrapper<ThirdPartyStationInfo>()
|
|
|
+ .eq(ThirdPartyStationInfo::getStationId, stationInfo.getStationID())
|
|
|
+ );
|
|
|
+
|
|
|
+ ThirdPartyStationInfo entity = new ThirdPartyStationInfo();
|
|
|
+ if (existingStation != null) {
|
|
|
+ entity.setId(existingStation.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置字段值
|
|
|
+ entity.setStationId(stationInfo.getStationID());
|
|
|
+ entity.setOperatorId(stationInfo.getOperatorID());
|
|
|
+ entity.setEquipmentOwnerId(stationInfo.getEquipmentOwnerID());
|
|
|
+ entity.setStationName(stationInfo.getStationName());
|
|
|
+ entity.setCountryCode(stationInfo.getCountryCode());
|
|
|
+ entity.setAreaCode(stationInfo.getAreaCode());
|
|
|
+ entity.setAddress(stationInfo.getAddress());
|
|
|
+ entity.setStationTel(stationInfo.getStationTel());
|
|
|
+ entity.setServiceTel(stationInfo.getServiceTel());
|
|
|
+ entity.setStationType(stationInfo.getStationType());
|
|
|
+ entity.setStationStatus(stationInfo.getStationStatus());
|
|
|
+ entity.setParkNums(stationInfo.getParkNums());
|
|
|
+
|
|
|
+ // 处理经纬度
|
|
|
+ if (stationInfo.getStationLng() != null) {
|
|
|
+ entity.setStationLng(BigDecimal.valueOf(stationInfo.getStationLng()));
|
|
|
+ }
|
|
|
+ if (stationInfo.getStationLat() != null) {
|
|
|
+ entity.setStationLat(BigDecimal.valueOf(stationInfo.getStationLat()));
|
|
|
+ }
|
|
|
+
|
|
|
+ entity.setSiteGuide(stationInfo.getSiteGuide());
|
|
|
+ entity.setConstruction(stationInfo.getConstruction());
|
|
|
+
|
|
|
+ // 处理图片列表(转JSON)
|
|
|
+ if (!CollectionUtils.isEmpty(stationInfo.getPictures())) {
|
|
|
+ try {
|
|
|
+ entity.setPictures(objectMapper.writeValueAsString(stationInfo.getPictures()));
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ log.warn("图片列表转JSON失败", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ entity.setBusineHours(stationInfo.getBusineHours());
|
|
|
+
|
|
|
+ // 处理费用(字符串转BigDecimal)
|
|
|
+ if (stationInfo.getElectricityFee() != null) {
|
|
|
+ try {
|
|
|
+ entity.setElectricityFee(new BigDecimal(stationInfo.getElectricityFee()));
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ log.warn("电费转换失败: {}", stationInfo.getElectricityFee(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (stationInfo.getServiceFee() != null) {
|
|
|
+ try {
|
|
|
+ entity.setServiceFee(new BigDecimal(stationInfo.getServiceFee()));
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ log.warn("服务费转换失败: {}", stationInfo.getServiceFee(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ entity.setParkFee(stationInfo.getParkFee());
|
|
|
+ entity.setPayment(stationInfo.getPayment());
|
|
|
+ entity.setSupportOrder(stationInfo.getSupportOrder());
|
|
|
+ entity.setRemark(stationInfo.getRemark());
|
|
|
+
|
|
|
+ // 插入或更新
|
|
|
+ if (existingStation == null) {
|
|
|
+ stationInfoMapper.insert(entity);
|
|
|
+ } else {
|
|
|
+ stationInfoMapper.updateById(entity);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存充电设备信息
|
|
|
+ */
|
|
|
+ private void saveEquipmentInfo(EquipmentInfo equipmentInfo, String stationId) {
|
|
|
+ // 查询是否已存在
|
|
|
+ ThirdPartyEquipmentInfo existingEquipment = equipmentInfoMapper.selectOne(
|
|
|
+ new LambdaQueryWrapper<ThirdPartyEquipmentInfo>()
|
|
|
+ .eq(ThirdPartyEquipmentInfo::getEquipmentId, equipmentInfo.getEquipmentID())
|
|
|
+ );
|
|
|
+
|
|
|
+ ThirdPartyEquipmentInfo entity = new ThirdPartyEquipmentInfo();
|
|
|
+ if (existingEquipment != null) {
|
|
|
+ entity.setId(existingEquipment.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置字段值
|
|
|
+ entity.setEquipmentId(equipmentInfo.getEquipmentID());
|
|
|
+ entity.setStationId(stationId);
|
|
|
+ entity.setManufacturerId(equipmentInfo.getManufacturerID());
|
|
|
+ entity.setManufacturerName(equipmentInfo.getManufacturerName());
|
|
|
+ entity.setEquipmentModel(equipmentInfo.getEquipmentModel());
|
|
|
+ entity.setProductionDate(equipmentInfo.getProductionDate());
|
|
|
+ entity.setEquipmentType(equipmentInfo.getEquipmentType());
|
|
|
+
|
|
|
+ // 处理经纬度
|
|
|
+ if (equipmentInfo.getEquipmentLng() != null) {
|
|
|
+ entity.setEquipmentLng(BigDecimal.valueOf(equipmentInfo.getEquipmentLng()));
|
|
|
+ }
|
|
|
+ if (equipmentInfo.getEquipmentLat() != null) {
|
|
|
+ entity.setEquipmentLat(BigDecimal.valueOf(equipmentInfo.getEquipmentLat()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理功率
|
|
|
+ if (equipmentInfo.getPower() != null) {
|
|
|
+ entity.setPower(BigDecimal.valueOf(equipmentInfo.getPower()));
|
|
|
+ }
|
|
|
+
|
|
|
+ entity.setEquipmentName(equipmentInfo.getEquipmentName());
|
|
|
+
|
|
|
+ // 插入或更新
|
|
|
+ if (existingEquipment == null) {
|
|
|
+ equipmentInfoMapper.insert(entity);
|
|
|
+ } else {
|
|
|
+ equipmentInfoMapper.updateById(entity);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存充电接口信息
|
|
|
+ */
|
|
|
+ private void saveConnectorInfo(ConnectorInfo connectorInfo, String equipmentId, String stationId) {
|
|
|
+ // 查询是否已存在
|
|
|
+ ThirdPartyConnectorInfo existingConnector = connectorInfoMapper.selectOne(
|
|
|
+ new LambdaQueryWrapper<ThirdPartyConnectorInfo>()
|
|
|
+ .eq(ThirdPartyConnectorInfo::getConnectorId, connectorInfo.getConnectorID())
|
|
|
+ );
|
|
|
+
|
|
|
+ ThirdPartyConnectorInfo entity = new ThirdPartyConnectorInfo();
|
|
|
+ if (existingConnector != null) {
|
|
|
+ entity.setId(existingConnector.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置字段值
|
|
|
+ entity.setConnectorId(connectorInfo.getConnectorID());
|
|
|
+ entity.setEquipmentId(equipmentId);
|
|
|
+ entity.setStationId(stationId);
|
|
|
+ entity.setConnectorName(connectorInfo.getConnectorName());
|
|
|
+ entity.setConnectorType(connectorInfo.getConnectorType());
|
|
|
+ entity.setVoltageUpperLimits(connectorInfo.getVoltageUpperLimits());
|
|
|
+ entity.setVoltageLowerLimits(connectorInfo.getVoltageLowerLimits());
|
|
|
+ entity.setCurrent(connectorInfo.getCurrent());
|
|
|
+
|
|
|
+ // 处理功率
|
|
|
+ if (connectorInfo.getPower() != null) {
|
|
|
+ entity.setPower(BigDecimal.valueOf(connectorInfo.getPower()));
|
|
|
+ }
|
|
|
+
|
|
|
+ entity.setParkNo(connectorInfo.getParkNo());
|
|
|
+ entity.setNationalStandard(connectorInfo.getNationalStandard());
|
|
|
+
|
|
|
+ // 插入或更新
|
|
|
+ if (existingConnector == null) {
|
|
|
+ connectorInfoMapper.insert(entity);
|
|
|
+ } else {
|
|
|
+ connectorInfoMapper.updateById(entity);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 价格策略数据保存 ====================
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void savePricePolicyInfo(ChargingPricePolicyVO pricePolicyVO) {
|
|
|
+ if (pricePolicyVO == null) {
|
|
|
+ log.warn("价格策略信息为空,跳过存储");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 查询最新的价格策略记录
|
|
|
+ ThirdPartyEquipmentPricePolicy latestPolicy = getLatestPricePolicy(
|
|
|
+ pricePolicyVO.getEquipBizSeq(),
|
|
|
+ pricePolicyVO.getConnectorID()
|
|
|
+ );
|
|
|
+
|
|
|
+ // 如果数据完全相同,不做任何操作
|
|
|
+ if (latestPolicy != null && isPolicySame(latestPolicy, pricePolicyVO)) {
|
|
|
+ log.info("价格策略数据未发生变化,跳过保存 - equipBizSeq: {}, connectorId: {}",
|
|
|
+ pricePolicyVO.getEquipBizSeq(), pricePolicyVO.getConnectorID());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 数据发生变化,插入新记录
|
|
|
+ Long policyId = insertNewPricePolicy(pricePolicyVO);
|
|
|
+
|
|
|
+ // 保存价格策略明细
|
|
|
+ if (!CollectionUtils.isEmpty(pricePolicyVO.getPolicyInfos())) {
|
|
|
+ for (ChargingPricePolicyVO.PolicyInfo policyInfo : pricePolicyVO.getPolicyInfos()) {
|
|
|
+ savePolicyInfoDetail(policyInfo, policyId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("价格策略信息保存成功(新增记录) - equipBizSeq: {}, connectorId: {}, policyId: {}",
|
|
|
+ pricePolicyVO.getEquipBizSeq(), pricePolicyVO.getConnectorID(), policyId);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("保存价格策略信息失败 - equipBizSeq: {}, connectorId: {}",
|
|
|
+ pricePolicyVO.getEquipBizSeq(), pricePolicyVO.getConnectorID(), e);
|
|
|
+ throw new RuntimeException("保存价格策略信息失败", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<ThirdPartyStationInfoVO> getStationInfoPageByEquipment(ThirdPartyStationInfoQuery queryParams) {
|
|
|
+ // 构建分页
|
|
|
+ Page<ThirdPartyStationInfoVO> page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize());
|
|
|
+ // 调用Mapper联表查询(固定设备所属方MA6DP6BE7)
|
|
|
+ return stationInfoMapper.selectStationInfoPageByEquipment(page, queryParams);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取最新的价格策略记录
|
|
|
+ */
|
|
|
+ private ThirdPartyEquipmentPricePolicy getLatestPricePolicy(String equipBizSeq, String connectorId) {
|
|
|
+ List<ThirdPartyEquipmentPricePolicy> policies = pricePolicyMapper.selectList(
|
|
|
+ Wrappers.<ThirdPartyEquipmentPricePolicy>lambdaQuery()
|
|
|
+ .eq(ThirdPartyEquipmentPricePolicy::getEquipBizSeq, equipBizSeq)
|
|
|
+ .eq(ThirdPartyEquipmentPricePolicy::getConnectorId, connectorId)
|
|
|
+ .orderByDesc(ThirdPartyEquipmentPricePolicy::getCreateTime)
|
|
|
+ .last("LIMIT 1")
|
|
|
+ );
|
|
|
+
|
|
|
+ return CollectionUtils.isEmpty(policies) ? null : policies.get(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断价格策略是否相同(比较主表和明细表)
|
|
|
+ */
|
|
|
+ private boolean isPolicySame(ThirdPartyEquipmentPricePolicy latestPolicy, ChargingPricePolicyVO newPolicy) {
|
|
|
+ // 比较主表字段
|
|
|
+ if (!Objects.equals(latestPolicy.getSuccStat(), newPolicy.getSuccStat()) ||
|
|
|
+ !Objects.equals(latestPolicy.getFailReason(), newPolicy.getFailReason()) ||
|
|
|
+ !Objects.equals(latestPolicy.getSumPeriod(), newPolicy.getSumPeriod())) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询明细表数据
|
|
|
+ List<ThirdPartyPolicyInfo> existingDetails = policyInfoMapper.selectList(
|
|
|
+ Wrappers.<ThirdPartyPolicyInfo>lambdaQuery()
|
|
|
+ .eq(ThirdPartyPolicyInfo::getPricePolicyId, latestPolicy.getId())
|
|
|
+ .orderBy(true, true, ThirdPartyPolicyInfo::getStartTime)
|
|
|
+ );
|
|
|
+
|
|
|
+ // 比较明细表
|
|
|
+ return isPolicyDetailsSame(existingDetails, newPolicy.getPolicyInfos());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 比较价格策略明细是否相同
|
|
|
+ */
|
|
|
+ private boolean isPolicyDetailsSame(List<ThirdPartyPolicyInfo> existingDetails,
|
|
|
+ List<ChargingPricePolicyVO.PolicyInfo> newDetails) {
|
|
|
+ if (CollectionUtils.isEmpty(existingDetails) && CollectionUtils.isEmpty(newDetails)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(existingDetails) || CollectionUtils.isEmpty(newDetails)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (existingDetails.size() != newDetails.size()) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 按 StartTime 排序后比较
|
|
|
+ List<ChargingPricePolicyVO.PolicyInfo> sortedNewDetails = newDetails.stream()
|
|
|
+ .sorted(Comparator.comparing(ChargingPricePolicyVO.PolicyInfo::getStartTime))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ for (int i = 0; i < existingDetails.size(); i++) {
|
|
|
+ ThirdPartyPolicyInfo existing = existingDetails.get(i);
|
|
|
+ ChargingPricePolicyVO.PolicyInfo newDetail = sortedNewDetails.get(i);
|
|
|
+
|
|
|
+ if (!Objects.equals(existing.getStartTime(), newDetail.getStartTime()) ||
|
|
|
+ !isBigDecimalEqual(existing.getElecPrice(), newDetail.getElecPrice()) ||
|
|
|
+ !isBigDecimalEqual(existing.getServicePrice(), newDetail.getServicePrice()) ||
|
|
|
+ !Objects.equals(existing.getPeriodFlag(), newDetail.getPeriodFlag())) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 比较 BigDecimal 是否相等(处理 null 情况)
|
|
|
+ */
|
|
|
+ private boolean isBigDecimalEqual(BigDecimal a, BigDecimal b) {
|
|
|
+ if (a == null && b == null) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (a == null || b == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return a.compareTo(b) == 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 插入新的价格策略记录
|
|
|
+ */
|
|
|
+ private Long insertNewPricePolicy(ChargingPricePolicyVO pricePolicyVO) {
|
|
|
+ ThirdPartyEquipmentPricePolicy entity = new ThirdPartyEquipmentPricePolicy();
|
|
|
+
|
|
|
+ // 设置字段值
|
|
|
+ entity.setEquipBizSeq(pricePolicyVO.getEquipBizSeq());
|
|
|
+ entity.setConnectorId(pricePolicyVO.getConnectorID());
|
|
|
+ entity.setSuccStat(pricePolicyVO.getSuccStat());
|
|
|
+ entity.setFailReason(pricePolicyVO.getFailReason());
|
|
|
+ entity.setSumPeriod(pricePolicyVO.getSumPeriod());
|
|
|
+ entity.setCreateTime(LocalDateTime.now());
|
|
|
+
|
|
|
+ // 插入新记录
|
|
|
+ pricePolicyMapper.insert(entity);
|
|
|
+
|
|
|
+ return entity.getId();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存价格策略明细
|
|
|
+ */
|
|
|
+ private void savePolicyInfoDetail(ChargingPricePolicyVO.PolicyInfo policyInfo, Long policyId) {
|
|
|
+ ThirdPartyPolicyInfo entity = new ThirdPartyPolicyInfo();
|
|
|
+ entity.setPricePolicyId(policyId);
|
|
|
+ entity.setStartTime(policyInfo.getStartTime());
|
|
|
+ entity.setElecPrice(policyInfo.getElecPrice());
|
|
|
+ entity.setServicePrice(policyInfo.getServicePrice());
|
|
|
+ entity.setPeriodFlag(policyInfo.getPeriodFlag());
|
|
|
+ entity.setCreateTime(LocalDateTime.now());
|
|
|
+
|
|
|
+ policyInfoMapper.insert(entity);
|
|
|
+ }
|
|
|
+}
|