Просмотр исходного кода

Merge branch 'feature-v4.11.0-20231024-dsx' into release

dengsixing 1 год назад
Родитель
Сommit
4fe30342ec

+ 10 - 0
src/main/java/com/fdkankan/scene/bean/SceneJsonBean.java

@@ -218,5 +218,15 @@ public class SceneJsonBean {
      */
     private Integer billboards;
 
+    /**
+     * 是否有模型裁剪(0-否,1-是)
+     */
+    private Integer cutModel;
+
+    /**
+     * 启动页信息
+     */
+    private JSONObject started;
+
 
 }

+ 24 - 9
src/main/java/com/fdkankan/scene/controller/SceneEditController.java

@@ -8,20 +8,15 @@ import com.fdkankan.scene.service.*;
 import com.fdkankan.scene.vo.*;
 import com.fdkankan.web.controller.BaseController;
 import com.fdkankan.web.response.ResultData;
-import java.io.IOException;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
+
 /**
  * 场景编辑管理
  */
@@ -53,6 +48,8 @@ public class SceneEditController extends BaseController {
     private ISceneAsynOperLogService sceneAsynOperLogService;
     @Autowired
     private ISceneEditInfoExtService sceneEditInfoExtService;
+    @Autowired
+    private ICutModelService cutModelService;
 
     /**
      * <p>
@@ -757,7 +754,7 @@ public class SceneEditController extends BaseController {
 
     @CheckPermit
     @PostMapping("/surveillance/delete")
-    public ResultData deleteSurveillance(@RequestBody @Validated BaseSidParamVO param){
+    public ResultData deleteSurveillance(@RequestBody @Validated BaseSidParamVO param) throws IOException {
         return surveillanceService.deleteSurveillance(param);
     }
 
@@ -898,6 +895,24 @@ public class SceneEditController extends BaseController {
         return ResultData.ok(sceneEditInfoExtService.deleteBillboardsStyles(param));
     }
 
+    @CheckPermit
+    @PostMapping(value = "/cutModel/save")
+    public ResultData saveCutModel(@RequestBody @Validated BaseJsonArrayParamVO param) throws Exception {
+        return cutModelService.saveCutModel(param);
+    }
+
+    @CheckPermit
+    @PostMapping(value = "/cutModel/list")
+    public ResultData listCutModel(@RequestBody @Validated BaseSceneParamVO param) throws Exception {
+        return ResultData.ok(cutModelService.listCutModel(param));
+    }
+
+    @CheckPermit
+    @PostMapping(value = "/cutModel/delete")
+    public ResultData deleteCutModel(@RequestBody @Validated DeleteSidListParamVO param) throws Exception {
+        return cutModelService.deleteCutModel(param);
+    }
+
 
 
 }

+ 12 - 0
src/main/java/com/fdkankan/scene/entity/SceneEditInfoExt.java

@@ -97,12 +97,24 @@ public class SceneEditInfoExt {
     private Integer billboards;
 
     /**
+     * 是否有指示牌(0-否,1-是)
+     */
+    @TableField("cut_model")
+    private Integer cutModel;
+
+    /**
      * 分享配置信息
      */
     @TableField("sns_info")
     private String snsInfo;
 
     /**
+     * 启动页信息
+     */
+    @TableField("started")
+    private String started;
+
+    /**
      * 创建时间
      */
     @TableField("create_time")

+ 20 - 0
src/main/java/com/fdkankan/scene/entity/Surveillance.java

@@ -65,6 +65,26 @@ public class Surveillance implements Serializable {
     private String playUrl;
 
     /**
+     * 类型
+     */
+    @TableField("url_type")
+    private Integer urlType;
+
+
+    /**
+     * 播放地址
+     */
+    @TableField("file_name")
+    private String  fileName;
+
+    /**
+     * 封面图
+     */
+    @TableField("poster")
+    private String  poster;
+
+
+    /**
      * 创建时间
      */
     @TableField("create_time")

+ 27 - 0
src/main/java/com/fdkankan/scene/service/ICutModelService.java

@@ -0,0 +1,27 @@
+package com.fdkankan.scene.service;
+
+import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.model.constants.UploadFilePath;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.scene.vo.BaseJsonArrayParamVO;
+import com.fdkankan.scene.vo.BaseSceneParamVO;
+import com.fdkankan.scene.vo.DeleteSidListParamVO;
+import com.fdkankan.web.response.ResultData;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public interface ICutModelService {
+
+    ResultData saveCutModel(BaseJsonArrayParamVO param) throws Exception;
+
+    List<JSONObject> listCutModel(BaseSceneParamVO param) throws Exception;
+
+    ResultData deleteCutModel(DeleteSidListParamVO param) throws Exception;
+
+    void publicCutModel(String num, String bucket) throws IOException;
+
+}

+ 3 - 1
src/main/java/com/fdkankan/scene/service/ISurveillanceService.java

@@ -6,6 +6,8 @@ import com.fdkankan.scene.vo.BaseSidParamVO;
 import com.fdkankan.scene.vo.SurveillanceParamVO;
 import com.fdkankan.scene.vo.SurveillanceVO;
 import com.fdkankan.web.response.ResultData;
+
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -20,7 +22,7 @@ public interface ISurveillanceService extends IService<Surveillance> {
 
     ResultData saveSurveillance(SurveillanceParamVO param);
 
-    ResultData deleteSurveillance(BaseSidParamVO param);
+    ResultData deleteSurveillance(BaseSidParamVO param) throws IOException;
 
     List<SurveillanceVO> listSurveillance(String num);
 

+ 282 - 0
src/main/java/com/fdkankan/scene/service/impl/CutModelServiceImpl.java

@@ -0,0 +1,282 @@
+package com.fdkankan.scene.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.FileBizType;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.constants.UploadFilePath;
+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.TagBean;
+import com.fdkankan.scene.entity.SceneEditInfoExt;
+import com.fdkankan.scene.entity.ScenePlus;
+import com.fdkankan.scene.entity.ScenePlusExt;
+import com.fdkankan.scene.service.*;
+import com.fdkankan.scene.vo.BaseJsonArrayParamVO;
+import com.fdkankan.scene.vo.BaseSceneParamVO;
+import com.fdkankan.scene.vo.DeleteFileParamVO;
+import com.fdkankan.scene.vo.DeleteSidListParamVO;
+import com.fdkankan.web.response.ResultData;
+import com.google.j2objc.annotations.AutoreleasePool;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class CutModelServiceImpl implements ICutModelService {
+
+    private final String CUT_MODEL_JSON_NAME = "cutModel.json";
+
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+    @Autowired
+    private ISceneEditInfoExtService sceneEditInfoExtService;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private RedisLockUtil redisLockUtil;
+    @Autowired
+    private FYunFileServiceInterface fYunFileService;
+    @Autowired
+    private ISceneUploadService sceneUploadService;
+
+
+    @Override
+    public ResultData saveCutModel(BaseJsonArrayParamVO param) throws Exception {
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
+
+        this.addOrUpdate(param.getNum(), param.getData());
+
+        //保存数据库
+        SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId());
+        this.updateDb(param.getNum(), scenePlus.getId());
+//        this.updateById(sceneEditInfoExt);
+
+        sceneEditInfoService.upgradeVersionById(sceneEditInfoExt.getEditInfoId());
+
+        return ResultData.ok();
+    }
+
+    @Override
+    public List<JSONObject> listCutModel(BaseSceneParamVO param) throws Exception {
+
+        List<JSONObject> tags = new ArrayList<>();
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
+        SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId());
+
+        this.syncFileToRedis(param.getNum());
+
+        //获取裁剪模型数据
+        String key = String.format(RedisKey.SCENE_CUT_MODEL, param.getNum());
+        List<String> list = redisUtil.hgetValues(key);
+        if(CollUtil.isNotEmpty(list)){
+            List<TagBean> sortList = list.stream().map(str -> {
+                JSONObject jsonObject = JSON.parseObject(str);
+                TagBean tagBean = new TagBean();
+                tagBean.setCreateTime(jsonObject.getLong("createTime"));
+                jsonObject.remove("createTime");
+                tagBean.setTag(jsonObject);
+                return tagBean;
+            }).collect(Collectors.toList());
+            sortList.sort(Comparator.comparingLong(TagBean::getCreateTime).reversed());
+            tags = sortList.stream().map(item -> item.getTag()).collect(Collectors.toList());
+        }
+
+        return tags;
+    }
+
+    @Override
+    public ResultData deleteCutModel(DeleteSidListParamVO param) throws Exception {
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
+        ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
+        String bucket = scenePlusExt.getYunFileBucket();
+
+        List<String> deleteSidList = param.getSidList();
+
+        this.syncFileToRedis(param.getNum());
+
+        //处理删除状态数据
+        List<String> deleteList = this.deleteCutModel(param.getNum(), deleteSidList, bucket);
+
+        //写入本地文件,作为备份
+        this.writeFile(param.getNum());
+
+        //删除oss文件
+        List<String> deleteFileList = new ArrayList<>();
+        deleteList.stream().forEach(str -> {
+            JSONObject parse = JSON.parseObject(str);
+            String playUrl = parse.getString("playUrl");
+            if(StrUtil.isNotEmpty(playUrl) && playUrl.length() > 1){
+                deleteFileList.add(playUrl);
+            }
+            String poster = parse.getString("poster");
+            if(StrUtil.isNotEmpty(poster) && poster.length() > 1){
+                deleteFileList.add(poster);
+            }
+        });
+        sceneUploadService.delete(
+                DeleteFileParamVO.builder()
+                        .num(param.getNum())
+                        .fileNames(deleteFileList)
+                        .bizType(FileBizType.CUT_MODEL.code()).build());
+
+        //保存数据库
+        SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId());
+        this.updateDb(param.getNum(), scenePlus.getId());
+        sceneEditInfoService.upgradeVersionById(sceneEditInfoExt.getEditInfoId());
+
+        return ResultData.ok();
+    }
+
+    public void publicCutModel(String sceneNum, String bucket) throws IOException {
+        String Key = String.format(RedisKey.SCENE_CUT_MODEL, sceneNum);
+        String userEditPath = String.format(UploadFilePath.USER_EDIT_PATH, sceneNum) + "cutModel.json";
+        List<String> list = redisUtil.hgetValues(Key);
+        if(CollUtil.isEmpty(list)){
+            fYunFileService.deleteFile(bucket, userEditPath);
+            return;
+        }
+        List<JSONObject> collect = list.stream().map(str -> JSON.parseObject(str)).collect(Collectors.toList());
+        fYunFileService.uploadFile(bucket, JSON.toJSONString(collect).getBytes(), userEditPath);
+    }
+
+    private List<String> deleteCutModel(String num, List<String> deleteSidList, String bucket) throws Exception {
+        if(CollUtil.isEmpty(deleteSidList)){
+            return null;
+        }
+
+        //从redis中加载热点数据
+        String key = String.format(RedisKey.SCENE_CUT_MODEL, num);
+        List<String> deletDataList = redisUtil.hMultiGet(key, deleteSidList);
+        if(CollUtil.isNotEmpty(deletDataList)){
+            redisUtil.hdel(key, deleteSidList.toArray());
+        }
+        return deletDataList;
+    }
+
+    private void updateDb(String num, Long scenePlusId){
+        //查询缓存是否包含热点数据
+        String key = String.format(RedisKey.SCENE_CUT_MODEL, num);
+        Map<String, String> cutModelMap = redisUtil.hmget(key);
+        boolean hasCutModel= false;
+        for (Map.Entry<String, String> tagMap : cutModelMap.entrySet()) {
+            if(StrUtil.isEmpty(tagMap.getValue())){
+                continue;
+            }
+            hasCutModel = true;
+            break;
+        }
+
+        //更改热点状态
+        sceneEditInfoExtService.update(
+                new LambdaUpdateWrapper<SceneEditInfoExt>()
+                        .set(SceneEditInfoExt::getCutModel, hasCutModel ? CommonStatus.YES.code().intValue() : CommonStatus.NO.code().intValue())
+                        .eq(SceneEditInfoExt::getScenePlusId,scenePlusId));
+    }
+
+    private void addOrUpdate(String num, List<JSONObject> data) throws Exception{
+        Map<String, String> addOrUpdateMap = new HashMap<>();
+        int i = 0;
+        for (JSONObject jsonObject : data) {
+            jsonObject.put("createTime", Calendar.getInstance().getTimeInMillis() + i++);
+            addOrUpdateMap.put(jsonObject.getString("sid"), JSON.toJSONString(jsonObject));
+        }
+
+        this.syncFileToRedis(num);
+
+        //处理新增和修改数据
+        this.addOrUpdateHandler(num, addOrUpdateMap);
+    }
+
+    private void addOrUpdateHandler(String num, Map<String, String> addOrUpdateMap){
+        if(CollUtil.isEmpty(addOrUpdateMap))
+            return;
+
+        //批量写入缓存
+        String key = String.format(RedisKey.SCENE_CUT_MODEL, num);
+        redisUtil.hmset(key, addOrUpdateMap);
+
+        //写入本地文件,作为备份
+        this.writeFile(num);
+    }
+
+    private void writeFile(String num){
+        String lockKey = String.format(RedisLockKey.LOCK_CUT_MODEL_SYNC, num);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
+        if(!lock){
+            return;
+        }
+        try{
+            String dataKey = String.format(RedisKey.SCENE_CUT_MODEL, num);
+            String cutModelJsonPath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + CUT_MODEL_JSON_NAME;
+            if(!redisUtil.hasKey(dataKey)){
+                FileUtil.del(cutModelJsonPath);
+                return;
+            }
+            Map<String, String> cutModelmap = redisUtil.hmget(dataKey);
+            List<JSONObject>  list = cutModelmap.entrySet().stream().map(entry->JSON.parseObject(entry.getValue())).collect(Collectors.toList());
+            FileUtil.writeUtf8String(JSON.toJSONString(list), cutModelJsonPath);
+        }finally {
+            redisLockUtil.unlockLua(lockKey, lockVal);
+        }
+    }
+
+    private void syncFileToRedis(String num) throws Exception{
+
+        String key = String.format(RedisKey.SCENE_CUT_MODEL, num);
+        boolean exist = redisUtil.hasKey(key);
+        if(exist){
+            return;
+        }
+        String lockKey = String.format(RedisLockKey.LOCK_CUT_MODEL_SYNC, num);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
+        if(!lock){
+            throw new BusinessException(ErrorCode.SYSTEM_BUSY);
+        }
+        try{
+            exist = redisUtil.hasKey(key);
+            if(exist){
+                return;
+            }
+            String cutModelFilePath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + CUT_MODEL_JSON_NAME;
+            String cutModelData = FileUtils.readUtf8String(cutModelFilePath);
+            if(StrUtil.isEmpty(cutModelData)){
+                return;
+            }
+            JSONArray tagsArr = JSON.parseArray(cutModelData);
+            if(CollUtil.isEmpty(tagsArr)){
+                return;
+            }
+            Map<String, String> map = new HashMap<>();
+            for (Object o : tagsArr) {
+                JSONObject jo = (JSONObject)o;
+                map.put(jo.getString("sid"), jo.toJSONString());
+            }
+            redisUtil.hmset(key, map);
+        }finally {
+            redisLockUtil.unlockLua(lockKey, lockVal);
+        }
+    }
+
+}

