Explorar o código

项目管理,成员管理

lyhzzz %!s(int64=2) %!d(string=hai) anos
pai
achega
c715851173
Modificáronse 72 ficheiros con 3055 adicións e 15 borrados
  1. 26 0
      src/main/java/com/fdkankan/site/common/BaseController.java
  2. 9 0
      src/main/java/com/fdkankan/site/common/FilePath.java
  3. 43 0
      src/main/java/com/fdkankan/site/common/PageInfo.java
  4. 9 0
      src/main/java/com/fdkankan/site/common/RequestBase.java
  5. 28 0
      src/main/java/com/fdkankan/site/common/ResultCode.java
  6. 82 0
      src/main/java/com/fdkankan/site/common/ResultData.java
  7. 32 0
      src/main/java/com/fdkankan/site/common/util/DateUtils.java
  8. 140 0
      src/main/java/com/fdkankan/site/common/util/JwtUtil.java
  9. 208 0
      src/main/java/com/fdkankan/site/common/util/UploadToOssUtil.java
  10. 20 0
      src/main/java/com/fdkankan/site/common/util/VUtils.java
  11. 22 0
      src/main/java/com/fdkankan/site/config/MybatisPlusPageConfig.java
  12. 30 0
      src/main/java/com/fdkankan/site/config/WebAppConfig.java
  13. 57 0
      src/main/java/com/fdkankan/site/controller/ProjectController.java
  14. 35 0
      src/main/java/com/fdkankan/site/controller/ProjectLogController.java
  15. 56 0
      src/main/java/com/fdkankan/site/controller/ProjectTeamController.java
  16. 24 0
      src/main/java/com/fdkankan/site/controller/SceneController.java
  17. 53 0
      src/main/java/com/fdkankan/site/controller/UploadController.java
  18. 72 0
      src/main/java/com/fdkankan/site/entity/Project.java
  19. 65 0
      src/main/java/com/fdkankan/site/entity/ProjectBim.java
  20. 56 0
      src/main/java/com/fdkankan/site/entity/ProjectLog.java
  21. 54 0
      src/main/java/com/fdkankan/site/entity/ProjectNum.java
  22. 63 0
      src/main/java/com/fdkankan/site/entity/ProjectTeam.java
  23. 22 0
      src/main/java/com/fdkankan/site/exception/BusinessException.java
  24. 35 0
      src/main/java/com/fdkankan/site/exception/GlobalExceptionHandler.java
  25. 9 0
      src/main/java/com/fdkankan/site/exception/ThrowExceptionFunction.java
  26. 4 4
      src/main/java/com/fdkankan/site/generate/AutoGenerate.java
  27. 22 0
      src/main/java/com/fdkankan/site/httpClient/address/FdkkAddressSource.java
  28. 22 0
      src/main/java/com/fdkankan/site/httpClient/address/LaserAddressSource.java
  29. 64 0
      src/main/java/com/fdkankan/site/httpClient/client/FdKKClient.java
  30. 27 0
      src/main/java/com/fdkankan/site/httpClient/client/LaserClient.java
  31. 11 0
      src/main/java/com/fdkankan/site/httpClient/request/FdkkLoginRequest.java
  32. 15 0
      src/main/java/com/fdkankan/site/httpClient/request/LaserSceneParam.java
  33. 9 0
      src/main/java/com/fdkankan/site/httpClient/response/FdkkLoginVo.java
  34. 10 0
      src/main/java/com/fdkankan/site/httpClient/response/FdkkResponse.java
  35. 94 0
      src/main/java/com/fdkankan/site/httpClient/response/FdkkScenePlus.java
  36. 129 0
      src/main/java/com/fdkankan/site/httpClient/response/FdkkScenePlusExt.java
  37. 9 0
      src/main/java/com/fdkankan/site/httpClient/response/FdkkScenePlusVo.java
  38. 25 0
      src/main/java/com/fdkankan/site/httpClient/response/FdkkUserVo.java
  39. 86 0
      src/main/java/com/fdkankan/site/interceptor/TokenInterceptor.java
  40. 18 0
      src/main/java/com/fdkankan/site/mapper/IProjectBimMapper.java
  41. 18 0
      src/main/java/com/fdkankan/site/mapper/IProjectLogMapper.java
  42. 18 0
      src/main/java/com/fdkankan/site/mapper/IProjectMapper.java
  43. 18 0
      src/main/java/com/fdkankan/site/mapper/IProjectNumMapper.java
  44. 18 0
      src/main/java/com/fdkankan/site/mapper/IProjectTeamMapper.java
  45. 12 0
      src/main/java/com/fdkankan/site/request/ProjectAddSceneParam.java
  46. 10 0
      src/main/java/com/fdkankan/site/request/ProjectListParam.java
  47. 10 0
      src/main/java/com/fdkankan/site/request/ProjectTeamListParam.java
  48. 11 0
      src/main/java/com/fdkankan/site/request/SceneNumParam.java
  49. 22 0
      src/main/java/com/fdkankan/site/request/SceneParam.java
  50. 14 0
      src/main/java/com/fdkankan/site/response/ProjectInfoVo.java
  51. 154 0
      src/main/java/com/fdkankan/site/response/SceneProEntityVo.java
  52. 24 0
      src/main/java/com/fdkankan/site/response/SceneVo.java
  53. 12 0
      src/main/java/com/fdkankan/site/response/UserData.java
  54. 16 0
      src/main/java/com/fdkankan/site/service/IProjectBimService.java
  55. 19 0
      src/main/java/com/fdkankan/site/service/IProjectLogService.java
  56. 31 0
      src/main/java/com/fdkankan/site/service/IProjectNumService.java
  57. 36 0
      src/main/java/com/fdkankan/site/service/IProjectService.java
  58. 38 0
      src/main/java/com/fdkankan/site/service/IProjectTeamService.java
  59. 17 0
      src/main/java/com/fdkankan/site/service/ISceneService.java
  60. 20 0
      src/main/java/com/fdkankan/site/service/impl/ProjectBimServiceImpl.java
  61. 28 0
      src/main/java/com/fdkankan/site/service/impl/ProjectLogServiceImpl.java
  62. 81 0
      src/main/java/com/fdkankan/site/service/impl/ProjectNumServiceImpl.java
  63. 172 0
      src/main/java/com/fdkankan/site/service/impl/ProjectServiceImpl.java
  64. 127 0
      src/main/java/com/fdkankan/site/service/impl/ProjectTeamServiceImpl.java
  65. 231 0
      src/main/java/com/fdkankan/site/service/impl/SceneServiceImpl.java
  66. 68 0
      src/main/java/com/fdkankan/site/service/impl/UploadService.java
  67. 10 11
      src/main/resources/application-local.yaml
  68. 5 0
      src/main/resources/mapper/site/ProjectBimMapper.xml
  69. 5 0
      src/main/resources/mapper/site/ProjectLogMapper.xml
  70. 5 0
      src/main/resources/mapper/site/ProjectMapper.xml
  71. 5 0
      src/main/resources/mapper/site/ProjectNumMapper.xml
  72. 5 0
      src/main/resources/mapper/site/ProjectTeamMapper.xml

+ 26 - 0
src/main/java/com/fdkankan/site/common/BaseController.java

@@ -0,0 +1,26 @@
+package com.fdkankan.site.common;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.propertyeditors.StringTrimmerEditor;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.util.Date;
+
+public class BaseController {
+
+    @Autowired
+    protected HttpServletRequest request;
+
+    @Autowired
+    protected HttpServletResponse response;
+
+
+    protected String getToken(){
+        return request.getHeader("token");
+    }
+
+}

+ 9 - 0
src/main/java/com/fdkankan/site/common/FilePath.java

@@ -0,0 +1,9 @@
+package com.fdkankan.site.common;
+
+public class FilePath {
+
+    public final static String OSS_FILE_PATH = "smart-site/file/";
+    public final static String LOCAL_FILE_PATH = "/home/smart-site/file/";
+
+
+}

+ 43 - 0
src/main/java/com/fdkankan/site/common/PageInfo.java

@@ -0,0 +1,43 @@
+package com.fdkankan.site.common;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PageInfo<T> {
+
+    private long pageNum;
+
+    private long pageSize;
+
+    private long total;
+
+    private T list;
+
+    public static PageInfo PageInfo(Page page){
+        return PageInfo.builder()
+            .pageNum(page.getCurrent())
+            .pageSize(page.getSize())
+            .total(page.getTotal())
+            .list(page.getRecords())
+            .build();
+    }
+    public static PageInfo PageInfo(Long currentPage, Long pageSize, Long total, List<?> list){
+        return PageInfo.builder()
+            .pageNum(currentPage)
+            .pageSize(pageSize)
+            .total(total)
+            .list(list)
+            .build();
+    }
+
+
+}

