1.台账模块新增字段迁移微服务

This commit is contained in:
2023-08-28 16:28:32 +08:00
parent 04960a3911
commit e52c123d2a
13 changed files with 321 additions and 28 deletions

View File

@@ -12,6 +12,9 @@ import java.util.regex.Pattern;
*/ */
public class Sm4Utils public class Sm4Utils
{ {
//全局秘钥
public final static String globalSecretKey = "11HDESaAhiHHug2z";
private String secretKey = ""; private String secretKey = "";
private String iv = ""; private String iv = "";

View File

@@ -0,0 +1,150 @@
package com.njcn.common.utils.sm;
import lombok.extern.slf4j.Slf4j;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
*字符串 DESede(3DES) 加密
* ECB模式/使用PKCS7方式填充不足位,目前给的密钥是192位
* 3DES即Triple DES是DES向AES过渡的加密算法1999年NIST将3-DES指定为过渡的
* 加密标准是DES的一个更安全的变形。它以DES为基本模块通过组合分组方法设计出分组加
* 密算法其具体实现如下设Ek()和Dk()代表DES算法的加密和解密过程K代表DES算法使用的
* 密钥P代表明文C代表密表这样
* 3DES加密过程为C=Ek3(Dk2(Ek1(P)))
* 3DES解密过程为P=Dk1((EK2(Dk3(C)))
* @date 2023/8/28
*/
@Slf4j
public class ThreeDesUtil {
/**
* @param args在java中调用sun公司提供的3DES加密解密算法时需要使
* 用到$JAVA_HOME/jre/lib/目录下如下的4个jar包
*jce.jar
*security/US_export_policy.jar
*security/local_policy.jar
*ext/sunjce_provider.jar
*定义加密算法,可用 DES,DESede,Blowfish
*/
private static final String Algorithm = "DESede";
// 24字节的密钥
private static final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58, (byte) 0x88, 0x10,
0x40, 0x38, 0x28, 0x25, 0x79, 0x51, (byte) 0xCB, (byte) 0xDD,
0x55, 0x66, 0x77, 0x29, 0x74, (byte) 0x98, 0x30, 0x40, 0x36,
(byte) 0xE2 };
//keybyte为加密密钥长度为24字节
//src为被加密的数据缓冲区
public static byte[] encryptMode(byte[] keybyte,byte[] src){
try {
//生成密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//加密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
//在单一方面的加密或解密
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
log.error(e1.getMessage());
}catch(javax.crypto.NoSuchPaddingException e2){
log.error(e2.getMessage());
}catch(Exception e3){
log.error(e3.getMessage());
}
return null;
}
//keybyte为加密密钥长度为24字节
//src为解密后的缓冲区
public static byte[] decryptMode(byte[] keybyte,byte[] src){
try {
//生成密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
//解密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
log.error(e1.getMessage());
}catch(javax.crypto.NoSuchPaddingException e2){
log.error(e2.getMessage());
}catch(Exception e3){
log.error(e3.getMessage());
}
return null;
}
//转换成十六进制字符串
public static String byte2Hex(byte[] b){
String hs="";
String stmp="";
for(int n=0; n<b.length; n++){
stmp = (Integer.toHexString(b[n]& 0XFF));
if(stmp.length()==1){
hs = hs + "0" + stmp;
}else{
hs = hs + stmp;
}
if(n<b.length-1) {
hs=hs+":";
}
}
return hs.toUpperCase();
}
//对数据进行3des加密
public static String encryptThreeDes_64(String str){
byte[] encoded = encryptMode(keyBytes, str.getBytes());
return (new sun.misc.BASE64Encoder()).encode(encoded);
}
//字节码转换成16进制字符串
public static String byte2hex(byte bytes[]){
StringBuffer retString = new StringBuffer();
for (int i = 0; i < bytes.length; ++i)
{
retString.append(Integer.toHexString(0x0100 + (bytes[i] & 0x00FF)).substring(1).toUpperCase());
}
return retString.toString();
}
//将16进制字符串转换成字节码
public static byte[] hex2byte(String hex) {
byte[] bts = new byte[hex.length() / 2];
for (int i = 0; i < bts.length; i++) {
bts[i] = (byte) Integer.parseInt(hex.substring(2*i, 2*i+2), 16);
}
return bts;
}
//对Cookie进行加密
public static String encryptThreeDes(String strencoded){
byte[] encoded = encryptMode(keyBytes, strencoded.getBytes());
return byte2hex(encoded);
}
//对Cookie进行解密
public static String decryptThreeDes(String strdecrypt){
byte[] decrypt = decryptMode(keyBytes,hex2byte(strdecrypt));
return new String(decrypt);
}
//判断数据完整性
public static Boolean hex(String psw,String strkey){
boolean flag=true;
String key =encryptThreeDes_64(strkey);
if(!psw.equals(key)) {
flag=false;
}
return flag;
}
}

View File

@@ -9,4 +9,10 @@ public interface BusinessResource {
* App * App
*/ */
String APP_RESOURCE = "APP"; String APP_RESOURCE = "APP";
/***
* Web
*/
String WEB_RESOURCE = "WEB";
} }

View File

@@ -23,6 +23,14 @@ public interface BusinessTopic {
String NJCN_APP_WARN_TOPIC = "njcnAppWarnTopic"; String NJCN_APP_WARN_TOPIC = "njcnAppWarnTopic";
/********************************数据中心*********************************/
String RMP_EVENT_DETAIL_TOPIC = "rmpEventDetailTopic";
interface AppDataTag { interface AppDataTag {
/** /**

View File

@@ -0,0 +1,20 @@
package com.njcn.mq.message;
import com.njcn.middle.rocket.domain.BaseMessage;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* pqs
*
* @author cdf
* @date 2023/8/24
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class RmpEventDetailMessage extends BaseMessage {
private List<String> eventIds;
}

View File

@@ -0,0 +1,28 @@
package com.njcn.mq.template;
import com.njcn.middle.rocket.template.RocketMQEnhanceTemplate;
import com.njcn.mq.constant.BusinessResource;
import com.njcn.mq.constant.BusinessTopic;
import com.njcn.mq.message.AppEventMessage;
import com.njcn.mq.message.RmpEventDetailMessage;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.stereotype.Component;
/**
* pqs
*
* @author cdf
* @date 2023/8/24
*/
@Component
public class RmpEventDetailMessageTemplate extends RocketMQEnhanceTemplate {
public RmpEventDetailMessageTemplate(RocketMQTemplate template) {
super(template);
}
public SendResult sendEventDetail(RmpEventDetailMessage rmpEventDetailMessage) {
rmpEventDetailMessage.setSource(BusinessResource.WEB_RESOURCE);
return send(BusinessTopic.RMP_EVENT_DETAIL_TOPIC, rmpEventDetailMessage);
}
}

View File

@@ -117,6 +117,18 @@ public class DeviceParam {
@ApiModelProperty(name = "sim",value = "装置sim卡号") @ApiModelProperty(name = "sim",value = "装置sim卡号")
private String sim; private String sim;
@ApiModelProperty(name = "devSeries",value = "装置系列")
private String devSeries;
@ApiModelProperty(name = "devLocation",value = "监测装置安装位置")
private String devLocation;
@ApiModelProperty(name = "devNo",value = "监测厂家设备编号")
private String devNo;
@ApiModelProperty(name = "isAlarm",value = "告警功能 0:关闭 null、1:开启")
private Integer isAlarm;
@ApiModelProperty(name = "sort",value = "排序",required = true) @ApiModelProperty(name = "sort",value = "排序",required = true)
@NotNull(message = "排序不可为空") @NotNull(message = "排序不可为空")
@Min(value = 0,message = "排序格式有误") @Min(value = 0,message = "排序格式有误")

View File

@@ -142,14 +142,12 @@ public class LineParam {
* 电压上偏差限值 * 电压上偏差限值
*/ */
@ApiModelProperty(name = "voltageDev",value = "电压上偏差限值",required = true) @ApiModelProperty(name = "voltageDev",value = "电压上偏差限值",required = true)
@NotNull(message = "电压上偏差限值不能为空")
private Float voltageDev; private Float voltageDev;
/** /**
* 电压下偏差限值 * 电压下偏差限值
*/ */
@ApiModelProperty(name = "uvoltageDev",value = "电压下偏差限值",required = true) @ApiModelProperty(name = "uvoltageDev",value = "电压下偏差限值",required = true)
@NotNull(message = "电压下偏差限值不能为空")
private Float uvoltageDev; private Float uvoltageDev;
@ApiModelProperty(name = "powerSubstationName",value = "电网侧变电站") @ApiModelProperty(name = "powerSubstationName",value = "电网侧变电站")
@@ -164,6 +162,9 @@ public class LineParam {
@ApiModelProperty(name = "superiorsSubstation",value = "上级电站") @ApiModelProperty(name = "superiorsSubstation",value = "上级电站")
private String superiorsSubstation; private String superiorsSubstation;
@ApiModelProperty(name = "statFlag",value = "是否参与报告统计 0.不参与 1.参与")
private Integer statFlag;
@ApiModelProperty(name = "hangLine",value = "挂接线路") @ApiModelProperty(name = "hangLine",value = "挂接线路")
private String hangLine; private String hangLine;

View File

@@ -1,6 +1,7 @@
package com.njcn.device.pq.pojo.po; package com.njcn.device.pq.pojo.po;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
@@ -136,4 +137,28 @@ public class Device implements Serializable{
*/ */
private String sim; private String sim;
/**
* 装置系列
*/
private String devSeries;
/**
* 监测装置安装位置
*/
private String devLocation;
/**
* 监测厂家设备编号
*/
private String devNo;
/**
* 告警功能 0:关闭 null、1:开启
*/
private Integer isAlarm;
} }

View File

@@ -125,6 +125,7 @@ public class LineDetail{
private String remark; private String remark;
/** /**
* 电网侧变电站 * 电网侧变电站
*/ */

View File

@@ -109,6 +109,19 @@ public class DeviceVO implements Serializable {
@ApiModelProperty(name = "sim",value = "装置sim卡") @ApiModelProperty(name = "sim",value = "装置sim卡")
private String sim; private String sim;
@ApiModelProperty(name = "devSeries",value = "装置系列")
private String devSeries;
@ApiModelProperty(name = "devLocation",value = "监测装置安装位置")
private String devLocation;
@ApiModelProperty(name = "devNo",value = "监测厂家设备编号")
private String devNo;
@ApiModelProperty(name = "isAlarm",value = "告警功能 0:关闭 null、1:开启")
private Integer isAlarm;
@ApiModelProperty(name = "sort",value = "排序",required = true) @ApiModelProperty(name = "sort",value = "排序",required = true)
private Integer sort; private Integer sort;

View File

@@ -12,6 +12,7 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.common.config.GeneralInfo;
import com.njcn.common.pojo.dto.SimpleDTO; import com.njcn.common.pojo.dto.SimpleDTO;
import com.njcn.common.pojo.enums.common.DataStateEnum; import com.njcn.common.pojo.enums.common.DataStateEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.enums.response.CommonResponseEnum;
@@ -107,6 +108,8 @@ public class TerminalBaseServiceImpl extends ServiceImpl<LineMapper, Line> imple
private final FileStorageUtil fileStorageUtil; private final FileStorageUtil fileStorageUtil;
private final GeneralInfo generalInfo;
/** /**
* 终端新增操作 * 终端新增操作
@@ -254,6 +257,9 @@ public class TerminalBaseServiceImpl extends ServiceImpl<LineMapper, Line> imple
deviceDetail.setNextTimeCheck(PubUtils.localDateFormat(deviceParam.getNextTimeCheck())); deviceDetail.setNextTimeCheck(PubUtils.localDateFormat(deviceParam.getNextTimeCheck()));
deviceDetail.setLoginTime(PubUtils.localDateFormat(deviceParam.getNextTimeCheck())); deviceDetail.setLoginTime(PubUtils.localDateFormat(deviceParam.getNextTimeCheck()));
deviceDetail.setUpdateTime(LocalDateTime.now()); deviceDetail.setUpdateTime(LocalDateTime.now());
//处理装置识别码秘钥
deviceMapper.insert(deviceDetail); deviceMapper.insert(deviceDetail);
//装置功能 //装置功能
List<DictData> funList = dicDataFeignClient.getDicDataByTypeName(DicDataTypeEnum.DEV_FUN.getName()).getData(); List<DictData> funList = dicDataFeignClient.getDicDataByTypeName(DicDataTypeEnum.DEV_FUN.getName()).getData();

View File

@@ -1,5 +1,9 @@
package com.njcn.device.pq.utils; package com.njcn.device.pq.utils;
import com.njcn.common.utils.sm.Sm4Utils;
import com.njcn.common.utils.sm.ThreeDesUtil;
import org.apache.commons.codec.binary.Base64;
/** /**
* pqs * pqs
* *
@@ -8,35 +12,51 @@ package com.njcn.device.pq.utils;
*/ */
public class DeviceUtil { public class DeviceUtil {
/** /**
* 根据电压大小获取基准容量 * cd 系统配置的解密方式
* * content 需要解密的内容
* 解密对应内容
* @author cdf * @author cdf
* @date 2021/7/19 * @date 2021/10/12
*/ */
public static Float getJCAPByScale(String sacleName) { public static String decoderString(Integer cd,String content){
if (sacleName.equals("6kV") || sacleName.equals("10kV")) { String seriesTmp = null;
return 100f; if (cd == 0) {
} else if (sacleName.equals("20kV")) { seriesTmp = Base64.decodeBase64(content).toString();
return 200f; } else if (cd == 1) {
} else if (sacleName.equals("35kV")) { seriesTmp = ThreeDesUtil.decryptThreeDes(content);
return 250f; } else if (cd == 2) {
} else if (sacleName.equals("66kV")) { //SM4加密密码
return 500f; String secretkey = Sm4Utils.globalSecretKey;
} else if (sacleName.equals("110kV")) { Sm4Utils sm4 = new Sm4Utils(secretkey);
return 750f; seriesTmp = sm4.decryptData_ECB(content);
} else if (sacleName.equals("220kV")) {
return 2000f;
} else if (sacleName.equals("330kV")) {
return 3000f;
} else if (sacleName.equals("500kV")) {
return 4500f;
} else if (sacleName.equals("750kV")) {
return 7000f;
} else if (sacleName.equals("1000kV")) {
return 9000f;
} else {
return 10f;
} }
return seriesTmp;
} }
/**
*
* cd 系统配置的加密方式
* content 需要加密的内容
* 加密对应内容
* @author cdf
* @date 2021/10/12
*/
public static String encodeString(Integer cd,String content){
String key = null;
if (cd == 0) {
key = Base64.encodeBase64String(content.getBytes());
} else if (cd == 1) {
key = ThreeDesUtil.encryptThreeDes(content);
} else if (cd == 2) {
//SM4加密密码
String secretkey = Sm4Utils.globalSecretKey;
Sm4Utils sm4 = new Sm4Utils(secretkey);
key = sm4.encryptData_ECB(content);
}
return key;
}
} }