Bladeren bron

增加审核功能

mengshibin 4 jaren geleden
bovenliggende
commit
fe18ca4512
22 gewijzigde bestanden met toevoegingen van 1115 en 46 verwijderingen
  1. 13 14
      fcb-project-application/src/main/resources/application-dev.properties
  2. 1 0
      fcb-project-application/src/main/resources/application-prod.properties
  3. 1 0
      fcb-project-application/src/main/resources/application-test.properties
  4. 1 0
      fcb-project-application/src/main/resources/application-uat.properties
  5. 4 2
      fcb-project-application/src/main/resources/application.properties
  6. 1 1
      fcb-project-manager-core/src/main/java/fcb/project/manager/base/entity/TmAudit.java
  7. 25 1
      fcb-project-manager-core/src/main/java/fcb/project/manager/base/entity/TmHouse.java
  8. 4 2
      fcb-project-manager-core/src/main/java/fcb/project/manager/base/enums/AuditStatus.java
  9. 6 4
      fcb-project-manager-core/src/main/java/fcb/project/manager/base/enums/HouseStatus.java
  10. 1 0
      fcb-project-manager-core/src/main/java/fcb/project/manager/base/enums/SysUserRoleEnums.java
  11. 49 0
      fcb-project-manager-core/src/main/java/fcb/project/manager/base/service/custom/PanoService.java
  12. 6 1
      fcb-project-manager-core/src/main/java/fcb/project/manager/base/service/impl/TmAuditServiceImpl.java
  13. 119 8
      fcb-project-manager-core/src/main/java/fcb/project/manager/base/service/impl/TmHouseServiceImpl.java
  14. 404 0
      fcb-project-manager-core/src/main/java/fcb/project/manager/base/utils/DateUtil.java
  15. 200 0
      fcb-project-manager-core/src/main/java/fcb/project/manager/base/utils/ExcelUtil.java
  16. 35 4
      fcb-project-manager-core/src/main/java/fcb/project/manager/core/controller/AuditController.java
  17. 198 9
      fcb-project-manager-core/src/main/java/fcb/project/manager/core/controller/HouseManagerController.java
  18. 6 0
      fcb-project-manager-core/src/main/java/fcb/project/manager/core/feignInterfaces/PanoFeign.java
  19. 3 0
      fcb-project-manager-core/src/main/java/fcb/project/manager/core/feignInterfaces/SceneFeign.java
  20. 17 0
      fcb-project-manager-core/src/main/java/fcb/project/manager/core/feignInterfaces/fallBack/PanoFeignFallBack.java
  21. 10 0
      fcb-project-manager-core/src/main/java/fcb/project/manager/core/feignInterfaces/fallBack/SceneFeignFallBack.java
  22. 11 0
      pom.xml

+ 13 - 14
fcb-project-application/src/main/resources/application-dev.properties

@@ -2,12 +2,12 @@
 server.port=8285
 
 #注册中心
-spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
+spring.cloud.nacos.discovery.server-addr=10.71.114.237:8848
 
 
-spring.datasource.url=jdbc:mysql://8.135.98.231:3306/fcb-project-manager?serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
-spring.datasource.username=root
-spring.datasource.password=4DAGE168!a
+spring.datasource.url=jdbc:mysql://10.71.114.237:3306/project_manager?serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
+spring.datasource.username=user_4dhouse_rw
+spring.datasource.password=kaKjbpZi1plmViyDVWhD
 spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
 
 
@@ -16,18 +16,16 @@ swagger.page.version=1.0
 swagger.page.desc=设计到房源api、楼盘项目管理、审核流程业务逻辑的接口
 swagger.page.packagePath=fcb.project.manager
 
-#spring.redis.cluster.max-redirects=3
-#spring.redis.cluster.nodes=8.135.107.23:30064
 #redis
-spring.redis.database=0
-spring.redis.host=127.0.0.1
-spring.redis.port=6379
-spring.redis.password=
+spring.redis.cluster.max-redirects=3
+spring.redis.cluster.nodes=10.71.114.132:7000,10.71.114.132:7001,10.71.114.132:7002,10.71.114.132:7003,10.71.114.132:7004,10.71.114.132:7005
 spring.redis.timeout=5000ms
 spring.redis.jedis.pool.max-active=8
 spring.redis.jedis.pool.max-idle=8
 spring.redis.jedis.pool.max-wait=-1
 spring.redis.jedis.pool.min-idle=0
+spring.redis.database=0
+spring.redis.password=BN5Q40JsPHIGfUg5HTkU
 
 
 
@@ -41,8 +39,9 @@ oss.secrey=JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4
 oss.bucket=4d-tjw
 
 share.logo.oss.path=domain/4dhouse/
-oss.query.url=https://houseoss.4dkankan.com/
-image.local.path=C:\\Users\\4dage\\Desktop\\logo-file\\
-inner.vr.scene.host=https://fcb.intranet.4dkankan.com/
-outer.vr.scene.host=https://fcb.test.4dkankan.com/
+oss.query.url=https://vr-oss-sit.fcb.com.cn/
+image.local.path=/image/
+excel.local.path=/mnt/excel/
+inner.vr.scene.host=https://vr-mc01-sit.fcb.com.cn/
+outer.vr.scene.host=https://vr-web01-sit.fcb.com.cn/
 vr.scene.link=hengda.html?m=

+ 1 - 0
fcb-project-application/src/main/resources/application-prod.properties

@@ -32,6 +32,7 @@ oss.query.url=https://vr-oss01.fcb.com.cn/
 
 share.logo.oss.path=domain/fcb/
 image.local.path=/image/
+excel.local.path=/mnt/excel/
 vr.scene.link=hengda.html?m=
 
 #管理后台内网域名

+ 1 - 0
fcb-project-application/src/main/resources/application-test.properties

@@ -42,6 +42,7 @@ share.logo.oss.path=domain/4dhouse/
 oss.query.url=https://houseoss.4dkankan.com/
 
 image.local.path=/image/
+excel.local.path=/mnt/excel/
 inner.vr.scene.host=https://fcb.intranet.4dkankan.com/
 outer.vr.scene.host=https://fcb.test.4dkankan.com/
 vr.scene.link=hengda.html?m=

+ 1 - 0
fcb-project-application/src/main/resources/application-uat.properties

@@ -33,6 +33,7 @@ oss.bucket=fcb-vrkanfang-uat
 share.logo.oss.path=domain/fcb/
 oss.query.url=https://vr-web02-uat.fcb.com.cn/
 image.local.path=/image/
+excel.local.path=/mnt/excel/
 inner.vr.scene.host=https://vr-mc01-uat.fcb.com.cn/
 outer.vr.scene.host=https://vr-web01-uat.fcb.com.cn/
 vr.scene.link=hengda.html?m=

+ 4 - 2
fcb-project-application/src/main/resources/application.properties

@@ -1,8 +1,8 @@
 
 
 #spring.profiles.active=prod
-#spring.profiles.active=dev
-spring.profiles.active=uat
+spring.profiles.active=dev
+#spring.profiles.active=uat
 #sit环境,这里使用了test因为sdk的swagger使用的是test,所以这里使用sit
 #spring.profiles.active=test
 
@@ -28,6 +28,8 @@ spring.servlet.multipart.max-request-size= 50MB
 #RPC feign开启熔断器,防止雪崩
 feign.hystrix.enabled=true
 
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+
 
 
 

+ 1 - 1
fcb-project-manager-core/src/main/java/fcb/project/manager/base/entity/TmAudit.java

@@ -65,7 +65,7 @@ public class TmAudit implements Serializable {
     @JSONField(format = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime sumitTime;
 
-    @ApiModelProperty(value = "审核状态: 0->待审核;1->已审核;-1->不通过")
+    @ApiModelProperty(value = "审核状态: 0->待审核;1->已审核;-1->不通过;2->拍摄审核")
     private Integer auditStatus;
 
     @ApiModelProperty(value = "审核备注")

+ 25 - 1
fcb-project-manager-core/src/main/java/fcb/project/manager/base/entity/TmHouse.java

@@ -58,7 +58,7 @@ public class TmHouse implements Serializable {
     @JSONField(format = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime updateTime;
 
-    @ApiModelProperty(value = "状态: 0 -> 草稿;1->待审核;2->已审核;3->未通过")
+    @ApiModelProperty(value = "状态: 0 -> 草稿;1->待集团审核;2->已审核;-1->未通过;3->待地区审核")
     private Integer status;
 
     @ApiModelProperty(value = "审核记录ID")
@@ -154,5 +154,29 @@ public class TmHouse implements Serializable {
     @ApiModelProperty(value = "用户在编辑后台编辑的模型的路径")
     private String vrPath;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "具体审核过程中的状态,0->待审核;1->已审核;-1->不通过;2->拍摄审核")
+    private Integer auditStatus;
+
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "观景图数量")
+    private Object garden;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "样板间数量")
+    private Object house;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "航拍数量")
+    private Object building;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "销售处数量")
+    private Object sales;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "讲房点位数量")
+    private Object points;
 
 }

