dengsixing před 3 roky
rodič
revize
cadc7183c3

+ 16 - 2
4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/SceneEditController.java

@@ -616,7 +616,8 @@ public class SceneEditController extends BaseController {
     /**
      * 保存关联全景图
      */
-    @PostMapping(value = "/uploadLinkPan")
+    @CheckCooperationPermit
+    @PostMapping(value = "/linkPan/upload")
     public ResultData uploadLinkPan(
         @RequestParam(value = "num") String num,
         @RequestParam(value = "sid") String sid,
@@ -628,11 +629,24 @@ public class SceneEditController extends BaseController {
     /**
      * 保存关联全景图
      */
-    @PostMapping(value = "/saveLinkPan")
+    @CheckCooperationPermit
+    @PostMapping(value = "/linkPan/save")
     public ResultData saveLinkPan(@RequestBody @Validated SaveLinkPanParamVO param) throws Exception{
         return sceneEditInfoService.saveLinkPan(param);
     }
 
+    @CheckCooperationPermit
+    @PostMapping(value = "/linkPan/delete")
+    public ResultData deleteLinkPan(@RequestBody @Validated DeleteLinkPanParamVO param) throws Exception {
+        return sceneEditInfoService.deleteLinkPan(param);
+    }
+
+    @CheckCooperationPermit
+    @PostMapping(value = "/linkPan/list")
+    public ResultData listLinkPan(@RequestParam(value = "num") String num) throws Exception {
+        return sceneEditInfoService.listLinkPan(num);
+    }
+
     /**
      * 保存关联全景图json
      */

+ 1 - 1
4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/TestController.java

@@ -88,7 +88,7 @@ public class TestController extends BaseController {
     @GetMapping("/test")
     public ResultData test() throws Exception {
 
-//        uploadToOssUtil.uploadBySh(path, "test_dsx/bin.tar");
+        uploadToOssUtil.deleteFile("test_dsx");
 
         return ResultData.ok();
 

+ 6 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/entity/SceneEditInfoExt.java

@@ -62,6 +62,12 @@ public class SceneEditInfoExt {
     private String mosaics;
 
     /**
+     * 是否有场景关联(0-否,1-是)
+     */
+    @TableField("link_scenes")
+    private Integer linkScenes;
+
+    /**
      * 创建时间
      */
     @TableField("create_time")

+ 126 - 126
4dkankan-center-scene/src/main/java/com/fdkankan/scene/listener/RabbitMqListener.java

@@ -1,131 +1,131 @@
-package com.fdkankan.scene.listener;
-
-import com.alibaba.fastjson.JSONObject;
-import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
-import com.fdkankan.rabbitmq.bean.BuildSceneFailDTMqMessage;
-import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
-import com.fdkankan.scene.service.IBuildSceneDTService;
-import com.fdkankan.scene.service.IBuildScenePostService;
-import com.fdkankan.scene.service.IBuildScenePreService;
-import com.fdkankan.scene.service.impl.BuildSceneDTServiceImpl;
-import com.rabbitmq.client.Channel;
-import java.nio.charset.StandardCharsets;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.amqp.core.Message;
-import org.springframework.amqp.rabbit.annotation.Queue;
-import org.springframework.amqp.rabbit.annotation.RabbitListener;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-/**
- * <p>
- * TODO
- * </p>
- *
- * @author dengsixing
- * @since 2022/4/19
- **/
-@Slf4j
-@Component
-public class RabbitMqListener {
-    @Value("${queue.modeling.modeling-pre}")
-    private String queueModelingPre;
-    @Value("${queue.modeling.modeling-post}")
-    private String queueModelingPost;
-    @Value("${queue.modeling.modeling-dt}")
-    private String queueModelingDt;
-
-    @Autowired
-    IBuildScenePreService buildScenePreService;
-    @Autowired
-    IBuildScenePostService buildScenePostService;
-    @Autowired
-    IBuildSceneDTService buildSceneDTService;
-
-
-
-    /**
-     * 开启了手动确认模式,如果没有手动确认,消费者不会重试,当服务重启时会再次消费,因为rabbitmq认为你还没有处理完你的业务
-     * queuesToDeclare = @Queue("${queue.modeling.modeling-test}"),  如果队列不不存在会自动创建队列
-     * concurrency = "3"    设置消费线程数,每个线程每次只拉取一条消息消费
-     */
+//package com.fdkankan.scene.listener;
+//
+//import com.alibaba.fastjson.JSONObject;
+//import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
+//import com.fdkankan.rabbitmq.bean.BuildSceneFailDTMqMessage;
+//import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
+//import com.fdkankan.scene.service.IBuildSceneDTService;
+//import com.fdkankan.scene.service.IBuildScenePostService;
+//import com.fdkankan.scene.service.IBuildScenePreService;
+//import com.fdkankan.scene.service.impl.BuildSceneDTServiceImpl;
+//import com.rabbitmq.client.Channel;
+//import java.nio.charset.StandardCharsets;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.amqp.core.Message;
+//import org.springframework.amqp.rabbit.annotation.Queue;
+//import org.springframework.amqp.rabbit.annotation.RabbitListener;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.stereotype.Component;
+//
+///**
+// * <p>
+// * TODO
+// * </p>
+// *
+// * @author dengsixing
+// * @since 2022/4/19
+// **/
+//@Slf4j
+//@Component
+//public class RabbitMqListener {
+//    @Value("${queue.modeling.modeling-pre}")
+//    private String queueModelingPre;
+//    @Value("${queue.modeling.modeling-post}")
+//    private String queueModelingPost;
+//    @Value("${queue.modeling.modeling-dt}")
+//    private String queueModelingDt;
+//
+//    @Autowired
+//    IBuildScenePreService buildScenePreService;
+//    @Autowired
+//    IBuildScenePostService buildScenePostService;
+//    @Autowired
+//    IBuildSceneDTService buildSceneDTService;
+//
+//
+//
+//    /**
+//     * 开启了手动确认模式,如果没有手动确认,消费者不会重试,当服务重启时会再次消费,因为rabbitmq认为你还没有处理完你的业务
+//     * queuesToDeclare = @Queue("${queue.modeling.modeling-test}"),  如果队列不不存在会自动创建队列
+//     * concurrency = "3"    设置消费线程数,每个线程每次只拉取一条消息消费
+//     */
+////    @RabbitListener(
+////        queuesToDeclare = @Queue("${queue.modeling.modeling-test}"),
+////        concurrency = "1"
+////    )
+////    public void receiveMessageDsx(Channel channel, Message message) throws Exception {
+////        channel.queueDeclare();
+////        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+////        log.info("开始消费消息-" + msg + "-" + Thread.currentThread().getId());
+////        Thread.sleep(5000L);
+////        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+////        log.info("结束消息-" + Thread.currentThread().getId());
+////    }
+//
+//
+//    /**
+//     * 场景计算前置资源准备处理
+//     * @param channel
+//     * @param message
+//     * @throws Exception
+//     */
 //    @RabbitListener(
-//        queuesToDeclare = @Queue("${queue.modeling.modeling-test}"),
-//        concurrency = "1"
+//        queuesToDeclare = @Queue("${queue.modeling.modeling-pre}"),
+//        concurrency = "${maxThread.modeling.modeling-pre}"
 //    )
-//    public void receiveMessageDsx(Channel channel, Message message) throws Exception {
-//        channel.queueDeclare();
+//    public void buildScenePreHandler(Channel channel, Message message) throws Exception {
+//        Object correlation = message.getMessageProperties().getHeader("spring_returned_message_correlation");
+//        String correlationId = (String) correlation;
 //        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
-//        log.info("开始消费消息-" + msg + "-" + Thread.currentThread().getId());
-//        Thread.sleep(5000L);
+//        log.info("场景计算资源准备开始,队列名:{},id:{},消息体:{}", queueModelingPre, correlationId, msg);
+//        BuildSceneCallMessage buildSceneMessage = JSONObject.parseObject(msg, BuildSceneCallMessage.class);
+//        Thread.sleep(2000L);
+//        buildScenePreService.buildScenePre(buildSceneMessage);
 //        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
-//        log.info("结束消息-" + Thread.currentThread().getId());
 //    }
-
-
-    /**
-     * 场景计算前置资源准备处理
-     * @param channel
-     * @param message
-     * @throws Exception
-     */
-    @RabbitListener(
-        queuesToDeclare = @Queue("${queue.modeling.modeling-pre}"),
-        concurrency = "${maxThread.modeling.modeling-pre}"
-    )
-    public void buildScenePreHandler(Channel channel, Message message) throws Exception {
-        Object correlation = message.getMessageProperties().getHeader("spring_returned_message_correlation");
-        String correlationId = (String) correlation;
-        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
-        log.info("场景计算资源准备开始,队列名:{},id:{},消息体:{}", queueModelingPre, correlationId, msg);
-        BuildSceneCallMessage buildSceneMessage = JSONObject.parseObject(msg, BuildSceneCallMessage.class);
-        Thread.sleep(2000L);
-        buildScenePreService.buildScenePre(buildSceneMessage);
-        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
-    }
-
-    /**
-     * 场景计算后置结果处理
-     * @param channel
-     * @param message
-     * @throws Exception
-     */
-    @RabbitListener(
-        queuesToDeclare = @Queue("${queue.modeling.modeling-post}"),
-        concurrency = "${maxThread.modeling.modeling-post}"
-    )
-    public void buildScenePostHandler(Channel channel, Message message) throws Exception {
-        Object correlation = message.getMessageProperties().getHeader("spring_returned_message_correlation");
-        String correlationId = (String) correlation;
-        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
-        log.info("场景计算结果处理开始,队列名:{},id:{},消息体:{}", queueModelingPost, correlationId, msg);
-        BuildSceneResultMqMessage resultMessage = JSONObject.parseObject(msg, BuildSceneResultMqMessage.class);
-        Thread.sleep(2000L);
-        buildScenePostService.buildScenePost(resultMessage);
-        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
-    }
-
-    /**
-     * 场景计算发送钉钉消息
-     * @param channel
-     * @param message
-     * @throws Exception
-     */
-    @RabbitListener(
-        queuesToDeclare = @Queue("${queue.modeling.modeling-dt}"),
-        concurrency = "${maxThread.modeling.modeling-dt}"
-    )
-    public void buildSceneDTHandler(Channel channel, Message message) throws Exception {
-        Object correlation = message.getMessageProperties().getHeader("spring_returned_message_correlation");
-        String correlationId = (String) correlation;
-        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
-        log.info("发送钉钉消息处理,队列名:{},id:{},消息体:{}", queueModelingDt, correlationId, msg);
-        BuildSceneFailDTMqMessage dtMessage = JSONObject.parseObject(msg, BuildSceneFailDTMqMessage.class);
-        buildSceneDTService.handFail(dtMessage.getReason(), dtMessage.getServerPath(),
-            dtMessage.getNum(), dtMessage.getHostName(), BuildSceneDTServiceImpl.contentExt);
-        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
-    }
-
-
-}
+//
+//    /**
+//     * 场景计算后置结果处理
+//     * @param channel
+//     * @param message
+//     * @throws Exception
+//     */
+//    @RabbitListener(
+//        queuesToDeclare = @Queue("${queue.modeling.modeling-post}"),
+//        concurrency = "${maxThread.modeling.modeling-post}"
+//    )
+//    public void buildScenePostHandler(Channel channel, Message message) throws Exception {
+//        Object correlation = message.getMessageProperties().getHeader("spring_returned_message_correlation");
+//        String correlationId = (String) correlation;
+//        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+//        log.info("场景计算结果处理开始,队列名:{},id:{},消息体:{}", queueModelingPost, correlationId, msg);
+//        BuildSceneResultMqMessage resultMessage = JSONObject.parseObject(msg, BuildSceneResultMqMessage.class);
+//        Thread.sleep(2000L);
+//        buildScenePostService.buildScenePost(resultMessage);
+//        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+//    }
+//
+//    /**
+//     * 场景计算发送钉钉消息
+//     * @param channel
+//     * @param message
+//     * @throws Exception
+//     */
+//    @RabbitListener(
+//        queuesToDeclare = @Queue("${queue.modeling.modeling-dt}"),
+//        concurrency = "${maxThread.modeling.modeling-dt}"
+//    )
+//    public void buildSceneDTHandler(Channel channel, Message message) throws Exception {
+//        Object correlation = message.getMessageProperties().getHeader("spring_returned_message_correlation");
+//        String correlationId = (String) correlation;
+//        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+//        log.info("发送钉钉消息处理,队列名:{},id:{},消息体:{}", queueModelingDt, correlationId, msg);
+//        BuildSceneFailDTMqMessage dtMessage = JSONObject.parseObject(msg, BuildSceneFailDTMqMessage.class);
+//        buildSceneDTService.handFail(dtMessage.getReason(), dtMessage.getServerPath(),
+//            dtMessage.getNum(), dtMessage.getHostName(), BuildSceneDTServiceImpl.contentExt);
+//        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+//    }
+//
+//
+//}

+ 4 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/ISceneEditInfoService.java

@@ -72,6 +72,10 @@ public interface ISceneEditInfoService extends IService<SceneEditInfo> {
 
     ResultData saveLinkPan(SaveLinkPanParamVO param) throws Exception;
 
+    ResultData listLinkPan(String num) throws Exception;
+
+    ResultData deleteLinkPan(DeleteLinkPanParamVO param) throws Exception;
+
 
 
 

+ 148 - 2
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java

@@ -25,6 +25,7 @@ import com.fdkankan.common.util.CreateObjUtil;
 import com.fdkankan.common.util.FileMd5Util;
 import com.fdkankan.common.util.FileUtil;
 import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.common.util.OkHttpUtils;
 import com.fdkankan.common.util.SceneUtil;
 import com.fdkankan.fyun.constant.StorageType;
 import com.fdkankan.fyun.oss.UploadToOssUtil;
@@ -38,6 +39,7 @@ import com.fdkankan.redis.util.RedisLockUtil;
 import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.scene.api.dto.SceneInfoDTO;
 import com.fdkankan.scene.bean.BoxPhotoBean;
+import com.fdkankan.scene.bean.IconBean;
 import com.fdkankan.scene.bean.RequestSceneProV4;
 import com.fdkankan.scene.bean.SceneJsonBean;
 import com.fdkankan.scene.bean.TagBean;
@@ -67,6 +69,7 @@ import com.fdkankan.scene.service.ISceneProService;
 import com.fdkankan.scene.service.ISceneUploadService;
 import com.fdkankan.scene.vo.*;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import com.google.errorprone.annotations.Var;
 import java.io.File;
 import java.nio.charset.Charset;
@@ -1828,12 +1831,155 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         //场景关联数据备份到本地
         this.writeLinkScene(num);
 
-        //更新场景版本
-        this.upgradeVersionById();
+        //更新场景关联标识、升级版本
+        this.setLinkScenesAndUpgradeVersion(scenePlus.getId(), num);
 
         return ResultData.ok();
     }
 
+    @Override
+    public ResultData deleteLinkPan(DeleteLinkPanParamVO param) throws Exception {
+
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
+        if (scenePlus == null)
+            return ResultData.error(ErrorCode.FAILURE_CODE_5005);
+
+        List<String> deleteSidList = param.getSidList();
+
+        //处理删除状态数据
+        this.deletelinkPanData(param.getNum(), deleteSidList);
+
+        //写入本地文件,作为备份
+        this.writeLinkScene(param.getNum());
+
+        //更新场景关联标识、升级版本号
+        this.setLinkScenesAndUpgradeVersion(scenePlus.getId(), param.getNum());
+
+        return ResultData.ok();
+    }
+
+    private void deletelinkPanData(String num, List<String> deleteSidList) throws Exception {
+
+        if(CollUtil.isEmpty(deleteSidList)){
+            return;
+        }
+
+        this.syncLinPanFromFileToRedis(num);
+
+        //从redis中加载热点数据
+        String key = String.format(RedisKey.SCENE_LINKPAN_DATA, num);
+        List<String> deletDataList = redisUtil.hMultiGet(key, deleteSidList);
+        if(CollUtil.isEmpty(deletDataList))
+            return;
+
+        //从redis中移除热点数据
+        redisUtil.hdel(key, deleteSidList.toArray());
+
+        //删除oss文件
+        String imgEditPath = String.format(UploadFilePath.IMG_EDIT_PATH, num);
+        deleteSidList.stream().forEach(sid->{
+            uploadToOssUtil.deleteFile(imgEditPath + "panorama_edit/" + sid);
+        });
+
+    }
+
+    @Override
+    public ResultData listLinkPan(String num) throws Exception {
+
+        this.syncLinPanFromFileToRedis(num);
+
+        this.syncLinkPanStylesFromFileToRedis(num);
+
+        JSONObject result = new JSONObject();
+
+        //查询场景关联数据
+        String key = String.format(RedisKey.SCENE_LINKPAN_DATA, num);
+        Map<String, String> allTagsMap = redisUtil.hmget(key);
+        List<JSONObject> tags = Lists.newArrayList();
+        List<TagBean> tagBeanList = new ArrayList<>();
+        if(CollUtil.isNotEmpty(allTagsMap)){
+            allTagsMap.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());
+        }
+        result.put("tags", tags);
+
+        //查询缓存是否包含icons
+        key = String.format(RedisKey.SCENE_LINKPAN_STYLES, num);
+        Set<String> styles = redisUtil.sGet(key);
+        if(CollUtil.isEmpty(styles)){
+            styles = Sets.newHashSet();
+        }
+//        List<String> styleList = this.sortStyles(tags, styles);
+        result.put("styles", styles);
+
+        return ResultData.ok(result);
+    }
+
+    private List<String> sortStyles(List<JSONObject> tags, Set<String> styles){
+
+        //统计使用频次
+        List<IconBean> iconBeans = Lists.newArrayList();
+        for (String icon : styles) {
+            int count = 0;
+            for (JSONObject tag : tags) {
+                String sid = tag.getString("icon");
+                if(StrUtil.isEmpty(sid) || !icon.equals(sid)){
+                    continue;
+                }
+                ++count;
+            }
+            iconBeans.add(IconBean.builder().icon(icon).count(count).build());
+        }
+
+        //排序
+        List<String> iconList = iconBeans.stream().sorted(Comparator.comparing(IconBean::getCount).reversed())
+            .map(item -> {
+                return item.getIcon();
+            }).collect(Collectors.toList());
+
+        return iconList;
+    }
+
+    private void setLinkScenesAndUpgradeVersion(Long scenePlusId, String num){
+
+        SceneEditInfo sceneEditInfo = this.getByScenePlusId(scenePlusId);
+
+        //查询缓存是否有场景关联数据
+        String key = String.format(RedisKey.SCENE_LINKPAN_DATA, num);
+        Map<String, String> allTagsMap = redisUtil.hmget(key);
+        boolean hashTags = false;
+        for (Entry<String, String> tagMap : allTagsMap.entrySet()) {
+            if(StrUtil.isEmpty(tagMap.getValue())){
+                continue;
+            }
+            hashTags = true;
+            break;
+        }
+
+        //更新linkscenes字段
+        sceneEditInfoExtService.update(
+            new LambdaUpdateWrapper<SceneEditInfoExt>()
+                .set(SceneEditInfoExt::getLinkScenes, hashTags ? CommonStatus.YES.code() : CommonStatus.NO.code())
+                .eq(SceneEditInfoExt::getEditInfoId, sceneEditInfo.getId()));
+
+        //更新场景版本
+        this.upgradeVersionById(sceneEditInfo.getId());
+    }
+
     /**
      * <p>
      热点数据保存

+ 27 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/vo/DeleteLinkPanParamVO.java

@@ -0,0 +1,27 @@
+package com.fdkankan.scene.vo;
+
+import java.util.List;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * <p>
+ * 删除场景关联数据参数类
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/2/8
+ **/
+@Data
+public class DeleteLinkPanParamVO {
+
+    @NotBlank(message = "场景码不能为空")
+    private String num;
+
+    @NotNull(message = "sid不能为空")
+    private List<String> sidList;
+
+
+
+}

+ 1 - 1
4dkankan-center-scene/src/main/resources/bootstrap-test.yml

@@ -33,7 +33,7 @@ spring:
             refresh: true
       discovery:
         server-addr: 120.24.144.164:8848
-        namespace: 4dkankan-test
+        namespace: 4dkankan-dev
     sentinel:
       transport:
         dashboard: 120.24.144.164:8888