package com.fdkankan.fusion.service.impl; import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fdkankan.fusion.common.FilePath; import com.fdkankan.fusion.common.util.FileWriterUtil; import com.fdkankan.fusion.common.util.OBJToGLBUtil; import com.fdkankan.fusion.common.util.UploadToOssUtil; import com.fdkankan.fusion.entity.CaseNumEntity; import com.fdkankan.fusion.entity.Model; import com.fdkankan.fusion.mapper.ICaseNumMapper; import com.fdkankan.fusion.request.SceneNumParam; import com.fdkankan.fusion.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.File; import java.util.*; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author * @since 2022-07-27 */ @Service public class CaseNumServiceImpl extends ServiceImpl implements ICaseNumService { @Autowired UploadToOssUtil uploadToOssUtil; @Value("${local.obj_path}") private String OBJ_PATH; @Value("${local.glb_path}") private String GLB_PATH; @Value("${upload.query-path}") private String queryPath; @Autowired IModelService modelService; @Autowired IFusionNumService fusionNumService; @Autowired ICaseViewService caseViewService; @Autowired IFusionMeterService fusionMeterService; @Autowired IFusionGuidePathService fusionGuidePathService; @Autowired ICaseTagService caseTagService; @Autowired ICaseTagPointService caseTagPointService; @Override public List getByCaseId(Integer caseId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(CaseNumEntity::getCaseId,caseId); return this.list(wrapper); } @Override public void addBatch(Integer caseId, List sceneNumParam) { List addNumList = this.updateByNumList(caseId, sceneNumParam); if(addNumList == null || addNumList.size()<=0){ return; } List newCaseNums = new ArrayList<>(); List modelList = new ArrayList<>(); for (SceneNumParam param : sceneNumParam) { List numList = param.getNumList(); HashSet setNum = new HashSet<>(numList); for (String num : setNum) { if(!addNumList.contains(num)){ continue; } CaseNumEntity caseNumEntity = new CaseNumEntity(); caseNumEntity.setCaseId(caseId); caseNumEntity.setNumType(param.getType()); caseNumEntity.setNum(num); newCaseNums.add(caseNumEntity); if(param.getType() == 3){ //用户上传三维模型跳过 continue; } Model model = modelService.getIsNullNewByNum(num); model.setModelDateType("obj"); model.setType(param.getType()); model.setModelType("pointcloud"); //深时点云类型 if(param.getType() != 2){ //不为深时 model.setModelObjUrl(String.format(OBJ_PATH ,num) +"/mesh.obj"); model.setModelGlbUrl(getGlbUrl(param.getType(),num,model)); model.setModelType("glb"); } model.setNum(num); model.setCreateStatus(1); modelList.add(model); } } if(newCaseNums.size() >0){ this.saveBatch(newCaseNums); } if(modelList.size() >0){ modelService.saveOrUpdateBatch(modelList); } } private String getGlbUrl(Integer type, String num,Model model) { if(type == 0 || type == 1){ //看看,看见 String objPath = String.format(OBJ_PATH ,num); String glbPath = String.format(GLB_PATH,num) +"/mesh.glb"; String glbOssPath = String.format(FilePath.GLB_OSS_PATH , num); // if(uploadToOssUtil.existKey(glbOssPath)){ // return queryPath + "/"+glbOssPath; // } List fileList = uploadToOssUtil.listKeysFromAli(String.format(FilePath.OBJ_OSS_PATH, num)); for (String fileName : fileList) { File file = new File(objPath); if(!file.exists()){ file.mkdirs(); } String[] split = fileName.split("/"); String localPath = objPath +"/"+split[split.length-1]; uploadToOssUtil.downFormAli(fileName,localPath); } OBJToGLBUtil.objToGlb(objPath,glbPath ); File file = new File(glbPath); if(file!=null){ model.setModelSize(FileWriterUtil.setFileSize(file.length())); } uploadToOssUtil.uploadOss(glbPath,glbOssPath); FileUtil.del(objPath); return queryPath + "/"+glbOssPath; } return null; } private List updateByNumList(Integer caseId, List sceneNumParam) { List updateNumList = new ArrayList<>(); for (SceneNumParam param : sceneNumParam) { List numList = param.getNumList(); updateNumList.addAll(numList); } if(updateNumList.size()<=0){ deleteByCaseId(caseId); return null; } LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(CaseNumEntity::getCaseId,caseId); List list = this.list(wrapper); List hanNumList = list.parallelStream().map(CaseNumEntity::getNum).collect(Collectors.toList()); List delList = new ArrayList<>(); List addList = new ArrayList<>(); for (String num : hanNumList) { if(!updateNumList.contains(num)){ delList.add(num); } } for (String num : updateNumList) { if(!hanNumList.contains(num)){ addList.add(num); } } this.deleteByNum(caseId,delList); return addList; } @Override public void deleteByNum(Integer caseId, List delList) { if(delList.size() >0){ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(CaseNumEntity::getCaseId,caseId); wrapper.in(CaseNumEntity::getNum,delList); this.remove(wrapper); fusionNumService.deleteByNumList(caseId,delList,true); } } @Override public void deleteByCaseId(Integer caseId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(CaseNumEntity::getCaseId,caseId); this.remove(wrapper); fusionNumService.deleteByCaseId(caseId); caseViewService.deleteByCaseId(caseId); fusionGuidePathService.deleteByCaseId(caseId); fusionMeterService.deleteByCaseId(caseId); caseTagService.deletePointByCaseId(caseId); } @Override public HashMap> getTypeMap(Integer caseId) { List caseNumList = this.getByCaseId(caseId); HashMap> typeMap = new HashMap<>(); for (CaseNumEntity caseNumEntity : caseNumList) { List numList ; if(typeMap.get(caseNumEntity.getNumType()) == null){ numList = new ArrayList<>(); }else { numList = typeMap.get(caseNumEntity.getNumType()); } numList.add(caseNumEntity.getNum()); typeMap.put(caseNumEntity.getNumType(),numList); } return typeMap; } @Override public List getByNum(String num) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(CaseNumEntity::getNum,num); return this.list(wrapper); } }