package com.fdkankan.ucenter.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.common.constant.SceneConstant;
import com.fdkankan.common.constant.SceneKind;
import com.fdkankan.common.exception.BusinessException;
import com.fdkankan.common.util.*;
import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
import com.fdkankan.rabbitmq.util.RabbitMqProducer;
import com.fdkankan.redis.constant.RedisKey;
import com.fdkankan.ucenter.common.PageInfo;
import com.fdkankan.fyun.face.FYunFileServiceInterface;
import com.fdkankan.image.MatrixToImageWriterUtil;
import com.fdkankan.ucenter.common.constants.ConstantFilePath;
import com.fdkankan.ucenter.common.constants.NacosProperty;
import com.fdkankan.ucenter.common.constants.UploadFilePath;
import com.fdkankan.redis.util.RedisUtil;
import com.fdkankan.ucenter.common.RedisKeyUtil;
import com.fdkankan.ucenter.common.utils.ShellUtil;
import com.fdkankan.ucenter.constant.CameraConstant;
import com.fdkankan.ucenter.constant.LoginConstant;
import com.fdkankan.ucenter.entity.*;
import com.fdkankan.ucenter.httpClient.service.LaserService;
import com.fdkankan.ucenter.mapper.ISceneProMapper;
import com.fdkankan.ucenter.mapper.ISceneUpgradeMapper;
import com.fdkankan.ucenter.service.*;
import com.fdkankan.ucenter.util.DateUserUtil;
import com.fdkankan.ucenter.vo.request.SceneParam;
import com.fdkankan.ucenter.vo.response.GroupByCount;
import com.fdkankan.ucenter.vo.response.SceneInfoVo;
import com.fdkankan.ucenter.vo.response.SceneNumVo;
import com.fdkankan.ucenter.vo.response.SceneVo;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
/**
*
* pro场景表 服务实现类
*
*
* @author
* @since 2022-07-04
*/
@Service
@Slf4j
public class SceneProServiceImpl extends ServiceImpl implements ISceneProService {
@Autowired
private IUserService userService;
@Autowired
private ISceneCooperationService sceneCooperationService;
@Autowired
private IScenePlusService scenePlusService;
@Autowired
private ISceneService sceneService;
@Autowired
private LaserService fdkkLaserService;
@Resource
private FYunFileServiceInterface fYunFileService;
@Autowired
private IUserIncrementService userIncrementService;
@Autowired
private IScenePlusExtService scenePlusExtService;
@Autowired
private ICameraDetailService cameraDetailService;
@Autowired
private IFolderService folderService;
@Autowired
private IFolderSceneService folderSceneService;
@Autowired
private ISceneCopyLogService sceneCopyLogService;
@Autowired
private IScene3dNumService scene3dNumService;
@Autowired
private ISceneProEditService sceneProEditService;
@Autowired
private ISceneEditInfoService sceneEditInfoService;
@Autowired
private RedisUtil redisUtil;
@Resource
private ISceneUpgradeMapper sceneUpgradeMapper;
@Autowired
private ICameraService cameraService;
@Value("${main.url}")
private String mainUrl;
@Value("${scene.pro.url}")
private String sceneProUrl;
@Value("${scene.pro.new.url}")
private String sceneProNewUrl;
@Value("${queue.modeling.obj.modeling-pre}")
private String queueObjModelingPre;
@Autowired
private RabbitMqProducer mqProducer;
@Override
public HashMap findSceneNumber(String token) {
User user = userService.getByUserName(JwtUtil.getUsername(token));
SceneNumVo sceneNumVoKk = getSceneNumVoByType(Arrays.asList(1,2,12,13,14), user.getId());
Integer oldNum = sceneService.getCountByUserId(user.getId());
sceneNumVoKk.setSceneNum( oldNum + sceneNumVoKk.getSceneNum());
sceneNumVoKk.setTotalNum(oldNum + sceneNumVoKk.getTotalNum());
SceneNumVo sceneNumVoKj = getSceneNumVoByType(Collections.singletonList(3), user.getId());
SceneNumVo sceneNumVoSS = fdkkLaserService.getLaserSceneNumByUser(token);
HashMap hashMap = new HashMap<>();
hashMap.put("kk",sceneNumVoKk);
hashMap.put("kJ",sceneNumVoKj);
hashMap.put("SS",sceneNumVoSS);
return hashMap;
}
private SceneNumVo getSceneNumVoByType(List sceneSourceList, Long userId){
SceneNumVo sceneNumVo = new SceneNumVo();
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ScenePro::getUserId, userId);
queryWrapper.in(ScenePro::getSceneSource, sceneSourceList);
queryWrapper.eq(ScenePro::getIsUpgrade, 0);
Integer sceneNum = Math.toIntExact(this.count(queryWrapper));
Long count = scenePlusService.getCountByUserId(userId,sceneSourceList);
sceneNumVo.setCooperationSceneNum(sceneCooperationService.getCooperationSceneNum(userId,sceneSourceList));
sceneNumVo.setSceneNum(sceneNum + count);
sceneNumVo.setTotalNum(sceneNumVo.getSceneNum() + sceneNumVo.getCooperationSceneNum());
return sceneNumVo;
}
@Override
public HashMap findSceneNumByCameraIds(List cameraIdList) {
HashMap map = new HashMap<>();
List result = this.getBaseMapper().findSceneProNumByCameraIds(cameraIdList);
List result2 = this.getBaseMapper().findScenePlusNumByCameraIds(cameraIdList);
result.forEach(entity ->map.put(entity.getId(),entity));
for (GroupByCount groupByCount : result2) {
if (map.get(groupByCount.getId()) != null) {
Long totalCount = map.get(groupByCount.getId()).getCount() + groupByCount.getCount();
String lastTime = DateUserUtil.getLastTime(map.get(groupByCount.getId()).getLastTime(), groupByCount.getLastTime());
groupByCount.setCount(totalCount);
groupByCount.setLastTime(lastTime);
}
map.put(groupByCount.getId(),groupByCount);
}
return map;
}
/**
* @param payStatus -2 封存,为 1 解封
*/
@Override
public void lockOrUnLockBySpace(CameraDetail cameraDetail, Long cameraId, int payStatus) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
LambdaQueryWrapper plusWr = new LambdaQueryWrapper<>();
Long count = 0L;
if(payStatus == 1){ //解封,判断用户权益,用户会员权益无限容量
count = userIncrementService.getValidCountByCameraId(cameraId);
wrapper.orderByAsc(ScenePro::getCreateTime);
plusWr.orderByAsc(ScenePlus::getCreateTime);
wrapper.eq(ScenePro::getPayStatus,-2);
plusWr.eq(ScenePlus::getPayStatus,-2);
}else {
wrapper.orderByDesc(ScenePro::getCreateTime);
plusWr.orderByDesc(ScenePlus::getCreateTime);
wrapper.eq(ScenePro::getPayStatus,1);
plusWr.eq(ScenePlus::getPayStatus,1);
}
wrapper.eq(ScenePro::getCameraId,cameraId)
.eq(ScenePro::getSceneScheme,4)
.eq(ScenePro::getIsUpgrade,0);
plusWr.eq(ScenePlus::getCameraId,cameraId);
List list = this.list(wrapper);
List plusList = scenePlusService.list(plusWr);
Long beyondSpace = Math.abs(cameraDetail.getUsedSpace() - cameraDetail.getTotalSpace());
Long accumulateSpace = 0L;
List lockedIds = new ArrayList<>();
if(payStatus == 1){
getScenePlusLockedIds(lockedIds,plusList,count,beyondSpace,accumulateSpace);
getSceneLockedIds(lockedIds,list,count,beyondSpace,accumulateSpace);
}else {
getSceneLockedIds(lockedIds,list,count,beyondSpace,accumulateSpace);
getScenePlusLockedIds(lockedIds,plusList,count,beyondSpace,accumulateSpace);
}
lockOrUnLockScenes(lockedIds,payStatus);
}
private void getSceneLockedIds(List lockedIds ,List list,Long count,Long beyondSpace,Long accumulateSpace){
if (list != null && list.size() > 0){
for (ScenePro scenePro : list){
accumulateSpace += scenePro.getSpace();
if (count ==0 && accumulateSpace.compareTo(beyondSpace) > 0){
break;
}
lockedIds.add(scenePro.getId());
}
}
}
private void getScenePlusLockedIds(List lockedIds ,List list,Long count,Long beyondSpace,Long accumulateSpace){
if (list != null && list.size() > 0){
List plusIds = list.parallelStream().map(ScenePlus::getId).collect(Collectors.toList());
HashMap byPlusIds = scenePlusExtService.getByPlusIds(plusIds);
for (ScenePlus scenePlus : list){
ScenePlusExt scenePlusExt = byPlusIds.get(scenePlus.getId());
accumulateSpace += scenePlusExt.getSpace();
if (count ==0 && accumulateSpace.compareTo(beyondSpace) > 0){
break;
}
lockedIds.add(scenePlus.getId());
}
}
}
// payStatus 为 -2 封存,为 1 解封
private void lockOrUnLockScenes(List lockedIds,Integer payStatus) {
if (lockedIds == null || lockedIds.size() == 0){
return;
}
LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(ScenePro::getPayStatus,payStatus)
.eq(ScenePro::getIsUpgrade,0)
.in(ScenePro::getId,lockedIds);
this.update(updateWrapper);
LambdaUpdateWrapper updatePlusWrapper = new LambdaUpdateWrapper<>();
updatePlusWrapper.set(ScenePlus::getPayStatus,payStatus)
.in(ScenePlus::getId,lockedIds);
scenePlusService.update(updatePlusWrapper);
}
@Override
public List getListByCameraId(Long cameraId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ScenePro::getCameraId,cameraId)
.eq(ScenePro::getIsUpgrade,0);
return this.list(wrapper);
}
@Override
public void bindOrUnCamera(List cameraIds, Long userId) {
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.in(ScenePro::getCameraId,cameraIds)
.eq(ScenePro::getIsUpgrade,0)
.set(ScenePro::getUserId,userId);
this.update(wrapper);
}
@Override
public List getListByCameraIds(List cameraIds) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(ScenePro::getCameraId,cameraIds)
.eq(ScenePro::getIsUpgrade,0);
return this.list(wrapper);
}
@Override
public List getListByNums(List numList) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(ScenePro::getNum,numList)
.eq(ScenePro::getIsUpgrade,0);
return this.list(wrapper);
}
@Override
public Long getCountByUserId(Long userId, List resourceList) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ScenePro::getUserId,userId);
wrapper.eq(ScenePro::getIsUpgrade,0);
wrapper.in(ScenePro::getSceneSource,resourceList);
return this.count(wrapper);
}
@Override
public Long getCountByUserId(Long id, Integer cameraType) {
return this.getBaseMapper().getCountByUserId(id,cameraType);
}
@Override
public void deleteByIds(List sceneIds) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(ScenePro::getId,sceneIds)
.eq(ScenePro::getIsUpgrade,0);
List proList = this.list(wrapper);
LambdaQueryWrapper plusWr = new LambdaQueryWrapper<>();
plusWr.in(ScenePlus::getId,sceneIds);
List plusList = scenePlusService.list(plusWr);
this.deleteByList(proList,plusList);
}
@Override
public JSONObject newList(SceneParam param, String username) {
User user = userService.getByUserName(username);
param.setSourceList(getSceneSource(param.getSceneSource()));
param.setUserId(user.getId());
if(param.getFolderId() == -1){ //双目文件夹场景
return sceneService.pageList(param);
}
Page sceneVoPage = getBaseMapper().pageListAndFolder(new Page<>(param.getPageNum(),param.getPageSize()),param);
List folderList = sceneVoPage.getRecords().parallelStream().filter(entity -> entity.getIsFolder() == 1).collect(Collectors.toList());
Integer folderNum = 0;
if(folderList.size() >0){
List folderIds = folderList.parallelStream().map(SceneVo::getId).collect(Collectors.toList());
List allFolderIds = folderService.getAllFolderIds(folderIds);
folderNum = allFolderIds.size();
HashMap map = folderSceneService.getGroupByFolderIds(allFolderIds);
for (SceneVo vo : sceneVoPage.getRecords()) {
if(vo.getIsFolder() == 1){
Long sceneNum = map.get(vo.getId()) == null ? 0L : map.get(vo.getId());
vo.setSceneNum(sceneNum);
vo.setCreateTimeStr(vo.getCreateTime());
}
}
}
//设置协作者信息
if(sceneVoPage.getRecords().size() >0){
List numList = sceneVoPage.getRecords().parallelStream().map(SceneVo::getNum).collect(Collectors.toList());
HashMap cooMap = sceneCooperationService.getByNumList(numList);
for (SceneVo vo : sceneVoPage.getRecords()) {
if (StringUtils.isNotBlank(vo.getNum())) {
User userVo = cooMap.get(vo.getNum());
if (userVo != null) {
vo.setCooperationUserId(userVo.getId().toString());
vo.setCooperationUserName(userVo.getUserName());
}
}
}
}
if(param.getSceneSource().equals("1") && param.getPageNum() == 1){ //增加双目文件夹
SceneVo sceneVo = new SceneVo();
sceneVo.setId(-1L);
sceneVo.setIsFolder(1);
sceneVo.setName("双目文件夹");
sceneVo.setType("3");
Integer count = sceneService.getCountByUserId(user.getId());
sceneVo.setSceneNum(Long.valueOf(count));
folderList.add(sceneVo);
}
List sceneList = sceneVoPage.getRecords().parallelStream().filter(entity -> entity.getIsFolder() == 0).collect(Collectors.toList());
if(sceneList.size() >0){
folderList.addAll(sceneList);
}
sceneVoPage.setRecords(folderList);
JSONObject jsonObject = new JSONObject();
jsonObject.put("pageInfo",PageInfo.PageInfo(sceneVoPage));
jsonObject.put("sceneNum",sceneVoPage.getTotal() - folderNum);
return jsonObject;
}
public List getSceneSource(String sceneSource){
List sceneSourceList ;
switch (sceneSource){
case "1" : sceneSourceList = Arrays.asList("1","2","12","13","14"); break; //四维看看
case "3" : sceneSourceList = Collections.singletonList("3"); break;//四维看见
default:
if(sceneSource.contains(",")){
sceneSource = sceneSource + ",12,13,14";
sceneSourceList = Arrays.asList(sceneSource.split(","));
break;
}
sceneSourceList = Collections.singletonList(sceneSource);break;
}
return sceneSourceList;
}
@Override
public void copyScene(String sceneNum,String userName) throws Exception {
if(StringUtils.isEmpty(sceneNum)){
throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
}
ScenePro scenePro = this.getByNum(sceneNum);
ScenePlus scenePlus = scenePlusService.getByNum(sceneNum);
if((scenePro == null || scenePro.getCameraId() == null ) && (scenePlus== null || scenePlus.getCameraId() == null)){
throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
}
Long cameraId = scenePro == null ? scenePlus.getCameraId() : scenePro.getCameraId();
Long userId = scenePro == null ? scenePlus.getUserId() :scenePro.getUserId();
// 判断是否有绑定会员权益
Long count = userIncrementService.getValidCountByCameraId(cameraId);
if(count <= 0){
throw new BusinessException(LoginConstant.FAILURE_CODE_3030, LoginConstant.FAILURE_MSG_3030);
}
if(userId == null){
throw new BusinessException(SceneConstant.FAILURE_CODE_5013, SceneConstant.FAILURE_MSG_5013);
}
//只能复制自己的场景
User user = userService.getByUserName(userName);
if(user == null || !user.getId().equals(userId) ){
throw new BusinessException(SceneConstant.FAILURE_CODE_5013, SceneConstant.FAILURE_MSG_5013);
}
this.copySceneNoCheck(sceneNum);
}
@Override
public void copySceneNoCheck(String sceneNum) throws Exception {
ScenePro scenePro = this.getByNum(sceneNum);
ScenePlus scenePlus = scenePlusService.getByNum(sceneNum);
Long cameraId = scenePro == null ? scenePlus.getCameraId() : scenePro.getCameraId();
CameraDetail detailEntity = cameraDetailService.getByCameraId(cameraId);
if(detailEntity == null){
throw new BusinessException(CameraConstant.FAILURE_CODE_6029, CameraConstant.FAILURE_MSG_6029);
}
String newNum = scene3dNumService.generateSceneNum(detailEntity.getType());
String title = scenePro == null ? scenePlus.getTitle() : scenePro.getSceneName();
String newTitle = title.concat("(copy)");
Long sceneId = scenePro == null ? scenePlus.getId() :scenePro.getId();
Long newSceneId = null;
FolderScene folderScene = folderSceneService.getByType(sceneId, null);
String time = DateUtil.date2String(new Date(),DateUtil.YYYYMMDDHHMMSSSSS_DATA_FORMAT);
if(scenePro !=null){ //v3场景复制
log.info("场景复制--V3--OldNum:{},oldTitle:{},newNum:{},newTitle:{}",
scenePro.getNum(),scenePro.getSceneName(),newNum,newTitle);
scenePro.setSceneName(newTitle);
newSceneId = this.copyV3Scene(scenePro, newNum, detailEntity,time);
}
if(scenePlus != null){ //v4场景复制
log.info("场景复制--V4--OldNum:{},oldTitle:{},newNum:{},newTitle:{}",
scenePlus.getNum(),scenePlus.getTitle(),newNum,newTitle);
scenePlus.setTitle(newTitle);
newSceneId = scenePlusService.copyV4Scene(scenePlus,newNum,detailEntity,time);
}
log.info("场景复制--完成--sceneId:{}",newSceneId);
if(newSceneId != null && folderScene!= null){
folderScene.setId(null);
folderScene.setSceneId(newSceneId);
folderSceneService.save(folderScene);
}
}
@Override
public ScenePro getByNum(String sceneNum) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ScenePro::getNum,sceneNum);
wrapper.eq(ScenePro::getIsUpgrade,0);
List list = this.list(wrapper);
if(list!= null && list.size() >0){
return list.get(0);
}
return null;
}
@Override
public Long copyV3Scene(ScenePro oldScene,String newNum,CameraDetail cameraDetail,String time) throws Exception {
SceneProEdit oldEditScene = sceneProEditService.getByProId(oldScene.getId());
String oldNum = oldScene.getNum();
//复制数据库数据
oldScene.setId(null);
oldScene.setStatus(0);
oldScene.setNum(newNum);
oldScene.setWebSite(oldScene.getWebSite().replace(oldScene.getNum(), newNum));
oldScene.setThumb(oldScene.getThumb().replace(oldScene.getNum(), newNum));
oldScene.setVideos(this.setVideos(oldScene.getVideos(),oldNum,newNum));
oldScene.setViewCount(0);
String preDataSource = oldScene.getDataSource();
String newDataSource = this.setDataSource(preDataSource,time);
oldScene.setDataSource(newDataSource);
this.save(oldScene);
//更新video
Map map = new HashMap();
JSONObject object = new JSONObject();
if(StringUtils.isNotEmpty(oldScene.getVideos())){
object = JSONObject.parseObject(oldScene.getVideos());
if(object.containsKey("upPath")){
String upPath = object.getString("upPath");
upPath = upPath.replace(oldNum,newNum);
object.put("upPath",upPath);
}
oldScene.setVideos(object.toJSONString());
log.info("更新 scene.json");
map.put("videos",oldScene.getVideos());
}
map.put("sceneName",oldScene.getSceneName());
map.put("webSite",oldScene.getWebSite());
map.put("thumb",oldScene.getThumb());
map.put("num",oldScene.getNum());
map.put("id",oldScene.getId());
map.put("dataSource",oldScene.getDataSource());
sceneCopyLogService.saveByNum(oldNum,newNum,oldScene.getUserId());
//复制完成更新相机容量
oldEditScene.setId(null);
oldEditScene.setProId(oldScene.getId());
oldEditScene.setScreencapVoiceSrc(oldEditScene.getScreencapVoiceSrc() == null ? null : oldEditScene.getScreencapVoiceSrc().replace(oldNum, newNum));
oldEditScene.setScreencapVoiceSound(oldEditScene.getScreencapVoiceSound() == null ? null : oldEditScene.getScreencapVoiceSound().replace(oldNum, newNum));
oldEditScene.setScreencapVoiceSoundsync(oldEditScene.getScreencapVoiceSoundsync() == null ? null : oldEditScene.getScreencapVoiceSoundsync().replace(oldNum, newNum));
oldEditScene.setPlayData(oldEditScene.getPlayData() == null ? null : oldEditScene.getPlayData().replace(oldNum, newNum));
oldEditScene.setScreencapThumb(oldEditScene.getScreencapThumb() == null ? null : oldEditScene.getScreencapThumb().replace(oldNum, newNum));
oldEditScene.setFloorPlanPng(oldEditScene.getFloorPlanPng() == null ? null : oldEditScene.getFloorPlanPng().replace(oldNum, newNum));
sceneProEditService.save(oldEditScene);
this.setQrCode(oldScene.getBuildType(), oldScene.getNum());
CompletableFuture.runAsync(() -> {
try {
log.info("开始复制场景-{}", new Date());
String buildModelPath = ConstantFilePath.BUILD_MODEL_PATH;
if(oldScene.getSceneSource().equals(4)){
buildModelPath = ConstantFilePath.BUILD_MODEL_LASER_PATH;
}
this.copyFdage(preDataSource,newDataSource,buildModelPath,time);
//oss复制计算结果资源
downloadFromOldNumFromOss(oldNum, newNum);
// 复制本地secen.json
copyOldSceneLocalToNew(oldNum, newNum);
FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + File.separator + "scene.json", map);
//上传资源到oss
uploadNewSceneToOss(newNum);
FileUtils.delFolder(ConstantFilePath.SCENE_PATH + "images/images" + newNum);
FileUtils.delFolder(ConstantFilePath.SCENE_PATH + "data/data" + newNum);
FileUtils.delFolder(ConstantFilePath.SCENE_PATH + "voice/voice" + newNum);
FileUtils.delFolder(ConstantFilePath.SCENE_PATH + "video/video" + newNum);
FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"images/images" + oldNum,ConstantFilePath.SCENE_PATH +"images/images" + newNum);
FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"data/data" + oldNum,ConstantFilePath.SCENE_PATH +"data/data" + newNum);
FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + File.separator + "scene.json", map);
reloadFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/link-scene.json",oldNum, newNum);
reloadFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/hot.json",oldNum, newNum);
FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"voice/voice" + oldNum,ConstantFilePath.SCENE_PATH +"voice/voice" + newNum);
FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"video/video" + oldNum,ConstantFilePath.SCENE_PATH +"video/video" + newNum);
oldScene.setStatus(-2);
this.updateById(oldScene);
log.info("复制场景结束-{}", new Date());
} catch (Exception e) {
this.removeById(oldScene.getId());
log.error("复制场景异常", e);
}
});
return oldScene.getId();
}
/**
* 从旧场景下载资源
* @param sceneNum
* @param newNum
* @throws Exception
*/
private void downloadFromOldNumFromOss(String sceneNum, String newNum) throws Exception {
ShellUtil.yunDownload("images/images" + sceneNum + "/", ConstantFilePath.SCENE_PATH + "images/images" + newNum);
ShellUtil.yunDownload("data/data" + sceneNum + "/", ConstantFilePath.SCENE_PATH + "data/data" + newNum);
ShellUtil.yunDownload("voice/voice" + sceneNum + "/", ConstantFilePath.SCENE_PATH + "voice/voice" + newNum);
ShellUtil.yunDownload("video/video" + sceneNum + "/", ConstantFilePath.SCENE_PATH + "video/video" + newNum);
}
/**
* 从本地旧场景拷贝资源到新场景
* @param sceneNum
* @param newNum
*/
private void copyOldSceneLocalToNew(String sceneNum, String newNum) throws Exception {
FileUtils.copyFolderAllFiles(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + "/",
ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/", true);
reloadFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/link-scene.json",sceneNum, newNum);
reloadFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/hot.json",sceneNum, newNum);
}
public void copyFdage(String oldDataSource,String newDataSource,String buildModelPath,String time) throws Exception {
ShellUtil.yunDownload(ConstantFilePath.OSS_PREFIX + oldDataSource.replace(buildModelPath, "")+"/", newDataSource);
// 修改data.fdage
String data = FileUtils.readFile(newDataSource + "/data.fdage");
JSONObject jsonObject = JSONObject.parseObject(data);
if(ObjectUtils.isEmpty(jsonObject)){
log.error("data.fdage文件不存在");
throw new BusinessException(-1,"拷贝场景出错,data.fdage文件不存在");
}
jsonObject.put("uuidtime",time);
FileUtils.writeFile(newDataSource + "/data.fdage", jsonObject.toJSONString());
ShellUtil.yunUpload(newDataSource, ConstantFilePath.OSS_PREFIX + newDataSource.replace(buildModelPath, ""));
// 复制计算结果
ShellUtil.yunDownload(ConstantFilePath.OSS_PREFIX + oldDataSource.concat("_results/").replace(buildModelPath, ""), newDataSource.concat("_results"));
if(new File(newDataSource.concat("_results")).exists()){
ShellUtil.yunUpload(newDataSource.concat("_results"), ConstantFilePath.OSS_PREFIX + newDataSource.concat("_results").replace(buildModelPath, ""));
FileUtils.delAllFile(newDataSource.concat("_results"));
}
FileUtils.delAllFile(newDataSource);
FileUtils.copyFolderAllFiles(oldDataSource+"/",newDataSource+"/", true);
}
@Override
public String setDataSource(String preDataSource,String time) throws Exception {
SnowflakeIdGenerator snowflakeIdGenerator = new SnowflakeIdGenerator(0,1);
String[] datasource = preDataSource.split("/");
datasource[4] = snowflakeIdGenerator.nextId()+"";
datasource[5] = datasource[5].split("_")[0] + "_" + time;
return Arrays.stream(datasource).collect(Collectors.joining("/"));
}
@Override
public String setVideos(String videos,String oldNum,String newNum) {
JSONObject object = new JSONObject();
if(StringUtils.isNotEmpty(videos)){
object = JSONObject.parseObject(videos);
if(object.containsKey("upPath")){
String upPath = object.getString("upPath");
upPath = upPath.replace(oldNum,newNum);
object.put("upPath",upPath);
}
log.info("更新 scene.json");
}
return object.toJSONString();
}
private void reloadFile(String filePath,String sceneNum, String newNum) throws Exception {
// 修改link-scene.json
String content = FileUtils.readFile(filePath);
if (!ObjectUtils.isEmpty(content)) {
content = content.replaceAll(sceneNum, newNum);
FileUtils.writeFile(filePath,content);
}
}
/**
* 上传新场景资源到oss
* @param newNum
*/
private void uploadNewSceneToOss(String newNum) {
ShellUtil.yunUpload("/mnt/4Dkankan/scene/images/images" + newNum, "images/images" + newNum);
ShellUtil.yunUpload("/mnt/4Dkankan/scene/data/data" + newNum, "data/data" + newNum);
ShellUtil.yunUpload("/mnt/4Dkankan/scene/voice/voice" + newNum, "voice/voice" + newNum);
ShellUtil.yunUpload("/mnt/4Dkankan/scene/video/video" + newNum, "video/video" + newNum);
}
@Override
public void delete(String sceneNum) {
if(StringUtils.isEmpty(sceneNum)){
throw new BusinessException(LoginConstant.FAILURE_CODE_3001,LoginConstant.FAILURE_MSG_3001);
}
String[] nums = sceneNum.split(",");
List numList = Arrays.asList(nums);
List proList = this.getListByNums(numList);
List plusList = scenePlusService.getListByNums(numList);
this.deleteByList(proList,plusList);
}
@Override
public void deleteByList(List proList,List plusList) {
HashMapcameraMap = new HashMap<>();
if(proList.size() >0){
for (ScenePro scenePro : proList) {
cameraMap.merge(scenePro.getCameraId(), scenePro.getSpace(), Long::sum);
}
List proIds = proList.parallelStream().map(ScenePro::getId).collect(Collectors.toList());
this.removeByIds(proIds);
}
if(plusList.size() >0){
List plusIds = plusList.parallelStream().map(ScenePlus::getId).collect(Collectors.toList());
HashMap plusMap = scenePlusExtService.getByPlusIds(plusIds);
for (ScenePlus scenePlus : plusList) {
cameraMap.merge(scenePlus.getCameraId(), plusMap.get(scenePlus.getId()).getSpace(), Long::sum);
}
scenePlusService.removeByIds(plusIds);
}
//恢复相机使用容量
if(cameraMap.size() >0){
cameraDetailService.addUsedSpace(cameraMap);
}
}
@Override
public ScenePro getByUnicode(String unicode) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.like(ScenePro::getDataSource,unicode);
wrapper.eq(ScenePro::getIsUpgrade,0);
wrapper.orderByDesc(ScenePro::getCreateTime);
List list = this.list(wrapper);
if(list !=null && list.size() >0){
return list.get(0);
}
return null;
}
@Override
public SceneInfoVo getInfo(String num) {
if(StringUtils.isEmpty(num)){
throw new BusinessException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
}
ScenePro scenePro = this.getByNum(num);
ScenePlus scenePlus = scenePlusService.getByNum(num);
if(scenePro == null && scenePlus == null){
throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
}
if(scenePro!=null && scenePro.getStatus() != 1 && scenePro.getStatus() != -2){
throw new BusinessException(SceneConstant.FAILURE_CODE_5033, SceneConstant.FAILURE_MSG_5033);
}
if(scenePlus!=null && scenePlus.getSceneStatus() != 1 && scenePlus.getSceneStatus() != -2){
throw new BusinessException(SceneConstant.FAILURE_CODE_5033, SceneConstant.FAILURE_MSG_5033);
}
if(scenePro!=null && scenePro.getPayStatus() != 1){
throw new BusinessException(SceneConstant.FAILURE_CODE_5034, SceneConstant.FAILURE_MSG_5034);
}
if(scenePlus!=null && scenePlus.getPayStatus() != 1){
throw new BusinessException(SceneConstant.FAILURE_CODE_5034, SceneConstant.FAILURE_MSG_5034);
}
SceneInfoVo infoVo = new SceneInfoVo();
if(scenePro!=null){
SceneProEdit sceneProEdit = sceneProEditService.getByProId(scenePro.getId());
if(sceneProEdit !=null){
BeanUtils.copyProperties(sceneProEdit, infoVo);
}
BeanUtils.copyProperties(scenePro,infoVo);
if(StringUtils.isNotEmpty(scenePro.getGps())){
infoVo.setGps(JSONObject.parseObject(scenePro.getGps()).toJSONString());
}
infoVo.setSceneKey("");
infoVo.setCreateDate(DateUserUtil.getDate(scenePro.getCreateTime()).getTime());
}else {
SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
ScenePlusExt scenePlusExt = scenePlusExtService.getByPlusId(scenePlus.getId());
if(sceneEditInfo != null){
BeanUtils.copyProperties(sceneEditInfo,infoVo);
}
if(scenePlusExt !=null){
BeanUtils.copyProperties(scenePlusExt,infoVo);
}
BeanUtils.copyProperties(scenePlus,infoVo);
infoVo.setSceneName(scenePlus.getTitle());
infoVo.setStatus(scenePlus.getSceneStatus());
}
if(StringUtils.isNotEmpty(infoVo.getEntry())){
infoVo.setEntry(JSONObject.parseObject(infoVo.getEntry()).toJSONString());
}
if(StringUtils.isEmpty(infoVo.getSceneKey())){
infoVo.setIsPublic(0);
}else {
infoVo.setIsPublic(1);
}
//查询是否有随心装场景
if(num.contains("vr-")){
infoVo.setVrNum(null);
infoVo.setVideosUser(null);
infoVo.setBgMusicName(null);
infoVo.setBgMusic(null);
}
this.updateViewCount(num);
return infoVo;
}
@Override
public void updateViewCount(String num) {
String redisKey = RedisKey.SCENE_VISIT_CNT;
if(!redisUtil.hHasKey(redisKey,num)){
Integer count = 0;
ScenePro pro = this.getByNum(num);
if(pro !=null){
count = pro.getViewCount();
}else {
ScenePlus plus = scenePlusService.getByNum(num);
if(plus !=null){
ScenePlusExt scenePlusExt = scenePlusExtService.getByPlusId(plus.getId());
count = scenePlusExt.getViewCount();
}
}
redisUtil.hset(redisKey,num,String.valueOf(count));
}
redisUtil.hincr(redisKey,num,1);
}
@Override
public void updateDbViewCount(String num, String count) {
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(ScenePro::getNum,num);
wrapper.set(ScenePro::getViewCount,count);
this.update(wrapper);
ScenePlus plus = scenePlusService.getByNum(num);
if(plus !=null){
LambdaUpdateWrapper exWr = new LambdaUpdateWrapper<>();
exWr.eq(ScenePlusExt::getPlusId,plus.getId())
.set(ScenePlusExt::getViewCount,count);
scenePlusExtService.update(exWr);
}
}
@Override
public ScenePro findByFileId(String fileId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.like(ScenePro::getDataSource,fileId);
List list = this.list(wrapper);
if(list !=null && list.size() >0){
return list.get(0);
}
return null;
}
@Override
public void setQrCode(String buildType,String num) throws Exception {
String basePath = mainUrl;
if("V2".equals(buildType)){
basePath += sceneProUrl;
}
if("V3".equals(buildType)){
basePath += sceneProNewUrl;
}
MatrixToImageWriterUtil.createQRCode(basePath + num, ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+".png", false,null);
MatrixToImageWriterUtil.createQRCode(basePath + num + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+"_en.png", false,null);
}
@Override
public void generateObjFile(String num) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ScenePro::getNum,num).eq(ScenePro::getRecStatus,"A");
ScenePro sceneProEntity = this.getOne(wrapper);
if(ObjectUtils.isEmpty(sceneProEntity)){
throw new BusinessException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
}
if(sceneProEntity.getSceneSource().intValue() != 4){
throw new BusinessException(LoginConstant.FAILURE_CODE_3003, "只能操作激光场景");
}
// 拷贝文件
String path = sceneProEntity.getDataSource();
if (!new File(path + "/caches/reconstruction/final.bin").exists()
|| !new File(path + "/caches/reconstruction/chunk.json").exists()
|| !new File(path + "/caches/images").exists()
|| !new File(path + "/caches/depthmap").exists()
|| !new File(path + "/caches/depthmap_csc").exists()
|| !new File(path + "/caches/panorama.json").exists()
|| !new File(path + "/results/laserData/laser.ply").exists()) {
log.error("生成obj缺少必要文件,生成失败!");
throw new BusinessException(SceneConstant.FAILURE_CODE_5038, SceneConstant.FAILURE_MSG_5038);
}
// 获取最新的场景名称
JSONObject sceneInfo = fdkkLaserService.getSceneByNum(sceneProEntity.getNum());
LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper
.set(ScenePro::getStatus, 0)
.set(ScenePro::getIsObj, 1)
.set(ScenePro::getSceneName, sceneInfo.getString("title"))
.eq(ScenePro::getNum, sceneProEntity.getNum());
this.update(updateWrapper);
//同步到scenePlus、scenePlus
sceneUpgradeMapper.deleteScenePlus(sceneProEntity.getId());
sceneUpgradeMapper.transferScenePlus(sceneProEntity.getId());
sceneUpgradeMapper.deleteScenePlusExt(sceneProEntity.getId());
String sceneKind = sceneProEntity.getSceneScheme() == 3 ? SceneKind.FACE.code(): SceneKind.TILES.code();
sceneUpgradeMapper.transferScenePlusExt(sceneProEntity.getId(), sceneKind);
log.info("开始发送激光场景生成obj mq消息");
Camera camera = cameraService.getById(sceneProEntity.getCameraId());
// 发送MQ
BuildSceneCallMessage mqMsg = new BuildSceneCallMessage();
mqMsg.setSceneNum(sceneProEntity.getNum());
mqMsg.setUserId(sceneProEntity.getUserId());
mqMsg.setAlgorithm(sceneProEntity.getAlgorithm());
mqMsg.setBuildType(sceneProEntity.getBuildType());
mqMsg.setDataSource(sceneProEntity.getDataSource());
mqProducer.sendByWorkQueue(queueObjModelingPre,mqMsg);
}
}