+ 9 - 0
src/main/java/com/fdkankan/site/common/RequestBase.java

@@ -0,0 +1,9 @@
+package com.fdkankan.site.common;
+
+import lombok.Data;
+
+@Data
+public class RequestBase {
+    private Integer pageNum = 1;
+    private Integer pageSize = 10;
+}

+ 28 - 0
src/main/java/com/fdkankan/site/common/ResultCode.java

@@ -0,0 +1,28 @@
+package com.fdkankan.site.common;
+
+public enum ResultCode {
+    SUCCESS(0,"操作成功"),
+    ERROR(-1,"操作失败"),
+
+    PARAM_MISS(4001,"参数缺少"),
+    NOT_PERM(4002,"没有权限"),
+    USER_NOT_EXIST(4003,"用户不存在"),
+    USER_NOT_LOGIN(4008,"用户未登录"),
+
+    PROJECT_CREATER_NOT_EXIST(5001,"项目创建人不存在"),
+
+    UPLOAD_ERROR(7001,"文件上传失败"),
+    UPLOAD_FILE_NO_EXIST(7002,"上传文件不存在"),
+    UPLOAD_FILE_TO_LONG(7003,"文件上传过大"),
+    UPLOAD_FILE_TYPE_ERROR(7005,"文件类型错误"),
+    UPLOAD_FILE_MSG_ERROR(7006,"文件内容错误"),
+    ;
+    public int code;
+    public String msg;
+
+    ResultCode(int code , String msg){
+        this.code = code;
+        this.msg = msg;
+    }
+
+}

+ 82 - 0
src/main/java/com/fdkankan/site/common/ResultData.java

@@ -0,0 +1,82 @@
+package com.fdkankan.site.common;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Calendar;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ResultData<T> implements Serializable {
+    /**
+     * 状态码
+     */
+    private int code;
+    /**
+     * 响应信息
+     */
+    private String message;
+    /**
+     * 后端返回结果
+     */
+    private T data;
+    /**
+     * 后端返回结果
+     */
+    private Boolean success;
+    /**
+     * 响应时间戳
+     */
+    private long timestamp = Calendar.getInstance().getTimeInMillis();
+
+    public static ResultData ok() {
+        return ok(null);
+    }
+
+    public static ResultData ok(Object data) {
+        return ok(ResultCode.SUCCESS.msg, data);
+    }
+
+    public static ResultData ok(String msg, Object data) {
+        return base(ResultCode.SUCCESS.code, msg, data, true);
+    }
+
+    public static ResultData ok(int page, int pageSize, int total, Object data) {
+        return ok(new PageInfo(page, pageSize, total, data));
+    }
+
+    public static ResultData error( String msg) {
+        return error(ResultCode.ERROR.code, msg, null);
+    }
+    public static ResultData error(int code, String msg) {
+        return error(code, msg, null);
+    }
+
+    public static ResultData error(int code, String msg, Object data) {
+        return base(code, msg, data, false);
+    }
+
+    public static ResultData error(ResultCode errorCode, Object data) {
+        return base(errorCode.code, errorCode.msg, data, false);
+    }
+
+    public static ResultData error(ResultCode errorCode) {
+        return error(errorCode.code, errorCode.msg);
+    }
+    public static String errorString(ResultCode errorCode) {
+        return JSONObject.toJSONString(error(errorCode.code, errorCode.msg));
+    }
+
+    private static ResultData base(int code, String msg, Object data, Boolean success) {
+        ResultData rd = new ResultData();
+        rd.setCode(code);
+        rd.setMessage(msg);
+        rd.setData(data);
+        rd.setSuccess(success);
+        return rd;
+    }
+}

+ 32 - 0
src/main/java/com/fdkankan/site/common/util/DateUtils.java

@@ -0,0 +1,32 @@
+package com.fdkankan.site.common.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+public class DateUtils {
+
+
+    public static Date getData(String time) {
+        try {
+            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return new Date();
+    }
+    public static String getData(Date time) {
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time);
+    }
+
+    public static Date dateAddOne(Date date,int day) {
+        Calendar calendar = new GregorianCalendar();
+        calendar.setTime(date);
+        calendar.add(calendar.DATE,day);
+        date=calendar.getTime();
+        return date;
+
+    }
+}

+ 140 - 0
src/main/java/com/fdkankan/site/common/util/JwtUtil.java

@@ -0,0 +1,140 @@
+package com.fdkankan.site.common.util;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.JwtBuilder;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+public class JwtUtil {
+
+    //生成签名的时候使用的秘钥secret
+    private static final String SECRET = "XX#$%()(#*!()!KL<><MQLMNQNQJQK&sdfkjsdrow32234545fdf>?N<:{LWPW";
+
+    /**
+     * 用户登录成功后生成Jwt
+     * 使用Hs256算法  私匙使用用户密码
+     *
+     * @param ttlMillis jwt过期时间
+     * @param userName  用户名
+     * @return
+     */
+    public static String createJWT(long ttlMillis, String userName, String loginType) {
+        //指定签名的时候使用的签名算法,也就是header那部分,jjwt已经将这部分内容封装好了。
+        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
+
+        //生成JWT的时间
+        long nowMillis = System.currentTimeMillis();
+        Date now = new Date(nowMillis);
+
+        //创建payload的私有声明(根据特定的业务需要添加,如果要拿这个做验证,一般是需要和jwt的接收方提前沟通好验证方式的)
+        Map<String, Object> claims = new HashMap<String, Object>();
+        claims.put("userName", userName);
+        claims.put("loginType", loginType);
+
+        //下面就是在为payload添加各种标准声明和私有声明了
+        //这里其实就是new一个JwtBuilder,设置jwt的body
+        JwtBuilder builder = Jwts.builder()
+                //如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
+                .setClaims(claims)
+                //设置jti(JWT ID):是JWT的唯一标识,根据业务需要,这个可以设置为一个不重复的值,主要用来作为一次性token,从而回避重放攻击。
+                .setId(UUID.randomUUID().toString())
+                //iat: jwt的签发时间
+                .setIssuedAt(now)
+                //代表这个JWT的主体,即它的所有人,这个是一个json格式的字符串,可以存放什么userid,roldid之类的,作为什么用户的唯一标志。
+                .setSubject(userName)
+                //设置签名使用的签名算法和签名使用的秘钥
+                .signWith(signatureAlgorithm, SECRET);
+
+        if (ttlMillis >= 0) {
+            long expMillis = nowMillis + ttlMillis;
+            Date exp = new Date(expMillis);
+            //设置过期时间
+            builder.setExpiration(exp);
+        }/*else{
+            //设置过期时间半小时
+            DateTime expDate = new DateTime().plusMinutes(30);
+            builder.setExpiration(expDate.toDate());
+        }*/
+        return builder.compact();
+    }
+
+
+    /**
+     * Token的解密
+     * @param token 加密后的token
+     * @return
+     */
+    public static Claims parseJWT(String token) {
+        //得到DefaultJwtParser
+        Claims claims = Jwts.parser()
+                //设置签名的秘钥
+                .setSigningKey(SECRET)
+                //设置需要解析的jwt
+                .parseClaimsJws(token).getBody();
+        return claims;
+    }
+
+
+    /**
+     * 校验token
+     * 在这里可以使用官方的校验,我这里校验的是token中携带的密码于数据库一致的话就校验通过
+     * @param token
+     * @param userName
+     * @return
+     */
+    public static Boolean isVerify(String token, String userName) {
+
+        try {
+            //得到DefaultJwtParser
+            Claims claims = Jwts.parser()
+                //设置签名的秘钥
+                .setSigningKey(SECRET)
+                //设置需要解析的jwt
+                .parseClaimsJws(token).getBody();
+
+            if (claims.get("userName").equals(userName)) {
+                return true;
+            }
+        }catch (Exception e){
+            return false;
+        }
+        return false;
+    }
+
+    /**
+     * 获得token中的信息无需secret解密也能获得
+     *
+     * @return token中包含的用户名
+     */
+    public static String getUserName(String token) {
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt.getClaim("userName").asString();
+        } catch (JWTDecodeException e) {
+            return null;
+        }
+    }
+    /**
+     * 获得token中的信息无需secret解密也能获得
+     *
+     * @return token中包含的用户名
+     */
+    public static String getLoginType(String token) {
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt.getClaim("loginType").asString();
+        } catch (JWTDecodeException e) {
+            return null;
+        }
+    }
+
+
+}

+ 208 - 0
src/main/java/com/fdkankan/site/common/util/UploadToOssUtil.java

