package com.fdkankan.ucenter.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
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.util.FileUtils;
import com.fdkankan.fyun.face.FYunFileServiceInterface;
import com.fdkankan.image.MatrixToImageWriterUtil;
import com.fdkankan.ucenter.common.PageInfo;
import com.fdkankan.ucenter.common.constants.ConstantFilePath;
import com.fdkankan.ucenter.common.constants.UploadFilePath;
import com.fdkankan.redis.constant.RedisKey;
import com.fdkankan.redis.util.RedisUtil;
import com.fdkankan.ucenter.bean.SceneJsonBean;
import com.fdkankan.ucenter.entity.*;
import com.fdkankan.ucenter.httpClient.service.LaserService;
import com.fdkankan.ucenter.mapper.IScenePlusMapper;
import com.fdkankan.ucenter.service.*;
import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import com.fdkankan.ucenter.vo.ResponseScene;
import com.fdkankan.ucenter.vo.SceneEditControlsVO;
import com.fdkankan.ucenter.vo.request.RequestScene;
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 javax.annotation.Resource;
/**
*
* 场景主表 服务实现类
*
*
* @author
* @since 2022-07-04
*/
@Service
@Slf4j
public class ScenePlusServiceImpl extends ServiceImpl implements IScenePlusService {
@Autowired
private IScenePlusExtService scenePlusExtService;
@Autowired
private ISceneEditInfoService sceneEditInfoService;
@Autowired
private ISceneEditInfoExtService sceneEditInfoExtService;
@Autowired
private ISceneEditControlsService sceneEditControlsService;
@Autowired
private ICameraDetailService cameraDetailService;
@Autowired
private ISurveillanceService surveillanceService;
@Autowired
private ISceneProService sceneProService;
@Autowired
FYunFileServiceInterface fYunFileServiceInterface;
@Autowired
RedisUtil redisUtil;
@Autowired
LaserService laserService;
@Autowired
ISceneCopyLogService sceneCopyLogService;
@Override
public Long getCountByUserId(Long userId, List> sceneSourceList) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ScenePlus::getUserId, userId);
wrapper.in(ScenePlus::getSceneSource, sceneSourceList);
return this.count(wrapper);
}
@Override
public Long getCountByUserId(Long userId, Integer cameraType) {
return this.getBaseMapper().getCountByUserId(userId,cameraType);
}
@Override
public List getListByCameraId(Long cameraId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ScenePlus::getCameraId,cameraId);
return this.list(wrapper);
}
@Override
public void bindOrUnCamera(List cameraIds, Long userId) {
if(cameraIds.size() >0){
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.set(ScenePlus::getUserId,userId)
.in(ScenePlus::getCameraId,cameraIds);
this.update(wrapper);
}
}
@Override
public List getListByCameraIds(List cameraIds) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(ScenePlus::getCameraId,cameraIds);
return this.list(wrapper);
}
@Override
public List getListByNums(List numList) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(ScenePlus::getNum,numList);
return this.list(wrapper);
}
@Override
public HashMap getMapByIds(List sceneIds) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(ScenePlus::getId,sceneIds);
List list = this.list(wrapper);
HashMap map = new HashMap<>();
list.forEach(entity -> map.put(entity.getId(),entity));
return map;
}
@Override
public ScenePlus getByNum(String sceneNum) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ScenePlus::getNum,sceneNum);
List list = this.list(wrapper);
if(list!=null && list.size() >0){
return list.get(0);
}
return null;
}
@Override
public List getByIds(List plusIds) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(ScenePlus::getId,plusIds);
return this.list(wrapper);
}
@Override
public Long copyV4Scene(ScenePlus scenePlus,String newNum ,CameraDetail cameraDetail,String time) throws Exception {
String num = scenePlus.getNum();
Long plusId = scenePlus.getId();
ScenePlusExt plusExt = scenePlusExtService.getByPlusId(plusId);
// 拷贝数据
scenePlus.setNum(newNum);
scenePlus.setId(null);
scenePlus.setSceneStatus(0);
this.save(scenePlus);
cameraDetail.setUsedSpace(cameraDetail.getUsedSpace() + plusExt.getSpace());
cameraDetailService.updateById(cameraDetail);
CompletableFuture.runAsync(() -> {
try {
// 拷贝场景编辑资源
String oldEditPath = String.format(UploadFilePath.EDIT_PATH, num);
String newEditPath = String.format(UploadFilePath.EDIT_PATH, newNum);
fYunFileServiceInterface.copyFileInBucket(oldEditPath, newEditPath);
// 拷贝场景展示资源
String oldViewPath = String.format(UploadFilePath.VIEW_PATH, num);
String newViewPath = String.format(UploadFilePath.VIEW_PATH, newNum);
fYunFileServiceInterface.copyFileInBucket(oldViewPath, newViewPath);
// 拷贝本地资源
String oldPath = String.format("/mnt/4Dkankan/scene/%s/caches/images", num);
String newPath = String.format("/mnt/4Dkankan/scene/%s/caches/images", newNum);
if(new File(oldPath).exists()){
FileUtils.copyDirectiory(oldPath, newPath);
}
String scenePath = ConstantFilePath.SCENE_V4_PATH + num;
File file = new File(scenePath);
if(file.exists()){
String newScenePath = ConstantFilePath.SCENE_V4_PATH + newNum;
FileUtils.copyDirectiory(scenePath, newScenePath);
}
String newVideos = plusExt.getVideos().replaceAll("https://4dkk.4dage.com/data/data" + num, "https://4dkk.4dage.com/scene_view_data/" + newNum + "/data");
String oldDataSource = plusExt.getDataSource();
String newDataSource = sceneProService.setDataSource(plusExt.getDataSource(),time);
String buildModelPath = ConstantFilePath.BUILD_MODEL_PATH;
if(scenePlus.getSceneSource().equals(4)){
buildModelPath = ConstantFilePath.BUILD_MODEL_LASER_PATH;
}
sceneProService.copyFdage(oldDataSource,newDataSource,buildModelPath,time);
plusExt.setId(null);
plusExt.setPlusId(scenePlus.getId());
plusExt.setDataSource(newDataSource);
plusExt.setWebSite(plusExt.getWebSite().replace(num, newNum));
plusExt.setThumb(plusExt.getThumb().replace(num, newNum));
plusExt.setVideos(newVideos);
plusExt.setViewCount(0);
scenePlusExtService.save(plusExt);
SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(plusId);
Long sceneEditInfoId = sceneEditInfo.getId();
sceneEditInfo.setId(null);
sceneEditInfo.setScenePlusId(scenePlus.getId());
sceneEditInfo.setSceneProId(null);
sceneEditInfo.setTitle(scenePlus.getTitle());
sceneEditInfoService.save(sceneEditInfo);
SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfoId);
sceneEditInfoExt.setId(null);
sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
sceneEditInfoExt.setScenePlusId(scenePlus.getId());
sceneEditInfoExt.setSceneProId(null);
sceneEditInfoExtService.save(sceneEditInfoExt);
SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfoId);
sceneEditControls.setId(null);
sceneEditControls.setEditInfoId(sceneEditInfo.getId());
sceneEditControlsService.save(sceneEditControls);
if(scenePlus.getSceneSource() == 4){ //深时复制
laserService.copy(scenePlus.getCameraId(),scenePlus.getCreateTime(),newNum,0,null,
sceneEditInfo.getScenePassword(),scenePlus.getTitle(),scenePlus.getUserId(),"V4");
}
List list = surveillanceService.list(new LambdaQueryWrapper().eq(Surveillance::getNum, num));
if (!Objects.isNull(list)) {
list.stream().forEach(item -> {
item.setNum(newNum);
item.setId(null);
surveillanceService.save(item);
});
}
// 生成scene.json
SceneJsonBean sceneJson = new SceneJsonBean();
BeanUtil.copyProperties(sceneEditInfoExt, sceneJson);
BeanUtil.copyProperties(sceneEditInfo, sceneJson);
SceneEditControlsVO sceneEditControlsVO = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class);
sceneJson.setControls(sceneEditControlsVO);
sceneJson.setNum(newNum);
sceneJson.setCreateTime(scenePlus.getCreateTime());
sceneJson.setSceneResolution(plusExt.getSceneResolution());
sceneJson.setSceneFrom(plusExt.getSceneFrom());
sceneJson.setSceneKind(plusExt.getSceneKind());
if(StrUtil.isNotEmpty(plusExt.getVideos())){
sceneJson.setVideos(plusExt.getVideos());
}
sceneJson.setMosaicList(sceneEditInfoService.getMosaicList(num));
log.info("开始生成本地json文件……");
String sceneJsonLocalPath = ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + newNum + File.separator + "scene.json";
FileUtils.writeFile(sceneJsonLocalPath, JSON.toJSONString(sceneJson));
String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH+"scene.json", newNum);
fYunFileServiceInterface.uploadFile(JSON.toJSONBytes(sceneJson), sceneJsonPath);
//删除scenejson缓存
redisUtil.del(String.format(RedisKey.SCENE_JSON, num));
// 生成二维码
String outPathZh = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + newNum + ".png";
String outPathEn = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + newNum + "_en.png";
MatrixToImageWriterUtil.createQRCode(plusExt.getWebSite(), outPathZh, false,null);
MatrixToImageWriterUtil.createQRCode(plusExt.getWebSite() + "&lang=en", outPathEn, false, null);
fYunFileServiceInterface.uploadFile(outPathZh, String.format(UploadFilePath.DOWNLOADS_QRCODE, newNum) + newNum + ".png");
fYunFileServiceInterface.uploadFile(outPathEn, String.format(UploadFilePath.DOWNLOADS_QRCODE, newNum) + newNum + "_en.png");
scenePlus.setSceneStatus(-2);
this.updateById(scenePlus);
log.info("复制场景结束-{}", new Date());
if(scenePlus.getSceneSource() == 4){ //深时复制
String laserPath = laserService.copyDataSource(oldDataSource,plusExt.getDataSource());
laserService.copy(scenePlus.getCameraId(),scenePlus.getCreateTime(),newNum,2,laserPath,
sceneEditInfo.getScenePassword(),scenePlus.getTitle(),scenePlus.getUserId(),"V4");
}
sceneCopyLogService.saveByNum(num,newNum,scenePlus.getUserId());
}catch (Exception e){
this.removeById(scenePlus.getId());
log.error("复制场景异常", e);
}
});
return scenePlus.getId();
}
}