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.fdkankan.fusion.common.ResultCode;
import com.fdkankan.fusion.entity.CaseFusion;
import com.fdkankan.fusion.entity.FusionNum;
import com.fdkankan.fusion.entity.Model;
import com.fdkankan.fusion.entity.jsonEntity.Transform;
import com.fdkankan.fusion.exception.BusinessException;
import com.fdkankan.fusion.mapper.IFusionNumMapper;
import com.fdkankan.fusion.request.CaseParam;
import com.fdkankan.fusion.request.FusionParam;
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.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author
* @since 2022-08-04
*/
@Service
public class FusionNumServiceImpl extends ServiceImpl implements IFusionNumService {
@Autowired
ICaseFusionService caseFusionService;
@Autowired
ICaseService caseService;
@Autowired
IModelService modelService;
@Autowired
IFusionMeterService fusionMeterService;
@Autowired
ICaseTagPointService caseTagPointService;
@Override
public List getByNum(String num) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(FusionNum::getModelId,num);
return this.list(wrapper);
}
@Override
public List getListByFusionIdList(List fusionIdList) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(FusionNum::getFusionId,fusionIdList);
wrapper.orderByDesc(FusionNum::getCreateTime);
return this.list(wrapper);
}
@Override
public List getListByCaseId(Integer caseId, Integer fusionNumId,String token) {
List fusionNumList = new ArrayList<>();
if(fusionNumId!=null){
FusionNum fusionNum = this.getById(fusionNumId);
if(fusionNum!=null){
fusionNumList = Collections.singletonList(fusionNum);
}
}else {
List fusionList = caseFusionService.getListByCaseId(caseId);
if(fusionList.size()<=0){
return new ArrayList<>();
}
List fusionIdList = fusionList.parallelStream().map(CaseFusion::getFusionId).collect(Collectors.toList());
fusionNumList = getListByFusionIdList(fusionIdList);
}
if(fusionNumList.size() <=0){
return new ArrayList<>();
}
CaseParam param =new CaseParam();
HashMap> typeMap = this.getTypeMap(fusionNumList);
param.setTypeMap(typeMap);
param.setCaseId(caseId);
List sceneVos = caseService.sceneList(param, token);
HashMap sceneMap = new HashMap<>();
sceneVos.forEach(entity -> sceneMap.put(entity.getModelId(),entity));
List numVoList = new ArrayList<>();
for (FusionNum fusionNum : fusionNumList) {
SceneVo sceneVo = sceneMap.get(fusionNum.getModelId());
if(sceneVo == null ){
continue;
}
if(sceneVo.getStatus() == null){
sceneVo.setStatus(2);
}
FusionNumVo fusionNumVo = new FusionNumVo();
BeanUtils.copyProperties(fusionNum,fusionNumVo);
Transform transform = JSONObject.parseObject(fusionNum.getTransform(), Transform.class);
fusionNumVo.setTransform(transform);
fusionNumVo.setSceneData(sceneVo);
numVoList.add(fusionNumVo);
}
return numVoList;
}
private HashMap> getTypeMap( List list) {
HashMap> typeMap = new HashMap<>();
List modelIds = list.parallelStream().map(FusionNum::getModelId).collect(Collectors.toList());
List modelList = modelService.getListByModelIds(modelIds);
for (Model model : modelList) {
List numList ;
if(typeMap.get(model.getType()) == null){
numList = new ArrayList<>();
}else {
numList = typeMap.get(model.getType());
}
String num = StringUtils.isEmpty(model.getNum()) ? model.getModelId().toString(): model.getNum();
numList.add(num);
typeMap.put(model.getType(),numList);
}
return typeMap;
}
@Override
public FusionNumVo add(FusionParam param) {
if(param.getModelId()==null || param.getCaseId() == null){
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
Model model = modelService.getById(param.getModelId());
if(model == null){
throw new BusinessException(ResultCode.MODEL_NOT_EXIST);
}
List list = caseFusionService.getListByCaseId(param.getCaseId());
CaseFusion caseFusion = null;
if(list.size() <=0){
caseFusion = new CaseFusion();
caseFusion.setCaseId(param.getCaseId());
caseFusionService.save(caseFusion);
list.add(caseFusion);
}
caseFusion = list.get(0);
FusionNum fusionNum = new FusionNum();
BeanUtils.copyProperties(param,fusionNum);
fusionNum.setFusionId(caseFusion.getFusionId());
fusionNum.setTransform(JSONObject.toJSONString(param.getTransform()));
this.save(fusionNum);
List numVoList = this.getListByCaseId(param.getCaseId(), fusionNum.getFusionNumId(), param.getToken());
if(numVoList.size()<=0){
throw new BusinessException(ResultCode.ERROR);
}
return numVoList.get(0);
}
@Override
public void updateModel(FusionParam param) {
if(param.getFusionNumId() == null){
throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
}
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(FusionNum::getFusionNumId,param.getFusionNumId());
if(param.getTransform()!=null){
wrapper.set(FusionNum::getTransform,JSONObject.toJSONString(param.getTransform()));
}
if(param.getOpacity()!=null){
wrapper.set(FusionNum::getOpacity,param.getOpacity());
}
if(param.getBottom()!=null){
wrapper.set(FusionNum::getBottom,param.getBottom());
}
if(param.getHide()!=null){
wrapper.set(FusionNum::getHide,param.getHide());
}
this.update(wrapper);
}
@Override
public void deleteByCaseId(Integer caseId) {
List caseFusionList = caseFusionService.getListByCaseId(caseId);
if(caseFusionList.size() >0){
List fusionIds = caseFusionList.parallelStream().map(CaseFusion::getFusionId).collect(Collectors.toList());
if(fusionIds.size() >0){
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(FusionNum::getFusionId,fusionIds);
this.remove(wrapper);
}
}
}
/**
* 删除视图不存在的场景码
*/
@Override
public void deleteByNumList(Integer caseId,List deleteNum) {
if(deleteNum.size() <=0){
return;
}
List caseFusionList = caseFusionService.getListByCaseId(caseId);
if(caseFusionList.size() >0){
List fusionIds = caseFusionList.parallelStream().map(CaseFusion::getFusionId).collect(Collectors.toList());
if(fusionIds.size() >0){
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.in(Model::getNum,deleteNum);
List list = modelService.list(wrapper);
LambdaQueryWrapper wrapper2 = new LambdaQueryWrapper<>();
wrapper2.in(Model::getModelId,deleteNum);
List list2 = modelService.list(wrapper);
list.addAll(list2);
if(list.size()<=0){
return;
}
List modelIds = list.parallelStream().map(Model::getModelId).collect(Collectors.toList());
LambdaQueryWrapper deleteWr = new LambdaQueryWrapper<>();
deleteWr.in(FusionNum::getFusionId,fusionIds);
deleteWr.in(FusionNum::getModelId,modelIds);
List list1 = this.list(deleteWr);
for (FusionNum fusionNum : list1) {
fusionMeterService.deleteByModelId(fusionNum.getModelId());
}
List models = list1.parallelStream().map(FusionNum::getModelId).collect(Collectors.toList());
caseTagPointService.deleteByModelIds(models);
this.remove(deleteWr);
}
}
}
@Override
public void deleteByModelId(Integer modelId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(FusionNum::getModelId,modelId);
this.remove(wrapper);
}
}