@@ -0,0 +1,208 @@
+package com.fdkankan.site.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;
+
+
+
+
+	/**
+	 * 获取文件内容-阿里云
+	 * @param objectName
+	 * @return
+	 */
+	public boolean existKey(String objectName){
+		//创建oss客户端
+		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 {
+			GetObjectRequest request  = new 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){
+		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);
+			}
+		}
+	}
+}

+ 20 - 0
src/main/java/com/fdkankan/site/common/util/VUtils.java

@@ -0,0 +1,20 @@
+package com.fdkankan.site.common.util;
+
+import com.fdkankan.site.exception.BusinessException;
+import com.fdkankan.site.exception.ThrowExceptionFunction;
+
+public class VUtils {
+    /**
+     *  如果参数为true抛出异常
+     *
+     */
+    public static ThrowExceptionFunction isTure(boolean b){
+
+        return (errorMessage) -> {
+            if (b){
+                throw new BusinessException(errorMessage);
+            }
+        };
+    }
+
+}

+ 22 - 0
src/main/java/com/fdkankan/site/config/MybatisPlusPageConfig.java

@@ -0,0 +1,22 @@
+package com.fdkankan.site.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+public class MybatisPlusPageConfig {
+
+    /**
+     * mybatisPlus配置分页插件
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+}

+ 30 - 0
src/main/java/com/fdkankan/site/config/WebAppConfig.java

@@ -0,0 +1,30 @@
+package com.fdkankan.site.config;
+
+import com.fdkankan.site.interceptor.TokenInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+
+@Configuration
+public class WebAppConfig implements WebMvcConfigurer {
+
+	@Autowired
+	TokenInterceptor tokenInterceptor;
+
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+		registry.addInterceptor(tokenInterceptor).addPathPatterns("/**")
+				.excludePathPatterns("/test/**");
+		WebMvcConfigurer.super.addInterceptors(registry);
+	}
+
+	@Override
+	public void addResourceHandlers(ResourceHandlerRegistry registry) {
+		WebMvcConfigurer.super.addResourceHandlers(registry);
+	}
+
+}
+

+ 57 - 0
src/main/java/com/fdkankan/site/controller/ProjectController.java

@@ -0,0 +1,57 @@
+package com.fdkankan.site.controller;
+
+
+import com.fdkankan.site.common.BaseController;
+import com.fdkankan.site.common.ResultData;
+import com.fdkankan.site.common.util.JwtUtil;
+import com.fdkankan.site.common.util.VUtils;
+import com.fdkankan.site.entity.Project;
+import com.fdkankan.site.request.ProjectAddSceneParam;
+import com.fdkankan.site.request.ProjectListParam;
+import com.fdkankan.site.service.IProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+@RestController
+@RequestMapping("/project")
+public class ProjectController extends BaseController {
+
+    @Autowired
+    IProjectService projectService;
+
+    @GetMapping("/userData")
+    public ResultData userData(){
+        return ResultData.ok(projectService.getUserData(getToken()));
+    }
+
+    @GetMapping("/info")
+    public ResultData info(@RequestParam(required = false) Integer projectId){
+        return ResultData.ok(projectService.getProjectInfo(projectId));
+    }
+
+    @PostMapping("/list")
+    public ResultData list(@RequestBody ProjectListParam param){
+        return ResultData.ok(projectService.pageList(param,getToken()));
+    }
+
+    @PostMapping("/add")
+    public ResultData addProject(@RequestBody Project param){
+        return ResultData.ok( projectService.addProject(param,getToken()));
+    }
+
+    @PostMapping("/addScene")
+    public ResultData addScene(@RequestBody ProjectAddSceneParam param){
+        projectService.addScene(param);
+        return ResultData.ok( );
+    }
+
+}
+

+ 35 - 0
src/main/java/com/fdkankan/site/controller/ProjectLogController.java

@@ -0,0 +1,35 @@
+package com.fdkankan.site.controller;
+
+
+import com.fdkankan.site.common.RequestBase;
+import com.fdkankan.site.common.ResultData;
+import com.fdkankan.site.request.SceneParam;
+import com.fdkankan.site.service.IProjectLogService;
+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.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+@RestController
+@RequestMapping("/projectLog")
+public class ProjectLogController {
+
+    @Autowired
+    IProjectLogService projectLogService;
+
+    @PostMapping("/list")
+    public ResultData list(@RequestBody RequestBase param){
+        return ResultData.ok(projectLogService.pageList(param));
+    }
+}
+

+ 56 - 0
src/main/java/com/fdkankan/site/controller/ProjectTeamController.java

@@ -0,0 +1,56 @@
+package com.fdkankan.site.controller;
+
+
+import com.fdkankan.site.common.BaseController;
+import com.fdkankan.site.common.ResultCode;
+import com.fdkankan.site.common.ResultData;
+import com.fdkankan.site.common.util.VUtils;
+import com.fdkankan.site.entity.ProjectTeam;
+import com.fdkankan.site.request.ProjectTeamListParam;
+import com.fdkankan.site.service.IProjectTeamService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+@RestController
+@RequestMapping("/projectTeam")
+public class ProjectTeamController extends BaseController {
+
+    @Autowired
+    IProjectTeamService projectTeamService;
+
+    @PostMapping("/list")
+    public ResultData list (@RequestBody ProjectTeamListParam param){
+        return ResultData.ok(projectTeamService.pageList(param));
+    }
+
+    @GetMapping("/checkUserName")
+    public ResultData checkUserName (@RequestParam(required = false) String userName){
+        VUtils.isTure(!projectTeamService.checkUserName(userName)).throwMessage(ResultCode.USER_NOT_EXIST);
+        return ResultData.ok();
+    }
+
+    @PostMapping("/addUser")
+    public ResultData addUser (@RequestBody ProjectTeam param){
+        return ResultData.ok(projectTeamService.addUser(param,getToken()));
+    }
+
+    @PostMapping("/deleteUser")
+    public ResultData deleteUser (@RequestBody ProjectTeam param){
+        projectTeamService.deleteUser(param,getToken());
+        return ResultData.ok();
+    }
+    @PostMapping("/updateRemark")
+    public ResultData updateRemark (@RequestBody ProjectTeam param){
+        projectTeamService.updateRemark(param);
+        return ResultData.ok();
+    }
+}
+

+ 24 - 0
src/main/java/com/fdkankan/site/controller/SceneController.java

@@ -0,0 +1,24 @@
+package com.fdkankan.site.controller;
+
+import com.fdkankan.site.common.BaseController;
+import com.fdkankan.site.common.ResultData;
+import com.fdkankan.site.request.SceneParam;
+import com.fdkankan.site.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.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/scene")
+public class SceneController extends BaseController {
+
+    @Autowired
+    ISceneService sceneService;
+
+    @PostMapping("/list")
+    public ResultData list(@RequestBody SceneParam param){
+        return ResultData.ok(sceneService.pageList(param,getToken()));
+    }
+}

+ 53 - 0
src/main/java/com/fdkankan/site/controller/UploadController.java

@@ -0,0 +1,53 @@
+package com.fdkankan.site.controller;
+
+import com.fdkankan.site.common.FilePath;
+import com.fdkankan.site.common.ResultCode;
+import com.fdkankan.site.common.ResultData;
+import com.fdkankan.site.common.util.UploadToOssUtil;
+import com.fdkankan.site.entity.ProjectBim;
+import com.fdkankan.site.exception.BusinessException;
+import com.fdkankan.site.service.IProjectBimService;
+import com.fdkankan.site.service.impl.UploadService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.File;
+
+@RestController
+@RequestMapping("/upload")
+public class UploadController {
+
+    @Autowired
+    UploadService uploadService;
+
+    @Resource
+    private UploadToOssUtil uploadToOssUtil;
+    @Value("${upload.query-path}")
+    private String queryPath;
+    @Autowired
+    private IProjectBimService projectBimService;
+
+
+    @PostMapping("/file")
+    public ResultData file(@RequestParam(required = false) MultipartFile file)  {
+        File localFile = uploadService.uploadFile(file);
+        uploadToOssUtil.uploadOss(localFile.getPath(), FilePath.OSS_FILE_PATH + localFile.getName());
+        localFile.delete();
+        return ResultData.ok(queryPath + FilePath.OSS_FILE_PATH + localFile.getName() );
+    }
+
+    @PostMapping("/bim")
+    public ResultData bim(@RequestParam(required = false) MultipartFile file)  {
+        File localFile = uploadService.uploadFile(file);
+        ProjectBim projectBim = new ProjectBim();
+        projectBim.setBimLocalFilePath(localFile.getPath());
+        projectBimService.save(projectBim);
+        return ResultData.ok(projectBim );
+    }
+}

+ 72 - 0
src/main/java/com/fdkankan/site/entity/Project.java

@@ -0,0 +1,72 @@
+package com.fdkankan.site.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;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+@Getter
+@Setter
+@TableName("t_project")
+public class Project implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 项目表id
+     */
+    @TableId(value = "project_id", type = IdType.AUTO)
+    private Integer projectId;
+
+    /**
+     * 项目名称
+     */
+    @TableField("project_name")
+    private String projectName;
+
+    /**
+     * 项目描述
+     */
+    @TableField("project_msg")
+    private String projectMsg;
+
+    /**
+     * 项目封面
+     */
+    @TableField("project_img")
+    private String projectImg;
+
+    @TableField("bim_id")
+    private Integer bimId;
+
+    /**
+     * 项目状态0进行中,1已完成
+     */
+    @TableField("project_status")
+    private Integer projectStatus;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 65 - 0
src/main/java/com/fdkankan/site/entity/ProjectBim.java

@@ -0,0 +1,65 @@
+package com.fdkankan.site.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;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+@Getter
+@Setter
+@TableName("t_project_bim")
+public class ProjectBim implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * bim文件id
+     */
+    @TableId(value = "bim_id", type = IdType.AUTO)
+    private Integer bimId;
+
+    /**
+     * bim名称
+     */
+    @TableField("bim_name")
+    private String bimName;
+
+    /**
+     * bim文件路径
+     */
+    @TableField("bim_file_path")
+    private String bimFilePath;
+    /**
+     * bim文件路径
+     */
+    @TableField("bim_local_file_path")
+    private String bimLocalFilePath;
+
+    @TableField("bim_status")
+    private Integer bimStatus;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 56 - 0
src/main/java/com/fdkankan/site/entity/ProjectLog.java

@@ -0,0 +1,56 @@
+package com.fdkankan.site.entity;
+
+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;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+@Getter
+@Setter
+@TableName("t_project_log")
+public class ProjectLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId("log_id")
+    private Integer logId;
+
+    @TableField("project_id")
+    private Integer projectId;
+
+    /**
+     * 内容
+     */
+    @TableField("log_msg")
+    private String logMsg;
+
+    /**
+     * 四维看看账号
+     */
+    @TableField("user_name")
+    private String userName;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 54 - 0
src/main/java/com/fdkankan/site/entity/ProjectNum.java

@@ -0,0 +1,54 @@
+package com.fdkankan.site.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;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+@Getter
+@Setter
+@TableName("t_project_num")
+public class ProjectNum implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "num_id", type = IdType.AUTO)
+    private Integer numId;
+
+    @TableField("project_id")
+    private Integer projectId;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    @TableField("type")
+    private Integer type;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 63 - 0
src/main/java/com/fdkankan/site/entity/ProjectTeam.java

