package com.dji.sample.territory.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
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.patches.utils.MultipartFileTOFileUtil;
|
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.VideoZipUtil;
|
import com.dji.sample.territory.utils.WaterMark;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.io.*;
|
import java.net.HttpURLConnection;
|
import java.net.URL;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.UUID;
|
|
@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 IOException {
|
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;
|
}
|
|
/**
|
* 将Media和Lotinfo实体类转化为TbFjEntity实体类
|
*
|
* @param mediaFile
|
* @param lotInfo
|
* @return
|
* @throws IOException
|
*/
|
private TbFjEntity dbConvertToEntity(MediaFileEntity mediaFile, LotInfo lotInfo) throws IOException {
|
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");
|
JSONObject shootPosition = jsonObject.getJSONObject("shootPosition");
|
Double lat = shootPosition.getDouble("lat");
|
Double lng = shootPosition.getDouble("lng");
|
//本地数据库没有的数据在FJ表非空用0
|
int psjd = 0;
|
String fjhxz = "0";
|
int pshgj = 0;
|
String jym = "0";
|
String psry = "0";
|
String zsdm = "0";
|
String dklx = "0";
|
String xzqdm = "0";
|
int fjlx = 1;
|
Long pssj = mediaFile.getCreateTime();
|
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);
|
//对应图片和视频文件进行不同处理
|
boolean endsWith = key.endsWith(".mp4");
|
if (!endsWith) {
|
file1 = WaterMark.addWatermark(file, patchesConfigPojo.getUnzip(), pssj, lat, lng);
|
FJ = fileToByteArray(file1);
|
} else {
|
file1 = VideoZipUtil.compressVideo(file, 800000, 128000, 1280, 720);
|
FJ = fileToByteArray(file1);
|
}
|
TbFjEntity.TbFjEntityBuilder builder = TbFjEntity.builder();
|
if (lotInfo != null) {
|
builder.bsm(bsm)
|
.dkbsm(lotInfo.getDkbh())
|
.xzqdm(xzqdm)
|
.dklx(dklx)
|
.xdgd(relativeAltitude)
|
.jdgd(absoluteAltitude)
|
.Latitude(lat)
|
.longitude(lng)
|
.fj(FJ)
|
.fjmc(fjmc)
|
.fjlx(fjlx)
|
.psfyj(gimbalYawDegree)
|
.pssj(String.valueOf(pssj))
|
.psjd(psjd)
|
.fjhxz(fjhxz)
|
.pshgj(pshgj)
|
.zsdm(zsdm)
|
.psry(psry)
|
.jym(jym)
|
.url(url)
|
.build();
|
} else {
|
throw new IllegalArgumentException("未匹配到相关地块");
|
}
|
return builder.build();
|
}
|
|
/**
|
* 将音视频文件转换成字节流
|
*
|
* @param fileUrl
|
* @return
|
*/
|
public File downloadFile(String fileUrl) {
|
File downloadedFile = null;
|
String localFilePath = patchesConfigPojo.getUnzip() + "tmp.jpg";
|
try {
|
URL url = new URL(fileUrl);
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
connection.setRequestMethod("GET");
|
downloadedFile = new File(localFilePath);
|
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;
|
}
|
}
|