Prechádzať zdrojové kódy

新增房源格式化

houweiyu 4 rokov pred
rodič
commit
812d6fa0f0
33 zmenil súbory, kde vykonal 1685 pridanie a 12 odobranie
  1. 33 0
      pom.xml
  2. 7 1
      src/main/java/fcb/project/manager/FcbProjectManagerApplication.java
  3. 50 0
      src/main/java/fcb/project/manager/base/config/RedisConfiguration.java
  4. 16 0
      src/main/java/fcb/project/manager/base/dao/TmApiHouseInfoDao.java
  5. 16 0
      src/main/java/fcb/project/manager/base/dao/TmApiHouseRecommendDao.java
  6. 16 0
      src/main/java/fcb/project/manager/base/dao/TmApiRoomIdLogDao.java
  7. 198 0
      src/main/java/fcb/project/manager/base/entity/TmApiHouseInfo.java
  8. 52 0
      src/main/java/fcb/project/manager/base/entity/TmApiHouseRecommend.java
  9. 46 0
      src/main/java/fcb/project/manager/base/entity/TmApiRoomIdLog.java
  10. 40 0
      src/main/java/fcb/project/manager/base/enums/TerminalType.java
  11. 34 0
      src/main/java/fcb/project/manager/base/enums/UuidPreEnum.java
  12. 2 2
      src/main/java/fcb/project/manager/base/generator/CodeGenerator.java
  13. 18 0
      src/main/java/fcb/project/manager/base/rocketMq/HouseFormatEvent.java
  14. 17 0
      src/main/java/fcb/project/manager/base/service/ITmApiHouseInfoService.java
  15. 16 0
      src/main/java/fcb/project/manager/base/service/ITmApiHouseRecommendService.java
  16. 16 0
      src/main/java/fcb/project/manager/base/service/ITmApiRoomIdLogService.java
  17. 75 0
      src/main/java/fcb/project/manager/base/service/impl/TmApiHouseInfoServiceImpl.java
  18. 81 0
      src/main/java/fcb/project/manager/base/service/impl/TmApiHouseRecommendServiceImpl.java
  19. 20 0
      src/main/java/fcb/project/manager/base/service/impl/TmApiRoomIdLogServiceImpl.java
  20. 2 1
      src/main/java/fcb/project/manager/base/service/impl/TmHouseServiceImpl.java
  21. 548 0
      src/main/java/fcb/project/manager/base/utils/RedisServiceUtils.java
  22. 145 0
      src/main/java/fcb/project/manager/core/controller/ApiFormatHouseController.java
  23. 12 0
      src/main/java/fcb/project/manager/core/controller/ApiQueryHouseController.java
  24. 0 1
      src/main/java/fcb/project/manager/core/controller/AuditController.java
  25. 162 0
      src/main/java/fcb/project/manager/core/rocketmqConsumer/AsyncWriteDbConsumerListener.java
  26. 11 1
      src/main/resources/application-dev.properties
  27. 13 1
      src/main/resources/application-prod.properties
  28. 13 1
      src/main/resources/application-test.properties
  29. 10 3
      src/main/resources/application.properties
  30. 1 1
      src/main/resources/log4j2.xml
  31. 5 0
      src/main/resources/mybatis/mappers/TmApiHouseInfoMapper.xml
  32. 5 0
      src/main/resources/mybatis/mappers/TmApiHouseRecommendMapper.xml
  33. 5 0
      src/main/resources/mybatis/mappers/TmApiRoomIdLogMapper.xml

+ 33 - 0
pom.xml

@@ -20,6 +20,7 @@
         <maven-surefire-plugin.version>2.19.1</maven-surefire-plugin.version>
         <nacos.latest.version>0.2.1</nacos.latest.version>
         <nacos-config-spring-boot.version>0.2.1</nacos-config-spring-boot.version>
+        <jedis-version>3.1.0</jedis-version>
     </properties>
 
     <parent>
@@ -29,6 +30,8 @@
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
 
+
+
     <dependencyManagement>
         <dependencies>
             <dependency>
@@ -55,6 +58,12 @@
             <groupId>org.4dage</groupId>
             <artifactId>4dage-back-sdk</artifactId>
             <version>1.0.2-RELEASE</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.lettuce</groupId>
+                    <artifactId>lettuce-core</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <!-- nacos 注册中心依赖 -->
@@ -95,6 +104,30 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-openfeign</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <version>${jedis-version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.lettuce</groupId>
+                    <artifactId>lettuce-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-spring-boot-starter</artifactId>
+            <version>2.1.1</version>
+        </dependency>
+
     </dependencies>
 
 

+ 7 - 1
src/main/java/fcb/project/manager/FcbProjectManagerApplication.java

@@ -1,10 +1,12 @@
 package fcb.project.manager;
 
+import fcb.project.manager.base.rocketmq.listener.MqMsgLoadBaseListener;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Bean;
 
 /**
  * @author abnerhou
@@ -17,7 +19,11 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
 @SpringBootApplication
 @MapperScan(basePackages = {"fcb.project.manager.base.dao"})
 public class FcbProjectManagerApplication {
+
+
     public static void main(String[] args) {
-        SpringApplication.run(FcbProjectManagerApplication.class, args);
+        SpringApplication springApplication = new SpringApplication(FcbProjectManagerApplication.class);
+//        springApplication.addListeners(new MqMsgLoadBaseListener());
+        springApplication.run(args);
     }
 }

+ 50 - 0
src/main/java/fcb/project/manager/base/config/RedisConfiguration.java

@@ -0,0 +1,50 @@
+package fcb.project.manager.base.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+
+/**
+ * 2 * @Author: Abner
+ * 3 * @Date: 2021/1/11 11:44
+ * 4
+ */
+
+@Configuration
+@EnableCaching
+public class RedisConfiguration {
+
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        template.setConnectionFactory(factory);
+
+        // 使用Jackson2JsonRedisSerialize 替换默认的jdkSerializeable序列化
+        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+        ObjectMapper om = new ObjectMapper();
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        jackson2JsonRedisSerializer.setObjectMapper(om);
+
+        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
+
+        // key采用String的序列化方式
+        template.setKeySerializer(stringRedisSerializer);
+        // hash的key也采用String的序列化方式
+        template.setHashKeySerializer(stringRedisSerializer);
+        // value序列化方式采用jackson
+        template.setValueSerializer(jackson2JsonRedisSerializer);
+        // hash的value序列化方式采用jackson
+        template.setHashValueSerializer(jackson2JsonRedisSerializer);
+        template.afterPropertiesSet();
+        return template;
+    }
+}

+ 16 - 0
src/main/java/fcb/project/manager/base/dao/TmApiHouseInfoDao.java

@@ -0,0 +1,16 @@
+package fcb.project.manager.base.dao;
+
+import fcb.project.manager.base.entity.TmApiHouseInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 房源信息表 Mapper 接口
+ * </p>
+ *
+ * @author abner
+ * @since 2021-01-11
+ */
+public interface TmApiHouseInfoDao extends BaseMapper<TmApiHouseInfo> {
+
+}

+ 16 - 0
src/main/java/fcb/project/manager/base/dao/TmApiHouseRecommendDao.java