@@ -0,0 +1,63 @@
+package com.fdkankan.site.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;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+@Getter
+@Setter
+@TableName("t_project_team")
+public class ProjectTeam implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "team_id", type = IdType.AUTO)
+    private Integer teamId;
+
+    @TableField("project_id")
+    private Integer projectId;
+
+    /**
+     * 账号
+     */
+    @TableField("user_name")
+    private String userName;
+
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+
+    /**
+     * 是否创建者,0否,1是
+     */
+    @TableField("is_creater")
+    private Integer isCreater;
+
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 22 - 0
src/main/java/com/fdkankan/site/exception/BusinessException.java

@@ -0,0 +1,22 @@
+package com.fdkankan.site.exception;
+
+import com.fdkankan.site.common.ResultCode;
+import lombok.Data;
+
+/**
+ * 自定义业务异常类
+ */
+@Data
+public class BusinessException extends RuntimeException {
+    private int code;
+    private String message;
+
+    public BusinessException(Integer code, String msg){
+        this.code = code;
+        this.message = msg;
+    }
+    public BusinessException(ResultCode errorCode) {
+        this.code = errorCode.code;
+        this.message = errorCode.msg;
+    }
+}

+ 35 - 0
src/main/java/com/fdkankan/site/exception/GlobalExceptionHandler.java

@@ -0,0 +1,35 @@
+package com.fdkankan.site.exception;
+
+import com.fdkankan.site.common.ResultData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * 全局异常处理器
+ */
+@RestControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+
+    /**
+     * 处理未知异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = Exception.class)
+    public ResultData exceptionHandler(Exception e) throws Exception {
+        log.error("服务错误:", e);
+        return ResultData.error( 500, e.getMessage());
+    }
+
+    /**
+     * 处理业务异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = BusinessException.class)
+    public ResultData businessExceptionHandler(BusinessException e) {
+        log.info("业务异常code:{},message:{}", e.getCode(), e.getMessage());
+        return ResultData.error(e.getCode(), e.getMessage());
+    }
+}

+ 9 - 0
src/main/java/com/fdkankan/site/exception/ThrowExceptionFunction.java

@@ -0,0 +1,9 @@
+package com.fdkankan.site.exception;
+
+import com.fdkankan.site.common.ResultCode;
+
+@FunctionalInterface
+public interface ThrowExceptionFunction {
+
+    void throwMessage(ResultCode errorCode);
+}

+ 4 - 4
src/main/java/com/fdkankan/site/generate/AutoGenerate.java

@@ -17,8 +17,8 @@ public class AutoGenerate {
 
         String path =System.getProperty("user.dir") ;
 
-        generate(path,"tk", getTables(new String[]{
-                "t_tencent_yun",
+        generate(path,"site", getTables(new String[]{
+                "t_project","t_project_num","t_project_bim","t_project_log","t_project_team",
         }));
 
 //        generate(path,"goods", getTables(new String[]{
@@ -46,8 +46,8 @@ public class AutoGenerate {
 
 
     public static void  generate(String path,String moduleName,  List<String> tables){
-        FastAutoGenerator.create("jdbc:mysql://120.24.144.164:3306/4dkankan_takelook",
-                "root","4Dage@4Dage#@168")
+        FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/fd_smart_site",
+                "root","123456")
                 .globalConfig(builder -> {
                     builder.author("")               //作者
                             .outputDir(path+"\\src\\main\\java")    //输出路径(写到java目录)

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

@@ -0,0 +1,22 @@
+package com.fdkankan.site.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);
+    }
+}

+ 22 - 0
src/main/java/com/fdkankan/site/httpClient/address/LaserAddressSource.java

@@ -0,0 +1,22 @@
+package com.fdkankan.site.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 LaserAddressSource implements AddressSource {
+
+    @Value("${4dkk.laserService.basePath}")
+    private String basePath;
+
+    @Value("${4dkk.laserService.port}")
+    private String port;
+
+    @Override
+    public ForestAddress getAddress(ForestRequest forestRequest) {
+        return new ForestAddress("","",Integer.valueOf(port),basePath);
+    }
+}

+ 64 - 0
src/main/java/com/fdkankan/site/httpClient/client/FdKKClient.java

@@ -0,0 +1,64 @@
+package com.fdkankan.site.httpClient.client;
+
+import com.alibaba.fastjson.JSONObject;
+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.site.httpClient.address.FdkkAddressSource;
+import com.fdkankan.site.httpClient.request.FdkkLoginRequest;
+import com.fdkankan.site.httpClient.response.FdkkLoginVo;
+import com.fdkankan.site.httpClient.response.FdkkResponse;
+import com.fdkankan.site.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);
+    /**
+     * 校验用户名
+     */
+    @Post("/api/sso/user/checkUser")
+    FdkkResponse checkUser(@JSONBody FdkkLoginRequest fdkkLoginRequest);
+    /**
+     * 校验token
+     */
+    @Post("/api/user/checkToken")
+    FdkkResponse checkToken(@Header("token")  String token);
+
+    /**
+     * 获取用户详情
+     */
+    @Post("/api/user/getUserInfo")
+    FdkkResponse getUserInfo(@JSONBody JSONObject jsonObject, @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);
+    /**
+     * 获取用户场景数量
+     */
+    @Post("/api/user/scene/findSceneNumber")
+    JSONObject findSceneNumber(@JSONBody JSONObject jsonObject,@Header("token") String token);
+
+
+}

+ 27 - 0
src/main/java/com/fdkankan/site/httpClient/client/LaserClient.java

@@ -0,0 +1,27 @@
+package com.fdkankan.site.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.site.httpClient.address.LaserAddressSource;
+import com.fdkankan.site.httpClient.request.LaserSceneParam;
+import com.fdkankan.site.httpClient.response.FdkkResponse;
+
+/**
+ * 获取,调用laser服务
+ */
+@Address(source = LaserAddressSource.class)
+public interface LaserClient {
+
+    /**
+     * 获取深时场景数据
+     */
+    @Post("/laser/4dage/sceneList")
+    FdkkResponse sceneList(@JSONBody LaserSceneParam param, @Header("fdToken") String token);
+    /**
+     * 获取深时场景数据
+     */
+    @Post("/laser/4dage/managerSceneList")
+    FdkkResponse sceneList(@JSONBody LaserSceneParam param);
+}

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