+ 4 - 2
fcb-project-manager-core/src/main/java/fcb/project/manager/base/enums/AuditStatus.java

@@ -7,9 +7,11 @@ package fcb.project.manager.base.enums;
  */
 public enum AuditStatus {
 
-    WAITING_AUDIT(0 , "待审核"),
+    WAITING_AUDIT(0 , "待集团审核"),
     AUDITED(1 , "已审核"),
-    REJECT(-1 , "不通过"),
+    SHOOT_AUDIT(2 , "待地区审核"),
+    REGION_REJECT(-4 , "地区审核未通过"),
+    REJECT(-1 , "集团审核不通过"),
     ;
 
     private Integer code;

+ 6 - 4
fcb-project-manager-core/src/main/java/fcb/project/manager/base/enums/HouseStatus.java

@@ -8,10 +8,12 @@ package fcb.project.manager.base.enums;
 public enum  HouseStatus {
 
       DRAFT(0 , "草稿"),
-      WAITING_AUDIT(1 , "待审核"),
-      AUDITED(2 , "已审核"),
-      REJECT(-1 , "未通过"),
-      ALL(-2 , "所有状态"),
+      WAITING_AUDIT(1 , "待集团审核"),
+      WAITING_REGION_AUDIT(3 , "待地区审核"),
+      AUDITED(2 , "已完成"),
+      REJECT(-1 , "集团驳回"),
+      REGION_REJECT(-4 , "地区驳回"),
+      ALL(-2 , "全部"),
       OFFLINE(-3 , "下线"),
 
     ;

+ 1 - 0
fcb-project-manager-core/src/main/java/fcb/project/manager/base/enums/SysUserRoleEnums.java

@@ -11,6 +11,7 @@ public enum  SysUserRoleEnums {
     ADMIN("admin", "超级管理员"),
     GROUP("group", "集团总部管理员"),
     REGION("region", "地区公司管理员"),
+    REGION_SHOOT("regionShoot" , "地区拍摄人员"),
     ;
 
     private String roleKey;

+ 49 - 0
fcb-project-manager-core/src/main/java/fcb/project/manager/base/service/custom/PanoService.java

@@ -172,4 +172,53 @@ public class PanoService {
         }
         return "";
     }
+
+    public Map<String ,Object> getStatistics(String houseId , String token){
+
+        if(StringUtils.isNoneBlank(houseId , token)){
+            CommonRspBean rspBean = panoFeign.statistics(houseId , token);
+            log.info("从720获取最新statistics的预览路径的返回值为:{}" , JSON.toJSONString(rspBean));
+            if(null == rspBean || null == rspBean.getCode() || rspBean.getCode() != 0){
+                log.info("调用720获取最新的预览路径失败");
+                return null;
+            }
+            Map<String ,Object> jsonObject = null;
+            try {
+                jsonObject = (Map<String, Object>) rspBean.getData();
+            }catch (Exception e){
+                log.info("解析data数据失败");
+                return null;
+            }
+            return jsonObject;
+        }
+        return null;
+    }
+
+    public List<String> getAllSceneNums(String houseId, String token) {
+        if (StringUtils.isBlank(houseId)) {
+            return null;
+        }
+        SevenTwoZeroSceneRspBean sevenTwoZeroSceneRspBean = null;
+        try {
+            sevenTwoZeroSceneRspBean  =  panoFeign.getAllSceneNum(token , houseId);
+        }catch (Exception e){
+            log.info("调用720出现异常:{}" , e);
+            return null;
+        }
+        log.info("720返回结果:{}", JSON.toJSONString(sevenTwoZeroSceneRspBean));
+        if (null == sevenTwoZeroSceneRspBean || null == sevenTwoZeroSceneRspBean.getCode()) {
+            log.info("720返回结果解析失败");
+            return null;
+        }
+        if (sevenTwoZeroSceneRspBean.getCode().compareTo(0) != 0) {
+            log.info("720返回非成功:code={},msg={}", sevenTwoZeroSceneRspBean.getCode(), sevenTwoZeroSceneRspBean.getMsg());
+            return null;
+        }
+        if (CollectionUtils.isEmpty(sevenTwoZeroSceneRspBean.getData())) {
+            log.info("720返回的list为空,无需操作");
+            return null;
+        }
+
+        return sevenTwoZeroSceneRspBean.getData();
+    }
 }

+ 6 - 1
fcb-project-manager-core/src/main/java/fcb/project/manager/base/service/impl/TmAuditServiceImpl.java

@@ -10,6 +10,7 @@ import fcb.project.manager.base.entity.TmEstate;
 import fcb.project.manager.base.entity.TmHouse;
 import fcb.project.manager.base.enums.AuditStatus;
 import fcb.project.manager.base.enums.DeleteStatus;
+import fcb.project.manager.base.enums.SysUserRoleEnums;
 import fcb.project.manager.base.service.ITmAuditService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import fdage.back.sdk.base.uuid.SnowFlakeUUidUtils;
@@ -19,7 +20,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
-import java.util.Map;
 
 /**
  * <p>
@@ -52,6 +52,7 @@ public class TmAuditServiceImpl extends ServiceImpl<TmAuditDao, TmAudit> impleme
             lambdaQueryWrapper.eq(TmAudit::getAuditStatus , auditStatus);
         }else{
             lambdaQueryWrapper.ne(TmAudit::getAuditStatus , AuditStatus.WAITING_AUDIT.getCode());
+            lambdaQueryWrapper.ne(TmAudit::getAuditStatus , AuditStatus.SHOOT_AUDIT.getCode());
         }
         if(StringUtils.isNotBlank(houseId)){
             lambdaQueryWrapper.eq(TmAudit::getVrId , houseId);
@@ -130,7 +131,11 @@ public class TmAuditServiceImpl extends ServiceImpl<TmAuditDao, TmAudit> impleme
         tmAudit.setBelongCompanyId(tmEstate.getBelongCompanyId());
         tmAudit.setBelongCompanyName(tmEstate.getBelongCompanyName());
         tmAudit.setSumitTime(LocalDateTime.now());
+        //默认审核状态为0,地区管理员提交的审核,若拍摄人员提交的,状态修改为2
         tmAudit.setAuditStatus(AuditStatus.WAITING_AUDIT.getCode());
+        if(SysUserRoleEnums.REGION_SHOOT.getRoleKey().equals(token.getRoleKey())){
+            tmAudit.setAuditStatus(AuditStatus.SHOOT_AUDIT.getCode());
+        }
         tmAudit.setVrOnline(tmHouse.getOnline());
         tmAudit.setCreateTime(LocalDateTime.now());
         tmAudit.setUpdateTime(LocalDateTime.now());

+ 119 - 8
fcb-project-manager-core/src/main/java/fcb/project/manager/base/service/impl/TmHouseServiceImpl.java

@@ -1,20 +1,19 @@
 package fcb.project.manager.base.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import fcb.project.manager.base.dao.TmHouseDao;
-import fcb.project.manager.base.entity.ContextTokenBean;
-import fcb.project.manager.base.entity.PanoInitSceneBean;
-import fcb.project.manager.base.entity.TmEstate;
-import fcb.project.manager.base.entity.TmHouse;
+import fcb.project.manager.base.entity.*;
 import fcb.project.manager.base.enums.DeleteStatus;
 import fcb.project.manager.base.enums.HouseStatus;
 import fcb.project.manager.base.enums.SysUserRoleEnums;
 import fcb.project.manager.base.enums.UuidPreEnum;
 import fcb.project.manager.base.service.ITmHouseService;
 import fcb.project.manager.base.service.custom.PanoService;
+import fcb.project.manager.core.feignInterfaces.SceneFeign;
 import fcb.project.manager.core.feignInterfaces.UserFeign;
 import fdage.back.sdk.base.enums.ResultCodeEnum;
 import fdage.back.sdk.base.exception.CommonBaseException;
@@ -29,6 +28,7 @@ import org.springframework.util.CollectionUtils;
 
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -49,6 +49,9 @@ public class TmHouseServiceImpl extends ServiceImpl<TmHouseDao, TmHouse> impleme
     private PanoService panoService;
 
     @Autowired
+    private SceneFeign sceneFeign;
+
+    @Autowired
     private TmEstateServiceImpl tmEstateService;
 
     @Autowired
@@ -93,6 +96,7 @@ public class TmHouseServiceImpl extends ServiceImpl<TmHouseDao, TmHouse> impleme
         if (null != type) {
             lambdaQueryWrapper.eq(TmHouse::getType, type);
         }
+
         lambdaQueryWrapper.orderByDesc(TmHouse::getCreateTime);
         IPage<TmHouse> page = new Page<>(pageNum, pageSize, true);
         IPage<TmHouse> resultPage = getBaseMapper().selectPage(page, lambdaQueryWrapper);
@@ -103,6 +107,18 @@ public class TmHouseServiceImpl extends ServiceImpl<TmHouseDao, TmHouse> impleme
             }
             //从720获取最新的预览路径,重新封装给前端展示
             TreeMap<String , Object> treeMap =  panoService.getHouseVrlinks(getAllHouseIds , token);
+
+            //从720获取统计数据
+            Map<String, Object> statistics = null;
+
+            //当前房源所有场景码集合
+            List<String> allSceneNums = null;
+
+            //四维看看接口参数
+            Map<String, String> param = new HashMap<>();
+            //四维看看获取统计结果
+            SceneRspBean sceneRspBean = null;
+
             for (int i = 0; i < resultPage.getRecords().size(); i++) {
                 String vrId = resultPage.getRecords().get(i).getId();
                 //获取当前房源的审核记录数,用于前端判决是否展示审核历史图标
@@ -116,6 +132,27 @@ public class TmHouseServiceImpl extends ServiceImpl<TmHouseDao, TmHouse> impleme
                         resultPage.getRecords().get(i).setVrLink(outerHost + path);
                     }
                 }
+
+                //调用720云接口,获取统计数据map
+                statistics = panoService.getStatistics(vrId, token);
+                if(statistics != null){
+                    resultPage.getRecords().get(i).setGarden(statistics.get("garden"));
+                    resultPage.getRecords().get(i).setHouse(statistics.get("house"));
+                    resultPage.getRecords().get(i).setBuilding(statistics.get("building"));
+                    resultPage.getRecords().get(i).setSales(statistics.get("sales"));
+                }
+
+                allSceneNums = panoService.getAllSceneNums(vrId, token);
+                if(allSceneNums != null){
+                    param.put("sceneNum", allSceneNums.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", ")));
+                    sceneRspBean = sceneFeign.statisticsPoints(param, token);
+
+                    if(null == sceneRspBean || sceneRspBean.getCode() != 0){
+                        log.info("调用四维看看获取所有场景点位数失败,场景码是:" + param.get("sceneNum"));
+                    }else {
+                        resultPage.getRecords().get(i).setPoints(sceneRspBean.getData());
+                    }
+                }
             }
         }
         return resultPage;
@@ -140,7 +177,8 @@ public class TmHouseServiceImpl extends ServiceImpl<TmHouseDao, TmHouse> impleme
 
     public IPage<TmHouse> getAuditHouseList(String houseTitle, Integer status, Integer type,
                                             String belongCompany, String estateName, String token,
-                                            Long pageNum, Long pageSize) {
+                                            String startTime, String endTime,
+                                            Long pageNum, Long pageSize, ContextTokenBean tokenMap) {
         LambdaQueryWrapper<TmHouse> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         lambdaQueryWrapper.eq(TmHouse::getIsShow, 1);
         if (StringUtils.isNotBlank(houseTitle)) {
@@ -149,7 +187,13 @@ public class TmHouseServiceImpl extends ServiceImpl<TmHouseDao, TmHouse> impleme
         lambdaQueryWrapper.orderByDesc(TmHouse::getSubmitAuditTime);
         if (null != status) {
             if (HouseStatus.ALL.getCode().compareTo(status) != 0) {
-                lambdaQueryWrapper.eq(TmHouse::getStatus, status);
+                //当获取的是未通过的数据时,获取所有<=-1的数据
+                if(HouseStatus.REJECT.getCode().compareTo(status) == 0){
+                    lambdaQueryWrapper.le(TmHouse::getStatus, status);
+                }else {
+                    //其余根据状态获取
+                    lambdaQueryWrapper.eq(TmHouse::getStatus, status);
+                }
             } else {
                 lambdaQueryWrapper.ne(TmHouse::getStatus, HouseStatus.DRAFT.getCode());
             }
@@ -160,12 +204,23 @@ public class TmHouseServiceImpl extends ServiceImpl<TmHouseDao, TmHouse> impleme
         if (StringUtils.isNotBlank(estateName)) {
             lambdaQueryWrapper.like(TmHouse::getEstateName, estateName);
         }
-        if (StringUtils.isNotBlank(belongCompany)) {
-            lambdaQueryWrapper.eq(TmHouse::getBelongCompanyId, belongCompany);
+
+        if("region".equals(tokenMap.getRoleKey())){
+            lambdaQueryWrapper.eq(TmHouse::getBelongCompanyId, tokenMap.getDepartmentId());
+        }else {
+            if (StringUtils.isNotBlank(belongCompany)) {
+                lambdaQueryWrapper.eq(TmHouse::getBelongCompanyId, belongCompany);
+            }
         }
         if (null != type) {
             lambdaQueryWrapper.eq(TmHouse::getType, type);
         }
+        if(StringUtils.isNotBlank(startTime)){
+            lambdaQueryWrapper.ge(TmHouse::getAuditTime, startTime);
+        }
+        if(StringUtils.isNotBlank(startTime)){
+            lambdaQueryWrapper.le(TmHouse::getAuditTime, endTime);
+        }
         IPage<TmHouse> page = new Page<>(pageNum, pageSize, true);
         IPage<TmHouse> resultPage = getBaseMapper().selectPage(page, lambdaQueryWrapper);
 
@@ -174,6 +229,9 @@ public class TmHouseServiceImpl extends ServiceImpl<TmHouseDao, TmHouse> impleme
             for (int i = 0; i < resultPage.getRecords().size(); i++) {
                 getAllHouseIds.add(resultPage.getRecords().get(i).getId());
             }
+
+            LambdaQueryWrapper<TmAudit> auditLambdaQueryWrapper = new LambdaQueryWrapper<>();
+            TmAudit tmAudit = null;
             //从720获取最新的预览路径,重新封装给前端展示
             TreeMap<String , Object> treeMap =  panoService.getHouseVrlinks(getAllHouseIds , token);
             for (int i = 0; i < resultPage.getRecords().size(); i++) {
@@ -189,11 +247,64 @@ public class TmHouseServiceImpl extends ServiceImpl<TmHouseDao, TmHouse> impleme
                         resultPage.getRecords().get(i).setVrLink(outerHost + path);
                     }
                 }
+
+//                //查出所有审核详细状态
+//                auditLambdaQueryWrapper = new LambdaQueryWrapper<>();
+//                auditLambdaQueryWrapper.eq(TmAudit::getId, resultPage.getRecords().get(i).getAuditId());
+//                auditLambdaQueryWrapper.eq(TmAudit::getIsDelete, DeleteStatus.NOT_DELETE.getCode());
+//                auditLambdaQueryWrapper.last("limit 1");
+//                tmAudit = tmAuditService.getBaseMapper().selectOne(auditLambdaQueryWrapper);
+//                if(tmAudit != null){
+//                    resultPage.getRecords().get(i).setAuditStatus(tmAudit.getAuditStatus());
+//                }
             }
         }
         return resultPage;
     }
 
+    public List<TmHouse> getAuditHouseListAll(String houseTitle, Integer status, Integer type,
+                                            String belongCompany, String estateName,
+                                            String startTime, String endTime, ContextTokenBean tokenMap) {
+        LambdaQueryWrapper<TmHouse> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(TmHouse::getIsShow, 1);
+        if (StringUtils.isNotBlank(houseTitle)) {
+            lambdaQueryWrapper.like(TmHouse::getHouseTitle, houseTitle);
+        }
+        lambdaQueryWrapper.orderByDesc(TmHouse::getSubmitAuditTime);
+        if (null != status) {
+            if (HouseStatus.ALL.getCode().compareTo(status) != 0) {
+                lambdaQueryWrapper.eq(TmHouse::getStatus, status);
+            } else {
+                lambdaQueryWrapper.ne(TmHouse::getStatus, HouseStatus.DRAFT.getCode());
+            }
+            //捞取所有状态,默认不设置status的过滤条件
+        } else {
+            lambdaQueryWrapper.eq(TmHouse::getStatus, HouseStatus.WAITING_AUDIT.getCode());
+        }
+        if (StringUtils.isNotBlank(estateName)) {
+            lambdaQueryWrapper.like(TmHouse::getEstateName, estateName);
+        }
+        if("region".equals(tokenMap.getRoleKey())){
+            lambdaQueryWrapper.eq(TmHouse::getBelongCompanyId, tokenMap.getDepartmentId());
+        }else {
+            if (StringUtils.isNotBlank(belongCompany)) {
+                lambdaQueryWrapper.eq(TmHouse::getBelongCompanyId, belongCompany);
+            }
+        }
+        if (null != type) {
+            lambdaQueryWrapper.eq(TmHouse::getType, type);
+        }
+        if(StringUtils.isNotBlank(startTime)){
+            lambdaQueryWrapper.ge(TmHouse::getAuditTime, startTime);
+        }
+        if(StringUtils.isNotBlank(startTime)){
+            lambdaQueryWrapper.le(TmHouse::getAuditTime, endTime);
+        }
+        List<TmHouse> tmHouseList = getBaseMapper().selectList(lambdaQueryWrapper);
+
+        return tmHouseList;
+    }
+
     @Transactional(rollbackFor = Exception.class)
     public int deleteHouseById(String houseId) {
         if (StringUtils.isBlank(houseId)) {

+ 404 - 0
fcb-project-manager-core/src/main/java/fcb/project/manager/base/utils/DateUtil.java

@@ -0,0 +1,404 @@
+/*
+ * PROJECT NAME: openplatform
+ * CREATED TIME: 15-4-30 下午4:16
+ *       AUTHOR: lizhiming
+ *    COPYRIGHT: Copyright(c) 2015~2020 All Rights Reserved.
+ *
+ */
+package fcb.project.manager.base.utils;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 日期工具类
+ *
+ * @author lizhiming
+ */
+@Slf4j
+public final class DateUtil {
+
+	/**
+     * 时间格式
+     */
+    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
+
+    public static final String YYYY_MM_DD_DATE_FORMAT = "yyyy-MM-dd";
+
+    public static final String YYYYMMDD_DATA_FORMAT = "yyyyMMdd";
+
+    public static final String HHMMSS_DATA_FORMAT = "HHmmss";
+
+    public static final String YYYYMMDDHHMMSSSSS_DATA_FORMAT = "yyyyMMddHHmmssSSS";
+
+    public static final String YYYYMMDDHHMMSS_DATA_FORMAT = "yyyyMMddHHmmss";
+    
+    public static final String YYMMDDHHMMSS_DATA_FORMAT = "yyMMddHHmmss";
+    
+    public static final String YYMMDDHHMM_DATA_FORMAT = "yyyyMMddHHmm";
+    
+	
+	/**
+	 * 过去的Date对象,TIMESTAMP值可以从1970的某时的开始一直到2037年
+	 */
+	public static final Date PASSED_DATE = DateUtil.string2Date("2000-01-01 00:00:00",
+			DEFAULT_DATE_FORMAT);;
+	/**
+	 * 永久的Date对象,TIMESTAMP值可以从1970的某时的开始一直到2037年
+	 */
+	public static final Date FOREVER_DATE = DateUtil.string2Date("9999-12-31 23:59:59",
+			DEFAULT_DATE_FORMAT);
+
+	private DateUtil() {
+	}
+
+	/**
+	 * 把时间转成北京时间的时间戳
+	 *
+	 * @param input
+	 * @return
+	 */
+	public static long convert2CST(String input) {
+		SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		dff.setTimeZone(TimeZone.getTimeZone("GMT+08"));
+
+		long result = -1;
+		try {
+			Date cstDate = dff.parse(input);
+			result = cstDate.getTime();
+		} catch (Exception e) {
+			log.error("convert2CST meet exception.", e);
+		}
+
+		return result;
+	}
+
+	/**
+	 * 把时间戳转成北京时间的字符串表示
+	 *
+	 * @param input
+	 * @return
+	 */
+	public static String convert2CST(long input) {
+		SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		dff.setTimeZone(TimeZone.getTimeZone("GMT+08"));
+
+		try {
+			return dff.format(new Date(input));
+		} catch (Exception e) {
+			log.error("convert2CST meet exception.", e);
+		}
+
+		return "";
+	}
+
+
+	/**
+	 * 判断两个日期是否是同一天
+	 *
+	 * @param dateA
+	 *            日期1
+	 * @param dateB
+	 *            日期2
+	 * @return true:false
+	 */
+	public static boolean isSameDay(Date dateA, Date dateB) {
+		Calendar calDateA = Calendar.getInstance();
+		calDateA.setTime(dateA);
+
+		Calendar calDateB = Calendar.getInstance();
+		calDateB.setTime(dateB);
+
+		return calDateA.get(Calendar.YEAR) == calDateB.get(Calendar.YEAR)
+				&& calDateA.get(Calendar.MONTH) == calDateB.get(Calendar.MONTH)
+				&& calDateA.get(Calendar.DAY_OF_MONTH) == calDateB.get(Calendar.DAY_OF_MONTH);
+	}
+
+	/**
+	 * 将Java日期转成以秒为单位,去除毫秒信息
+	 * java中Date类中的getTime()是获取时间戳的,java中生成的时间戳精确到毫秒级别,而unix中精确到秒级别,
+	 * 所以通过java生成的时间戳需要除以1000
+	 *
+	 * @param date
+	 * @return
+	 */
+	public static Date truncMesc(Date date) {
+		String strDate = DateUtil.date2String(date, DEFAULT_DATE_FORMAT);
+
+		Date result = null;
+		try {
+			SimpleDateFormat dateFmt = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
+			result = dateFmt.parse(strDate);
+		} catch (Exception e) {
+			log.error("truncMesc meet exception", e);
+		}
+
+		return result;
+	}
+
+	/**
+	 * 判断当前时间是否在指定的有效期内
+	 *
+	 * @param beginDate
+	 *            开始时间
+	 * @param endDate
+	 *            结束时间
+	 * @return true : false
+	 */
+	public static boolean isInPeriod(Date beginDate, Date endDate) {
+		Date now = new Date();
+
+		if (beginDate == null || endDate == null) {
+			log.error("isInPeriod meet null argument.");
+			throw new IllegalArgumentException("isInPeriod meet null argument.");
+		}
+
+		if (beginDate.before(endDate) == false) {
+			log.error("isInPeriod meet invalid date argument.");
+			throw new IllegalArgumentException("isInPeriod meet invalid date argument.");
+		}
+
+		if (now.after(beginDate) && now.before(endDate)) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * 判断目标时间是否比当前时间早
+	 *
+	 * @param targetDate
+	 *            需比较的时间
+	 * @return
+	 */
+	public static boolean isBeforeNow(Date targetDate) {
+		if (targetDate == null) {
+			log.error("isBeforeNow meet null argument.");
+			throw new IllegalArgumentException("isBeforeNow meet null argument.");
+		}
+
+		Date now = new Date();
+
+		return (now.after(targetDate)) ? true : false;
+	}
+
+	/**
+	 * @param beginDate
+	 *            开始时期
+	 * @param days
+	 *            偏离天数,> 0 往后推算; < 0 往前推算
+	 * @return
+	 */
+	public static Date daysCalculate(Date beginDate, int days) {
+		return timesCalculate(beginDate, days, GregorianCalendar.DATE);
+	}
+
+	/**
+	 * @param beginDate
+	 *            开始时期
+	 * @return
+	 */
+	public static Date hoursCalculate(Date beginDate, int hours) {
+		return timesCalculate(beginDate, hours, GregorianCalendar.HOUR);
+	}
+
+	public static Date timesCalculate(Date beginDate, int times, int type) {
+		/*
+		 * GregorianCalendar类的add(int field,int amount)方法表示年月日加减.
+		 * field参数表示年,月,周,日等. amount参数表示要加减的数量.
+		 */
+		GregorianCalendar gc = new GregorianCalendar();
+		gc.setTime(beginDate);
+		gc.add(type, times);
+		return gc.getTime();
+	}
+
+	/**
+	 * 将日期对象按照格式转成字符串
+	 *
+	 * @param date
+	 *            日期对象
+	 * @param format
+	 *            日期格式
+	 * @return 字符串
+	 */
+	public static String date2String(Date date, String format) {
+		if (date == null) {
+			log.error("date2String meet null argument.");
+			throw new IllegalArgumentException("argument is null.");
+		}
+
+		if (format == null) {
+			format = DEFAULT_DATE_FORMAT;
+		}
+
+		String result = null;
+		try {
+			DateFormat fmt = new SimpleDateFormat(format);
+			result = fmt.format(date);
+		} catch (Exception e) {
+			log.error("date2String meet exception. " + e.getLocalizedMessage());
+		}
+		return result;
+	}
+
+	/**
+	 * 将字符串转成日期对象
+	 *
+	 * @param date
+	 *            日期字符串
+	 * @param format
+	 *            日期格式
+	 * @return 日期对象
+	 */
+	public static Date string2Date(String date, String format) {
+		if (date == null) {
+			log.error("string2Date meet null argument.");
+			throw new IllegalArgumentException("argument is null.");
+		}
+
+		if (format == null) {
+			format = DEFAULT_DATE_FORMAT;
+		}
+
+		Date result = null;
+		try {
+			DateFormat fmt = new SimpleDateFormat(format);
+			result = fmt.parse(date);
+		} catch (Exception e) {
+			log.error("string2Date meet exception. " + e.getLocalizedMessage());
+		}
+
+		return result;
+	}
+
+	/**
+	 * java时间戳转换到php时间戳
+	 *
+	 * @param time
+	 * @return
+	 */
+	public static long javaTimestamp(long time) {
+		if (time <= 0) {
+			log.error("javaTimestamp meet null argument.");
+			throw new IllegalArgumentException("argument is null.");
+		}
+		// mysql 时间戳只有10位,只精确到秒,而Java时间戳精确到毫秒,故要做处理
+		String dateline = String.valueOf(time);
+		dateline = dateline.substring(0, 10);
+		return Long.parseLong(dateline);
+	}
+
+	public static long javaTimestamp(Date now) {
+		return javaTimestamp(now.getTime());
+	}
+
+	/**
+	 * 计算两个日期之间相差的天数
+	 *
+	 * @param smdate
+	 *            较小的时间
+	 * @param bdate
+	 *            较大的时间
+	 * @return 相差天数
+	 * @throws ParseException
+	 */
+	public static int daysBetween(Date smdate, Date bdate) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		try {
+			smdate = sdf.parse(sdf.format(smdate));
+			bdate = sdf.parse(sdf.format(bdate));
+		} catch (ParseException e) {
+			log.error("ParseException:", e);
+		}
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(smdate);
+		long time1 = cal.getTimeInMillis();
+		cal.setTime(bdate);
+		long time2 = cal.getTimeInMillis();
+		long between_days = (time2 - time1) / (1000 * 3600 * 24);
+
+		return Integer.parseInt(String.valueOf(between_days));
+	}
+
+	/**
+	 * 把日期推后一天
+	 * @return 相差天数
+	 * @throws ParseException
+	 */
+	public static Date dayDelay(String dateTime) {
+		Date date = string2Date(dateTime, "yyyy-MM-dd");
+		Calendar calendar = new GregorianCalendar();
+		calendar.setTime(date);
+		calendar.add(calendar.DATE, 1);// 把日期往后增加一天.整数往后推,负数往前移动
+		date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
+
+		return date;
+	}
+
+	/**
+	 * 获取某年某月的最后一天日期
+	 */
+	public static Date getLastDayOfMonth(int year, int month) {
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.YEAR, year);
+		cal.set(Calendar.MONTH, month - 1);
+		int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
+		cal.set(Calendar.DAY_OF_MONTH, lastDay);
+		return cal.getTime();
+	}
+
+	/**
+	 * 获取某年某月的第一天 日期
+	 */
+	public static Date getFisrtDayOfMonth(int year, int month) {
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.YEAR, year);
+		cal.set(Calendar.MONTH, month - 1);
+		int firstDay = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
+		cal.set(Calendar.DAY_OF_MONTH, firstDay);
+		return cal.getTime();
+	}
+
+	/**
+	 * 根据开始时间和结束时间返回时间段内的时间集合
+	 *
+	 * @param beginDate
+	 * @param endDate
+	 * int calendarType 差距的时间 如获取间隔为一天 输入Calendar.DAY_OF_MONTH
+	 * @return List
+	 */
+	public static List<Date> getDatesBetweenTwoDate(Date beginDate, Date endDate,int calendarType) {
+		List<Date> lDate = new ArrayList<Date>();
+		lDate.add(beginDate);// 把开始时间加入集合
+		Calendar cal = Calendar.getInstance();
+		// 使用给定的 Date 设置此 Calendar 的时间
+		cal.setTime(beginDate);
+		boolean bContinue = true;
+		while (bContinue) {
+			// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
+			cal.add(calendarType, 1);
+			// 测试此日期是否在指定日期之后
+			if (endDate.after(cal.getTime())) {
+				lDate.add(cal.getTime());
+			} else {
+				break;
+			}
+		}
+		lDate.add(endDate);// 把结束时间加入集合
+		return lDate;
+	}
+
+	public static boolean after(Date date1,Date date2){
+		Calendar c1 = Calendar.getInstance();
+		c1.setTime(date1);
+		Calendar c2 = Calendar.getInstance();
+		c2.setTime(date2);
+		return c2.after(c1);
+	}
+}

