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.VideoZipUtil; import com.dji.sample.territory.utils.WaterMarkUtil; 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; import static com.dji.sample.territory.utils.CoordinateSystemUtil.*; @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 mediaFile, LotInfo lotInfo) throws IOException { int count = 0; List 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"); 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; 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 = WaterMarkUtil.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(x) .longitude(y) .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; 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; } }