package com.fdkankan.agent.service.impl;
import cn.hutool.core.io.FileUtil;
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.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fdkankan.agent.common.OssPath;
import com.fdkankan.agent.common.PageInfo;
import com.fdkankan.agent.common.ResultCode;
import com.fdkankan.agent.common.ResultData;
import com.fdkankan.agent.entity.*;
import com.fdkankan.agent.exception.BusinessException;
import com.fdkankan.agent.httpClient.client.FdKKClient;
import com.fdkankan.agent.httpClient.service.LaserService;
import com.fdkankan.agent.mapper.ISceneProMapper;
import com.fdkankan.agent.request.SceneParam;
import com.fdkankan.agent.response.GroupByCount;
import com.fdkankan.agent.response.SceneVo;
import com.fdkankan.agent.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.agent.util.MangerUploadToOssUtil;
import com.fdkankan.agent.util.SceneStatusUtil;
import com.fdkankan.common.constant.SceneConstant;
import com.fdkankan.common.util.FileUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* pro场景表 服务实现类
*
*
* @author
* @since 2022-11-09
*/
@Service
@Slf4j
public class SceneProServiceImpl extends ServiceImpl implements ISceneProService {
@Autowired
LaserService laserService;
@Autowired
IScenePlusService scenePlusService;
@Autowired
IScenePlusExtService scenePlusExtService;
@Resource
FdKKClient fdKKClient;
@Autowired
ICameraService cameraService;
@Autowired
ICameraDetailService cameraDetailService;
@Autowired
IUserIncrementService userIncrementService;
@Autowired
IIncrementTypeService incrementTypeService;
@Autowired
MangerUploadToOssUtil mangerUploadToOssUtil;
@Autowired
IFolderSceneService folderSceneService;
@Autowired
ISceneService sceneService;
@Autowired
ISceneCopyLogService sceneCopyLogService;
@Autowired
IUserService userService;
@Autowired
IAgentNewService agentNewService;
@Autowired
IAgentNewCameraService agentNewCameraService;
@Override
public Object pageList(SceneParam param) {
if(param.getAgentId() == null){
throw new BusinessException(ResultCode.PARAM_MISS);
}
if(param.getType() == 3){ //双目lite
return sceneService.pageList(param);
}
if(StringUtils.isNotBlank(param.getUserName())){
List userList = userService.getLikeByUserName(param.getUserName());
List userIds = userList.stream().map(User::getId).collect(Collectors.toList());
if(userIds.isEmpty()){
return PageInfo.PageInfo(new Page<>(param.getPageNum(),param.getPageSize()));
}
param.setUserIds(userIds);
}
List details = cameraDetailService.getListByAgentId(param.getAgentId());
List cameraIds = details.stream().map(CameraDetail::getCameraId).collect(Collectors.toList());
List authCameraIds = agentNewCameraService.getBySubAgent(param.getAgentId());
if(!authCameraIds.isEmpty()) {
cameraIds.addAll(authCameraIds);
}
if(cameraIds.isEmpty()){
return PageInfo.PageInfo(new Page<>(param.getPageNum(),param.getPageSize()));
}
param.setCameraIds(cameraIds);
Page page = this.getBaseMapper().pageList(new Page<>(param.getPageNum(),param.getPageSize()),param);
List records = page.getRecords();
HashMap map = null;
HashMap userMap = null;
HashMap cameraMap = null;
HashMap ssSceneMap = null;
List sceneNumList = page.getRecords().stream().map(SceneVo::getNum).collect(Collectors.toList());
if(!records.isEmpty()){
map = sceneCopyLogService.getByNewNumList(sceneNumList);
List userIds = records.parallelStream().map(SceneVo::getUserId).collect(Collectors.toList());
userMap = userService.getByIds(userIds);
List cameraIds2 = records.parallelStream().map(SceneVo::getCameraId).collect(Collectors.toList());
cameraMap = cameraService.getByIds(cameraIds2);
if(param.getType() == 2 ){
ssSceneMap = laserService.list(sceneNumList,4);
}
if(param.getType() == 6){
ssSceneMap = laserService.list(sceneNumList,5);
}
}
for (SceneVo record : page.getRecords()) {
if(param.getType() == 2 || param.getType() == 6){
JSONObject ssObj = ssSceneMap.get(record.getNum());
if(ssObj!=null){
record.setSceneName(ssObj.getString("title"));
record.setThumb(ssObj.getString("thumb"));
record.setWebSite(ssObj.getString("webSite"));
record.setIsObj(ssObj.getInteger("buildObjStatus"));
record.setViewCount(ssObj.getInteger("viewCount"));
record.setStatus(toFdStatus(ssObj.getInteger("status")));
record.setAlgorithmTime(ssObj.getString("algorithmTime"));
}else{
record.setStatus(0);
record.setWebSite(null);
}
}
record.setStatusString(SceneStatusUtil.getStatusString(record));
if(userMap != null){
User user = userMap.get(record.getUserId());
if(user != null){
record.setUserName(user.getUserName());
}
}
if(cameraMap != null){
Camera camera = cameraMap.get(record.getCameraId());
if(camera != null){
record.setSnCode(camera.getSnCode());
}
}
if(map !=null ){
SceneCopyLog sceneCopyLog = map.get(record.getNum());
if(sceneCopyLog != null){
record.setCopyTime(sceneCopyLog.getCreateTime());
record.setIsCopy(true);
}
}
}
return PageInfo.PageInfo(page);
}
@Override
public void copy(String sceneNum) throws Exception {
ScenePro scenePro = this.getByNum(sceneNum);
ScenePlus scenePlus = scenePlusService.getByNum(sceneNum);
if((scenePro == null || scenePro.getCameraId() == null ) && (scenePlus== null || scenePlus.getCameraId() == null)){
throw new BusinessException(ResultCode.SCENE_EMPTY);
}
Long cameraId = scenePro == null ? scenePlus.getCameraId() : scenePro.getCameraId();
Camera camera = cameraService.getById(cameraId);
if(camera == null){
throw new BusinessException(ResultCode.CAMERA_EMPTY);
}
CameraDetail detailEntity = cameraDetailService.getByCameraId(cameraId);
if(detailEntity == null){
throw new BusinessException(ResultCode.CAMERA_EMPTY);
}
Long needSpace = 0L;
if(scenePro != null){
needSpace = scenePro.getSpace();
}
if(scenePlus != null){
ScenePlusExt scenePlusExt = scenePlusExtService.getByPlusId(scenePlus.getId());
if(scenePlusExt != null && scenePlusExt.getSpace() != null){
needSpace = scenePlusExt.getSpace();
}
}
Boolean checkSpace = cameraDetailService.checkSpace(detailEntity, needSpace);
if(!checkSpace){
throw new BusinessException(ResultCode.CAMERA_SPACE_ERROR);
}
HashMap param = new HashMap<>();
param.put("num",sceneNum);
JSONObject jsonObject = fdKKClient.copyScene(param, "m_a_n_a_g_e");
Integer code = jsonObject.getInteger("code");
if(code != 0){
throw new BusinessException(jsonObject.getInteger("code"),jsonObject.getString("msg"));
}
}
@Override
public ScenePro getByNum(String num) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ScenePro::getNum,num);
wrapper.eq(ScenePro::getIsUpgrade,0);
List list = this.list(wrapper);
if(list == null || list.size() <=0){
return null;
}
return list.get(0);
}
@Override
public Long getCountByCameraId(Long cameraId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ScenePro::getIsUpgrade,0);
wrapper.eq(ScenePro::getCameraId,cameraId);
wrapper.in(ScenePro::getStatus,0,-2);
return this.count(wrapper);
}
private Integer toFdStatus(Integer status) {
//深时状态,-1:场景被删 0:计算中 1计算失败 2计算成功 3封存 4生成OBJ中
switch (status) {
case 0:
case 4:
return 0;
case 2:
return -2;
case 3:
return -3;
default:
return -1;
}
}
@Override
public HashMap getCountGroupByUserId(List userIdList) {
HashMap map = new HashMap<>();
List result = this.getBaseMapper().getCountGroupByUserId(userIdList);
result.forEach(entity ->map.put(entity.getId(),entity.getCount()));
return map;
}
}