ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java
@@ -44,6 +44,11 @@ public R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(Integer id) { throw new RuntimeException("根据计费策略主表id策略明细失败:" + throwable.getMessage()); } @Override public R<List<TAccountingStrategyDetail>> getDetailListByCode(String code) { return R.fail("通过桩编号查询当前使用的策略明细列表失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java
@@ -51,4 +51,11 @@ */ @PostMapping("/t-accounting-strategy-detail/getListByAccountingStrategyId") R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(@RequestParam("id") Integer id); /** * 通过桩编号查询当前使用的策略明细列表 * @param code * @return */ @PostMapping("/t-accounting-strategy-detail/getDetailListByCode") R<List<TAccountingStrategyDetail>> getDetailListByCode(@RequestParam("code") String code); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -111,6 +111,11 @@ if(flag){ return AjaxResult.error("计费模板时间设置有误差"); } // 判断同阶段是否价格不一致 Boolean flag1 = accountingStrategyDetailService.isStrategyPriceConsistent(dto.getAccountingStrategyDetails()); if(!flag1){ return AjaxResult.error("同阶段费率值需一致"); } Long userId = SecurityUtils.getLoginUser().getUserid(); dto.setUserId(userId); accountingStrategyService.save(dto); @@ -131,6 +136,11 @@ if(flag){ return AjaxResult.error("计费模板时间设置有误差"); } // 判断同阶段是否价格不一致 Boolean flag1 = accountingStrategyDetailService.isStrategyPriceConsistent(dto.getAccountingStrategyDetails()); if(!flag1){ return AjaxResult.error("同阶段费率值需一致"); } // 判断修改的计费策略是否为已通过 if(dto.getAuditStatus() == 3 || dto.getAuditStatus() == 4){ // 查询是否有下级审核中的策略 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java
@@ -154,5 +154,26 @@ List<TAccountingStrategyDetail> list = accountingStrategyDetailService.list(new LambdaQueryWrapper<TAccountingStrategyDetail>().eq(TAccountingStrategyDetail::getAccountingStrategyId, id)); return R.ok(list); } /** * 通过桩编号查询当前使用的策略明细列表 * @param code * @return */ @PostMapping("/t-accounting-strategy-detail/getDetailListByCode") public R<List<TAccountingStrategyDetail>> getDetailListByCode(@RequestParam("code") String code){ // 查询桩 TChargingPile chargingPile = chargingPileService.getOne(Wrappers.lambdaQuery(TChargingPile.class) .eq(TChargingPile::getCode,code) .last("LIMIT 1")); if(Objects.isNull(chargingPile)){ return R.fail("未查询到该桩设备"); } Site site = siteService.getById(chargingPile.getSiteId()); TAccountingStrategy accountingStrategy = accountingStrategyService.getById(site.getAccountingStrategyId()); List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailService.list(Wrappers.<TAccountingStrategyDetail>lambdaQuery() .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategy.getId())); return R.ok(accountingStrategyDetails); } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TAccountingStrategyDetailService.java
@@ -44,4 +44,12 @@ * @return */ Boolean isStrategy24Hour(List<TAccountingStrategyDetail> accountingStrategyDetails); /** * 判断同阶段是否价格不一致 * @param accountingStrategyDetails * @return */ Boolean isStrategyPriceConsistent(List<TAccountingStrategyDetail> accountingStrategyDetails); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
@@ -24,10 +24,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalTime; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.*; import java.util.stream.Collectors; /** @@ -146,4 +143,23 @@ return isFirstElementValid || !isTimeContinuous; } @Override public Boolean isStrategyPriceConsistent(List<TAccountingStrategyDetail> accountingStrategyDetails) { Map<Integer, BigDecimal> phaseToServiceFee = new HashMap<>(); for (TAccountingStrategyDetail detail : accountingStrategyDetails) { Integer type = detail.getType(); BigDecimal serviceFee = detail.getServiceCharge(); if (phaseToServiceFee.containsKey(type)) { BigDecimal existingFee = phaseToServiceFee.get(type); if (!existingFee.equals(serviceFee)) { return false; // 发现不一致的服务费 } } else { phaseToServiceFee.put(type, serviceFee); } } return true; // 所有相同阶段的服务费一致 } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java
@@ -89,7 +89,7 @@ /** * 对时设置应答 */ public static final String TIMING_SETTING_REPLY ="timing_setting_reply"; public static final String TIMING_SETTING ="timing_setting"; /** * 计费模型应答 */ ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java
@@ -172,13 +172,13 @@ } /** * 对时设置 * @param timingSetting 实体对象 * 对时设置应答 * @param timingSettingReply 实体对象 * @return */ @PostMapping("/timingSetting") public String timingSetting(@RequestBody TimingSetting timingSetting){ return iotMessageProduce.sendMessage(timingSetting.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING.getKey(),messageUtil.timingSetting(timingSetting)); @PostMapping("/timingSettingReply") public String timingSettingReply(@RequestBody TimingSettingReply timingSettingReply){ return iotMessageProduce.sendMessage(timingSettingReply.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING_REPLY.getKey(),messageUtil.timingSettingReply(timingSettingReply)); } /** ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java
@@ -67,9 +67,9 @@ */ WORKING_PARAMETER_SETTING ("充电桩工作参数设置","working_parameter_setting"), /** * 对时设置 * 对时设置应答 */ TIMING_SETTING ("对时设置","timing_setting"), TIMING_SETTING_REPLY ("对时设置应答","timing_setting_reply"), /** * 计费模型设置 */ ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
@@ -95,8 +95,8 @@ case SendTagConstant.WORKING_PARAMETER_SETTING_REPLY: sendResult = enhanceProduce.workingParameterSettingReplyMessage(content); break; case SendTagConstant.TIMING_SETTING_REPLY: sendResult = enhanceProduce.timingSettingReplyMessage(content); case SendTagConstant.TIMING_SETTING: sendResult = enhanceProduce.timingSettingMessage(content); break; case SendTagConstant.SETUP_BILLING_MODEL_REPLY: sendResult = enhanceProduce.setupBillingModelReplyMessage(content); ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/CP56Time2aConverter.java
New file @@ -0,0 +1,39 @@ package com.ruoyi.integration.iotda.utils.tools; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; public class CP56Time2aConverter { public static String convertToCP56Time2a(Date date) { try { DatatypeFactory datatypeFactory = DatatypeFactory.newInstance(); GregorianCalendar calendar = new GregorianCalendar(); calendar.setTime(date); TimeZone timeZone = calendar.getTimeZone(); XMLGregorianCalendar xmlGregorianCalendar = datatypeFactory.newXMLGregorianCalendar( calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH)+1, calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND), (timeZone.getRawOffset() / (60 * 1000))); return xmlGregorianCalendar.toXMLFormat(); } catch (DatatypeConfigurationException e) { throw new RuntimeException("Error creating DatatypeFactory", e); } } public static void main(String[] args) { Date now = new Date(); String cp56Time2a = convertToCP56Time2a(now); System.out.println("CP56Time2a: " + cp56Time2a); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java
@@ -44,7 +44,7 @@ @Autowired private WorkingParameterSettingService workingParameterSettingService; @Autowired private TimingSettingService timingSettingService; private TimingSettingReplyService timingSettingReplyService; @Autowired private SetupBillingModelService setupBillingModelService; @Autowired @@ -205,13 +205,13 @@ } /** * 对时设置 * @param timingSetting 实体对象 * 对时设置应答 * @param timingSettingReply 实体对象 * @return */ public String timingSetting(TimingSetting timingSetting){ timingSettingService.create(timingSetting); return getMessageJsonString(timingSetting, ServiceIdMenu.TIMING_SETTING.getValue()); public String timingSettingReply(TimingSettingReply timingSettingReply){ timingSettingReplyService.create(timingSettingReply); return getMessageJsonString(timingSettingReply, ServiceIdMenu.TIMING_SETTING_REPLY.getValue()); } /** ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java
@@ -1,19 +1,271 @@ package com.ruoyi.integration.iotda.utils.tools; import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.integration.api.model.AcquisitionBillingModeReply; import lombok.extern.slf4j.Slf4j; import java.io.Serializable; import java.time.LocalTime; import java.util.*; import java.util.stream.Collectors; @Slf4j public class StrategyUtil implements Serializable { /** * 校验计费模版是否准确 * 获取计费模版的价格 * @return */ public static boolean checkStrategy() { return true; public static Map<Integer, TAccountingStrategyDetail> getStrategyPrice(List<TAccountingStrategyDetail> accountingStrategyDetails) { Map<Integer, TAccountingStrategyDetail> phaseToServiceFee = new HashMap<>(); for (TAccountingStrategyDetail detail : accountingStrategyDetails) { Integer type = detail.getType(); if (!phaseToServiceFee.containsKey(type)) { phaseToServiceFee.put(type, detail); } } return phaseToServiceFee; } /** * 计费模版的价格设置 * @return */ public static void setStrategyPrice(Map<Integer, TAccountingStrategyDetail> accountingStrategyDetails,AcquisitionBillingModeReply acquisitionBillingModeReply) { accountingStrategyDetails.forEach((k,v)->{ switch (k){ case 1: acquisitionBillingModeReply.setSharp_peak_electricity_rate(v.getElectrovalence()); // acquisitionBillingModeReply.setSharp_peak_service_rate(v.getServiceCharge()); break; case 2: acquisitionBillingModeReply.setPeak_electricity_rate(v.getElectrovalence()); // acquisitionBillingModeReply.setPeak_service_rate(v.getServiceCharge()); break; case 3: acquisitionBillingModeReply.setFlat_peak_electricity_rate(v.getElectrovalence()); // acquisitionBillingModeReply.setFlat_peak_service_rate(v.getServiceCharge()); break; default: acquisitionBillingModeReply.setLow_peak_electricity_rate(v.getElectrovalence()); // acquisitionBillingModeReply.setLow_peak_service_rate(v.getServiceCharge()); break; } }); } /** * 计费模版的时段设置 * @return */ public static void setTime(List<TAccountingStrategyDetail> accountingStrategyDetails,AcquisitionBillingModeReply acquisitionBillingModeReply) { LocalTime time = LocalTime.of(0, 15, 0); for (int i = 1; i <= 48; i++) { if(i != 1){ time = time.plusMinutes(30); } accountingStrategyDetails = accountingStrategyDetails.stream().sorted(Comparator.comparing(TAccountingStrategyDetail::getStartTime)).collect(Collectors.toList()); for (TAccountingStrategyDetail accountingStrategyDetail : accountingStrategyDetails) { if(DateUtils.string2LocalTime(accountingStrategyDetail.getStartTime()).isBefore(time) && DateUtils.string2LocalTime(accountingStrategyDetail.getEndTime()).isAfter(time)){ switch (i){ case 1: acquisitionBillingModeReply.setTime1(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 2: acquisitionBillingModeReply.setTime2(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 3: acquisitionBillingModeReply.setTime3(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 4: acquisitionBillingModeReply.setTime4(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 5: acquisitionBillingModeReply.setTime5(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 6: acquisitionBillingModeReply.setTime6(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 7: acquisitionBillingModeReply.setTime7(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 8: acquisitionBillingModeReply.setTime8(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 9: acquisitionBillingModeReply.setTime9(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 10: acquisitionBillingModeReply.setTime10(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 11: acquisitionBillingModeReply.setTime11(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 12: acquisitionBillingModeReply.setTime12(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 13: acquisitionBillingModeReply.setTime13(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 14: acquisitionBillingModeReply.setTime14(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 15: acquisitionBillingModeReply.setTime15(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 16: acquisitionBillingModeReply.setTime16(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 17: acquisitionBillingModeReply.setTime17(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 18: acquisitionBillingModeReply.setTime18(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 19: acquisitionBillingModeReply.setTime19(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 20: acquisitionBillingModeReply.setTime20(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 21: acquisitionBillingModeReply.setTime21(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 22: acquisitionBillingModeReply.setTime22(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 23: acquisitionBillingModeReply.setTime23(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 24: acquisitionBillingModeReply.setTime24(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 25: acquisitionBillingModeReply.setTime25(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 26: acquisitionBillingModeReply.setTime26(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 27: acquisitionBillingModeReply.setTime27(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 28: acquisitionBillingModeReply.setTime28(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 29: acquisitionBillingModeReply.setTime29(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 30: acquisitionBillingModeReply.setTime30(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 31: acquisitionBillingModeReply.setTime31(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 32: acquisitionBillingModeReply.setTime32(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 33: acquisitionBillingModeReply.setTime33(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 34: acquisitionBillingModeReply.setTime34(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 35: acquisitionBillingModeReply.setTime35(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 36: acquisitionBillingModeReply.setTime36(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 37: acquisitionBillingModeReply.setTime37(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 38: acquisitionBillingModeReply.setTime38(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 39: acquisitionBillingModeReply.setTime39(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 40: acquisitionBillingModeReply.setTime40(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 41: acquisitionBillingModeReply.setTime41(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 42: acquisitionBillingModeReply.setTime42(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 43: acquisitionBillingModeReply.setTime43(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 44: acquisitionBillingModeReply.setTime44(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 45: acquisitionBillingModeReply.setTime45(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 46: acquisitionBillingModeReply.setTime46(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 47: acquisitionBillingModeReply.setTime47(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 48: acquisitionBillingModeReply.setTime48(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; } } } } } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java
@@ -1,7 +1,14 @@ package com.ruoyi.integration.rocket.listener; import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient; import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail; import com.ruoyi.integration.api.model.AcquisitionBillingMode; import com.ruoyi.integration.api.model.AcquisitionBillingModeReply; import com.ruoyi.integration.api.model.Online; import com.ruoyi.integration.iotda.enums.ServiceIdMenu; import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce; import com.ruoyi.integration.iotda.utils.tools.MessageUtil; import com.ruoyi.integration.iotda.utils.tools.StrategyUtil; import com.ruoyi.integration.mongodb.service.AcquisitionBillingModeService; import com.ruoyi.integration.rocket.model.AcquisitionBillingModeMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; @@ -11,6 +18,10 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.Objects; @Slf4j @Component @@ -24,7 +35,12 @@ @Autowired private AcquisitionBillingModeService acquisitionBillingModeService; @Autowired private AccountingStrategyDetailClient accountingStrategyDetailClient; @Autowired private IotMessageProduce iotMessageProduce; @Autowired private MessageUtil messageUtil; @Override protected void handleMessage(AcquisitionBillingModeMessage message) throws Exception { // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 @@ -33,7 +49,15 @@ AcquisitionBillingMode acquisitionBillingMode = new AcquisitionBillingMode(); BeanUtils.copyProperties(message,acquisitionBillingMode); acquisitionBillingModeService.create(acquisitionBillingMode); // 业务处理 // 业务处理 计费模型请求应答 1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段 List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(message.getCharging_pile_code()).getData(); Map<Integer, TAccountingStrategyDetail> strategyPrice = StrategyUtil.getStrategyPrice(accountingStrategyDetails); // 价格设置 AcquisitionBillingModeReply acquisitionBillingModeReply = new AcquisitionBillingModeReply(); StrategyUtil.setStrategyPrice(strategyPrice,acquisitionBillingModeReply); // 时段设置 StrategyUtil.setTime(accountingStrategyDetails,acquisitionBillingModeReply); iotMessageProduce.sendMessage(acquisitionBillingModeReply.getCharging_pile_code(), ServiceIdMenu.ACQUISITION_BILLING_MODE_REPLY.getKey(),messageUtil.acquisitionBillingModeReply(acquisitionBillingModeReply)); } @Override ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java
New file @@ -0,0 +1,93 @@ package com.ruoyi.integration.rocket.listener; import com.ruoyi.integration.api.model.TimingSetting; import com.ruoyi.integration.api.model.TimingSettingReply; import com.ruoyi.integration.iotda.enums.ServiceIdMenu; import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce; import com.ruoyi.integration.iotda.utils.tools.CP56Time2aConverter; import com.ruoyi.integration.iotda.utils.tools.MessageUtil; import com.ruoyi.integration.mongodb.service.TimingSettingReplyService; import com.ruoyi.integration.mongodb.service.TimingSettingService; import com.ruoyi.integration.rocket.model.TimingSettingMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Date; @Slf4j @Component @RocketMQMessageListener( consumerGroup = "enhance_consumer_group", topic = "rocket_enhance", selectorExpression = "*", consumeThreadMax = 5 //默认是64个线程并发消息,配置 consumeThreadMax 参数指定并发消费线程数,避免太大导致资源不够 ) public class TimingSettingMessageListener extends EnhanceMessageHandler<TimingSettingMessage> implements RocketMQListener<TimingSettingMessage> { @Autowired private TimingSettingService timingSettingService; @Autowired private IotMessageProduce iotMessageProduce; @Autowired private MessageUtil messageUtil; @Override protected void handleMessage(TimingSettingMessage message) throws Exception { // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 log.info("对时设置-业务消息处理:{}",message); // 持久化消息 TimingSetting timingSetting = new TimingSetting(); BeanUtils.copyProperties(message,timingSetting); timingSettingService.create(timingSetting); // 业务处理 对时设置应答 TimingSettingReply timingSettingReply = new TimingSettingReply(); timingSettingReply.setCharging_pile_code(message.getCharging_pile_code()); timingSettingReply.setCurrent_time(CP56Time2aConverter.convertToCP56Time2a(new Date())); iotMessageProduce.sendMessage(timingSettingReply.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING_REPLY.getKey(),messageUtil.timingSettingReply(timingSettingReply)); } @Override protected void handleMaxRetriesExceeded(TimingSettingMessage message) { // 当超过指定重试次数消息时此处方法会被调用 // 生产中可以进行回退或其他业务操作 log.error("消息消费失败,请执行后续处理"); } /** * 是否执行重试机制 */ @Override protected boolean isRetry() { return true; } @Override protected boolean throwException() { // 是否抛出异常,false搭配retry自行处理异常 return false; } /** * 若需要处理消息过滤,在父级中进行统一处理,或者在此处实现之后,自行处理 * @param message 待处理消息 * @return true: 本次消息被过滤,false:不过滤 */ @Override protected boolean filter(TimingSettingMessage message) { // 此处可做消息过滤 return false; } /** * 监听消费消息,不需要执行业务处理,委派给父类做基础操作,父类做完基础操作后会调用子类的实际处理类型 */ @Override public void onMessage(TimingSettingMessage message) { super.dispatchMessage(message); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingReplyMessageListener.java
File was deleted ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/TimingSettingMessage.java
New file @@ -0,0 +1,17 @@ package com.ruoyi.integration.rocket.model; import com.ruoyi.integration.rocket.base.BaseMessage; import lombok.Data; /** * 对时设置 **/ @Data public class TimingSettingMessage extends BaseMessage { private String charging_pile_code; //桩编码 private String current_time; //当前时间 } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java
@@ -253,15 +253,15 @@ } /** * 对时设置应答 * 对时设置 */ public SendResult timingSettingReplyMessage(JSONObject jsonObject) { TimingSettingReplyMessage message = JSON.parseObject(jsonObject.toJSONString(),TimingSettingReplyMessage.class); public SendResult timingSettingMessage(JSONObject jsonObject) { TimingSettingMessage message = JSON.parseObject(jsonObject.toJSONString(),TimingSettingMessage.class); // 设置业务key message.setKey(UUID.randomUUID().toString()); // 设置消息来源,便于查询 message.setSource(SendTagConstant.TIMING_SETTING_REPLY); return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.TIMING_SETTING_REPLY, message); message.setSource(SendTagConstant.TIMING_SETTING); return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.TIMING_SETTING, message); } /**