SceneEvidenceServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. package com.fdkankan.scene.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.date.DateUtil;
  4. import cn.hutool.core.date.TimeInterval;
  5. import cn.hutool.core.io.FileUtil;
  6. import cn.hutool.core.net.multipart.UploadFile;
  7. import cn.hutool.core.util.StrUtil;
  8. import com.alibaba.fastjson.JSON;
  9. import com.alibaba.fastjson.JSONArray;
  10. import com.alibaba.fastjson.JSONObject;
  11. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  12. import com.fdkankan.common.constant.CommonStatus;
  13. import com.fdkankan.common.constant.ErrorCode;
  14. import com.fdkankan.common.exception.BusinessException;
  15. import com.fdkankan.common.util.FileUtils;
  16. import com.fdkankan.db.response.PageInfo;
  17. import com.fdkankan.fyun.face.FYunFileServiceInterface;
  18. import com.fdkankan.model.constants.ConstantFilePath;
  19. import com.fdkankan.model.constants.UploadFilePath;
  20. import com.fdkankan.redis.constant.RedisKey;
  21. import com.fdkankan.scene.bean.IconBean;
  22. import com.fdkankan.scene.entity.*;
  23. import com.fdkankan.scene.httpclient.ManageHttpClient;
  24. import com.fdkankan.scene.mapper.ISceneEvidenceMapper;
  25. import com.fdkankan.scene.service.ISceneEditInfoService;
  26. import com.fdkankan.scene.service.ISceneEvidenceService;
  27. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  28. import com.fdkankan.scene.service.ISceneIconService;
  29. import com.fdkankan.scene.service.IScenePlusService;
  30. import com.fdkankan.scene.vo.*;
  31. import com.fdkankan.web.response.ResultData;
  32. import com.google.common.collect.Lists;
  33. import org.apache.commons.lang3.StringUtils;
  34. import org.springframework.beans.factory.annotation.Autowired;
  35. import org.springframework.stereotype.Service;
  36. import org.springframework.web.multipart.MultipartFile;
  37. import javax.annotation.Resource;
  38. import java.io.File;
  39. import java.io.IOException;
  40. import java.util.*;
  41. import java.util.stream.Collectors;
  42. /**
  43. * <p>
  44. * 痕迹物证表 服务实现类
  45. * </p>
  46. *
  47. * @author
  48. * @since 2025-08-08
  49. */
  50. @Service
  51. public class SceneEvidenceServiceImpl extends ServiceImpl<ISceneEvidenceMapper, SceneEvidence> implements ISceneEvidenceService {
  52. @Autowired
  53. private IScenePlusService scenePlusService;
  54. @Autowired
  55. private ISceneEditInfoService sceneEditInfoService;
  56. @Autowired
  57. private ISceneIconService sceneIconService;
  58. @Resource
  59. private ManageHttpClient manageHttpClient;
  60. @Autowired
  61. private FYunFileServiceInterface fYunFileServiceInterface;
  62. @Override
  63. public void saveEvidence(SaveEvidenceParamVO param) throws Exception {
  64. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
  65. if (scenePlus == null)
  66. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  67. this.addOrUpdateData(param.getNum(), param.getDataList());
  68. this.addOrUpdateIcons(param.getNum(), param.getIcons());
  69. //保存数据库
  70. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  71. this.saveEvidenceToSceneEditInfo(param.getNum(), sceneEditInfo);
  72. sceneEditInfoService.updateById(sceneEditInfo);
  73. }
  74. private void addOrUpdateData(String num, List<EvidenceParamVO> dataList) throws Exception{
  75. Set<String> sidList = dataList.stream().map(v->v.getSid()).collect(Collectors.toSet());
  76. List<SceneEvidence> sceneEvidences = this.listByNumAndSids(num, sidList);
  77. Map<String, SceneEvidence> dbMap = new HashMap<>();
  78. if(CollUtil.isNotEmpty(sceneEvidences)){
  79. dbMap = sceneEvidences.stream().collect(Collectors.toMap(v -> v.getSid(), v -> v));
  80. }
  81. Map<String, SceneEvidence> finalDbMap = dbMap;
  82. List<SceneEvidence> collect = dataList.stream().map(v -> {
  83. SceneEvidence sceneEvidence = finalDbMap.get(v.getSid());
  84. if (Objects.isNull(sceneEvidence)) {
  85. sceneEvidence = new SceneEvidence();
  86. sceneEvidence.setNum(num);
  87. sceneEvidence.setSid(v.getSid());
  88. }
  89. sceneEvidence.setUpdateTime(null);
  90. sceneEvidence.setEvidenceContent(v.getData());
  91. return sceneEvidence;
  92. }).collect(Collectors.toList());
  93. this.saveOrUpdateBatch(collect);
  94. }
  95. private void addOrUpdateIcons(String num, List<String> icons) throws Exception{
  96. if(CollUtil.isEmpty(icons)){
  97. return;
  98. }
  99. List<SceneIcon> sceneIconList = icons.stream().map(v -> {
  100. String sid = v.split(".")[0];
  101. SceneIcon sceneIcon = new SceneIcon();
  102. sceneIcon.setNum(num);
  103. sceneIcon.setSid(sid);
  104. sceneIcon.setFileName(v);
  105. sceneIcon.setBizType("evidence");
  106. return sceneIcon;
  107. }).collect(Collectors.toList());
  108. sceneIconService.saveBatch(sceneIconList);
  109. }
  110. @Override
  111. public void saveEvidenceToSceneEditInfo(String num, SceneEditInfo sceneEditInfo){
  112. long count = this.count(new LambdaQueryWrapper<SceneEvidence>().eq(SceneEvidence::getNum, num));
  113. sceneEditInfo.setEvidence(count > 0 ? CommonStatus.YES.code() : CommonStatus.NO.code());
  114. sceneEditInfo.setVersion(sceneEditInfo.getVersion() + 1);
  115. }
  116. @Override
  117. public List<SceneEvidence> listByNumAndSids(String num, Set<String> sids) {
  118. return this.list(new LambdaQueryWrapper<SceneEvidence>().eq(SceneEvidence::getNum, num).in(SceneEvidence::getSid, sids));
  119. }
  120. @Override
  121. public List<SceneEvidence> listByNum(String num) {
  122. return this.list(new LambdaQueryWrapper<SceneEvidence>().eq(SceneEvidence::getNum, num).orderByDesc(SceneEvidence::getUpdateTime));
  123. }
  124. @Override
  125. public void deleteEvidence(DeleteSidListParamVO param) {
  126. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
  127. if (scenePlus == null)
  128. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  129. //处理删除状态数据
  130. // this.deleteHotData(param.getNum(), deleteSidList, bucket);
  131. this.remove(new LambdaQueryWrapper<SceneEvidence>().eq(SceneEvidence::getNum, param.getNum()).in(SceneEvidence::getSid, param.getSidList()));
  132. // //删除导览中的热点数据
  133. // this.deleteHotDataFromTourJson(param.getNum(), param.getSidList(), bucket);
  134. //保存数据库
  135. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  136. sceneEditInfoService.saveTagsToSceneEditInfo(param.getNum(), sceneEditInfo);
  137. sceneEditInfoService.updateById(sceneEditInfo);
  138. }
  139. @Override
  140. public JSONObject listEvidences(String num) {
  141. JSONObject result = new JSONObject();
  142. List<SceneEvidence> sceneEvidences = this.listByNum(num);
  143. List<JSONObject> evidenceContent = sceneEvidences.stream().map(v -> v.getEvidenceContent()).collect(Collectors.toList());
  144. result.put("evidences", evidenceContent);
  145. Set<String> sceneIconList = sceneIconService.listByNum(num, "evidence").stream().map(v->v.getFileName()).collect(Collectors.toSet());
  146. result.put("icons", this.sortIcons(evidenceContent, sceneIconList));
  147. return result;
  148. }
  149. private List<String> sortIcons(List<JSONObject> evidences, Set<String> icons){
  150. //统计使用频次
  151. List<IconBean> iconBeans = Lists.newArrayList();
  152. for (String icon : icons) {
  153. int count = 0;
  154. for (JSONObject tag : evidences) {
  155. String sid = tag.getString("icon");
  156. if(StrUtil.isEmpty(sid) || !icon.equals(sid)){
  157. continue;
  158. }
  159. ++count;
  160. }
  161. iconBeans.add(IconBean.builder().icon(icon).count(count).build());
  162. }
  163. //排序
  164. List<String> iconList = iconBeans.stream().sorted(Comparator.comparing(IconBean::getCount).reversed())
  165. .map(item -> {
  166. return item.getIcon();
  167. }).collect(Collectors.toList());
  168. return iconList;
  169. }
  170. @Override
  171. public void deleteIcons(DeleteHotIconParamVO param) {
  172. sceneIconService.remove(
  173. new LambdaQueryWrapper<SceneIcon>()
  174. .eq(SceneIcon::getBizType, "evidence")
  175. .eq(SceneIcon::getNum, param.getNum())
  176. .in(SceneIcon::getFileName, param.getFileNameList()));
  177. }
  178. @Override
  179. public ResultData<List<JSONObject>> traceEvidenceList(JSONObject param) {
  180. ResultData<List<JSONObject>> resultData = manageHttpClient.traceEvidenceList(param);
  181. return resultData;
  182. }
  183. @Override
  184. public ResultData traceEvidenceInfoList(TraceEvidenceInfoListParamVo param) {
  185. if(StrUtil.isEmpty(param.getKno())){
  186. return ResultData.ok(new PageInfo<>());
  187. }
  188. return manageHttpClient.traceEvidenceInfoList(param);
  189. }
  190. @Override
  191. public ResultData refreshTraceEvidenceInfoList(String kno) {
  192. return manageHttpClient.refreshTraceEvidenceInfoList(kno);
  193. }
  194. @Override
  195. public ResultData syncTraceEvidence(SaveEvidenceParamVO param) throws Exception {
  196. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
  197. if (scenePlus == null)
  198. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  199. List<JSONObject> collect = param.getDataList().stream().map(v -> {
  200. JSONObject data = v.getData();
  201. JSONArray medias = data.getJSONArray("media");
  202. if (CollUtil.isNotEmpty(medias)) {
  203. medias.stream().forEach(m -> {
  204. JSONObject media = (JSONObject) m;
  205. String path = media.getString("path");
  206. String fileName = FileUtil.getName(path);
  207. String newFileName = UUID.randomUUID().toString() + "." + FileUtil.extName(fileName);
  208. String meshKey = String.format(UploadFilePath.USER_EDIT_PATH, param.getNum()) + newFileName;
  209. fYunFileServiceInterface.copyFileInBucket(path, meshKey);
  210. media.put("src", newFileName);
  211. });
  212. }
  213. return data;
  214. }).collect(Collectors.toList());
  215. this.saveEvidence(param);
  216. return ResultData.ok(collect);
  217. }
  218. @Override
  219. public void pushEvidence(BaseJsonArrayParamVO param) {
  220. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
  221. String kNo = scenePlus.getKNo();
  222. for (JSONObject datum : param.getData()) {
  223. manageHttpClient.push(datum);
  224. }
  225. }
  226. @Override
  227. public void uploadScreenshot(MultipartFile[] files, String num) throws IOException {
  228. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
  229. if(scenePlus == null){
  230. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  231. }
  232. if(StrUtil.isEmpty(scenePlus.getKNo())){
  233. return;
  234. }
  235. List<String> urlList = new ArrayList<>();
  236. for (MultipartFile file : files) {
  237. String fileName = file.getOriginalFilename();
  238. // 获取文件后缀
  239. String extName = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
  240. fileName = UUID.randomUUID().toString().concat(extName);
  241. String path = String.format(ConstantFilePath.SCENE_TMP_PATH_V4, num).concat(fileName);
  242. FileUtil.mkParentDirs(path);
  243. file.transferTo(new File(path));
  244. String ossPath = String.format(UploadFilePath.SCENE_NUM_PATH, num) + "screenshot/" + fileName;
  245. fYunFileServiceInterface.uploadFile(path, ossPath);
  246. urlList.add(ossPath);
  247. FileUtils.delFile(path);
  248. }
  249. //调用案件系统接口,进行推送
  250. JSONObject param = new JSONObject();
  251. param.put("kno", scenePlus.getKNo());
  252. param.put("fileList", urlList);
  253. manageHttpClient.pushScreenshot(param);
  254. }
  255. }