package com.fdkankan.manage_jp.httpClient.service; import cn.hutool.core.bean.BeanUtil; import com.fdkankan.common.util.FileUtils; import com.fdkankan.fyun.face.FYunFileServiceInterface; import com.fdkankan.manage_jp.httpClient.param.LaserSceneMoveParam; import com.fdkankan.rabbitmq.util.RabbitMqProducer; import com.google.common.collect.Lists; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fdkankan.manage_jp.common.PageInfo; import com.fdkankan.manage_jp.common.Result; import com.fdkankan.manage_jp.entity.Camera; import com.fdkankan.manage_jp.entity.CameraDetail; import com.fdkankan.manage_jp.entity.Company; import com.fdkankan.manage_jp.entity.User; import com.fdkankan.manage_jp.httpClient.client.LaserClient; import com.fdkankan.manage_jp.httpClient.param.LaserSceneParam; import com.fdkankan.manage_jp.httpClient.param.SSDownSceneParam; import com.fdkankan.manage_jp.httpClient.param.SSToBind; import com.fdkankan.manage_jp.httpClient.vo.FdkkResponse; import com.fdkankan.manage_jp.httpClient.vo.SSDownSceneVo; import com.fdkankan.manage_jp.service.ICameraDetailService; import com.fdkankan.manage_jp.service.ICameraService; import com.fdkankan.manage_jp.service.ICompanyService; import com.fdkankan.manage_jp.service.IUserService; import com.fdkankan.manage_jp.vo.request.SceneParam; import com.fdkankan.manage_jp.vo.response.SceneVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import java.io.File; import java.util.*; import java.util.stream.Collectors; @Service @Slf4j public class LaserService { @Autowired LaserClient laserClient; @Value("${4dkk.laserService.basePath}") private String basePath; @Autowired IUserService userService; @Autowired ICameraDetailService cameraDetailService; @Autowired ICameraService cameraService; @Autowired ICompanyService companyService; public PageInfo pageList(SceneParam param) { try { LaserSceneParam laserSceneParam = getLaserSceneParam(param); if(laserSceneParam == null ){ return PageInfo.PageInfoEmpty(param.getPageNum(),param.getPageSize()); } FdkkResponse response = laserClient.sceneList(laserSceneParam); JSONObject jsonObject =response.getData(); if(jsonObject == null){ return PageInfo.PageInfoEmpty(param.getPageNum(),param.getPageSize()); } JSONArray list = jsonObject.getJSONArray("list"); long total =jsonObject.getLong("total"); List sceneVoList = new ArrayList<>(); for (Object o : list) { String res = JSONObject.toJSONString(o); SceneVo vo = JSONObject.parseObject(res,SceneVo.class); //深时状态,-1:场景被删 0:计算中 1计算失败 2计算成功 3封存 4生成OBJ中 JSONObject obj = (JSONObject) o; vo.setStatusString(getLaserStatus(vo.getStatus())); if(vo.getStatus().equals(3)){ vo.setPayStatus(-2); }else { vo.setPayStatus(1); } vo.setStatus(toFdStatus(vo.getStatus())); vo.setSceneName(obj.getString("title")); vo.setUserName(obj.getString("phone")); vo.setThumb(obj.getString("thumb")); vo.setWebSite(obj.getString("webSite")); vo.setChildName(obj.getString("snCode")); vo.setIsObj(obj.getInteger("buildObjStatus")); sceneVoList.add(vo); } for (SceneVo sceneVo : sceneVoList) { Company company = companyService.getByChildName(sceneVo.getChildName()); if(company != null){ sceneVo.setCompanyName(company.getCompanyName()); } } Page voPage = new Page<>(param.getPageNum(),param.getPageSize()); voPage.setRecords(sceneVoList); voPage.setTotal(total); return PageInfo.PageInfo(voPage); }catch (Exception e){ log.error("访问深时失败:",e); //throw new BusinessException(ResultCode.SS_GET_ERROR); } Page voPage = new Page<>(param.getPageNum(),param.getPageSize()); return PageInfo.PageInfo(voPage); } private LaserSceneParam getLaserSceneParam(SceneParam param) { LaserSceneParam newParam = new LaserSceneParam(); if(param.getCompanyId() != null){ //客户场景 List cameraDetails = cameraDetailService.getListByCompanyId(param.getCompanyId()); param.setSnCodes(this.setSnCodes(cameraDetails)); if((param.getSnCodes() == null || param.getSnCodes().size() <=0) && param.getCooperateSceneCodes().size()<=0){ return null; } if(param.getSnCodes() == null || param.getSnCodes().size()<=0){ param.setSnCodes(Arrays.asList("not-camera")); } } if(param.getUserId() != null){ //客户场景 User user = userService.getById(param.getUserId()); if(user == null){ return null; } newParam.setPhone(user.getUserName()); } if(StringUtils.isNotBlank(param.getCompanyName())){ //客户场景 List cameraDetails = cameraDetailService.getListByCompanyName(param.getCompanyName()); param.setSnCodes(this.setSnCodes(cameraDetails)); if(param.getSnCodes() == null || param.getSnCodes().size() <=0){ return null; } } if(StringUtils.isNotBlank(param.getChildName())){ List cameraList = cameraService.getLikeChildName(param.getChildName()); List snCodes = cameraList.stream().map(Camera::getSnCode).collect(Collectors.toList()); if(param.getSnCodes() != null && param.getSnCodes().size() >0){ List list3 = param.getSnCodes().stream().filter(snCodes::contains).collect(Collectors.toList()); param.setSnCodes(list3); }else { param.setSnCodes(snCodes); } if(param.getSnCodes() == null || param.getSnCodes().size()<=0){ return null; } } BeanUtils.copyProperties(param,newParam); newParam.setTitle(param.getSceneName()); return newParam; } private List setSnCodes(List cameraDetails) { if(cameraDetails != null && cameraDetails.size() >0){ Set cameraIds = cameraDetails.stream() .filter(entity -> entity.getGoodsId() == 10).map(CameraDetail::getCameraId).collect(Collectors.toSet()); if(cameraIds.size() >0){ List cameraList = cameraService.listByIds(cameraIds); return cameraList.stream().map(Camera::getSnCode).collect(Collectors.toList()); } } return null; } 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 -2; default: return -1; } } public static String getLaserStatus(Integer status){ //深时状态,-1:场景被删 0:计算中 1计算失败 2计算成功 3封存 4生成OBJ中 switch (status){ case -1 : return "场景已删除"; case 0 : return "计算中"; case 1 : return "计算失败"; case 2 : return "计算成功"; case 3 : return "封存"; case 4 : return "生成OBJ中"; default: return ""; } } public SSDownSceneVo downOfflineSceneStatus(String num) { try { SSDownSceneVo vo ; SSDownSceneParam param = new SSDownSceneParam(); param.setSceneCode(num); Result responseEntity = laserClient.downOfflineSceneStatus(param); if( responseEntity.getCode() != HttpStatus.OK.value()){ log.error("downOfflineSceneStatus-根据场景码获取激光转台下载状态失败:{}",responseEntity); return null; } vo = JSONObject.parseObject(JSONObject.toJSONString(responseEntity.getData()), SSDownSceneVo.class); return vo; }catch (Exception e){ log.error("downOfflineSceneStatus-根据场景码获取激光转台下载状态失败!",e); } return null ; } public SSDownSceneVo downOfflineScene(String num) { try { SSDownSceneVo vo ; SSDownSceneParam param = new SSDownSceneParam(); param.setSceneCode(num); Result responseEntity = laserClient.downOfflineScene(param); if( responseEntity.getCode() != HttpStatus.OK.value()){ log.error("downOfflineScene-根据场景码获取激光转台下载失败:{}",responseEntity); return null; } vo = JSONObject.parseObject(JSONObject.toJSONString(responseEntity.getData()), SSDownSceneVo.class); return vo ; }catch (Exception e){ log.error("downOfflineScene-根据场景码获取激光转台下载状态失败!",e); } return null ; } public void updateStatus(String num,Integer status) { try { Map params = new HashMap<>(); params.put("sceneCode", num); params.put("status", status); Result result = laserClient.saveOrEdit(num, params); if(result.getCode() != HttpStatus.OK.value()){ log.error("激光场景状态同步失败!"); } }catch (Exception e){ log.error("激光场景状态同步失败!",e); } } public void toBind(List snCodes,Boolean bind,String phone) { try { SSToBind param = new SSToBind(); param.setBind(bind); param.setPhone(phone); param.setSnCode(snCodes); param.setUserId(0); Result result = laserClient.toBind(param); if(result.getCode() != HttpStatus.OK.value()){ log.error("激光场景状态同步失败!"); } }catch (Exception e){ log.error("激光场景状态同步失败!",e); } } public void copy(Long camaraId, String createTime, String newNum, Integer status, String path, String sceneKey, String sceneName, Long userId,String version){ String phone = null; String snCode = null; if(userId != null){ User user = userService.getById(userId); phone = user == null ? null :user.getUserName(); } if(camaraId != null){ Camera camera = cameraService.getById(camaraId); snCode = camera == null ? null :camera.getSnCode(); } Map params = new HashMap<>(); params.put("childName",snCode); params.put("createTime", createTime); params.put("phone", phone); params.put("sceneCode", newNum); params.put("snCode",snCode); params.put("status", status); params.put("password", sceneKey); params.put("title", sceneName); params.put("userId", userId); params.put("isCopy", true); params.put("path",path); params.put("version",version); Result result = laserClient.saveOrEdit(newNum, params); if( result.getCode() != HttpStatus.OK.value()){ log.error("激光场景状态同步失败!"); } } public String copyDataSource( String oldDataSource,String dataSource) { //计算成功 激光转台相机推送 log.info("激光转台相机 同步 请求 "); try { //创建目录 if(oldDataSource.lastIndexOf("/")!=-1){ oldDataSource = oldDataSource + "_laserData"; }else{ oldDataSource = oldDataSource.substring(0,oldDataSource.length()-1) + "_laserData"; } if(dataSource.lastIndexOf("/")!=-1){ dataSource = dataSource + "_laserData"; }else{ dataSource = dataSource.substring(0,dataSource.length()-1) + "_laserData"; } FileUtils.copyDirectiory(oldDataSource ,dataSource); return dataSource + File.separator + "laserData"; }catch (Exception e){ e.printStackTrace(); } return null; } public void move(String num, String snCode, String toSnCode,Long userId,String newDataSource) { LaserSceneMoveParam param = new LaserSceneMoveParam(); param.setSceneCode(num); param.setSnCode(snCode); param.setToSnCode(toSnCode); param.setUserId(userId); param.setDataSource(newDataSource+"_laserData/laserData"); if(userId != null){ User user = userService.getById(userId); if(user != null){ param.setPhone(user.getUserName()); } } laserClient.migrate(param); } @Autowired private FYunFileServiceInterface fYunFileService; @Autowired private RabbitMqProducer rabbitMqProducer; @Value("${4dkk.laserService.cloud-point-fyun-path:laser_u_data/%s/data/bundle_%s/building/}") private String cloudPointFyunPath; @Value("${4dkk.laserService.bucket:geosign-4dkk}") private String bucket; @Value("${queue.application.laser.cloud-point-build:laser-cloud-point-build}") private String cloudPointBuild; public void cloudPointBuild(String oldSceneCode,String sceneCode) { if (!fYunFileService.fileExist(bucket,String.format(cloudPointFyunPath,oldSceneCode,oldSceneCode) +"vision_edit.txt")){ return; } log.info("开始同步点云编辑文件"); // 上传点云编辑文件,并通知激光系统 fYunFileService.copyFileBetweenBucket(bucket,String.format(cloudPointFyunPath,oldSceneCode,oldSceneCode) + "vision_edit.txt", bucket,String.format(cloudPointFyunPath,sceneCode,sceneCode) + "vision_edit.txt"); fYunFileService.copyFileBetweenBucket(bucket,String.format(cloudPointFyunPath,oldSceneCode,oldSceneCode) + "uuidcloud", bucket,String.format(cloudPointFyunPath,sceneCode,sceneCode) + "uuidcloud"); Map params = new HashMap<>(); params.put("sceneNum", sceneCode); params.put("businessType", 0); rabbitMqProducer.sendByWorkQueue(cloudPointBuild, params); } }