package com.fdkankan.scene.service.impl; import cn.hutool.core.util.CharsetUtil; import com.fdkankan.common.constant.*; import com.fdkankan.common.util.FileSizeUtil; import com.fdkankan.rabbitmq.util.RabbitMqProducer; import com.fdkankan.scene.entity.*; import com.fdkankan.scene.service.*; import com.fdkankan.scene.vo.SaveFiltersParamVO; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fdkankan.common.constant.*; import com.fdkankan.common.exception.BusinessException; import com.fdkankan.common.util.FileMd5Util; import com.fdkankan.common.util.FileSizeUtil; import com.fdkankan.common.util.FileUtils; import com.fdkankan.dxf.parse.utils.FdJsonToDxfUtil; import com.fdkankan.fyun.config.FYunFileConfig; import com.fdkankan.fyun.face.FYunFileServiceInterface; import com.fdkankan.fyun.util.OssFileUtil; import com.fdkankan.model.constants.ConstantFilePath; import com.fdkankan.model.constants.UploadFilePath; import com.fdkankan.model.utils.ComputerUtil; import com.fdkankan.model.utils.CreateHouseJsonUtil; import com.fdkankan.model.utils.CreateObjUtil; import com.fdkankan.model.utils.SceneUtil; import com.fdkankan.redis.constant.RedisKey; import com.fdkankan.redis.constant.RedisLockKey; import com.fdkankan.redis.util.RedisLockUtil; import com.fdkankan.redis.util.RedisUtil; import com.fdkankan.scene.bean.BoxPhotoBean; import com.fdkankan.scene.bean.PointBean; import com.fdkankan.scene.bean.SceneJsonBean; import com.fdkankan.scene.bean.SegmentBean; import com.fdkankan.scene.bean.StyleBean; import com.fdkankan.scene.bean.TagBean; import com.fdkankan.scene.bean.VertexBean; import com.fdkankan.scene.bean.WallBean; import com.fdkankan.scene.bean.*; import com.fdkankan.scene.entity.*; import com.fdkankan.scene.mapper.ISceneEditInfoMapper; import com.fdkankan.scene.service.*; import com.fdkankan.scene.vo.*; import com.fdkankan.scene.vo.BallScreenVideoParamVO; import com.fdkankan.scene.vo.BaseDataParamVO; import com.fdkankan.scene.vo.BaseFileParamVO; import com.fdkankan.scene.vo.BaseSceneParamVO; import com.fdkankan.scene.vo.DeleteFileParamVO; import com.fdkankan.scene.vo.DeleteLinkPanParamVO; import com.fdkankan.scene.vo.DeleteStylesParamVO; import com.fdkankan.scene.vo.DeleteMosaicParamVO; import com.fdkankan.scene.vo.DeleteSidParamVO; import com.fdkankan.scene.vo.DownloadVO; import com.fdkankan.scene.vo.FileNameAndDataParamVO; import com.fdkankan.scene.vo.FileParamVO; import com.fdkankan.scene.vo.RenameCadParamVO; import com.fdkankan.scene.vo.SaveLinkPanParamVO; import com.fdkankan.scene.vo.SceneCheckKeyParamVO; import com.fdkankan.scene.vo.SceneEditControlsVO; import com.fdkankan.scene.vo.SceneEditInfoParamVO; import com.fdkankan.scene.vo.SceneEditInfoVO; import com.fdkankan.scene.vo.SceneInfoParamVO; import com.fdkankan.scene.vo.SceneInfoVO; import com.fdkankan.scene.vo.SurveillanceVO; import com.fdkankan.scene.vo.UploadPanoramaVO; import com.fdkankan.web.response.ResultData; import com.google.common.collect.Lists; import com.google.errorprone.annotations.Var; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.Map.Entry; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** *
* 服务实现类 *
* * @author * @since 2022-01-18 */ @Slf4j @RefreshScope @Service public class SceneEditInfoServiceImpl extends ServiceImpl编辑页面获取场景详情信息 *
* @author dengsixing * @date 2022/1/21 * @param num * @return com.fdkankan.scene.vo.SceneInfoVO **/ private SceneInfoVO getSceneInfo4Edit(String num) throws Exception{ ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num); if(Objects.isNull(scenePlus)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); SceneEditInfo sceneEditInfo = this.getByScenePlusId(scenePlus.getId()); if(Objects.isNull(sceneEditInfo)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId()); SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfo.getId()); SceneInfoVO sceneInfoVO = new SceneInfoVO(); BeanUtil.copyProperties(sceneEditInfoExt, sceneInfoVO, "started"); BeanUtil.copyProperties(sceneEditInfo, sceneInfoVO); sceneInfoVO.setFloorPlanUpload(JSON.parseArray(sceneEditInfo.getFloorPlanUpload())); if(Objects.isNull(sceneInfoVO.getFloorPlanAngle())){ sceneInfoVO.setFloorPlanAngle(0f); } if(Objects.isNull(sceneInfoVO.getFloorPlanCompass())){ sceneInfoVO.setFloorPlanCompass(0f); } sceneInfoVO.setControls(BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class)); sceneInfoVO.setNum(num); sceneInfoVO.setCreateTime(scenePlusExt.getAlgorithmTime()); sceneInfoVO.setSceneResolution(scenePlusExt.getSceneResolution()); sceneInfoVO.setSceneFrom(scenePlusExt.getSceneFrom()); sceneInfoVO.setSceneKind(scenePlusExt.getSceneKind()); sceneInfoVO.setModelKind(scenePlusExt.getModelKind()); sceneInfoVO.setVideos(scenePlusExt.getVideos()); if(CommonStatus.YES.code().intValue() == sceneEditInfoExt.getMosaic()){ sceneInfoVO.setMosaicList(this.getMosaicList(num)); } sceneInfoVO.setSpace(FileSizeUtil.convert(scenePlusExt.getSpace(), FileSizeUnitType.MB.code())); sceneInfoVO.setSns(JSON.parseObject(sceneEditInfoExt.getSnsInfo())); sceneInfoVO.setStarted(JSON.parseObject(sceneEditInfoExt.getStarted())); sceneInfoVO.setOrientation(scenePlusExt.getOrientation()); sceneInfoVO.setHasFloorplanAi(scenePlus.getHasFloorplanAi()); this.SortBoxVideos(sceneInfoVO); this.setExtData(sceneInfoVO, scenePlus.getCameraId()); sceneInfoVO.setDynamicPanel(sceneDynamicPanelService.checkDynamicPanel(num)); return sceneInfoVO; } public static void main(String[] args) { String test = ""; // JSONObject jsonObject = JSON.parseObject(test); System.out.println(JSON.toJSONString(test)); } private void SortBoxVideos(SceneInfoVO sceneInfoVO){ String boxVideos = sceneInfoVO.getBoxVideos(); if(StrUtil.isEmpty(boxVideos)){ return; } JSONArray boxVideoArr = JSON.parseArray(boxVideos); if(CollUtil.isEmpty(boxVideoArr)){ return; } ListgetInfo接口返回字段扩展 *
* @author dengsixing * @date 2022/3/9 **/ private void setExtData(SceneInfoVO sceneInfoVO, Long cameraId) throws Exception{ if(Objects.isNull(cameraId)){ return; } CameraDetail cameraDetail = cameraDetailService.findByCameraId(cameraId); if(Objects.isNull(cameraDetail)){ return; } if(Objects.isNull(cameraDetail.getCompanyId())){ return; } Company company = companyService.getById(cameraDetail.getCompanyId()); if(Objects.isNull(company)){ return; } sceneInfoVO.setDataSync(company.getDataSync()); } /** *查看页面获取场景详情信息 *
* @author dengsixing * @date 2022/1/21 * @param num * @return com.fdkankan.scene.vo.SceneInfoVO **/ private SceneInfoVO getSceneInfo4View(SceneInfoParamVO param, HttpServletRequest request) throws Exception{ String num = param.getNum(); //校验场景是否为空、封存、计算中 ScenePlus scenePlus = scenePlusService.checkSceneAvail(num); ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); //访问量+1 scenePlusService.updateViewCount(num); String key = String.format(RedisKey.SCENE_JSON, num); String sceneJson = redisUtil.get(key); SceneInfoVO sceneInfoVO = null; //先查询redis if(StrUtil.isEmpty(sceneJson)) { String objectName = String.format(ConstantFilePath.SCENE_VIEW_DATA_DATA_SCENEJSON, num); sceneJson = fYunFileService.getFileContent(scenePlusExt.getYunFileBucket(), objectName); redisUtil.set(key, sceneJson); } sceneInfoVO = JSON.parseObject(sceneJson, SceneInfoVO.class); sceneInfoVO.setScenePassword(null); if(Objects.isNull(sceneInfoVO.getFloorPlanAngle())){ sceneInfoVO.setFloorPlanAngle(0f); } if(Objects.isNull(sceneInfoVO.getFloorPlanCompass())){ sceneInfoVO.setFloorPlanCompass(0f); } SceneEditControlsVO controls = sceneInfoVO.getControls(); if(Objects.isNull(controls.getShowShare())){ controls.setShowShare(CommonStatus.YES.code().intValue()); } if(Objects.isNull(controls.getShowCapture())){ controls.setShowCapture(CommonStatus.YES.code().intValue()); } if(Objects.isNull(controls.getShowBillboardTitle())){ controls.setShowBillboardTitle(CommonStatus.YES.code().intValue()); } if(Objects.isNull(controls.getShowDrawTitle())){ controls.setShowDrawTitle(CommonStatus.YES.code().intValue()); } sceneInfoVO.setPayStatus(scenePlus.getPayStatus()); //江门公安需求,如果是业务授权或者带有签名的链接进来的场景,不需要校验场景查看密码 if(StrUtil.isNotEmpty(param.getSign()) || jmgaService.isBizAuth(num)){ controls.setShowLock(CommonStatus.NO.code().intValue()); } return sceneInfoVO; } @Override public ResultData saveCad(BaseDataParamVO param) throws Exception { String num = param.getNum(); ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num); if(Objects.isNull(scenePlus)) throw new BusinessException(ErrorCode.FAILURE_CODE_5005); ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); String bucket = scenePlusExt.getYunFileBucket(); String editUserPath = String.format(UploadFilePath.USER_EDIT_PATH, num); String localDataPath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num); JSONObject fileInfoJson = JSON.parseObject(param.getData()); Float angel = null; Float compass = null; String floorJsonData = fileInfoJson.getString("floorJsonData"); if(StrUtil.isNotBlank(floorJsonData)){ JSONObject jsonObject = JSON.parseObject(floorJsonData); angel = jsonObject.getFloat("angle"); compass = jsonObject.getFloat("compass"); } //处理户型图数据 //上传floorplan_user.json文件 FileUtils.writeFile(localDataPath + "floorplan_user.json", floorJsonData); fYunFileService.uploadFile(bucket, localDataPath + "floorplan_user.json", editUserPath + "floorplan.json"); //写入数据库 Byte floorPlanUser = null; if(StrUtil.isNotEmpty(floorJsonData)){ // JSONObject houseTypeJson = CreateHouseJsonUtil // .createHouseTypeJsonByUser(localDataPath + "floorplan_user.json"); // if(Objects.nonNull(houseTypeJson)) { // fYunFileService.uploadFile(bucket, houseTypeJson.toJSONString().getBytes(), editUserPath + "houseType.json"); // } floorPlanUser = CommonStatus.YES.code(); } SceneEditInfo sceneEditInfoDb = this.getByScenePlusId(scenePlus.getId()); if(Objects.nonNull(sceneEditInfoDb)){ LambdaUpdateWrapper
保证马赛克数据安全性,当redis宕机导致热点数据丢失时,可以从文件中读取,恢复到redis
**/
private void syncMosaicFromFileToRedis(String num) throws Exception{
String key = String.format(RedisKey.SCENE_MOSAIC_DATA, num);
boolean exist = redisUtil.hasKey(key);
if(exist){
return;
}
// String uuid = cn.hutool.core.lang.UUID.randomUUID().toString();
String lockKey = String.format(RedisLockKey.LOCK_MOSAIC_DATA_SYNC, num);
boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
if(!lock){
throw new BusinessException(ErrorCode.SYSTEM_BUSY);
}
try{
exist = redisUtil.hasKey(key);
if(exist){
return;
}
String filePath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + "mosaic.json";
String mosaicData = FileUtils.readUtf8String(filePath);
if(StrUtil.isEmpty(mosaicData)){
return;
}
JSONArray jsonArray = JSON.parseArray(mosaicData);
if(CollUtil.isEmpty(jsonArray)){
return;
}
Map
保证马赛克数据安全性,当redis宕机导致热点数据丢失时,可以从文件中读取,恢复到redis
**/
private void writeMosaic(String num) throws Exception{
String mosaicPath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + "mosaic.json";
String key = String.format(RedisKey.SCENE_MOSAIC_DATA, num);
Map
热点数据保存
*
保证icons数据安全性,当redis宕机导致icons数据丢失时,可以从文件中读取,恢复到redis
*
保证热点数据安全性,当redis宕机导致热点数据丢失时,可以从文件中读取,恢复到redis
*