ScenePlusServiceImpl.java 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package com.fdkankan.scene.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.io.FileUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import cn.hutool.extra.qrcode.QrCodeUtil;
  6. import cn.hutool.extra.qrcode.QrConfig;
  7. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  8. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  9. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  10. import com.fdkankan.common.constant.ErrorCode;
  11. import com.fdkankan.common.constant.PayStatus;
  12. import com.fdkankan.common.constant.SceneStatus;
  13. import com.fdkankan.common.exception.BusinessException;
  14. import com.fdkankan.fyun.face.FYunFileServiceInterface;
  15. import com.fdkankan.model.constants.ConstantFilePath;
  16. import com.fdkankan.model.constants.UploadFilePath;
  17. import com.fdkankan.scene.entity.SceneEditInfoExt;
  18. import com.fdkankan.scene.entity.ScenePro;
  19. import com.fdkankan.scene.service.ISceneEditInfoExtService;
  20. import com.fdkankan.scene.service.ISceneProService;
  21. import com.fdkankan.web.response.ResultData;
  22. import com.fdkankan.redis.constant.RedisKey;
  23. import com.fdkankan.redis.constant.RedisLockKey;
  24. import com.fdkankan.redis.util.RedisLockUtil;
  25. import com.fdkankan.redis.util.RedisUtil;
  26. import com.fdkankan.scene.entity.SceneDataDownload;
  27. import com.fdkankan.scene.entity.SceneEditInfo;
  28. import com.fdkankan.scene.entity.ScenePlus;
  29. import com.fdkankan.scene.entity.ScenePlusExt;
  30. import com.fdkankan.scene.mapper.IScenePlusMapper;
  31. import com.fdkankan.scene.service.ISceneDataDownloadService;
  32. import com.fdkankan.scene.service.ISceneEditInfoService;
  33. import com.fdkankan.scene.service.IScenePlusExtService;
  34. import com.fdkankan.scene.service.IScenePlusService;
  35. import com.fdkankan.scene.vo.BaseSceneParamVO;
  36. import com.fdkankan.scene.vo.SceneCheckKeyParamVO;
  37. import com.fdkankan.scene.vo.SceneDataDownloadVO;
  38. import java.io.File;
  39. import java.util.List;
  40. import java.util.Objects;
  41. import java.util.UUID;
  42. import lombok.extern.slf4j.Slf4j;
  43. import org.springframework.beans.factory.annotation.Autowired;
  44. import org.springframework.beans.factory.annotation.Value;
  45. import org.springframework.stereotype.Service;
  46. import org.springframework.web.multipart.MultipartFile;
  47. /**
  48. * <p>
  49. * 场景主表 服务实现类
  50. * </p>
  51. *
  52. * @author
  53. * @since 2022-03-16
  54. */
  55. @Slf4j
  56. @Service
  57. public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
  58. @Value("${main.url}")
  59. private String mainUrl;
  60. @Value("${scene.pro.new.url}")
  61. private String sceneProNewUrl;
  62. @Autowired
  63. private IScenePlusExtService scenePlusExtService;
  64. @Autowired
  65. private IScenePlusService scenePlusService;
  66. @Autowired
  67. private ISceneEditInfoService sceneEditInfoService;
  68. @Autowired
  69. private ISceneDataDownloadService sceneDataDownloadService;
  70. @Autowired
  71. private RedisUtil redisUtil;
  72. @Autowired
  73. private RedisLockUtil redisLockUtil;
  74. @Autowired
  75. private ISceneProService sceneProService;
  76. @Autowired
  77. private FYunFileServiceInterface fYunFileService;
  78. @Autowired
  79. private ISceneEditInfoExtService sceneEditInfoExtService;
  80. @Override
  81. public ScenePlus getScenePlusByNum(String num) {
  82. return this.getOne(new LambdaQueryWrapper<ScenePlus>().eq(ScenePlus::getNum, num));
  83. }
  84. @Override
  85. public ResultData checkKey(SceneCheckKeyParamVO param) throws Exception {
  86. ScenePlus scenePlus = scenePlusService.getOne(new LambdaQueryWrapper<ScenePlus>()
  87. .eq(ScenePlus::getNum, param.getNum())
  88. .eq(ScenePlus::getPayStatus, PayStatus.PAY.code()));
  89. if (Objects.isNull(scenePlus)) {
  90. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  91. }
  92. SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
  93. if (Objects.isNull(sceneEditInfo)) {
  94. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  95. }
  96. if(!param.getPassword().equals(sceneEditInfo.getScenePassword())){
  97. throw new BusinessException(ErrorCode.FAILURE_CODE_5021);
  98. }
  99. return ResultData.ok();
  100. }
  101. @Override
  102. public ResultData updateScenePlusUserIdByCameraId(List<Long> cameraIdList, Long userId) {
  103. LambdaUpdateWrapper<ScenePlus> updateWrapper = new LambdaUpdateWrapper<ScenePlus>()
  104. .set(ScenePlus::getUserId, userId).in(ScenePlus::getCameraId, cameraIdList);
  105. this.update(updateWrapper);
  106. return ResultData.ok();
  107. }
  108. @Override
  109. public ResultData moveScene(List<String> numList, Long cameraId, Long userId) {
  110. LambdaUpdateWrapper<ScenePlus> updateWrapper =
  111. new LambdaUpdateWrapper<ScenePlus>()
  112. .set(ScenePlus::getUserId, userId)
  113. .set(ScenePlus::getCameraId, cameraId)
  114. .in(ScenePlus::getNum, numList);
  115. this.update(updateWrapper);
  116. return ResultData.ok();
  117. }
  118. @Override
  119. public ResultData downLoadZSData(String num) throws Exception {
  120. if(StrUtil.isEmpty(num)){
  121. throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
  122. }
  123. String version = "v4";
  124. ScenePlus scenePlus = this.getScenePlusByNum(num);
  125. ScenePro scenePro = null;
  126. if(Objects.isNull(scenePlus)){
  127. scenePro = sceneProService.getByNum(num);
  128. version = "v3";
  129. if(Objects.isNull(scenePro)){
  130. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  131. }
  132. }
  133. SceneDataDownload sceneDataDownload = sceneDataDownloadService.findBySceneNum(num);
  134. if(sceneDataDownload == null){
  135. throw new BusinessException(ErrorCode.FAILURE_CODE_5025);
  136. }
  137. SceneDataDownloadVO sceneDataDownloadVO = BeanUtil.copyProperties(sceneDataDownload, SceneDataDownloadVO.class);
  138. sceneDataDownloadVO.setVersion(version);
  139. return ResultData.ok(sceneDataDownloadVO);
  140. }
  141. @Override
  142. public ScenePlus checkSceneAvail(String num) {
  143. ScenePlus scenePlus = this.getScenePlusByNum(num);
  144. if(Objects.isNull(scenePlus)){
  145. throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
  146. }
  147. if(!SceneStatus.SUCCESS.code().equals(scenePlus.getSceneStatus())
  148. && !SceneStatus.NO_DISPLAY.code().equals(scenePlus.getSceneStatus())){
  149. throw new BusinessException(ErrorCode.FAILURE_CODE_5033);
  150. }
  151. if(!PayStatus.PAY.code().equals(scenePlus.getPayStatus())){
  152. throw new BusinessException(ErrorCode.FAILURE_CODE_5034);
  153. }
  154. return scenePlus;
  155. }
  156. @Override
  157. public ResultData updateViewCount(String sceneNum) {
  158. String key = RedisKey.SCENE_VISIT_CNT;
  159. if(!redisUtil.hHasKey(key, sceneNum)){
  160. String lockKey = String.format(RedisLockKey.LOCK_SCENE_VISIT_CNT, sceneNum);
  161. String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
  162. boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_10_MINUTE);
  163. if(!lock){
  164. return ResultData.ok();
  165. }
  166. try {
  167. String cnt = redisUtil.hget(key, sceneNum);
  168. if(StrUtil.isEmpty(cnt)){
  169. //标记是否找到了场景,如果找到就不往下找
  170. Integer viewCount = null;
  171. ScenePlus scenePlus = scenePlusService.getScenePlusByNum(sceneNum);
  172. ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
  173. viewCount = scenePlusExt.getViewCount();
  174. redisUtil.hset(key, sceneNum, Objects.isNull(viewCount) ? "0" : String.valueOf(viewCount));
  175. }
  176. }finally {
  177. redisLockUtil.unlockLua(lockKey, lockVal);
  178. }
  179. }
  180. redisUtil.hincr(key, sceneNum, 1);
  181. return ResultData.ok();
  182. }
  183. @Override
  184. public ResultData uploadShareLogo(String num, MultipartFile file) throws Exception {
  185. ScenePlus scenePlus = this.getScenePlusByNum(num);
  186. if (Objects.isNull(scenePlus)) {
  187. return ResultData.error(ErrorCode.FAILURE_CODE_5005);
  188. }
  189. ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
  190. SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId());
  191. String fileName = file.getOriginalFilename();
  192. String extName = fileName.substring(fileName.lastIndexOf("."));
  193. File newFile = File.createTempFile(UUID.randomUUID().toString() ,extName);
  194. file.transferTo(newFile);
  195. String logoPath = newFile.getPath();
  196. String outPathZh = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+".png";
  197. String outPathEn = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+"_en.png";
  198. String webSize = mainUrl + "/" + sceneProNewUrl + num;
  199. QrCodeUtil.generate(webSize, QrConfig.create().setImg(logoPath), FileUtil.file(outPathZh));
  200. QrCodeUtil.generate(webSize + "&lang=en", QrConfig.create().setImg(logoPath), FileUtil.file(outPathEn));
  201. //上传logo图片
  202. String ossLogoPath = String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + "shareLogo" + extName;
  203. fYunFileService.uploadFile(scenePlusExt.getYunFileBucket(), logoPath, ossLogoPath);
  204. //上传二维码
  205. fYunFileService.uploadFile(scenePlusExt.getYunFileBucket(), outPathZh, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + ".png");
  206. fYunFileService.uploadFile(scenePlusExt.getYunFileBucket(), outPathEn, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + "_en.png");
  207. sceneEditInfoExt.setShareLogoImg(ossLogoPath);
  208. sceneEditInfoExtService.updateById(sceneEditInfoExt);
  209. FileUtil.del(newFile);
  210. FileUtil.del(new File(outPathEn));
  211. FileUtil.del(new File(outPathZh));
  212. return ResultData.ok();
  213. }
  214. }