@@ -0,0 +1,11 @@
+package com.fdkankan.site.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/site/httpClient/request/LaserSceneParam.java

@@ -0,0 +1,15 @@
+package com.fdkankan.site.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;
+}

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

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

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

@@ -0,0 +1,10 @@
+package com.fdkankan.site.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/site/httpClient/response/FdkkScenePlus.java

@@ -0,0 +1,94 @@
+package com.fdkankan.site.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/site/httpClient/response/FdkkScenePlusExt.java

@@ -0,0 +1,129 @@
+package com.fdkankan.site.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/site/httpClient/response/FdkkScenePlusVo.java

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

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

@@ -0,0 +1,25 @@
+package com.fdkankan.site.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;
+
+}

+ 86 - 0
src/main/java/com/fdkankan/site/interceptor/TokenInterceptor.java

@@ -0,0 +1,86 @@
+package com.fdkankan.site.interceptor;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.site.common.ResultCode;
+import com.fdkankan.site.common.ResultData;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.tomcat.util.http.MimeHeaders;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.lang.reflect.Field;
+
+@Component
+@Slf4j
+public class TokenInterceptor implements HandlerInterceptor {
+
+	@Autowired
+	private RedisUtil redisUtil;
+
+	@Override
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+		response.setContentType("text/html;charset=UTF-8");
+		if( request.getMethod().equals("GET")){
+			return true;
+		}
+		String token = request.getHeader("token");
+		if(StringUtils.isEmpty(token)){
+			this.needLogin(request,response);
+			return false;
+		}
+		try {
+			String fdToken = String.format(RedisKey.TOKEN_V3,token);
+			if( redisUtil.hasKey(fdToken)){
+				redisUtil.expire(fdToken,6 * 60 * 60);
+				return true;
+			}
+		}catch (Exception e){
+			e.printStackTrace();
+		}
+		this.needLogin(request,response);
+		return false;
+	}
+
+	private void needLogin(HttpServletRequest request, HttpServletResponse response) {
+		try {
+			String result = JSONObject.toJSONString(ResultData.error(ResultCode.USER_NOT_LOGIN));
+			response.getWriter().append(result);
+		} catch (IOException e) {
+			log.info("LoginInterceptor|needLogin|IOException|" + e);
+			e.printStackTrace();
+		}
+	}
+
+
+	/**
+	 * 修改header信息,key-value键值对儿加入到header中
+	 */
+	private void reflectSetparam(HttpServletRequest request,String key,String value){
+		Class<? extends HttpServletRequest> requestClass = request.getClass();
+		System.out.println("request实现类="+requestClass.getName());
+		try {
+			Field request1 = requestClass.getDeclaredField("request");
+			request1.setAccessible(true);
+			Object o = request1.get(request);
+			Field coyoteRequest = o.getClass().getDeclaredField("coyoteRequest");
+			coyoteRequest.setAccessible(true);
+			Object o1 = coyoteRequest.get(o);
+			System.out.println("coyoteRequest实现类="+o1.getClass().getName());
+			Field headers = o1.getClass().getDeclaredField("headers");
+			headers.setAccessible(true);
+			MimeHeaders o2 = (MimeHeaders)headers.get(o1);
+			o2.addValue(key).setString(value);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
+

+ 18 - 0
src/main/java/com/fdkankan/site/mapper/IProjectBimMapper.java

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

+ 18 - 0
src/main/java/com/fdkankan/site/mapper/IProjectLogMapper.java

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

+ 18 - 0
src/main/java/com/fdkankan/site/mapper/IProjectMapper.java

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

+ 18 - 0
src/main/java/com/fdkankan/site/mapper/IProjectNumMapper.java

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

+ 18 - 0
src/main/java/com/fdkankan/site/mapper/IProjectTeamMapper.java

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

+ 12 - 0
src/main/java/com/fdkankan/site/request/ProjectAddSceneParam.java

@@ -0,0 +1,12 @@
+package com.fdkankan.site.request;
+
+import com.fdkankan.site.common.RequestBase;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ProjectAddSceneParam extends RequestBase {
+    private Integer projectId;
+    private List<SceneNumParam> sceneNumParam;
+}

+ 10 - 0
src/main/java/com/fdkankan/site/request/ProjectListParam.java

@@ -0,0 +1,10 @@
+package com.fdkankan.site.request;
+
+import com.dtflys.forest.annotation.BaseRequest;
+import com.fdkankan.site.common.RequestBase;
+import lombok.Data;
+
+@Data
+public class ProjectListParam extends RequestBase {
+
+}

+ 10 - 0
src/main/java/com/fdkankan/site/request/ProjectTeamListParam.java

@@ -0,0 +1,10 @@
+package com.fdkankan.site.request;
+
+import com.fdkankan.site.common.RequestBase;
+import lombok.Data;
+
+@Data
+public class ProjectTeamListParam extends RequestBase {
+    private String userName;
+    private Integer projectId;
+}

+ 11 - 0
src/main/java/com/fdkankan/site/request/SceneNumParam.java

@@ -0,0 +1,11 @@
+package com.fdkankan.site.request;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SceneNumParam {
+    private Integer type;
+    private List<String> numList;
+}

+ 22 - 0
src/main/java/com/fdkankan/site/request/SceneParam.java

@@ -0,0 +1,22 @@
+package com.fdkankan.site.request;
+
+import com.fdkankan.site.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; //
+
+    private Integer haveVoid = 0;
+
+    public String getSceneName() {
+        return sceneName== null ?null :sceneName.trim();
+    }
+
+}

+ 14 - 0
src/main/java/com/fdkankan/site/response/ProjectInfoVo.java

@@ -0,0 +1,14 @@
+package com.fdkankan.site.response;
+
+import com.fdkankan.site.entity.Project;
+import com.fdkankan.site.entity.ProjectBim;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ProjectInfoVo extends Project {
+    private List<SceneVo> sceneList;
+    private ProjectBim bimData;
+
+}

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

@@ -0,0 +1,154 @@
+package com.fdkankan.site.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/site/response/SceneVo.java

@@ -0,0 +1,24 @@
+package com.fdkankan.site.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;
+}

+ 12 - 0
src/main/java/com/fdkankan/site/response/UserData.java

@@ -0,0 +1,12 @@
+package com.fdkankan.site.response;
+
+import lombok.Data;
+
+@Data
+public class UserData {
+    private Long projectCount = 0L;             //项目数量
+    private Long projectFileCount = 0L;         //项目文件数量
+    private Long projectSceneCount = 0L;        //项目场景数量
+    private Long projectOverCount = 0L;         //完成项目数量
+
+}

+ 16 - 0
src/main/java/com/fdkankan/site/service/IProjectBimService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.site.service;
+
+import com.fdkankan.site.entity.ProjectBim;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+public interface IProjectBimService extends IService<ProjectBim> {
+
+}

+ 19 - 0
src/main/java/com/fdkankan/site/service/IProjectLogService.java

@@ -0,0 +1,19 @@
+package com.fdkankan.site.service;
+
+import com.fdkankan.site.common.PageInfo;
+import com.fdkankan.site.common.RequestBase;
+import com.fdkankan.site.entity.ProjectLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+public interface IProjectLogService extends IService<ProjectLog> {
+
+    PageInfo pageList(RequestBase param);
+}

+ 31 - 0
src/main/java/com/fdkankan/site/service/IProjectNumService.java

@@ -0,0 +1,31 @@
+package com.fdkankan.site.service;
+
+import com.fdkankan.site.entity.ProjectNum;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+public interface IProjectNumService extends IService<ProjectNum> {
+
+    /**
+     * 获取项目场景关系
+     * @param projectIds  项目id
+     */
+    List<ProjectNum> getListByProjectIds(Set<Integer> projectIds);
+
+    HashMap<Integer, List<String>> getTypeMap(List<ProjectNum> projectNums);
+
+    void delByNumList(Integer projectId, List<String> delNumList);
+
+    void addByNumList(Integer projectId, HashMap<String, Integer> numType, List<String> addNumList);
+}

+ 36 - 0
src/main/java/com/fdkankan/site/service/IProjectService.java

@@ -0,0 +1,36 @@
+package com.fdkankan.site.service;
+
+import com.fdkankan.site.entity.Project;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.site.entity.ProjectBim;
+import com.fdkankan.site.request.ProjectAddSceneParam;
+import com.fdkankan.site.request.ProjectListParam;
+import com.fdkankan.site.response.ProjectInfoVo;
+import com.fdkankan.site.response.SceneVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+public interface IProjectService extends IService<Project> {
+
+    Object getUserData(String token);
+
+    Object pageList(ProjectListParam param, String token);
+
+    ProjectInfoVo getProjectInfo(Integer projectId);
+
+    List<SceneVo> getSceneList(Integer projectId);
+
+    ProjectBim getBimInfo(Integer projectId);
+
+    Project addProject(Project param, String token);
+
+    void addScene(ProjectAddSceneParam param);
+}

