package com.fdkankan.scene.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fdkankan.common.constant.ErrorCode; import com.fdkankan.common.constant.SceneVersionType; import com.fdkankan.common.exception.BusinessException; import com.fdkankan.common.util.JwtUtil; import com.fdkankan.redis.constant.RedisKey; import com.fdkankan.redis.util.RedisUtil; import com.fdkankan.scene.bean.SceneJsonBean; import com.fdkankan.scene.entity.SceneDownloadLog; import com.fdkankan.scene.entity.SceneEditInfo; import com.fdkankan.scene.entity.ScenePlus; import com.fdkankan.scene.mapper.ISceneDownloadLogMapper; import com.fdkankan.scene.oss.OssUtil; import com.fdkankan.scene.service.ISceneDownloadLogService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fdkankan.scene.service.ISceneEditInfoService; import com.fdkankan.scene.service.IScenePlusService; import com.fdkankan.web.bean.DownLoadProgressBean; import com.fdkankan.web.response.ResultData; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; import java.util.Objects; /** *

* 服务实现类 *

* * @author * @since 2023-03-06 */ @Service public class SceneDownloadLogServiceImpl extends ServiceImpl implements ISceneDownloadLogService { private static String keyFormat = "touch:scene:download:num:%s"; @Autowired private IScenePlusService scenePlusService; @Autowired private ISceneEditInfoService sceneEditInfoService; @Autowired private OssUtil ossUtil; @Autowired private RedisUtil redisUtil; @Override public ResultData downOfflineScene(String num) { ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num); if(Objects.isNull(scenePlus)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } Map result = new HashMap<>(); String sceneJson = ossUtil.getFileContent(String.format(RedisKey.SCENE_JSON, num)); SceneJsonBean sceneJsonBean = JSON.parseObject(sceneJson, SceneJsonBean.class); int version = sceneJsonBean.getVersion(); SceneDownloadLog sceneDownloadLog = this.getOne( new LambdaQueryWrapper() .eq(SceneDownloadLog::getSceneNum, num) .orderByDesc(SceneDownloadLog::getId) .last("limit 1")); boolean download = false;//是否需要生成 if(Objects.nonNull(sceneDownloadLog)){ if(sceneDownloadLog.getStatus() == 0){ result.put("status", 0); return ResultData.ok(result); } if(sceneDownloadLog.getStatus() == 2){ result.put("status", -1); return ResultData.ok(result); } if(version == sceneDownloadLog.getSceneVersion()){ result.put("status", 2); result.put("url", sceneDownloadLog.getDownloadUrl()); redisUtil.set(String.format(keyFormat, num), "1"); return ResultData.ok(result); }else{ result.put("status", 3); download = true; } }else{ result.put("status", 1); download = true; } if(download){ redisUtil.set(String.format(keyFormat, num), "1"); //清除之前的下载记录 this.remove(new LambdaQueryWrapper().eq(SceneDownloadLog::getSceneNum, num)); //写入新的记录 sceneDownloadLog = new SceneDownloadLog(); sceneDownloadLog.setSceneNum(num); sceneDownloadLog.setSceneVersion(version); sceneDownloadLog.setSysVersion("v4"); this.save(sceneDownloadLog); Map params = new HashMap<>(2); params.put("type","local"); params.put("num",num); redisUtil.lRightPush(RedisKey.SCENE_DOWNLOADS_TASK_V4, JSONObject.toJSONString(params)); } return ResultData.ok(result); } @Override public ResultData downloadProcess(String num) { String processStr = redisUtil.get(String.format(RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4,num)); DownLoadProgressBean downLoadProgressBean = JSONObject.parseObject(processStr, DownLoadProgressBean.class); return ResultData.ok(downLoadProgressBean); } @Override public ResultData downloadUpDateStatus(String num) { redisUtil.del(String.format(keyFormat, num)); return ResultData.ok(); } }