在线补招装置数据

This commit is contained in:
xy
2024-09-29 16:06:26 +08:00
parent f13c8670cb
commit d1574e43be
11 changed files with 315 additions and 31 deletions

View File

@@ -5,6 +5,7 @@ import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil;
import com.njcn.csharmonic.pojo.param.MakeUpParam;
import com.njcn.csharmonic.pojo.vo.MakeUpVo;
import com.njcn.csharmonic.service.OfflineDataUploadService;
import com.njcn.web.controller.BaseController;
@@ -49,6 +50,7 @@ public class OfflineDataUploadController extends BaseController {
@PostMapping(value = "/makeUpData")
@ApiOperation("补招数据-界面")
@ApiImplicitParam(name = "lineId", value = "监测点id", required = true)
@Deprecated
public HttpResult<List<MakeUpVo>> makeUpData(@RequestParam("lineId") String lineId){
String methodDescribe = getMethodDescribe("makeUpData");
List<MakeUpVo> list = offlineDataUploadService.getMakeUpData(lineId);
@@ -70,4 +72,14 @@ public class OfflineDataUploadController extends BaseController {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping(value = "/makeUp")
@ApiOperation("设备补招")
@ApiImplicitParam(name = "param", value = "补招参数", required = true)
public HttpResult<List<MakeUpVo>> makeUp(@RequestBody MakeUpParam param) {
String methodDescribe = getMethodDescribe("makeUp");
offlineDataUploadService.startMakeUpData(param);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}
}

View File

@@ -1,5 +1,6 @@
package com.njcn.csharmonic.service;
import com.njcn.csharmonic.pojo.param.MakeUpParam;
import com.njcn.csharmonic.pojo.vo.MakeUpVo;
import org.springframework.web.multipart.MultipartFile;
@@ -32,4 +33,11 @@ public interface OfflineDataUploadService {
*/
List<MakeUpVo> askDirOrFile(String nDid, String prjName, String path, String fileType);
/**
* 开始装置数据补招
* 根据项目递归获取文件夹下的bin文件区分暂态、稳态存储离线文件的方式调用黄正剑的离线数据补招功能
* @return
*/
void startMakeUpData(MakeUpParam param);
}

View File

@@ -1,15 +1,21 @@
package com.njcn.csharmonic.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.nacos.shaded.com.google.gson.Gson;
import com.github.tocrhz.mqtt.publisher.MqttPublisher;
import com.njcn.access.api.CsTopicFeignClient;
import com.njcn.access.enums.AccessEnum;
import com.njcn.access.enums.TypeEnum;
import com.njcn.access.pojo.RspDataDto;
import com.njcn.access.pojo.dto.CsModelDto;
import com.njcn.access.pojo.dto.ReqAndResDto;
import com.njcn.access.pojo.dto.file.FileDto;
import com.njcn.access.utils.ChannelObjectUtil;
import com.njcn.access.utils.MqttUtil;
import com.njcn.common.config.GeneralInfo;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.csdevice.api.DeviceFtpFeignClient;
import com.njcn.csharmonic.enums.CsHarmonicResponseEnum;
import com.njcn.csharmonic.offline.constant.OfflineConstant;
import com.njcn.csharmonic.offline.log.Log;
import com.njcn.csharmonic.offline.log.vo.NewTaglogbuffer;
@@ -17,9 +23,12 @@ import com.njcn.csharmonic.offline.mincfg.AnalyseComtradeCfg;
import com.njcn.csharmonic.offline.mincfg.tagComtradeCfg;
import com.njcn.csharmonic.offline.vo.Response;
import com.njcn.csharmonic.pojo.dto.MakeUpDto;
import com.njcn.csharmonic.pojo.param.MakeUpParam;
import com.njcn.csharmonic.pojo.vo.MakeUpVo;
import com.njcn.csharmonic.service.OfflineDataUploadService;
import com.njcn.influx.pojo.po.cs.PqdData;
import com.njcn.oss.constant.OssPath;
import com.njcn.oss.utils.FileStorageUtil;
import com.njcn.redis.pojo.enums.AppRedisKey;
import com.njcn.redis.utils.RedisUtil;
import lombok.RequiredArgsConstructor;
@@ -29,17 +38,15 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.*;
import java.nio.file.Files;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
import static com.njcn.access.enums.TypeEnum.DATA_48;
@@ -56,9 +63,14 @@ import static com.njcn.access.enums.TypeEnum.DATA_48;
public class OfflineDataUploadServiceImpl implements OfflineDataUploadService {
private final MqttPublisher publisher;
private final CsTopicFeignClient csTopicFeignClient;
private final RedisUtil redisUtil;
private final ChannelObjectUtil channelObjectUtil;
private final MqttUtil mqttUtil;
private static Integer mid = 1;
private final DeviceFtpFeignClient deviceFtpFeignClient;
private final FileStorageUtil fileStorageUtil;
private final GeneralInfo generalInfo;
@Override
public byte[] uploadAnalysis(List<MultipartFile> files,String type) throws Exception{
@@ -131,7 +143,7 @@ public class OfflineDataUploadServiceImpl implements OfflineDataUploadService {
if (!Objects.isNull(object)) {
// 创建 DateTimeFormatter 对象并指定格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
List<RspDataDto.ProjectInfo> projectInfoList = objectToList(redisUtil.getObjectByKey(key),RspDataDto.ProjectInfo.class);
List<RspDataDto.ProjectInfo> projectInfoList = channelObjectUtil.objectToList(redisUtil.getObjectByKey(key),RspDataDto.ProjectInfo.class);
projectInfoList.forEach(item->{
MakeUpVo vo = new MakeUpVo();
vo.setType("dir");
@@ -143,7 +155,7 @@ public class OfflineDataUploadServiceImpl implements OfflineDataUploadService {
vo.setStartTime(formattedDate);
}
long endTime = item.getPrjTimeEnd();
if (endTime != 0) {
if (endTime != -1) {
LocalDateTime dateTime = Instant.ofEpochMilli(endTime*1000).atZone(ZoneId.systemDefault()).toLocalDateTime();
String formattedDate = dateTime.format(formatter);
vo.setEndTime(formattedDate);
@@ -170,7 +182,7 @@ public class OfflineDataUploadServiceImpl implements OfflineDataUploadService {
String key = AppRedisKey.PROJECT_INFO + nDid;
Object object = redisUtil.getObjectByKey(key);
if (!Objects.isNull(object)) {
List<FileDto.DirInfo> projectInfoList = objectToList(redisUtil.getObjectByKey(key),FileDto.DirInfo.class);
List<FileDto.DirInfo> projectInfoList = channelObjectUtil.objectToList(redisUtil.getObjectByKey(key),FileDto.DirInfo.class);
projectInfoList.forEach(item->{
MakeUpVo vo = new MakeUpVo();
vo.setPrjName(prjName);
@@ -196,6 +208,148 @@ public class OfflineDataUploadServiceImpl implements OfflineDataUploadService {
return result;
}
@Override
public void startMakeUpData(MakeUpParam param) {
List<String> fileList = new ArrayList<>();
Map<String,List<String>> map = new HashMap<>();
//组装文件路径
for (String s : param.getProList()) {
//稳态补招
if (param.getDataTypeList().contains(0)) {
String minPath = s + "/min";
List<FileDto.DirInfo> projectInfoList = getFileList(param.getLineId(),param.getNDid(),minPath);
if (CollectionUtil.isNotEmpty(projectInfoList)) {
projectInfoList.forEach(item->{
String linePath = item.getName();
List<FileDto.DirInfo> lineDataList = getFileList(param.getLineId(),param.getNDid(),linePath);
if (CollectionUtil.isNotEmpty(lineDataList)) {
fileList.addAll(lineDataList.stream().map(FileDto.DirInfo::getName).collect(Collectors.toList()));
}
});
}
}
//暂态补招
if (param.getDataTypeList().contains(1)) {
//事件
String logPath = s + "/log";
List<FileDto.DirInfo> logList = getFileList(param.getLineId(),param.getNDid(),logPath);
if (CollectionUtil.isNotEmpty(logList)) {
fileList.addAll(logList.stream().map(FileDto.DirInfo::getName).collect(Collectors.toList()));
}
//录波文件
String comtradePath = s + "/comtrade";
List<FileDto.DirInfo> comtradeList = getFileList(param.getLineId(),param.getNDid(),comtradePath);
if (CollectionUtil.isNotEmpty(comtradeList)) {
fileList.addAll(comtradeList.stream().map(FileDto.DirInfo::getName).collect(Collectors.toList()));
}
}
if (CollectionUtil.isNotEmpty(fileList)) {
map.put(s,fileList);
}
}
if (CollectionUtil.isNotEmpty(map)) {
map.forEach((k,v)->{
String proName = k.replace("/bd0/cmn/",OssPath.DEV_MAKE_UP_PATH + param.getNDid() + "/");
String key = AppRedisKey.PROJECT_INFO + param.getNDid();
v.forEach(item->{
redisUtil.delete(key);
Object object = redisUtil.getObjectByKey(AppRedisKey.DEVICE_MID + param.getNDid());
if (!Objects.isNull(object)) {
mid = (Integer) object;
}
askFileInfo(param.getNDid(),mid,item);
try {
Thread.sleep(2000);
FileDto.FileInfo info = channelObjectUtil.objectToSingleObject(redisUtil.getObjectByKey(key),FileDto.FileInfo.class);
String path = deviceFtpFeignClient.downloadFile(param.getNDid(),item,info.getFileSize(),info.getFileCheck()).getData();
String lsFile = generalInfo.getBusinessTempPath() + File.separator + item.split(StrUtil.SLASH)[item.split(StrUtil.SLASH).length - 1];
moveFile(path,getFilePath(item,param.getNDid()),lsFile);
//删除临时文件
File file = new File(lsFile);
if (file.exists()) {
file.delete();
}
//删除下载文件
//fileStorageUtil.deleteFile(path);
} catch (Exception e) {
throw new BusinessException(CsHarmonicResponseEnum.MAKE_UP_ERROR);
}
});
//推送消息,按照离线数据方式处理
MakeUpDto.FileInfo dto = new MakeUpDto.FileInfo();
dto.setProName(proName);
dto.setNDid(param.getNDid());
dto.setLineId(param.getLineId());
dto.setFileList(v);
publisher.send("/Web/makeUp/" + param.getLineId(), new Gson().toJson(dto), 1, false);
});
}
}
/**
* 迁移文件
*/
public void moveFile(String oldPath, String newPath, String lsPath) {
try {
InputStream inputStream = fileStorageUtil.getFileStream(oldPath);
FileOutputStream fileOutputStream = new FileOutputStream(lsPath);
// 创建一个缓冲区
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, bytesRead);
}
File src = new File(lsPath);
src.getParentFile().mkdirs();
InputStream is = Files.newInputStream(src.toPath());
fileStorageUtil.uploadStreamSpecifyName(is, OssPath.DEV_MAKE_UP_PATH,newPath);
inputStream.close();
fileOutputStream.close();
is.close();
} catch (Exception e) {
throw new BusinessException(CsHarmonicResponseEnum.MAKE_UP_ERROR);
}
}
/**
* 询问文件信息
*/
public void askFileInfo(String nDid, Integer mid, String fileName) {
String version = csTopicFeignClient.find(nDid).getData();
ReqAndResDto.Req reqAndResParam = new ReqAndResDto.Req();
reqAndResParam.setMid(mid);
reqAndResParam.setDid(0);
reqAndResParam.setPri(AccessEnum.FIRST_CHANNEL.getCode());
reqAndResParam.setType(Integer.parseInt(TypeEnum.TYPE_8.getCode()));
reqAndResParam.setExpire(-1);
String json = "{Name:\""+fileName+"\"}";
JSONObject jsonObject = JSONObject.fromObject(json);
reqAndResParam.setMsg(jsonObject);
log.info("请求文件信息报文:" + new Gson().toJson(reqAndResParam));
publisher.send("/Pfm/DevFileCmd/"+version+"/"+nDid,new Gson().toJson(reqAndResParam),1,false);
}
/**
* 获取文件数据
*/
public List<FileDto.DirInfo> getFileList(String lineId, String nDid, String path) {
String key = AppRedisKey.PROJECT_INFO + nDid;
redisUtil.delete(key);
List<FileDto.DirInfo> result = new ArrayList<>();
askProjectInfo(lineId,nDid, Integer.parseInt(TypeEnum.TYPE_8.getCode()),path,"DevFileCmd");
try {
Thread.sleep(5000);
Object object = redisUtil.getObjectByKey(key);
if (!Objects.isNull(object)) {
result = channelObjectUtil.objectToList(redisUtil.getObjectByKey(key),FileDto.DirInfo.class);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return result;
}
/**
* 询问装置项目信息报文
@@ -235,7 +389,7 @@ public class OfflineDataUploadServiceImpl implements OfflineDataUploadService {
reqAndResParam.setType(8454);
MakeUpDto makeUpDto = new MakeUpDto();
makeUpDto.setClDid(clDid);
makeUpDto.setDataType(Integer.parseInt(TypeEnum.DATA_48.getCode()));
makeUpDto.setDataType(Integer.parseInt(DATA_48.getCode()));
makeUpDto.setDataAttr(0);
makeUpDto.setOperate(1);
makeUpDto.setStartTime(-1);
@@ -251,14 +405,21 @@ public class OfflineDataUploadServiceImpl implements OfflineDataUploadService {
reqAndResParam.setMsg(jsonObject);
}
public <T> List<T> objectToList(Object object, Class<T> clazz) {
List<T> resultList = new ArrayList<>();
if (object instanceof List<?>) {
for (Object o : (List<?>) object) {
resultList.add(clazz.cast(o));
/**
* 调整文件路径
*/
private String getFilePath(String path, String nDid) {
String[] parts = path.split("/");
StringBuilder sb = new StringBuilder();
boolean first = true;
for (int i = 3; i < parts.length; i++) {
if (!first) {
sb.append("/");
}
sb.append(parts[i]);
first = false;
}
return resultList;
return nDid + "/" + sb.toString();
}
}