Browse Source

房间管理

lyhzzz 2 years ago
parent
commit
1149b9311a
44 changed files with 1618 additions and 54 deletions
  1. 7 0
      pom.xml
  2. 7 0
      src/main/java/com/fdkankan/tk/common/FilePath.java
  3. 3 20
      src/main/java/com/fdkankan/tk/common/ResultCode.java
  4. 1 6
      src/main/java/com/fdkankan/tk/common/util/JwtUtil.java
  5. 1 0
      src/main/java/com/fdkankan/tk/common/util/RedisKeyUtil.java
  6. 215 0
      src/main/java/com/fdkankan/tk/common/util/UploadToOssUtil.java
  7. 21 0
      src/main/java/com/fdkankan/tk/controller/BaseController.java
  8. 67 11
      src/main/java/com/fdkankan/tk/controller/RoomController.java
  9. 26 0
      src/main/java/com/fdkankan/tk/controller/SceneController.java
  10. 27 0
      src/main/java/com/fdkankan/tk/controller/TestController.java
  11. 62 0
      src/main/java/com/fdkankan/tk/entity/WxConfig.java
  12. 1 1
      src/main/java/com/fdkankan/tk/generate/AutoGenerate.java
  13. 22 0
      src/main/java/com/fdkankan/tk/httpClient/address/FdkkAddressSource.java
  14. 46 0
      src/main/java/com/fdkankan/tk/httpClient/client/FdKKClient.java
  15. 29 0
      src/main/java/com/fdkankan/tk/httpClient/client/WxClient.java
  16. 11 0
      src/main/java/com/fdkankan/tk/httpClient/request/FdkkLoginRequest.java
  17. 15 0
      src/main/java/com/fdkankan/tk/httpClient/request/LaserSceneParam.java
  18. 21 0
      src/main/java/com/fdkankan/tk/httpClient/request/WxGetQrCodeParam.java
  19. 9 0
      src/main/java/com/fdkankan/tk/httpClient/response/FdkkLoginVo.java
  20. 10 0
      src/main/java/com/fdkankan/tk/httpClient/response/FdkkResponse.java
  21. 94 0
      src/main/java/com/fdkankan/tk/httpClient/response/FdkkScenePlus.java
  22. 129 0
      src/main/java/com/fdkankan/tk/httpClient/response/FdkkScenePlusExt.java
  23. 9 0
      src/main/java/com/fdkankan/tk/httpClient/response/FdkkScenePlusVo.java
  24. 25 0
      src/main/java/com/fdkankan/tk/httpClient/response/FdkkUserVo.java
  25. 18 0
      src/main/java/com/fdkankan/tk/mapper/IWxConfigMapper.java
  26. 12 0
      src/main/java/com/fdkankan/tk/request/RoomAddParam.java
  27. 9 0
      src/main/java/com/fdkankan/tk/request/RoomListParam.java
  28. 15 0
      src/main/java/com/fdkankan/tk/request/SceneParam.java
  29. 12 0
      src/main/java/com/fdkankan/tk/response/RoomVo.java
  30. 154 0
      src/main/java/com/fdkankan/tk/response/SceneProEntityVo.java
  31. 24 0
      src/main/java/com/fdkankan/tk/response/SceneVo.java
  32. 7 0
      src/main/java/com/fdkankan/tk/service/IRoomNumService.java
  33. 16 0
      src/main/java/com/fdkankan/tk/service/IRoomService.java
  34. 14 0
      src/main/java/com/fdkankan/tk/service/ISceneService.java
  35. 16 0
      src/main/java/com/fdkankan/tk/service/IWxConfigService.java
  36. 7 0
      src/main/java/com/fdkankan/tk/service/IWxService.java
  37. 36 0
      src/main/java/com/fdkankan/tk/service/impl/RoomNumServiceImpl.java
  38. 135 0
      src/main/java/com/fdkankan/tk/service/impl/RoomServiceImpl.java
  39. 118 0
      src/main/java/com/fdkankan/tk/service/impl/SceneServiceImpl.java
  40. 34 0
      src/main/java/com/fdkankan/tk/service/impl/WxConfigServiceImpl.java
  41. 126 0
      src/main/java/com/fdkankan/tk/service/impl/WxServiceImpl.java
  42. 1 15
      src/main/resources/application-local.yaml
  43. 1 1
      src/main/resources/application.yaml
  44. 5 0
      src/main/resources/mapper/tk/WxConfigMapper.xml

+ 7 - 0
pom.xml

@@ -97,6 +97,13 @@
             <version>1.18.20</version>
         </dependency>
 
+
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>2.8.3</version>
+        </dependency>
+
         <dependency>
             <groupId>io.jsonwebtoken</groupId>
             <artifactId>jjwt</artifactId>

+ 7 - 0
src/main/java/com/fdkankan/tk/common/FilePath.java

@@ -0,0 +1,7 @@
+package com.fdkankan.tk.common;
+
+public class FilePath {
+
+    public static final String LOCAL_QRCODE_PATH = "/home/images/%s.jpg";
+    public static final String OSS_QRCODE_PATH = "take-look/images/%s.jpg";
+}

+ 3 - 20
src/main/java/com/fdkankan/tk/common/ResultCode.java

