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