鞍钢鲅鱼圈能源管控系统后端代码
liriming
2025-02-25 82daef08b9db31e01a8d5fbd1731d30cd7ba7a9c
ansteel
已添加11个文件
已删除24个文件
1866 ■■■■■ 文件已修改
ansteel-biz/src/main/java/com/iailab/module/ansteel/client/OAuth2Client.java 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/client/UserClient.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/client/dto/oauth2/OAuth2AccessTokenRespDTO.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/client/dto/oauth2/OAuth2CheckTokenRespDTO.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/client/dto/user/UserInfoRespDTO.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/client/dto/user/UserUpdateReqDTO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/config/FeignTokenInterceptor.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/auth/AuthController.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/demo/DemoController.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/demo/vo/DemoPageReqVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/demo/vo/DemoRespVO.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/demo/vo/DemoSaveReqVO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/package-info.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/app/ip/AppAreaController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/app/ip/vo/AppAreaNodeRespVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/app/package-info.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/package-info.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/dal/dataobject/demo/DemoDO.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/dal/dataobject/package-info.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/dal/mysql/demo/DemoMapper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/dal/mysql/package-info.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/common/constant/CommonConstant.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/common/constant/RoutingConstant.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/config/QueueModelAlarmConfig.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/config/QueuePredictFinishConfig.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/consumer/ModelAlarmConsumer.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/consumer/ModelPredictFinish2Consumer.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/consumer/ModelPredictFinishConsumer.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/package-info.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/service/demo/DemoService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/service/demo/DemoServiceImpl.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/service/package-info.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/util/SecurityUtils.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/util/SpringContextUtils.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/util/token/IailabClient.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/client/OAuth2Client.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/client/UserClient.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/client/dto/oauth2/OAuth2AccessTokenRespDTO.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/client/dto/oauth2/OAuth2CheckTokenRespDTO.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/client/dto/user/UserInfoRespDTO.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/client/dto/user/UserUpdateReqDTO.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/config/FeignTokenInterceptor.java
对比新文件
@@ -0,0 +1,43 @@
package com.iailab.module.ansteel.config;
import com.iailab.module.shasteel.util.token.IailabClient;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@Configuration
public class FeignTokenInterceptor implements RequestInterceptor {
    @Autowired
    private IailabClient iailabClient;
    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 从当前请求上下文中获取Token
        String token = getTokenFromCurrentRequest();
        if (token == null) {
            // 如果没有获取到Token,从system-server中获取token
            token = iailabClient.getToken();
            if (token!= null) {
                requestTemplate.header(HttpHeaders.AUTHORIZATION, token);
            }
            Long tenantId = iailabClient.getTenantId();
            if (tenantId != null) {
                requestTemplate.header("tenant-id", String.valueOf(tenantId));
            }
        }
    }
    private String getTokenFromCurrentRequest() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes!= null) {
            return attributes.getRequest().getHeader(HttpHeaders.AUTHORIZATION);
        }
        return null;
    }
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/auth/AuthController.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/demo/DemoController.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/demo/vo/DemoPageReqVO.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/demo/vo/DemoRespVO.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/demo/vo/DemoSaveReqVO.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/admin/package-info.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/app/ip/AppAreaController.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/app/ip/vo/AppAreaNodeRespVO.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/app/package-info.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/controller/package-info.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/dal/dataobject/demo/DemoDO.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/dal/dataobject/package-info.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/dal/mysql/demo/DemoMapper.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/dal/mysql/package-info.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/common/constant/CommonConstant.java
对比新文件
@@ -0,0 +1,26 @@
package com.iailab.module.ansteel.mq.common.constant;
/**
 * @Description: 通用常量
 */