+ 41 - 21
src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java

@@ -2,6 +2,7 @@ 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.scene.service.*;
 import com.fdkankan.scene.vo.SaveFiltersParamVO;
 
 import cn.hutool.core.bean.BeanUtil;
@@ -48,18 +49,6 @@ import com.fdkankan.scene.entity.SceneEditInfoExt;
 import com.fdkankan.scene.entity.ScenePlus;
 import com.fdkankan.scene.entity.ScenePlusExt;
 import com.fdkankan.scene.mapper.ISceneEditInfoMapper;
-import com.fdkankan.scene.service.ICameraDetailService;
-import com.fdkankan.scene.service.ICompanyService;
-import com.fdkankan.scene.service.ISceneAsynOperLogService;
-import com.fdkankan.scene.service.ISceneDataDownloadService;
-import com.fdkankan.scene.service.ISceneEditControlsService;
-import com.fdkankan.scene.service.ISceneEditInfoExtService;
-import com.fdkankan.scene.service.ISceneEditInfoService;
-import com.fdkankan.scene.service.IScenePlusExtService;
-import com.fdkankan.scene.service.IScenePlusService;
-import com.fdkankan.scene.service.ISceneProService;
-import com.fdkankan.scene.service.ISceneUploadService;
-import com.fdkankan.scene.service.ISurveillanceService;
 import com.fdkankan.scene.vo.BallScreenVideoParamVO;
 import com.fdkankan.scene.vo.BaseDataParamVO;
 import com.fdkankan.scene.vo.BaseFileParamVO;
