package com.fdkankan.manage_jp.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.fdkankan.common.constant.SceneVersionType;
import com.fdkankan.common.util.FileUtils;
import com.fdkankan.fyun.face.FYunFileServiceInterface;
import com.fdkankan.manage_jp.common.OssPath;
import com.fdkankan.manage_jp.common.ResultCode;
import com.fdkankan.manage_jp.entity.*;
import com.fdkankan.manage_jp.exception.BusinessException;
import com.fdkankan.manage_jp.httpClient.service.LaserService;
import com.fdkankan.manage_jp.mapper.IScenePlusMapper;
import com.fdkankan.manage_jp.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.manage_jp.util.SceneResourcePath;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.bytedeco.javacpp.presets.opencv_core;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.io.File;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
/**
*
* 场景主表 服务实现类
*
*
* @author
* @since 2022-12-30
*/
@Service
@Slf4j
public class ScenePlusServiceImpl extends ServiceImpl implements IScenePlusService {
@Autowired
IScene3dNumService scene3dNumService;
@Autowired
IScenePlusExtService scenePlusExtService;
@Autowired
ISceneEditInfoService sceneEditInfoService;
@Autowired
ISceneEditInfoExtService sceneEditInfoExtService;
@Autowired
ISceneEditControlsService sceneEditControlsService;
@Autowired
FYunFileServiceInterface fYunFileServiceInterface;
@Autowired
SceneCommonService sceneCommonService;
@Autowired
ISurveillanceService surveillanceService;
@Autowired
LaserService laserService;
@Autowired
ISceneProService sceneProService;
@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 void unbind(Long cameraId,Long userId) {
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(ScenePlus::getCameraId,cameraId);
wrapper.set(ScenePlus::getUserId,userId);
this.update(wrapper);
}
@Override
public ScenePlus copyScene(ScenePlus scenePlus) {
if(scenePlus.getSceneStatus() !=-2){
throw new BusinessException(ResultCode.SCENE_ERROR);
}
String oldNum = scenePlus.getNum();
String newNum = sceneCommonService.getNewNum(oldNum);
Long plusId = scenePlus.getId();
String oldSceneName = scenePlus.getTitle();
ScenePlusExt plusExt = scenePlusExtService.getByPlusId(plusId);
if(plusExt == null){
throw new BusinessException(ResultCode.NOT_RECORD);
}
scenePlus.setNum(newNum);
scenePlus.setTitle(scenePlus.getTitle() +"(copy)");
scenePlus.setSceneStatus(0);
scenePlus.setId(null);
this.save(scenePlus);
try {
sceneCommonService.v4Async(plusExt,oldNum,newNum,scenePlus,plusId,oldSceneName);
}catch (Exception e){
log.error("复制场景失败-sceneNum:{},error:{}",oldNum,e);
scenePlus.setSceneStatus(-1);
this.updateById(scenePlus);
throw new BusinessException(ResultCode.SCENE_DATA_ERROR);
}
return scenePlus;
}
@Override
public void updatePayStatus(String num,String version,Integer sceneSource,Integer payStatus,CameraDetail cameraDetail) {
if(version.equals("v3")){
LambdaUpdateWrapper wrapper2 = new LambdaUpdateWrapper<>();
wrapper2.set(ScenePro::getPayStatus,payStatus);
wrapper2.eq(ScenePro::getNum,num);
if(cameraDetail != null){
wrapper2.set(ScenePro::getCameraId,cameraDetail.getCameraId());
}
if(cameraDetail != null){
wrapper2.set(ScenePro::getUserId,cameraDetail.getUserId());
}
sceneProService.update(wrapper2);
updateOssPayStatus(String.format(OssPath.v3_statusPath,num),payStatus);
}else if(version.equals("v4")){
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.set(ScenePlus::getPayStatus,payStatus);
wrapper.eq(ScenePlus::getNum,num);
if(cameraDetail != null){
wrapper.set(ScenePlus::getCameraId,cameraDetail.getCameraId());
}
if(cameraDetail != null){
wrapper.set(ScenePlus::getUserId,cameraDetail.getUserId());
}
this.update(wrapper);
updateOssPayStatus(String.format(OssPath.v4_statusPath,num),payStatus);
}
if(sceneSource == 4 || sceneSource == 5){
laserService.updateStatus(num,payStatus==1?2:3,cameraDetail);
}
}
/**
* 修改oss status.json中 payStatus
*/
public void updateOssPayStatus(String path,Integer payStatus) {
try {
if(!fYunFileServiceInterface.fileExist(path)){
return;
}
String data = fYunFileServiceInterface.getFileContent(path);
if(StringUtils.isBlank(data)){
return;
}
JSONObject jsonObject = JSONObject.parseObject(data);
jsonObject.put("payStatus",payStatus);
String json = JSONUtil.toJsonStr(jsonObject);
FileUtils.writeFile(OssPath.localStatusPath ,json);
log.info("updateOssStatus--localPath:{},ossPath:{},payStatus:{}",OssPath.localStatusPath,path,payStatus);
fYunFileServiceInterface.uploadFile(OssPath.localStatusPath,path);
}catch (Exception e){
e.printStackTrace();
}finally {
FileUtil.del(OssPath.localStatusPath);
}
}
}