package com.nari.iot.schedule;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import com.nari.iot.bean.Info_Ai;
import com.nari.iot.bean.IotAirElec;
import com.nari.iot.bean.IotAirInfo;
import com.nari.iot.bean.Message;
import com.nari.iot.common.config.ApplicationContextProvider;
import com.nari.iot.service.IotAirInfoService;
import com.nari.iot.tools.Common;
import com.nari.iot.tools.JsonUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.nari.iot.tools.JedisUtils;
/***
* Quartz设置项目全局的定时任务
* @Component注解的意义 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。一般公共的方法我会用上这个注解
* @author ZMJ
*/
@Component
public class QuartzSchedule {
// @Scheduled(cron = "0 0/1 * * * ?") // 每分钟执行一次
// public void work() throws Exception {
// System.out.println("执行调度任务:"+new Date());
// }
private IotAirInfoService iotAirInfoService = ApplicationContextProvider.getBean(IotAirInfoService.class);
public void saveAirInfo(List<Info_Ai> infoAiList){
if(infoAiList != null && infoAiList.size() > 0){
List<IotAirInfo> infoList = new ArrayList<IotAirInfo>();
Map<String, IotAirInfo> infoMap = new HashMap<String, IotAirInfo>();
for(int i = 0; i< infoAiList.size(); i++){
//获得消息AI实体
Info_Ai infoAi = infoAiList.get(i);
String key = infoAi.getKey();
String name = infoAi.getName();
String value = infoAi.getValue().trim();
String ref_time = infoAi.getRef_time();
//解析AI消息
String[] split = key.split("-"); // m1 1_ai_0
String[] split1 = split[1].split("_"); //1 ai 0
String floor = split[0].substring(1);
String room = split1[0];
String flag = split1[2];
String[] collectArr = key.split("_");
IotAirInfo iotAirInfo = null;
if(infoMap.containsKey(collectArr[0])){
iotAirInfo = infoMap.get(collectArr[0]);
}else{
iotAirInfo = new IotAirInfo();
//封装空调信息实体
iotAirInfo.setUuid(Common.getUUID());
iotAirInfo.setAirFloor(floor);
iotAirInfo.setAirRoom(room);
infoMap.put(collectArr[0], iotAirInfo);
}
if(Integer.parseInt(flag) == 0){
//设置温度值
iotAirInfo.setMakeVal(new BigDecimal(value));
}else if(Integer.parseInt(flag) == 1){
//测量温度值
iotAirInfo.setMeasureVal(new BigDecimal(value));
}else{
//错误代码值
iotAirInfo.setErrorCode(new BigDecimal(value));
}
//转换时间格式
// ref_time = ref_time.replace("Z", " UTC");//注意是空格+UTC
// SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z");//注意格式化的表达式
// Date d = null;
// try {
// d = format.parse(ref_time);
// } catch (ParseException e) {
// e.printStackTrace();
// }
ref_time = ref_time.replace("Z", "").replace("T", " ");//注意是空格+UTC
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parse = null;
try {
parse = sdf.parse(ref_time);
} catch (ParseException e) {
e.printStackTrace();
}
iotAirInfo.setCollectTime(parse);
}
for(String key: infoMap.keySet()){
IotAirInfo iotAirInfo = infoMap.get(key);
if(iotAirInfo.getMeasureVal() == null || iotAirInfo.getMeasureVal().compareTo(BigDecimal.ZERO) == 0
|| iotAirInfo.getMakeVal() == null || iotAirInfo.getMakeVal().compareTo(BigDecimal.ZERO) == 0){
continue;
}
infoList.add(iotAirInfo);
}
if(infoList.size() > 0){
iotAirInfoService.insertInfoBatch(infoList);
}
}
}
public void saveElecInfo(List<Info_Ai> infoAiList){
//循环ai消息,封装空调消息实体类
if(infoAiList != null && infoAiList.size() > 0){
List<IotAirElec> elecList = new ArrayList<IotAirElec>();
for(int i = 0; i< infoAiList.size(); i++){
//获得消息AI实体
Info_Ai infoAi = infoAiList.get(i);
String key = infoAi.getKey();
String name = infoAi.getName();
String value = infoAi.getValue().trim();
String ref_time = infoAi.getRef_time();
//电力数据
IotAirElec iotAirElec = new IotAirElec();
iotAirElec.setUuid(Common.getUUID());
iotAirElec.setQuotaKey(key);
iotAirElec.setQuotaEn(name);
iotAirElec.setMeasureVal(new BigDecimal(value));
//转换时间格式
// ref_time = ref_time.replace("Z", " UTC");//注意是空格+UTC
// SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z");//注意格式化的表达式
// Date d = null;
// try {
// d = format.parse(ref_time);
// } catch (ParseException e) {
// e.printStackTrace();
// }
ref_time = ref_time.replace("Z", "").replace("T", " ");//注意是空格+UTC
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parse = null;
try {
parse = sdf.parse(ref_time);
} catch (ParseException e) {
e.printStackTrace();
}
iotAirElec.setCollectTime(parse);
elecList.add(iotAirElec);
}
if(elecList.size() > 0){
iotAirInfoService.insertElecBatch(elecList);
}
}
}
public void analyMessage(String type){
//获取redis缓存的消息,并且将json映射成bean
String message = JedisUtils.get(type);
Message messageIns = JsonUtils.toBean(message, Message.class);
if(messageIns == null){
return;
}
//循环ai消息,封装空调消息实体类
List<Info_Ai> infoAiList = messageIns.getInfo_ai();
if(Common.CS_IOT_MESSAGE_INFO.equals(type)){
saveAirInfo(infoAiList);
}else if(Common.CS_IOT_MESSAGE_ELEC.equals(type)){
saveElecInfo(infoAiList);
}else if(Common.CS_IOT_MESSAGE_MIX.equals(type)){
List<Info_Ai> infoList = new ArrayList<Info_Ai>();
List<Info_Ai> elecList = new ArrayList<Info_Ai>();
for(int i = 0; i < infoAiList.size(); i++){
Info_Ai infoAi = infoAiList.get(i);
String key = infoAi.getKey();
if(key.indexOf("pi") != -1){
elecList.add(infoAi);
}else{
infoList.add(infoAi);
}
}
saveAirInfo(infoList);
saveElecInfo(elecList);
}
}
@Scheduled(fixedRate = 10000)//每5秒执行一次
public void play() throws Exception {
System.out.println("每10秒执行一个的定时任务:"+new Date());
analyMessage(Common.CS_IOT_MESSAGE_INFO);
analyMessage(Common.CS_IOT_MESSAGE_ELEC);
analyMessage(Common.CS_IOT_MESSAGE_MIX);
}
// @Scheduled(cron = "0/2 * * * * ?") //每2秒执行一次
// public void doSomething() throws Exception {
// System.out.println("每2秒执行一个的定时任务:"+new Date());
// }
// @Scheduled(cron = "0 0 0/1 * * ? ") // 每一小时执行一次
// public void goWork() throws Exception {
// System.out.println("每一小时执行一次的定时任务:"+new Date());
// }
}
这里面涉及到自动注入和json转bean,还有mqtt消息队列的地方,请参考我的其他博客!