public interface CommonConstant {
    //压缩空气调度方案code
    String COMPRESSOR_CODE = "Air";
    //蒸汽调度方案code
    String STEAM_CODE = "sha01";
    //氧气班平衡计划方案code
    String OXYGEN_ONE_CODE = "oxygen01";
    //氧气系统优化调度决策方案code
    String OXYGEN_TWO_CODE = "oxygen02";
    //超上限
    String EXCEEDING_UPPER_LIMIT = "UpperLimit";
    //超下限
    String EXCEEDING_LOWER_LIMIT = "LowerLimit";
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/common/constant/RoutingConstant.java
对比新文件
@@ -0,0 +1,12 @@
package com.iailab.module.ansteel.mq.common.constant;
public interface RoutingConstant {
    String EXCHANGE = "FastShasteel";
    // 预测模型完成路由
    String Iailab_Model_PredictFinish = "Iailab.Model.PredictFinish";
    //预警消息路由
    String Iailab_Model_Alarm = "Iailab.Model.Alarm";
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/config/QueueModelAlarmConfig.java
对比新文件
@@ -0,0 +1,38 @@
package com.iailab.module.ansteel.mq.config;
import com.iailab.module.shasteel.mq.common.constant.RoutingConstant;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * 绑定队列
 *
 * @author lirm
 * @Description
 * @createTime 2024年11月27日
 */
@Configuration
public class QueueModelAlarmConfig {
    // 队列名称
    public final static String QUEUE_NAME = "IaiabFastShateel.Model.Alarm";
    @Bean
    public Queue alarmQueue() {
        return new Queue(QUEUE_NAME);
    }
    @Bean
    TopicExchange alarmExchange() {
        return new TopicExchange(RoutingConstant.EXCHANGE);
    }
    // 注意通配符*和#的用法
    @Bean
    Binding bindingExchangeMessageAlarm() {
        return BindingBuilder.bind(alarmQueue()).to(alarmExchange()).with(RoutingConstant.Iailab_Model_Alarm);
    }
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/config/QueuePredictFinishConfig.java
对比新文件
@@ -0,0 +1,36 @@
package com.iailab.module.ansteel.mq.config;
import com.iailab.module.shasteel.mq.common.constant.RoutingConstant;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @author lirm
 * @Description
 * @createTime 2024年11月27日
 */
@Configuration
public class QueuePredictFinishConfig {
    // 队列名称
    public final static String QUEUE_NAME = "IaiabFastShateel.Model.PredictFinish";
    @Bean
    public Queue predictFinishQueue() {
        return new Queue(QueuePredictFinishConfig.QUEUE_NAME);
    }
    @Bean
    TopicExchange predictFinishExchange() {
        return new TopicExchange(RoutingConstant.EXCHANGE);
    }
    // 注意通配符*和#的用法
    @Bean
    Binding bindingExchangeMessagePF() {
        return BindingBuilder.bind(predictFinishQueue()).to(predictFinishExchange()).with(RoutingConstant.Iailab_Model_PredictFinish);
    }
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/consumer/ModelAlarmConsumer.java
对比新文件
@@ -0,0 +1,165 @@
package com.iailab.module.ansteel.mq.consumer;
import com.alibaba.fastjson.JSONObject;
import com.iailab.framework.common.util.date.DateUtils;
import com.iailab.module.model.api.mcs.McsApi;
import com.iailab.module.model.api.mcs.dto.AlarmMessageRespDTO;
import com.iailab.module.model.api.mcs.dto.ScheduleSuggestRespDTO;
import com.iailab.module.model.api.mcs.dto.StScheduleSchemeDTO;
import com.iailab.module.model.api.mdk.MdkApi;
import com.iailab.module.model.api.mdk.dto.MdkScheduleReqDTO;
import com.iailab.module.model.api.mdk.dto.MdkScheduleRespDTO;
import com.iailab.module.model.enums.ScheduleTriggerMethodEnum;
import com.iailab.module.shasteel.mq.common.constant.CommonConstant;
import com.iailab.module.shasteel.mq.config.QueueModelAlarmConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
 * 监听报警信息
 *
 * @author PanZhibao
 * @Description
 * @createTime 2024年12月11日
 */
@Slf4j
@Component
public class ModelAlarmConsumer {
    @Resource
    private McsApi mcsApi;
    @Resource
    private MdkApi mdkApi;
    /**
     * 事件标识
     */
    private final String EVENT_FLAG = "GasAlarm";
    /**
     * 监听报警信息,执行调度
     *
     * @param message
     */
    @RabbitListener(queues = QueueModelAlarmConfig.QUEUE_NAME)
    public void listen(Message message) {
        String routingKey = message.getMessageProperties().getReceivedRoutingKey();
        log.info("routingKey:" + routingKey);
        String messageBody = new String(message.getBody());
        log.info("messageBody:" + messageBody);
        JSONObject messageJson = JSONObject.parseObject(messageBody);
        if (CollectionUtils.isEmpty(messageJson)) {
            return;
        }
        // 查找需要执行的调度方案
        List<StScheduleSchemeDTO> scheduleSchemeList = mcsApi.listScheduleScheme(ScheduleTriggerMethodEnum.EVENT.getCode(), routingKey);
        for(StScheduleSchemeDTO stScheduleSchemeDTO : scheduleSchemeList){
            MdkScheduleReqDTO mdkScheduleReqDTO = new MdkScheduleReqDTO();
            mdkScheduleReqDTO.setScheduleCode(stScheduleSchemeDTO.getCode());
            mdkScheduleReqDTO.setScheduleTime(stScheduleSchemeDTO.getScheduleTime());
            MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(mdkScheduleReqDTO);//执行调度方案
            if(mdkScheduleRespDTO == null){
                return;
            }
            AlarmMessageRespDTO alarmRespDTO = (AlarmMessageRespDTO)messageJson.get("AlarmMessageRespDTO");
            alarmRespDTO.setId(UUID.randomUUID().toString());
            alarmRespDTO.setAlarmTime(DateUtils.parse(messageJson.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
            mcsApi.createAlarmMessage(alarmRespDTO);
            Map<String, Object> result = mdkScheduleRespDTO.getResult();
            switch (mdkScheduleRespDTO.getScheduleCode()) {
                case CommonConstant.OXYGEN_ONE_CODE://氧气班平衡计划方案
                    if(!result.containsKey("faAdvice") || !result.containsKey("yingDiAdvice") || !result.containsKey("yingZhongAdvice")
                            || !result.containsKey("hongAdvice") || !result.containsKey("RunAdvice")){
                        return;
                    }
                    for (String key : result.keySet()) {
                        if ("faAdvice".equals(key) && !"".equals(result.get("faAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("faAdvice").toString());//法夜空建议送出量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }else if ("yingDiAdvice".equals(key) && !"".equals(result.get("yingDiAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("yingDiAdvice").toString());//盈德低压建议送出量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }else if ("yingZhongAdvice".equals(key) && !"".equals(result.get("yingZhongAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("yingZhongAdvice").toString());//盈德中压建议送出量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }else if ("hongAdvice".equals(key) && !"".equals(result.get("hongAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("hongAdvice").toString());//宏昌建议送出量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }else if ("RunAdvice".equals(key) && !"".equals(result.get("RunAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("RunAdvice").toString());//润忠建议送出量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }
                    }
                    break;
                case CommonConstant.OXYGEN_TWO_CODE://氧气系统优化调度决策方案
                    if(!result.containsKey("yingdiAdvice") || !result.containsKey("faAdvice") || !result.containsKey("hongAdvice")
                            || !result.containsKey("RunAdvice")){
                        return;
                    }
                    for (String key : result.keySet()) {
                        if ("yingdiAdvice".equals(key) && !"".equals(result.get("yingdiAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("yingdiAdvice").toString());//盈德中压建议调整量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }else if ("faAdvice".equals(key) && !"".equals(result.get("faAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("faAdvice").toString());//法夜空建议调整量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }else if ("hongAdvice".equals(key) && !"".equals(result.get("hongAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("hongAdvice").toString());//宏昌建议调整量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }else if ("RunAdvice".equals(key) && !"".equals(result.get("RunAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("RunAdvice").toString());//润忠建议调整量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }
                    }
                    break;
                default:
                    break;
            }
        }
    }
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/consumer/ModelPredictFinish2Consumer.java
对比新文件
@@ -0,0 +1,150 @@
package com.iailab.module.ansteel.mq.consumer;
import com.alibaba.fastjson.JSONObject;
import com.iailab.framework.common.util.date.DateUtils;
import com.iailab.module.model.api.mcs.McsApi;
import com.iailab.module.model.api.mcs.dto.AlarmMessageRespDTO;
import com.iailab.module.model.api.mcs.dto.ScheduleSuggestRespDTO;
import com.iailab.module.model.api.mcs.dto.StScheduleSchemeDTO;
import com.iailab.module.model.api.mdk.MdkApi;
import com.iailab.module.model.api.mdk.dto.MdkScheduleReqDTO;
import com.iailab.module.model.api.mdk.dto.MdkScheduleRespDTO;
import com.iailab.module.model.enums.ScheduleTriggerMethodEnum;
import com.iailab.module.shasteel.mq.common.constant.CommonConstant;
import com.iailab.module.shasteel.mq.config.QueuePredictFinishConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
 * 监听报警信息
 *
 * @author PanZhibao
 * @Description
 * @createTime 2024年12月11日
 */
@Slf4j
@Component
public class ModelPredictFinish2Consumer {
    @Resource
    private McsApi mcsApi;
    @Resource
    private MdkApi mdkApi;
    /**
     * 监听预测完成,执行调度
     *
     * @param message
     */
    @RabbitListener(queues = QueuePredictFinishConfig.QUEUE_NAME)
    public void listen(Message message) {
        String routingKey = message.getMessageProperties().getReceivedRoutingKey();
        log.info("routingKey:" + routingKey);
        String messageBody = new String(message.getBody());
        log.info("messageBody:" + messageBody);
        JSONObject messageJson = JSONObject.parseObject(messageBody);
        if (CollectionUtils.isEmpty(messageJson)) {
            return;
        }
        // 查找需要执行的调度方案
        List<StScheduleSchemeDTO> scheduleSchemeList = mcsApi.listScheduleScheme(ScheduleTriggerMethodEnum.EVENT.getCode(), routingKey);
        for(StScheduleSchemeDTO stScheduleSchemeDTO : scheduleSchemeList){
            MdkScheduleReqDTO mdkScheduleReqDTO = new MdkScheduleReqDTO();
            mdkScheduleReqDTO.setScheduleCode(stScheduleSchemeDTO.getCode());
            mdkScheduleReqDTO.setScheduleTime(stScheduleSchemeDTO.getScheduleTime());
            MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(mdkScheduleReqDTO);//执行调度方案
            if(mdkScheduleRespDTO == null){
                return;
            }
            Map<String, Object> result = mdkScheduleRespDTO.getResult();
            switch (mdkScheduleRespDTO.getScheduleCode()) {
                case CommonConstant.COMPRESSOR_CODE://压缩空气调度方案
                    if(!result.containsKey("pressureWarning") || !result.containsKey("dispatchStart") || !result.containsKey("dispatchEnd")){
                        return;
                    }
                    for (String key : result.keySet()) {
                        if("pressureWarning".equals(key) && !"".equals(result.get("pressureWarning").toString())){
                            AlarmMessageRespDTO alarmRespDTO = new AlarmMessageRespDTO();
                            alarmRespDTO.setId(UUID.randomUUID().toString());
                            alarmRespDTO.setContent(result.get("pressureWarning").toString());//压力预警信息
                            alarmRespDTO.setAlarmTime(DateUtils.parse(messageJson.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
                            mcsApi.createAlarmMessage(alarmRespDTO);
                        }else if("dispatchStart".equals(key) && !"".equals(result.get("dispatchStart").toString())){
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("dispatchStart").toString());//空压机启动调度建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }else if("dispatchEnd".equals(key) && !"".equals(result.get("dispatchEnd").toString())){
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("dispatchClose").toString());//空压机关停调度建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }
                    }
                    break;
                case CommonConstant.STEAM_CODE://蒸汽调度方案
                    if(!result.containsKey("daxinWarning") || !result.containsKey("jinfengWarning") || !result.containsKey("zhuanlu1Warning")
                            || !result.containsKey("zhuanlu2Warning") || !result.containsKey("jinfengAdvice") || !result.containsKey("daxinAdvice")){
                        return;
                    }
                    for (String key : result.keySet()) {
                        if ("daxinWarning".equals(key) && !"".equals(result.get("daxinWarning").toString())) {
                            AlarmMessageRespDTO alarmRespDTO = new AlarmMessageRespDTO();
                            alarmRespDTO.setId(UUID.randomUUID().toString());
                            alarmRespDTO.setContent(result.get("daxinWarning").toString());//大新预警
                            alarmRespDTO.setAlarmTime(DateUtils.parse(messageJson.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
                            mcsApi.createAlarmMessage(alarmRespDTO);
                        }else if ("jinfengWarning".equals(key) && !"".equals(result.get("jinfengWarning").toString())) {
                            AlarmMessageRespDTO alarmRespDTO = new AlarmMessageRespDTO();
                            alarmRespDTO.setId(UUID.randomUUID().toString());
                            alarmRespDTO.setContent(result.get("jinfengWarning").toString());//锦丰预警
                            alarmRespDTO.setAlarmTime(DateUtils.parse(messageJson.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
                            mcsApi.createAlarmMessage(alarmRespDTO);
                        }else if ("zhuanlu1Warning".equals(key) && !"".equals(result.get("zhuanlu1Warning").toString())) {
                            AlarmMessageRespDTO alarmRespDTO = new AlarmMessageRespDTO();
                            alarmRespDTO.setId(UUID.randomUUID().toString());
                            alarmRespDTO.setContent(result.get("zhuanlu1Warning").toString());//转炉一预警
                            alarmRespDTO.setAlarmTime(DateUtils.parse(messageJson.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
                            mcsApi.createAlarmMessage(alarmRespDTO);
                        }else if ("zhuanlu2Warning".equals(key) && !"".equals(result.get("zhuanlu2Warning").toString())) {
                            AlarmMessageRespDTO alarmRespDTO = new AlarmMessageRespDTO();
                            alarmRespDTO.setId(UUID.randomUUID().toString());
                            alarmRespDTO.setContent(result.get("zhuanlu2Warning").toString());//转炉二预警
                            alarmRespDTO.setAlarmTime(DateUtils.parse(messageJson.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
                            mcsApi.createAlarmMessage(alarmRespDTO);
                        }else if ("jinfengAdvice".equals(key) && !"".equals(result.get("jinfengAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("jinfengAdvice").toString());//锦丰调度建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }else if ("daxinAdvice".equals(key) && !"".equals(result.get("daxinAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("daxinAdvice").toString());//大新调度建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }
                    }
                    break;
                default:
                    break;
            }
        }
    }
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/consumer/ModelPredictFinishConsumer.java
对比新文件
@@ -0,0 +1,117 @@
package com.iailab.module.ansteel.mq.consumer;
import com.alibaba.fastjson.JSONObject;
import com.iailab.framework.common.util.date.DateUtils;
import com.iailab.module.model.api.mcs.McsApi;
import com.iailab.module.model.api.mcs.dto.AlarmConfigRespDTO;
import com.iailab.module.model.api.mcs.dto.AlarmMessageRespDTO;
import com.iailab.module.model.api.mcs.dto.PreDataJsonReqVO;
import com.iailab.module.shasteel.mq.common.constant.CommonConstant;
import com.iailab.module.shasteel.mq.common.constant.RoutingConstant;
import com.iailab.module.shasteel.mq.config.QueuePredictFinishConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 监听预测完成
 *
 * @author PanZhibao
 * @Description
 * @createTime 2024年12月11日
 */
@Slf4j
@Component
public class ModelPredictFinishConsumer {
    @Resource
    private McsApi mcsApi;
    @Resource
    private RabbitTemplate rabbitTemplate;
    /**
     * 监听预测完成,产生预警消息
     *
     * @param message
     */
    @RabbitListener(queues = QueuePredictFinishConfig.QUEUE_NAME)
    public void listen(Message message) {
        try {
            String routingKey = message.getMessageProperties().getReceivedRoutingKey();
            log.info("routingKey:" + routingKey);
            String messageBody = new String(message.getBody());
            log.info("messageBody:" + messageBody);
            JSONObject messageJson = JSONObject.parseObject(messageBody);
            if (CollectionUtils.isEmpty(messageJson)) {
                return;
            }
            List<AlarmConfigRespDTO> configList = mcsApi.listAlarmConfig(new HashMap<String, Object>());
            if (CollectionUtils.isEmpty(configList)) {
                return;
            }
            List<String> outputIdList = new ArrayList<>();
            configList.forEach(item -> {
                outputIdList.add(item.getOutId());
            });
            configList.forEach(item -> {
                PreDataJsonReqVO reqVO = new PreDataJsonReqVO();
                reqVO.setPredictTime(DateUtils.parse(messageJson.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
                reqVO.setOutputIdList(outputIdList);
                Map<String, List<Object[]>> preData = mcsApi.getPreDataCur(reqVO);
                if (CollectionUtils.isEmpty(preData)) {
                    return;
                }
                List<Object[]> result = preData.get(item.getOutId());
                int toIndex = result.size();
                if (toIndex <= 0) {
                    return;
                }
                int fromIndex = result.size() - item.getCompLength();
                List<Object[]> predictList = result.subList(fromIndex, toIndex);
                for (Object[] data : predictList) {
                    BigDecimal dataValue = new BigDecimal(Double.parseDouble(data[1].toString())).setScale(2, BigDecimal.ROUND_HALF_UP);
                    if (!(dataValue.compareTo(item.getLowerLimit()) >= 0 && dataValue.compareTo(item.getUpperLimit()) <= 0)) {
                        AlarmMessageRespDTO alarmMessage = new AlarmMessageRespDTO();
                        alarmMessage.setConfigId(item.getId());
                        if (dataValue.compareTo(item.getLowerLimit()) < 0) {
                            alarmMessage.setAlarmType(CommonConstant.EXCEEDING_LOWER_LIMIT);//超下限
                        } else if (dataValue.compareTo(item.getUpperLimit()) > 0) {
                            alarmMessage.setAlarmType(CommonConstant.EXCEEDING_UPPER_LIMIT);//超上限
                        }
                        alarmMessage.setAlarmTime(DateUtils.parse(data[0].toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
                        StringBuffer sb = new StringBuffer();
                        sb.append(data[0]);
                        sb.append(" ");
                        sb.append(item.getAlarmObj());
                        if ("1".equals(alarmMessage.getAlarmType())) {
                            sb.append(CommonConstant.EXCEEDING_LOWER_LIMIT);
                        } else if ("2".equals(alarmMessage.getAlarmType())) {
                            sb.append(CommonConstant.EXCEEDING_UPPER_LIMIT);
                        }
                        sb.append(dataValue);
                        sb.append(item.getUnit());
                        alarmMessage.setContent(sb.toString());
                        System.out.println("预警消息=" + alarmMessage);
                        rabbitTemplate.convertAndSend(RoutingConstant.EXCHANGE, RoutingConstant.Iailab_Model_Alarm, alarmMessage);
                        break;
                    }
                }
                System.out.println(preData);
            });
        } catch (Exception e) {
            return;
        }
    }
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/mq/package-info.java
对比新文件
@@ -0,0 +1 @@
package com.iailab.module.ansteel.mq;
ansteel-biz/src/main/java/com/iailab/module/ansteel/service/demo/DemoService.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/service/demo/DemoServiceImpl.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/service/package-info.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/util/SecurityUtils.java
文件已删除
ansteel-biz/src/main/java/com/iailab/module/ansteel/util/SpringContextUtils.java
对比新文件
@@ -0,0 +1,47 @@
package com.iailab.module.ansteel.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
 * Spring Context 工具类
 *
 * @author Mark sunlightcs@gmail.com
 */
@Component
public class SpringContextUtils implements ApplicationContextAware {
    public static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        SpringContextUtils.applicationContext = applicationContext;
    }
    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }
    public static <T> T getBean(Class<T> requiredType) {
        return applicationContext.getBean(requiredType);
    }
    public static <T> T getBean(String name, Class<T> requiredType) {
        return applicationContext.getBean(name, requiredType);
    }
    public static boolean containsBean(String name) {
        return applicationContext.containsBean(name);
    }
    public static boolean isSingleton(String name) {
        return applicationContext.isSingleton(name);
    }
    public static Class<? extends Object> getType(String name) {
        return applicationContext.getType(name);
    }
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/util/token/IailabClient.java
对比新文件
@@ -0,0 +1,145 @@
package com.iailab.module.ansteel.util.token;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.util.Base64Utils;
import org.springframework.util.ObjectUtils;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.StandardCharsets;
import java.util.Map;
/**
 * @author PanZhibao
 * @Description
 * @createTime 2024年11月21日
 */
@Slf4j
@Component
public class IailabClient {
    /**
     * 平台地址
     */
    @Value("${iailab.token.base-url}")
    private String BASE_URL;
    /**
     * 租户编号
     */
    @Value("${iailab.token.tenant-id}")
    private String TENANT_ID;
    /**
     * 客户端信息
     */
    @Value("${iailab.token.client-id}")
    private String CLIENT_ID;
    @Value("${iailab.token.client-secret}")
    private String CLIENT_SECRET;
    @Value("${iailab.token.username}")
    private String USERNAME;
    @Value("${iailab.token.password}")
    private String PASSWORD;
    private static final String GRAND_TYPE = "password";
    private static final String SCOPE = "user.read user.write";
    private static final RestTemplate restTemplate = new RestTemplate();
    // 鉴权token
    private String accessToken;
    // 刷新token
    private String refreshToken;
    // 鉴权token过期时间
    private Long expireTime;
    /**
     * 用户名密码方式获取平台token
     */
    private synchronized void authenticate() {
        log.info("获取平台token");
        // 1.1 构建请求头
        HttpHeaders headers = new HttpHeaders();
        addClientHeader(headers);
        // 1.2 构建authenticate请求URL
        String authenticateUrl = BASE_URL + "/oauth2/token?"
                // 密码模式的参数
                + "grant_type=" + GRAND_TYPE
                + "&username=" + USERNAME
                + "&password=" + PASSWORD
                + "&scope=" + SCOPE;
        // 2. 执行请求
        ResponseEntity<Map<String, Object>> exchange = restTemplate.exchange(
                authenticateUrl,
                HttpMethod.POST,
                new org.springframework.http.HttpEntity<>(headers),
                new ParameterizedTypeReference<Map<String, Object>>() {
                });
        Assert.isTrue(exchange.getStatusCode().is2xxSuccessful(), "响应必须是 200 成功");
        log.info(exchange.toString());
        Map<String, Object> authMap = exchange.getBody();
        accessToken = authMap.get("access_token").toString();
        refreshToken = authMap.get("refresh_token").toString();
        expireTime = Long.valueOf(authMap.get("expires_time").toString());
    }
    private synchronized void refreshToken() {
        log.info("刷新token");
        // 1.1 构建请求头
        HttpHeaders headers = new HttpHeaders();
        addClientHeader(headers);
        // 1.2 构建authenticate请求URL
        String authenticateUrl = BASE_URL + "/system/auth/client-refresh-token?refreshToken=" + refreshToken
                + "&clientId=" + CLIENT_ID;
        // 2. 执行请求
        ResponseEntity<Map<String, Object>> exchange = restTemplate.exchange(
                authenticateUrl,
                HttpMethod.POST,
                new org.springframework.http.HttpEntity<>(headers),
                new ParameterizedTypeReference<Map<String, Object>>() {
                });
        Assert.isTrue(exchange.getStatusCode().is2xxSuccessful(), "响应必须是 200 成功");
        Map<String, Object> authMap = exchange.getBody();
        //刷新token过期,重新获取token
        if (!ObjectUtils.isEmpty(authMap.get("code"))) {
            Integer code = Integer.valueOf(authMap.get("code").toString());
            if (code == 401) {
                authenticate();
            }
        } else {
            accessToken = authMap.get("access_token").toString();
            expireTime = Long.valueOf(authMap.get("expires_time").toString());
        }
    }
    private void addClientHeader(HttpHeaders headers) {
        // client 拼接,需要 BASE64 编码
        String client = CLIENT_ID + ":" + CLIENT_SECRET;
        client = Base64Utils.encodeToString(client.getBytes(StandardCharsets.UTF_8));
        headers.add("Authorization", "Basic " + client);
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        headers.set("tenant-id", getTenantId().toString());
    }
    public String getToken() {
        //第一次请求或者token过期,需要重新获取token
        if(ObjectUtils.isEmpty(accessToken)) {
            authenticate();
        } else if (expireTime < System.currentTimeMillis() / 1000) {
            refreshToken();
        }
        return accessToken;
    }
    public Long getTenantId() {
        return Long.valueOf(TENANT_ID);
    }
}