package com.fdkankan.fusion.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.fdkankan.fusion.common.PageInfo;
import com.fdkankan.fusion.common.enums.BuildType;
import com.fdkankan.fusion.common.util.CameraUtil;
import com.fdkankan.fusion.entity.*;
import com.fdkankan.fusion.entity.jsonEntity.Transform;
import com.fdkankan.fusion.httpClient.client.LaserClient;
import com.fdkankan.fusion.mapper.ICaseFusionMapper;
import com.fdkankan.fusion.request.CaseOverviewParam;
import com.fdkankan.fusion.response.FusionNumVo;
import com.fdkankan.fusion.response.SceneVo;
import com.fdkankan.fusion.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.util.StringUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author
* @since 2022-08-04
*/
@Service
public class CaseFusionServiceImpl extends ServiceImpl implements ICaseFusionService {
@Autowired
IFusionNumService fusionNumService;
@Autowired
IModelService modelService;
@Autowired
IScenePlusService scenePlusService;
@Autowired
IScenePlusExtService scenePlusExtService;
@Autowired
ISceneService sceneService;
@Autowired
LaserClient laserClient;
@Autowired
ISceneFileBuildService sceneFileBuildService;
@Autowired
ICaseSettingsService settingsService;
@Override
public List getListByCaseId(Integer caseId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(CaseFusion::getCaseId,caseId);
return this.list(wrapper);
}
@Override
public PageInfo pageList(CaseOverviewParam param) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
if(StringUtils.isNotBlank(param.getFusionTitle())){
wrapper.like(CaseFusion::getFusionTitle,param.getFusionTitle());
}
wrapper.orderByDesc(CaseFusion::getFusionId);
Page page = this.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
List fusionIds = page.getRecords().stream().map(CaseFusion::getFusionId).collect(Collectors.toList());
HashMap map = settingsService.getByFusionIds(fusionIds);
for (CaseFusion record : page.getRecords()) {
CaseSettings caseSettings = map.get(record.getFusionId());
if(caseSettings !=null){
record.setCover(caseSettings.getCover());
}
}
return PageInfo.PageInfo(page);
}
@Override
public List getSceneListVo(Integer fusionId) {
List sceneVos = new ArrayList<>();
List fusionNumList = fusionNumService.getByFusionId(fusionId);
List modelIds = fusionNumList.stream().map(FusionNum::getModelId).collect(Collectors.toList());
List listByModelIds = modelService.getListByModelIds(modelIds);
HashMap modelMap = new HashMap<>();
listByModelIds.stream().forEach(e -> modelMap.put(e.getModelId(),e));
List numList = listByModelIds.stream().filter(e -> e.getNum() != null).map(Model::getNum).collect(Collectors.toList());
List scenePlusList = scenePlusService.getByNumList(numList);
HashMap map = new HashMap<>();
scenePlusList.stream().forEach(e -> map.put(e.getNum(),e));
List plusIds = scenePlusList.stream().map(ScenePlus::getId).collect(Collectors.toList());
List extList = scenePlusExtService.getByPlusIds(plusIds);
HashMap mapext = new HashMap<>();
extList.stream().forEach(e -> mapext.put(e.getPlusId(),e));
HashMap mappingMap = sceneService.getMappingMap(numList);
for (FusionNum fusionNum : fusionNumList) {
Transform transform = JSONObject.parseObject(fusionNum.getTransform(),Transform.class);
FusionNumVo vo = new FusionNumVo();
vo.setTransform(transform);
BeanUtils.copyProperties(fusionNum,vo);
SceneVo sceneVo = new SceneVo();
Model model = modelMap.get(fusionNum.getModelId());
if(model != null){
BeanUtils.copyProperties(model,sceneVo);
if(model.getNum() != null ){
ScenePlus scenePlus = map.get(model.getNum());
if(scenePlus != null){
BeanUtils.copyProperties(scenePlus,sceneVo);
sceneVo.setStatus(scenePlus.getSceneStatus() == 1 ? 2:scenePlus.getSceneStatus());
sceneVo.setName(scenePlus.getTitle());
sceneVo.setSceneName(scenePlus.getTitle());
sceneVo.setCreateTime(scenePlus.getCreateTime());
ScenePlusExt scenePlusExt = mapext.get(scenePlus.getId());
if(scenePlusExt != null){
sceneVo.setRtkLocation(scenePlusExt.getRtkLocation());
sceneVo.setOrientation(scenePlusExt.getOrientation());
}
sceneVo.setMapping( mappingMap.get(scenePlus.getNum()));
sceneVo.setSourceName(CameraUtil.getSourceName(model.getType()));
vo.setSceneData(sceneVo);
sceneVos.add(vo);
}
}
}
}
return sceneVos;
}
@Override
public void updateOfflineStatus(Integer fusionId, Integer status, String zipPath) {
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(CaseFusion::getFusionId,fusionId);
wrapper.set(CaseFusion::getOfflineStatus,status);
wrapper.set(CaseFusion::getOfflinePath,zipPath);
if (status == 2) {
wrapper.set(CaseFusion::getOfflineEndTime,new Date());
}
if (status == 1) {
wrapper.set(CaseFusion::getOfflineStartTime,new Date());
}
this.update(wrapper);
if(status == 1){ //开始
sceneFileBuildService.updateTimeAndStatus(fusionId.toString(),2, new Date(), null, BuildType.BUILD_FUSION_OFFLINE,zipPath);
}
if(status == 2){ //成功
laserClient.addNotifications(2);
sceneFileBuildService.updateTimeAndStatus(fusionId.toString(),4,null, new Date(), BuildType.BUILD_FUSION_OFFLINE,zipPath);
}else if(status != 1){ //失败
laserClient.addNotifications(3);
}
}
}