package com.fdkankan.repair.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.amazonaws.services.elasticsearch.model.UpgradeStatus;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fdkankan.common.constant.CommonStatus;
import com.fdkankan.common.constant.ConstantFilePath;
import com.fdkankan.common.constant.UploadFilePath;
import com.fdkankan.common.util.FileUtil;
import com.fdkankan.common.util.FileUtils;
import com.fdkankan.common.util.MatrixToImageWriterUtil;
import com.fdkankan.fyun.oss.UploadToOssUtil;
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.repair.bean.RequestSceneProV4;
import com.fdkankan.repair.bean.SceneEditControlsBean;
import com.fdkankan.repair.bean.SceneJsonBean;
import com.fdkankan.repair.bean.SceneUpgradeProgressBean;
import com.fdkankan.repair.callback.FdkkMiniReqErrorCallback;
import com.fdkankan.repair.callback.FdkkMiniReqSuccessCallback;
import com.fdkankan.repair.constant.ProgressStatus;
import com.fdkankan.repair.entity.SceneEditControls;
import com.fdkankan.repair.entity.SceneEditInfo;
import com.fdkankan.repair.entity.SceneEditInfoExt;
import com.fdkankan.repair.entity.ScenePlusExt;
import com.fdkankan.repair.entity.ScenePro;
import com.fdkankan.repair.entity.SceneProEdit;
import com.fdkankan.repair.entity.SceneProEditExt;
import com.fdkankan.repair.entity.SceneProExt;
import com.fdkankan.repair.entity.SceneRepairLog;
import com.fdkankan.repair.httpclient.FdkankanMiniClient;
import com.fdkankan.repair.service.ISceneEditControlsService;
import com.fdkankan.repair.service.ISceneEditInfoExtService;
import com.fdkankan.repair.service.ISceneEditInfoService;
import com.fdkankan.repair.service.IScenePlusExtService;
import com.fdkankan.repair.service.ISceneProEditExtService;
import com.fdkankan.repair.service.ISceneProEditService;
import com.fdkankan.repair.service.ISceneProExtService;
import com.fdkankan.repair.service.ISceneProService;
import com.fdkankan.repair.service.ISceneRepairLogService;
import com.fdkankan.repair.service.ISceneUpgradeToV4Service;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
/**
*
* TODO
*
*
* @author dengsixing
* @since 2022/4/21
**/
@Slf4j
@Service
public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
@Value("${main.url}")
private String mainUrl;
@Value("${scene.pro.new.url}")
private String sceneProNewUrl;
@Value("${oss.prefix.url}")
private String ossUrlPrefix;
@Value("${http.host.4dkankanMini}")
private String fkankanMiniHost;
@Autowired
private RedisLockUtil redisLockUtil;
@Autowired
private ISceneProExtService sceneProExtService;
@Autowired
private ISceneEditInfoService sceneEditInfoService;
@Autowired
private ISceneEditInfoExtService sceneEditInfoExtService;
@Autowired
private ISceneProEditService sceneProEditService;
@Autowired
private ISceneProEditExtService sceneProEditExtService;
@Autowired
private ISceneEditControlsService sceneEditControlsService;
@Autowired
private ISceneRepairLogService sceneRepairLogService;
@Value("${oss.bucket:4dkankan}")
private String bucket;
@Autowired
private ISceneProService sceneProService;
@Autowired
private IScenePlusExtService scenePlusExtService;
@Autowired
private UploadToOssUtil uploadToOssUtil;
@Autowired
RedisUtil redisUtil;
@Autowired
FdkankanMiniClient fdkankanMiniClient;
private static final String[] prefixArr = new String[]{
"data/data%s/",
"voice/voice%s/",
"video/video%s/",
"images/images%s/"
};
@Override
public void upgrade(long sceneProId) throws Exception{
ScenePro scenePro = sceneProService.getById(sceneProId);
//线程开始,正在执行线程数+1
String num = scenePro.getNum();
String dataPath = String.format("data/data%s/", num);
String imagePath = String.format("images/images%s/", num);
String videoPath = String.format("video/video%s/", num);
String voicePath = String.format("voice/voice%s/", num);
String dataViewPath = String.format("scene_view_data/%s/data/", num);
String imageViewPath = String.format("scene_view_data/%s/images/", num);
String videoViewPath = String.format("scene_view_data/%s/video/", num);
String voiceViewPath = String.format("scene_view_data/%s/voice/", num);
long consumTime = 0;
long startTime = Calendar.getInstance().getTimeInMillis();
SceneRepairLog sceneRepairLog = null;
try {
sceneRepairLog = sceneRepairLogService.getOne(new LambdaQueryWrapper().eq(SceneRepairLog::getNum, num));
if(sceneRepairLog == null){
sceneRepairLog = SceneRepairLog.builder()
.num(scenePro.getNum())
.reason("")
.state(0).build();
}else{
sceneRepairLog.setUpdateTime(Calendar.getInstance().getTime());
sceneRepairLog.setReason("");
sceneRepairLog.setState(0);
}
//写入日志
sceneRepairLogService.saveOrUpdate(sceneRepairLog);
SceneProExt sceneProExt = sceneProExtService.getOne(
new LambdaQueryWrapper()
.eq(SceneProExt::getSceneProId, scenePro.getId()));
SceneProEdit sceneProEdit = sceneProEditService.getOne(
new LambdaQueryWrapper()
.eq(SceneProEdit::getProId, scenePro.getId()));
SceneProEditExt sceneProEditExt = sceneProEditExtService
.getOne(new LambdaQueryWrapper()
.eq(SceneProEditExt::getProEditId, sceneProEdit.getId()));
String path = sceneProExt.getDataSource();
//生成热点json文件
Integer tags = Integer.valueOf(CommonStatus.NO.code());
Set icons = new HashSet<>();
String hotJson = uploadToOssUtil.getObjectContent("4dkankan", dataPath + "hot.json");
JSONArray newHotArr = new JSONArray();
if(StrUtil.isNotBlank(hotJson)){
JSONArray hotArr = JSON.parseArray(hotJson);
if(hotArr.size() > 0){
tags = Integer.valueOf(CommonStatus.YES.code());
for(int i=0; i < hotArr.size(); i++){
JSONObject oldHot = (JSONObject)hotArr.get(i);
String styleId = oldHot.getString("styleId");
JSONObject newHot = new JSONObject();
newHot.put("createTime", Calendar.getInstance().getTimeInMillis() + i);
newHot.put("icon", styleId);
newHot.put("position", oldHot.getJSONObject("position"));
JSONObject media = new JSONObject();
newHot.put("media", media);
JSONObject fileName = oldHot.getJSONObject("fileName");
Set> entries = null;
if(fileName != null){
entries = fileName.entrySet();
}
if(CollUtil.isNotEmpty(entries)){
for (Entry entry : entries) {
JSONArray arr = new JSONArray();
media.put(entry.getKey(), arr);
JSONObject o = new JSONObject();
arr.add(o);
String fileSrc = ((String) entry.getValue());
o.put("src", oldHot.getString("sid") + fileSrc.substring(fileSrc.lastIndexOf(".")));
o.put("name", fileSrc);
}
}
newHot.put("type", oldHot.getString("mediaType"));
newHot.put("title", oldHot.getString("label"));
newHot.put("content", oldHot.getString("description"));
newHot.put("sid", oldHot.getString("sid"));
if(StrUtil.isNotBlank(styleId)){
icons.add(styleId);
}
}
}
String hotJsonEditPath = String.format(UploadFilePath.USER_EDIT_PATH, num) + "hot.json";
String hotJsonViewPath = String.format(UploadFilePath.USER_VIEW_PATH, num) + "hot.json";
uploadToOssUtil.upload(hotJson.getBytes(), hotJsonEditPath);
uploadToOssUtil.upload(hotJson.getBytes(), hotJsonViewPath);
//写到本地文件
JSONObject localObject = new JSONObject();
localObject.put("tags", newHotArr);
localObject.put("icons", icons);
String hotJsonPath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + "hot.json";
FileUtils.writeFile(hotJsonPath, localObject.toJSONString());
}
boolean existLoadingLogo = false;
//生成编辑表
SceneEditInfo sceneEditInfo = sceneEditInfoService.getOne(
new LambdaQueryWrapper()
.eq(SceneEditInfo::getSceneProId, scenePro.getId()));
SceneEditInfoExt sceneEditInfoExt = null;
SceneEditControls sceneEditControls = null;
if(sceneEditInfo == null){
List loadingLogoFile = uploadToOssUtil.listKeys(imagePath + "logo-main.png");
if(CollUtil.isNotEmpty(loadingLogoFile)){
existLoadingLogo = true;
}
sceneEditInfo = new SceneEditInfo();
sceneEditInfo.setSceneProId(scenePro.getId());
sceneEditInfo.setScenePlusId(scenePro.getId());
sceneEditInfo.setFloorLogo(sceneProEdit.getFloorLogo());
sceneEditInfo.setFloorLogoSize(sceneProEdit.getFloorLogoSize());
sceneEditInfo.setFloorLogoFile("user".equals(sceneProEdit.getFloorLogo()) ? "floorLogo-user.png" : null); //floorLogoImg.png -> floorLogo-user.png
sceneEditInfo.setMusic(sceneProEdit.getBgMusic());
//如果bgmusicname 不为空 ,MusicFile = BgMusicName
if(StrUtil.isNotEmpty(sceneProEditExt.getBgMusicName())){
sceneEditInfo.setMusicFile(sceneProEditExt.getBgMusicName());
}
//bgmusic=user, music=musicfile
if("user".equals(sceneProEdit.getBgMusic())){
sceneEditInfo.setMusic(sceneEditInfo.getMusicFile());
}
sceneEditInfo.setScenePassword(sceneProEdit.getSceneKey());
sceneEditInfo.setTitle(scenePro.getSceneName());
sceneEditInfo.setDescription(scenePro.getSceneDec());
sceneEditInfo.setFloorPlanUser(0);
sceneEditInfo.setTags(tags);
sceneEditInfo.setVersion(sceneProEdit.getVersion());
sceneEditInfo.setIsUploadObj(Integer.parseInt(CommonStatus.NO.code().toString()));
sceneEditInfo.setFloorEditVer(sceneProEdit.getFloorEditVer());
sceneEditInfo.setFloorPublishVer(sceneProEdit.getFloorPublishVer());
sceneEditInfo.setBoxVideos(sceneProEditExt.getOverlay());
sceneEditInfo.setEntry(sceneProEdit.getEntry());
sceneEditInfo.setLoadingLogo(existLoadingLogo ? "user" : null);
sceneEditInfo.setLoadingLogoFile(existLoadingLogo ? "loadingLogo-user.png" : null);
sceneEditInfo.setCreateTime(sceneProEdit.getCreateTime());
sceneEditInfo.setUpdateTime(sceneProEdit.getUpdateTime());
sceneEditInfo.setTbStatus(sceneProEdit.getTbStatus());
sceneEditInfoService.save(sceneEditInfo);
sceneEditInfoExt = new SceneEditInfoExt();
sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
sceneEditInfoExt.setSceneProId(scenePro.getId());
sceneEditInfoExt.setScenePlusId(scenePro.getId());
sceneEditInfoExt.setFloorPlanAngle(sceneProEditExt.getFloorPlanAngle() == null ? 0f : Float.parseFloat(sceneProEditExt.getFloorPlanAngle()));
sceneEditInfoExt.setFloorPlanCompass(this.getFloorPlanCompass(num));
sceneEditInfoExt.setVrNum(sceneProEditExt.getVrNum());
sceneEditInfoExt.setCreateTime(sceneEditInfo.getCreateTime());
sceneEditInfoExt.setUpdateTime(sceneEditInfo.getUpdateTime());
sceneEditInfoExt.setTbStatus(sceneEditInfo.getTbStatus());
sceneEditInfoExtService.save(sceneEditInfoExt);
sceneEditControls = new SceneEditControls();
sceneEditControls.setEditInfoId(sceneEditInfo.getId());
sceneEditControls.setShowMap(sceneProEditExt.getMapVisi());
sceneEditControls.setShowLock(sceneProEdit.getNeedKey());
sceneEditControls.setShowTitle(Integer.valueOf(CommonStatus.YES.code()));
sceneEditControls.setShowPanorama(sceneProEditExt.getPanoVisi());
sceneEditControls.setShowDollhouse(sceneProEditExt.getM3dVisi());
sceneEditControls.setShowFloorplan(sceneProEditExt.getM2dVisi());
sceneEditControls.setShowVR(sceneProEditExt.getVrVisi());
sceneEditControls.setShowTour(sceneProEditExt.getTourVisi());
sceneEditControls.setShowRule(sceneProEditExt.getRulerVisi());
sceneEditControls.setCreateTime(sceneEditInfo.getCreateTime());
sceneEditControls.setUpdateTime(sceneEditInfo.getUpdateTime());
sceneEditControls.setTbStatus(sceneEditInfo.getTbStatus());
sceneEditControlsService.save(sceneEditControls);
}else{
sceneEditInfoExt = sceneEditInfoExtService.getOne(
new LambdaQueryWrapper()
.eq(SceneEditInfoExt::getEditInfoId, sceneEditInfo.getId()));
sceneEditControls = sceneEditControlsService.getOne(
new LambdaQueryWrapper()
.eq(SceneEditControls::getEditInfoId, sceneEditInfo.getId()));
}
//完成数据库操作更新进度条为10
this.updateProgress(num, 10, ProgressStatus.DO_DB.code());
//oss文件拷贝
AtomicInteger count = new AtomicInteger(0);
AtomicInteger completeCnt = new AtomicInteger(0);
List list = new ArrayList<>();
List dataKeys = uploadToOssUtil.listKeys(dataPath);
List imageKeys = uploadToOssUtil.listKeys(imagePath);
List videoKeys = uploadToOssUtil.listKeys(videoPath);
List voiceKeys = uploadToOssUtil.listKeys(voicePath);
if(CollUtil.isNotEmpty(dataKeys)) count.addAndGet(dataKeys.size());
if(CollUtil.isNotEmpty(imageKeys)) count.addAndGet(imageKeys.size());
if(CollUtil.isNotEmpty(videoKeys)) count.addAndGet(videoKeys.size());
if(CollUtil.isNotEmpty(voiceKeys)) count.addAndGet(voiceKeys.size());
this.copyFileOss(num, completeCnt, count, dataKeys, dataPath, dataViewPath);
this.copyFileOss(num, completeCnt, count, imageKeys, imagePath, imageViewPath);
this.copyFileOss(num, completeCnt, count, videoKeys, videoPath, videoViewPath);
this.copyFileOss(num, completeCnt, count, voiceKeys, voicePath, voiceViewPath);
//全景图上传、球幕视频
Map map = new HashMap<>();
String sceneNumPAth = String.format("scene/%s", num);
List imagesList = FileUtil.getFileList(path + "/caches/images");
if(CollUtil.isNotEmpty(imagesList)){
imagesList.stream().forEach(str -> map.put(str, str.replace(path, sceneNumPAth)));
}
// List videosList = FileUtil.getFileList(path + "/caches/videos");
// if(CollUtil.isNotEmpty(videosList)){
// videosList.stream().forEach(str -> map.put(str, str.replace(path, sceneNumPAth)));
// }
uploadToOssUtil.uploadMulFiles(map);
//户型图上传
String userEditPath = UploadFilePath.USER_EDIT_PATH + "floor-cad-%s.%s";
String userViewPath = UploadFilePath.USER_VIEW_PATH + "floor-cad-%s.%s";
String floorCadPath = path + "/results/floorplan_cad";
List floorCadList = FileUtil.getFileList(floorCadPath);
if(CollUtil.isNotEmpty(floorCadList)){
floorCadList.stream().forEach(str->{
String substring = str.substring(str.lastIndexOf(File.separator) + 1);
String[] arr = substring.split("floor");
String[] arr2 = arr[1].split("\\.");
uploadToOssUtil.upload(str, String.format(userEditPath, num, arr2[0], arr2[1]));
uploadToOssUtil.upload(str, String.format(userViewPath, num, arr2[0], arr2[1]));
});
}
//拷贝模型文件到用户编辑目录
String editImagesPath = String.format(UploadFilePath.IMG_EDIT_PATH, num);
String viewImagesPath = String.format(UploadFilePath.IMG_VIEW_PATH, num);
String editDataPath = String.format(UploadFilePath.DATA_EDIT_PATH, num);
String viewDataPath = String.format(UploadFilePath.DATA_VIEW_PATH, num);
Map map2 = new HashMap<>();
map2.put(editImagesPath + "vision.modeldata", viewImagesPath + "vision.modeldata");
map2.put(editImagesPath + "vision2.modeldata", viewImagesPath + "vision2.modeldata");
map2.put(editDataPath + "floorplan_cad.json", viewDataPath + "floorplan_cad.json");
for (Entry entry : map2.entrySet()) {
uploadToOssUtil.copyFiles(entry.getValue(), entry.getKey());
}
//完成数据库操作更新进度条为10
this.updateProgress(num, 90, ProgressStatus.DO_OSS.code());
//生成二维码
String sceneUrl = mainUrl + "/" + sceneProNewUrl;
String outPathZh = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + num + ".png";
String outPathEn = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + num + "_en.png";
MatrixToImageWriterUtil.createQRCode(sceneUrl + num, outPathZh, false,null);
MatrixToImageWriterUtil.createQRCode(sceneUrl + num + "&lang=en", outPathEn, false, null);
uploadToOssUtil.upload(outPathZh, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + ".png");
uploadToOssUtil.upload(outPathEn, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + "_en.png");
//根据编辑表 上传用户目录 包括编辑目录 查看目录
String editUsersPath = String.format(UploadFilePath.USER_EDIT_PATH, num);
String viewUsersPath = String.format(UploadFilePath.USER_VIEW_PATH, num);
if("user".equals(sceneProEdit.getFloorLogo())){
uploadToOssUtil.copyFiles(imagePath + "floorLogoImg.png", editUsersPath + "floorLogo-user.png");
uploadToOssUtil.copyFiles(imagePath + "floorLogoImg.png", viewUsersPath + "floorLogo-user.png");
}
if("user".equals(sceneProEdit.getBgMusic())){
uploadToOssUtil.copyFiles(imagePath + sceneProEditExt.getBgMusicName(), editUsersPath + "music-user.mp3");
uploadToOssUtil.copyFiles(imagePath + sceneProEditExt.getBgMusicName(), viewUsersPath + "music-user.mp3");
}
if(existLoadingLogo){
uploadToOssUtil.copyFiles(imagePath + "logo-main.png", editUsersPath + "loadingLogo-user.png");
uploadToOssUtil.copyFiles(imagePath + "logo-main.png", viewUsersPath + "loadingLogo-user.png");
}
if(StrUtil.isNotEmpty(scenePro.getThumb())
&& scenePro.getThumb().contains(imagePath)){
String thumbUrl = null;
if(scenePro.getThumb().contains("thumbSmallImg.jpg")){
uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", editUsersPath + "thumb-1k.jpg");
uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", viewUsersPath + "thumb-1k.jpg");
uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", editUsersPath + "thumb-2k.jpg");
uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", viewUsersPath + "thumb-2k.jpg");
uploadToOssUtil.copyFiles(imagePath + "thumbSmallImg.jpg", editUsersPath + "thumb-128.jpg");
uploadToOssUtil.copyFiles(imagePath + "thumbSmallImg.jpg", viewUsersPath + "thumb-128.jpg");
thumbUrl = this.ossUrlPrefix + String.format(UploadFilePath.USER_VIEW_PATH, num) + "thumb-128.jpg";
}else{
thumbUrl = scenePro.getThumb().replace(imagePath, viewImagesPath);
}
String webSite = sceneUrl + num;
scenePro.setThumb(thumbUrl);
scenePro.setWebSite(webSite);
sceneProService.updateById(scenePro);
ScenePlusExt scenePlusExt = scenePlusExtService.getOne(
new LambdaQueryWrapper()
.eq(ScenePlusExt::getPlusId, scenePro.getId()));
scenePlusExt.setThumb(thumbUrl);
scenePlusExt.setWebSite(webSite);
scenePlusExtService.updateById(scenePlusExt);
}
if(StrUtil.isNotEmpty(sceneEditInfo.getBoxVideos())){
JSONArray boxVideoArr = JSON.parseArray(sceneEditInfo.getBoxVideos());
for(int i = 0; i < boxVideoArr.size(); i++){
JSONObject boxVideo = boxVideoArr.getJSONObject(i);
String sid = boxVideo.getString("sid");
uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".mp4", editUsersPath + sid + ".mp4");
uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".mp4", viewUsersPath + sid + ".mp4");
uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".flv", editUsersPath + sid + ".flv");
uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".flv", viewUsersPath + sid + ".flv");
}
}
//生成scene.json
// 生成新的scene.json,上传至scene_view_data//data
SceneJsonBean sceneJson = new SceneJsonBean();
BeanUtil.copyProperties(sceneEditInfoExt, sceneJson);
BeanUtil.copyProperties(sceneEditInfo, sceneJson);
SceneEditControlsBean sceneEditControlsBean = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsBean.class);
sceneJson.setControls(sceneEditControlsBean);
sceneJson.setNum(num);
sceneJson.setCreateTime(scenePro.getCreateTime());
sceneJson.setSceneResolution(sceneProExt.getSceneResolution());
sceneJson.setSceneFrom(sceneProExt.getSceneFrom());
if(StrUtil.isNotEmpty(scenePro.getVideos())){
sceneJson.setVideos(JSON.parseObject(scenePro.getVideos()));
}
//上传sceneJson文件
String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH+"scene.json", num);
uploadToOssUtil.upload(JSON.toJSONBytes(sceneJson), sceneJsonPath);
//迁移耗时
consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
//记录日志
sceneRepairLog.setUpdateTime(Calendar.getInstance().getTime());
sceneRepairLog.setState(1);
sceneRepairLog.setConsumTime(consumTime);
sceneRepairLogService.updateById(sceneRepairLog);
// 调用v3接口回写数据
String url = fkankanMiniHost + "/api/scene/upgradeToV4ResultSync";
fdkankanMiniClient.upgradeToV4ResultSync(url,
RequestSceneProV4.builder().id(sceneProId).webSite(scenePro.getWebSite()).build(),
new FdkkMiniReqSuccessCallback(), new FdkkMiniReqErrorCallback()
);
this.updateProgress(num, 100, ProgressStatus.SUCCESS.code());
}catch (Exception e){
log.error(e.getMessage(), e);
//完成数据库操作更新进度条为0,状态失败
this.updateProgress(num, 0, ProgressStatus.FAIL.code());
//记录日志
consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
sceneRepairLog.setUpdateTime(Calendar.getInstance().getTime());
sceneRepairLog.setState(2);
sceneRepairLog.setReason(ExceptionUtil.stacktraceToString(e));
sceneRepairLog.setConsumTime(consumTime);
sceneRepairLogService.updateById(sceneRepairLog);
} finally {
String lockKey = String.format(RedisLockKey.LOCK_SCENE_UPGRADE_V4, num);
redisUtil.del(lockKey);
}
}
private void copyFileOss(String num, AtomicInteger completeCnt, AtomicInteger count, List keyList, String sourcePath, String targetPah){
if(CollUtil.isEmpty(keyList))
return;
keyList.parallelStream().forEach(key->{
try {
String targetKey = null;
if(key.contains(sourcePath)){
targetKey = key.replace(sourcePath, targetPah);
}
uploadToOssUtil.copyObject(key, targetKey);
this.updateProgress(num,
10 +
(new BigDecimal(completeCnt.incrementAndGet())
.divide(new BigDecimal(count.get()), 6, BigDecimal.ROUND_HALF_UP)
.multiply(new BigDecimal(0.7))
.multiply(new BigDecimal(100))
.setScale(0, RoundingMode.UP)
.intValue()),
ProgressStatus.DO_OSS.code()
);
} catch (IOException e) {
log.error("文件拷贝出错,key:{}", key);
}
});
}
private Float getFloorPlanCompass(String num){
String objectContent =
uploadToOssUtil.getObjectContent(bucket, "data/data" + num + "/houst_floor.json");
if(StrUtil.isEmpty(objectContent)){
return null;
}
JSONObject jsonObject = JSON.parseObject(objectContent);
JSONArray floors = jsonObject.getJSONArray("floors");
if(CollUtil.isEmpty(floors)){
return null;
}
Object o = floors.get(0);
JSONObject object = (JSONObject)o;
return object.getFloat("dire");
}
/**
* 更新进度条
* @param num
* @param progress
* @param status
*/
private void updateProgress(String num, int progress, int status){
String key = String.format(RedisKey.scene_upgrade_progress_num, num);
redisUtil.set(key,
JSON.toJSONString(
SceneUpgradeProgressBean.builder()
.num(num).status(status)
.progress(progress).build()));
}
}