package com.fdkankan.contro.service.impl; import cn.hutool.core.io.FileUtil; import com.alibaba.fastjson.JSONObject; import com.fdkankan.common.constant.CommonStatus; import com.fdkankan.common.constant.SceneVersionType; import com.fdkankan.common.util.DateUtil; import com.fdkankan.common.util.FileUtils; import com.fdkankan.contro.entity.Camera; import com.fdkankan.contro.entity.ScenePlus; import com.fdkankan.contro.entity.ScenePlusExt; import com.fdkankan.contro.entity.ScenePro; import com.fdkankan.contro.service.IFdkkLaserService; import com.fdkankan.contro.service.IScenePlusExtService; import com.fdkankan.contro.service.IScenePlusService; import com.fdkankan.contro.service.ISceneProService; import com.fdkankan.fyun.face.FYunFileServiceInterface; import com.fdkankan.rabbitmq.util.RabbitMqProducer; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import javax.annotation.Resource; import java.io.File; import java.io.IOException; import java.util.*; @Service @Slf4j public class IFdkkLaserServiceImpl implements IFdkkLaserService { @Autowired private ISceneProService sceneProService; @Autowired private IScenePlusService scenePlusService; @Autowired private IScenePlusExtService scenePlusExtService; @Autowired private RabbitMqProducer rabbitMqProducer; @Value("${queue.application.laser.update-scene}") private String updateScene; @Value("${queue.application.laser.init-scene:laser-init-scene}") private String initScene; @Value("${queue.application.laser.update-build-status}") private String updateBuildStatus; @Value("${queue.application.laser.cloud-point-build}") private String cloudPointBuild; @Value("${4dkk.laserService.bucket}") private String bucket; @Value("${4dkk.laserService.cloud-point-fyun-path}") private String cloudPointFyunPath; @Resource private FYunFileServiceInterface fYunFileService; public void syncBuildResult(String num) { log.info("激光转台相机构建结果 同步 请求 "); try { String dataSource = null; Integer sceneStatus = null; Date createTime = null; Integer shootCount = null; Integer payStatus = null; Boolean mixture = false; String version = SceneVersionType.V4.code(); ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num); if(Objects.nonNull(scenePlus)){ ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); dataSource = scenePlusExt.getDataSource(); sceneStatus = scenePlus.getSceneStatus(); createTime = scenePlus.getCreateTime(); shootCount = scenePlusExt.getShootCount(); payStatus = scenePlus.getPayStatus(); mixture = scenePlusExt.getMixture() == CommonStatus.NO.code().intValue() ? false : true; }else{ ScenePro scenePro = sceneProService.getByNum(num); dataSource = scenePro.getDataSource(); sceneStatus = scenePro.getStatus(); version = SceneVersionType.V3.code(); createTime = scenePro.getCreateTime(); shootCount = scenePro.getShootCount(); payStatus = scenePro.getPayStatus(); } String jgPath = dataSource; //创建目录 if (dataSource.lastIndexOf("/") != -1) { jgPath = jgPath + "_laserData"; } else { jgPath = jgPath.substring(0, jgPath.length() - 1) + "_laserData"; } FileUtils.createDir(jgPath + "/extras"); log.info("生成 激光相机目录 " + jgPath); //生成data.json JSONObject jgDataJson = new JSONObject(); jgDataJson.put("split_type", "SPLIT_V15"); jgDataJson.put("skybox_type", "SKYBOX_V5"); jgDataJson.put("extras", null); FileUtils.writeFile(jgPath + File.separator + "data.json", jgDataJson.toString()); // result/mesh/mesh.obj --> jgPath/laserData/laser.obj log.info("开始拷贝obj文件"); FileUtils.copyDirectiory(dataSource + "/results/mesh", jgPath + "/laserData/mesh"); FileUtils.copyDirectiory(dataSource + "/results/laserData/cover", jgPath + "/extras"); //删除旧的深度图 if(FileUtil.exist( jgPath+"/laserData/depthmap/")){ FileUtil.del(jgPath+"/laserData/depthmap/"); } FileUtils.copyFile(dataSource + "/results/laserData", jgPath, true); // updateSceneStatus(scenePlus, scenePlusExt, jgPath + File.separator + "laserData",createTime, algorithmTime, scenePlusExt); Map params = new HashMap<>(); params.put("sceneCode", num); params.put("status", sceneStatus); params.put("version",version); params.put("createTime", DateUtil.date2String(createTime, null)); params.put("algorithmTime", DateUtil.date2String(Calendar.getInstance().getTime(), null)); if (!ObjectUtils.isEmpty(jgPath)) { params.put("path", jgPath); } params.put("shootCount", shootCount); params.put("payStatus", payStatus); params.put("mixture", mixture); rabbitMqProducer.sendByWorkQueue(updateScene, params); } catch (Exception e) { log.error("激光转台相机同步失败", e); } } @Override public void pushBuildStatusToLaserSystem(String projectNum, String laserObjFilePath, Integer buildObjStatus) { Map params = new HashMap<>(); params.put("sceneCode", projectNum); params.put("objPath", laserObjFilePath); params.put("buildObjStatus", buildObjStatus); rabbitMqProducer.sendByWorkQueue(updateBuildStatus, params); } public void saveScene(ScenePlus scenePlus, JSONObject fdageJson, Camera cameraEntity, String phone, boolean rebuild, Integer payStatus) { Map params = new HashMap<>(); params.put("childName", cameraEntity.getChildName()); params.put("createTime", DateUtil.date2String(scenePlus.getCreateTime(), null)); params.put("phone", phone); params.put("sceneCode", scenePlus.getNum()); params.put("snCode", cameraEntity.getSnCode()); params.put("status", scenePlus.getSceneStatus()); if (!rebuild) { if(Objects.nonNull(fdageJson)){ params.put("password", fdageJson.getString("pwd")); } } else { params.put("status", 4); } params.put("version",getSceneVersion(scenePlus.getNum())); params.put("title", scenePlus.getTitle()); params.put("userId", scenePlus.getUserId()); params.put("sceneSource", scenePlus.getSceneSource()); params.put("payStatus", scenePlus.getPayStatus()); if(Objects.nonNull(fdageJson)){ params.put("location", fdageJson.getInteger("location")); } params.put("payStatus", payStatus); rabbitMqProducer.sendByWorkQueue(initScene, params); } public void saveScene(ScenePro scenePro, String scenePassword, Camera cameraEntity, String phone, boolean rebuild, Integer payStatus) { Map params = new HashMap<>(); params.put("childName", cameraEntity.getChildName()); if(ObjectUtils.isEmpty(scenePro.getCreateTime())){ scenePro.setCreateTime(new Date()); } params.put("createTime", DateUtil.date2String(scenePro.getCreateTime(), null)); params.put("phone", phone); params.put("sceneCode", scenePro.getNum()); params.put("snCode", cameraEntity.getSnCode()); params.put("status", scenePro.getStatus()); if (!rebuild) { params.put("password", scenePassword); } else { params.put("status", 4); } params.put("version",getSceneVersion(scenePro.getNum())); params.put("title", scenePro.getSceneName()); params.put("userId", scenePro.getUserId()); params.put("payStatus", payStatus); rabbitMqProducer.sendByWorkQueue(initScene, params); } private String getSceneVersion(String num) { String version = "V3"; ScenePro scenepro = sceneProService.getByNum(num); if (scenepro == null || scenepro.getIsUpgrade() == 1) { ScenePlus plus = scenePlusService.getScenePlusByNum(num); if (plus != null) { version = "V4"; } } return version; } @Override public void cloudPointBuild(String sceneCode, String path) { log.info("开始同步点云编辑文件"); // 删除旧的文件及目录 try { fYunFileService.deleteFile(cloudPointFyunPath + "vision_edit.txt"); fYunFileService.deleteFolder(cloudPointFyunPath + "uuidcloud"); } catch (IOException e) { log.error("删除文件失败", e); e.printStackTrace(); } // 上传点云编辑文件,并通知激光系统 log.info("开始上传点云文件,bucket:{}", bucket); fYunFileService.uploadFile(bucket,path + "/results/laserData/vision_edit.txt", String.format(cloudPointFyunPath,sceneCode,sceneCode) + "vision_edit.txt"); fYunFileService.uploadFileByCommand(bucket,path + "/results/laserData/uuidcloud", String.format(cloudPointFyunPath,sceneCode,sceneCode) + "uuidcloud"); Map params = new HashMap<>(); params.put("sceneNum", sceneCode); params.put("businessType", 0); rabbitMqProducer.sendByWorkQueue(cloudPointBuild, params); } }