ScenePlusServiceImpl.java 11 KB

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