@@ -0,0 +1,16 @@
+package fcb.project.manager.base.dao;
+
+import fcb.project.manager.base.entity.TmApiHouseRecommend;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 房源和推荐房源的关联关系表 Mapper 接口
+ * </p>
+ *
+ * @author abner
+ * @since 2021-01-11
+ */
+public interface TmApiHouseRecommendDao extends BaseMapper<TmApiHouseRecommend> {
+
+}

+ 16 - 0
src/main/java/fcb/project/manager/base/dao/TmApiRoomIdLogDao.java

@@ -0,0 +1,16 @@
+package fcb.project.manager.base.dao;
+
+import fcb.project.manager.base.entity.TmApiRoomIdLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 房间号历史记录 Mapper 接口
+ * </p>
+ *
+ * @author abner
+ * @since 2021-01-11
+ */
+public interface TmApiRoomIdLogDao extends BaseMapper<TmApiRoomIdLog> {
+
+}

+ 198 - 0
src/main/java/fcb/project/manager/base/entity/TmApiHouseInfo.java

@@ -0,0 +1,198 @@
+package fcb.project.manager.base.entity;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 房源信息表
+ * </p>
+ *
+ * @author abner
+ * @since 2021-01-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="TmApiHouseInfo对象", description="房源信息表")
+public class TmApiHouseInfo implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    @ApiModelProperty(value = "请求id")
+    private String requestId;
+
+    @ApiModelProperty(value = "房源唯一主键")
+    private String houseId;
+
+    @ApiModelProperty(value = "参考总价")
+    private BigDecimal houseReferencePrice;
+
+    @ApiModelProperty(value = "户型")
+    private String houseType;
+
+    @ApiModelProperty(value = "房源面积")
+    private Double houseArea;
+
+    @ApiModelProperty(value = "房源朝向")
+    private String houseOrientation;
+
+    @ApiModelProperty(value = "楼盘id")
+    private String estateId;
+
+    @ApiModelProperty(value = "楼盘的房源均价")
+    private BigDecimal estateReferenceAveragePrice;
+
+    @ApiModelProperty(value = "最早交房日期")
+    private LocalDate earlistHandOver;
+
+    @ApiModelProperty(value = "最早开盘时间")
+    private LocalDate onSaleTime;
+
+    @ApiModelProperty(value = "楼盘开发商")
+    private String estateDeveloper;
+
+    @ApiModelProperty(value = "产权年限")
+    private Integer estatePeriodInt;
+
+    @ApiModelProperty(value = "楼盘地址")
+    private String estateAddress;
+
+    @ApiModelProperty(value = "楼盘简介视频地址")
+    private String estateIntroduceVideo;
+
+    @ApiModelProperty(value = "楼盘介绍照片集地址")
+    private String estateImages;
+
+    @ApiModelProperty(value = "楼盘经度")
+    private BigDecimal estateLongitude;
+
+    @ApiModelProperty(value = "楼盘未读")
+    private BigDecimal estateLatitude;
+
+    @ApiModelProperty(value = "楼盘详情封面照片地址")
+    private String estateCoverImage;
+
+    @ApiModelProperty(value = "视频简介封面照片地址")
+    private String estateVideoCoverImage;
+
+    @ApiModelProperty(value = "经纪人唯一id")
+    private String agencyId;
+
+    @ApiModelProperty(value = "经纪人姓名")
+    private String agencyName;
+
+    @ApiModelProperty(value = "经纪人门店")
+    private String agencyStore;
+
+    @ApiModelProperty(value = "经纪人标签")
+    private String agencyTag;
+
+    @ApiModelProperty(value = "经纪人手机号码")
+    private String agnencyPhone;
+
+    @ApiModelProperty(value = "经纪人半年成交量")
+    private Integer agencyHalfYearVolume;
+
+    @ApiModelProperty(value = "经纪人平均成交周期(天)")
+    private Double agencyDealAverage;
+
+    @ApiModelProperty(value = "经纪人近30天带看数(套)")
+    private Integer agencyRecentRecommend;
+
+    @ApiModelProperty(value = "经纪人头像地址")
+    private String agencyAvatar;
+
+    @ApiModelProperty(value = "经纪人工作证照片地址")
+    private String agencyPassImage;
+
+    @ApiModelProperty(value = "经纪人标签图标地址")
+    private String agencyTagImage;
+
+    @ApiModelProperty(value = "用户唯一id")
+    private String userId;
+
+    @ApiModelProperty(value = "用户名字")
+    private String userName;
+
+    @ApiModelProperty(value = "回调域名")
+    private String callBackUrl;
+
+    @ApiModelProperty(value = "开发者应用id")
+    private String appId;
+
+    @ApiModelProperty(value = "开发者token")
+    private String appToken;
+
+    @ApiModelProperty(value = "数据签名")
+    private String appSign;
+
+    @ApiModelProperty(value = "自定义内容")
+    private String customContent;
+
+    @ApiModelProperty(value = "创建时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "最新修改时间")
+    private LocalDateTime lastModifyDatetime;
+
+    @ApiModelProperty(value = "vr同屏带看房间号")
+    private String communicateRoomId;
+
+    @ApiModelProperty(value = "四维看看相机的场景码")
+    private String sceneNum;
+
+    @ApiModelProperty(value = "请求端的类型:经纪人:agent,用户;customer")
+    private String terminalType;
+
+    @ApiModelProperty(value = "推荐房源列表")
+    private String recommendHouses;
+
+    @ApiModelProperty(value = "房源标题")
+    private String houseTitle;
+
+    @ApiModelProperty(value = "房源户型照片地址")
+    private String houseTypeImages;
+
+    @ApiModelProperty(value = "视频简介描述")
+    private String estateIntroduceVideoDesc;
+
+    @ApiModelProperty(value = "是否可用: 1 可用, 0 已删除")
+    private Integer enable;
+
+    @ApiModelProperty(value = "经纪公司品牌名称")
+    private String agencyCompanyName;
+
+    @ApiModelProperty(value = "用户头像地址")
+    private String userAvatar;
+
+    @ApiModelProperty(value = "开发者用户logo")
+    private String developerLogo;
+
+    @ApiModelProperty(value = "开发者用户标题")
+    private String developerTitle;
+
+    @ApiModelProperty(value = "开发者用户描述")
+    private String developerDesc;
+
+    @ApiModelProperty(value = "开发者用户分享二维码地址")
+    private String developerQrCode;
+
+    @ApiModelProperty(value = "开发者用户分享二维码缺失的文字描述")
+    private String developerQrCodeDesc;
+
+    @ApiModelProperty(value = "四维的默认分享码")
+    private String wxAqrCode;
+
+    @ApiModelProperty(value = "带看主页面公司logo链接")
+    private String homePageLogo;
+
+
+}

+ 52 - 0
src/main/java/fcb/project/manager/base/entity/TmApiHouseRecommend.java

@@ -0,0 +1,52 @@
+package fcb.project.manager.base.entity;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 房源和推荐房源的关联关系表
+ * </p>
+ *
+ * @author abner
+ * @since 2021-01-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="TmApiHouseRecommend对象", description="房源和推荐房源的关联关系表")
+public class TmApiHouseRecommend implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    @ApiModelProperty(value = "关联关系ID")
+    private String relationNo;
+
+    @ApiModelProperty(value = "当前房源的vr场景码")
+    private String sceneNum;
+
+    @ApiModelProperty(value = "推荐的房源的vr场景码")
+    private String recommendSceneNum;
+
+    @ApiModelProperty(value = "是否可用:1可用,0不可用")
+    private Integer enable;
+
+    @ApiModelProperty(value = "创建时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "最后修改时间")
+    private LocalDateTime lastModifyDatetime;
+
+    @ApiModelProperty(value = "房源和推荐房源所属的经纪人id")
+    private String agencyId;
+
+    @ApiModelProperty(value = "vr同屏带看房间号")
+    private String communicateRoomId;
+
+
+}

