zhibing.pu
2024-09-05 7320cba2abc7beb1f990fb4fd52dc577b8d609dc
Merge remote-tracking branch 'origin/master'

# Conflicts:
# ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java
# ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java
# ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java
14个文件已修改
1个文件已删除
3个文件已添加
630 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TAccountingStrategyDetailService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/CP56Time2aConverter.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java 258 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingReplyMessageListener.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/TimingSettingMessage.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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);
    }
    /**