ScenePlusServiceImpl.java 11 KB

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