SceneEditInfoServiceImpl.java 11 KB

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