+ 38 - 0
src/main/java/com/fdkankan/site/service/IProjectTeamService.java

@@ -0,0 +1,38 @@
+package com.fdkankan.site.service;
+
+import com.fdkankan.site.entity.ProjectTeam;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.site.request.ProjectTeamListParam;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+public interface IProjectTeamService extends IService<ProjectTeam> {
+
+    /**
+     * 查询用户项目
+     * @param userName 四维看看账号
+     */
+    List<ProjectTeam> getListByUserName(String userName);
+
+    void addProject(Integer projectId, String token);
+
+    Object pageList(ProjectTeamListParam param);
+
+    Object addUser(ProjectTeam param, String token);
+
+    ProjectTeam getProjectCreater(Integer projectId);
+
+    Boolean checkUserName(String userName);
+
+    void deleteUser(ProjectTeam param, String token);
+
+    void updateRemark(ProjectTeam param);
+}

+ 17 - 0
src/main/java/com/fdkankan/site/service/ISceneService.java

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

+ 20 - 0
src/main/java/com/fdkankan/site/service/impl/ProjectBimServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.site.service.impl;
+
+import com.fdkankan.site.entity.ProjectBim;
+import com.fdkankan.site.mapper.IProjectBimMapper;
+import com.fdkankan.site.service.IProjectBimService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+@Service
+public class ProjectBimServiceImpl extends ServiceImpl<IProjectBimMapper, ProjectBim> implements IProjectBimService {
+
+}

+ 28 - 0
src/main/java/com/fdkankan/site/service/impl/ProjectLogServiceImpl.java

@@ -0,0 +1,28 @@
+package com.fdkankan.site.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.site.common.PageInfo;
+import com.fdkankan.site.common.RequestBase;
+import com.fdkankan.site.entity.ProjectLog;
+import com.fdkankan.site.mapper.IProjectLogMapper;
+import com.fdkankan.site.service.IProjectLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+@Service
+public class ProjectLogServiceImpl extends ServiceImpl<IProjectLogMapper, ProjectLog> implements IProjectLogService {
+
+    @Override
+    public PageInfo pageList(RequestBase param) {
+        Page<ProjectLog> page = this.page(new Page<>(param.getPageNum(), param.getPageSize()));
+        return PageInfo.PageInfo(page);
+    }
+}

+ 81 - 0
src/main/java/com/fdkankan/site/service/impl/ProjectNumServiceImpl.java

@@ -0,0 +1,81 @@
+package com.fdkankan.site.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.site.entity.ProjectNum;
+import com.fdkankan.site.mapper.IProjectNumMapper;
+import com.fdkankan.site.service.IProjectNumService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+@Service
+public class ProjectNumServiceImpl extends ServiceImpl<IProjectNumMapper, ProjectNum> implements IProjectNumService {
+
+    @Override
+    public List<ProjectNum> getListByProjectIds(Set<Integer> projectIds) {
+        if(projectIds == null || projectIds.size() <=0){
+            return new ArrayList<>();
+        }
+        LambdaQueryWrapper<ProjectNum> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(ProjectNum::getProjectId,projectIds);
+        return this.list(wrapper);
+    }
+
+    @Override
+    public HashMap<Integer, List<String>> getTypeMap(List<ProjectNum> projectNums) {
+        HashMap<Integer,List<String>> typeMap = new HashMap<>();
+        for (ProjectNum projectNum : projectNums) {
+            List<String> numList ;
+            if(typeMap.get(projectNum.getType()) == null){
+                numList = new ArrayList<>();
+            }else {
+                numList = typeMap.get(projectNum.getType());
+            }
+            numList.add(projectNum.getNum());
+            typeMap.put(projectNum.getType(),numList);
+        }
+        return typeMap;
+    }
+
+    @Override
+    public void delByNumList(Integer projectId, List<String> delNumList) {
+        if(delNumList.size() >0){
+            LambdaQueryWrapper<ProjectNum> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(ProjectNum::getProjectId,projectId);
+            wrapper.in(ProjectNum::getNum,delNumList);
+            this.remove(wrapper);
+        }
+    }
+
+    @Override
+    public void addByNumList(Integer projectId, HashMap<String, Integer> numType, List<String> addNumList) {
+        List<ProjectNum> list = new ArrayList<>();
+        for (String num : addNumList) {
+            ProjectNum projectNum = new ProjectNum();
+            projectNum.setProjectId(projectId);
+            projectNum.setNum(num);
+            projectNum.setType(numType.get(num));
+            list.add(projectNum);
+        }
+
+        if(list.size() >0){
+            this.saveBatch(list);
+        }
+
+    }
+}

+ 172 - 0
src/main/java/com/fdkankan/site/service/impl/ProjectServiceImpl.java

@@ -0,0 +1,172 @@
+package com.fdkankan.site.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.site.common.PageInfo;
+import com.fdkankan.site.common.ResultCode;
+import com.fdkankan.site.common.util.JwtUtil;
+import com.fdkankan.site.common.util.VUtils;
+import com.fdkankan.site.entity.Project;
+import com.fdkankan.site.entity.ProjectBim;
+import com.fdkankan.site.entity.ProjectNum;
+import com.fdkankan.site.entity.ProjectTeam;
+import com.fdkankan.site.exception.BusinessException;
+import com.fdkankan.site.httpClient.client.FdKKClient;
+import com.fdkankan.site.httpClient.response.FdkkResponse;
+import com.fdkankan.site.mapper.IProjectMapper;
+import com.fdkankan.site.request.ProjectAddSceneParam;
+import com.fdkankan.site.request.ProjectListParam;
+import com.fdkankan.site.request.SceneNumParam;
+import com.fdkankan.site.response.ProjectInfoVo;
+import com.fdkankan.site.response.SceneVo;
+import com.fdkankan.site.response.UserData;
+import com.fdkankan.site.service.*;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+@Service
+public class ProjectServiceImpl extends ServiceImpl<IProjectMapper, Project> implements IProjectService {
+
+    @Autowired
+    IProjectNumService projectNumService;
+    @Autowired
+    IProjectTeamService projectTeamService;
+    @Autowired
+    IProjectBimService projectBimService;
+    @Autowired
+    ISceneService sceneService;
+
+    @Override
+    public Object getUserData(String token) {
+        UserData userData = new UserData();
+
+        String userName = JwtUtil.getUserName(token);
+        List<ProjectTeam> teamList = projectTeamService.getListByUserName(userName);
+        Set<Integer> projectIds = teamList.parallelStream().map(ProjectTeam::getProjectId).collect(Collectors.toSet());
+        List<ProjectNum> numList = projectNumService.getListByProjectIds(projectIds);
+        long count = 0L;
+        if(projectIds.size() >0){
+            LambdaQueryWrapper<Project> wrapper = new LambdaQueryWrapper<>();
+            wrapper.in(Project::getProjectId,projectIds);
+            wrapper.eq(Project::getProjectStatus,1);
+             count = this.count(wrapper);
+        }
+
+        userData.setProjectCount((long) projectIds.size());
+        userData.setProjectSceneCount((long) numList.size());
+        userData.setProjectOverCount(count);
+        return userData;
+    }
+
+    @Override
+    public Object pageList(ProjectListParam param, String token) {
+        LambdaQueryWrapper<Project> wrapper = new LambdaQueryWrapper<>();
+        wrapper.orderByDesc(Project::getCreateTime);
+
+        Page<Project> page = this.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
+
+        return PageInfo.PageInfo(page);
+    }
+
+    @Override
+    public ProjectInfoVo getProjectInfo(Integer projectId) {
+        Project project = this.getById(projectId);
+        VUtils.isTure(project == null).throwMessage(ResultCode.PARAM_MISS);
+        ProjectInfoVo infoVo = new ProjectInfoVo();
+        BeanUtils.copyProperties(project,infoVo);
+        infoVo.setSceneList(this.getSceneList(projectId));
+        infoVo.setBimData(this.getBimInfo(projectId));
+        return infoVo;
+    }
+
+    @Override
+    public List<SceneVo> getSceneList(Integer projectId) {
+        Set<Integer> projectIds = new HashSet<>(Arrays.asList(projectId));
+        List<ProjectNum> projectNums = projectNumService.getListByProjectIds(projectIds);
+
+        HashMap<Integer,List<String>> typeMap = projectNumService.getTypeMap(projectNums);
+        List<SceneVo> list = new ArrayList<>();
+        if(typeMap.size() >0){
+            list = sceneService.getListByNumMap(typeMap);
+        }
+        return list;
+    }
+
+    @Override
+    public ProjectBim getBimInfo(Integer projectId) {
+        return projectBimService.getById(projectId);
+    }
+
+    @Override
+    public Project addProject(Project param, String token) {
+        VUtils.isTure(StringUtils.isBlank(param.getProjectName()) ).throwMessage(ResultCode.PARAM_MISS);
+        Project project = new Project();
+        BeanUtils.copyProperties(param,project);
+        this.save(project);
+        if(param.getBimId() != null){
+            //todo 调用生成bim
+        }
+        projectTeamService.addProject(project.getProjectId(),token);
+        return project;
+    }
+
+    @Override
+    public void addScene(ProjectAddSceneParam param) {
+        Project project = this.getById(param.getProjectId());
+        VUtils.isTure(project == null).throwMessage(ResultCode.PARAM_MISS);
+
+        Set<Integer> projectIds = new HashSet<>(Arrays.asList(param.getProjectId()));
+        List<ProjectNum> projectNums = projectNumService.getListByProjectIds(projectIds);
+        List<String> hasNumList = projectNums.stream().map(ProjectNum::getNum).collect(Collectors.toList());
+
+        List<String> paramNumList = new ArrayList<>();
+        HashMap<String, Integer> numType = new HashMap<>();
+        List<SceneNumParam> sceneNumParam = param.getSceneNumParam();
+        for (SceneNumParam numParam : sceneNumParam) {
+            if(numParam.getNumList() == null || numParam.getNumList().size() <=0){
+                continue;
+            }
+            for (String num : numParam.getNumList()) {
+                numType.put(num,numParam.getType());
+            }
+            paramNumList.addAll(numParam.getNumList());
+        }
+        List<String> delNumList = new ArrayList<>();
+        for (String num : hasNumList) {
+            if(!paramNumList.contains(num)){
+                delNumList.add(num);
+            }
+        }
+        List<String> addNumList = new ArrayList<>();
+        for (String num : paramNumList) {
+            if(!hasNumList.contains(num)){
+                addNumList.add(num);
+            }
+        }
+
+        if(delNumList.size() >0){
+            projectNumService.delByNumList(param.getProjectId(),delNumList);
+        }
+        if(addNumList.size() >0){
+            projectNumService.addByNumList(param.getProjectId(),numType,addNumList);
+        }
+
+
+    }
+}

