Selaa lähdekoodia

铁塔场景数据推送

dsx 2 vuotta sitten
commit
aab761a6f3
23 muutettua tiedostoa jossa 1280 lisäystä ja 0 poistoa
  1. 35 0
      .gitignore
  2. 120 0
      pom.xml
  3. 21 0
      src/main/java/com/fdkankan/extend/ExtendApplication.java
  4. 24 0
      src/main/java/com/fdkankan/extend/controller/TowerController.java
  5. 148 0
      src/main/java/com/fdkankan/extend/entity/CameraDetail.java
  6. 110 0
      src/main/java/com/fdkankan/extend/entity/Company.java
  7. 120 0
      src/main/java/com/fdkankan/extend/entity/ScenePlus.java
  8. 74 0
      src/main/java/com/fdkankan/extend/listener/RabbitMqListener.java
  9. 17 0
      src/main/java/com/fdkankan/extend/mapper/ICameraDetailMapper.java
  10. 18 0
      src/main/java/com/fdkankan/extend/mapper/ICompanyMapper.java
  11. 18 0
      src/main/java/com/fdkankan/extend/mapper/IScenePlusMapper.java
  12. 22 0
      src/main/java/com/fdkankan/extend/service/ICameraDetailService.java
  13. 16 0
      src/main/java/com/fdkankan/extend/service/ICompanyService.java
  14. 22 0
      src/main/java/com/fdkankan/extend/service/IScenePlusService.java
  15. 13 0
      src/main/java/com/fdkankan/extend/service/ITowerService.java
  16. 27 0
      src/main/java/com/fdkankan/extend/service/impl/CameraDetailServiceImpl.java
  17. 21 0
      src/main/java/com/fdkankan/extend/service/impl/CompanyServiceImpl.java
  18. 31 0
      src/main/java/com/fdkankan/extend/service/impl/ScenePlusServiceImpl.java
  19. 140 0
      src/main/java/com/fdkankan/extend/service/impl/TowerServiceImpl.java
  20. 29 0
      src/main/resources/bootstrap-pro.yml
  21. 40 0
      src/main/resources/bootstrap-test.yml
  22. 3 0
      src/main/resources/bootstrap.yml
  23. 211 0
      src/main/resources/logback-spring.xml

+ 35 - 0
.gitignore

@@ -0,0 +1,35 @@
+# Created by .ignore support plugin (hsz.mobi)
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+### Example user template template
+### Example user template
+
+# IntelliJ project files
+.idea
+*.iml
+out
+gen
+/**/target/

+ 120 - 0
pom.xml

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>2.3.12.RELEASE</version>
+    <relativePath/>
+  </parent>
+
+  <version>1.0.0-SNAPSHOT</version>
+  <artifactId>4dkankan-center-modeling-extend</artifactId>
+
+
+  <dependencies>
+
+    <dependency>
+      <groupId>com.fdkankan</groupId>
+      <artifactId>4dkankan-common-web</artifactId>
+      <version>3.0.0-SNAPSHOT</version>
+      <exclusions>
+        <exclusion>
+          <groupId>org.bytedeco</groupId>
+          <artifactId>javacv</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.bytedeco</groupId>
+          <artifactId>javacpp</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.bytedeco</groupId>
+          <artifactId>javacv-platform</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>joinery</groupId>
+          <artifactId>jave</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.aliyun</groupId>
+          <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.aliyun</groupId>
+          <artifactId>aliyun-java-sdk-core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
+    <dependency>
+      <groupId>com.alibaba.cloud</groupId>
+      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+      <version>2.2.7.RELEASE</version>
+    </dependency>
+
+
+    <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config -->
+    <dependency>
+      <groupId>com.alibaba.cloud</groupId>
+      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+      <version>2.2.7.RELEASE</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fdkankan</groupId>
+      <artifactId>4dkankan-utils-rabbitmq</artifactId>
+      <version>3.0.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fdkankan</groupId>
+      <artifactId>4dkankan-utils-fyun-oss</artifactId>
+      <version>3.0.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fdkankan</groupId>
+      <artifactId>4dkankan-utils-model</artifactId>
+      <version>3.0.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fdkankan</groupId>
+      <artifactId>4dkankan-utils-redis</artifactId>
+      <version>3.0.0-SNAPSHOT</version>
+    </dependency>
+
+
+    <dependency>
+      <groupId>com.yomahub</groupId>
+      <artifactId>tlog-web-spring-boot-starter</artifactId>
+      <version>1.3.6</version>
+    </dependency>
+
+  </dependencies>
+  <build>
+    <finalName>${artifactId}</finalName>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+        <version>2.3.12.RELEASE</version>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <testFailureIgnore>true</testFailureIgnore>
+        </configuration>
+      </plugin>
+    </plugins>
+
+  </build>
+
+
+</project>

