SceneEditInfoExtServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  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.dynamic.datasource.annotation.DS;
  7. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  8. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  9. import com.fdkankan.common.constant.CommonStatus;
  10. import com.fdkankan.common.constant.ErrorCode;
  11. import com.fdkankan.common.constant.UploadFilePath;
  12. import com.fdkankan.common.exception.BusinessException;
  13. import com.fdkankan.redis.constant.RedisKey;
  14. import com.fdkankan.redis.util.RedisClient;
  15. import com.fdkankan.scene.bean.ResultData;
  16. import com.fdkankan.scene.bean.TagBean;
  17. import com.fdkankan.scene.entity.Scene;
  18. import com.fdkankan.scene.entity.SceneEditInfo;
  19. import com.fdkankan.scene.entity.SceneEditInfoExt;
  20. import com.fdkankan.scene.mapper.SceneEditInfoExtMapper;
  21. import com.fdkankan.scene.service.FYunFileService;
  22. import com.fdkankan.scene.service.SceneEditInfoExtService;
  23. import com.fdkankan.scene.service.SceneEditInfoService;
  24. import com.fdkankan.scene.service.SceneService;
  25. import com.fdkankan.scene.vo.BaseJsonArrayParamVO;
  26. import com.fdkankan.scene.vo.BaseSceneParamVO;
  27. import com.fdkankan.scene.vo.DeleteSidListParamVO;
  28. import com.fdkankan.scene.vo.DeleteStylesParamVO;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.stereotype.Service;
  31. import javax.annotation.Resource;
  32. import java.io.IOException;
  33. import java.util.*;
  34. import java.util.concurrent.atomic.AtomicInteger;
  35. import java.util.stream.Collectors;
  36. /**
  37. * <p>
  38. * 服务实现类
  39. * </p>
  40. *
  41. * @author
  42. * @since 2024-10-09
  43. */
  44. @DS("vr")
  45. @Service
  46. public class SceneEditInfoExtServiceImpl extends ServiceImpl<SceneEditInfoExtMapper, SceneEditInfoExt> implements SceneEditInfoExtService {
  47. @Autowired
  48. private SceneService scenePlusService;
  49. @Autowired
  50. private SceneEditInfoService sceneEditInfoService;
  51. @Resource
  52. private RedisClient redisClient;
  53. @Autowired
  54. private FYunFileService fYunFileService;
  55. @Override
  56. public SceneEditInfoExt getByScenePlusId(long scenePlusId) {
  57. return this.getOne(new LambdaQueryWrapper<SceneEditInfoExt>().eq(SceneEditInfoExt::getScenePlusId, scenePlusId));
  58. }
  59. @Override
  60. public SceneEditInfoExt getByEditInfoId(long editInfoId) {
  61. return this.getOne(new LambdaQueryWrapper<SceneEditInfoExt>().eq(SceneEditInfoExt::getEditInfoId, editInfoId));
  62. }
  63. @Override
  64. public void updateToursByNum(String num, Integer subgroup, String upTime, Integer tours) {
  65. Scene scenePlus = scenePlusService.getByNum(num, subgroup, upTime);
  66. if(Objects.isNull(scenePlus)){
  67. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  68. }
  69. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  70. sceneEditInfoService.upgradeVersionById(sceneEditInfo.getId());
  71. SceneEditInfoExt sceneEditInfoExt = this.getByEditInfoId(sceneEditInfo.getId());
  72. sceneEditInfoExt.setTours(tours);
  73. this.updateById(sceneEditInfoExt);
  74. }
  75. @Override
  76. public ResultData saveBillboards(BaseJsonArrayParamVO param) throws Exception {
  77. Scene scenePlus = scenePlusService.getByNum(param.getNum(), param.getSubgroup(), param.getUpTimeKey());
  78. this.addOrUpdateBillboards(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), scenePlus.getCacheKeyHasTime(), param.getData());
  79. this.addOrUpdateBillboardsStyles(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), scenePlus.getCacheKeyHasTime(), param.getStyles());
  80. //保存数据库
  81. SceneEditInfoExt sceneEditInfoExt = this.getByScenePlusId(scenePlus.getId());
  82. this.updateBillboards(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), scenePlus.getCacheKeyHasTime(), sceneEditInfoExt);
  83. this.publicBillboardData(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), scenePlus.getCacheKeyHasTime());
  84. sceneEditInfoService.upgradeVersionById(sceneEditInfoExt.getEditInfoId());
  85. return ResultData.ok();
  86. }
  87. private void addOrUpdateBillboardsStyles(String num, Integer subgroup, String upTime, Integer cacheKeyHasTime, List<JSONObject> styles) throws Exception{
  88. if(CollUtil.isEmpty(styles)){
  89. return;
  90. }
  91. long time = Calendar.getInstance().getTimeInMillis();
  92. Map<String, String> styleMap = new HashMap<>();
  93. AtomicInteger index = new AtomicInteger();
  94. styles.stream().forEach(style->{
  95. String id = style.getString("sid");
  96. style.put("createTime", time + index.getAndIncrement());
  97. styleMap.put(id, style.toJSONString());
  98. });
  99. String key = String.format(RedisKey.SCENE_BILLBOARDS_STYLES, RedisKey.getNumStr(num, subgroup, upTime, cacheKeyHasTime));
  100. redisClient.hmset(key, styleMap);
  101. }
  102. @Override
  103. public ResultData deleteBillboards(DeleteSidListParamVO param) throws Exception {
  104. Scene scenePlus = scenePlusService.getByNum(param.getNum(), param.getSubgroup(), param.getUpTimeKey());
  105. List<String> deleteSidList = param.getSidList();
  106. //处理删除状态数据
  107. this.deleteBillboardsHandler(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), scenePlus.getCacheKeyHasTime(), deleteSidList);
  108. this.publicBillboardData(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), scenePlus.getCacheKeyHasTime());
  109. //保存数据库
  110. SceneEditInfoExt sceneEditInfoExt = this.getByScenePlusId(scenePlus.getId());
  111. this.updateBillboards(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), scenePlus.getCacheKeyHasTime(), sceneEditInfoExt);
  112. sceneEditInfoService.upgradeVersionById(sceneEditInfoExt.getEditInfoId());
  113. return ResultData.ok();
  114. }
  115. @Override
  116. public JSONObject listBillboards(BaseSceneParamVO param) throws Exception {
  117. JSONObject result = new JSONObject();
  118. List<JSONObject> tags = new ArrayList<>();
  119. List<JSONObject> styles = new ArrayList<>();
  120. Scene scenePlus = scenePlusService.getByNum(param.getNum(), param.getSubgroup(), param.getUpTimeKey());
  121. //获取指示牌数据
  122. String key = String.format(RedisKey.SCENE_BILLBOARDS, RedisKey.getNumStr(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), scenePlus.getCacheKeyHasTime()));
  123. List<String> list = redisClient.hgetValues(key);
  124. if(CollUtil.isNotEmpty(list)){
  125. List<TagBean> sortList = list.stream().map(str -> {
  126. JSONObject jsonObject = JSON.parseObject(str);
  127. TagBean tagBean = new TagBean();
  128. tagBean.setCreateTime(jsonObject.getLong("createTime"));
  129. jsonObject.remove("createTime");
  130. tagBean.setTag(jsonObject);
  131. return tagBean;
  132. }).collect(Collectors.toList());
  133. sortList.sort(Comparator.comparingLong(TagBean::getCreateTime).reversed());
  134. tags = sortList.stream().map(item -> item.getTag()).collect(Collectors.toList());
  135. }
  136. result.put("tags", tags);
  137. //获取图标数据
  138. key = String.format(RedisKey.SCENE_BILLBOARDS_STYLES, RedisKey.getNumStr(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), scenePlus.getCacheKeyHasTime()));
  139. List<String> sytlelist = redisClient.hgetValues(key);
  140. if(CollUtil.isNotEmpty(sytlelist)){
  141. List<TagBean> stileSortList = sytlelist.stream().map(str -> {
  142. JSONObject jsonObject = JSON.parseObject(str);
  143. TagBean tagBean = new TagBean();
  144. tagBean.setCreateTime(jsonObject.getLong("createTime"));
  145. jsonObject.remove("createTime");
  146. tagBean.setTag(jsonObject);
  147. return tagBean;
  148. }).collect(Collectors.toList());
  149. stileSortList.sort(Comparator.comparingLong(TagBean::getCreateTime).reversed());
  150. styles = stileSortList.stream().map(item -> item.getTag()).collect(Collectors.toList());
  151. }
  152. result.put("styles", styles);
  153. return result;
  154. }
  155. private void deleteBillboardsHandler(String num, Integer subgroup, String upTime, Integer cacheKeyHasTime, List<String> deleteSidList) throws Exception {
  156. if(CollUtil.isEmpty(deleteSidList)){
  157. return;
  158. }
  159. //从redis中加载热点数据
  160. String key = String.format(RedisKey.SCENE_BILLBOARDS, RedisKey.getNumStr(num, subgroup, upTime, cacheKeyHasTime));
  161. List<String> deletDataList = redisClient.hMultiGet(key, deleteSidList);
  162. if(CollUtil.isEmpty(deletDataList))
  163. return;
  164. //从redis中移除热点数据
  165. redisClient.hdel(key, deleteSidList);
  166. }
  167. private void addOrUpdateBillboards(String num, Integer subgroup, String upTime, Integer cacheKeyHasTime, List<JSONObject> data) throws Exception{
  168. Map<String, String> addOrUpdateMap = new HashMap<>();
  169. int i = 0;
  170. for (JSONObject jsonObject : data) {
  171. jsonObject.put("createTime", Calendar.getInstance().getTimeInMillis() + i++);
  172. addOrUpdateMap.put(jsonObject.getString("sid"), JSON.toJSONString(jsonObject));
  173. }
  174. //处理新增和修改数据
  175. this.addOrUpdateBillboardsHandler(num, subgroup, upTime, cacheKeyHasTime, addOrUpdateMap);
  176. }
  177. private void addOrUpdateBillboardsHandler(String num, Integer subgroup, String upTime, Integer cacheKeyHasTime, Map<String, String> addOrUpdateMap){
  178. if(CollUtil.isEmpty(addOrUpdateMap))
  179. return;
  180. //批量写入缓存
  181. String key = String.format(RedisKey.SCENE_BILLBOARDS, RedisKey.getNumStr(num, subgroup, upTime, cacheKeyHasTime));
  182. redisClient.hmset(key, addOrUpdateMap);
  183. }
  184. private void updateBillboards(String num, Integer subgroup, String upTime, Integer cacheKeyHasTime, SceneEditInfoExt sceneEditInfoExt){
  185. //查询缓存是否包含热点数据
  186. String key = String.format(RedisKey.SCENE_BILLBOARDS, RedisKey.getNumStr(num, subgroup, upTime, cacheKeyHasTime));
  187. Map<String, String> billboardsMap = redisClient.hmget(key);
  188. boolean hashBillboards= false;
  189. for (Map.Entry<String, String> tagMap : billboardsMap.entrySet()) {
  190. if(StrUtil.isEmpty(tagMap.getValue())){
  191. continue;
  192. }
  193. hashBillboards = true;
  194. break;
  195. }
  196. //更改热点状态
  197. sceneEditInfoExt.setBillboards(hashBillboards ? CommonStatus.YES.code().intValue() : CommonStatus.NO.code().intValue());
  198. this.updateById(sceneEditInfoExt);
  199. }
  200. private void publicBillboardData(String sceneNum, Integer subgroup, String upTime, Integer cacheKeyHasTime) throws IOException {
  201. String Key = String.format(RedisKey.SCENE_BILLBOARDS, RedisKey.getNumStr(sceneNum, subgroup, upTime, cacheKeyHasTime));
  202. String userEditPath = String.format(UploadFilePath.USER_VIEW_PATH, sceneNum) + "billboards.json";
  203. List<String> list = redisClient.hgetValues(Key);
  204. if(CollUtil.isEmpty(list)){
  205. fYunFileService.deleteFile(sceneNum, subgroup, upTime, userEditPath);
  206. return;
  207. }
  208. List<JSONObject> collect = list.stream().map(str -> JSON.parseObject(str)).collect(Collectors.toList());
  209. fYunFileService.uploadFile(sceneNum, subgroup, upTime, JSON.toJSONString(collect).getBytes(), userEditPath);
  210. }
  211. @Override
  212. public ResultData deleteBillboardsStyles(DeleteStylesParamVO param) throws Exception {
  213. Scene scenePlus = scenePlusService.getByNum(param.getNum(), param.getSubgroup(), param.getUpTimeKey());
  214. if (scenePlus == null)
  215. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  216. List<String> sidList = param.getSidList();
  217. String key = String.format(RedisKey.SCENE_BILLBOARDS_STYLES, RedisKey.getNumStr(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), scenePlus.getCacheKeyHasTime()));
  218. List<String> deleteList = redisClient.hMultiGet(key, sidList);
  219. redisClient.hdel(key, sidList);
  220. //删除oss文件
  221. List<String> deleteFileList = deleteList.stream().map(str -> {
  222. JSONObject parse = JSON.parseObject(str);
  223. return parse.getString("url");
  224. }).collect(Collectors.toList());
  225. deleteFileList.stream().forEach(v->{
  226. String fileKey = String.format(UploadFilePath.USER_VIEW_PATH, param.getNum()) + v;
  227. fYunFileService.deleteFile(param.getNum(), param.getSubgroup(), param.getUpTimeKey(), fileKey);
  228. });
  229. return ResultData.ok();
  230. }
  231. }