+ 46 - 0
src/main/java/fcb/project/manager/base/entity/TmApiRoomIdLog.java

@@ -0,0 +1,46 @@
+package fcb.project.manager.base.entity;
+
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 房间号历史记录
+ * </p>
+ *
+ * @author abner
+ * @since 2021-01-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="TmApiRoomIdLog对象", description="房间号历史记录")
+public class TmApiRoomIdLog implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    @ApiModelProperty(value = "记录ID")
+    private String logId;
+
+    @ApiModelProperty(value = "vr同屏带看房间号")
+    private String communicateRoomId;
+
+    @ApiModelProperty(value = "是否可用:1->可用;0->不可用")
+    private Integer enable;
+
+    @ApiModelProperty(value = "创建时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "最新更新时间")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "场景码")
+    private String sceneNum;
+
+
+}

+ 40 - 0
src/main/java/fcb/project/manager/base/enums/TerminalType.java

@@ -0,0 +1,40 @@
+package fcb.project.manager.base.enums;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * @author abnerhou
+ * @date 2020/6/5 18:16
+ * @desciption
+ */
+public enum TerminalType {
+    CUSTOMER("customer" , "用户端"),
+    AGENT("agent" , "经纪人端"),
+    ;
+    private String type;
+    private String desc;
+
+    TerminalType(String type, String desc) {
+        this.type = type;
+        this.desc = desc;
+    }
+
+    public  static TerminalType getByType(String type){
+        if(StringUtils.isNoneBlank(type)){
+            for (TerminalType terminalType : TerminalType.values()){
+                if(StringUtils.equals(terminalType.getType() , type)){
+                    return terminalType;
+                }
+            }
+        }
+        return null;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 34 - 0
src/main/java/fcb/project/manager/base/enums/UuidPreEnum.java

@@ -0,0 +1,34 @@
+package fcb.project.manager.base.enums;
+
+/**
+ * 2 * @Author: Abner
+ * 3 * @Date: 2021/1/11 16:18
+ * 4
+ */
+public enum UuidPreEnum {
+
+    AUDIT_ID_PRE("AUD00000" , "项目管理的审核UUID前缀"),
+    ESTATE_ID_PRE("EST00001" , "项目管理的楼盘UUID前缀"),
+    HOUSE_ID_PRE("HUS00001" , "项目管理中房源的UUID前缀"),
+    API_REQUEST_ID_PRE("HOUSREQ0" , "房源格式化请求的UUID前缀"),
+    API_ROOM_ID_PRE("ROOMID01" , "VR看房的SOCKET房间号的UUID前缀"),
+    API_HOUSE_ID_PRE("APIHOUSE" , "API房源信息的UUID前缀"),
+    API_HOUSE_RECOMMEND_ID_PRE("RECHOUSE" , "API房源的推荐房源信息的UUID前缀"),
+    ;
+    private String pre;
+    private String desc;
+
+
+    UuidPreEnum(String pre, String desc) {
+        this.pre = pre;
+        this.desc = desc;
+    }
+
+    public String getPre() {
+        return pre;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 2 - 2
src/main/java/fcb/project/manager/base/generator/CodeGenerator.java

@@ -37,10 +37,10 @@ public class CodeGenerator {
         mpg.setGlobalConfig(gc);
 
         DataSourceConfig dsc = new DataSourceConfig();
-        dsc.setUrl("jdbc:mysql://120.25.146.52:3306/fcb-project-manager?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
+        dsc.setUrl("jdbc:mysql://8.135.98.231:3306/fcb-project-manager?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
         dsc.setDriverName("com.mysql.cj.jdbc.Driver");
         dsc.setUsername("root");
-        dsc.setPassword("4dkk2020test%");
+        dsc.setPassword("4DAGE168!a");
         mpg.setDataSource(dsc);
 
         // 包配置

+ 18 - 0
src/main/java/fcb/project/manager/base/rocketMq/HouseFormatEvent.java

@@ -0,0 +1,18 @@
+package fcb.project.manager.base.rocketMq;
+
+import fcb.project.manager.base.entity.TmApiHouseInfo;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 2 * @Author: Abner
+ * 3 * @Date: 2021/1/12 17:02
+ * 4
+ */
+@Data
+public class HouseFormatEvent implements Serializable {
+
+    private List<TmApiHouseInfo> houseInfoList;
+}

+ 17 - 0
src/main/java/fcb/project/manager/base/service/ITmApiHouseInfoService.java

@@ -0,0 +1,17 @@
+package fcb.project.manager.base.service;
+
+import fcb.project.manager.base.entity.TmApiHouseInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 房源信息表 服务类
+ * </p>
+ *
+ * @author abner
+ * @since 2021-01-11
+ */
+public interface ITmApiHouseInfoService extends IService<TmApiHouseInfo> {
+
+
+}

+ 16 - 0
src/main/java/fcb/project/manager/base/service/ITmApiHouseRecommendService.java

@@ -0,0 +1,16 @@
+package fcb.project.manager.base.service;
+
+import fcb.project.manager.base.entity.TmApiHouseRecommend;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 房源和推荐房源的关联关系表 服务类
+ * </p>
+ *
+ * @author abner
+ * @since 2021-01-11
+ */
+public interface ITmApiHouseRecommendService extends IService<TmApiHouseRecommend> {
+
+}

+ 16 - 0
src/main/java/fcb/project/manager/base/service/ITmApiRoomIdLogService.java

@@ -0,0 +1,16 @@
+package fcb.project.manager.base.service;
+
+import fcb.project.manager.base.entity.TmApiRoomIdLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 房间号历史记录 服务类
+ * </p>
+ *
+ * @author abner
+ * @since 2021-01-11
+ */
+public interface ITmApiRoomIdLogService extends IService<TmApiRoomIdLog> {
+
+}

+ 75 - 0
src/main/java/fcb/project/manager/base/service/impl/TmApiHouseInfoServiceImpl.java

@@ -0,0 +1,75 @@
+package fcb.project.manager.base.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import fcb.project.manager.base.entity.TmApiHouseInfo;
+import fcb.project.manager.base.dao.TmApiHouseInfoDao;
+import fcb.project.manager.base.enums.UuidPreEnum;
+import fcb.project.manager.base.service.ITmApiHouseInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import fdage.back.sdk.base.uuid.SnowFlakeUUidUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 房源信息表 服务实现类
+ * </p>
+ *
+ * @author abner
+ * @since 2021-01-11
+ */
+@Service
+public class TmApiHouseInfoServiceImpl extends ServiceImpl<TmApiHouseInfoDao, TmApiHouseInfo> implements ITmApiHouseInfoService {
+
+    public TmApiHouseInfo getHouseBySceneAndRoomId(String sceneNum , String communicateRoomId){
+
+        if(StringUtils.isNoneBlank(sceneNum , communicateRoomId)){
+            LambdaQueryWrapper<TmApiHouseInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+            lambdaQueryWrapper.eq(TmApiHouseInfo::getSceneNum , sceneNum);
+            lambdaQueryWrapper.eq(TmApiHouseInfo::getCommunicateRoomId , communicateRoomId);
+            lambdaQueryWrapper.eq(TmApiHouseInfo::getEnable , 1);
+            lambdaQueryWrapper.last("limit 1");
+            return getBaseMapper().selectOne(lambdaQueryWrapper);
+        }
+        return null;
+    }
+
+    public TmApiHouseInfo getHouseBySceneAndHouseId(String sceneNum , String houseId){
+
+        if(StringUtils.isNoneBlank(sceneNum , houseId)){
+            LambdaQueryWrapper<TmApiHouseInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+            lambdaQueryWrapper.eq(TmApiHouseInfo::getSceneNum , sceneNum);
+            lambdaQueryWrapper.eq(TmApiHouseInfo::getHouseId , houseId);
+            lambdaQueryWrapper.eq(TmApiHouseInfo::getEnable , 1);
+            lambdaQueryWrapper.last("limit 1");
+            return getBaseMapper().selectOne(lambdaQueryWrapper);
+        }
+        return null;
+    }
+
+    public int insertNew(TmApiHouseInfo tmApiHouseInfo){
+        if(null == tmApiHouseInfo){
+            return -1;
+        }
+
+        if(StringUtils.isBlank(tmApiHouseInfo.getRequestId())){
+            tmApiHouseInfo.setRequestId(SnowFlakeUUidUtils.generaUUid(null , null , UuidPreEnum.API_HOUSE_ID_PRE.getPre()));
+        }
+        if(null == tmApiHouseInfo.getEnable()){
+            tmApiHouseInfo.setEnable(1);
+        }
+        if(null == tmApiHouseInfo.getCreateTime()){
+           tmApiHouseInfo.setCreateTime(LocalDateTime.now());
+        }
+        if(null == tmApiHouseInfo.getLastModifyDatetime()){
+            tmApiHouseInfo.setLastModifyDatetime(LocalDateTime.now());
+        }
+
+        return getBaseMapper().insert(tmApiHouseInfo);
+    }
+
+
+
+}

+ 81 - 0
src/main/java/fcb/project/manager/base/service/impl/TmApiHouseRecommendServiceImpl.java

@@ -0,0 +1,81 @@
+package fcb.project.manager.base.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import fcb.project.manager.base.entity.TmApiHouseRecommend;
+import fcb.project.manager.base.dao.TmApiHouseRecommendDao;
+import fcb.project.manager.base.enums.UuidPreEnum;
+import fcb.project.manager.base.service.ITmApiHouseRecommendService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import fdage.back.sdk.base.uuid.SnowFlakeUUidUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 房源和推荐房源的关联关系表 服务实现类
+ * </p>
+ *
+ * @author abner
+ * @since 2021-01-11
+ */
+@Service
+public class TmApiHouseRecommendServiceImpl extends ServiceImpl<TmApiHouseRecommendDao, TmApiHouseRecommend> implements ITmApiHouseRecommendService {
+
+    public TmApiHouseRecommend getRecommendByScene(String fromSceneNum , String toSceneNum){
+        if(StringUtils.isNoneBlank(fromSceneNum , toSceneNum)){
+            LambdaQueryWrapper<TmApiHouseRecommend> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+            lambdaQueryWrapper.eq(TmApiHouseRecommend::getSceneNum , fromSceneNum);
+            lambdaQueryWrapper.eq(TmApiHouseRecommend::getRecommendSceneNum , toSceneNum);
+            lambdaQueryWrapper.eq(TmApiHouseRecommend::getEnable , 1);
+            lambdaQueryWrapper.last(" limit 1");
+            return getBaseMapper().selectOne(lambdaQueryWrapper);
+        }
+        return null;
+    }
+
+    public TmApiHouseRecommend getRecommendByScene(String fromSceneNum , String toSceneNum , String communicatRoomId){
+        if(StringUtils.isNoneBlank(fromSceneNum , toSceneNum)){
+            LambdaQueryWrapper<TmApiHouseRecommend> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+            lambdaQueryWrapper.eq(TmApiHouseRecommend::getSceneNum , fromSceneNum);
+            lambdaQueryWrapper.eq(TmApiHouseRecommend::getRecommendSceneNum , toSceneNum);
+            lambdaQueryWrapper.eq(TmApiHouseRecommend::getEnable , 1);
+            lambdaQueryWrapper.eq(TmApiHouseRecommend::getCommunicateRoomId , communicatRoomId);
+            lambdaQueryWrapper.last(" limit 1");
+            return getBaseMapper().selectOne(lambdaQueryWrapper);
+        }
+        return null;
+    }
+
+    public List<TmApiHouseRecommend> getRecommendList(String sceneNum){
+        if(StringUtils.isNotBlank(sceneNum)){
+            LambdaQueryWrapper<TmApiHouseRecommend> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+            lambdaQueryWrapper.eq(TmApiHouseRecommend::getSceneNum , sceneNum);
+            lambdaQueryWrapper.eq(TmApiHouseRecommend::getEnable , 1);
+            return getBaseMapper().selectList(lambdaQueryWrapper);
+        }
+        return null;
+    }
+
+    public int insertRecommend(TmApiHouseRecommend tmApiHouseRecommend){
+        if(null == tmApiHouseRecommend){
+            return -1;
+        }
+        if(StringUtils.isBlank(tmApiHouseRecommend.getRelationNo())){
+            tmApiHouseRecommend.setRelationNo(SnowFlakeUUidUtils.generaUUid(null ,
+                    null , UuidPreEnum.API_HOUSE_RECOMMEND_ID_PRE.getPre()));
+            if(null == tmApiHouseRecommend.getEnable()){
+                tmApiHouseRecommend.setEnable(1);
+            }
+            if(null == tmApiHouseRecommend.getCreateTime()){
+                tmApiHouseRecommend.setCreateTime(LocalDateTime.now());
+            }
+        }
+        tmApiHouseRecommend.setLastModifyDatetime(LocalDateTime.now());
+        return getBaseMapper().insert(tmApiHouseRecommend);
+    }
+
+
+}

+ 20 - 0
src/main/java/fcb/project/manager/base/service/impl/TmApiRoomIdLogServiceImpl.java

@@ -0,0 +1,20 @@
+package fcb.project.manager.base.service.impl;
+
+import fcb.project.manager.base.entity.TmApiRoomIdLog;
+import fcb.project.manager.base.dao.TmApiRoomIdLogDao;
+import fcb.project.manager.base.service.ITmApiRoomIdLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 房间号历史记录 服务实现类
+ * </p>
+ *
+ * @author abner
+ * @since 2021-01-11
+ */
+@Service
+public class TmApiRoomIdLogServiceImpl extends ServiceImpl<TmApiRoomIdLogDao, TmApiRoomIdLog> implements ITmApiRoomIdLogService {
+
+}

+ 2 - 1
src/main/java/fcb/project/manager/base/service/impl/TmHouseServiceImpl.java

@@ -7,6 +7,7 @@ import fcb.project.manager.base.entity.TmEstate;
 import fcb.project.manager.base.entity.TmHouse;
 import fcb.project.manager.base.dao.TmHouseDao;
 import fcb.project.manager.base.enums.DeleteStatus;
+import fcb.project.manager.base.enums.UuidPreEnum;
 import fcb.project.manager.base.service.ITmHouseService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import fdage.back.sdk.base.uuid.SnowFlakeUUidUtils;
@@ -88,7 +89,7 @@ public class TmHouseServiceImpl extends ServiceImpl<TmHouseDao, TmHouse> impleme
 
     public boolean insertNew(TmHouse tmHouse){
         if(StringUtils.isBlank(tmHouse.getId())){
-            tmHouse.setId(SnowFlakeUUidUtils.generaUUid(null , null ,  "HUS00001"));
+            tmHouse.setId(SnowFlakeUUidUtils.generaUUid(null , null , UuidPreEnum.HOUSE_ID_PRE.getPre()));
         }
         tmHouse.setCreateTime(LocalDateTime.now());
         tmHouse.setUpdateTime(LocalDateTime.now());

+ 548 - 0
src/main/java/fcb/project/manager/base/utils/RedisServiceUtils.java

@@ -0,0 +1,548 @@
+package fcb.project.manager.base.utils;
+
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+/**
+ * 2 * @Author: Abner
+ * 3 * @Date: 2021/1/11 11:45
+ * 4
+ */
+@Service
+@Log4j2
+public class RedisServiceUtils {
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+    /**
+     * 指定缓存失效时间
+     *
+     * @param key 键
+     * @param time 时间(秒)
+     * @return
+     */
+    public boolean expire(String key, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error("exception when expire key {}. ", key, e);
+            return false;
+        }
+    }
+
+    /**
+     * 根据key获取过期时间
+     *
+     * @param key 键 不能为null
+     * @return 时间(秒) 返回0代表为永久有效
+     */
+    public long getExpire(String key) {
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 判断key是否存在
+     *
+     * @param key  键
+     * @return true 存在 false不存在
+     */
+    public boolean hasKey(String key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            log.error("exception when check key {}. ", key, e);
+            return false;
+        }
+    }
+
+    /**
+     * 删除缓存
+     *
+     * @param key 可以传一个值 或多个
+     */
+    @SuppressWarnings("unchecked")
+    public void del(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                redisTemplate.delete(key[0]);
+            } else {
+                redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+    }
+
+    /**
+     * 普通缓存获取
+     *
+     * @param key 键
+     * @return 值
+     */
+    public Object get(String key) {
+        return key == null ? null : redisTemplate.opsForValue().get(key);
+    }
+
+    /**
+     * 普通缓存放入
+     *
+     * @param key 键
+     * @param value 值
+     * @return true成功 false失败
+     */
+    public boolean set(String key, Object value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            log.error("exception when set key {}. ", key, e);
+            return false;
+        }
+
+    }
+
+    /**
+     * 普通缓存放入并设置时间
+     *
+     * @param key 键
+     * @param value 值
+     * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
+     * @return true成功 false 失败
+     */
+    public boolean set(String key, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+            } else {
+                set(key, value);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error("exception when set key {}. ", key, e);
+            return false;
+        }
+    }
+
+    /**
+     * 递增
+     *
+     * @param key 键
+     * @param delta 要增加几(大于0)
+     * @return
+     */
+    public long incr(String key, long delta) {
+        if (delta <= 0) {
+            throw new RuntimeException("递增因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
+
+    /**
+     * 递减
+     *
+     * @param key 键
+     * @param delta 要减少几(小于0)
+     * @return
+     */
+    public long decr(String key, long delta) {
+        if (delta <= 0) {
+            throw new RuntimeException("递减因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, -delta);
+    }
+
+    /**
+     * HashGet
+     *
+     * @param key  键 不能为null
+     * @param item 项 不能为null
+     * @return 值
+     */
+    public Object hget(String key, String item) {
+        return redisTemplate.opsForHash().get(key, item);
+    }
+
+    /**
+     * 获取hashKey对应的所有键值
+     *
+     * @param key 键
+     * @return 对应的多个键值
+     */
+    public Map<Object, Object> hmget(String key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * HashSet
+     *
+     * @param key 键
+     * @param map 对应多个键值
+     * @return true 成功 false 失败
+     */
+    public boolean hmset(String key, Map<String, Object> map) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception e) {
+            log.error("exception when hash set key {}. ", key, e);
+            return false;
+        }
+    }
+
+    /**
+     * HashSet 并设置时间
+     *
+     * @param key 键
+     * @param map 对应多个键值
+     * @param time 时间(秒)
+     * @return true成功 false失败
+     */
+    public boolean hmset(String key, Map<String, Object> map, long time) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error("exception when hash set key {}. ", key, e);
+            return false;
+        }
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key 键
+     * @param item 项
+     * @param value 值
+     * @return true 成功 false失败
+     */
+    public boolean hset(String key, String item, Object value) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            log.error("exception when hash set key {}, item {} ", key, item, e);
+            return false;
+        }
+    }
+
+    /**
+     * 向一张hash表中放入数据,如果不存在将创建
+     *
+     * @param key 键
+     * @param item 项
+     * @param value 值
+     * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
+     * @return true 成功 false失败
+     */
+    public boolean hset(String key, String item, Object value, long time) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            if (time > 0) {
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error("exception when hash set key {}, item {} ", key, item, e);
+            return false;
+        }
+    }
+
+    /**
+     * 删除hash表中的值
+     *
+     * @param key 键 不能为null
+     * @param item 项 可以使多个 不能为null
+     */
+    public void hdel(String key, Object... item) {
+        redisTemplate.opsForHash().delete(key, item);
+    }
+
+    /**
+     * 判断hash表中是否有该项的值
+     *
+     * @param key 键 不能为null
+     * @param item 项 不能为null
+     * @return true 存在 false不存在
+     */
+    public boolean hHasKey(String key, String item) {
+        return redisTemplate.opsForHash().hasKey(key, item);
+    }
+
+    /**
+     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
+     *
+     * @param key 键
+     * @param item 项
+     * @param by 要增加几(大于0)
+     * @return
+     */
+    public double hincr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, by);
+    }
+
+    /**
+     * hash递减
+     *
+     * @param key 键
+     * @param item 项
+     * @param by 要减少记(小于0)
+     * @return
+     */
+    public double hdecr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, -by);
+    }
+
+    /**
+     * 根据key获取Set中的所有值
+     *
+     * @param key 键
+     * @return
+     */
+    public Set<Object> sGet(String key) {
+        try {
+            return redisTemplate.opsForSet().members(key);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    /**
+     * 根据value从一个set中查询,是否存在
+     *
+     * @param key  键
+     * @param value 值
+     * @return true 存在 false不存在
+     */
+    public boolean sHasKey(String key, Object value) {
+        try {
+            return redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    /**
+     * 将数据放入set缓存
+     *
+     * @param key  键
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    public long sSet(String key, Object... values) {
+        try {
+            return redisTemplate.opsForSet().add(key, values);
+        } catch (Exception e) {
+            return 0;
+        }
+    }
+
+    /**
+     * 将set数据放入缓存
+     *
+     * @param key   键
+     * @param time  时间(秒)
+     * @param values 值 可以是多个
+     * @return 成功个数
+     */
+    public long sSetAndTime(String key, long time, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().add(key, values);
+            if (time > 0)
+                expire(key, time);
+            return count;
+        } catch (Exception e) {
+            return 0;
+        }
+    }
+
+    /**
+     * 获取set缓存的长度
+     *
+     * @param key   键
+     * @return
+     */
+    public long sGetSetSize(String key) {
+        try {
+            return redisTemplate.opsForSet().size(key);
+        } catch (Exception e) {
+            return 0;
+        }
+    }
+
+    /**
+     * 移除值为value的
+     *
+     * @param key   键
+     * @param values   值 可以是多个
+     * @return 移除的个数
+     */
+    public long setRemove(String key, Object... values) {
+        try {
+            Long count = redisTemplate.opsForSet().remove(key, values);
+            return count;
+        } catch (Exception e) {
+            return 0;
+        }
+    }
+
+    /**
+     * 获取list缓存的内容
+     *
+     * @param key  键
+     * @param start   开始
+     * @param end   结束 0 到 -1代表所有值
+     * @return
+     */
+    public List<Object> lGet(String key, long start, long end) {
+        try {
+            return redisTemplate.opsForList().range(key, start, end);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    /**
+     * 获取list缓存的长度
+     *
+     * @param key  键
+     * @return
+     */
+    public long lGetListSize(String key) {
+        try {
+            return redisTemplate.opsForList().size(key);
+        } catch (Exception e) {
+            return 0;
+        }
+    }
+
+    /**
+     * 通过索引 获取list中的值
+     *
+     * @param key  键
+     * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
+     * @return
+     */
+    public Object lGetIndex(String key, long index) {
+        try {
+            return redisTemplate.opsForList().index(key, index);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value  值
+     * @return
+     */
+    public boolean lSet(String key, Object value) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value  值
+     * @param time  时间(秒)
+     * @return
+     */
+    public boolean lSet(String key, Object value, long time) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            if (time > 0)
+                expire(key, time);
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key  键
+     * @param value  值
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key  键
+     * @param value 值
+     * @param time  时间(秒)
+     * @return
+     */
+    public boolean lSet(String key, List<Object> value, long time) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            if (time > 0)
+                expire(key, time);
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    /**
+     * 根据索引修改list中的某条数据
+     *
+     * @param key  键
+     * @param index 索引
+     * @param value 值
+     * @return
+     */
+    public boolean lUpdateIndex(String key, long index, Object value) {
+        try {
+            redisTemplate.opsForList().set(key, index, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 移除N个值为value
+     *
+     * @param key 键
+     * @param count 移除多少个
+     * @param value 值
+     * @return 移除的个数
+     */
+    public long lRemove(String key, long count, Object value) {
+        try {
+            Long remove = redisTemplate.opsForList().remove(key, count, value);
+            return remove;
+        } catch (Exception e) {
+            return 0;
+        }
+    }
+}

+ 145 - 0
src/main/java/fcb/project/manager/core/controller/ApiFormatHouseController.java

@@ -0,0 +1,145 @@
+package fcb.project.manager.core.controller;
+
+import com.alibaba.fastjson.JSON;
+import fcb.project.manager.base.entity.TmApiHouseInfo;
+import fcb.project.manager.base.enums.TerminalType;
+import fcb.project.manager.base.enums.UuidPreEnum;
+import fcb.project.manager.base.utils.RedisServiceUtils;
+import fdage.back.sdk.base.entity.Result;
+import fdage.back.sdk.base.uuid.SnowFlakeUUidUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.CollectionUtils;
+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;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 2 * @Author: Abner
+ * 3 * @Date: 2021/1/11 10:09
+ * 4
+ */
+@Api(tags = "API格式化房源信息相关接口")
+@RestController
+@RequestMapping("api/vrhouse")
+@Log4j2
+public class ApiFormatHouseController {
+
+    @Value("${4dkankan.host.url}")
+    private String redirectVrUrl;
+
+    @Autowired
+    private RedisServiceUtils redisServiceUtils;
+
+    @PostMapping("/format")
+    @ApiOperation(value = "房源格式化接口")
+    public Result<Object> formatHouse(@RequestBody TmApiHouseInfo tmApiHouseInfo){
+        if(!StringUtils.isNoneBlank(tmApiHouseInfo.getSceneNum() , tmApiHouseInfo.getHouseId())){
+            return Result.failure("场景码或者房源ID不能为空");
+        }
+        //认为是修改已有的数据,理论上,不会有这个操作
+        String oldRedisKey = this.getClass().getName() + "::" + tmApiHouseInfo.getSceneNum() + "::"
+                + tmApiHouseInfo.getHouseId();
+        boolean isDelete = false;
+        if(StringUtils.isBlank(tmApiHouseInfo.getCommunicateRoomId())){
+            if(StringUtils.isNoneBlank(tmApiHouseInfo.getRequestId())){
+                return Result.failure("参数RequestId非法");
+            }
+            //没有房间号,默认是新增
+            //生成roomId
+            String roomId = SnowFlakeUUidUtils.generaUUid(null , null , UuidPreEnum.API_ROOM_ID_PRE.getPre());
+            oldRedisKey += "::" + roomId;
+            if(redisServiceUtils.hasKey(oldRedisKey)){
+                //有缓存,则先删除,理论上不存在
+                redisServiceUtils.del(oldRedisKey);
+            }
+            tmApiHouseInfo.setEnable(1);
+            tmApiHouseInfo.setCommunicateRoomId(roomId);
+            tmApiHouseInfo.setRequestId(SnowFlakeUUidUtils.generaUUid(null , null , UuidPreEnum.API_REQUEST_ID_PRE.getPre()));
+            tmApiHouseInfo.setCreateTime(LocalDateTime.now());
+            tmApiHouseInfo.setLastModifyDatetime(LocalDateTime.now());
+        }else{
+            //存量数据,认为是修改数据
+            if(StringUtils.isBlank(tmApiHouseInfo.getRequestId())){
+                return Result.failure("缺失请求ID");
+            }
+            if(null == tmApiHouseInfo.getEnable()){
+                return Result.failure("缺失房源的是状态字段:enable");
+            }
+            oldRedisKey += "::" + tmApiHouseInfo.getCommunicateRoomId();
+            if(redisServiceUtils.hasKey(oldRedisKey)){
+                //有缓存,则先删除,理论上不存在
+                redisServiceUtils.del(oldRedisKey);
+            }
+            tmApiHouseInfo.setLastModifyDatetime(LocalDateTime.now());
+            if(tmApiHouseInfo.getEnable().compareTo(0) == 0){
+                isDelete = true;
+                //删除操作,需要删除推荐房源(可不删除推荐房源),删除缓存,更新db
+                redisServiceUtils.del(oldRedisKey);
+            }
+        }
+        Map<String, Object> resultMap = new HashMap<>();
+        //非删除操作,则更新缓存
+        if(!isDelete){
+            //将最新的数据先存入缓存,暂时缓存3个小时
+            redisServiceUtils.set(oldRedisKey , JSON.toJSONString(tmApiHouseInfo) , 10800);
+            String redirectUrl = genVrLink(tmApiHouseInfo);
+            resultMap.put("vrLink", redirectUrl);
+            resultMap.put("roomId", tmApiHouseInfo.getCommunicateRoomId());
+        }
+
+        //写入mq,异步落库
+
+
+        if(!CollectionUtils.isEmpty(resultMap)){
+            return Result.success(resultMap);
+        }
+
+        return Result.success("成功提交");
+    }
+
+    private String genVrLink(TmApiHouseInfo houseInfo) {
+        String terminalTypeStr = houseInfo.getTerminalType();
+        String userId = "";
+        TerminalType terminalType = TerminalType.getByType(terminalTypeStr);
+        if (null != terminalType && terminalType.equals(TerminalType.CUSTOMER)) {
+            //用户端
+            userId = houseInfo.getUserId();
+        } else if (null != terminalType && terminalType.equals(TerminalType.AGENT)) {
+            //经纪人端
+            userId = houseInfo.getAgencyId();
+        } else {
+//            throw new CommonBaseException(ResultCodeEnum.D3010);
+            //给默认取值
+            userId = "";
+            terminalType  = TerminalType.CUSTOMER;
+        }
+        /**
+         * 样例:
+         * vrHouse.html?m=t-XtYfLCO&appname=vrhouse&role=customer&room_id=F8Q1&user_id=456
+         * vrHouse.html?m=t-XtYfLCO&appname=vrhouse&role=agent&room_id=F8Q1&user_id=456
+         * */
+        String redirectUrl = redirectVrUrl + houseInfo.getSceneNum() //场景码
+                + "&appname=vrhouse&role=" + terminalType.getType(); //角色名
+
+        if(StringUtils.isNotBlank(houseInfo.getCommunicateRoomId())){
+            redirectUrl +=  "&room_id=" + houseInfo.getCommunicateRoomId();//roomId
+        }
+        if(StringUtils.isNotBlank(userId)){
+            redirectUrl += "&user_id=" + userId; //userId
+        }
+        log.info("生成的vr链接为:{}", redirectUrl);
+        return redirectUrl;
+    }
+
+
+}

+ 12 - 0
src/main/java/fcb/project/manager/core/controller/ApiQueryHouseController.java

@@ -0,0 +1,12 @@
+package fcb.project.manager.core.controller;
+
+/**
+ * 2 * @Author: Abner
+ * 3 * @Date: 2021/1/11 10:10
+ * 4
+ */
+
+public class ApiQueryHouseController {
+
+
+}

+ 0 - 1
src/main/java/fcb/project/manager/core/controller/AuditController.java

@@ -9,7 +9,6 @@ import fcb.project.manager.base.utils.DataUtils;
 import fdage.back.sdk.base.entity.Result;
 import fdage.back.sdk.base.enums.ResultCodeEnum;
 import fdage.back.sdk.base.exception.CommonBaseException;
-import io.lettuce.core.dynamic.CommandCreationException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;

+ 162 - 0
src/main/java/fcb/project/manager/core/rocketmqConsumer/AsyncWriteDbConsumerListener.java

@@ -0,0 +1,162 @@
+package fcb.project.manager.core.rocketmqConsumer;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import fcb.project.manager.base.entity.TmApiHouseInfo;
+import fcb.project.manager.base.entity.TmApiHouseRecommend;
+import fcb.project.manager.base.rocketMq.HouseFormatEvent;
+import fcb.project.manager.base.service.impl.TmApiHouseInfoServiceImpl;
+import fcb.project.manager.base.service.impl.TmApiHouseRecommendServiceImpl;
+import fdage.back.sdk.base.enums.ResultCodeEnum;
+import fdage.back.sdk.base.exception.CommonBaseException;
+import lombok.extern.log4j.Log4j2;
+import net.bytebuddy.asm.Advice;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 2 * @Author: Abner
+ * 3 * @Date: 2021/1/12 14:22
+ * 4
+ */
+
+@RocketMQMessageListener(topic = "abner-test", consumerGroup = "rocketmq-cluster5",
+        selectorExpression = "*")
+@Component
+@Log4j2
+public class AsyncWriteDbConsumerListener implements RocketMQListener<String> {
+
+    @Autowired
+    private TmApiHouseInfoServiceImpl tmApiHouseInfoService;
+
+    @Autowired
+    private TmApiHouseRecommendServiceImpl tmApiHouseRecommendService;
+
+    @Override
+    public void onMessage(String houseInfoStr) {
+        log.info("收到消息房源列表:{}", houseInfoStr);
+        if(StringUtils.isBlank(houseInfoStr)){
+            return;
+        }
+        TmApiHouseInfo tmApiHouseInfo = JSON.parseObject(houseInfoStr , TmApiHouseInfo.class);
+        if(null == tmApiHouseInfo){
+            log.error("mq收到的消息中房源格式有误,无法反序列化出来");
+            return;
+        }
+        if(!StringUtils.isNoneBlank(tmApiHouseInfo.getRequestId() ,
+                tmApiHouseInfo.getSceneNum() , tmApiHouseInfo.getHouseId() , tmApiHouseInfo.getCommunicateRoomId())){
+            log.error("请求ID或者场景码或者房源ID或者rommId都不能为空");
+            return;
+        }
+        //房源以及推荐房源落库 , TODO:这里需要将推荐房源写入缓存
+        doWriteDb(tmApiHouseInfo);
+
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void doWriteDb(TmApiHouseInfo tmApiHouseInfo){
+        int insertHouse = tmApiHouseInfoService.insertNew(tmApiHouseInfo);
+        if(insertHouse != 1){
+            log.error("插入房源:场景码-{}, 房源ID-{}失败" , tmApiHouseInfo.getSceneNum() , tmApiHouseInfo.getHouseId());
+            return;
+        }
+        if(StringUtils.isNotBlank(tmApiHouseInfo.getRecommendHouses())){
+            //包含了推荐房源
+            List<TmApiHouseInfo> recommendList = JSON.parseArray(tmApiHouseInfo.getRecommendHouses() , TmApiHouseInfo.class);
+            if(!CollectionUtils.isEmpty(recommendList)){
+                for (TmApiHouseInfo recHouse : recommendList) {
+                    if(StringUtils.isBlank(recHouse.getSceneNum())){
+                        log.warn("房源[{}]的推荐房源[{}]的场景码为空,不落库,跳过" , tmApiHouseInfo.getHouseId() , recHouse.getHouseId());
+                        continue;
+                    }
+                    if(StringUtils.isNotBlank(recHouse.getCommunicateRoomId())){
+                        //默认为存量数据,无需重复插入 TODO:这里可能会有问题
+                        log.info("房源[{}]的推荐房源[{}]在roomId={}的情况下已经存在,无需重复插入" , tmApiHouseInfo.getSceneNum() , recHouse.getSceneNum() , tmApiHouseInfo.getCommunicateRoomId());
+                        continue;
+                    }
+                    recHouse.setCommunicateRoomId(tmApiHouseInfo.getCommunicateRoomId());
+                    int insertRec = tmApiHouseInfoService.insertNew(recHouse);
+                    if(insertRec != 1){
+                        log.warn("房源[{}]的推荐房源[{}]在roomId[{}]下落库 失败" , tmApiHouseInfo.getSceneNum() , recHouse.getSceneNum() , tmApiHouseInfo.getCommunicateRoomId());
+                        //TODO:真的要回滚吗?回滚了就没有,这里先不会滚了
+//                        throw  new CommonBaseException(ResultCodeEnum.D101 , "插入推荐房源数据失败,整个回滚");
+                    }else{
+                        //这里插入房源和推荐房源的关联关系
+                        boolean needInsert = false;
+                        if(StringUtils.isNoneBlank(tmApiHouseInfo.getCommunicateRoomId() , recHouse.getCommunicateRoomId())){
+                            if(StringUtils.equals(tmApiHouseInfo.getCommunicateRoomId() , recHouse.getCommunicateRoomId())){
+                                ///2、先插入单向 A->B
+                                insertHouseRelation(tmApiHouseInfo , recHouse);
+
+                                //3、插入双向 , B->A
+                                insertHouseRelation(recHouse , tmApiHouseInfo);
+                                needInsert = true;
+                            }
+                        }
+                        if(!needInsert){
+                            log.warn("房源[{}]和推荐房源[{}]的roomId不一样->[{}]-[{}],不生成关联关系" , tmApiHouseInfo.getHouseId() ,recHouse.getHouseId(),
+                                    tmApiHouseInfo.getAgencyId() , recHouse.getAgencyId());
+                        }
+                    }
+                }
+                //TODO:这里可以优化下,这个时间复杂度是0(N^2)了
+                for (int i = 0; i < recommendList.size(); i++) {
+                    for(int j= i + 1 ; j < recommendList.size(); j++){
+                        boolean needInsert = false;
+                        if(StringUtils.isNoneBlank(recommendList.get(i).getCommunicateRoomId() , recommendList.get(j).getCommunicateRoomId())){
+                            if(StringUtils.equals(recommendList.get(i).getCommunicateRoomId() , recommendList.get(j).getCommunicateRoomId())){
+                                //A->B
+                                insertHouseRelation(recommendList.get(i) , recommendList.get(j));
+                                //B->A
+                                insertHouseRelation(recommendList.get(j) , recommendList.get(i));
+                                needInsert = true;
+                            }
+                        }
+                        if(!needInsert){
+                            log.warn("房源[{}]和推荐房源[{}]的RoomId不一样->[{}]-[{}],不生成关联关系" , recommendList.get(i).getHouseId() ,recommendList.get(j).getHouseId(),
+                                    recommendList.get(i).getAgencyId() , recommendList.get(j).getAgencyId());
+                        }
+
+                    }
+                }
+
+
+            }
+
+
+        }
+
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void insertHouseRelation(TmApiHouseInfo mainHouse , TmApiHouseInfo recommendHouse){
+        if(null == mainHouse || null == recommendHouse){
+            log.error("参数不够,无法建立关联关系");
+        }
+        TmApiHouseRecommend houseRecommend = tmApiHouseRecommendService.getRecommendByScene(mainHouse.getSceneNum() ,
+                recommendHouse.getSceneNum() , mainHouse.getCommunicateRoomId());
+        if(null != houseRecommend){
+            log.info("场景码为:[{}]的房源和场景码为:[{}]的房源关联关系已经绑定,无需重复绑定" , mainHouse.getSceneNum() , recommendHouse.getSceneNum());
+        }else{
+            //新增关联关系
+            if(!StringUtils.isNoneBlank(mainHouse.getSceneNum() , recommendHouse.getSceneNum())){
+                log.warn("房源[{}]和房源[{}]的场景有一个为空:[{}]-[{}]" , mainHouse.getHouseId() ,recommendHouse.getHouseId() , mainHouse.getSceneNum() , recommendHouse.getSceneNum());
+                return;
+            }
+            int recommendInsert = tmApiHouseRecommendService.insertRecommend(houseRecommend);
+            if(recommendInsert != 1){
+                log.error("插入主房源:[{}]和推荐房源[{}]的关联关系失败:", mainHouse.getSceneNum() , recommendHouse.getSceneNum());
+//                //TODO:这里不做回滚
+//                throw new CommonBaseException(ResultCodeEnum.D101 , "插入房源和推荐房源关联关系失败");
+            }
+        }
+    }
+}

+ 11 - 1
src/main/resources/application-dev.properties

@@ -15,4 +15,14 @@ spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
 swagger.page.title=房车宝管理后台楼盘管理相关接口
 swagger.page.version=1.0
 swagger.page.desc=设计到房源api、楼盘项目管理、审核流程业务逻辑的接口
-swagger.page.packagePath=fcb.project.manager
+swagger.page.packagePath=fcb.project.manager
+
+spring.redis.cluster.max-redirects=3
+spring.redis.cluster.nodes=127.0.0.1:6379
+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
+
+4dkankan.host.url=https://test.4dkankan.com/vrHouse.html?m=

+ 13 - 1
src/main/resources/application-prod.properties

@@ -15,4 +15,16 @@ spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
 swagger.page.title=房车宝管理后台楼盘管理相关接口
 swagger.page.version=1.0
 swagger.page.desc=设计到房源api、楼盘项目管理、审核流程业务逻辑的接口
-swagger.page.packagePath=fcb.project.manager
+swagger.page.packagePath=fcb.project.manager
+
+
+spring.redis.cluster.max-redirects=3
+spring.redis.cluster.nodes=127.0.0.1:6379
+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
+
+4dkankan.host.url=https://4dkankan.com/vrHouse.html?m=
+

+ 13 - 1
src/main/resources/application-test.properties

@@ -15,4 +15,16 @@ spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
 swagger.page.title=房车宝管理后台楼盘管理相关接口
 swagger.page.version=1.0
 swagger.page.desc=设计到房源api、楼盘项目管理、审核流程业务逻辑的接口
-swagger.page.packagePath=fcb.project.manager
+swagger.page.packagePath=fcb.project.manager
+
+
+spring.redis.cluster.max-redirects=3
+spring.redis.cluster.nodes=127.0.0.1:6379
+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
+
+
+4dkankan.host.url=https://test.4dkankan.com/vrHouse.html?m=

+ 10 - 3
src/main/resources/application.properties

@@ -1,8 +1,8 @@
 
 
 #spring.profiles.active=prod
-#spring.profiles.active=dev
-spring.profiles.active=test
+spring.profiles.active=dev
+#spring.profiles.active=test
 
 #应用名
 spring.application.name=fbc-project-manager
@@ -12,6 +12,13 @@ spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
 #nacos.config.server-addr=127.0.0.1:8848
 
 
+rocketmq.name-server=8.135.107.23:9876
+rocketmq.consumer.group=rocketmq-cluster5
+rocketmq.consumer.topic=abner-test
 
 mybatis-plus.global-config.db-config.logic-delete-value=1
-mybatis-plus.global-config.db-config.logic-not-delete-value=0
+mybatis-plus.global-config.db-config.logic-not-delete-value=0
+
+
+
+

+ 1 - 1
src/main/resources/log4j2.xml

@@ -45,7 +45,7 @@
     </Appenders>
 
     <Loggers>
-        <Root level="debug">
+        <Root level="info">
             <AppenderRef ref="info-log" />
             <AppenderRef ref="Console" />
         </Root>

+ 5 - 0
src/main/resources/mybatis/mappers/TmApiHouseInfoMapper.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="fcb.project.manager.base.dao.TmApiHouseInfoDao">
+
+</mapper>

+ 5 - 0
src/main/resources/mybatis/mappers/TmApiHouseRecommendMapper.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="fcb.project.manager.base.dao.TmApiHouseRecommendDao">
+
+</mapper>

+ 5 - 0
src/main/resources/mybatis/mappers/TmApiRoomIdLogMapper.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="fcb.project.manager.base.dao.TmApiRoomIdLogDao">
+
+</mapper>