+ 21 - 0
src/main/java/com/fdkankan/extend/ExtendApplication.java

@@ -0,0 +1,21 @@
+package com.fdkankan.extend;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.ComponentScan;
+
+
+@SpringBootApplication
+@EnableDiscoveryClient
+@ComponentScan(basePackages = {"com.fdkankan.*"})
+public class ExtendApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(ExtendApplication.class, args);
+	}
+}
+
+
+
+

+ 24 - 0
src/main/java/com/fdkankan/extend/controller/TowerController.java

@@ -0,0 +1,24 @@
+package com.fdkankan.extend.controller;
+
+import com.fdkankan.extend.service.ITowerService;
+import com.fdkankan.web.response.ResultData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/china/tower")
+public class TowerController {
+
+    @Autowired
+    private ITowerService towerService;
+
+    @GetMapping("/packSceneData")
+    public ResultData packSceneData(Long companyId, List<String> nums){
+        return ResultData.ok(towerService.packSceneDataHandler("KK-R4YYV4yIZlT"));
+    }
+
+}

+ 148 - 0
src/main/java/com/fdkankan/extend/entity/CameraDetail.java

@@ -0,0 +1,148 @@
+package com.fdkankan.extend.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * <p>
+ * 相机子表
+ * </p>
+ *
+ * @author
+ * @since 2022-07-18
+ */
+@Getter
+@Setter
+@TableName("t_camera_detail")
+public class CameraDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 余额
+     */
+    @TableField("balance")
+    private String balance;
+
+    /**
+     * 用户表t_user的id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 0表示客户,1表示员工,2表示赠送,3表示其他,4经销商销售
+     */
+    @TableField("own")
+    private Integer own;
+
+    /**
+     * 订单号
+     */
+    @TableField("order_sn")
+    private String orderSn;
+
+    /**
+     * 0表示本国,1表示国外
+     */
+    @TableField("country")
+    private Integer country;
+
+    /**
+     * 经销商
+     */
+    @TableField("agency")
+    private String agency;
+
+    /**
+     * 相机类型,0表示双目,1四维看看pro,2 四维看看lite,9 双目转台,10 激光转台
+     */
+    @TableField("type")
+    private Integer type;
+
+    /**
+     * 总容量
+     */
+    @TableField("total_space")
+    private Long totalSpace;
+
+    /**
+     * 已使用容量
+     */
+    @TableField("used_space")
+    private Long usedSpace;
+
+    /**
+     * 相机主表t_camera的id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 商品表t_goods的id
+     */
+    @TableField("goods_id")
+    private Long goodsId;
+
+    /**
+     * 企业表t_company的id
+     */
+    @TableField("company_id")
+    private Long companyId;
+
+    /**
+     * 代理商架构管理t_agent_framework的id
+     */
+    @TableField("agent_framework_id")
+    private Long agentFrameworkId;
+
+    /**
+     * 相机协作用户id
+     */
+    @TableField("cooperation_user")
+    private Long cooperationUser;
+
+    /**
+     * 设备地址(追溯管理后台)
+     */
+    @TableField("address")
+    private String address;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic("A")
+    private String recStatus;
+
+    @TableField("user_camera_version")
+    private String userCameraVersion;
+
+    @TableField("app_version")
+    private String appVersion;
+
+    @TableField("last_request_time")
+    private Date lastRequestTime;
+
+
+}