@@ -4,28 +4,11 @@ public enum ResultCode {
     SUCCESS(0,"操作成功"),
     ERROR(-1,"操作失败"),
 
-    MISSING_REQUIRED_PARAMETERS(4001,"参数缺少"),
+    PARAM_MISS(4001,"参数缺少"),
+    QRCODE_MISS(4002,"获取二维码失败"),
     USER_NOT_LOGIN(4008,"用户未登录"),
 
-    UPLOAD_ERROR(7001,"文件上传失败"),
-    UPLOAD_FILE_NO_EXIST(7002,"上传文件不存在"),
-    UPLOAD_FILE_TO_LONG(7003,"文件上传过大"),
-    UPLOAD_FILE_TYPE_ERROR(7005,"文件类型错误"),
-    UPLOAD_FILE_MSG_ERROR(7006,"文件内容错误"),
-    UPLOAD_FILE_OBJ_ERROR(7007,"文件内容错误,缺少obj,或者mtl文件"),
-    SYSTEM_HOT_ICON_NOT_EXIST(7008,"系统默认icon不存在"),
-    SYSTEM_HOT_ICON_NOT_DELETE(7009,"系统默认icon不能删除"),
-    CASE_USE(7010,"当前场景已被 “%s” 使用,不可删除"),
-    FOLDER_NOT_EXIST(7011,"视频文件夹不存在"),
-    CASE_NOT_EXIST(7012,"案件不存在"),
-    MERGER_VIDEO_ERROR(7013,"合成视频失败"),
-    MODEL_NOT_EXIST(7014,"模型不存在"),
-    SCENE_NOT_EXIST(7015,"当前场景已被删除"),
-    UPLOAD_FILE_CHINA_NAME(7016,"文件名不能包含中文"),
-    UPLOAD_FILE_NAME_TO_LONG(7017,"文件名超过长度限制"),
-
-    HOT_ICON_NOT_EXIST(7004,"热点icon不存在");
-
+    ;
     public int code;
     public String msg;
 

+ 1 - 6
src/main/java/com/fdkankan/tk/common/util/JwtUtil.java

@@ -114,7 +114,7 @@ public class JwtUtil {
      *
      * @return token中包含的用户名
      */
-    public static String getUsername(String token) {
+    public static String getUserName(String token) {
         try {
             DecodedJWT jwt = JWT.decode(token);
             return jwt.getClaim("userName").asString();
@@ -136,10 +136,5 @@ public class JwtUtil {
         }
     }
 
-    public static void main(String[] args) {
-        long start = System.currentTimeMillis();
-        System.out.println(getUsername("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMzUzNjUwMTEyOCIsImxvZ2luVHlwZSI6InVzZXIiLCJ1c2VyTmFtZSI6IjEzNTM2NTAxMTI4IiwiaWF0IjoxNjU4ODI4NjA2LCJqdGkiOiI4NjczYjFiMi0xYjc4LTRmMTEtOGQ5My05OWE0OWRlMGVhMjAifQ.0oYzEwTsV1iLn_cMeiqLc5upJfcYipRbIDSndSxeuK0"));
-        System.out.println(System.currentTimeMillis() - start);
-    }
 
 }

+ 1 - 0
src/main/java/com/fdkankan/tk/common/util/RedisKeyUtil.java

@@ -2,4 +2,5 @@ package com.fdkankan.tk.common.util;
 
 public class RedisKeyUtil {
 
+    public  static  String AccessToken = "take-look:app_id:";
 }

+ 215 - 0
src/main/java/com/fdkankan/tk/common/util/UploadToOssUtil.java

@@ -0,0 +1,215 @@
+package com.fdkankan.tk.common.util;
+
+import cn.hutool.core.collection.CollUtil;
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+public class UploadToOssUtil {
+
+
+	@Value("${oss.point:http://oss-cn-shenzhen-internal.aliyuncs.com}")
+	private String point;
+
+	@Value("${oss.key:LTAIUrvuHqj8pvry}")
+	private String key;
+
+	@Value("${oss.secrey:JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4}")
+	private String secrey;
+
+	@Value("${oss.bucket:4dkankan}")
+	private String bucket;
+
+	@Value("${upload.query-path}")
+	private String query;
+
+
+	/**
+	 * 获取文件内容-阿里云
+	 * @param objectName
+	 * @return
+	 */
+	public boolean existKey(String objectName){
+		//创建oss客户端
+		if(objectName.contains(query)){
+			objectName = objectName.replace(query,"");
+		}
+		OSSClient ossClient = new OSSClient(point, key, secrey);
+		// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
+		try{
+			boolean exist = ossClient.doesObjectExist(bucket, objectName);
+			return exist;
+		}catch (Exception e){
+			log.error("s4判断是否存在key异常,key=" + objectName, e);
+		}finally {
+			if(ossClient != null){
+				ossClient.shutdown();
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * 从阿里云oss下载文件到本地
+	 * @param objectName 云端文件k地址
+	 * @param localPath 本地文件地址
+	 * @return
+	 */
+	public boolean downFormAli(String objectName, String localPath){
+		OSSClient ossClient = new OSSClient(point, key, secrey);
+		try {
+			com.aliyun.oss.model.GetObjectRequest request  = new com.aliyun.oss.model.GetObjectRequest(bucket,objectName);
+			File file = new File(localPath);
+			if(!file.getParentFile().exists()){
+				file.getParentFile().mkdirs();
+				file = new File(localPath);
+			}
+			ossClient.getObject(request, file);
+			return true;
+		}catch (Exception e){
+			log.error("阿里云oss文件下载失败,key=" + objectName, e);
+		}finally {
+			if(ossClient != null){
+				ossClient.shutdown();
+			}
+		}
+		return false;
+	}
+
+
+	public  void uploadOss(String filePath, String key1){
+		OSSClient ossClient = new OSSClient(point, key, secrey);
+		try {
+			log.info("upload-to-oss:file-path:{},oss-path:{}",filePath,key1);
+			File file = new File(filePath);
+			if (!file.exists()) {
+				log.info("upload-to-oss:file-path:{},oss-path:{},filePath不存在!",filePath,key1);
+				return;
+			}
+			ObjectMetadata metadata = new ObjectMetadata();
+			ossClient.putObject(bucket, key1, new File(filePath), metadata);
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			ossClient.shutdown();
+		}
+	}
+	public void delete(String objectName){
+		if(objectName.contains(query)){
+			objectName = objectName.replace(query,"");
+		}
+		OSSClient ossClient = new OSSClient(point, key, secrey);
+		try {
+			ossClient.deleteObject(bucket, objectName);
+		} catch (Exception e) {
+			log.error("OSS删除文件失败,key=" + objectName);
+		}finally {
+			if(ossClient != null){
+				ossClient.shutdown();
+			}
+		}
+	}
+
+	/**
+	 * 获得文件列表-阿里云
+	 * @return
+	 */
+	public List<String> listKeysFromAli(String sourcePath) {
+		List<String> keyList = new ArrayList<>();
+		OSSClient ossClient = new OSSClient(point, key, secrey);
+		try {
+			boolean flag = true;
+			String nextMaker = null;
+			ListObjectsRequest listObjectsRequest = new ListObjectsRequest(this.bucket);
+			//指定下一级文件
+			listObjectsRequest.setPrefix(sourcePath);
+			//设置分页的页容量
+			listObjectsRequest.setMaxKeys(200);
+			do
+			{
+				//获取下一页的起始点,它的下一项
+				listObjectsRequest.setMarker(nextMaker);
+				ObjectListing objectListing = ossClient.listObjects(listObjectsRequest);
+				List<OSSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
+				List<String> collect = objectSummaries.stream().map(summary -> {
+					return summary.getKey();
+				}).collect(Collectors.toList());
+				if(CollUtil.isNotEmpty(collect)){
+					keyList.addAll(collect);
+				}
+				nextMaker = objectListing.getNextMarker();
+				//全部执行完后,为false
+				flag = objectListing.isTruncated();
+			} while (flag);
+		}catch (Exception e){
+			log.error("获取文件列表失败,path="+sourcePath, e);
+		}finally {
+			if(ossClient != null){
+				ossClient.shutdown();
+			}
+		}
+
+
+		ossClient.shutdown();
+
+		return keyList;
+	}
+
+	/**
+	 * 获取文件内容-阿里云
+	 * @param bucketName
+	 * @param objectName
+	 * @return
+	 */
+	public String getObjectContent(String bucketName, String objectName){
+		//创建oss客户端
+		OSSClient ossClient = new OSSClient(point, key, secrey);
+		InputStream objectContent = null;
+		StringBuilder contentJson = new StringBuilder();
+		try {
+			// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
+			OSSObject ossObject = ossClient.getObject(bucketName, objectName);
+			objectContent = ossObject.getObjectContent();
+			try(BufferedReader reader = new BufferedReader(new InputStreamReader(objectContent))){
+				while (true) {
+					String line = reader.readLine();
+					if (line == null) break;
+					contentJson.append(line);
+				}
+			} catch (IOException e) {
+				log.error("读取scene.json文件流失败", e);
+			}
+		}catch (Exception e){
+			log.error("s3获取文件内容失败,key="+objectName, e);
+		}finally {
+			if(ossClient != null){
+				ossClient.shutdown();
+			}
+		}
+
+		return contentJson.toString();
+	}
+
+	public  void uploadFileOss(File file) {
+		if(file.isFile()){
+			String ossPath = file.getPath();
+			ossPath = ossPath.replace("/mnt/","");
+			ossPath =  ossPath.replace("\\","/");
+			this.uploadOss(file.getPath(),ossPath);
+		}else {
+			File[] files = file.listFiles();
+			for (File file1 : files) {
+				uploadFileOss(file1);
+			}
+		}
+	}
+}

+ 21 - 0
src/main/java/com/fdkankan/tk/controller/BaseController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.tk.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class BaseController {
+
+    @Autowired
+    protected HttpServletRequest request;
+
+    @Autowired
+    protected HttpServletResponse response;
+
+
+    protected String getToken(){
+        return request.getHeader("token");
+    }
+
+}

+ 67 - 11
src/main/java/com/fdkankan/tk/controller/RoomController.java

@@ -1,21 +1,77 @@
 package com.fdkankan.tk.controller;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import org.springframework.web.bind.annotation.RestController;
+import com.fdkankan.tk.common.ResultCode;
+import com.fdkankan.tk.common.ResultData;
+import com.fdkankan.tk.entity.Room;
+import com.fdkankan.tk.exception.BusinessException;
+import com.fdkankan.tk.request.RoomAddParam;
+import com.fdkankan.tk.request.RoomListParam;
+import com.fdkankan.tk.service.IRoomService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
 
 /**
- * <p>
- *  前端控制器
- * </p>
- *
- * @author 
- * @since 2022-09-19
+ *房间管理
  */
 @RestController
-@RequestMapping("/tk/room")
-public class RoomController {
+public class RoomController extends BaseController{
+
+    @Autowired
+    IRoomService roomService;
+
+
+    /**
+     * 根据id获取详情
+     */
+    @GetMapping("/roomInfo")
+    public ResultData roomInfo(@RequestParam(required = false) Integer roomId){
+        return ResultData.ok(roomService.getRoomInfo(roomId));
+    }
+    /**
+     * 房间访问次数 +1
+     */
+    @GetMapping("/roomAddView")
+    public ResultData roomAddView(@RequestParam(required = false) Integer roomId){
+        roomService.roomAddView(roomId);
+        return ResultData.ok();
+    }
+    /**
+     * 房间列表
+     */
+    @PostMapping("/roomList")
+    public ResultData pageList(@RequestBody RoomListParam param){
+        return ResultData.ok(roomService.pageList(param,getToken()));
+    }
+    /**
+     * 创建房间
+     */
+    @PostMapping("/roomAddOrUpdate")
+    public ResultData createRoom(@RequestBody RoomAddParam param){
+        return ResultData.ok(roomService.addOrUpdate(param,getToken()));
+    }
+    /**
+     * 删除房间
+     */
+    @PostMapping("/roomDelete")
+    public ResultData roomDelete(@RequestBody RoomAddParam param){
+        if(param.getRoomId() == null){
+            throw new BusinessException(ResultCode.PARAM_MISS);
+        }
+        roomService.deleteById(param.getRoomId());
+        return ResultData.ok();
+    }
+    /**
+     * 获取分享二维码
+     */
+    @GetMapping("/roomGetShareCode")
+    public ResultData roomGetShareCode(@RequestParam(required = false) Integer roomId){
+        if(roomId == null){
+            throw new BusinessException(ResultCode.PARAM_MISS);
+        }
+        return ResultData.ok(roomService.getWxQrCode(roomId));
+    }
+
 
 }
 

+ 26 - 0
src/main/java/com/fdkankan/tk/controller/SceneController.java

@@ -0,0 +1,26 @@
+package com.fdkankan.tk.controller;
+
+import com.fdkankan.tk.common.ResultData;
+import com.fdkankan.tk.request.SceneParam;
+import com.fdkankan.tk.service.ISceneService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 场景数据
+ */
+@RestController
+public class SceneController extends BaseController {
+
+    @Autowired
+    ISceneService sceneService;
+    /**
+     * 四维场景列表
+     */
+    @PostMapping("/sceneList")
+    public ResultData sceneList(@RequestBody SceneParam param){
+        return ResultData.ok(sceneService.pageList(param,getToken()));
+    }
+}

+ 27 - 0
src/main/java/com/fdkankan/tk/controller/TestController.java

@@ -0,0 +1,27 @@
+package com.fdkankan.tk.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.tk.common.ResultData;
+import com.fdkankan.tk.httpClient.client.WxClient;
+import com.fdkankan.tk.httpClient.request.WxGetQrCodeParam;
+import com.fdkankan.tk.service.IWxService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+
+@RestController
+public class TestController {
+
+    @Autowired
+    IWxService wxService;
+
+    @GetMapping("/test")
+    public ResultData test(){
+        return ResultData.ok( );
+    }
+}

+ 62 - 0
src/main/java/com/fdkankan/tk/entity/WxConfig.java

@@ -0,0 +1,62 @@
+package com.fdkankan.tk.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+@Getter
+@Setter
+@ToString
+@TableName("t_wx_config")
+public class WxConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 小程序ID
+     */
+    @TableField("app_id")
+    private String appId;
+
+    /**
+     * 小程序密钥
+     */
+    @TableField("app_secret")
+    private String appSecret;
+
+    /**
+     * 商户号
+     */
+    @TableField("mch_id")
+    private String mchId;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+
+}

+ 1 - 1
src/main/java/com/fdkankan/tk/generate/AutoGenerate.java

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir") ;
 
         generate(path,"tk", getTables(new String[]{
-                "t_room","t_room_num",
+                "t_wx_config",
         }));
 
 //        generate(path,"goods", getTables(new String[]{

+ 22 - 0
src/main/java/com/fdkankan/tk/httpClient/address/FdkkAddressSource.java

@@ -0,0 +1,22 @@
+package com.fdkankan.tk.httpClient.address;
+
+import com.dtflys.forest.callback.AddressSource;
+import com.dtflys.forest.http.ForestAddress;
+import com.dtflys.forest.http.ForestRequest;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class FdkkAddressSource implements AddressSource {
+
+    @Value("${4dkk.fdService.basePath}")
+    private String basePath;
+
+    @Value("${4dkk.fdService.port}")
+    private String port;
+
+    @Override
+    public ForestAddress getAddress(ForestRequest forestRequest) {
+        return new ForestAddress("","",Integer.valueOf(port),basePath);
+    }
+}

+ 46 - 0
src/main/java/com/fdkankan/tk/httpClient/client/FdKKClient.java

@@ -0,0 +1,46 @@
+package com.fdkankan.tk.httpClient.client;
+
+import com.dtflys.forest.annotation.Address;
+import com.dtflys.forest.annotation.Header;
+import com.dtflys.forest.annotation.JSONBody;
+import com.dtflys.forest.annotation.Post;
+import com.fdkankan.tk.httpClient.address.FdkkAddressSource;
+import com.fdkankan.tk.httpClient.request.FdkkLoginRequest;
+import com.fdkankan.tk.httpClient.response.FdkkLoginVo;
+import com.fdkankan.tk.httpClient.response.FdkkResponse;
+import com.fdkankan.tk.request.SceneParam;
+
+/**
+ * 获取,调用4dkk服务
+ */
+@Address(source = FdkkAddressSource.class)
+public interface FdKKClient {
+
+    /**
+     * 登录
+     */
+    @Post("/api/sso/user/login")
+    FdkkResponse<FdkkLoginVo> fdkkLogin(@JSONBody FdkkLoginRequest fdkkLoginRequest);
+    /**
+     * 退出登录
+     */
+    @Post("/api/sso/user/logout")
+    FdkkResponse<FdkkLoginVo> fdkkLogout(@Header("token") String token);
+    /**
+     * 校验token
+     */
+    @Post("/api/user/checkToken")
+    FdkkResponse checkToken(@Header("token")  String token);
+
+    /**
+     * 获取v4场景数据
+     */
+    @Post("/api/fusion/scene/list")
+    FdkkResponse sceneList(@JSONBody SceneParam param, @Header("token") String token);
+    /**
+     * 获取v4场景数据
+     */
+    @Post("/api/fusion/scene/list")
+    FdkkResponse sceneList(@JSONBody SceneParam param);
+
+}

+ 29 - 0
src/main/java/com/fdkankan/tk/httpClient/client/WxClient.java

@@ -0,0 +1,29 @@
+package com.fdkankan.tk.httpClient.client;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dtflys.forest.annotation.*;
+import com.fdkankan.tk.httpClient.address.FdkkAddressSource;
+import com.fdkankan.tk.httpClient.request.FdkkLoginRequest;
+import com.fdkankan.tk.httpClient.request.WxGetQrCodeParam;
+import com.fdkankan.tk.httpClient.response.FdkkLoginVo;
+import com.fdkankan.tk.httpClient.response.FdkkResponse;
+import com.fdkankan.tk.request.SceneParam;
+
+/**
+ * 获取,调用4dkk服务
+ */
+@BaseRequest(sslProtocol = "TLS")
+public interface WxClient {
+
+    /**
+     * 获取 access_token
+     */
+    @Get("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential")
+    JSONObject getToken(@Query("appid") String app_id, @Query("secret") String app_secret);
+    /**
+     * 获取小程序二维码入口
+     */
+    @Post("https://api.weixin.qq.com/wxa/getwxacodeunlimit")
+    String getQrCode(@Query("access_token") String access_token, @JSONBody WxGetQrCodeParam param);
+
+}

+ 11 - 0
src/main/java/com/fdkankan/tk/httpClient/request/FdkkLoginRequest.java

@@ -0,0 +1,11 @@
+package com.fdkankan.tk.httpClient.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class FdkkLoginRequest {
+    private String phoneNum;
+    private String password;
+}

+ 15 - 0
src/main/java/com/fdkankan/tk/httpClient/request/LaserSceneParam.java

@@ -0,0 +1,15 @@
+package com.fdkankan.tk.httpClient.request;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class LaserSceneParam {
+    private Integer pageNum;
+    private Integer pageSize;
+    private Integer selectType = 1;
+    private List<String> sceneCodes;
+    private String title;
+    private Integer status;
+}

+ 21 - 0
src/main/java/com/fdkankan/tk/httpClient/request/WxGetQrCodeParam.java

@@ -0,0 +1,21 @@
+package com.fdkankan.tk.httpClient.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class WxGetQrCodeParam {
+    private String scene;               //最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)
+    private String page;                //页面 page,例如 pages/index/index,根路径前不要填加 /,不能携带参数(参数请放在 scene 字段里),如果不填写这个字段,默认跳主页面
+    private Boolean check_path;          //检查 page 是否存在,为 true 时 page 必须是已经发布的小程序存在的页面(否则报错);为 false 时允许小程序未发布或者 page 不存在, 但 page 有数量上限(60000个)请勿滥用
+    private String env_version;         //要打开的小程序版本。正式版为 release,体验版为 trial,开发版为 develop
+    private Integer width;             //二维码的宽度,单位 px,最小 280px,最大 1280px
+    private Boolean auto_color;       //自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调,默认 false
+    private Object line_color;       //auto_color 为 false 时生效,使用 rgb 设置颜色 例如 {"r":"xxx","g":"xxx","b":"xxx"} 十进制表示
+    private Boolean is_hyaline;      //是否需要透明底色,为 true 时,生成透明底色的小程序
+
+    public WxGetQrCodeParam(String scene) {
+        this.scene = scene;
+    }
+}

+ 9 - 0
src/main/java/com/fdkankan/tk/httpClient/response/FdkkLoginVo.java

@@ -0,0 +1,9 @@
+package com.fdkankan.tk.httpClient.response;
+
+import lombok.Data;
+
+@Data
+public class FdkkLoginVo {
+    private String token;
+    private FdkkUserVo user;
+}

+ 10 - 0
src/main/java/com/fdkankan/tk/httpClient/response/FdkkResponse.java

@@ -0,0 +1,10 @@
+package com.fdkankan.tk.httpClient.response;
+
+import lombok.Data;
+
+@Data
+public class FdkkResponse<T> {
+    private Integer code;
+    private String msg;
+    private T data;
+}

+ 94 - 0
src/main/java/com/fdkankan/tk/httpClient/response/FdkkScenePlus.java

@@ -0,0 +1,94 @@
+package com.fdkankan.tk.httpClient.response;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 场景主表
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Getter
+@Setter
+public class FdkkScenePlus implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    private String num;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 相机id
+     */
+    private Long cameraId;
+
+    /**
+     * 手机id
+     */
+    private String phoneId;
+
+    /**
+     * 场景名称
+     */
+    private String title;
+
+    /**
+     * 场景描述
+     */
+    private String description;
+
+    /**
+     * 场景状态:0-未建好,1--已建好,-1-计算出错,-2--不在官网显示
+     */
+    private Integer sceneStatus;
+
+    /**
+     * 场景来源:相机拍摄10以内表示,1表示八目,2双目,3转台,4 激光  其他来源10以上,11:一键换装,12:123看房,13文通虚拟场景
+     */
+    private Integer sceneSource;
+
+    /**
+     * 支付状态:0表示未付款,1表示付款了,-1表示欠费,-2表示容量不足
+     */
+    private Integer payStatus;
+
+    /**
+     * 场景类型  0-其他,1-文博,2-地产,3-电商,4-餐饮,5-家居,99-一件换装虚拟房源
+     */
+    private Integer sceneType;
+
+    /**
+     * 是否推荐:0-否,1-是
+     */
+    private Integer recommend;
+
+    /**
+     * 创建时间
+     */
+    private String createTime;
+
+    /**
+     * 更新时间
+     */
+    private String updateTime;
+
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    private String recStatus;
+}

+ 129 - 0
src/main/java/com/fdkankan/tk/httpClient/response/FdkkScenePlusExt.java

@@ -0,0 +1,129 @@
+package com.fdkankan.tk.httpClient.response;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Getter
+@Setter
+public class FdkkScenePlusExt implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    /**
+     * t_scene_plus主键
+     */
+    private Long plusId;
+
+    /**
+     * 场景数据目录
+     */
+    private String dataSource;
+
+    /**
+     * 场景链接
+     */
+    private String webSite;
+
+    /**
+     * 缩略图链接
+     */
+    private String thumb;
+
+    /**
+     * 方案:1-双目,2-转台,3-六目,4-八目,10-获取4k图,11-获取2k,12-获取1k
+     */
+    private Integer sceneScheme;
+
+    /**
+     * 使用用量
+     */
+    private Long space;
+
+    /**
+     * 云服务器类型
+     */
+    private String ecs;
+
+    /**
+     * 点位数量
+     */
+    private Integer shootCount;
+
+    /**
+     * 浏览次数
+     */
+    private Integer viewCount;
+
+    /**
+     * gps定位
+     */
+    private String gps;
+
+    /**
+     * 算法类型(slam、sfm)
+     */
+    private String algorithm;
+
+    /**
+     * 固件版本
+     */
+    private String firmwareVersion;
+
+    /**
+     * 算法类型(V2,V3)
+     */
+    private String buildType;
+
+    /**
+     * 分辨率(2k,4k)
+     */
+    private String sceneResolution;
+
+    /**
+     * 场景来源,lite:双目lite相机,pro:八目相机,minion:双面转台相机,laser:激光相机,virtual:虚拟场景,sketch:图片建模场景
+     */
+    private String sceneFrom;
+
+    /**
+     * 切图方式(tiles:瓦片图,face:切片图,pan:全景图 ,local:本地切片,cube:立体图)
+     */
+    private String sceneKind;
+
+    /**
+     * 点位视频
+     */
+    private String videos;
+
+    /**
+     * 计算耗时
+     */
+    private Long computeTime;
+
+    /**
+     * 创建时间
+     */
+    private String createTime;
+
+    /**
+     * 更新时间
+     */
+    private String updateTime;
+
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    private String recStatus;
+}

+ 9 - 0
src/main/java/com/fdkankan/tk/httpClient/response/FdkkScenePlusVo.java

@@ -0,0 +1,9 @@
+package com.fdkankan.tk.httpClient.response;
+
+import lombok.Data;
+
+@Data
+public class FdkkScenePlusVo extends FdkkScenePlus {
+    private FdkkScenePlusExt plusExt;
+    private String snCode;
+}

+ 25 - 0
src/main/java/com/fdkankan/tk/httpClient/response/FdkkUserVo.java

@@ -0,0 +1,25 @@
+package com.fdkankan.tk.httpClient.response;
+
+import lombok.Data;
+
+@Data
+public class FdkkUserVo {
+    private Long id ;
+    private String userName;                    //用户名
+    private String head;                        //头像
+    private String nickName;                    //昵称
+    private String email;                       //邮箱
+    private Integer availableSpace;             //可用空间
+    private Long cameraCount;                   //已绑相机
+    private Integer downloadNum;                //已下载场景总数
+    private Integer downloadNumTotal;           //总的下载场景总数
+    private Long incrementBindNum;              //已绑定的会员权益数量
+    private Long incrementNum;                  //会员权益数量
+
+    private Long cameraId;
+    private Integer cameraLogin;
+
+    private Long sceneCount;
+    private Long expansionTotal;
+
+}

+ 18 - 0
src/main/java/com/fdkankan/tk/mapper/IWxConfigMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.tk.mapper;
+
+import com.fdkankan.tk.entity.WxConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+@Mapper
+public interface IWxConfigMapper extends BaseMapper<WxConfig> {
+
+}

+ 12 - 0
src/main/java/com/fdkankan/tk/request/RoomAddParam.java

@@ -0,0 +1,12 @@
+package com.fdkankan.tk.request;
+
+import com.fdkankan.tk.entity.Room;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class RoomAddParam extends Room {
+
+    private List<String> numList;   //场景码列表
+}

+ 9 - 0
src/main/java/com/fdkankan/tk/request/RoomListParam.java

@@ -0,0 +1,9 @@
+package com.fdkankan.tk.request;
+
+import com.fdkankan.tk.common.RequestBase;
+import lombok.Data;
+
+@Data
+public class RoomListParam extends RequestBase {
+    private String roomTitle;
+}

+ 15 - 0
src/main/java/com/fdkankan/tk/request/SceneParam.java

@@ -0,0 +1,15 @@
+package com.fdkankan.tk.request;
+
+import com.fdkankan.tk.common.RequestBase;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SceneParam extends RequestBase {
+
+    private Integer type; //0 看看,1看见
+    private String sceneName;
+    private List<String> numList;
+    private Integer status =2; //
+}

+ 12 - 0
src/main/java/com/fdkankan/tk/response/RoomVo.java

@@ -0,0 +1,12 @@
+package com.fdkankan.tk.response;
+
+import com.fdkankan.tk.entity.Room;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class RoomVo extends Room {
+
+    private List<SceneVo> sceneData;
+}

+ 154 - 0
src/main/java/com/fdkankan/tk/response/SceneProEntityVo.java

@@ -0,0 +1,154 @@
+package com.fdkankan.tk.response;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+
+/**
+ * 场景表
+ */
+@Data
+public class SceneProEntityVo implements Serializable {
+
+    private static final long serialVersionUID = 661912133849676944L;
+    /**
+     * 场景名称
+     */
+    private String sceneName;
+    /**
+     * 场景描述
+     */
+    private String sceneDec;
+    /**
+     * 场景的链接地址
+     */
+    private String webSite;
+    /**
+     * 场景缩略图
+     */
+    private String thumb;
+    /**
+     * 0表示未建好,1表示建好,-1表示出错,-2表示不要在官网上显示
+     */
+    private int status;
+    /**
+     * 原始的大场景数据(七牛)
+     */
+    private String dataSource;
+    /**
+     * 0表示未付款,1表示付款了,-1表示欠费(八目场景指锁住),-2表示临时空间(八目场景)
+     */
+    private int payStatus;
+    /**
+     * 手机id
+     */
+    private String phoneId;
+    /**
+     * 大场景序号
+     */
+    private String num;
+    /**
+     * 0表示其他,1表示文博,2表示地产,3表示电商,4表示餐饮,5表示家居
+     */
+    private int sceneType;
+    /**
+     * 1表示推荐,0表示正常
+     */
+    private int recommend;
+    /**
+     * 浏览次数
+     */
+    private int viewCount;
+    /**
+     * 拍摄数量
+     */
+    private int shootCount;
+    /**
+     * 要gps定位
+     */
+    private String gps;
+    /**
+     * 方案:1是双目,2是转台,3是六目,4是八目
+     */
+    private int sceneScheme;
+    /**
+     * 用户表t_user的id
+     */
+    private Long userId;
+    /**
+     * 相机主表t_camera的id
+     */
+    private Long cameraId;
+    /**
+     * 容量
+     */
+    private BigInteger space;
+
+    /**
+     * 算法类型(sfm或slam)
+     */
+    private String algorithm;
+
+    /**
+     * 服务器的服务商
+     */
+    private String ecs;
+
+    /**
+     * 点位视频
+     */
+    private String videos;
+
+    /**
+     * 所有资源文件名
+     */
+    private String filesName;
+
+    /**
+     * 所有资源文件名
+     */
+    private String sceneLogo;
+
+    /**
+     * 硬件版本
+     */
+    private String firmwareVersion;
+
+    private String buildType;
+
+    /**
+     * 场景来源,相机拍摄10以内表示, 1表示八目,2双目,3转台,4 激光
+     * 其他来源10以上,11:一键换装,12:123看房,13文通虚拟场景
+     */
+    private Integer sceneSource;
+
+    private String cooperationUserId;
+
+    /**
+     * 触发mq调度,事务最后触发
+     */
+    private String mqMsg;
+
+    /**
+     * 随心装场景码
+     */
+    private String vrnum;
+
+    /**
+     * 马赛克数据数组
+     */
+    private String mosaics;
+    /**
+     * 是否升级
+     */
+    private Integer isUpgrade;
+
+    private String snCode;
+
+    private Long id;
+    private String createTime;
+    private String updateTime;
+    private String recStatus;
+
+}

+ 24 - 0
src/main/java/com/fdkankan/tk/response/SceneVo.java

@@ -0,0 +1,24 @@
+package com.fdkankan.tk.response;
+
+import lombok.Data;
+
+@Data
+public class SceneVo  {
+    private Long id;
+    private Integer buildObjStatus;
+    private String createTime;
+    private String name;
+    private String num;
+    private Integer payStatus;
+    private String sceneName;
+    private String snCode;
+    private Integer status;
+    private String thumb;
+    private String title;
+    private Integer viewCount;
+    private Boolean isLaser;
+    private Integer type;       // 0 四维看看,1看见场景,2 深时场景,3 三维模型
+
+    private String phone;
+    private Boolean bind = true;
+}

+ 7 - 0
src/main/java/com/fdkankan/tk/service/IRoomNumService.java

@@ -3,6 +3,8 @@ package com.fdkankan.tk.service;
 import com.fdkankan.tk.entity.RoomNum;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * <p>
  *  服务类
@@ -13,4 +15,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IRoomNumService extends IService<RoomNum> {
 
+    void addBatch(Integer roomId, List<String> numList);
+
+    void deleteByRoomId(Integer roomId);
+
+    List<String> getListByRoomId(Integer roomId);
 }

+ 16 - 0
src/main/java/com/fdkankan/tk/service/IRoomService.java

@@ -1,7 +1,11 @@
 package com.fdkankan.tk.service;
 
+import com.fdkankan.tk.common.PageInfo;
 import com.fdkankan.tk.entity.Room;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.tk.request.RoomAddParam;
+import com.fdkankan.tk.request.RoomListParam;
+import com.fdkankan.tk.response.RoomVo;
 
 /**
  * <p>
@@ -13,4 +17,16 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IRoomService extends IService<Room> {
 
+    PageInfo pageList(RoomListParam param, String token);
+
+    Room addOrUpdate(RoomAddParam param, String token);
+
+    void deleteById(Integer roomId);
+
+    RoomVo getRoomInfo(Integer roomId);
+
+    void roomAddView(Integer roomId);
+
+    String getWxQrCode(Integer roomId);
+
 }

+ 14 - 0
src/main/java/com/fdkankan/tk/service/ISceneService.java

@@ -0,0 +1,14 @@
+package com.fdkankan.tk.service;
+
+import com.fdkankan.tk.common.PageInfo;
+import com.fdkankan.tk.request.SceneParam;
+import com.fdkankan.tk.response.SceneVo;
+
+import java.util.List;
+
+public interface ISceneService {
+
+    PageInfo pageList(SceneParam param, String token);
+
+    List<SceneVo> getListByNumList(List<String> numList);
+}

+ 16 - 0
src/main/java/com/fdkankan/tk/service/IWxConfigService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.tk.service;
+
+import com.fdkankan.tk.entity.WxConfig;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+public interface IWxConfigService extends IService<WxConfig> {
+
+}

+ 7 - 0
src/main/java/com/fdkankan/tk/service/IWxService.java

@@ -0,0 +1,7 @@
+package com.fdkankan.tk.service;
+
+
+public interface IWxService {
+
+    void getWxQRCode(String path, String targetTmpPath,Integer reCount);
+}

+ 36 - 0
src/main/java/com/fdkankan/tk/service/impl/RoomNumServiceImpl.java

@@ -1,11 +1,18 @@
 package com.fdkankan.tk.service.impl;
+import java.util.ArrayList;
+import java.util.Date;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.tk.entity.Room;
 import com.fdkankan.tk.entity.RoomNum;
 import com.fdkankan.tk.mapper.IRoomNumMapper;
 import com.fdkankan.tk.service.IRoomNumService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  *  服务实现类
@@ -17,4 +24,33 @@ import org.springframework.stereotype.Service;
 @Service
 public class RoomNumServiceImpl extends ServiceImpl<IRoomNumMapper, RoomNum> implements IRoomNumService {
 
+    @Override
+    public void addBatch(Integer roomId, List<String> numList) {
+        this.deleteByRoomId(roomId);
+        List<RoomNum> roomNumList = new ArrayList<>();
+        for (String num : numList) {
+            RoomNum roomNum = new RoomNum();
+            roomNum.setRoomId(roomId);
+            roomNum.setNum(num);
+            roomNumList.add(roomNum);
+        }
+        if(roomNumList.size() >0){
+            this.saveBatch(roomNumList);
+        }
+    }
+
+    @Override
+    public void deleteByRoomId(Integer roomId) {
+        LambdaQueryWrapper<RoomNum> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(RoomNum::getRoomId,roomId);
+        this.remove(wrapper);
+    }
+
+    @Override
+    public List<String> getListByRoomId(Integer roomId) {
+        LambdaQueryWrapper<RoomNum> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(RoomNum::getRoomId,roomId);
+        List<RoomNum> list = this.list(wrapper);
+        return list.parallelStream().map(RoomNum::getNum).collect(Collectors.toList());
+    }
 }

+ 135 - 0
src/main/java/com/fdkankan/tk/service/impl/RoomServiceImpl.java

@@ -1,9 +1,36 @@
 package com.fdkankan.tk.service.impl;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.jwt.JWTUtil;
+import com.auth0.jwt.JWT;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.tk.common.FilePath;
+import com.fdkankan.tk.common.PageInfo;
+import com.fdkankan.tk.common.ResultCode;
+import com.fdkankan.tk.common.util.JwtUtil;
+import com.fdkankan.tk.common.util.UploadToOssUtil;
 import com.fdkankan.tk.entity.Room;
+import com.fdkankan.tk.exception.BusinessException;
 import com.fdkankan.tk.mapper.IRoomMapper;
+import com.fdkankan.tk.request.RoomAddParam;
+import com.fdkankan.tk.request.RoomListParam;
+import com.fdkankan.tk.response.RoomVo;
+import com.fdkankan.tk.response.SceneVo;
+import com.fdkankan.tk.service.IRoomNumService;
 import com.fdkankan.tk.service.IRoomService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.tk.service.ISceneService;
+import com.fdkankan.tk.service.IWxService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 /**
@@ -17,4 +44,112 @@ import org.springframework.stereotype.Service;
 @Service
 public class RoomServiceImpl extends ServiceImpl<IRoomMapper, Room> implements IRoomService {
 
+    @Autowired
+    IRoomNumService roomNumService;
+    @Autowired
+    ISceneService sceneService;
+    @Autowired
+    UploadToOssUtil uploadToOssUtil;
+    @Autowired
+    IWxService wxService;
+    @Value("${upload.query-path}")
+    private String queryPath;
+
+    @Override
+    public PageInfo pageList(RoomListParam param, String token) {
+        String userName = JwtUtil.getUserName(token);
+
+        LambdaQueryWrapper<Room> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(Room::getRoomUserName,userName);
+        if (StringUtils.isNotBlank(param.getRoomTitle()) ) {
+            wrapper.like(Room::getRoomTitle,param.getRoomTitle());
+        }
+        wrapper.orderByDesc(Room::getCreateTime);
+
+        Page<Room> page = this.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
+
+
+        return PageInfo.PageInfo(page);
+    }
+
+    @Override
+    public Room addOrUpdate(RoomAddParam param, String token) {
+        if(param.getNumList() == null || param.getNumList().size() <=0){
+            throw new BusinessException(ResultCode.PARAM_MISS);
+        }
+        if(StringUtils.isEmpty(param.getRoomTitle()) ){
+            throw new BusinessException(ResultCode.PARAM_MISS);
+        }
+        Room room = new Room();
+        BeanUtils.copyProperties(param,room);
+        room.setRoomUserName(JwtUtil.getUserName(token));
+        if(StringUtils.isEmpty(room.getRoomHostName())){
+            room.setRoomHostName(room.getRoomUserName());
+        }
+        if(param.getRoomId() != null){
+            room.setUpdateTime(null);
+        }
+        this.saveOrUpdate(room);
+        roomNumService.addBatch(room.getRoomId(),param.getNumList());
+        param.setRoomId(room.getRoomId());
+        return param;
+    }
+
+    @Override
+    public void deleteById(Integer roomId) {
+        roomNumService.deleteByRoomId(roomId);
+        Room room = this.getById(roomId);
+        if(StringUtils.isNotBlank(room.getRoomShareUrl())){
+            uploadToOssUtil.delete(room.getRoomShareUrl());
+        }
+        this.removeById(roomId);
+    }
+
+    @Override
+    public RoomVo getRoomInfo(Integer roomId) {
+        Room room = this.getById(roomId);
+        List<String> numList = roomNumService.getListByRoomId(roomId);
+        List<SceneVo> list = new ArrayList<>();
+        if(numList.size() >0){
+            list = sceneService.getListByNumList(numList);
+        }
+        RoomVo roomVo = new RoomVo();
+        BeanUtils.copyProperties(room,roomVo);
+        roomVo.setSceneData(list);
+        return roomVo;
+    }
+
+    @Override
+    public void roomAddView(Integer roomId) {
+        LambdaUpdateWrapper<Room> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setSql("room_view_count = room_view_count +1");
+        wrapper.eq(Room::getRoomId,roomId);
+        this.update(wrapper);
+    }
+
+
+    @Override
+    public String getWxQrCode(Integer roomId) {
+        Room room = this.getById(roomId);
+        if(StringUtils.isNotBlank(room.getRoomShareUrl())){
+            if(uploadToOssUtil.existKey(room.getRoomShareUrl())){
+                return  room.getRoomShareUrl();
+            }
+        }
+        String localPath = String.format(FilePath.LOCAL_QRCODE_PATH, roomId);
+        String ossPath = String.format(FilePath.OSS_QRCODE_PATH, roomId);
+        wxService.getWxQRCode("roomId="+roomId,String.format(FilePath.LOCAL_QRCODE_PATH,roomId),0);
+        if(!new File(localPath).exists()){
+            throw new BusinessException(ResultCode.QRCODE_MISS);
+        }
+        uploadToOssUtil.uploadOss(localPath,ossPath);
+        if(!uploadToOssUtil.existKey(ossPath)){
+            FileUtil.del(localPath);
+            throw new BusinessException(ResultCode.QRCODE_MISS);
+        }
+        room.setRoomShareUrl(queryPath + ossPath);
+        this.updateById(room);
+        FileUtil.del(localPath);
+        return queryPath + ossPath;
+    }
 }

+ 118 - 0
src/main/java/com/fdkankan/tk/service/impl/SceneServiceImpl.java

@@ -0,0 +1,118 @@
+package com.fdkankan.tk.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.tk.common.PageInfo;
+import com.fdkankan.tk.common.ResultCode;
+import com.fdkankan.tk.exception.BusinessException;
+import com.fdkankan.tk.httpClient.client.FdKKClient;
+import com.fdkankan.tk.httpClient.response.FdkkResponse;
+import com.fdkankan.tk.request.SceneParam;
+import com.fdkankan.tk.response.SceneProEntityVo;
+import com.fdkankan.tk.response.SceneVo;
+import com.fdkankan.tk.service.ISceneService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class SceneServiceImpl implements ISceneService {
+
+    @Resource
+    FdKKClient fdKKClient;
+
+    @Override
+    public List<SceneVo> getListByNumList(List<String> numList) {
+        SceneParam param = new SceneParam();
+        param.setNumList(numList);
+        param.setStatus(2);
+        param.setPageNum(1);
+        param.setPageSize(9999);
+        FdkkResponse fdkkResponse = fdKKClient.sceneList(param);
+        if (fdkkResponse.getCode() != 0) {
+            throw new BusinessException(fdkkResponse.getCode(), fdkkResponse.getMsg());
+        }
+        PageInfo pageInfo = JSONObject.parseObject(JSONObject.toJSONString(fdkkResponse.getData()), PageInfo.class);
+        JSONArray list = JSONArray.parseArray(JSONObject.toJSONString(pageInfo.getList()));
+        return overSceneVo(list);
+    }
+
+    @Override
+    public PageInfo pageList(SceneParam param, String token) {
+        if (param.getType() == null) {
+            throw new BusinessException(ResultCode.PARAM_MISS);
+        }
+        List<SceneVo> sceneVoList = new ArrayList<>();
+        long total = 0;
+        if (param.getType() == 0 || param.getType() == 1) {      //看看,看见
+            //获取四维(看看,看见)场景数据
+            FdkkResponse fdkkResponse = null;
+            if (param.getNumList() == null || param.getNumList().size() <= 0) {
+                fdkkResponse = fdKKClient.sceneList(param, token);
+            } else {
+                fdkkResponse = fdKKClient.sceneList(param);
+            }
+            if (fdkkResponse.getCode() != 0) {
+                throw new BusinessException(fdkkResponse.getCode(), fdkkResponse.getMsg());
+            }
+            PageInfo pageInfo = JSONObject.parseObject(JSONObject.toJSONString(fdkkResponse.getData()), PageInfo.class);
+            total = pageInfo.getTotal();
+            JSONArray list = JSONArray.parseArray(JSONObject.toJSONString(pageInfo.getList()));
+            sceneVoList = overSceneVo(list);
+        }
+
+        Page<SceneVo> voPage = new Page<>(param.getPageNum(),param.getPageSize());
+        voPage.setRecords(sceneVoList);
+        voPage.setTotal(total);
+        return PageInfo.PageInfo(voPage);
+    }
+
+    /**
+     * 四维看看返回数据格式转换
+     */
+    private List<SceneVo> overSceneVo(JSONArray list) {
+        List<SceneVo> sceneVoList = new ArrayList<>();
+        for (Object obj : list) {
+            String res = JSONObject.toJSONString(obj);
+            SceneProEntityVo fdkkScenePlusVo = JSONObject.parseObject(res, SceneProEntityVo.class);
+            SceneVo sceneVo = new SceneVo();
+            sceneVo.setId(fdkkScenePlusVo.getId());
+            sceneVo.setBuildObjStatus(0);
+            sceneVo.setCreateTime(fdkkScenePlusVo.getCreateTime());
+            sceneVo.setName(fdkkScenePlusVo.getSceneName());
+            sceneVo.setNum(fdkkScenePlusVo.getNum());
+            sceneVo.setPayStatus(1);
+            sceneVo.setSceneName(fdkkScenePlusVo.getSceneName());
+            sceneVo.setSnCode(fdkkScenePlusVo.getSnCode());
+            sceneVo.setStatus(setLaserStatus(fdkkScenePlusVo.getStatus(), fdkkScenePlusVo.getPayStatus()));
+            sceneVo.setThumb(fdkkScenePlusVo.getThumb());
+            sceneVo.setTitle(fdkkScenePlusVo.getSceneName());
+            sceneVo.setViewCount(fdkkScenePlusVo.getViewCount());
+            sceneVo.setIsLaser(false);
+            sceneVo.setType(fdkkScenePlusVo.getSceneType());
+            if (fdkkScenePlusVo.getUserId() == null) {
+                sceneVo.setBind(false);
+            }
+            sceneVoList.add(sceneVo);
+        }
+        return sceneVoList;
+    }
+
+    private Integer setLaserStatus(Integer status,Integer payStatus){
+        //深时状态,-1:场景被删 0:计算中 1计算失败 2计算成功 3封存 4生成OBJ中
+        if(payStatus != 1){    //封存
+            return 3;
+        }
+        if(status == -1){
+            return 1;
+        }
+        if(status == -2){
+            return 2;
+        }
+        return status;
+    }
+}

+ 34 - 0
src/main/java/com/fdkankan/tk/service/impl/WxConfigServiceImpl.java

@@ -0,0 +1,34 @@
+package com.fdkankan.tk.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.tk.entity.WxConfig;
+import com.fdkankan.tk.mapper.IWxConfigMapper;
+import com.fdkankan.tk.service.IWxConfigService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-09-19
+ */
+@Service
+@Slf4j
+public class WxConfigServiceImpl extends ServiceImpl<IWxConfigMapper, WxConfig> implements IWxConfigService {
+
+    static WxConfig wxConfig = null;
+
+    @PostConstruct
+    public void initWxConfig(){
+        wxConfig = this.getById(1);
+        log.info("项目启动加载Wxconfig:{}",wxConfig);
+    }
+}

+ 126 - 0
src/main/java/com/fdkankan/tk/service/impl/WxServiceImpl.java

@@ -0,0 +1,126 @@
+package com.fdkankan.tk.service.impl;
+
+import cn.hutool.core.io.FileUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.tk.common.FilePath;
+import com.fdkankan.tk.common.ResultCode;
+import com.fdkankan.tk.common.util.RedisKeyUtil;
+import com.fdkankan.tk.common.util.UploadToOssUtil;
+import com.fdkankan.tk.entity.Room;
+import com.fdkankan.tk.exception.BusinessException;
+import com.fdkankan.tk.httpClient.client.WxClient;
+import com.fdkankan.tk.service.IRoomService;
+import com.fdkankan.tk.service.IWxConfigService;
+import com.fdkankan.tk.service.IWxService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class WxServiceImpl implements IWxService {
+
+    @Resource
+    WxClient wxClient;
+    @Autowired
+    RedisUtil redisUtil;
+
+    //二维码
+    static String getWxQrCodeUrl ="https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=%s";
+    //太阳码
+    static String getWxSunCodeUrl ="https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s";
+
+
+    public String getToken(){
+        String redisKey = RedisKeyUtil.AccessToken + WxConfigServiceImpl.wxConfig.getAppId();
+        if(redisUtil.hasKey(redisKey)){
+            return redisUtil.get(redisKey);
+        }
+        JSONObject jsonObject = wxClient.getToken(WxConfigServiceImpl.wxConfig.getAppId(), WxConfigServiceImpl.wxConfig.getAppSecret());
+        String access_token = jsonObject.getString("access_token");
+        if(StringUtils.isNotBlank(access_token)){
+            redisUtil.set(redisKey,access_token,7000);
+            return access_token;
+        }
+        return null;
+    }
+
+    //生成分享二维码
+    @Override
+    public void getWxQRCode(String path, String targetTmpPath,Integer reCount) {
+        try {
+            //现获取token
+            HttpResponse response = sendWx(path);
+            InputStream is = null;
+            int code = response.getStatusLine().getStatusCode();
+            if(HttpStatus.OK.value() != code){
+               throw new BusinessException(ResultCode.QRCODE_MISS);
+            }
+            reCount ++;
+            is = response.getEntity().getContent();
+            if(response.getEntity().getContentLength() < 1000){
+                log.info("微信生成二维码接口返回内容长度小于1000");
+                String result = IOUtils.toString(response.getEntity().getContent());
+                JSONObject jsonObject = JSONObject.parseObject(result);
+                if(jsonObject.containsKey("errcode") && reCount < 2){
+                    int errcode = jsonObject.getInteger("errcode");
+                    if(errcode == 40001) {
+                        log.info("token过期了");
+                        String redisKey = RedisKeyUtil.AccessToken + WxConfigServiceImpl.wxConfig.getAppId();
+                        redisUtil.del(redisKey);
+                        getWxQRCode(path, targetTmpPath,reCount);
+                    }
+                }
+            }else{
+                log.info("微信返回内容长度大于1000");
+            }
+            File localFile = new File(targetTmpPath);
+            if(localFile.getParentFile().exists()){
+                localFile.mkdirs();
+            }
+            FileOutputStream fileOutputStream = new FileOutputStream(localFile);
+            IOUtils.copy(is , fileOutputStream);
+
+            IOUtils.closeQuietly(is);
+            IOUtils.closeQuietly(fileOutputStream);
+        } catch (Exception e) {
+            log.error("下载微信小程序二维码出现异常", e);
+        }
+    }
+
+    private  HttpResponse  sendWx(String path) throws IOException {
+        String token = this.getToken();
+        log.info("获取到的token={}" , token);
+        String urlStr = String.format(getWxSunCodeUrl, token);
+        CloseableHttpClient httpClient = null;
+        httpClient = HttpClients.createDefault();
+        HttpPost httpPost = new HttpPost(urlStr);
+        Map<String, Object> jsonMap = new HashMap<>();
+        jsonMap.put("scene", path);
+        log.info("上送给微信生成二维码的内容为:{}", JSONObject.toJSONString(jsonMap));
+        StringEntity requestEntity = new StringEntity(JSONObject.toJSONString(jsonMap), "utf-8");
+        requestEntity.setContentEncoding("UTF-8");
+        httpPost.setHeader("Content-type", "application/json");
+        httpPost.setEntity(requestEntity);
+        return httpClient.execute(httpPost);
+    }
+}

+ 1 - 15
src/main/resources/application-local.yaml

@@ -29,23 +29,9 @@ spring:
       shutdown-timeout: 0ms
 
 4dkk:
-  laserService:
-    #深时(激光)地址 生产环境:https://laser.4dkankan.com/
-    basePath: http://uat-laser.4dkankan.com
-    port: 80
-    #basePath: http://192.168.0.152:8080
-    #port: 8080
   fdService:
     #官网生产环境:https://www.4dkankan.com      http://test.4dkankan.com
     basePath: http://test.4dkankan.com
     port: 80
     #basePath: http://192.168.0.38/4dkankan_v2
-    #port: 8080
-  newFdService:
-    #官网生产环境:https://www.4dkankan.com
-    basePath: http://v4-test.4dkankan.com
-    port: 80
-  overallService:
-    #全景看看生产环境 host: https://www.4dkankan.com/qjkankan
-    basePath: http://test.4dkankan.com/qjkankan
-    port: 80
+    #port: 8080

+ 1 - 1
src/main/resources/application.yaml

@@ -7,7 +7,7 @@ spring:
       maxRequestSize: 1000MB
 
 server:
-  port: 8808
+  port: 8818
   servlet:
     context-path: /takelook
   tomcat:

+ 5 - 0
src/main/resources/mapper/tk/WxConfigMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.tk.mapper.IWxConfigMapper">
+
+</mapper>