SceneEditInfoServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. package com.fdkankan.scene.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import com.alibaba.fastjson.JSON;
  6. import com.alibaba.fastjson.JSONArray;
  7. import com.alibaba.fastjson.JSONObject;
  8. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  9. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  10. import com.fdkankan.common.constant.*;
  11. import com.fdkankan.common.exception.BusinessException;
  12. import com.fdkankan.common.response.ResultData;
  13. import com.fdkankan.fyun.oss.UploadToOssUtil;
  14. import com.fdkankan.redis.constant.RedisKey;
  15. import com.fdkankan.redis.util.RedisUtil;
  16. import com.fdkankan.scene.bean.SceneJsonBean;
  17. import com.fdkankan.scene.entity.SceneEditControls;
  18. import com.fdkankan.scene.entity.SceneEditInfo;
  19. import com.fdkankan.scene.entity.ScenePro;
  20. import com.fdkankan.scene.factory.FloorLogoHandlerFactory;
  21. import com.fdkankan.scene.factory.FloorPlanHandlerFactory;
  22. import com.fdkankan.scene.factory.MusicHandlerFactory;
  23. import com.fdkankan.scene.factory.ScreenshotHandlerFactory;
  24. import com.fdkankan.scene.mapper.ISceneEditInfoMapper;
  25. import com.fdkankan.scene.service.ISceneEditControlsService;
  26. import com.fdkankan.scene.service.ISceneEditInfoService;
  27. import com.fdkankan.scene.service.ISceneProService;
  28. import com.fdkankan.scene.vo.*;
  29. import com.google.common.collect.Lists;
  30. import com.google.errorprone.annotations.Var;
  31. import java.util.List;
  32. import java.util.Map;
  33. import java.util.stream.Collectors;
  34. import org.springframework.beans.factory.annotation.Autowired;
  35. import org.springframework.beans.factory.annotation.Value;
  36. import org.springframework.stereotype.Service;
  37. import org.springframework.transaction.annotation.Transactional;
  38. import java.io.BufferedReader;
  39. import java.io.IOException;
  40. import java.io.InputStream;
  41. import java.io.InputStreamReader;
  42. import java.util.Calendar;
  43. import java.util.Objects;
  44. /**
  45. * <p>
  46. * 服务实现类
  47. * </p>
  48. *
  49. * @author
  50. * @since 2022-01-18
  51. */
  52. @Service
  53. public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper, SceneEditInfo> implements ISceneEditInfoService {
  54. @Value("${oss.bucket:4dkankan}")
  55. private String bucket;
  56. @Autowired
  57. private ISceneEditControlsService sceneEditControlsService;
  58. @Autowired
  59. private ISceneProService sceneProService;
  60. @Autowired
  61. private UploadToOssUtil uploadToOssUtil;
  62. @Autowired
  63. RedisUtil redisUtil;
  64. @Override
  65. public SceneEditInfoVO saveScene(SceneEditInfoParamVO param) {
  66. ScenePro scenePro = sceneProService.findBySceneNum(param.getNum());
  67. if(Objects.isNull(scenePro)){
  68. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  69. }
  70. SceneEditInfo sceneEditInfoDb = this.getBySceneProId(scenePro.getId());
  71. SceneEditControls sceneEditControlsDb = null;
  72. if(Objects.nonNull(sceneEditInfoDb)){
  73. sceneEditControlsDb = sceneEditControlsService.getBySceneEditId(sceneEditInfoDb.getId());
  74. }
  75. SceneEditInfo sceneEditInfo = BeanUtil.copyProperties(param, SceneEditInfo.class);
  76. sceneEditInfo.setSceneProId(scenePro.getId());
  77. sceneEditInfo.setCreateTime(Calendar.getInstance().getTime());
  78. if(Objects.isNull(sceneEditInfoDb)){
  79. this.save(sceneEditInfo);
  80. }else{
  81. sceneEditInfo.setId(sceneEditInfoDb.getId());
  82. sceneEditInfo.setUpdateTime(Calendar.getInstance().getTime());
  83. this.updateById(sceneEditInfo);
  84. }
  85. if(Objects.nonNull(param.getControls())){
  86. SceneEditControls sceneEditControls = BeanUtil.copyProperties(param.getControls(), SceneEditControls.class);
  87. sceneEditControls.setEditInfoId(sceneEditInfo.getId());
  88. if(Objects.isNull(sceneEditControlsDb)){
  89. sceneEditControlsService.save(sceneEditControls);
  90. }else{
  91. sceneEditControls.setId(sceneEditControlsDb.getId());
  92. sceneEditControlsService.updateById(sceneEditControls);
  93. }
  94. }
  95. SceneEditInfoVO result = BeanUtil.copyProperties(param, SceneEditInfoVO.class);
  96. result.setCreateTime(sceneEditInfo.getCreateTime());
  97. return result;
  98. }
  99. @Override
  100. public SceneEditInfo getBySceneProId(long sceneProId) {
  101. return this.getOne(new LambdaQueryWrapper<SceneEditInfo>()
  102. .eq(SceneEditInfo::getTbStatus, TbStatus.VALID.code())
  103. .eq(SceneEditInfo::getSceneProId, sceneProId));
  104. }
  105. @Override
  106. public ResultData publicScene(SceneEditInfoParamVO param) throws Exception {
  107. String sceneNum = param.getNum();
  108. if(StrUtil.isEmpty(sceneNum)){
  109. throw new BusinessException(ErrorCode.PARAM_REQUIRED);
  110. }
  111. //根据场景码查询数据库
  112. ScenePro scenePro = sceneProService.findBySceneNum(sceneNum);
  113. SceneEditInfo sceneEditInfo = this.getBySceneProId(scenePro.getId());
  114. SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfo.getId());
  115. //生成sceneJson
  116. SceneJsonBean sceneJson = BeanUtil.copyProperties(sceneEditInfo, SceneJsonBean.class);
  117. SceneEditControlsVO sceneEditControlsVO = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class);
  118. sceneJson.setControls(sceneEditControlsVO);
  119. sceneJson.setNum(sceneNum);
  120. if(StrUtil.isNotEmpty(sceneEditInfo.getFloorPlanPath())){
  121. sceneJson.setFloorPlanPaths(sceneEditInfo.getFloorPlanPath().split(","));
  122. sceneJson.setFloorPlanStatus(CommonStatus.YES.code());
  123. }
  124. //处理热点数据,生成hot.json
  125. this.publicHotData(sceneNum, sceneJson);
  126. //上传sceneJson文件
  127. String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH+"scene.json", sceneNum);
  128. uploadToOssUtil.upload(JSON.toJSONBytes(sceneJson), sceneJsonPath);
  129. //sceneJson放入缓存
  130. String key = String.format(RedisKey.SCENE_JSON, sceneNum);
  131. redisUtil.set(key, JSON.toJSONString(sceneJson));
  132. //删除发布数据中的user目录
  133. String publicUserPath = String.format(UploadFilePath.USER_VIEW_PATH, sceneNum);
  134. uploadToOssUtil.deleteFile(publicUserPath);
  135. //复制编辑数据到发布目录
  136. String editUserPath = String.format(UploadFilePath.USER_EDIT_PATH, sceneNum);
  137. uploadToOssUtil.copyFiles(editUserPath,publicUserPath);
  138. return ResultData.ok();
  139. }
  140. private void publicHotData(String sceneNum, SceneJsonBean sceneJson) throws IOException {
  141. String hotDataKey = String.format(RedisKey.SCENE_HOT_DATA, sceneNum);
  142. Map<String, String> hotMap = redisUtil.hmget(hotDataKey);
  143. List<String> hotList = Lists.newArrayList();
  144. hotMap.entrySet().stream().forEach(entry->{
  145. if(StrUtil.isNotEmpty(entry.getValue())){
  146. hotList.add(entry.getValue());
  147. }
  148. });
  149. if(CollUtil.isNotEmpty(hotList)){
  150. JSONArray jsonhots = new JSONArray();
  151. hotList.stream().forEach(hot->{
  152. jsonhots.add(JSONObject.parseObject(hot));
  153. });
  154. String hotJsonPath = String.format(UploadFilePath.USER_EDIT_PATH, sceneNum) + "hot.json";
  155. uploadToOssUtil.upload(jsonhots.toString().getBytes(), hotJsonPath);
  156. }
  157. }
  158. @Override
  159. public SceneInfoVO getSceneInfo(@Var SceneInfoParamVO param) {
  160. SceneInfoReqType sceneInfoReqType = SceneInfoReqType.get(param.getReqType());
  161. switch (sceneInfoReqType){
  162. //如果是编辑页面请求,查数据库
  163. case EDIT:
  164. return this.getSceneInfo4Edit(param.getNum());
  165. //如果是查看页面请求,查redis
  166. case VIEW:
  167. return this.getSceneInfo4View(param.getNum());
  168. }
  169. return null;
  170. }
  171. /**
  172. * <p>
  173. 编辑页面获取场景详情信息
  174. * </p>
  175. * @author dengsixing
  176. * @date 2022/1/21
  177. * @param num
  178. * @return com.fdkankan.scene.vo.SceneInfoVO
  179. **/
  180. private SceneInfoVO getSceneInfo4Edit(String num){
  181. ScenePro scenePro = sceneProService.findBySceneNum(num);
  182. if(Objects.isNull(scenePro)){
  183. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  184. }
  185. SceneEditInfo sceneEditInfo = this.getBySceneProId(scenePro.getId());
  186. SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfo.getId());
  187. SceneInfoVO sceneInfoVO = BeanUtil.copyProperties(sceneEditInfo, SceneInfoVO.class);
  188. sceneInfoVO.setControls(BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class));
  189. sceneInfoVO.setNum(num);
  190. //生成sceneJson
  191. if(StrUtil.isNotEmpty(sceneEditInfo.getFloorPlanPath())){
  192. sceneInfoVO.setFloorPlanPaths(sceneEditInfo.getFloorPlanPath().split(","));
  193. sceneInfoVO.setFloorPlanStatus(CommonStatus.YES.code());
  194. }
  195. return sceneInfoVO;
  196. }
  197. /**
  198. * <p>
  199. 查看页面获取场景详情信息
  200. * </p>
  201. * @author dengsixing
  202. * @date 2022/1/21
  203. * @param num
  204. * @return com.fdkankan.scene.vo.SceneInfoVO
  205. **/
  206. private SceneInfoVO getSceneInfo4View(String num){
  207. String sceneJson = redisUtil.get(String.format(RedisKey.SCENE_JSON, num));
  208. SceneInfoVO sceneInfoVO = null;
  209. //先查询redis
  210. if(StrUtil.isNotEmpty(sceneJson)){
  211. sceneInfoVO = JSON.parseObject(sceneJson, SceneInfoVO.class);
  212. return sceneInfoVO;
  213. }
  214. //如果redis没找到,从scene.json中获取
  215. String objectName = String.format(ConstantFilePath.SCENE_VIEW_DATA_DATA_SCENEJSON, num);
  216. String objectContent = uploadToOssUtil.getObjectContent(bucket, objectName);
  217. if(StrUtil.isEmpty(objectContent))
  218. return null;
  219. sceneInfoVO = JSON.parseObject(objectContent, SceneInfoVO.class);
  220. return sceneInfoVO;
  221. }
  222. @Override
  223. // @Transactional
  224. public ResultData saveUpload(SaveUploadParamVO param) throws Exception {
  225. FileBizType fileBizType = FileBizType.get(param.getBizType());
  226. String num = param.getNum();
  227. String fileInfo = param.getFileInfo();
  228. if(Objects.isNull(fileBizType)){
  229. throw new BusinessException(ErrorCode.FAILURE_CODE_7003);
  230. }
  231. switch (fileBizType){
  232. case MUSIC:
  233. return new MusicHandlerFactory().getHandler().save(num, fileInfo);
  234. case FLOOR_LOGO:
  235. return new FloorLogoHandlerFactory().getHandler().save(num, fileInfo);
  236. case FLOOR_PLAN:
  237. return new FloorPlanHandlerFactory().getHandler().save(num, fileInfo);
  238. case SCREENSHOT:
  239. return new ScreenshotHandlerFactory().getHandler().save(num, fileInfo);
  240. }
  241. return ResultData.ok();
  242. }
  243. }