+ 110 - 0
src/main/java/com/fdkankan/extend/entity/Company.java

@@ -0,0 +1,110 @@
+package com.fdkankan.extend.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 客户企业logo信息
+ * </p>
+ *
+ * @author 
+ * @since 2021-12-24
+ */
+@Getter
+@Setter
+@ToString
+@TableName("t_company")
+public class Company implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 公司名称
+     */
+    @TableField("company_name")
+    private String companyName;
+
+    /**
+     * 顶部logo
+     */
+    @TableField("top_logo")
+    private String topLogo;
+
+    /**
+     * 地面logo
+     */
+    @TableField("floor_logo")
+    private String floorLogo;
+
+    /**
+     * 地面点位logo
+     */
+    @TableField("marker_logo")
+    private String markerLogo;
+
+    /**
+     * 二维码logo
+     */
+    @TableField("qr_logo")
+    private String qrLogo;
+
+    /**
+     * 是否显示初始logo,0隐藏,1显示
+     */
+    @TableField("show_logo")
+    private Integer showLogo;
+
+    /**
+     * 新增的相机是否注册,0否,1删
+     */
+    @TableField("camera_delete")
+    private Integer cameraDelete;
+
+    /**
+     * 数据同步类型
+     */
+    @TableField("data_sync")
+    private String dataSync;
+
+//    /**
+//     * 数据同步方式
+//     */
+//    @TableField("data_sync_action")
+//    private Integer dataSyncAction;
+
+    @TableField("calculate_flexibility")
+    private Boolean calculateFlexibility;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+
+    @TableField("scene_version")
+    private String sceneVersion;
+
+    /**
+     * A正常,I删除
+     */
+    @TableField("rec_status")
+    @TableLogic("A")
+    private String recStatus;
+
+}

+ 120 - 0
src/main/java/com/fdkankan/extend/entity/ScenePlus.java

@@ -0,0 +1,120 @@
+package com.fdkankan.extend.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 场景主表
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-16
+ */
+@Getter
+@Setter
+@TableName("t_scene_plus")
+public class ScenePlus implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 用户id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 相机id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 手机id
+     */
+    @TableField("phone_id")
+    private String phoneId;
+
+    /**
+     * 场景名称
+     */
+    @TableField("title")
+    private String title;
+
+    /**
+     * 场景描述
+     */
+    @TableField("description")
+    private String description;
+
+    /**
+     * 场景状态:0-未建好,1--已建好,-1-计算出错,-2--不在官网显示
+     */
+    @TableField("scene_status")
+    private Integer sceneStatus;
+
+    /**
+     * 场景来源:相机拍摄10以内表示,1表示八目,2双目,3转台,4 激光  其他来源10以上,11:一键换装,12:123看房,13文通虚拟场景
+     */
+    @TableField("scene_source")
+    private Integer sceneSource;
+
+    /**
+     * 支付状态:0表示未付款,1表示付款了,-1表示欠费,-2表示容量不足
+     */
+    @TableField("pay_status")
+    private Integer payStatus;
+
+    /**
+     * 场景类型  0-其他,1-文博,2-地产,3-电商,4-餐饮,5-家居,99-一件换装虚拟房源
+     */
+    @TableField("scene_type")
+    private Integer sceneType;
+
+    /**
+     * 是否推荐:0-否,1-是
+     */
+    @TableField("recommend")
+    private Integer recommend;
+
+    /**
+     * 是否有housetype文件(0-否,1-是)
+     */
+    @TableField("house_type")
+    private Integer houseType;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * A正常,I删除
+     */
+    @TableField("rec_status")
+    @TableLogic("A")
+    private String recStatus;
+
+
+}

