机场项目推送扬尘数据
This commit is contained in:
parent
98c61bbb0a
commit
89e37cb627
@ -1,7 +1,10 @@
|
|||||||
package com.zhgd.xmgl.task;
|
package com.zhgd.xmgl.task;
|
||||||
|
import cn.hutool.core.convert.Convert;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.date.DateTime;
|
||||||
import cn.hutool.core.date.DateUnit;
|
import cn.hutool.core.date.DateUnit;
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
@ -14,6 +17,8 @@ import com.zhgd.xmgl.modules.environment.entity.DustNoiseData;
|
|||||||
import com.zhgd.xmgl.modules.environment.entity.EnvironmentDev;
|
import com.zhgd.xmgl.modules.environment.entity.EnvironmentDev;
|
||||||
import com.zhgd.xmgl.modules.environment.mapper.DustNoiseDataMapper;
|
import com.zhgd.xmgl.modules.environment.mapper.DustNoiseDataMapper;
|
||||||
import com.zhgd.xmgl.modules.environment.mapper.EnvironmentDevMapper;
|
import com.zhgd.xmgl.modules.environment.mapper.EnvironmentDevMapper;
|
||||||
|
import com.zhgd.xmgl.modules.environment.service.IDustNoiseDataService;
|
||||||
|
import com.zhgd.xmgl.modules.environment.service.IEnvironmentDevService;
|
||||||
import com.zhgd.xmgl.modules.project.entity.Project;
|
import com.zhgd.xmgl.modules.project.entity.Project;
|
||||||
import com.zhgd.xmgl.modules.project.mapper.ProjectMapper;
|
import com.zhgd.xmgl.modules.project.mapper.ProjectMapper;
|
||||||
import com.zhgd.xmgl.modules.sprayrt.entity.SprayRtDev;
|
import com.zhgd.xmgl.modules.sprayrt.entity.SprayRtDev;
|
||||||
@ -21,16 +26,15 @@ import com.zhgd.xmgl.modules.sprayrt.mapper.SprayRtDevMapper;
|
|||||||
import com.zhgd.xmgl.modules.sprayrt.service.ISprayRtDevService;
|
import com.zhgd.xmgl.modules.sprayrt.service.ISprayRtDevService;
|
||||||
import com.zhgd.xmgl.modules.sprayrt.service.impl.SprayRtDevServiceImpl;
|
import com.zhgd.xmgl.modules.sprayrt.service.impl.SprayRtDevServiceImpl;
|
||||||
import com.zhgd.xmgl.task.dto.EnvironmentDustDataDto;
|
import com.zhgd.xmgl.task.dto.EnvironmentDustDataDto;
|
||||||
import com.zhgd.xmgl.util.AsyncTaskUtil;
|
import com.zhgd.xmgl.util.*;
|
||||||
import com.zhgd.xmgl.util.EnvironmentUtils;
|
import com.zhgd.xmgl.util.jc.JcHttpUtil;
|
||||||
import com.zhgd.xmgl.util.WindDirectionUtils;
|
|
||||||
import com.zhgd.xmgl.util.XiwonUtil;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.javacrumbs.shedlock.core.SchedulerLock;
|
import net.javacrumbs.shedlock.core.SchedulerLock;
|
||||||
import org.apache.commons.lang.math.NumberUtils;
|
import org.apache.commons.lang.math.NumberUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
@ -69,6 +73,15 @@ public class EnvironmentDevTask {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private XiwonUtil xiwonUtil;
|
private XiwonUtil xiwonUtil;
|
||||||
|
@Lazy
|
||||||
|
@Autowired
|
||||||
|
private IEnvironmentDevService environmentDevService;
|
||||||
|
@Lazy
|
||||||
|
@Autowired
|
||||||
|
private IDustNoiseDataService dustNoiseDataService;
|
||||||
|
@Lazy
|
||||||
|
@Autowired
|
||||||
|
private EnvironmentUtil environmentUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 定时调用外部接口拉取设备实时数据
|
* 定时调用外部接口拉取设备实时数据
|
||||||
@ -142,7 +155,6 @@ public class EnvironmentDevTask {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取扬尘数据(携稳) 每5分钟触发任务
|
* 获取扬尘数据(携稳) 每5分钟触发任务
|
||||||
*/
|
*/
|
||||||
@ -252,4 +264,55 @@ public class EnvironmentDevTask {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机场项目推送扬尘
|
||||||
|
*/
|
||||||
|
@SchedulerLock(name = "jcPushDustData", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 3)
|
||||||
|
@Scheduled(cron = "0 0 */1 * * ?")
|
||||||
|
@RequestMapping("jcPushDustData")
|
||||||
|
public void jcPushDustData() {
|
||||||
|
if (!environmentUtil.isBaise()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<EnvironmentDev> devs = environmentDevService.list(new LambdaQueryWrapper<EnvironmentDev>()
|
||||||
|
.eq(EnvironmentDev::getProjectSn, "3224634D940B4F4E866190875279D1BC"));
|
||||||
|
Date now = new Date();
|
||||||
|
DateTime offsetHour = DateUtil.offsetHour(now, -1);
|
||||||
|
ArrayList<JcHttpUtil.SmartDustDataForm> dustDataFormLists = Lists.newArrayList();
|
||||||
|
for (EnvironmentDev dev : devs) {
|
||||||
|
DustNoiseData data = dustNoiseDataService.getOne(new LambdaQueryWrapper<DustNoiseData>()
|
||||||
|
.eq(DustNoiseData::getDeviceId, dev.getDeviceId())
|
||||||
|
.ge(DustNoiseData::getUploadDate,DateUtil.formatDateTime(offsetHour))
|
||||||
|
.le(DustNoiseData::getUploadDate,DateUtil.formatDateTime(now))
|
||||||
|
.orderByDesc(DustNoiseData::getUploadDate).last("limit 1"));
|
||||||
|
if (data != null) {
|
||||||
|
JcHttpUtil.SmartDustDataForm e = new JcHttpUtil.SmartDustDataForm();
|
||||||
|
e.setDustName(dev.getDeviceName());
|
||||||
|
e.setDeviceSn(data.getDeviceId());
|
||||||
|
e.setAccTime(data.getUploadDate());
|
||||||
|
e.setPm25(Convert.toStr(data.getPm25()));
|
||||||
|
e.setPm10(Convert.toStr(data.getPm10()));
|
||||||
|
e.setNoise(Convert.toStr(data.getNoise()));
|
||||||
|
e.setEnvTemp(Convert.toStr(data.getTemperature()));
|
||||||
|
e.setEnvRh(Convert.toStr(data.getHumidity()));
|
||||||
|
if (StringUtils.isNotEmpty(data.getWinddirection())) {
|
||||||
|
e.setWindDirection(JcHttpUtil.getWindDirection(WindDirectionUtils.getWindDirectionName(data.getWinddirection())));
|
||||||
|
}
|
||||||
|
e.setWindSpeed(Convert.toStr(data.getWindspeed()));
|
||||||
|
e.setPushTime(data.getUploadDate());
|
||||||
|
e.setState("1");
|
||||||
|
dustDataFormLists.add(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (CollUtil.isNotEmpty(dustDataFormLists)) {
|
||||||
|
JcHttpUtil.DustData e = new JcHttpUtil.DustData();
|
||||||
|
e.setProjectId(JcHttpUtil.jcProjectId);
|
||||||
|
for (JcHttpUtil.SmartDustDataForm dustDataForm : dustDataFormLists) {
|
||||||
|
dustDataForm.setProjectId(e.getProjectId());
|
||||||
|
}
|
||||||
|
e.setSmartDustDataFormList(dustDataFormLists);
|
||||||
|
JcHttpUtil.jcPushDustData(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
197
src/main/java/com/zhgd/xmgl/util/jc/AESUtil.java
Normal file
197
src/main/java/com/zhgd/xmgl/util/jc/AESUtil.java
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
package com.zhgd.xmgl.util.jc;
|
||||||
|
|
||||||
|
import cn.hutool.core.codec.Base64Decoder;
|
||||||
|
import cn.hutool.core.codec.Base64Encoder;
|
||||||
|
import org.apache.commons.codec.DecoderException;
|
||||||
|
import org.apache.commons.codec.binary.Base64;
|
||||||
|
import org.apache.commons.codec.binary.Hex;
|
||||||
|
|
||||||
|
import javax.crypto.BadPaddingException;
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.IllegalBlockSizeException;
|
||||||
|
import javax.crypto.NoSuchPaddingException;
|
||||||
|
import javax.crypto.SecretKey;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.InvalidKeyException;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ClassName AESUtil
|
||||||
|
* @Description TODO
|
||||||
|
* @Author 801058
|
||||||
|
* @Date 2022/10/17 11:11
|
||||||
|
*/
|
||||||
|
public class AESUtil {
|
||||||
|
// 身份证号,手机号等数据加密
|
||||||
|
public static final String SECRET = "smart-constructs";
|
||||||
|
|
||||||
|
// 身份证号机密key新改
|
||||||
|
public static final String SECRET_ID_CARD = "JADD@#KWEII37421@$";
|
||||||
|
|
||||||
|
// 工区加密
|
||||||
|
public static final String WORK_SECRET = "smart-secret-001";
|
||||||
|
|
||||||
|
|
||||||
|
// 加密
|
||||||
|
public static String Encrypt(String sSrc, String sKey) throws Exception {
|
||||||
|
if (sKey == null) {
|
||||||
|
sKey = SECRET;
|
||||||
|
}
|
||||||
|
// 判断Key是否为16位
|
||||||
|
if (sKey.length() != 16) {
|
||||||
|
System.out.print("Key长度不是16位");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
byte[] raw = sKey.getBytes(StandardCharsets.UTF_8);
|
||||||
|
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
|
||||||
|
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
|
||||||
|
byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
|
||||||
|
|
||||||
|
return new Base64().encodeToString(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解密
|
||||||
|
public static String Decrypt(String sSrc, String sKey) throws Exception {
|
||||||
|
try {
|
||||||
|
// 判断Key是否正确
|
||||||
|
if (sKey == null) {
|
||||||
|
System.out.print("Key为空null");
|
||||||
|
return sSrc;
|
||||||
|
}
|
||||||
|
// 判断Key是否为16位
|
||||||
|
if (sKey.length() != 16) {
|
||||||
|
System.out.print("Key长度不是16位");
|
||||||
|
return sSrc;
|
||||||
|
}
|
||||||
|
byte[] raw = sKey.getBytes("utf-8");
|
||||||
|
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
|
||||||
|
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
|
||||||
|
byte[] encrypted1 = new Base64().decode(sSrc);//先用base64解密
|
||||||
|
try {
|
||||||
|
byte[] original = cipher.doFinal(encrypted1);
|
||||||
|
String originalString = new String(original,"utf-8");
|
||||||
|
return originalString;
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println(e.toString());
|
||||||
|
return sSrc;
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
System.out.println(ex.toString());
|
||||||
|
return sSrc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加密
|
||||||
|
*
|
||||||
|
* @param password 密码值
|
||||||
|
* @param strKey 加密key
|
||||||
|
* @return 加密后的值
|
||||||
|
*/
|
||||||
|
public static String aes_encrypt(String password, String strKey) {
|
||||||
|
try {
|
||||||
|
SecretKey key = generateMySQLAESKey(strKey, "ASCII");
|
||||||
|
Cipher cipher = Cipher.getInstance("AES");
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, key);
|
||||||
|
byte[] cleartext = password.getBytes("UTF-8");
|
||||||
|
byte[] ciphertextBytes = cipher.doFinal(cleartext);
|
||||||
|
return new String(Hex.encodeHex(ciphertextBytes));
|
||||||
|
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (NoSuchPaddingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (InvalidKeyException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IllegalBlockSizeException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (BadPaddingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解密
|
||||||
|
*
|
||||||
|
* @param content 加密后的内容
|
||||||
|
* @param aesKey 加密key
|
||||||
|
* @return 解密后的内容
|
||||||
|
*/
|
||||||
|
public static String aes_decrypt(String content, String aesKey) {
|
||||||
|
try {
|
||||||
|
SecretKey key = generateMySQLAESKey(aesKey, "ASCII");
|
||||||
|
Cipher cipher = Cipher.getInstance("AES");
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, key);
|
||||||
|
byte[] cleartext = Hex.decodeHex(content.toCharArray());
|
||||||
|
byte[] ciphertextBytes = cipher.doFinal(cleartext);
|
||||||
|
return new String(ciphertextBytes, "UTF-8");
|
||||||
|
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (NoSuchPaddingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (InvalidKeyException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IllegalBlockSizeException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (BadPaddingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (DecoderException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成加密key
|
||||||
|
*
|
||||||
|
* @param key key
|
||||||
|
* @param encoding 编码格式
|
||||||
|
* @return SecretKeySpec
|
||||||
|
*/
|
||||||
|
public static SecretKeySpec generateMySQLAESKey(final String key, final String encoding) {
|
||||||
|
try {
|
||||||
|
final byte[] finalKey = new byte[16];
|
||||||
|
int i = 0;
|
||||||
|
for (byte b : key.getBytes(encoding))
|
||||||
|
finalKey[i++ % 16] ^= b;
|
||||||
|
return new SecretKeySpec(finalKey, "AES");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// public static void main(String[] args) throws Exception {
|
||||||
|
// /*
|
||||||
|
// * 此处使用AES-128-ECB加密模式,key需要为16位。
|
||||||
|
// */
|
||||||
|
// // 需要加密的字串
|
||||||
|
// String cSrc = "test加密123456";
|
||||||
|
// System.out.println(cSrc);
|
||||||
|
// // 加密
|
||||||
|
// String enString = AESUtil.Encrypt(cSrc, SECRET);
|
||||||
|
// System.out.println("加密后的字串是:" + enString);
|
||||||
|
//
|
||||||
|
// // 解密
|
||||||
|
// String DeString = AESUtil.Decrypt(enString, SECRET);
|
||||||
|
// System.out.println("解密后的字串是:" + DeString);
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
System.out.println(Decrypt("e975b4a1d243a354cb4784f0c3fb973401f9972ee3f9888b2d1c00d0d03406", SECRET));
|
||||||
|
|
||||||
|
System.out.println(new String(Base64Decoder.decode("e975b4a1d243a354cb4784f0c3fb973401f9972ee3f9888b2d1c00d0d03406")));
|
||||||
|
}
|
||||||
|
}
|
||||||
79
src/main/java/com/zhgd/xmgl/util/jc/CqHdyHttpSignature.java
Normal file
79
src/main/java/com/zhgd/xmgl/util/jc/CqHdyHttpSignature.java
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
package com.zhgd.xmgl.util.jc;
|
||||||
|
|
||||||
|
import cn.hutool.core.codec.Base64Encoder;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import javax.crypto.Mac;
|
||||||
|
import javax.crypto.SecretKey;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
|
||||||
|
public class CqHdyHttpSignature {
|
||||||
|
|
||||||
|
private static final String MAC_NAME = "HmacSHA1";
|
||||||
|
private static final String ENCODING = "UTF-8";
|
||||||
|
private static final String SIGNATURE_TPL = "ts=${ts}&ttl=${ttl}&uid=${uid}";
|
||||||
|
private static final String uid="fawkes";
|
||||||
|
private static final int ttl=1800;
|
||||||
|
|
||||||
|
// 请联系接口提供方提供秘钥值
|
||||||
|
private static final String CLIENT_SECRET="fawkes_secret";
|
||||||
|
|
||||||
|
public static byte[] HmacSHA1Encrypt(String encryptText, String encryptKey) {
|
||||||
|
try {
|
||||||
|
byte[] data = encryptKey.getBytes(ENCODING);
|
||||||
|
// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
|
||||||
|
SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
|
||||||
|
// 生成一个指定 Mac 算法 的 Mac 对象
|
||||||
|
Mac mac = Mac.getInstance(MAC_NAME);
|
||||||
|
// 用给定密钥初始化 Mac 对象
|
||||||
|
mac.init(secretKey);
|
||||||
|
byte[] text = encryptText.getBytes(ENCODING);
|
||||||
|
// 完成 Mac 操作
|
||||||
|
return mac.doFinal(text);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 演示方法
|
||||||
|
* @param args
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println("请在url后拼接该字符串: ?" + getSignParams());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String getSignParams() {
|
||||||
|
try {
|
||||||
|
String signStr = SIGNATURE_TPL.replace("${ts}", (System.currentTimeMillis()+"").substring(0,10))
|
||||||
|
.replace("${ttl}", ttl + "")
|
||||||
|
.replace("${uid}", uid).toString();
|
||||||
|
String signParams = Base64Encoder.encode(HmacSHA1Encrypt(signStr, CLIENT_SECRET));
|
||||||
|
signParams = URLEncoder.encode(signParams, "utf-8");
|
||||||
|
return "sign=" + signParams + "&" + signStr;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@Data
|
||||||
|
public static class SignatureData {
|
||||||
|
private String sign;
|
||||||
|
private long ts;
|
||||||
|
private int ttl;
|
||||||
|
private String uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
128
src/main/java/com/zhgd/xmgl/util/jc/JcHttpUtil.java
Normal file
128
src/main/java/com/zhgd/xmgl/util/jc/JcHttpUtil.java
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
package com.zhgd.xmgl.util.jc;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.URLUtil;
|
||||||
|
import cn.hutool.http.HttpRequest;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.gexin.fastjson.JSON;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class JcHttpUtil {
|
||||||
|
public static String jcUrl;
|
||||||
|
public static String jcProjectId;
|
||||||
|
|
||||||
|
@Value("${jcUrl:http://bim.szairport.com:58001}")
|
||||||
|
public void setJcUrl(String jcUrl) {
|
||||||
|
JcHttpUtil.jcUrl = jcUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Value("${jcProjectId:1941334582112555010}")
|
||||||
|
public void setJcProjectId(String jcProjectId) {
|
||||||
|
JcHttpUtil.jcProjectId = jcProjectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Integer getWindDirection(String windDirectionName) {
|
||||||
|
if (windDirectionName == null || windDirectionName.trim().isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// 去除首尾空格
|
||||||
|
String direction = windDirectionName.trim();
|
||||||
|
// 使用HashMap建立映射关系
|
||||||
|
Map<String, Integer> directionMap = new HashMap<>();
|
||||||
|
directionMap.put("东北偏北", 0);
|
||||||
|
directionMap.put("东北", 1);
|
||||||
|
directionMap.put("东北偏东", 2);
|
||||||
|
directionMap.put("东", 3);
|
||||||
|
directionMap.put("东南偏东", 4);
|
||||||
|
directionMap.put("东南", 5);
|
||||||
|
directionMap.put("东南偏南", 6);
|
||||||
|
directionMap.put("南", 7);
|
||||||
|
directionMap.put("西南偏南", 8);
|
||||||
|
directionMap.put("西南", 9);
|
||||||
|
directionMap.put("西南偏西", 10);
|
||||||
|
directionMap.put("西", 11);
|
||||||
|
directionMap.put("西北偏西", 12);
|
||||||
|
directionMap.put("西北", 13);
|
||||||
|
directionMap.put("西北偏北", 14);
|
||||||
|
directionMap.put("北", 15);
|
||||||
|
|
||||||
|
// 精确匹配
|
||||||
|
if (directionMap.containsKey(direction)) {
|
||||||
|
return directionMap.get(direction);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 机场项目推送实时环境数据
|
||||||
|
*
|
||||||
|
* @param dustData
|
||||||
|
*/
|
||||||
|
public static void jcPushDustData(JcHttpUtil.DustData dustData) {
|
||||||
|
String url = JcHttpUtil.jcUrl + "/api/smart-site/remote/dust/sync?" + CqHdyHttpSignature.getSignParams();
|
||||||
|
log.info("机场项目推送实时环境数据,url:{}", url);
|
||||||
|
String body = JSON.toJSONString(dustData);
|
||||||
|
log.info("机场项目推送实时环境数据,body:{}", body);
|
||||||
|
String result = HttpRequest.post(url).body(body).execute().body();
|
||||||
|
log.info("机场项目推送实时环境数据,rs:{}", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class DustData {
|
||||||
|
private String projectId;
|
||||||
|
private List<SmartDustDataForm> smartDustDataFormList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class SmartDustDataForm {
|
||||||
|
/*
|
||||||
|
projectId String 项目id(请联系接口提供方获取)
|
||||||
|
smartDustDataFormList List 列表名称(字段如下)
|
||||||
|
dustId String 环境监测设备id
|
||||||
|
dustName String 环境监测名称
|
||||||
|
deviceSn String 环境监测设备sn
|
||||||
|
accTime String 环境监测数据采集时间(yyyy-MM-dd HH:mm:ss)
|
||||||
|
pm25 String
|
||||||
|
pm10 String
|
||||||
|
noise String 噪音
|
||||||
|
envTemp String 环境温度
|
||||||
|
envRh String 环境湿度
|
||||||
|
windDirection Integer 风向(具体参考下面所对应的字典)
|
||||||
|
windSpeed String 风速
|
||||||
|
projectId Integer 项目id
|
||||||
|
orgId String 推送方id
|
||||||
|
pushTime String 推送数据的时间
|
||||||
|
muddy String 浊度
|
||||||
|
state String State 0:离线 1:在线
|
||||||
|
*/
|
||||||
|
private Object dustId;
|
||||||
|
private String dustName;
|
||||||
|
private String deviceSn;
|
||||||
|
private String accTime;
|
||||||
|
private String pm25;
|
||||||
|
private String pm10;
|
||||||
|
private String noise;
|
||||||
|
private String envTemp;
|
||||||
|
private String envRh;
|
||||||
|
private Integer windDirection;
|
||||||
|
private String windSpeed;
|
||||||
|
private String projectId;
|
||||||
|
private Object orgId;
|
||||||
|
private String pushTime;
|
||||||
|
private Object muddy;
|
||||||
|
private String state;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
76
src/test/java/com/zhgd/xmgl/task/EnvironmentDevTaskTest.java
Normal file
76
src/test/java/com/zhgd/xmgl/task/EnvironmentDevTaskTest.java
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
package com.zhgd.xmgl.task;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.MybatisConfiguration;
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
|
||||||
|
import com.zhgd.xmgl.modules.environment.entity.DustNoiseData;
|
||||||
|
import com.zhgd.xmgl.modules.environment.entity.EnvironmentDev;
|
||||||
|
import com.zhgd.xmgl.modules.environment.service.IDustNoiseDataService;
|
||||||
|
import com.zhgd.xmgl.modules.environment.service.IEnvironmentDevService;
|
||||||
|
import com.zhgd.xmgl.util.EnvironmentUtil;
|
||||||
|
import org.apache.ibatis.builder.MapperBuilderAssistant;
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.mockito.InjectMocks;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
|
@ExtendWith(MockitoExtension.class)
|
||||||
|
class EnvironmentDevTaskTest {
|
||||||
|
@Mock
|
||||||
|
private EnvironmentUtil environmentUtil;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private IEnvironmentDevService environmentDevService;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private IDustNoiseDataService dustNoiseDataService;
|
||||||
|
|
||||||
|
@InjectMocks
|
||||||
|
private EnvironmentDevTask controller; // 替换为你的控制器类名
|
||||||
|
|
||||||
|
// 在类加载时初始化 TableInfo(静态方法)
|
||||||
|
@BeforeAll
|
||||||
|
static void initMybatisPlus() {
|
||||||
|
TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), DustNoiseData.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testJcPushDusatData() {
|
||||||
|
// 1. 模拟环境检查通过
|
||||||
|
when(environmentUtil.isBaise()).thenReturn(true);
|
||||||
|
|
||||||
|
// 2. 模拟有设备数据
|
||||||
|
EnvironmentDev mockDev = new EnvironmentDev();
|
||||||
|
mockDev.setDeviceId("YC30625PSP");
|
||||||
|
mockDev.setDeviceName("三跑道环境监测设备");
|
||||||
|
mockDev.setProjectSn("3224634D940B4F4E866190875279D1BC");
|
||||||
|
|
||||||
|
when(environmentDevService.list(any())).thenReturn(Collections.singletonList(mockDev));
|
||||||
|
// 3. 模拟有扬尘数据
|
||||||
|
DustNoiseData mockData = new DustNoiseData();
|
||||||
|
mockData.setDeviceId("YC30625PSP");
|
||||||
|
mockData.setUploadDate("2025-12-04 13:16:12");
|
||||||
|
mockData.setPm25(13.0);
|
||||||
|
mockData.setPm10(15.0);
|
||||||
|
mockData.setNoise(69.0);
|
||||||
|
mockData.setTemperature(25.0);
|
||||||
|
mockData.setHumidity(55.0);
|
||||||
|
mockData.setWinddirection("东北");
|
||||||
|
mockData.setWindspeed(3.0);
|
||||||
|
when(dustNoiseDataService.getOne(any())).thenReturn(mockData);
|
||||||
|
|
||||||
|
// 4. 执行方法
|
||||||
|
controller.jcPushDustData();
|
||||||
|
|
||||||
|
// 5. 验证基本调用
|
||||||
|
verify(environmentUtil).isBaise();
|
||||||
|
verify(environmentDevService).list(any());
|
||||||
|
verify(dustNoiseDataService).getOne(any());
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user