@@ -163,6 +152,8 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
     private ISurveillanceService surveillanceService;
     @Autowired
     private ISceneAsynOperLogService sceneAsynOperLogService;
+    @Autowired
+    private ICutModelService cutModelService;
 
     @Transactional
     @Override
@@ -194,6 +185,12 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         if(Objects.nonNull(param.getSns())){
             sceneEditInfoExt.setSnsInfo(JSON.toJSONString(param.getSns()));
         }
+        if(Objects.nonNull(param.getStarted())){
+            sceneEditInfoExt.setStarted(JSON.toJSONString(param.getStarted()));
+        }
+//        else{
+//            sceneEditInfoExt.setStarted("");
+//        }
         sceneEditInfoExtService.updateById(sceneEditInfoExt);
 
         if(Objects.nonNull(param.getControls())){
@@ -267,7 +264,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
 
         //生成sceneJson
         SceneJsonBean sceneJson = new SceneJsonBean();
-        BeanUtil.copyProperties(sceneEditInfoExt, sceneJson);
+        BeanUtil.copyProperties(sceneEditInfoExt, sceneJson, "started");
         BeanUtil.copyProperties(sceneEditInfo, sceneJson);
         sceneJson.setFloorPlanUpload(JSON.parseArray(sceneEditInfo.getFloorPlanUpload()));
         SceneEditControlsVO sceneEditControlsVO = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class);