+ 74 - 0
src/main/java/com/fdkankan/extend/listener/RabbitMqListener.java

@@ -0,0 +1,74 @@
+package com.fdkankan.extend.listener;
+
+import cn.hutool.core.exceptions.ExceptionUtil;
+import com.alibaba.fastjson.JSON;
+import com.fdkankan.common.constant.CommonSuccessStatus;
+import com.fdkankan.extend.service.ITowerService;
+import com.fdkankan.redis.util.RedisUtil;
+import com.rabbitmq.client.Channel;
+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;
+
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/19
+ **/
+@Slf4j
+@Component
+public class RabbitMqListener {
+
+    @Value("${queue.modeling.extend.tower.data-push}")
+    private String queueName;
+    @Autowired
+    private ITowerService towerService;
+    @Autowired
+    private RedisUtil redisUtil;
+
+    /**
+     * 铁塔项目数据推送监听器
+     * @param channel
+     * @param message
+     * @throws Exception
+     */
+    @RabbitListener(
+        queuesToDeclare = @Queue("${queue.modeling.extend.tower.data-push}")
+    )
+    public void transferTourVideo(Channel channel, Message message) throws Exception {
+        String key = "tower:scene:data:download";
+        String messageId = message.getMessageProperties().getMessageId();
+        String num = new String(message.getBody(), StandardCharsets.UTF_8);
+        log.info("开始消费消息,id:{},queue:{},content:{}", messageId, queueName, num);
+        Map<String, Object> map = new HashMap<>();
+        try {
+            String zipPath = towerService.packSceneDataHandler(num);
+            // TODO: 2023/6/20 推送到铁塔
+
+            map.put("status", CommonSuccessStatus.SUCCESS.code());
+            map.put("zipPath", zipPath);
+            redisUtil.hset(key, num, JSON.toJSONString(map));
+        }catch (Exception e){
+            map.put("status", CommonSuccessStatus.FAIL.code());
+            map.put("error", ExceptionUtil.stacktraceToString(e, 3000));
+            redisUtil.hset(key, num, JSON.toJSONString(map));
+        }
+
+        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+        log.info("结束消费消息,id:{}", messageId);
+    }
+
+
+
+}

+ 17 - 0
src/main/java/com/fdkankan/extend/mapper/ICameraDetailMapper.java

@@ -0,0 +1,17 @@
+package com.fdkankan.extend.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.extend.entity.CameraDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 相机子表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2021-12-24
+ */
+@Mapper
+public interface ICameraDetailMapper extends BaseMapper<CameraDetail> {
+}

+ 18 - 0
src/main/java/com/fdkankan/extend/mapper/ICompanyMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.extend.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.extend.entity.Company;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 客户企业logo信息 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2021-12-24
+ */
+@Mapper
+public interface ICompanyMapper extends BaseMapper<Company> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/extend/mapper/IScenePlusMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.extend.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.extend.entity.ScenePlus;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景主表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-16
+ */
+@Mapper
+public interface IScenePlusMapper extends BaseMapper<ScenePlus> {
+
+}

+ 22 - 0
src/main/java/com/fdkankan/extend/service/ICameraDetailService.java

@@ -0,0 +1,22 @@
+package com.fdkankan.extend.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.extend.entity.CameraDetail;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 相机子表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2021-12-24
+ */
+public interface ICameraDetailService extends IService<CameraDetail> {
+
+    List<CameraDetail> getByCompanyId(Long compayId);
+
+
+
+}

+ 16 - 0
src/main/java/com/fdkankan/extend/service/ICompanyService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.extend.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.extend.entity.Company;
+
+/**
+ * <p>
+ * 客户企业logo信息 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2021-12-24
+ */
+public interface ICompanyService extends IService<Company> {
+
+}

