PolicyFeeServiceImpl.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package com.zsElectric.boot.business.service.impl;
  2. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  3. import com.zsElectric.boot.business.mapper.PolicyFeeMapper;
  4. import com.zsElectric.boot.business.mapper.ThirdPartyEquipmentInfoMapper;
  5. import com.zsElectric.boot.business.mapper.ThirdPartyStationInfoMapper;
  6. import com.zsElectric.boot.business.model.dto.AddPolicyFeeDTO;
  7. import com.zsElectric.boot.business.model.entity.PolicyFee;
  8. import com.zsElectric.boot.business.model.vo.TimePeriodPriceVO;
  9. import com.zsElectric.boot.business.service.PolicyFeeService;
  10. import com.zsElectric.boot.charging.entity.*;
  11. import com.zsElectric.boot.charging.mapper.ThirdPartyConnectorInfoMapper;
  12. import com.zsElectric.boot.charging.mapper.ThirdPartyEquipmentPricePolicyMapper;
  13. import com.zsElectric.boot.charging.mapper.ThirdPartyPolicyInfoMapper;
  14. import com.zsElectric.boot.system.model.entity.DictItem;
  15. import com.zsElectric.boot.system.service.DictItemService;
  16. import lombok.RequiredArgsConstructor;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Transactional;
  20. import java.math.BigDecimal;
  21. import java.util.ArrayList;
  22. import java.util.List;
  23. import java.util.Map;
  24. import java.util.stream.Collectors;
  25. /**
  26. * 策略费用服务实现
  27. *
  28. * @author system
  29. * @since 2025-12-15
  30. */
  31. @Slf4j
  32. @Service
  33. @RequiredArgsConstructor
  34. public class PolicyFeeServiceImpl implements PolicyFeeService {
  35. /**
  36. * 时段标志映射:1-尖, 2-峰, 3-平, 4-谷(固定常量,避免重复创建)
  37. */
  38. private static final Map<Integer, String> PERIOD_FLAG_LABEL_MAP = Map.of(
  39. 1, "尖",
  40. 2, "峰",
  41. 3, "平",
  42. 4, "谷"
  43. );
  44. private final PolicyFeeMapper policyFeeMapper;
  45. private final ThirdPartyPolicyInfoMapper thirdPartyPolicyInfoMapper;
  46. private final ThirdPartyEquipmentPricePolicyMapper thirdPartyEquipmentPricePolicyMapper;
  47. private final DictItemService dictItemService;
  48. private final ThirdPartyStationInfoMapper stationInfoMapper;
  49. private final ThirdPartyConnectorInfoMapper thirdPartyConnectorInfoMapper;
  50. @Override
  51. public List<TimePeriodPriceVO> getPolicyFee(long stationId, int salesType, Long firmId, Long thirdPartyId) {
  52. List<TimePeriodPriceVO> timePeriodPriceVOS = new ArrayList<>();
  53. // 查询价格策略
  54. ThirdPartyEquipmentPricePolicy pricePolicy = thirdPartyEquipmentPricePolicyMapper.selectOne(Wrappers.<ThirdPartyEquipmentPricePolicy>lambdaQuery()
  55. .eq(ThirdPartyEquipmentPricePolicy::getConnectorId, thirdPartyConnectorInfoMapper.selectOne(Wrappers.<ThirdPartyConnectorInfo>lambdaQuery()
  56. .eq(ThirdPartyConnectorInfo::getStationId,stationInfoMapper.selectById(stationId).getStationId()).last("limit 1")).getConnectorId())
  57. .eq(ThirdPartyEquipmentPricePolicy::getIsDeleted, 0)
  58. .last("limit 1"));
  59. if (pricePolicy == null) {
  60. return timePeriodPriceVOS;
  61. }
  62. // 互联互通成本价
  63. List<ThirdPartyPolicyInfo> thirdPartyPolicyInfos = thirdPartyPolicyInfoMapper.selectList(Wrappers.<ThirdPartyPolicyInfo>lambdaQuery()
  64. .eq(ThirdPartyPolicyInfo::getPricePolicyId, pricePolicy.getId())
  65. .eq(ThirdPartyPolicyInfo::getIsDeleted, 0));
  66. // 运营费(按时段配置)
  67. Map<String, PolicyFee> policyFeeMap = policyFeeMapper.selectList(Wrappers.<PolicyFee>lambdaQuery()
  68. .eq(PolicyFee::getStationInfoId, stationId)
  69. .eq(PolicyFee::getIsDeleted, 0)
  70. .eq(PolicyFee::getSalesType, salesType)
  71. .eq(salesType == 1, PolicyFee::getFirmId, firmId)
  72. .eq(salesType == 2, PolicyFee::getThirdPartyId, thirdPartyId))
  73. .stream()
  74. .collect(Collectors.toMap(
  75. PolicyFee::getStartTime,
  76. policyFee -> policyFee,
  77. (v1, v2) -> v1
  78. ));
  79. // 查询时段标志字典,获取增值服务费价格(label对应中文,value对应价格)
  80. Map<String, BigDecimal> labelPriceMap = dictItemService.list(
  81. Wrappers.<DictItem>lambdaQuery()
  82. .eq(DictItem::getDictCode, "time_period_flag")
  83. .eq(DictItem::getStatus, 1)
  84. ).stream()
  85. .collect(Collectors.toMap(
  86. DictItem::getLabel,
  87. item -> new BigDecimal(item.getValue()),
  88. (v1, v2) -> v1
  89. ));
  90. // 计算综合价格
  91. for (ThirdPartyPolicyInfo policyInfo : thirdPartyPolicyInfos) {
  92. // 获取增值服务费
  93. BigDecimal valueAddedFees = labelPriceMap.getOrDefault(
  94. PERIOD_FLAG_LABEL_MAP.get(policyInfo.getPeriodFlag()),
  95. BigDecimal.ZERO
  96. );
  97. // 根据时段获取对应的运营费配置
  98. PolicyFee policyFee = policyFeeMap.get(policyInfo.getStartTime());
  99. TimePeriodPriceVO timePeriodPriceVO = new TimePeriodPriceVO();
  100. timePeriodPriceVO.setTimePeriod(policyInfo.getStartTime())
  101. .setPeriodFlag(policyInfo.getPeriodFlag())
  102. .setElectricityPrice(policyInfo.getElecPrice())
  103. .setSettlementServiceFee(policyInfo.getServicePrice())
  104. .setSettlementTotalPrice(policyInfo.getElecPrice().add(policyInfo.getServicePrice()))
  105. .setOperationServiceFee(BigDecimal.ZERO)
  106. .setSaleTotalPrice(BigDecimal.ZERO)
  107. .setValueAddedFees(valueAddedFees);
  108. // 只有配置了该时段的运营费才计算销售价并返回
  109. if (policyFee != null) {
  110. timePeriodPriceVO.setOperationServiceFee(policyFee.getOpFee())
  111. .setSaleTotalPrice(policyInfo.getElecPrice()
  112. .add(policyInfo.getServicePrice())
  113. .add(policyFee.getOpFee())
  114. .add(valueAddedFees));
  115. }
  116. timePeriodPriceVOS.add(timePeriodPriceVO);
  117. }
  118. return timePeriodPriceVOS;
  119. }
  120. @Override
  121. public boolean addPolicyFee(AddPolicyFeeDTO addPolicyFeeDTO) {
  122. // 根据站点+时段+销售类型+企业/渠道方查询是否已存在
  123. PolicyFee existPolicyFee = policyFeeMapper.selectOne(Wrappers.<PolicyFee>lambdaQuery()
  124. .eq(PolicyFee::getStationInfoId, addPolicyFeeDTO.getStationInfoId())
  125. .eq(PolicyFee::getStartTime, addPolicyFeeDTO.getTimePeriod())
  126. .eq(PolicyFee::getSalesType, addPolicyFeeDTO.getSalesType())
  127. .eq(addPolicyFeeDTO.getSalesType() == 1, PolicyFee::getFirmId, addPolicyFeeDTO.getFirmId())
  128. .eq(addPolicyFeeDTO.getSalesType() == 2, PolicyFee::getThirdPartyId, addPolicyFeeDTO.getThirdPartyId())
  129. .eq(PolicyFee::getIsDeleted, 0)
  130. .last("limit 1"));
  131. if (existPolicyFee != null) {
  132. // 已存在,执行更新
  133. existPolicyFee.setOpFee(addPolicyFeeDTO.getOperationServiceFee());
  134. return policyFeeMapper.updateById(existPolicyFee) > 0;
  135. } else {
  136. // 不存在,执行新增
  137. PolicyFee policyFee = new PolicyFee();
  138. policyFee.setStationInfoId(addPolicyFeeDTO.getStationInfoId());
  139. policyFee.setStartTime(addPolicyFeeDTO.getTimePeriod());
  140. policyFee.setOpFee(addPolicyFeeDTO.getOperationServiceFee());
  141. policyFee.setSalesType(addPolicyFeeDTO.getSalesType());
  142. policyFee.setFirmId(addPolicyFeeDTO.getFirmId());
  143. policyFee.setThirdPartyId(addPolicyFeeDTO.getThirdPartyId());
  144. boolean inserted = policyFeeMapper.insert(policyFee) > 0;
  145. // 新增成功后,更新站点的配置状态为已配置
  146. if (inserted) {
  147. stationInfoMapper.update(null, Wrappers.<ThirdPartyStationInfo>lambdaUpdate()
  148. .eq(ThirdPartyStationInfo::getId, addPolicyFeeDTO.getStationInfoId())
  149. .set(ThirdPartyStationInfo::getPolicyConfigured, 1));
  150. }
  151. return inserted;
  152. }
  153. }
  154. @Override
  155. @Transactional(rollbackFor = Exception.class)
  156. public boolean batchAddPolicyFee(List<AddPolicyFeeDTO> addPolicyFeeDTOList) {
  157. if (addPolicyFeeDTOList == null || addPolicyFeeDTOList.isEmpty()) {
  158. return false;
  159. }
  160. for (AddPolicyFeeDTO dto : addPolicyFeeDTOList) {
  161. addPolicyFee(dto);
  162. }
  163. return true;
  164. }
  165. }