@@ -289,6 +286,9 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         //发布分享配置
         sceneJson.setSns(JSON.parseObject(sceneEditInfoExt.getSnsInfo()));
 
+        //发布启动页配置
+        sceneJson.setStarted(JSON.parseObject(sceneEditInfoExt.getStarted()));
+
         //处理热点数据,生成hot.json
         this.publicHotData(num, bucket);
 
@@ -304,6 +304,9 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         //发布指示牌数据
         this.publicBillboardData(num, bucket);
 
+        //发布模型裁剪
+        cutModelService.publicCutModel(num, bucket);
+
         //本地写sceneJson文件
         String localSceneJsonPath = String.format(ConstantFilePath.SCENE_DATA_PATH_V4, num) + "scene.json";
         FileUtils.writeFile(localSceneJsonPath, JSON.toJSONString(sceneJson));
@@ -392,12 +395,28 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         if(CollUtil.isEmpty(linkPanMap)){
             return;
         }
-        JSONArray linkPanArr = new JSONArray();
-        linkPanMap.values().stream().forEach(linkPan->{
-            linkPanArr.add(JSON.parseObject(linkPan));
-        });
+        List<JSONObject> tags = Lists.newArrayList();
+        List<TagBean> tagBeanList = new ArrayList<>();
+        if(CollUtil.isNotEmpty(linkPanMap)){
+            linkPanMap.entrySet().stream().forEach(entry -> {
+                JSONObject jsonObject = JSON.parseObject(entry.getValue());
+                tagBeanList.add(
+                        TagBean.builder()
+                                .createTime(jsonObject.getLong("createTime"))
+                                .tag(jsonObject).build());
+            });
+            //按创建时间倒叙排序
+            tagBeanList.sort(Comparator.comparingLong(TagBean::getCreateTime).reversed());
+
+            //移除createTime字段
+            tags = tagBeanList.stream().map(tagBean -> {
+                JSONObject tag = tagBean.getTag();
+                tag.remove("createTime");
+                return tag;
+            }).collect(Collectors.toList());
+        }
         String linkScenePath = userEditPath + "links.json";