+ 22 - 0
src/main/java/com/fdkankan/extend/service/IScenePlusService.java

@@ -0,0 +1,22 @@
+package com.fdkankan.extend.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.extend.entity.ScenePlus;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <p>
+ * 场景主表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-16
+ */
+public interface IScenePlusService extends IService<ScenePlus> {
+
+    List<ScenePlus> getByCameraIds(Set<Long> cameraIds);
+
+
+}

+ 13 - 0
src/main/java/com/fdkankan/extend/service/ITowerService.java

@@ -0,0 +1,13 @@
+package com.fdkankan.extend.service;
+
+import com.fdkankan.web.response.ResultData;
+
+import java.util.List;
+
+public interface ITowerService {
+
+    public String packSceneDataHandler(String num);
+
+    public void packSceneData(Long companyId, List<String> nums);
+
+}

+ 27 - 0
src/main/java/com/fdkankan/extend/service/impl/CameraDetailServiceImpl.java

@@ -0,0 +1,27 @@
+package com.fdkankan.extend.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.extend.entity.CameraDetail;
+import com.fdkankan.extend.mapper.ICameraDetailMapper;
+import com.fdkankan.extend.service.ICameraDetailService;
+import javafx.scene.Camera;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 相机子表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2021-12-24
+ */
+@Service
+public class CameraDetailServiceImpl extends ServiceImpl<ICameraDetailMapper, CameraDetail> implements ICameraDetailService {
+    @Override
+    public List<CameraDetail> getByCompanyId(Long compayId) {
+        return this.list(new LambdaQueryWrapper<CameraDetail>().eq(CameraDetail::getCompanyId, compayId));
+    }
+}

+ 21 - 0
src/main/java/com/fdkankan/extend/service/impl/CompanyServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fdkankan.extend.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.extend.entity.Company;
+import com.fdkankan.extend.mapper.ICompanyMapper;
+import com.fdkankan.extend.service.ICompanyService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 客户企业logo信息 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2021-12-24
+ */
+@Service
+public class CompanyServiceImpl extends ServiceImpl<ICompanyMapper, Company> implements ICompanyService {
+
+
+}

+ 31 - 0
src/main/java/com/fdkankan/extend/service/impl/ScenePlusServiceImpl.java

@@ -0,0 +1,31 @@
+package com.fdkankan.extend.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.extend.entity.ScenePlus;
+import com.fdkankan.extend.mapper.IScenePlusMapper;
+import com.fdkankan.extend.service.IScenePlusService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <p>
+ * 场景主表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-16
+ */
+@Slf4j
+@Service
+public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
+
+
+    @Override
+    public List<ScenePlus> getByCameraIds(Set<Long> cameraIds) {
+        return this.list(new LambdaQueryWrapper<ScenePlus>().in(ScenePlus::getCameraId, cameraIds));
+    }
+}

+ 140 - 0
src/main/java/com/fdkankan/extend/service/impl/TowerServiceImpl.java

