package com.fdkankan.scene.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fdkankan.common.constant.CommonStatus;
import com.fdkankan.common.constant.ErrorCode;
import com.fdkankan.model.constants.UploadFilePath;
import com.fdkankan.common.exception.BusinessException;
import com.fdkankan.common.response.ResultData;
import com.fdkankan.common.util.DateExtUtil;
import com.fdkankan.fyun.face.FYunFileServiceInterface;
import com.fdkankan.scene.entity.Camera;
import com.fdkankan.scene.entity.CameraDetail;
import com.fdkankan.scene.entity.SceneCooperation;
import com.fdkankan.scene.entity.ScenePlus;
import com.fdkankan.scene.entity.ScenePlusExt;
import com.fdkankan.scene.entity.SceneResource;
import com.fdkankan.scene.entity.User;
import com.fdkankan.scene.entity.UserIncrement;
import com.fdkankan.scene.service.ICameraDetailService;
import com.fdkankan.scene.service.ICameraService;
import com.fdkankan.scene.service.ISceneCooperationService;
import com.fdkankan.scene.service.ISceneEditInfoExtService;
import com.fdkankan.scene.service.ISceneEditService;
import com.fdkankan.scene.service.IScenePlusExtService;
import com.fdkankan.scene.service.IScenePlusService;
import com.fdkankan.scene.service.ISceneProService;
import com.fdkankan.scene.service.ISceneResourceService;
import com.fdkankan.scene.service.ISceneUploadService;
import com.fdkankan.scene.service.IUserIncrementService;
import com.fdkankan.scene.service.IUserService;
import com.fdkankan.scene.vo.BaseDataParamVO;
import com.fdkankan.scene.vo.BaseSceneParamVO;
import com.fdkankan.scene.vo.DeleteFileParamVO;
import com.fdkankan.scene.vo.LocalesParamVO;
import com.fdkankan.scene.vo.SceneAuthVO;
import com.fdkankan.web.user.SSOUser;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Service;
/**
*
* TODO
*
*
* @author dengsixing
* @since 2022/3/11
**/
@Slf4j
@Service
@RefreshScope
public class SceneEditServiceImpl implements ISceneEditService {
@Autowired
ISceneProService sceneProService;
@Autowired
IScenePlusService scenePlusService;
@Autowired
private FYunFileServiceInterface fYunFileService;
@Autowired
private ISceneUploadService sceneUploadService;
@Autowired
private ISceneEditInfoExtService sceneEditInfoExtService;
@Autowired
private ICameraDetailService cameraDetailService;
@Autowired
private ICameraService cameraService;
@Autowired
private IUserIncrementService userIncrementService;
@Value("${expected.time}")
private String expectedTime;
@Autowired
private IUserService userService;
@Autowired
private ISceneCooperationService sceneCooperationService;
@Autowired
private ISceneResourceService sceneResourceService;
@Autowired
private IScenePlusExtService scenePlusExtService;
@Override
public SceneAuthVO getAuth(String num, SSOUser ssoUser){
// 解密获得username,用于和数据库进行对比
String username = ssoUser.getUserName();
ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
SceneAuthVO sceneAuthVO = new SceneAuthVO();
List exclude = new ArrayList<>();
SceneResource excludeEntity = new SceneResource();
excludeEntity.setKeyWord("data");
exclude.add(excludeEntity);
Camera camera = cameraService.findByChildName(username);
sceneAuthVO.setExclude(exclude);
sceneAuthVO.setInclude(new ArrayList<>());
sceneAuthVO.setCompany(null);
//判断该场景是否属于增值权益
boolean isVip = false;
//获取该相机是否有权益
boolean isExpired = false;
Camera sceneCamera = cameraService.getById(scenePlus.getCameraId());
if(sceneCamera != null){
UserIncrement userIncrementEntity = userIncrementService.findByCameraId(sceneCamera.getId());
if(userIncrementEntity != null){
if( userIncrementEntity.getIsExpired().intValue() == 0){
isVip = true;
}
if(userIncrementEntity.getIsExpired().intValue() == 1){
isExpired = true;
}
}else{
try {
Date date = DateUtil.parse("2021-09-09 00:00:00", DateExtUtil.dateStyle);
//非07批次的放开
String pc = sceneCamera.getSnCode().substring(0,2);
if(!pc.equals("07") ){
if(sceneCamera.getCreateTime()!=null && date.after(sceneCamera.getCreateTime())){
isVip = true;
isExpired = false;
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
sceneAuthVO.setIsExpired(isExpired);
sceneAuthVO.setIsVip(isVip);
//判断过期时间
Date date = DateUtil.parse(expectedTime, DateExtUtil.dateStyle);
if(camera != null){
if(!scenePlus.getCameraId().equals(camera.getId())){
throw new BusinessException(ErrorCode.FAILURE_CODE_5014);
}
CameraDetail cameraDetailEntity = cameraDetailService.findByCameraId(camera.getId());
if(cameraDetailEntity.getCompanyId() != null){
if(cameraDetailEntity.getCompanyId().longValue() == 1 || cameraDetailEntity.getCompanyId().longValue() == 14){
sceneAuthVO.setExclude(new ArrayList<>());
sceneAuthVO.setCompany(cameraDetailEntity.getCompanyId());
}
}
return sceneAuthVO;
}
User user = userService.findByUserName(username);
if("18750226207".equals(username)){
log.info("18750226207该账号默认超级管理员,可以操作所有场景");
}
else if(user == null || scenePlus.getUserId() == null || user.getId().longValue() != scenePlus.getUserId().longValue()){
log.info("user:" + user.getId() + ",scene:" + scenePlus.getUserId());
List list =
sceneCooperationService.list(
new LambdaQueryWrapper()
.eq(SceneCooperation::getSceneNum, num));
if(list != null && list.size() > 0){
if(list.get(0).getUserId().longValue() != user.getId().longValue()){
throw new BusinessException(ErrorCode.FAILURE_CODE_5014);
}
}else {
throw new BusinessException(ErrorCode.FAILURE_CODE_5014);
}
}
if(scenePlus.getCameraId() != null){
camera = cameraService.getById(scenePlus.getCameraId());
if(camera != null){
CameraDetail cameraDetail = cameraDetailService.findByCameraId(camera.getId());
if(cameraDetail.getCompanyId() != null){
if(cameraDetail.getCompanyId().longValue() == 1 || cameraDetail.getCompanyId().longValue() == 14){
sceneAuthVO.setExclude(new ArrayList<>());
sceneAuthVO.setCompany(cameraDetail.getCompanyId());
}
}
}
}
//权限控制完后判断若是协作账号,获取协作权限
SceneCooperation sceneCooperation = sceneCooperationService.getByNum(num);
//若数据为空表示可操作全部资源
if(sceneCooperation == null || sceneCooperation.getUserId().longValue() != ssoUser.getId().longValue()){
return sceneAuthVO;
}
if(scenePlus.getUserId()!= null && sceneCooperation.getUserId()!= null &&
scenePlus.getUserId().equals(sceneCooperation.getUserId())){
return sceneAuthVO;
}
sceneAuthVO.setInclude(sceneResourceService.findByCooperationId(sceneCooperation.getId()));
return sceneAuthVO;
}
@Override
public ResultData locales(LocalesParamVO param) throws Exception {
String key = "v4/www/locales/" + param.getFile();
fYunFileService.uploadFile(JSON.toJSONBytes(param.getData()), key);
return ResultData.ok();
}
@Override
public ResultData saveTour(BaseDataParamVO param) throws IOException {
ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
if(Objects.isNull(scenePlus)){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
String key = String.format(UploadFilePath.USER_EDIT_PATH, param.getNum()) + "tour.json";
fYunFileService.uploadFile(scenePlusExt.getYunFileBucket(), param.getData().getBytes(StandardCharsets.UTF_8), key);
sceneEditInfoExtService.updateToursByNum(
param.getNum(), Integer.valueOf(CommonStatus.YES.code()));
return ResultData.ok();
}
@Override
public ResultData deleteTour(BaseSceneParamVO param) throws Exception {
ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
if(Objects.isNull(scenePlus)){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
String userEditPath = String.format(UploadFilePath.USER_EDIT_PATH, param.getNum());
String tourJsonPath = userEditPath + "tour.json";
String tourJson = fYunFileService.getFileContent(scenePlusExt.getYunFileBucket(), tourJsonPath);
JSONArray tours = JSON.parseArray(tourJson);
if(CollUtil.isNotEmpty(tours)){
List fileNames = new ArrayList<>();
for (Object o : tours) {
JSONObject tour = (JSONObject)o;
JSONObject enter = tour.getJSONObject("enter");
if(Objects.nonNull(enter)){
String enterOver = enter.getString("cover");
if(StrUtil.isNotEmpty(enterOver)){
fileNames.add(enterOver);
}
}
JSONObject exit = tour.getJSONObject("exit");
if(Objects.nonNull(exit)){
String exitOver = exit.getString("cover");
if(StrUtil.isNotEmpty(exitOver)){
fileNames.add(exitOver);
}
}
String music = tour.getString("music");
if(StrUtil.isNotEmpty(music)){
fileNames.add( music);
}
}
//批量删除资源文件
if(CollUtil.isNotEmpty(fileNames)){
sceneUploadService.delete(
DeleteFileParamVO.builder()
.num(param.getNum()).bizType("tour").fileNames(fileNames)
.build());
}
}
//删除tour.json文件
fYunFileService.deleteFile(scenePlusExt.getYunFileBucket(), tourJsonPath);
sceneEditInfoExtService.updateToursByNum(
param.getNum(), Integer.valueOf(CommonStatus.NO.code()));
return ResultData.ok();
}
}