-        fYunFileService.uploadFile(bucket, linkPanArr.toString().getBytes(), linkScenePath);
+        fYunFileService.uploadFile(bucket, JSON.toJSONString(tags).getBytes(StandardCharsets.UTF_8), linkScenePath);
 
         //拷贝编辑目录到发布目录
         fYunFileService.copyFileBetweenBucket(bucket, imgEditPath + "panorama", bucket, imgViewPath + "panorama");
@@ -481,7 +500,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId());
         SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfo.getId());
         SceneInfoVO sceneInfoVO = new SceneInfoVO();
-        BeanUtil.copyProperties(sceneEditInfoExt, sceneInfoVO);
+        BeanUtil.copyProperties(sceneEditInfoExt, sceneInfoVO, "started");
         BeanUtil.copyProperties(sceneEditInfo, sceneInfoVO);
         sceneInfoVO.setFloorPlanUpload(JSON.parseArray(sceneEditInfo.getFloorPlanUpload()));
         if(Objects.isNull(sceneInfoVO.getFloorPlanAngle())){
@@ -504,6 +523,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         }
         sceneInfoVO.setSpace(FileSizeUtil.convert(scenePlusExt.getSpace(), FileSizeUnitType.MB.code()));
         sceneInfoVO.setSns(JSON.parseObject(sceneEditInfoExt.getSnsInfo()));