@@ -0,0 +1,140 @@
+package com.fdkankan.extend.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.ZipUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.common.constant.CommonSuccessStatus;
+import com.fdkankan.extend.entity.CameraDetail;
+import com.fdkankan.extend.entity.ScenePlus;
+import com.fdkankan.extend.service.ICameraDetailService;
+import com.fdkankan.extend.service.IScenePlusService;
+import com.fdkankan.extend.service.ITowerService;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.web.response.ResultData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fdkankan.model.constants.UploadFilePath;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class TowerServiceImpl implements ITowerService {
+
+    private static String parentPath = "/home/backend/4dkankan_v4/modeling-extend/download/";
+
+    @Autowired
+    private FYunFileServiceInterface fYunFileService;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private ICameraDetailService cameraDetailService;
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private ITowerService towerService;
+
+    @Override
+    public String packSceneDataHandler(String num) {
+
+        log.info("开始下载:{}", num);
+
+        //场景本地数据父目录
+        String sceneSourcePath = parentPath + num + "/";
+        String zipPath = parentPath + num + ".zip";
+
+        //data数据下载
+        String dataPath = sceneSourcePath + "data/";
+        String ossDataPath = String.format(UploadFilePath.DATA_VIEW_PATH, num);
+        //下载floorplan.json
+        fYunFileService.downloadFile(ossDataPath.concat("floorplan.json"), dataPath.concat("floorplan.json"));
+        //下载scene.json
+        String sceneJsonPath = dataPath.concat("scene.json");
+        String sceneJson = redisUtil.get(String.format(RedisKey.SCENE_JSON, num));
+        if(StrUtil.isNotEmpty(sceneJson)){
+            FileUtil.writeUtf8String(sceneJson, sceneJsonPath);
+        }else{
+            fYunFileService.downloadFile(ossDataPath.concat("scene.json"), sceneJsonPath);
+        }
+        //下载mesh
+        fYunFileService.downloadFileByCommand(dataPath, ossDataPath.concat("mesh"));
+
+        //images数据下载
+        String imagesPath = sceneSourcePath + "images/";
+        String ossImagesPath = String.format(UploadFilePath.IMG_VIEW_PATH, num);
+        //下载high图
+        fYunFileService.downloadFileByCommand(imagesPath.concat("4k/"), ossImagesPath.concat("pan/high/"));
+        //下载low图
+        fYunFileService.downloadFileByCommand(imagesPath.concat("512/"), ossImagesPath.concat("pan/low/"));
+        //下载vision.txt
+        fYunFileService.downloadFile(ossImagesPath.concat("vision.txt"), imagesPath.concat("vision.txt"));
+
+        //打包
+        ZipUtil.zip(sceneSourcePath, zipPath);
+
+        log.info("结束下载:{}", num);
+
+        return zipPath;
+    }
+
+    @Override
+    public void packSceneData(Long companyId, List<String> nums) {
+
+        String key = "tower:scene:data:download";
+
+        List<ScenePlus> scenePlusList = null;
+        if(Objects.nonNull(companyId)){
+            //根据客户企业id查出所有相机
+            List<CameraDetail> cameraDetailList = cameraDetailService.getByCompanyId(companyId);
+            if(CollUtil.isEmpty(cameraDetailList)){
+                return;
+            }
+            Set<Long> cameraIds = cameraDetailList.stream().map(detail -> detail.getCameraId()).collect(Collectors.toSet());
+
+            //根据相机id查出所有待下载场景
+            scenePlusList = scenePlusService.getByCameraIds(cameraIds);
+        }else if(CollUtil.isNotEmpty(nums)){
+            scenePlusList = scenePlusService.list(new LambdaQueryWrapper<ScenePlus>().in(ScenePlus::getNum, nums));
+        }
+        if(CollUtil.isEmpty(scenePlusList)){
+            return;
+        }
+
+        //遍历场景列表开始下载
+        scenePlusList.stream().forEach(plus -> {
+            JSONObject jsonObject = null;
+            String str = redisUtil.hget(key, plus.getNum());
+            if(StrUtil.isNotEmpty(str)){
+                jsonObject = JSON.parseObject(str);
+            }
+            if(Objects.isNull(jsonObject) || jsonObject.getInteger("status") == CommonSuccessStatus.FAIL.code()){
+                try {
+                    jsonObject = new JSONObject();
+                    jsonObject.put("num", plus.getNum());
+                    String zipPath = towerService.packSceneDataHandler(plus.getNum());
+
+                    // TODO: 2023/6/20 推送到铁塔
+
+                    jsonObject.put("status", CommonSuccessStatus.SUCCESS.code());
+                    jsonObject.put("zipPath", zipPath);
+                    redisUtil.hset(key, plus.getNum(), JSON.toJSONString(jsonObject));
+                }catch (Exception e){
+                    jsonObject.put("status", CommonSuccessStatus.FAIL.code());
+                    jsonObject.put("error", ExceptionUtil.stacktraceToString(e, 3000));
+                    redisUtil.hset(key, plus.getNum(), JSON.toJSONString(jsonObject));
+                }
+            }
+        });
+    }
+}

