package com.fdkankan.scene.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.extra.qrcode.QrConfig; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fdkankan.common.constant.CommonStatus; import com.fdkankan.common.constant.ErrorCode; import com.fdkankan.common.constant.PayStatus; import com.fdkankan.common.constant.SceneStatus; import com.fdkankan.common.exception.BusinessException; import com.fdkankan.fyun.face.FYunFileServiceInterface; import com.fdkankan.model.constants.ConstantFilePath; import com.fdkankan.model.constants.UploadFilePath; import com.fdkankan.scene.bean.SceneBean; import com.fdkankan.scene.entity.*; import com.fdkankan.scene.service.*; import com.fdkankan.web.response.ResultData; import com.fdkankan.redis.constant.RedisKey; import com.fdkankan.redis.constant.RedisLockKey; import com.fdkankan.redis.util.RedisLockUtil; import com.fdkankan.redis.util.RedisUtil; import com.fdkankan.scene.mapper.IScenePlusMapper; import com.fdkankan.scene.vo.BaseSceneParamVO; import com.fdkankan.scene.vo.SceneCheckKeyParamVO; import com.fdkankan.scene.vo.SceneDataDownloadVO; import java.io.File; import java.util.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; /** *

* 场景主表 服务实现类 *

* * @author * @since 2022-03-16 */ @Slf4j @Service public class ScenePlusServiceImpl extends ServiceImpl implements IScenePlusService { @Value("${main.url}") private String mainUrl; @Value("${scene.pro.new.url}") private String sceneProNewUrl; @Autowired private IScenePlusExtService scenePlusExtService; @Autowired private IScenePlusService scenePlusService; @Autowired private ISceneEditInfoService sceneEditInfoService; @Autowired private ISceneDataDownloadService sceneDataDownloadService; @Autowired private RedisUtil redisUtil; @Autowired private RedisLockUtil redisLockUtil; @Autowired private ISceneProService sceneProService; @Autowired private FYunFileServiceInterface fYunFileService; @Autowired private ISceneEditInfoExtService sceneEditInfoExtService; @Autowired private IJyUserService jyUserService; @Override public ScenePlus getScenePlusByNum(String num) { return this.getOne(new LambdaQueryWrapper().eq(ScenePlus::getNum, num)); } @Override public ResultData checkKey(SceneCheckKeyParamVO param) throws Exception { ScenePlus scenePlus = scenePlusService.getOne(new LambdaQueryWrapper() .eq(ScenePlus::getNum, param.getNum()) .eq(ScenePlus::getPayStatus, PayStatus.PAY.code())); if (Objects.isNull(scenePlus)) { throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId()); if (Objects.isNull(sceneEditInfo)) { throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } if(!param.getPassword().equals(sceneEditInfo.getScenePassword())){ throw new BusinessException(ErrorCode.FAILURE_CODE_5021); } return ResultData.ok(); } @Override public ResultData updateScenePlusUserIdByCameraId(List cameraIdList, Long userId) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() .set(ScenePlus::getUserId, userId).in(ScenePlus::getCameraId, cameraIdList); this.update(updateWrapper); return ResultData.ok(); } @Override public ResultData moveScene(List numList, Long cameraId, Long userId) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() .set(ScenePlus::getUserId, userId) .set(ScenePlus::getCameraId, cameraId) .in(ScenePlus::getNum, numList); this.update(updateWrapper); return ResultData.ok(); } @Override public ResultData downLoadZSData(String num) throws Exception { if(StrUtil.isEmpty(num)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } String version = "v4"; ScenePlus scenePlus = this.getScenePlusByNum(num); ScenePro scenePro = null; if(Objects.isNull(scenePlus)){ scenePro = sceneProService.getByNum(num); version = "v3"; if(Objects.isNull(scenePro)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } } SceneDataDownload sceneDataDownload = sceneDataDownloadService.findBySceneNum(num); if(sceneDataDownload == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5025); } SceneDataDownloadVO sceneDataDownloadVO = BeanUtil.copyProperties(sceneDataDownload, SceneDataDownloadVO.class); sceneDataDownloadVO.setVersion(version); return ResultData.ok(sceneDataDownloadVO); } @Override public ScenePlus checkSceneAvail(String num) { ScenePlus scenePlus = this.getScenePlusByNum(num); if(Objects.isNull(scenePlus)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } if(scenePlus.getPreview() == CommonStatus.YES.code().intValue() && scenePlus.getSceneStatus() == SceneStatus.PREVIEW.code().intValue()){ return scenePlus; } if(!SceneStatus.SUCCESS.code().equals(scenePlus.getSceneStatus()) && !SceneStatus.NO_DISPLAY.code().equals(scenePlus.getSceneStatus())){ throw new BusinessException(ErrorCode.FAILURE_CODE_5033); } if(!PayStatus.PAY.code().equals(scenePlus.getPayStatus())){ throw new BusinessException(ErrorCode.FAILURE_CODE_5034); } return scenePlus; } @Override public ResultData updateViewCount(String sceneNum) { String key = RedisKey.SCENE_VISIT_CNT; if(!redisUtil.hHasKey(key, sceneNum)){ String lockKey = String.format(RedisLockKey.LOCK_SCENE_VISIT_CNT, sceneNum); String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString(); boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_10_MINUTE); if(!lock){ return ResultData.ok(); } try { String cnt = redisUtil.hget(key, sceneNum); if(StrUtil.isEmpty(cnt)){ //标记是否找到了场景,如果找到就不往下找 Integer viewCount = null; ScenePlus scenePlus = scenePlusService.getScenePlusByNum(sceneNum); ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); viewCount = scenePlusExt.getViewCount(); redisUtil.hset(key, sceneNum, Objects.isNull(viewCount) ? "0" : String.valueOf(viewCount)); } }finally { redisLockUtil.unlockLua(lockKey, lockVal); } } redisUtil.hincr(key, sceneNum, 1); return ResultData.ok(); } @Override public ResultData uploadShareLogo(String num, MultipartFile file) throws Exception { ScenePlus scenePlus = this.getScenePlusByNum(num); if (Objects.isNull(scenePlus)) { return ResultData.error(ErrorCode.FAILURE_CODE_5005); } ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId()); String fileName = file.getOriginalFilename(); String extName = fileName.substring(fileName.lastIndexOf(".")); File newFile = File.createTempFile(UUID.randomUUID().toString() ,extName); file.transferTo(newFile); String logoPath = newFile.getPath(); String outPathZh = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+".png"; String outPathEn = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+"_en.png"; String webSize = "/" + sceneProNewUrl + num; QrCodeUtil.generate(webSize, QrConfig.create().setImg(logoPath).setWidth(1024).setHeight(1024), FileUtil.file(outPathZh)); QrCodeUtil.generate(webSize + "&lang=en", QrConfig.create().setImg(logoPath).setWidth(1024).setHeight(1024), FileUtil.file(outPathEn)); //上传logo图片 String ossLogoPath = String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + "shareLogo" + extName; fYunFileService.uploadFile(scenePlusExt.getYunFileBucket(), logoPath, ossLogoPath); //上传二维码 fYunFileService.uploadFile(scenePlusExt.getYunFileBucket(), outPathZh, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + ".png"); fYunFileService.uploadFile(scenePlusExt.getYunFileBucket(), outPathEn, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + "_en.png"); sceneEditInfoExt.setShareLogoImg(ossLogoPath); sceneEditInfoExtService.updateById(sceneEditInfoExt); FileUtil.del(newFile); FileUtil.del(new File(outPathEn)); FileUtil.del(new File(outPathZh)); return ResultData.ok(); } @Override public List listCleanOrigScene(int cleanOrigMonth) { Date time = Calendar.getInstance().getTime(); time = DateUtil.beginOfDay(DateUtil.offset(time, DateField.MONTH, -cleanOrigMonth)); return this.baseMapper.selectCleanOrigScene(time); } @Override public List listCleanOss4DeletedScene(int month) { Date time = Calendar.getInstance().getTime(); time = DateUtil.beginOfDay(DateUtil.offset(time, DateField.MONTH, -month)); return this.baseMapper.selectCleanOrigSceneDeleted(time); } @Override public List listCleanOss4TestCamera(Set cameraIds, int month) { Date time = Calendar.getInstance().getTime(); time = DateUtil.beginOfDay(DateUtil.offset(time, DateField.MONTH, -month)); return this.baseMapper.listCleanOss4TestCamera(cameraIds, time); } @Override public List listColdStorageScene(int cleanOrigMonth) { Date time = Calendar.getInstance().getTime(); time = DateUtil.beginOfDay(DateUtil.offset(time, DateField.MONTH, -cleanOrigMonth)); return this.baseMapper.selectColdStorageScene(time); } @Override public String getRyIdByNum(String num) { ScenePlus scenePlus = this.getScenePlusByNum(num); Long userId = scenePlus.getUserId(); JyUser jyUser = jyUserService.getByUserId(userId.intValue()); return jyUser.getRyId(); } }