package com.fdkankan.fusion.service.impl; import cn.hutool.core.io.FileUtil; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fdkankan.fusion.common.FilePath; import com.fdkankan.fusion.common.ResultCode; import com.fdkankan.fusion.common.util.*; import com.fdkankan.fusion.entity.CaseNumEntity; import com.fdkankan.fusion.entity.Model; import com.fdkankan.fusion.exception.BusinessException; import com.fdkankan.fusion.httpClient.client.FdKKClient; 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.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.File; import java.sql.BatchUpdateException; 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("${upload.query-path}") private String queryPath; @Value("${spring.profiles.active}") private String environment; @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,param.getType()); model.setModelDateType("obj"); model.setType(param.getType()); model.setModelType("pointcloud"); //深时点云类型 if(param.getType() == 0 || param.getType() == 1 || param.getType() == 4 || param.getType() == 6){ //看看,看见 model.setModelObjUrl(String.format(FilePath.OBJ_LOCAL_PATH,environment ,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 || type == 4 || type == 6){ //看看,看见 String objPath = String.format(FilePath.OBJ_LOCAL_PATH ,environment,num); // if(uploadToOssUtil.existKey(glbOssPath)){ // return queryPath + "/"+glbOssPath; // } ShellUtil.yunDownload(String.format(FilePath.OBJ_OSS_PATH, num) ,objPath); List localGlbPaths = new ArrayList<>(); List ossGlbPaths = new ArrayList<>(); File localFile = new File(objPath); this.toGlB(localFile,localGlbPaths); if(localGlbPaths.size() >0){ for (String localGlbPath : localGlbPaths) { String ossGlbPath = localGlbPath.replace(FilePath.LOCAL_BASE_PATH,"fusion/"); uploadToOssUtil.uploadOss(localGlbPath,ossGlbPath); if(ossGlbPath.contains("lod_")){ if(ossGlbPath.contains("lod_0")){ ossGlbPaths.add(queryPath +ossGlbPath); } File file = new File(localGlbPath); if(file!=null){ model.setModelSize(FileWriterUtil.setFileSize(file.length())); } continue; } File file = new File(localGlbPath); if(file!=null){ model.setModelSize(FileWriterUtil.setFileSize(file.length())); } ossGlbPaths.add(queryPath +ossGlbPath); } return JSONArray.toJSONString(ossGlbPaths); } FileUtil.del(objPath); } return null; } private void toGlB(File localFile, List localGlbPath) { File[] files = localFile.listFiles(); for (File file : files) { if(file.isDirectory()){ toGlB(file,localGlbPath); } if(file.getName().contains(".obj")){ String glbPath = OBJToGLBUtil.objToGlb(file.getPath(),file.getPath().replace(".obj",".glb") ); localGlbPath.add(glbPath); } } } private List updateByNumList(Integer caseId, List sceneNumParam) { List addList = new ArrayList<>(); for (SceneNumParam param : sceneNumParam) { Integer type = param.getType(); List numList = param.getNumList(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(CaseNumEntity::getCaseId,caseId); wrapper.eq(CaseNumEntity::getNumType,type); List list = this.list(wrapper); List hanNumList = list.parallelStream().map(CaseNumEntity::getNum).collect(Collectors.toList()); List delList = new ArrayList<>(); for (String num : hanNumList) { if(!numList.contains(num)){ delList.add(num); } } for (String num : numList) { if(!hanNumList.contains(num)){ addList.add(num); } } this.deleteByNum(caseId,delList,param.getType()); } return addList; } @Override public void deleteByNum(Integer caseId, List delList,Integer type) { if(delList.size() >0){ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(CaseNumEntity::getCaseId,caseId); wrapper.eq(CaseNumEntity::getNumType,type); wrapper.in(CaseNumEntity::getNum,delList); this.remove(wrapper); fusionNumService.deleteByNumList(caseId,delList,true,type); } } @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); } }