+ 29 - 0
src/main/resources/bootstrap-pro.yml

@@ -0,0 +1,29 @@
+spring:
+  application:
+    name: 4dkankan-tracking
+  cloud:
+    nacos:
+      config:
+        server-addr: 192.168.0.47:8848
+        file-extension: yaml
+        namespace: 4dkankan-pro
+        extension-configs:
+          - data-id: 4dkankan-tracking.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+      discovery:
+        server-addr: 192.168.0.47:8848
+        namespace: 4dkankan-dev
+        metadata:
+          management:
+            context-path: ${server.servlet.context-path}/actuator
+
+management:
+  endpoints:
+    web:
+      exposure:
+        include: '*'
+  endpoint:
+    health:
+      show-details: ALWAYS

+ 40 - 0
src/main/resources/bootstrap-test.yml

@@ -0,0 +1,40 @@
+spring:
+  application:
+    name: 4dkankan-center-modeling-extend
+  cloud:
+    nacos:
+      server-addr: 120.24.144.164:8848
+      namespace: 4dkankan-v4-test
+      config:
+        file-extension: yaml
+        namespace: ${spring.cloud.nacos.namespace}
+        shared-configs:
+#          - data-id: common-db-config.yaml
+#            group: DEFAULT_GROUP
+#            refresh: true
+#
+          - data-id: common-redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-rabbitmq-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-fyun-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+      discovery:
+        namespace: ${spring.cloud.nacos.namespace}
+#        namespace: public
+
+
+
+
+
+

+ 3 - 0
src/main/resources/bootstrap.yml

@@ -0,0 +1,3 @@
+spring:
+  profiles:
+    active: test

+ 211 - 0
src/main/resources/logback-spring.xml