+ 127 - 0
src/main/java/com/fdkankan/site/service/impl/ProjectTeamServiceImpl.java

@@ -0,0 +1,127 @@
+package com.fdkankan.site.service.impl;
+
+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.site.common.PageInfo;
+import com.fdkankan.site.common.ResultCode;
+import com.fdkankan.site.common.util.JwtUtil;
+import com.fdkankan.site.common.util.VUtils;
+import com.fdkankan.site.entity.Project;
+import com.fdkankan.site.entity.ProjectTeam;
+import com.fdkankan.site.httpClient.client.FdKKClient;
+import com.fdkankan.site.httpClient.request.FdkkLoginRequest;
+import com.fdkankan.site.httpClient.response.FdkkResponse;
+import com.fdkankan.site.mapper.IProjectTeamMapper;
+import com.fdkankan.site.request.ProjectTeamListParam;
+import com.fdkankan.site.service.IProjectTeamService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.catalina.User;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-10
+ */
+@Service
+public class ProjectTeamServiceImpl extends ServiceImpl<IProjectTeamMapper, ProjectTeam> implements IProjectTeamService {
+
+    @Resource
+    FdKKClient fdKKClient;
+
+    @Override
+    public List<ProjectTeam> getListByUserName(String userName) {
+        LambdaQueryWrapper<ProjectTeam> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ProjectTeam::getUserName,userName);
+        return this.list(wrapper);
+    }
+
+    @Override
+    public void addProject(Integer projectId, String token) {
+        ProjectTeam team = new ProjectTeam();
+        team.setIsCreater(1);
+        team.setProjectId(projectId);
+        team.setUserName(JwtUtil.getUserName(token));
+        this.save(team);
+    }
+
+    @Override
+    public Object pageList(ProjectTeamListParam param) {
+        VUtils.isTure(param.getProjectId() == null).throwMessage(ResultCode.PARAM_MISS);
+
+        LambdaQueryWrapper<ProjectTeam> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ProjectTeam::getProjectId,param.getProjectId());
+        if(StringUtils.isNotBlank(param.getUserName())){
+            wrapper.like(ProjectTeam::getUserName,param.getUserName());
+        }
+        Page<ProjectTeam> page = this.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
+
+        return PageInfo.PageInfo(page);
+    }
+
+    @Override
+    public Object addUser(ProjectTeam param, String token) {
+        VUtils.isTure(param.getProjectId() == null || StringUtils.isBlank(param.getUserName())).throwMessage(ResultCode.PARAM_MISS);
+        VUtils.isTure(!this.checkUserName(param.getUserName())).throwMessage(ResultCode.USER_NOT_EXIST);
+
+        ProjectTeam projectTeam =  this.getProjectCreater(param.getProjectId());
+        VUtils.isTure(projectTeam == null).throwMessage(ResultCode.PROJECT_CREATER_NOT_EXIST);
+        VUtils.isTure(!projectTeam.getUserName().equals(JwtUtil.getUserName(token))).throwMessage(ResultCode.NOT_PERM);
+
+        ProjectTeam team = new ProjectTeam();
+        team.setProjectId(param.getProjectId());
+        team.setUserName(param.getUserName());
+        team.setRemark(param.getRemark());
+        this.save(team);
+        return team;
+    }
+
+    @Override
+    public ProjectTeam getProjectCreater(Integer projectId) {
+        LambdaQueryWrapper<ProjectTeam> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ProjectTeam::getProjectId,projectId);
+        wrapper.eq(ProjectTeam::getIsCreater,1);
+        return this.getOne(wrapper);
+    }
+
+    @Override
+    public Boolean checkUserName(String userName) {
+        FdkkResponse fdkkResponse = fdKKClient.checkUser(new FdkkLoginRequest(userName, ""));
+        if(fdkkResponse.getCode() != 0){
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public void deleteUser(ProjectTeam param, String token) {
+        VUtils.isTure(param.getTeamId() == null ).throwMessage(ResultCode.PARAM_MISS);
+        ProjectTeam team = this.getById(param.getTeamId());
+        VUtils.isTure(team.getIsCreater() == 1).throwMessage(ResultCode.NOT_PERM);
+
+        ProjectTeam projectTeam =  this.getProjectCreater(team.getProjectId());
+        VUtils.isTure(projectTeam == null).throwMessage(ResultCode.PROJECT_CREATER_NOT_EXIST);
+        VUtils.isTure(!projectTeam.getUserName().equals(JwtUtil.getUserName(token))).throwMessage(ResultCode.NOT_PERM);
+
+        this.removeById(param.getTeamId());
+    }
+
+    @Override
+    public void updateRemark(ProjectTeam param) {
+        VUtils.isTure(param.getTeamId() == null || StringUtils.isBlank(param.getRemark()) ).throwMessage(ResultCode.PARAM_MISS);
+        LambdaUpdateWrapper<ProjectTeam> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(ProjectTeam::getTeamId,param.getTeamId())
+                .set(ProjectTeam::getRemark,param.getRemark());
+        this.update(wrapper);
+
+    }
+}

+ 231 - 0
src/main/java/com/fdkankan/site/service/impl/SceneServiceImpl.java

@@ -0,0 +1,231 @@
+package com.fdkankan.site.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fdkankan.site.common.PageInfo;
+import com.fdkankan.site.common.ResultCode;
+import com.fdkankan.site.common.util.DateUtils;
+import com.fdkankan.site.exception.BusinessException;
+import com.fdkankan.site.httpClient.client.FdKKClient;
+import com.fdkankan.site.httpClient.client.LaserClient;
+import com.fdkankan.site.httpClient.request.LaserSceneParam;
+import com.fdkankan.site.httpClient.response.FdkkResponse;
+import com.fdkankan.site.request.SceneParam;
+import com.fdkankan.site.response.SceneProEntityVo;
+import com.fdkankan.site.response.SceneVo;
+import com.fdkankan.site.service.ISceneService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+@Service
+public class SceneServiceImpl implements ISceneService {
+
+    @Resource
+    FdKKClient fdKKClient;
+    @Resource
+    LaserClient laserClient;
+
+    @Override
+    public List<SceneVo> getListByNumList(List<String> numList) {
+        SceneParam param = new SceneParam();
+        param.setNumList(numList);
+        param.setStatus(2);
+        param.setPageNum(1);
+        param.setType(0);
+        param.setPageSize(9999);
+        JSONArray list = fdkkList(param);
+        param.setType(1);
+        JSONArray list1 = fdkkList(param);
+        list.addAll(list1);
+        List<SceneVo> sceneVos = overSceneVo(list, 0);
+        JSONArray list2 = laserList(param);
+        sceneVos.addAll(overSceneVo(list2,2));
+        return sceneVos;
+    }
+
+    @Override
+    public List<SceneVo> getListByNumMap(HashMap<Integer, List<String>> typeMap) {
+        List<SceneVo> sceneVos = new ArrayList<>();
+        SceneParam param = new SceneParam();
+        param.setStatus(2);
+        param.setPageNum(1);
+        param.setPageSize(9999);
+        for (Integer type : typeMap.keySet()) {
+            param.setNumList(typeMap.get(type));
+            if(param.getNumList() == null || param.getNumList().size() <=0){
+                continue;
+            }
+            switch (type){
+                case 0 :    //看看
+                    param.setType(0);
+                    sceneVos.addAll(overSceneVo(fdkkList(param), type)) ;
+                    break;
+                case 1 :    //看见
+                    param.setType(1);
+                    sceneVos.addAll(overSceneVo(fdkkList(param), type)) ;
+                    break;
+                case 2 :    //深时
+                    param.setType(2);
+                    sceneVos.addAll(overSceneVo(laserList(param), type)) ;
+                    break;
+            }
+        }
+        return sceneVos;
+    }
+
+    private JSONArray fdkkList(SceneParam param ){
+        FdkkResponse fdkkResponse = fdKKClient.sceneList(param);
+        if (fdkkResponse.getCode() != 0) {
+            return new JSONArray();
+        }
+        PageInfo pageInfo = JSONObject.parseObject(JSONObject.toJSONString(fdkkResponse.getData()), PageInfo.class);
+        return JSONArray.parseArray(JSONObject.toJSONString(pageInfo.getList()));
+    }
+    private JSONArray laserList(SceneParam param ){
+        LaserSceneParam laserSceneParam = new LaserSceneParam();
+        laserSceneParam.setPageNum(param.getPageNum());
+        laserSceneParam.setPageSize(param.getPageSize());
+        laserSceneParam.setStatus(param.getStatus());
+        if(StringUtils.isNotBlank(param.getSceneName())){
+            laserSceneParam.setTitle(param.getSceneName());
+        }
+        if(param.getNumList() != null && param.getNumList().size() >0){
+            laserSceneParam.setSceneCodes(param.getNumList());
+        }
+        FdkkResponse fdkkResponse = laserClient.sceneList(laserSceneParam);
+        if (fdkkResponse.getCode() != 200) {
+            return new JSONArray();
+        }
+        JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(fdkkResponse.getData()));
+        JSONArray list = null;
+        if(param.getNumList() == null || param.getNumList().size()<=0){
+            list = jsonObject.getJSONObject("pageInfo").getJSONArray("list");
+        }else {
+            list = jsonObject.getJSONArray("list");
+        }
+        return 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,0);
+        }
+        if(param.getType() == 2) {       //深时
+            //获取激光(深时)场景数据
+            LaserSceneParam laserSceneParam = new LaserSceneParam();
+            laserSceneParam.setPageNum(param.getPageNum());
+            laserSceneParam.setPageSize(param.getPageSize());
+            laserSceneParam.setStatus(param.getStatus());
+            if (StringUtils.isNotBlank(param.getSceneName())) {
+                laserSceneParam.setTitle(param.getSceneName());
+            }
+            if (param.getNumList() != null && param.getNumList().size() > 0) {
+                laserSceneParam.setSceneCodes(param.getNumList());
+            }
+            FdkkResponse fdkkResponse = null;
+            if (param.getNumList() == null || param.getNumList().size() <= 0) {
+                fdkkResponse = laserClient.sceneList(laserSceneParam, token);
+            } else {
+                fdkkResponse = laserClient.sceneList(laserSceneParam);
+            }
+            if (fdkkResponse.getCode() != 200) {
+                throw new BusinessException(fdkkResponse.getCode(), fdkkResponse.getMsg());
+            }
+            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(fdkkResponse.getData()));
+            JSONArray list = null;
+            if (param.getNumList() == null || param.getNumList().size() <= 0) {
+                list = jsonObject.getJSONObject("pageInfo").getJSONArray("list");
+                total = jsonObject.getJSONObject("pageInfo").getLong("total");
+            } else {
+                list = jsonObject.getJSONArray("list");
+                total = jsonObject.getLong("total");
+            }
+            sceneVoList =overSceneVo(list,2);
+        }
+        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,Integer type) {
+        List<SceneVo> sceneVoList = new ArrayList<>();
+        if(type == 2){  //深时
+            for (Object o : list) {
+                String res = JSONObject.toJSONString(o);
+                SceneVo vo = JSONObject.parseObject(res,SceneVo.class);
+                if(vo.getStatus() == 4){    //4生成OBJ中 设置为计算中
+                    vo.setStatus(0);
+                }
+                vo.setType(2);
+                sceneVoList.add(vo);
+            }
+        }else {
+            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;
+    }
+}

