package com.dji.sample.territory.service.impl;
|
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.dynamic.datasource.annotation.DS;
|
import com.dji.sample.media.model.MediaFileEntity;
|
import com.dji.sample.patches.config.pojo.PatchesConfigPojo;
|
import com.dji.sample.patches.model.entity.LotInfo;
|
import com.dji.sample.territory.dao.ITbFjMapper;
|
import com.dji.sample.territory.model.entity.TbFjEntity;
|
import com.dji.sample.territory.service.ITbFJService;
|
import com.dji.sample.territory.utils.HashUtil;
|
import com.dji.sample.territory.utils.Sm3Util;
|
import com.dji.sample.territory.utils.VideoZipUtil;
|
import com.dji.sample.territory.utils.WaterMarkUtil;
|
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.imageio.ImageIO;
|
import javax.xml.crypto.Data;
|
import java.awt.image.BufferedImage;
|
import java.io.*;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.net.HttpURLConnection;
|
import java.net.URL;
|
import java.text.SimpleDateFormat;
|
import java.time.Instant;
|
import java.time.LocalDateTime;
|
import java.time.ZoneId;
|
import java.time.format.DateTimeFormatter;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.UUID;
|
|
import static com.dji.sample.territory.utils.CoordinateSystemUtil.*;
|
import static com.dji.sample.territory.utils.SM2SignUtil.getSM2PrivateKey;
|
import static com.dji.sample.territory.utils.SM2SignUtil.signWithSM2;
|
|
@Service
|
@DS("sqlite-ret")
|
public class TbFjServiceImpl implements ITbFJService {
|
@Autowired
|
private ITbFjMapper tbFjMapper;
|
@Autowired
|
private PatchesConfigPojo patchesConfigPojo;
|
|
/**
|
* 按照地块编号所对应的信息和音视频文件存入sqlite数据库
|
*
|
* @param mediaFile
|
* @param lotInfo
|
* @return
|
* @throws IOException
|
*/
|
@Transactional
|
public int insertData(List<MediaFileEntity> mediaFile, LotInfo lotInfo) throws Exception {
|
int count = 0;
|
List<TbFjEntity> list = new ArrayList<>();
|
TbFjEntity tbFj;
|
for (int i = 0; i < mediaFile.size(); i++) {
|
MediaFileEntity file = mediaFile.get(i);
|
tbFj = dbConvertToEntity(file, lotInfo);
|
list.add(tbFj);
|
tbFjMapper.insert(tbFj);
|
count++;
|
}
|
return count;
|
}
|
|
public void insertOneData(MediaFileEntity mediaFile, LotInfo lotInfo) throws Exception {
|
TbFjEntity tbFj = dbConvertToEntity(mediaFile, lotInfo);
|
if (tbFj.getFjysgd()==3000){
|
tbFjMapper.insert(tbFj);
|
}
|
}
|
|
@Override
|
public void deleteData() {
|
tbFjMapper.delete(null);
|
}
|
|
/**
|
* 将Media和Lotinfo实体类转化为TbFjEntity实体类
|
*
|
* @param mediaFile
|
* @param lotInfo
|
* @return
|
* @throws IOException
|
*/
|
private TbFjEntity dbConvertToEntity(MediaFileEntity mediaFile, LotInfo lotInfo) throws Exception {
|
File file1 = null;
|
byte[] FJ = null;
|
String jsonString = JSONObject.toJSONString(mediaFile.getMetadata());
|
JSONObject jsonObject = JSONObject.parseObject(jsonString);
|
Double absoluteAltitude = jsonObject.getDouble("absoluteAltitude");
|
Double relativeAltitude = jsonObject.getDouble("relativeAltitude");
|
Double gimbalYawDegree = jsonObject.getDouble("gimbalYawDegree");
|
Long sj = jsonObject.getLong("createdTime");
|
JSONObject shootPosition = jsonObject.getJSONObject("shootPosition");
|
Double lat = shootPosition.getDouble("lat");
|
Double lng = shootPosition.getDouble("lng");
|
// double[] coordinates = extractCoordinates(pointWGStoCGCS(lng, lat));
|
// double x = Double.parseDouble(((formatCoordinate(coordinates[1]))));
|
// double y = Double.parseDouble(((formatCoordinate(coordinates[0]))));
|
//本地数据库没有的数据在FJ表非空用0
|
int psjd = 0;
|
int pshgj = 0;
|
String psry = "中图智绘无人机";
|
String zsdm = "23C8CCC61E3042FBA6A658F319337B1A";
|
String dklx = "0";
|
int fjlx = 1;
|
String pstz = "Y";
|
String pssj = convertTimestampToDateTime(sj);
|
String bsm = UUID.randomUUID().toString();
|
String fjmc = mediaFile.getFileName();
|
String key = mediaFile.getObjectKey();
|
String head = "http://dev.jxpskj.com:9000/cloud-bucket";
|
String url = head + key;
|
File file = downloadFile(url);
|
String fjhxz = HashUtil.SM3Hash(file);
|
BufferedImage image = ImageIO.read(file);
|
int width = image.getWidth();
|
int height = image.getHeight();
|
//对应图片和视频文件进行不同处理
|
boolean endsWith = key.endsWith(".mp4");
|
if (!endsWith) {
|
file1 = WaterMarkUtil.addWatermark(file, patchesConfigPojo.getUnzip(), sj, lat, lng, gimbalYawDegree);
|
FJ = fileToByteArray(file1);
|
} else {
|
file1 = VideoZipUtil.compressVideo(file, 800000, 128000, 1280, 720);
|
FJ = fileToByteArray(file1);
|
}
|
String sm3 = Sm3Util.calculateSM3Hash(fjhxz + "," + pssj + "," + lng + "," + lat + "," + gimbalYawDegree + "," + psjd + "," + pshgj + "," + psry + "," + zsdm);
|
|
byte[] hash = sm3.getBytes(); // 注意:使用SM3或其他哈希算法来计算数据的哈希值
|
// 加载私钥
|
ECPrivateKeyParameters sm2PrivateKey = getSM2PrivateKey();
|
// 使用SM2私钥对哈希值进行签名
|
String signatureHex = signWithSM2(hash, sm2PrivateKey);
|
TbFjEntity.TbFjEntityBuilder builder = TbFjEntity.builder();
|
if (lotInfo != null) {
|
builder.bsm(bsm)
|
.dkbsm(lotInfo.getBsm())
|
.xzqdm(lotInfo.getXzqdm())
|
.dklx(dklx)
|
.xdgd(truncateToTwoDecimalPlaces(relativeAltitude))
|
.jdgd(truncateToTwoDecimalPlaces(absoluteAltitude))
|
.Latitude(truncateToSevenDecimalPlaces(lat))
|
.longitude(truncateToSevenDecimalPlaces(lng))
|
.fj(FJ)
|
.fjmc(fjmc)
|
.fjlx(fjlx)
|
.psfyj(gimbalYawDegree)
|
.pssj(pssj)
|
.psjd(psjd)
|
.fjhxz(fjhxz)
|
.pshgj(pshgj)
|
.zsdm(zsdm)
|
.psry(psry)
|
.jym(signatureHex)
|
.url(url)
|
.pstz(pstz)
|
.fjyskd(width)
|
.fjysgd(height)
|
.build();
|
}
|
// else {
|
//// throw new IllegalArgumentException("未匹配到相关地块");
|
// }
|
return builder.build();
|
}
|
|
/**
|
* 将音视频文件转换成字节流
|
*
|
* @param fileUrl
|
* @return
|
*/
|
public File downloadFile(String fileUrl) {
|
File downloadedFile = null;
|
try {
|
URL url = new URL(fileUrl);
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
connection.setRequestMethod("GET");
|
downloadedFile = new File(File.createTempFile("temp", ".jpeg").toURI());
|
InputStream inputStream = connection.getInputStream();
|
OutputStream outputStream = new FileOutputStream(downloadedFile);
|
byte[] buffer = new byte[1024];
|
int bytesRead;
|
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
outputStream.write(buffer, 0, bytesRead);
|
|
}
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
|
return downloadedFile;
|
}
|
|
/**
|
* 将文件转换为字节数组。
|
*
|
* @param file 需要转换的文件对象。
|
* @return 文件内容的字节数组。
|
* @throws IOException 如果读取文件发生错误。
|
*/
|
public static byte[] fileToByteArray(File file) throws IOException {
|
FileInputStream fis = new FileInputStream(file);
|
byte[] data = new byte[(int) file.length()];
|
fis.read(data);
|
fis.close();
|
return data;
|
}
|
|
public static String convertTimestampToDateTime(long timestamp) {
|
// 将时间戳转换为 Instant 对象
|
Instant instant = Instant.ofEpochMilli(timestamp);
|
|
// 将 Instant 对象转换为 LocalDateTime 对象
|
LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
|
|
// 格式化日期时间
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
return dateTime.format(formatter);
|
}
|
|
public static Double truncateToTwoDecimalPlaces(Double value) {
|
if (value == null) {
|
return null; // 处理null值情况
|
}
|
BigDecimal bd = new BigDecimal(value).setScale(2, RoundingMode.DOWN);
|
return bd.doubleValue();
|
}
|
public static Double truncateToSevenDecimalPlaces(Double value) {
|
if (value == null) {
|
return null; // 处理null值情况
|
}
|
BigDecimal bd = new BigDecimal(value).setScale(7, RoundingMode.DOWN);
|
return bd.doubleValue();
|
|
}
|
|
public static void main(String[] args) {
|
System.out.println(truncateToSevenDecimalPlaces(152.00666565));
|
System.out.println(truncateToTwoDecimalPlaces(12.006));
|
}
|
}
|