@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
+<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
+<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
+<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
+<configuration scan="true" scanPeriod="10 seconds">
+	<springProperty scope="context" name="LOG_PATH" source="logging.path"/>
+	<contextName>logback</contextName>
+	<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
+	<property name="log.path" value="${LOG_PATH}/modeling-extend/logs" />
+
+	<!-- 彩色日志 -->
+	<!-- 彩色日志依赖的渲染类 -->
+	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
+	<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
+	<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
+	<!-- 彩色日志格式 -->
+	<property name="CONSOLE_LOG_PATTERN"
+		value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
+
+	<!--输出到控制台 -->
+	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+		<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息 -->
+		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+			<level>info</level>
+		</filter>
+		<encoder>
+			<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+			<!-- 设置字符集 -->
+			<charset>UTF-8</charset>
+		</encoder>
+	</appender>
+	<!--输出到文件 -->
+
+	<!-- 时间滚动输出 level为 DEBUG 日志 -->
+	<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/log_debug.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%L] - %msg%n</pattern>
+			<charset>UTF-8</charset> <!-- 设置字符集 -->
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<!-- 日志归档 -->
+			<fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录debug级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>debug</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+
+	<!-- 时间滚动输出 level为 INFO 日志 -->
+	<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/log_info.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%L] - %msg%n</pattern>
+			<charset>UTF-8</charset>
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<!-- 每天日志归档路径以及格式 -->
+			<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录info级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>info</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+
+	<!-- 时间滚动输出 level为 WARN 日志 -->
+	<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/log_warn.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%L] - %msg%n</pattern>
+			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录warn级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>warn</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+
+
+	<!-- 时间滚动输出 level为 ERROR 日志 -->
+	<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/log_error.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%L] - %msg%n</pattern>
+			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录ERROR级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>ERROR</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+	<!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、 以及指定<appender>。<logger>仅有一个name属性, 一个可选的level和一个可选的addtivity属性。 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE,
+		DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别。 addtivity:是否向上级logger传递打印信息。默认是true。 -->
+	<!--<logger name="org.springframework.web" level="info"/> -->
+	<!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/> -->
+	<!-- 使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作: 第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息 第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别: -->
+	<!-- root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 不能设置为INHERITED或者同义词NULL。默认是DEBUG 可以包含零个或多个元素,标识这个appender将会添加到这个logger。 -->
+
+			<root level="info">
+				<appender-ref ref="CONSOLE" />
+				<appender-ref ref="DEBUG_FILE" />
+				<appender-ref ref="INFO_FILE" />
+				<appender-ref ref="WARN_FILE" />
+				<appender-ref ref="ERROR_FILE" />
+			</root>
+
+<!--	<springProfile name="dev">-->
+<!--		<root level="info">-->
+<!--			<appender-ref ref="CONSOLE" />-->
+<!--			<appender-ref ref="DEBUG_FILE" />-->
+<!--			<appender-ref ref="INFO_FILE" />-->
+<!--			<appender-ref ref="WARN_FILE" />-->
+<!--			<appender-ref ref="ERROR_FILE" />-->
+<!--			<appender-ref ref="ALL_FILE" />-->
+<!--		</root>-->
+<!--		&lt;!&ndash; <logger name="com.xusanduo.demo" level="debug"/>开发环境, 指定某包日志为debug级 &ndash;&gt;-->
+<!--	</springProfile>-->
+
+<!--	<springProfile name="test">-->
+<!--		<root level="info">-->
+<!--			<appender-ref ref="CONSOLE" />-->
+<!--			<appender-ref ref="DEBUG_FILE" />-->
+<!--			<appender-ref ref="INFO_FILE" />-->
+<!--			<appender-ref ref="WARN_FILE" />-->
+<!--			<appender-ref ref="ERROR_FILE" />-->
+<!--			<appender-ref ref="ALL_FILE" />-->
+<!--		</root>-->
+<!--		&lt;!&ndash; <logger name="com.xusanduo.demo" level="info"/> 测试环境, 指定某包日志为info级 &ndash;&gt;-->
+<!--	</springProfile>-->
+
+<!--	<springProfile name="pro">-->
+<!--		<root level="error">-->
+<!--			&lt;!&ndash; 生产环境最好不配置console写文件 &ndash;&gt;-->
+<!--			<appender-ref ref="CONSOLE" />-->
+<!--			<appender-ref ref="DEBUG_FILE" />-->
+<!--			<appender-ref ref="INFO_FILE" />-->
+<!--			<appender-ref ref="WARN_FILE" />-->
+<!--			<appender-ref ref="ERROR_FILE" />-->
+<!--			<appender-ref ref="ALL_FILE" />-->
+<!--		</root>-->
+<!--		&lt;!&ndash; <logger name="com.xusanduo.demo" level="warn"/> 生产环境, 指定某包日志为warn级 &ndash;&gt;-->
+<!--		&lt;!&ndash; <logger name="com.xusanduo.demo.MyApplication" level="info"/> 特定某个类打印info日志, 比如application启动成功后的提示语 &ndash;&gt;-->
+<!--	</springProfile>-->
+
+	<!--生产环境:输出到文件 -->
+	<!--<springProfile name="pro"> -->
+	<!--<root level="info"> -->
+	<!--<appender-ref ref="CONSOLE" /> -->
+	<!--<appender-ref ref="DEBUG_FILE" /> -->
+	<!--<appender-ref ref="INFO_FILE" /> -->
+	<!--<appender-ref ref="ERROR_FILE" /> -->
+	<!--<appender-ref ref="WARN_FILE" /> -->
+	<!--</root> -->
+	<!--</springProfile> -->
+
+</configuration>
+
+