+        sceneInfoVO.setStarted(JSON.parseObject(sceneEditInfoExt.getStarted()));
 
         this.SortBoxVideos(sceneInfoVO);
 
@@ -514,8 +534,8 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
 
     public static void main(String[] args) {
         String test = "";
-        JSONObject jsonObject = JSON.parseObject(test);
-        System.out.println(jsonObject);
+//        JSONObject jsonObject = JSON.parseObject(test);
+        System.out.println(JSON.toJSONString(test));
     }
 
     private void SortBoxVideos(SceneInfoVO sceneInfoVO){

+ 3 - 5
src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java

@@ -648,7 +648,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
                 String currentPanoId = jo.getString("panoID");
                 JSONArray visibles = jo.getJSONArray("visibles");
                 JSONArray visibles3 = jo.getJSONArray("visibles3");
-                if (pano.getString("uuid").equals(currentPanoId)) {
+                if (pano.getString("uuid").replaceAll("-", "").equals(currentPanoId)) {
                     pano.put("visibles", visibles);
                     pano.put("visibles3", visibles3);
                 }
@@ -1069,11 +1069,9 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         return ResultData.ok(url);
     }
 
-    public static void main(String[] args) {
+    public static void main(String[] args) throws Exception {
 
-        Date time = Calendar.getInstance().getTime();
-        time = DateUtil.beginOfDay(DateUtil.offset(time, DateField.MONTH, -12));
-        System.out.println(time);
+        ConvertUtils.convertVisionModelDataToTxt( "D:\\test\\vision.modeldata", "D:\\test\\vision.json");
 
     }
 

+ 48 - 9
src/main/java/com/fdkankan/scene/service/impl/SurveillanceServiceImpl.java

@@ -1,25 +1,25 @@
 package com.fdkankan.scene.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.constant.CommonStatus;
 import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.ServerCode;
 import com.fdkankan.common.exception.BusinessException;
-import com.fdkankan.scene.entity.SceneEditInfo;
-import com.fdkankan.scene.entity.SceneEditInfoExt;
-import com.fdkankan.scene.entity.ScenePlus;
-import com.fdkankan.scene.entity.Surveillance;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.model.constants.UploadFilePath;
+import com.fdkankan.scene.entity.*;
 import com.fdkankan.scene.mapper.ISurveillanceMapper;
-import com.fdkankan.scene.service.ISceneEditInfoExtService;
-import com.fdkankan.scene.service.ISceneEditInfoService;
-import com.fdkankan.scene.service.IScenePlusService;
-import com.fdkankan.scene.service.ISurveillanceService;
+import com.fdkankan.scene.service.*;
 import com.fdkankan.scene.vo.BaseSidParamVO;
 import com.fdkankan.scene.vo.SurveillanceParamVO;
 import com.fdkankan.scene.vo.SurveillanceVO;
 import com.fdkankan.web.response.ResultData;
+
+import java.io.IOException;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -43,10 +43,24 @@ public class SurveillanceServiceImpl extends ServiceImpl<ISurveillanceMapper, Su
     private ISceneEditInfoExtService sceneEditInfoExtService;
     @Autowired
     private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private FYunFileServiceInterface yunFileService;
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
 
     @Override
     public ResultData saveSurveillance(SurveillanceParamVO param) {
 
+        if(param.getUrlType() == 1){
+            if(StrUtil.isEmpty(param.getPlayUrl())){
+                throw new BusinessException(ServerCode.PARAM_REQUIRED.code(), ServerCode.PARAM_REQUIRED.formatMessage("playUrl"));
+            }
+        }else{
+            if(StrUtil.isEmpty(param.getFileName()) || StrUtil.isEmpty(param.getPoster())){
+                throw new BusinessException(ServerCode.PARAM_REQUIRED.code(), ServerCode.PARAM_REQUIRED.formatMessage("fileName、poster"));
+            }
+        }
+
         ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
         if(Objects.isNull(scenePlus)){
             throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
@@ -64,6 +78,9 @@ public class SurveillanceServiceImpl extends ServiceImpl<ISurveillanceMapper, Su
         surveillance.setName(param.getName());
         surveillance.setData(param.getData().toJSONString());
         surveillance.setPlayUrl(param.getPlayUrl());
+        surveillance.setUrlType(param.getUrlType());
+        surveillance.setFileName(param.getFileName());
+        surveillance.setPoster(param.getPoster());
         this.saveOrUpdate(surveillance);
 
         sceneEditInfoExt.setSurveillances(CommonStatus.YES.code().intValue());
@@ -76,13 +93,23 @@ public class SurveillanceServiceImpl extends ServiceImpl<ISurveillanceMapper, Su
     }
 
     @Override
-    public ResultData deleteSurveillance(BaseSidParamVO param) {
+    public ResultData deleteSurveillance(BaseSidParamVO param) throws IOException {
         ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
         if(Objects.isNull(scenePlus)){
             throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
         }
+
+        Surveillance surveillance = this.getBySid(param.getNum(), param.getSid());
+        if(Objects.isNull(surveillance)){
+            return ResultData.ok("sid不存在");
+        }
+
+        ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
         SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
         SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByScenePlusId(scenePlus.getId());
+        String bucket = scenePlusExt.getYunFileBucket();
+
+
 
         this.remove(new LambdaQueryWrapper<Surveillance>().eq(Surveillance::getSid, param.getSid()));
 
@@ -90,6 +117,18 @@ public class SurveillanceServiceImpl extends ServiceImpl<ISurveillanceMapper, Su
         if(count < 1){
             sceneEditInfoExt.setSurveillances(CommonStatus.NO.code().intValue());
         }
+
+        //如果是视频类型监控,需要删除oss文件
+        if(surveillance.getUrlType() == 2){
+            String userEditPath = String.format(UploadFilePath.USER_EDIT_PATH, param.getNum());
+            if(StrUtil.isNotEmpty(surveillance.getFileName())){
+                yunFileService.deleteFile(bucket, userEditPath.concat(surveillance.getFileName()));
+            }
+            if(StrUtil.isNotEmpty(surveillance.getPoster())){
+                yunFileService.deleteFile(bucket, userEditPath.concat(surveillance.getPoster()));
+            }
+        }
+
         sceneEditInfoExtService.updateById(sceneEditInfoExt);
 
         sceneEditInfoService.upgradeVersionById(sceneEditInfo.getId());

+ 4 - 1
src/main/java/com/fdkankan/scene/vo/SceneEditInfoParamVO.java

@@ -79,7 +79,10 @@ public class SceneEditInfoParamVO extends BaseSceneParamVO{
      */
     private JSONObject sns;
 
-
+    /**
+     * 启动页信息
+     */
+    private JSONObject started;
 
 
 }

+ 10 - 0
src/main/java/com/fdkankan/scene/vo/SceneInfoVO.java

@@ -244,5 +244,15 @@ public class SceneInfoVO {
      */
     private Integer billboards;
 
+    /**
+     * 是否有模型裁剪(0-否,1-是)
+     */
+    private Integer cutModel = 0;
+
+    /**
+     * 启动页配置信息
+     */
+    private JSONObject started;
+
 
 }

+ 9 - 1
src/main/java/com/fdkankan/scene/vo/SurveillanceParamVO.java

@@ -3,6 +3,8 @@ package com.fdkankan.scene.vo;
 import com.alibaba.fastjson.JSONObject;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
 import lombok.Data;
 
 /**
@@ -25,9 +27,15 @@ public class SurveillanceParamVO {
     @NotBlank(message = "name不能为空")
     private String name;
 
-    @NotBlank(message = "playUrl不能为空")
     private String playUrl;
 
+    @NotNull(message = "urlType不能为空")
+    private Integer urlType = 1;
+
+    private String poster;
+
+    private String fileName;
+
     @NotBlank(message = "panoId不能为空")
     private String panoId;
 

+ 8 - 0
src/main/java/com/fdkankan/scene/vo/SurveillanceVO.java

@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject;
 import java.io.Serializable;
 import lombok.Data;
 
+import javax.validation.constraints.NotNull;
+
 /**
  * <p>
  * 监控推拉流信息
@@ -34,6 +36,12 @@ public class SurveillanceVO implements Serializable {
      */
     private String playUrl;
 
+    private Integer urlType;
+
+    private String poster;
+
+    private String fileName;
+
     private String sid;
 
     private String panoId;