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); } }