CutModelServiceImpl.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package com.fdkankan.scene.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  7. import com.fdkankan.common.constant.CommonStatus;
  8. import com.fdkankan.common.constant.UploadFilePath;
  9. import com.fdkankan.redis.constant.RedisKey;
  10. import com.fdkankan.redis.util.RedisClient;
  11. import com.fdkankan.scene.bean.ResultData;
  12. import com.fdkankan.scene.bean.TagBean;
  13. import com.fdkankan.scene.entity.Scene;
  14. import com.fdkankan.scene.entity.SceneEditInfoExt;
  15. import com.fdkankan.scene.service.*;
  16. import com.fdkankan.scene.vo.BaseJsonArrayParamVO;
  17. import com.fdkankan.scene.vo.BaseSceneParamVO;
  18. import com.fdkankan.scene.vo.DeleteSidListParamVO;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Service;
  21. import javax.annotation.Resource;
  22. import java.io.IOException;
  23. import java.util.*;
  24. import java.util.stream.Collectors;
  25. @Service
  26. public class CutModelServiceImpl implements ICutModelService {
  27. private final String CUT_MODEL_JSON_NAME = "cutModel.json";
  28. private final static String CREATE_TIME = "createTime";
  29. @Autowired
  30. private SceneService scenePlusService;
  31. @Autowired
  32. private SceneEditInfoExtService sceneEditInfoExtService;
  33. @Autowired
  34. private SceneEditInfoService sceneEditInfoService;
  35. @Resource
  36. private RedisClient redisClient;
  37. @Autowired
  38. private FYunFileService fYunFileService;
  39. @Autowired
  40. private ISceneUploadService sceneUploadService;
  41. @Override
  42. public ResultData saveCutModel(BaseJsonArrayParamVO param) throws Exception {
  43. Scene scenePlus = scenePlusService.getByNum(param.getNum(), param.getSubgroup(), param.getUpTimeKey());
  44. //更新缓存
  45. this.addOrUpdate(param.getNum() ,param.getSubgroup(), param.getUpTimeKey(), param.getData());
  46. //保存数据库
  47. SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId());
  48. this.updateDb(param.getNum() ,param.getSubgroup(), param.getUpTimeKey(), scenePlus.getId());
  49. sceneEditInfoService.upgradeVersionById(sceneEditInfoExt.getEditInfoId());
  50. //发布
  51. this.publicCutModel(param.getNum() ,param.getSubgroup(), param.getUpTimeKey());
  52. return ResultData.ok();
  53. }
  54. @Override
  55. public List<JSONObject> listCutModel(BaseSceneParamVO param) throws Exception {
  56. List<JSONObject> tags = new ArrayList<>();
  57. Scene scenePlus = scenePlusService.getByNum(param.getNum(), param.getSubgroup(), param.getUpTimeKey());
  58. //获取裁剪模型数据
  59. String numStr = RedisKey.getNumStr(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), 1);
  60. String key = String.format(RedisKey.SCENE_CUT_MODEL, numStr);
  61. List<String> list = redisClient.hgetValues(key);
  62. if(CollUtil.isNotEmpty(list)){
  63. List<TagBean> sortList = list.stream().map(str -> {
  64. JSONObject jsonObject = JSON.parseObject(str);
  65. TagBean tagBean = new TagBean();
  66. tagBean.setCreateTime(jsonObject.getLong(CREATE_TIME));
  67. jsonObject.remove(CREATE_TIME);
  68. tagBean.setTag(jsonObject);
  69. return tagBean;
  70. }).collect(Collectors.toList());
  71. sortList.sort(Comparator.comparingLong(TagBean::getCreateTime).reversed());
  72. tags = sortList.stream().map(item -> item.getTag()).collect(Collectors.toList());
  73. }
  74. return tags;
  75. }
  76. @Override
  77. public ResultData deleteCutModel(DeleteSidListParamVO param) throws Exception {
  78. Scene scenePlus = scenePlusService.getByNum(param.getNum(), param.getSubgroup(), param.getUpTimeKey());
  79. List<String> deleteSidList = param.getSidList();
  80. //处理删除状态数据
  81. List<String> deleteList = this.deleteCutModel(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), deleteSidList);
  82. //保存数据库
  83. SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId());
  84. this.updateDb(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), scenePlus.getId());
  85. sceneEditInfoService.upgradeVersionById(sceneEditInfoExt.getEditInfoId());
  86. //发布
  87. this.publicCutModel(param.getNum(), param.getSubgroup(), param.getUpTimeKey());
  88. return ResultData.ok();
  89. }
  90. @Override
  91. public void publicCutModel(String sceneNum, Integer subgroup, String upTimeKey) throws IOException {
  92. String numStr = RedisKey.getNumStr(sceneNum, subgroup, upTimeKey, 1);
  93. String Key = String.format(RedisKey.SCENE_CUT_MODEL, numStr);
  94. String userEditPath = String.format(UploadFilePath.USER_VIEW_PATH, sceneNum) + "cutModel.json";
  95. List<String> list = redisClient.hgetValues(Key);
  96. List<JSONObject> collect = list.stream().map(str -> JSON.parseObject(str)).collect(Collectors.toList());
  97. fYunFileService.uploadFile(sceneNum, subgroup, upTimeKey, JSON.toJSONString(collect).getBytes(), userEditPath);
  98. }
  99. private List<String> deleteCutModel(String num, Integer subgroup, String upTimeKey, List<String> deleteSidList) throws Exception {
  100. if(CollUtil.isEmpty(deleteSidList)){
  101. return null;
  102. }
  103. //从redis中加载热点数据
  104. String numStr = RedisKey.getNumStr(num, subgroup, upTimeKey, 1);
  105. String key = String.format(RedisKey.SCENE_CUT_MODEL, numStr);
  106. List<String> deletDataList = redisClient.hMultiGet(key, deleteSidList);
  107. if(CollUtil.isNotEmpty(deletDataList)){
  108. redisClient.hdel(key, deleteSidList);
  109. }
  110. return deletDataList;
  111. }
  112. private void updateDb(String num, Integer subgroup, String upTime, Long scenePlusId){
  113. //查询缓存是否包含热点数据
  114. String numStr = RedisKey.getNumStr(num, subgroup, upTime, 1);
  115. String key = String.format(RedisKey.SCENE_CUT_MODEL, numStr);
  116. Map<String, String> cutModelMap = redisClient.hmget(key);
  117. boolean hasCutModel= false;
  118. for (Map.Entry<String, String> tagMap : cutModelMap.entrySet()) {
  119. if(StrUtil.isEmpty(tagMap.getValue())){
  120. continue;
  121. }
  122. hasCutModel = true;
  123. break;
  124. }
  125. //更改热点状态
  126. sceneEditInfoExtService.update(
  127. new LambdaUpdateWrapper<SceneEditInfoExt>()
  128. .set(SceneEditInfoExt::getCutModel, hasCutModel ? CommonStatus.YES.code().intValue() : CommonStatus.NO.code().intValue())
  129. .eq(SceneEditInfoExt::getScenePlusId,scenePlusId));
  130. }
  131. private void addOrUpdate(String num, Integer subgroup, String upTimeKey, List<JSONObject> data) throws Exception{
  132. Map<String, String> addOrUpdateMap = new HashMap<>();
  133. int i = 0;
  134. for (JSONObject jsonObject : data) {
  135. jsonObject.put(CREATE_TIME, Calendar.getInstance().getTimeInMillis() + i++);
  136. addOrUpdateMap.put(jsonObject.getString("sid"), JSON.toJSONString(jsonObject));
  137. }
  138. //处理新增和修改数据
  139. this.addOrUpdateHandler(num, subgroup, upTimeKey, addOrUpdateMap);
  140. }
  141. private void addOrUpdateHandler(String num, Integer subgroup, String upTimeKey, Map<String, String> addOrUpdateMap) {
  142. if (CollUtil.isEmpty(addOrUpdateMap))
  143. return;
  144. //批量写入缓存
  145. String key = String.format(RedisKey.SCENE_CUT_MODEL, RedisKey.getNumStr(num, subgroup, upTimeKey, 1));
  146. redisClient.hmset(key, addOrUpdateMap);
  147. }
  148. }