SceneEvidenceServiceImpl.java 11 KB

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