+ 68 - 0
src/main/java/com/fdkankan/site/service/impl/UploadService.java

@@ -0,0 +1,68 @@
+package com.fdkankan.site.service.impl;
+
+import com.fdkankan.site.common.FilePath;
+import com.fdkankan.site.common.ResultCode;
+import com.fdkankan.site.common.util.UploadToOssUtil;
+import com.fdkankan.site.exception.BusinessException;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.util.UUID;
+
+@Service
+public class UploadService {
+
+    @Resource
+    private UploadToOssUtil uploadToOssUtil;
+
+    @Value("${upload.query-path}")
+    private String queryPath;
+
+    public File uploadFile(MultipartFile file) {
+        if(file.isEmpty()){
+            throw new BusinessException(ResultCode.UPLOAD_FILE_NO_EXIST);
+        }
+        if(file.getSize()>10 * 1024 * 1024 * 100){
+            System.out.println(file.getSize());
+            throw new BusinessException(ResultCode.UPLOAD_FILE_TO_LONG);
+        }
+        //获取文件名
+        String fileName = file.getOriginalFilename();
+        if(StringUtils.isEmpty(fileName)){
+            throw new BusinessException(ResultCode.UPLOAD_FILE_NO_EXIST);
+        }
+        File localFile = null;
+        try {
+            //获取文件后缀名
+            String suffixName = fileName.substring(fileName.lastIndexOf("."));
+            //重新生成文件名
+            fileName = UUID.randomUUID().toString().replace("-","") ;
+
+            localFile = File.createTempFile(fileName + suffixName,suffixName);
+
+            localFile = new File(FilePath.OSS_FILE_PATH  +"/"+fileName + suffixName );
+            if(!localFile.getParentFile().exists()){
+                localFile.mkdirs();
+            }
+            file.transferTo(localFile);
+            return localFile;
+        }catch (Exception e){
+           e.printStackTrace();
+        }
+        return null;
+    }
+
+    public void deleteOssUrl(String path) {
+        try {
+            String replace = path.replace(queryPath, "");
+            uploadToOssUtil.delete(replace);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+}

+ 10 - 11
src/main/resources/application-local.yaml

@@ -2,9 +2,9 @@ spring:
   datasource:
     type: com.zaxxer.hikari.HikariDataSource          # 数据源类型:HikariCP
     driver-class-name: com.mysql.jdbc.Driver          # mysql驱动
-    url: jdbc:mysql://120.24.144.164:3306/4dkankan_takelook?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+    url: jdbc:mysql://127.0.0.1:3306/fd_smart_site?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
     username: root
-    password: 4Dage@4Dage#@168
+    password: 123456
     hikari:
       connection-timeout: 30000         # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒
       minimum-idle: 5                   # 最小连接数
@@ -31,12 +31,11 @@ spring:
 4dkk:
   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
-
-wx:
-  #要打开的小程序版本。正式版为 release,体验版为 trial,开发版为 develop
-  env_version: trial
-  path: pages/sync/room/room
+    basePath: http://test.4dkankan.com
+    port: 80
+    #basePath: http://192.168.0.38/4dkankan_v2
+    #port: 8080
+  laserService:
+    #深时(激光)地址 生产环境:https://laser.4dkankan.com/
+    basePath: http://uat-laser.4dkankan.com
+    port: 80

+ 5 - 0
src/main/resources/mapper/site/ProjectBimMapper.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.site.mapper.IProjectBimMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/site/ProjectLogMapper.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.site.mapper.IProjectLogMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/site/ProjectMapper.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.site.mapper.IProjectMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/site/ProjectNumMapper.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.site.mapper.IProjectNumMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/site/ProjectTeamMapper.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.site.mapper.IProjectTeamMapper">
+
+</mapper>