package com.fdkankan.job.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fdkankan.fyun.face.FYunFileServiceInterface;
import com.fdkankan.job.entity.ScenePlus;
import com.fdkankan.job.entity.ScenePlusExt;
import com.fdkankan.job.service.IRepairUpXmlUrlService;
import com.fdkankan.job.service.IScenePlusExtService;
import com.fdkankan.job.service.IScenePlusService;
import com.fdkankan.job.service.ISceneProService;
import com.fdkankan.model.constants.UploadFilePath;
import com.fdkankan.redis.constant.RedisKey;
import com.fdkankan.redis.util.RedisUtil;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
import com.xxl.job.core.context.XxlJobHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
*
* TODO
*
*
* @author dengsixing
* @since 2022/12/16
**/
@Service
public class RepairUpXmlUrlServiceImpl implements IRepairUpXmlUrlService {
@Autowired
private ISceneProService sceneProService;
@Autowired
private IScenePlusService scenePlusService;
@Autowired
private IScenePlusExtService scenePlusExtService;
@Autowired
private FYunFileServiceInterface fYunFileServiceInterface;
@Autowired
private RedisUtil redisUtil;
@Override
public void repairSceneUpXmlUrlOfVideos() {
List numList = null;
String nums = XxlJobHelper.getJobParam();
if(StrUtil.isNotEmpty(nums)){
numList = Arrays.asList(nums.split(","));
}
//查询场景
LambdaQueryWrapper scenePlusExtQueryWrapper = new LambdaQueryWrapper<>();
scenePlusExtQueryWrapper.isNotNull(ScenePlusExt::getVideos);
if(CollUtil.isNotEmpty(numList)){
List plusList = scenePlusService.list(new LambdaQueryWrapper().in(ScenePlus::getNum, numList));
if(CollUtil.isEmpty(plusList)){
return;
}
List plusIdList = plusList.stream().map(plus -> plus.getId()).collect(Collectors.toList());
scenePlusExtQueryWrapper.in(ScenePlusExt::getPlusId, plusIdList);
}
int index = 0;
int size = 1;
boolean exit = false;
List plusExtList = new ArrayList<>();
do {
scenePlusExtQueryWrapper.last("limit " + index + " " + size);
List subList = scenePlusExtService.list(scenePlusExtQueryWrapper);
if(CollUtil.isNotEmpty(subList)){
plusExtList.addAll(subList);
}else{
exit = true;
}
}while (exit);
if(CollUtil.isEmpty(plusExtList)){
return;
}
List plusIdList = plusExtList.stream().map(ext -> ext.getPlusId()).collect(Collectors.toList());
List plusList = scenePlusService.listByIds(plusIdList);
if(CollUtil.isEmpty(plusList)){
return;
}
Map idNumMap = new HashMap<>();
plusList.stream().forEach(plus->{
idNumMap.put(plus.getId(), plus.getNum());
});
List updateList = plusExtList.stream().filter(ext -> {
String videos = ext.getVideos();
String num = idNumMap.get(ext.getPlusId());
if(StrUtil.isEmpty(num)){
return false;
}
String url = "https://4dkk.4dage.com/" + String.format(UploadFilePath.DATA_VIEW_PATH, num) + "Up.xml";
JSONObject videosJson = JSON.parseObject(videos);
String upPath = videosJson.getString("upPath");
if (StrUtil.isEmpty(upPath)) {
return false;
} else
//判断是否包含
if (upPath.contains("/data/data") || (upPath.contains("scene_view_data") && !upPath
.contains(num))) {
//修复数据库
videosJson.replace("upPath", url);
ext.setVideos(videosJson.toJSONString());
//修复scene.json
String sceneJsonPath =
String.format(UploadFilePath.DATA_VIEW_PATH, num) + "scene.json";
String sceneJsonStr = fYunFileServiceInterface.getFileContent(sceneJsonPath);
JSONObject sceneJson = JSON.parseObject(sceneJsonStr);
sceneJson.replace("videos", ext.getVideos());
fYunFileServiceInterface
.uploadFile(sceneJson.toJSONString().getBytes(StandardCharsets.UTF_8),
sceneJsonPath);
//清除缓存
redisUtil.del(String.format(RedisKey.SCENE_JSON, num));
return true;
}
return false;
}).collect(Collectors.toList());
if(CollUtil.isNotEmpty(updateList)){
scenePlusExtService.updateBatchById(updateList);
}
}
}