+ 200 - 0
fcb-project-manager-core/src/main/java/fcb/project/manager/base/utils/ExcelUtil.java

@@ -0,0 +1,200 @@
+package fcb.project.manager.base.utils;
+
+import lombok.extern.log4j.Log4j2;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Log4j2
+public class ExcelUtil {
+
+    private static final String EXCEL_XLS = "xls";
+    private static final String EXCEL_XLSX = "xlsx";
+
+    public static final String[] AUDIT_EXCEL_COLE_NAME = {"序号","VR项目id","VR项目名称","项目类型","所属楼盘","公司","创建人","提审时间","审核状态","审核人", "审核时间"};
+
+    public static void main(String[] args) {
+        Map<String, String> dataMap = new HashMap<String, String>();
+        dataMap.put("BankName", "BankName");
+        dataMap.put("Addr", "Addr");
+        dataMap.put("Phone", "Phone");
+        List<Map> list = new ArrayList<Map>();
+        list.add(dataMap);
+        new ExcelUtil().writeExcel(list, 3, "D:/writeExcel.xls","");
+    }
+
+    public static Workbook writeExcel(List<Map> dataList, int columnCount, String xlsxPath, String titleStr) {
+        OutputStream out = null;
+        try {
+            // 获取总列数
+            int columnNumCount = columnCount;
+            // 读取Excel文档
+            File xlsxFile = new File(xlsxPath);
+            HSSFWorkbook workBook = new HSSFWorkbook();
+
+            // sheet 对应一个工作页
+            HSSFSheet sheet = workBook.createSheet();
+            HSSFCellStyle cellstyle = workBook.createCellStyle();
+
+            //标题,合并单元格,字体加粗
+            /*
+             * 这个对象中有四个参数
+             * 第一个代表:起始行
+             * 第二个代表:结束行
+             * 第三个代表:起始列
+             * 第四个代表:结束列
+             */
+            CellRangeAddress cra = new CellRangeAddress(0, 0, 0, AUDIT_EXCEL_COLE_NAME.length -1);
+            //把合并样式添加到sheet中
+            sheet.addMergedRegion(cra);
+
+            //居中
+            cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);
+
+            //加粗
+            HSSFFont font = workBook.createFont();
+            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
+            cellstyle.setFont(font);
+
+            HSSFRow title = sheet.createRow((short) 0);
+            //设置行高
+            title.setHeight((short) 500);
+            HSSFCell titleCell = title.createCell((short) 0);
+            titleCell.setCellValue(titleStr);
+
+            cellstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
+            cellstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
+            cellstyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
+            cellstyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
+
+            titleCell.setCellStyle(cellstyle);
+
+            //设置边框
+            HSSFCellStyle setBorder = workBook.createCellStyle();
+            setBorder.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
+            setBorder.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
+            setBorder.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
+            setBorder.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
+
+            HSSFRow hssfRow = sheet.createRow((short) 1);
+            sheet.createFreezePane(0, 1);
+            for (int i = 0; i < AUDIT_EXCEL_COLE_NAME.length; ++i) {
+                HSSFCell cell = hssfRow.createCell((short)i);
+                cell.setCellValue(AUDIT_EXCEL_COLE_NAME[i]);
+                cell.setCellStyle(setBorder);
+            }
+            // 创建文件输出流,输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效
+            out = new FileOutputStream(xlsxPath);
+            workBook.write(out);
+            /**
+             * 往Excel中写新数据
+             */
+            for (int j = 0; j < dataList.size(); j++) {
+                // 创建一行:从第二行开始,跳过属性列
+                Row row = sheet.createRow(j + 2);
+                // 得到要插入的每一条记录
+                Map<String, String> dataMap = dataList.get(j);
+
+                for (int i = 0; i < AUDIT_EXCEL_COLE_NAME.length; ++i) {
+                    String value = dataMap.get(AUDIT_EXCEL_COLE_NAME[i]);
+                    Cell cell = row.createCell(i);
+                    cell.setCellValue(value);
+
+                    cell.setCellStyle(setBorder);
+                    if(value != null){
+                        setSizeColumn(sheet, AUDIT_EXCEL_COLE_NAME.length);
+                    }
+                }
+            }
+            // 创建文件输出流,准备输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效
+            out = new FileOutputStream(xlsxPath);
+            workBook.write(out);
+            log.info("数据导出成功");
+            return workBook;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        } finally {
+            try {
+                if (out != null) {
+                    out.flush();
+                    out.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 判断Excel的版本,获取Workbook
+     *
+     * @return
+     * @throws IOException
+     */
+    public static Workbook getWorkbok(File file) throws IOException {
+        try {
+            Workbook wb = null;
+            InputStream in = new FileInputStream(file);
+
+            if (!in.markSupported()) {
+                in = new PushbackInputStream(in, 8);
+            }
+
+            if (file.getName().endsWith(EXCEL_XLS)) {
+                wb = new HSSFWorkbook(in);
+            } else if (file.getName().endsWith(EXCEL_XLSX)) {
+                wb = new XSSFWorkbook(in);
+            } else {
+                log.error("你的excel版本目前poi解析不了");
+            }
+            return wb;
+        } catch (Exception e) {
+            log.error("WriteExcelServiceImpl-getWorkbok");
+            StringWriter trace = new StringWriter();
+            e.printStackTrace(new PrintWriter(trace));
+            log.error(trace.toString());
+            return null;
+        }
+    }
+
+    /**
+     *  自适应列宽
+     * @param sheet
+     * @param columnLength 列数
+     */
+    private static void setSizeColumn(Sheet sheet, int columnLength) {
+        for (int columnNum = 0; columnNum <= columnLength; columnNum++) {
+            int columnWidth = sheet.getColumnWidth(columnNum) / 256;
+            for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
+                Row currentRow; // 当前行未被使用过
+                if (sheet.getRow(rowNum) == null) {
+                    currentRow =  sheet.createRow(rowNum);
+                } else {
+                    currentRow =  sheet.getRow(rowNum);
+                }
+                if (currentRow.getCell(columnNum) != null) {
+                    Cell currentCell = currentRow.getCell(columnNum);
+                    if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
+                        int length = currentCell.getStringCellValue().getBytes().length;
+                        if (columnWidth < length) {
+                            columnWidth = length;
+                        }
+                    }
+                }
+            }
+            if(columnNum == 0){
+                continue;
+            }
+            sheet.setColumnWidth(columnNum, columnWidth * 256);
+        }
+    }
+
+}

+ 35 - 4
fcb-project-manager-core/src/main/java/fcb/project/manager/core/controller/AuditController.java

@@ -11,6 +11,7 @@ import fcb.project.manager.base.service.impl.TmAuditServiceImpl;
 import fcb.project.manager.base.service.impl.TmHouseServiceImpl;
 import fcb.project.manager.base.service.impl.TmOperationServiceImpl;
 import fcb.project.manager.base.utils.DataUtils;
+import fcb.project.manager.core.feignInterfaces.PanoFeign;
 import fcb.project.manager.core.feignInterfaces.SceneFeign;
 import fdage.back.sdk.base.entity.Result;
 import fdage.back.sdk.base.enums.ResultCodeEnum;
@@ -32,6 +33,7 @@ import java.time.LocalDateTime;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.TreeMap;
 import java.util.stream.Collectors;
 
 /**
@@ -64,6 +66,9 @@ public class AuditController extends BaseController{
     @Autowired
     private TmOperationServiceImpl tmOperationService;
 
+    @Autowired
+    private PanoFeign panoFeign;
+
     @GetMapping("/queryOrSearchList")
     @ApiOperation(value = "根据条件拉取所有审批记录")
     @ApiImplicitParams({
@@ -79,6 +84,7 @@ public class AuditController extends BaseController{
     public Result<Object> queryList(String vrTitle , Integer vrType,
                                     String belongEstate , String belongCompany,
                                     Integer auditStatus , Long pageNum , Long pageSize , String houseId){
+
         IPage<TmAudit> resultPage = tmAuditService.queryOrSearchList(vrTitle , vrType ,
                                                                     belongEstate , belongCompany ,
                                                                     auditStatus , pageNum , pageSize , houseId);
@@ -93,6 +99,7 @@ public class AuditController extends BaseController{
             @ApiImplicitParam(name = "id", value = "审核记录ID", paramType = "query", required = true, dataType = "String"),
             @ApiImplicitParam(name = "auditStatus", value = "审核状态: 0->待审核;1->已审核;-1->不通过", paramType = "query", required = true, dataType = "Integer"),
             @ApiImplicitParam(name = "auditRemark", value = "审核备注", paramType = "query", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "belongCompany", value = "所属公司ID", paramType = "query", required = false, dataType = "String"),
     })
     @Transactional(rollbackFor = Exception.class)
     public Result<Object> audit(@RequestBody AuditRequestBean auditRequestBean , HttpServletRequest request){
@@ -133,10 +140,35 @@ public class AuditController extends BaseController{
                 AuditStatus.AUDITED.getCode().compareTo(tmAudit.getAuditStatus()) == 0){
             return Result.failure("已经审通批过了,无需重复处理");
         }
-        tmAudit.setAuditStatus(auditRequestBean.getAuditStatus());
+        //若状态为审核通过,判断当前审核状态是拍摄审核,还是地区审核(待审核)
+        if(AuditStatus.AUDITED.getCode().compareTo(auditRequestBean.getAuditStatus()) == 0){
+            if(AuditStatus.SHOOT_AUDIT.getCode().compareTo(tmAudit.getAuditStatus().intValue()) == 0){
+                tmAudit.setAuditStatus(AuditStatus.WAITING_AUDIT.getCode());
+                //地区审核通过,修改成待集团审核
+                dbHouse.setStatus(HouseStatus.WAITING_AUDIT.getCode());
+            }else {
+                tmAudit.setAuditStatus(AuditStatus.AUDITED.getCode());
+
+                dbHouse.setStatus(HouseStatus.AUDITED.getCode());
+            }
+        }
+        if(auditRequestBean.getAuditStatus().compareTo(AuditStatus.REJECT.getCode()) == 0){
+            if(AuditStatus.SHOOT_AUDIT.getCode().compareTo(tmAudit.getAuditStatus().intValue()) == 0){
+                //处于拍摄审核状态时,修改成地区审核不通过
+                tmAudit.setAuditStatus(AuditStatus.REGION_REJECT.getCode());
+                //地区审核通过,修改成待集团审核
+                dbHouse.setStatus(HouseStatus.REGION_REJECT.getCode());
+            }else {
+                //修改成集团审核不通过
+                tmAudit.setAuditStatus(AuditStatus.REJECT.getCode());
+
+                dbHouse.setStatus(HouseStatus.REJECT.getCode());
+            }
+        }
+
         tmAudit.setAuditRemark(auditRequestBean.getAuditRemark());
-        tmAudit.setAuditorId(tokenMap.getId());
         tmAudit.setAuditTime(LocalDateTime.now());
+        tmAudit.setAuditorId(tokenMap.getId());
         tmAudit.setAuditorName(tokenMap.getNickName());
         int update = tmAuditService.updateAudit(tmAudit);
         if(update != 1){
@@ -146,7 +178,7 @@ public class AuditController extends BaseController{
         Map<String , Object> map = new HashMap<>();
         if(AuditStatus.AUDITED.getCode().compareTo(auditRequestBean.getAuditStatus()) == 0){
             auditResultStr = "审核通过";
-            dbHouse.setStatus(HouseStatus.AUDITED.getCode());
+
             dbHouse.setOnline(1);
             //1、通知看看,翻转场景码的状态
             List<String> sceneNumList = panoService.getKanKanSceneNums(dbHouse.getId() , getToken());
@@ -172,7 +204,6 @@ public class AuditController extends BaseController{
 
         }else if(AuditStatus.REJECT.getCode().compareTo(auditRequestBean.getAuditStatus()) == 0){
             auditResultStr = "审核不通过";
-            dbHouse.setStatus(HouseStatus.REJECT.getCode());
         }
         dbHouse.setAuditId(tmAudit.getId());
         dbHouse.setAuditTime(LocalDateTime.now());

+ 198 - 9
fcb-project-manager-core/src/main/java/fcb/project/manager/core/controller/HouseManagerController.java

@@ -1,16 +1,20 @@
 package fcb.project.manager.core.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.aliyun.oss.internal.OSSUtils;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import fcb.project.manager.base.entity.*;
 import fcb.project.manager.base.enums.AuditStatus;
 import fcb.project.manager.base.enums.HouseStatus;
+import fcb.project.manager.base.enums.SysUserRoleEnums;
 import fcb.project.manager.base.service.custom.PanoService;
 import fcb.project.manager.base.service.impl.TmAuditServiceImpl;
 import fcb.project.manager.base.service.impl.TmEstateServiceImpl;
 import fcb.project.manager.base.service.impl.TmHouseServiceImpl;
 import fcb.project.manager.base.service.impl.TmOperationServiceImpl;
 import fcb.project.manager.base.utils.DataUtils;
+import fcb.project.manager.base.utils.DateUtil;
+import fcb.project.manager.base.utils.ExcelUtil;
 import fcb.project.manager.core.feignInterfaces.SceneFeign;
 import fdage.back.sdk.base.entity.Result;
 import fdage.back.sdk.base.enums.ResultCodeEnum;
@@ -31,12 +35,14 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
-import java.io.File;
-import java.io.IOException;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -64,6 +70,9 @@ public class HouseManagerController extends BaseController{
     @Value("${image.local.path}")
     private String imageLocalPath;
 
+    @Value("${excel.local.path}")
+    private String excelLocalPath;
+
     @Value("${inner.vr.scene.host}")
     private String innerSceneVrHost;
 
@@ -130,10 +139,12 @@ public class HouseManagerController extends BaseController{
     @ApiOperation(value = "审核管理页面根据条件拉取所有房源")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "houseTitle", value = "房源名称", paramType = "query", required = false, dataType = "String"),
-            @ApiImplicitParam(name = "status", value = "状态: 0->草稿;1->待审核;2->已审核;3->未通过", paramType = "query", required = false, dataType = "Integer"),
+            @ApiImplicitParam(name = "status", value = "状态: 0 -> 草稿;1->待集团审核;2->已审核;-1->未通过;3->待地区审核", paramType = "query", required = false, dataType = "Integer"),
             @ApiImplicitParam(name = "type", value = "房源类型: 1->新房,2->二手房", paramType = "query", required = true, dataType = "String"),
             @ApiImplicitParam(name = "belongCompany", value = "所属公司ID", paramType = "query", required = true, dataType = "String"),
             @ApiImplicitParam(name = "estateName", value = "楼盘名称", paramType = "query", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "startTime", value = "审核开始时间(00:00:00)", paramType = "query", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "endTime", value = "审核结束时间(23:59:59)", paramType = "query", required = true, dataType = "String"),
             @ApiImplicitParam(name = "pageNum", value = "当前页码", paramType = "query", required = true, dataType = "Long"),
             @ApiImplicitParam(name = "pageSize", value = "每页大小", paramType = "query", required = true, dataType = "Long")
     })
@@ -142,15 +153,137 @@ public class HouseManagerController extends BaseController{
                                        @RequestParam(required = false , name = "type") Integer type,
                                        @RequestParam(name = "belongCompany") String belongCompany,
                                        @RequestParam(name = "estateName") String estateName,
+                                            @RequestParam(name = "startTime") String startTime,
+                                            @RequestParam(name = "endTime") String endTime,
                                        @RequestParam(name = "pageNum")Long pageNum,
                                        @RequestParam(name = "pageSize")Long pageSize){
+        ContextTokenBean tokenMap = getContextUserInfo();
 
         IPage<TmHouse> resultPage = tmHouseService.getAuditHouseList(houseTitle , status ,
-                type , belongCompany , estateName , getToken() ,  pageNum , pageSize);
+                type , belongCompany , estateName , getToken() , startTime, endTime,  pageNum , pageSize, tokenMap);
         return  Result.success(DataUtils.assembleResult(resultPage.getTotal(), resultPage.getPages(),
                 resultPage.getCurrent(), resultPage.getRecords()));
     }
 
+    @GetMapping("/exportAuditHouseList")
+    @ApiOperation(value = "审核管理页面根据条件拉取所有房源")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "houseTitle", value = "房源名称", paramType = "query", required = false, dataType = "String"),
+            @ApiImplicitParam(name = "status", value = "状态: 0->草稿;1->待审核;2->已审核;3->未通过", paramType = "query", required = false, dataType = "Integer"),
+            @ApiImplicitParam(name = "type", value = "房源类型: 1->新房,2->二手房", paramType = "query", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "belongCompany", value = "所属公司ID", paramType = "query", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "estateName", value = "楼盘名称", paramType = "query", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "startTime", value = "审核开始时间(00:00:00)", paramType = "query", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "endTime", value = "审核结束时间(23:59:59)", paramType = "query", required = true, dataType = "String"),
+    })
+    public Result exportAuditHouseList(@RequestParam(required = false) String houseTitle,
+                                            @RequestParam(required = false) Integer status,
+                                            @RequestParam(required = false , name = "type") Integer type,
+                                            @RequestParam(name = "belongCompany") String belongCompany,
+                                            @RequestParam(name = "estateName") String estateName,
+                                            @RequestParam(name = "startTime") String startTime,
+                                            @RequestParam(name = "endTime") String endTime,
+                                            @RequestParam(name = "pageNum")Long pageNum,
+                                            @RequestParam(name = "pageSize")Long pageSize, HttpServletResponse response) throws Exception{
+        ContextTokenBean tokenMap = getContextUserInfo();
+
+        List<TmHouse> houseList = tmHouseService.getAuditHouseListAll(houseTitle , status ,
+                type , belongCompany , estateName , startTime, endTime, tokenMap);
+
+        //导出的数据
+        Map<String, String> item = null;
+        List<Map> dataList = new ArrayList<Map>();
+        String outType = "";
+        int num = 0;
+        for(TmHouse house : houseList){
+            num += 1;
+            //楼盘数据
+            item = new HashMap();
+            item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[0], String.valueOf(num));
+            item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[1], house.getId());
+            item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[2], house.getHouseTitle());
+            if(house.getType().intValue() == 1){
+                item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[3], "新房");
+            }
+            if(house.getType().intValue() == 2){
+                item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[3], "二手房");
+            }
+
+
+            item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[4], house.getEstateName());
+            item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[5], house.getBelongCompanyName());
+            item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[6], house.getCreateByName());
+
+            DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[7], house.getSubmitAuditTime() == null? "" : house.getSubmitAuditTime().format(df));
+            if(house.getStatus().compareTo(HouseStatus.WAITING_AUDIT.getCode()) == 0){
+                item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[8], HouseStatus.WAITING_AUDIT.getDesc());
+            }
+            if(house.getStatus().compareTo(HouseStatus.AUDITED.getCode()) == 0){
+                item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[8], HouseStatus.AUDITED.getDesc());
+            }
+            if(house.getStatus().compareTo(HouseStatus.REJECT.getCode()) == 0){
+                item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[8], HouseStatus.REJECT.getDesc());
+            }
+            if(house.getStatus().compareTo(HouseStatus.DRAFT.getCode()) == 0){
+                item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[8], HouseStatus.DRAFT.getDesc());
+            }
+            if(house.getStatus().compareTo(HouseStatus.WAITING_REGION_AUDIT.getCode()) == 0){
+                item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[8], HouseStatus.WAITING_REGION_AUDIT.getDesc());
+            }
+            if(house.getStatus().compareTo(HouseStatus.REGION_REJECT.getCode()) == 0){
+                item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[8], HouseStatus.REGION_REJECT.getDesc());
+            }
+            item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[9], house.getAuditorName());
+            item.put(ExcelUtil.AUDIT_EXCEL_COLE_NAME[10], house.getAuditTime() == null? "" : house.getAuditTime().format(df));
+
+            dataList.add(item);
+        }
+
+        String date = DateUtil.date2String(new Date(), DateUtil.YYYYMMDDHHMMSS_DATA_FORMAT);
+
+        String aduitName = "";
+        if(status.compareTo(HouseStatus.ALL.getCode()) == 0){
+            aduitName = HouseStatus.ALL.getDesc();
+        }
+        if(status.compareTo(HouseStatus.WAITING_AUDIT.getCode()) == 0){
+            aduitName = HouseStatus.WAITING_AUDIT.getDesc();
+        }
+        if(status.compareTo(HouseStatus.AUDITED.getCode()) == 0){
+            aduitName = HouseStatus.AUDITED.getDesc();
+        }
+        if(status.compareTo(HouseStatus.REJECT.getCode()) == 0){
+            aduitName = "未通过";
+        }
+        if(status.compareTo(HouseStatus.WAITING_REGION_AUDIT.getCode()) == 0){
+            aduitName = HouseStatus.WAITING_REGION_AUDIT.getDesc();
+        }
+        String dateStr = "VR看房审核管理-" + aduitName + "-" + date;
+        String fileName = dateStr + ".xls";
+        File file = new File(excelLocalPath + fileName);
+        if(!file.getParentFile().exists()){
+            file.getParentFile().mkdirs();
+        }
+
+        ExcelUtil.writeExcel(dataList, ExcelUtil.AUDIT_EXCEL_COLE_NAME.length, excelLocalPath + fileName, dateStr);
+
+//        String agent = request.getHeader("User-Agent");
+//        if (agent != null && (agent.contains("MSIE")||agent.contains("Trident"))) {
+//            fileName = URLEncoder.encode(fileName, "UTF-8");
+//        } else {
+//            //非IE浏览器的处理:
+//            fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
+//        }
+//        response.setHeader("Content-Disposition", "attachment; filename=\""+fileName+"\"");
+//        response.setContentType(request.getServletContext().getMimeType(fileName));
+//        response.setContentLength((int) file.length());
+//        output(response, file);
+
+        return Result.success((Object) (outerSceneVrHost + "excel/" + dateStr + ".xls"));
+    }
+
+
+
     @GetMapping("/getShareLinks")
     @ApiOperation(value = "根据房源ID获取房源所有分享链接")
     @ApiImplicitParams({
@@ -331,6 +464,27 @@ public class HouseManagerController extends BaseController{
 
     }
 
+    @GetMapping("/canEdit")
+    @ApiOperation(value = "根据房源ID获取房源详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "houseId", value = "房源ID", paramType = "query", required = true, dataType = "String"),
+    })
+    public Result<Object> canEdit(@RequestParam(required = true) String houseId){
+        if(StringUtils.isBlank(houseId)){
+            return Result.failure("房源ID不能为空");
+        }
+        TmHouse tmHouse = tmHouseService.getById(houseId);
+        if(null == tmHouse || tmHouse.getIsDelete().compareTo(1) == 0){
+            return Result.failure("房源不存在");
+        }
+        if(tmHouse.getStatus().compareTo(HouseStatus.WAITING_AUDIT.getCode()) == 0 ||
+                tmHouse.getStatus().compareTo(HouseStatus.AUDITED.getCode()) == 0){
+            Result.success(false);
+        }
+        return Result.success(true);
+
+    }
+
     @GetMapping("/houseDetailWithoutAuth")
     @ApiOperation(value = "根据房源ID获取房源详情-无需授权,给H5使用")
     @ApiImplicitParams({
@@ -440,6 +594,11 @@ public class HouseManagerController extends BaseController{
             }
         }
 
+        ContextTokenBean tokenMap = getContextUserInfo();
+        if(!dbHouse.getCreateById().equals(tokenMap.getId())){
+            return Result.failure("非本人创建的,无法删除");
+        }
+
         int delete = tmHouseService.deleteHouseById(houseId);
         if(delete != 1){
             return Result.failure("删除失败");
@@ -555,6 +714,9 @@ public class HouseManagerController extends BaseController{
             dbHouse.setAuditId(tmAudit.getId());
             dbHouse.setSubmitAuditTime(LocalDateTime.now());
             dbHouse.setStatus(HouseStatus.WAITING_AUDIT.getCode());
+            if(SysUserRoleEnums.REGION_SHOOT.getRoleKey().equals(tokenMap.getRoleKey())){
+                dbHouse.setStatus(HouseStatus.WAITING_REGION_AUDIT.getCode());
+            }
             dbHouse.setUpdateTime(LocalDateTime.now());
             if(!tmHouseService.updateHouse(dbHouse)){
                 log.info("更新房源的审批id失败");
@@ -588,7 +750,8 @@ public class HouseManagerController extends BaseController{
         if(null == dbHouse || null == dbHouse.getAuditId()){
             return Result.failure("房源不存在或者未提交审核");
         }
-        if(HouseStatus.WAITING_AUDIT.getCode().compareTo(dbHouse.getStatus()) != 0){
+        if(HouseStatus.WAITING_AUDIT.getCode().compareTo(dbHouse.getStatus()) != 0 &&
+                HouseStatus.WAITING_REGION_AUDIT.getCode().compareTo(dbHouse.getStatus()) != 0){
             return Result.failure("房源状态非待审核");
         }
         dbHouse = null;
@@ -605,6 +768,11 @@ public class HouseManagerController extends BaseController{
         if(null != tmAudit.getAuditStatus() && AuditStatus.AUDITED.getCode().compareTo(tmAudit.getAuditStatus()) == 0){
             return Result.failure("该房源已经审核过,无法撤回");
         }
+
+        ContextTokenBean tokenMap =  getContextUserInfo();
+        if(!tokenMap.getId().equals(tmAudit.getCreatorId())){
+            return Result.failure("仅支持撤回本人提交的VR项目");
+        }
         //开启事务,抢审批记录的锁
         tmAudit = null;
         tmAudit = tmAuditService.selectForUpdate(dbHouse.getAuditId());
@@ -636,5 +804,26 @@ public class HouseManagerController extends BaseController{
         return Result.success("撤销成功");
     }
 
-
+    private static void output(HttpServletResponse resp, File file) {
+        OutputStream os = null;
+        BufferedInputStream bis = null;
+        byte[] buff = new byte[1024];
+        try {
+            os = resp.getOutputStream();
+            bis = new BufferedInputStream(new FileInputStream(file));
+            int i = 0;
+            while ((i = bis.read(buff)) != -1) {
+                os.write(buff, 0, i);
+                os.flush();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                bis.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }

+ 6 - 0
fcb-project-manager-core/src/main/java/fcb/project/manager/core/feignInterfaces/PanoFeign.java

@@ -36,4 +36,10 @@ public interface PanoFeign {
     @GetMapping("/fcb/pano/init/list/{houseId}")
     public PanoInitSceneTotalRsp getAllTypeSceneNums(@PathVariable String houseId , @RequestHeader(name = "token") String token);
 
+    @GetMapping("/fcb/pano/house/statistics/{houseId}")
+    public CommonRspBean statistics(@PathVariable String houseId , @RequestHeader(name = "token") String token);
+
+    @GetMapping("/fcb/pano/house/getVrSceneCode/{houseId}")
+    public SevenTwoZeroSceneRspBean getAllSceneNum(@RequestHeader(name = "token") String token , @PathVariable(name = "") String houseId);
+
 }

+ 3 - 0
fcb-project-manager-core/src/main/java/fcb/project/manager/core/feignInterfaces/SceneFeign.java

@@ -19,4 +19,7 @@ public interface SceneFeign {
 
     @PostMapping("/api/scene/updateStatus")
     public SceneRspBean updateSceneStatus(@RequestBody Map<String , Object> param , @RequestHeader(name = "token") String token);
+
+    @PostMapping("/api/scene/statisticsPoints")
+    public SceneRspBean statisticsPoints(@RequestBody Map<String , String> param , @RequestHeader(name = "token") String token);
 }

+ 17 - 0
fcb-project-manager-core/src/main/java/fcb/project/manager/core/feignInterfaces/fallBack/PanoFeignFallBack.java

@@ -5,6 +5,8 @@ import fcb.project.manager.base.entity.PanoInitSceneTotalRsp;
 import fcb.project.manager.base.entity.SevenTwoZeroSceneRspBean;
 import fcb.project.manager.core.feignInterfaces.PanoFeign;
 import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestHeader;
 
 import java.util.Map;
 
@@ -62,4 +64,19 @@ public class PanoFeignFallBack implements PanoFeign {
         commonRspBean.setCode(-1);
         return commonRspBean;
     }
+
+    @Override
+    public CommonRspBean statistics(@PathVariable String houseId, @RequestHeader(name = "token") String token) {
+        CommonRspBean commonRspBean = new CommonRspBean();
+        commonRspBean.setMsg("服务超时");
+        commonRspBean.setCode(-1);
+        return commonRspBean;
+    }
+
+    @Override
+    public SevenTwoZeroSceneRspBean getAllSceneNum(@RequestHeader(name = "token") String token, @PathVariable(name = "") String houseId) {
+        SevenTwoZeroSceneRspBean sevenTwoZeroSceneRspBean = new SevenTwoZeroSceneRspBean();
+        sevenTwoZeroSceneRspBean.setCode(-1);
+        return sevenTwoZeroSceneRspBean;
+    }
 }

+ 10 - 0
fcb-project-manager-core/src/main/java/fcb/project/manager/core/feignInterfaces/fallBack/SceneFeignFallBack.java

@@ -3,6 +3,8 @@ package fcb.project.manager.core.feignInterfaces.fallBack;
 import fcb.project.manager.base.entity.SceneRspBean;
 import fcb.project.manager.core.feignInterfaces.SceneFeign;
 import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
 
 import java.util.Map;
 
@@ -22,4 +24,12 @@ public class SceneFeignFallBack implements SceneFeign {
         sceneRspBean.setMsg("服务超时");
         return sceneRspBean;
     }
+
+    @Override
+    public SceneRspBean statisticsPoints(@RequestBody Map<String, String> param, @RequestHeader(name = "token") String token) {
+        SceneRspBean sceneRspBean = new SceneRspBean();
+        sceneRspBean.setCode(-1);
+        sceneRspBean.setMsg("服务超时");
+        return sceneRspBean;
+    }
 }

+ 11 - 0
pom.xml

@@ -178,6 +178,17 @@
             <version>3.4.0</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.8</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.8</version>
+        </dependency>
+
     </dependencies>