From 95985b5a5bb7c5656098cc8923ed3d1d8aaa3d2b Mon Sep 17 00:00:00 2001
From: yupeng <roc__yu@163.com>
Date: 星期五, 24 一月 2025 10:44:59 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into xizang-changyun

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TencentCosUtil.java        |  161 ++++++++++
 ruoyi-admin/src/main/resources/application-test.yml                                |    8 
 ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml                |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/TContractDTO.java                  |   29 +
 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml                    |    2 
 ruoyi-common/src/main/java/com/ruoyi/common/constant/DictConstants.java            |   18 +
 ruoyi-system/src/main/java/com/ruoyi/system/model/TBill.java                       |    2 
 ruoyi-admin/src/main/resources/mybatis-config.xml                                  |    2 
 ruoyi-system/src/main/resources/mapper/system/TTenantMapper.xml                    |   18 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TenantVO.java                       |   21 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/THouseController.java       |   29 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/TTenantService.java            |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/THouseServiceImpl.java    |   18 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTenantServiceImpl.java   |   13 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java   |   15 
 ruoyi-system/src/main/java/com/ruoyi/system/model/THouse.java                      |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/COSController.java          |   48 +++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TContractMapper.java            |    6 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTenantController.java      |   34 +
 ruoyi-system/pom.xml                                                               |    6 
 ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml                  |   17 +
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java          |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TContractVO.java                    |   35 ++
 /dev/null                                                                          |   51 ---
 ruoyi-system/src/main/java/com/ruoyi/system/model/TContractRentType.java           |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TContractService.java          |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java    |  126 +++++--
 ruoyi-admin/src/main/resources/application-prod.yml                                |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TInvoice.java                    |    4 
 sql/xizang.sql                                                                     |  159 ++++++++-
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java |   13 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TTenant.java                     |   20 
 ruoyi-system/src/main/java/com/ruoyi/system/query/TContractQuery.java              |   19 +
 ruoyi-system/src/main/java/com/ruoyi/system/query/TTenantQuery.java                |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTenantMapper.java              |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java                   |   12 
 36 files changed, 751 insertions(+), 176 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/COSController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/COSController.java
new file mode 100644
index 0000000..5fe8e8d
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/COSController.java
@@ -0,0 +1,48 @@
+package com.ruoyi.web.controller.api;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.web.controller.tool.TencentCosUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.OutputStream;
+
+/**
+ * @author HJL
+ * @version 1.0
+ * @since 2024-05-30 9:27
+ */
+@RestController
+@RequestMapping("/cos")
+@Api(tags = "公共-文件上传")
+public class COSController {
+
+    @Resource
+    private TencentCosUtil tencentCosUtil;
+
+    @PostMapping("/upload")
+    @ApiOperation(value = "文件上传", tags = "公共-文件上传")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "文件", name = "file", dataType = "MultipartFile", required = true)
+    })
+    public R<String> upload(@RequestParam("file") MultipartFile file) {
+        String url = tencentCosUtil.upLoadFile(file);
+        return R.ok(url, url);
+    }
+    @PostMapping("/download")
+    @ApiOperation(value = "文件下载", tags = "公共-文件下载")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "文件url", name = "url", dataType = "String", required = true)
+    })
+    public void upload(@RequestParam("url") String url) {
+        tencentCosUtil.downLoadFile(url);
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OssController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OssController.java
deleted file mode 100644
index d84919e..0000000
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OssController.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.ruoyi.web.controller.api;
-
-import com.aliyun.oss.OSSClient;
-import com.aliyun.oss.model.ObjectMetadata;
-import com.aliyun.oss.model.PutObjectRequest;
-import com.aliyun.oss.model.PutObjectResult;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-
-@CrossOrigin
-@RestController
-@RequestMapping("/base/oss")
-class OssController {
-
-    private static final String endpoint = "oss-cn-chengdu.aliyuncs.com";
-    private static final String accessKeyId = "LTAI5tCQHjSsP7TXuyjSG1PJ";
-    private static final String accessKeySecret = "RIDXxzOrdMS0V8vQDT53MGvAgsegRV";
-    private static final String bucketName = "inspectionbucket";
-
-    @PostMapping("/upload")
-    @ApiOperation(value = "文件上传",tags = "文件上传")
-    public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) throws IOException {
-        // 创建 OSSClient 实例
-        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
-
-
-        // 创建 PutObjectRequest 对象
-        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, file.getOriginalFilename(), file.getInputStream());
-
-        ObjectMetadata metadata = new ObjectMetadata();
-        // 取消文件缓存,文件每次都会从OSS服务器获取
-        metadata.setHeader("Cache-Control", "no-cache");
-        metadata.setHeader("Expires", "0");
-
-
-        // 上传文件
-        PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
-
-        // 关闭 OSSClient 实例
-        ossClient.shutdown();
-
-        String fileUrl = "https://" + bucketName + "." + endpoint + "/" + file.getOriginalFilename();
-        return ResponseEntity.ok(fileUrl);
-    }
-
-
-}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
index fc28438..108901e 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
@@ -1,22 +1,37 @@
 package com.ruoyi.web.controller.api;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.dto.TContractDTO;
 import com.ruoyi.system.dto.THouseDTO;
+import com.ruoyi.system.model.TContract;
+import com.ruoyi.system.model.TContractRentType;
 import com.ruoyi.system.model.THouse;
+import com.ruoyi.system.query.TContractQuery;
 import com.ruoyi.system.query.THouseQuery;
 import com.ruoyi.system.query.TUserHistoryQuery;
+import com.ruoyi.system.service.TContractRentTypeService;
 import com.ruoyi.system.service.TContractService;
 import com.ruoyi.system.service.THouseService;
 import com.ruoyi.system.vo.HouseVO;
 import io.swagger.annotations.Api;
+import com.ruoyi.system.vo.TContractVO;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * <p>
@@ -32,39 +47,82 @@
 public class TContractController {
     @Autowired
     private TContractService contractService;
-//    @Log(title = "房屋基础信息管理-新增房屋", businessType = BusinessType.INSERT)
-//    @ApiOperation(value = "新增房屋")
-//    @PostMapping(value = "/addHouse")
-//    public AjaxResult<Boolean> addHouse(@Validated @RequestBody THouseDTO dto) {
-//        return AjaxResult.success(contractService.save(dto));
-//    }
-//    @Log(title = "房屋基础信息管理-编辑房屋", businessType = BusinessType.UPDATE)
-//    @ApiOperation(value = "编辑房屋")
-//    @PostMapping(value = "/updateHouse")
-//    public AjaxResult<Boolean> updateHouse(@Validated @RequestBody THouseDTO dto) {
-//        return AjaxResult.success(contractService.updateById(dto));
-//    }
-//    @Log(title = "房屋基础信息管理-查询房屋信息", businessType = BusinessType.DELETE)
-//    @ApiOperation(value = "查询房屋信息")
-//    @GetMapping(value = "/getHouseById")
-//    public AjaxResult<THouse> getHouseById(@RequestParam Long id) {
-//        return AjaxResult.success(contractService.getById(id));
-//    }
-//    @Log(title = "房屋基础信息管理-删除房屋", businessType = BusinessType.DELETE)
-//    @ApiOperation(value = "删除房屋")
-//    @DeleteMapping(value = "/deleteHouseById")
-//    public AjaxResult<Boolean> deleteHouseById(@RequestParam Long id) {
-//        return AjaxResult.success(contractService.removeById(id));
-//    }
-//    @ApiOperation(value = "获取房屋分页列表")
-//    @PostMapping(value = "/houseList")
-//    public AjaxResult<PageInfo<THouse>> houseList(@RequestBody THouseQuery query) {
-//        return AjaxResult.success(contractService.houseList(query));
-//    }
-//    @ApiOperation(value = "历史租户列表")
-//    @PostMapping(value = "/userHistoryList")
-//    public AjaxResult<PageInfo<HouseVO>> userHistoryList(@RequestBody TUserHistoryQuery query) {
-//        return AjaxResult.success(contractService.userHistoryList(query));
-//    }
+    @Autowired
+    private TContractRentTypeService contractRentTypeService;
+    @Autowired
+    private THouseService houseService;
+    @ApiOperation(value = "获取合同分页列表")
+    @PostMapping(value = "/contractList")
+    public R<PageInfo<TContract>> contractList(@RequestBody TContractQuery query) {
+        return R.ok(contractService.contractList(query));
+    }
+    @Log(title = "合同管理-新增合同", businessType = BusinessType.INSERT)
+    @ApiOperation(value = "新增合同")
+    @PostMapping(value = "/addContract")
+    public R<Boolean> addContract(@Validated @RequestBody TContractDTO dto) {
+        contractService.save(dto);
+        if (dto.getIsIncreasing()==1){
+            TContractRentType tContractRentType = new TContractRentType();
+            tContractRentType.setContractId(dto.getId());
+            tContractRentType.setIncreasingDecreasing(dto.getIncreasingDecreasing());
+            tContractRentType.setIncreasingDecreasingType(dto.getIncreasingDecreasingType());
+            tContractRentType.setNumericalValue(dto.getNumericalValue());
+            tContractRentType.setChangeTime(dto.getChangeTime());
+            contractRentTypeService.save(tContractRentType);
+        }
+        return R.ok();
+    }
+    @Log(title = "合同管理-编辑合同", businessType = BusinessType.UPDATE)
+    @ApiOperation(value = "编辑合同")
+    @PostMapping(value = "/updateContract")
+    public R<Boolean> updateContract(@Validated @RequestBody TContractDTO dto) {
+        contractService.updateById(dto);
+        contractRentTypeService.remove(new LambdaQueryWrapper<TContractRentType>()
+                .eq(TContractRentType::getContractId,dto.getId()));
+        if (dto.getIsIncreasing()==1){
+            TContractRentType tContractRentType = new TContractRentType();
+            tContractRentType.setContractId(dto.getId());
+            tContractRentType.setIncreasingDecreasing(dto.getIncreasingDecreasing());
+            tContractRentType.setIncreasingDecreasingType(dto.getIncreasingDecreasingType());
+            tContractRentType.setNumericalValue(dto.getNumericalValue());
+            tContractRentType.setChangeTime(dto.getChangeTime());
+            contractRentTypeService.save(tContractRentType);
+        }
+        return R.ok();
+    }
+    @Log(title = "合同管理-批量删除合同", businessType = BusinessType.DELETE)
+    @ApiOperation(value = "批量删除合同")
+    @DeleteMapping(value = "/deleteContractByIds")
+    public R<Boolean> deleteContractByIds3
+            (@RequestParam String ids) {
+        if (StringUtils.isNotEmpty(ids)){
+            contractService.removeBatchByIds(Arrays.asList(ids.split(",")));
+        }
+        return R.ok();
+    }
+
+    @ApiOperation(value = "查询合同信息信息")
+    @GetMapping(value = "/getContractById")
+    public R<TContractVO> getContractById(@RequestParam String id) {
+        TContractVO res = new TContractVO();
+        TContract contract = contractService.getById(id);
+        BeanUtils.copyProperties(contract,res);
+        TContractRentType contractRentType = contractRentTypeService.lambdaQuery().eq(TContractRentType::getContractId, id).one();
+        if (contractRentType!=null){
+            BeanUtils.copyProperties(contractRentType,res);
+        }
+        TContract oldContract = contractService.getOne(new LambdaQueryWrapper<TContract>()
+                        .eq(TContract::getHouseId,contract.getHouseId())
+                .eq(TContract::getStatus, 4)
+                .le(TContract::getStartTime, LocalDateTime.now())
+                .ge(TContract::getEndTime, LocalDateTime.now()));
+        THouse house = houseService.getById(contract.getHouseId());
+        if (oldContract!=null){
+            house.setTenantType(oldContract.getPayType());
+        }
+        res.setHouse(house);
+        return R.ok(res);
+    }
+
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/THouseController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/THouseController.java
index aaab61a..78fb2fd 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/THouseController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/THouseController.java
@@ -3,7 +3,8 @@
 
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
-import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.system.dto.THouseDTO;
 import com.ruoyi.system.dto.TTenantDTO;
@@ -14,6 +15,7 @@
 import com.ruoyi.system.query.TUserHistoryQuery;
 import com.ruoyi.system.service.THouseService;
 import com.ruoyi.system.vo.HouseVO;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -27,6 +29,7 @@
  * @author xiaochen
  * @since 2025-01-17
  */
+@Api(tags = "房屋基础信息管理")
 @RestController
 @RequestMapping("/t-house")
 public class THouseController {
@@ -35,36 +38,36 @@
     @Log(title = "房屋基础信息管理-新增房屋", businessType = BusinessType.INSERT)
     @ApiOperation(value = "新增房屋")
     @PostMapping(value = "/addHouse")
-    public AjaxResult<Boolean> addHouse(@Validated @RequestBody THouseDTO dto) {
-        return AjaxResult.success(tHouseService.save(dto));
+    public R<Boolean> addHouse(@Validated @RequestBody THouseDTO dto) {
+        return R.ok(tHouseService.save(dto));
     }
     @Log(title = "房屋基础信息管理-编辑房屋", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "编辑房屋")
     @PostMapping(value = "/updateHouse")
-    public AjaxResult<Boolean> updateHouse(@Validated @RequestBody THouseDTO dto) {
-        return AjaxResult.success(tHouseService.updateById(dto));
+    public R<Boolean> updateHouse(@Validated @RequestBody THouseDTO dto) {
+        return R.ok(tHouseService.updateById(dto));
     }
     @Log(title = "房屋基础信息管理-查询房屋信息", businessType = BusinessType.DELETE)
     @ApiOperation(value = "查询房屋信息")
     @GetMapping(value = "/getHouseById")
-    public AjaxResult<THouse> getHouseById(@RequestParam Long id) {
-        return AjaxResult.success(tHouseService.getById(id));
+    public R<THouse> getHouseById(@RequestParam String id) {
+        return R.ok(tHouseService.getById(id));
     }
     @Log(title = "房屋基础信息管理-删除房屋", businessType = BusinessType.DELETE)
     @ApiOperation(value = "删除房屋")
     @DeleteMapping(value = "/deleteHouseById")
-    public AjaxResult<Boolean> deleteHouseById(@RequestParam Long id) {
-        return AjaxResult.success(tHouseService.removeById(id));
+    public R<Boolean> deleteHouseById(@RequestParam String id) {
+        return R.ok(tHouseService.removeById(id));
     }
     @ApiOperation(value = "获取房屋分页列表")
     @PostMapping(value = "/houseList")
-    public AjaxResult<PageInfo<THouse>> houseList(@RequestBody THouseQuery query) {
-        return AjaxResult.success(tHouseService.houseList(query));
+    public R<PageInfo<THouse>> houseList(@RequestBody THouseQuery query) {
+        return R.ok(tHouseService.houseList(query));
     }
     @ApiOperation(value = "历史租户列表")
     @PostMapping(value = "/userHistoryList")
-    public AjaxResult<PageInfo<HouseVO>> userHistoryList(@RequestBody TUserHistoryQuery query) {
-        return AjaxResult.success(tHouseService.userHistoryList(query));
+    public R<PageInfo<HouseVO>> userHistoryList(@RequestBody TUserHistoryQuery query) {
+        return R.ok(tHouseService.userHistoryList(query));
     }
 
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTenantController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTenantController.java
index 10fe7a4..b2eeaaf 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTenantController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTenantController.java
@@ -3,7 +3,7 @@
 
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
-import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
@@ -11,9 +11,11 @@
 import com.ruoyi.system.model.TTenant;
 import com.ruoyi.system.query.TTenantQuery;
 import com.ruoyi.system.service.TTenantService;
+import com.ruoyi.system.vo.TenantVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -41,65 +43,71 @@
     /**
      * 获取租户管理列表
      */
+    @PreAuthorize("@ss.hasPermi('system:tenant:list')")
     @ApiOperation(value = "获取租户分页列表")
     @PostMapping(value = "/pageList")
-    public AjaxResult<PageInfo<TTenant>> pageList(@RequestBody TTenantQuery query) {
-        return AjaxResult.success(tenantService.pageList(query));
+    public R<PageInfo<TenantVO>> pageList(@RequestBody TTenantQuery query) {
+        return R.ok(tenantService.pageList(query));
     }
 
     /**
      * 添加租户管理
      */
+    @PreAuthorize("@ss.hasPermi('system:tenant:add')")
     @Log(title = "租户信息-新增租户", businessType = BusinessType.INSERT)
     @ApiOperation(value = "添加租户")
     @PostMapping(value = "/add")
-    public AjaxResult<Boolean> add(@Validated @RequestBody TTenantDTO dto) {
+    public R<Boolean> add(@Validated @RequestBody TTenantDTO dto) {
         // 密码加密
         dto.setPassword(SecurityUtils.encryptPassword(dto.getPassword()));
-        return AjaxResult.success(tenantService.save(dto));
+        return R.ok(tenantService.save(dto));
     }
 
     /**
      * 修改租户
      */
+    @PreAuthorize("@ss.hasPermi('system:tenant:update')")
     @Log(title = "租户信息-修改租户", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "修改租户")
     @PostMapping(value = "/update")
-    public AjaxResult<Boolean> update(@Validated @RequestBody TTenantDTO dto) {
+    public R<Boolean> update(@Validated @RequestBody TTenantDTO dto) {
         // 密码加密
         if(StringUtils.isNotBlank(dto.getPassword())){
             dto.setPassword(SecurityUtils.encryptPassword(dto.getPassword()));
         }
-        return AjaxResult.success(tenantService.updateById(dto));
+        return R.ok(tenantService.updateById(dto));
     }
 
     /**
      * 查看租户详情
      */
+    @PreAuthorize("@ss.hasPermi('system:tenant:detail')")
     @ApiOperation(value = "查看租户详情")
     @GetMapping(value = "/getDetailById")
-    public AjaxResult<TTenant> getDetailById(@RequestParam Long id) {
-        return AjaxResult.success(tenantService.getById(id));
+    public R<TTenant> getDetailById(@RequestParam String id) {
+        return R.ok(tenantService.getById(id));
     }
 
     /**
      * 删除租户
      */
+    @PreAuthorize("@ss.hasPermi('system:tenant:delete')")
     @Log(title = "租户信息-删除租户", businessType = BusinessType.DELETE)
     @ApiOperation(value = "删除租户")
     @DeleteMapping(value = "/deleteById")
-    public AjaxResult<Boolean> deleteById(@RequestParam Long id) {
-        return AjaxResult.success(tenantService.removeById(id));
+    public R<Boolean> deleteById(@RequestParam String id) {
+        return R.ok(tenantService.removeById(id));
     }
 
     /**
      * 批量删除租户
      */
+    @PreAuthorize("@ss.hasPermi('system:tenant:delete')")
     @Log(title = "租户信息-删除租户", businessType = BusinessType.DELETE)
     @ApiOperation(value = "批量删除租户")
     @DeleteMapping(value = "/deleteByIds")
-    public AjaxResult<Boolean> deleteByIds(@RequestBody List<Long> ids) {
-        return AjaxResult.success(tenantService.removeByIds(ids));
+    public R<Boolean> deleteByIds(@RequestBody List<String> ids) {
+        return R.ok(tenantService.removeByIds(ids));
     }
 
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
index 310a24a..3475998 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -194,6 +194,21 @@
         return AjaxResult.success(sysUser);
     }
 
+    /**
+     * 获取用户详情
+     */
+    @ApiOperation(value = "获取用户详情")
+    @GetMapping("/queryDetail")
+    public AjaxResult queryDetail()
+    {
+        Long userId = tokenService.getLoginUser().getUserId();
+        SysUser sysUser = userService.selectUserById(userId);
+        SysUserVO sysUserVO = new SysUserVO();
+        BeanUtils.copyProperties(sysUser,sysUserVO);
+
+        return AjaxResult.success(sysUser);
+    }
+
 
     /**
      * 获取用户数量统计
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TencentCosUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TencentCosUtil.java
new file mode 100644
index 0000000..be2bdbb
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TencentCosUtil.java
@@ -0,0 +1,161 @@
+package com.ruoyi.web.controller.tool;
+
+import com.qcloud.cos.COSClient;
+import com.qcloud.cos.ClientConfig;
+import com.qcloud.cos.auth.BasicCOSCredentials;
+import com.qcloud.cos.auth.COSCredentials;
+import com.qcloud.cos.exception.CosClientException;
+import com.qcloud.cos.exception.CosServiceException;
+import com.qcloud.cos.http.HttpProtocol;
+import com.qcloud.cos.model.COSObject;
+import com.qcloud.cos.model.GetObjectRequest;
+import com.qcloud.cos.model.ObjectMetadata;
+import com.qcloud.cos.model.PutObjectResult;
+import com.qcloud.cos.region.Region;
+import com.qcloud.cos.utils.IOUtils;
+import com.ruoyi.common.utils.WebUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.UUID;
+
+/**
+ * @author HJL
+ */
+@Component
+public class TencentCosUtil {
+
+    /**
+     * COS的SecretId
+     */
+    @Value("${cos.client.accessKey}")
+    private String secretId;
+    /**
+     * COS的SecretKey
+     */
+    @Value("${cos.client.secretKey}")
+    private String secretKey;
+    /**
+     * 文件上传后访问路径的根路径,后面要最佳文件名字与类型
+     */
+    @Value("${cos.client.rootSrc}")
+    private String rootSrc;
+    /**
+     * 上传的存储桶的地域
+     */
+    @Value("${cos.client.bucketAddr}")
+    private String bucketAddr;
+    /**
+     * 存储桶的名字,是自己在存储空间自己创建的,我创建的名字是:qq-test-1303******
+     */
+    @Value("${cos.client.bucket}")
+    private String bucketName;
+    /**
+     * 文件存放位置
+     */
+    @Value("${cos.client.location}")
+    private String location;
+
+    /**
+     * 1.调用静态方法getCosClient()就会获得COSClient实例
+     * 2.本方法根据永久密钥初始化 COSClient的,官方是不推荐,官方推荐使用临时密钥,是可以限制密钥使用权限,创建cred时有些区别
+     *
+     * @return COSClient实例
+     */
+    private COSClient getCosClient() {
+        // 1 初始化用户身份信息(secretId, secretKey)。
+        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
+        // 2.1 设置存储桶的地域(上文获得)
+        Region region = new Region(bucketAddr);
+        ClientConfig clientConfig = new ClientConfig(region);
+        // 2.2 使用https协议传输
+        clientConfig.setHttpProtocol(HttpProtocol.https);
+        // 生成 cos 客户端
+        return new COSClient(cred, clientConfig);
+    }
+
+    /**
+     * 只要调用静态方法upLoadFile(MultipartFile multipartFile)就可以获取上传后文件的全路径
+     *
+     * @param file
+     * @return 返回文件的浏览全路径
+     */
+    public String upLoadFile(MultipartFile file) {
+        try {
+            // 获取上传的文件的输入流
+            InputStream inputStream = file.getInputStream();
+            // 避免文件覆盖,获取文件的原始名称,如123.jpg,然后通过截取获得文件的后缀,也就是文件的类型
+            String originalFilename = file.getOriginalFilename();
+            //获取文件的类型
+            String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
+            //使用UUID工具  创建唯一名称,放置文件重名被覆盖,在拼接上上命令获取的文件类型
+            String fileName = UUID.randomUUID() + fileType;
+            // 指定文件上传到 COS 上的路径,即对象键。最终文件会传到存储桶名字中的images文件夹下的fileName名字
+            String key = location+"/" + fileName;
+            // 创建上传Object的Metadata
+            ObjectMetadata objectMetadata = new ObjectMetadata();
+            // - 使用输入流存储,需要设置请求长度
+            objectMetadata.setContentLength(inputStream.available());
+            // - 设置缓存
+            objectMetadata.setCacheControl("no-cache");
+            // - 设置Content-Type
+            objectMetadata.setContentType(fileType);
+            //上传文件
+            PutObjectResult putResult = getCosClient().putObject(bucketName, key, inputStream, objectMetadata);
+            // 创建文件的网络访问路径
+            String url = rootSrc + key;
+            //关闭 cosClient,并释放 HTTP 连接的后台管理线程
+            getCosClient().shutdown();
+            return url;
+        } catch (Exception e) {
+            e.printStackTrace();
+            // 发生IO异常、COS连接异常等,返回空
+            return null;
+        }
+    }
+
+    /**
+     * 下载文件
+     * @param file
+     * @return
+     */
+    public void downLoadFile(String file) {
+        HttpServletResponse response = WebUtils.response();
+        String replace = file.replace(rootSrc, "");
+        COSCredentials cred = new BasicCOSCredentials(
+                secretId,
+                secretKey);
+        // 2.1 设置存储桶的地域(上文获得)
+        Region region = new Region(bucketAddr);
+        ClientConfig clientConfig = new ClientConfig(region);
+        // 2.2 使用https协议传输
+        clientConfig.setHttpProtocol(HttpProtocol.https);
+        COSClient cosClient = new COSClient(cred, clientConfig);
+        try {
+            // 5. 下载文件并获取输入流
+            InputStream inputStream = cosClient.getObject(bucketName, replace).getObjectContent();
+            ServletOutputStream outputStream = response.getOutputStream();
+            // 6. 处理输入流,例如读取内容或保存到本地文件
+            // 这里仅作示例,实际应用中需要根据需求处理输入流
+            byte[] buffer = new byte[1024];
+            int len;
+            while ((len = inputStream.read(buffer)) != -1) {
+                // 处理读取到的数据
+                outputStream.write(buffer, 0, len);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            // 7. 关闭输入流
+            cosClient.shutdown();
+        }
+    }
+//    https://xzgttest-1305134071.cos.ap-chengdu.myqcloud.com/xizang/e4ea88b8-5470-456e-bf97-75cf47f38e84.jpg
+}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index d12c582..ee46864 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -206,3 +206,11 @@
     accessKeySecret: 0SRb6XGkciQDPWn2rYqbJtq2qRMDY8
     signName: "四川金达通信工程"
     templateCode: "SMS_293985284"
+cos:
+  client:
+    accessKey: AKIDCF5EF2c0DE1e5JK8r4EGJF4mNsMgp26x
+    secretKey: lLl184rUyFOOE0d5KNGC3kmfNsCWk4GU
+    bucket: xzgttest-1305134071
+    bucketAddr: ap-chengdu
+    rootSrc: https://xzgttest-1305134071.cos.ap-chengdu.myqcloud.com/
+    location: xizang
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/application-test.yml b/ruoyi-admin/src/main/resources/application-test.yml
index 9d492fd..2f6795f 100644
--- a/ruoyi-admin/src/main/resources/application-test.yml
+++ b/ruoyi-admin/src/main/resources/application-test.yml
@@ -205,3 +205,11 @@
     accessKeySecret: 0SRb6XGkciQDPWn2rYqbJtq2qRMDY8
     signName: "四川金达通信工程"
     templateCode: "SMS_293985284"
+cos:
+  client:
+    accessKey: AKIDCF5EF2c0DE1e5JK8r4EGJF4mNsMgp26x
+    secretKey: lLl184rUyFOOE0d5KNGC3kmfNsCWk4GU
+    bucket: xzgttest-1305134071
+    bucketAddr: ap-chengdu
+    rootSrc: https://xzgttest-1305134071.cos.ap-chengdu.myqcloud.com/
+    location: xizang
diff --git a/ruoyi-admin/src/main/resources/mybatis-config.xml b/ruoyi-admin/src/main/resources/mybatis-config.xml
index 7d487eb..53c5587 100644
--- a/ruoyi-admin/src/main/resources/mybatis-config.xml
+++ b/ruoyi-admin/src/main/resources/mybatis-config.xml
@@ -10,7 +10,7 @@
         <setting name="cacheEnabled" value="true"/>
         <!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认 false  -->
         <!-- <setting name="lazyLoadingEnabled" value="true"/> -->
-        <setting name="mapUnderscoreToCamelCase" value="false"/><!--是否将map下划线方式转为驼峰式命名-->
+        <setting name="mapUnderscoreToCamelCase" value="true"/><!--是否将map下划线方式转为驼峰式命名-->
         <!-- 当开启时,任何方法的调用都会加载该对象的所有属性。默认 false,可通过select标签的 fetchType来覆盖-->
         <!-- <setting name="aggressiveLazyLoading" value="false"/>-->
         <!--  Mybatis 创建具有延迟加载能力的对象所用到的代理工具,默认JAVASSIST -->
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/DictConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/DictConstants.java
new file mode 100644
index 0000000..73005e3
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/DictConstants.java
@@ -0,0 +1,18 @@
+package com.ruoyi.common.constant;
+
+/**
+ * 缓存的key 常量
+ * 
+ * @author ruoyi
+ */
+public class DictConstants
+{
+    /**
+     * 租户属性
+     */
+    public static final String DICT_TYPE_TENANT_ATTRIBUTE = "t_tenant_attribute";
+    /**
+     * 租户类型
+     */
+    public static final String DICT_TYPE_TENANT_TYPE = "t_tenant_type";
+}
diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml
index 10998d3..f4f7c3b 100644
--- a/ruoyi-system/pom.xml
+++ b/ruoyi-system/pom.xml
@@ -16,7 +16,11 @@
     </description>
 
     <dependencies>
-
+        <dependency>
+            <groupId>com.qcloud</groupId>
+            <artifactId>cos_api</artifactId>
+            <version>5.6.227</version>
+        </dependency>
         <!-- 通用工具-->
         <dependency>
             <groupId>com.ruoyi</groupId>
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/TContractDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TContractDTO.java
new file mode 100644
index 0000000..8bf0052
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TContractDTO.java
@@ -0,0 +1,29 @@
+package com.ruoyi.system.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.model.TContract;
+import com.ruoyi.system.model.TTenant;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value = "合同新增编辑DTO")
+public class TContractDTO extends TContract {
+    @ApiModelProperty(value = "递增递减 1=递增 2=递减")
+    private Integer increasingDecreasing;
+
+    @ApiModelProperty(value = "递增递减形式 1=百分比 2=金额元")
+    private Integer increasingDecreasingType;
+
+    @ApiModelProperty(value = "数值")
+    private BigDecimal numericalValue;
+
+    @ApiModelProperty(value = "递增或递减时点")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime changeTime;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java
index a341f1e..c8bf9cf 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java
@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import com.ruoyi.common.core.domain.entity.SysDictData;
 
@@ -9,6 +11,7 @@
  * 
  * @author ruoyi
  */
+@Mapper
 public interface SysDictDataMapper
 {
     /**
@@ -92,4 +95,6 @@
      * @return 结果
      */
     public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType);
+
+    public String selectDictDataByTypeAndValue(@Param("dictType")String dictType, @Param("dictValue")Integer dictValue);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TContractMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TContractMapper.java
index d5bc9f9..8c24731 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TContractMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TContractMapper.java
@@ -1,7 +1,12 @@
 package com.ruoyi.system.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TContract;
+import com.ruoyi.system.query.TContractQuery;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +18,5 @@
  */
 public interface TContractMapper extends BaseMapper<TContract> {
 
+    List<TContract> contractList(@Param("query") TContractQuery query, @Param("pageInfo") PageInfo<TContract> pageInfo);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTenantMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTenantMapper.java
index 8bf23ff..a93206e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTenantMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTenantMapper.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TTenant;
 import com.ruoyi.system.query.TTenantQuery;
+import com.ruoyi.system.vo.TenantVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -24,7 +25,7 @@
      * @param pageInfo
      * @return
      */
-    List<TTenant> pageList(@Param("query") TTenantQuery query, @Param("pageInfo")PageInfo<TTenant> pageInfo);
+    List<TenantVO> pageList(@Param("query") TTenantQuery query, @Param("pageInfo")PageInfo<TenantVO> pageInfo);
 
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TBill.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TBill.java
index c75228c..7abdadb 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TBill.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TBill.java
@@ -42,7 +42,7 @@
 
     @ApiModelProperty(value = "应缴费")
     @TableField("payable_fees_money")
-    private Double payableFeesMoney;
+    private BigDecimal payableFeesMoney;
 
     @ApiModelProperty(value = "应缴费日期")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java
index 6dc8972..4b73a95 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java
@@ -61,7 +61,7 @@
     @TableField("deposit")
     private BigDecimal deposit;
 
-    @ApiModelProperty(value = "租金支付方式 1=季付")
+    @ApiModelProperty(value = "租金支付方式 1=月付 2=季付 3=年付")
     @TableField("pay_type")
     private Integer payType;
 
@@ -114,7 +114,7 @@
     @TableField("party_two_phone")
     private String partyTwoPhone;
 
-    @ApiModelProperty(value = "合同附件")
+    @ApiModelProperty(value = "合同附件,多个逗号拼接")
     @TableField("contract_file")
     private String contractFile;
 
@@ -122,8 +122,14 @@
     @TableField("remark")
     private String remark;
 
-    @ApiModelProperty(value = "状态 1=待审批 2=未签订 3=已签订")
+    @ApiModelProperty(value = "状态 1=待提交 2=待审批 3=未签订 4=已签订")
     @TableField("status")
     private Integer status;
+    @ApiModelProperty(value = "内存大小多个文件逗号拼接")
+    @TableField("memory")
+    private Integer memory;
+    @ApiModelProperty(value = "附件名称 逗号拼接")
+    @TableField("contract_file_name")
+    private Integer contractFileName;
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TContractRentType.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TContractRentType.java
index 35d8311..f3f45ae 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TContractRentType.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TContractRentType.java
@@ -6,7 +6,9 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -47,5 +49,10 @@
     @TableField("numerical_value")
     private BigDecimal numericalValue;
 
+    @ApiModelProperty(value = "递增或递减时点")
+    @TableField("change_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime changeTime;
+
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/THouse.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/THouse.java
index ba521cd..5c30185 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/THouse.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/THouse.java
@@ -88,4 +88,7 @@
     @TableField("room_number")
     private String roomNumber;
 
+    @ApiModelProperty(value = "住户类型 1月租 2季租 3年租")
+    @TableField(exist = false)
+    private Integer tenantType;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TInvoice.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TInvoice.java
index 6ee6c90..287b231 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TInvoice.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TInvoice.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
@@ -39,7 +41,7 @@
 
     @ApiModelProperty(value = "金额")
     @TableField("invoice_money")
-    private Double invoiceMoney;
+    private BigDecimal invoiceMoney;
 
     @ApiModelProperty(value = "申请人")
     @TableField("apply_name")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TTenant.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TTenant.java
index 7ec52d0..92a1d88 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TTenant.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TTenant.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
@@ -43,9 +45,9 @@
 
     @ApiModelProperty(value = "入住时间")
     @NotNull(message = "入住时间不能为空")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     @TableField("checkIn_time")
-    private LocalDateTime checkinTime;
+    private LocalDate checkinTime;
 
     @ApiModelProperty(value = "租户属性")
     @TableField("tenant_attributes")
@@ -53,19 +55,7 @@
 
     @ApiModelProperty(value = "租户类型")
     @TableField("tenant_type")
-    private Integer tenantType;
-
-    @ApiModelProperty(value = "租户楼栋")
-    @TableField("tenant_building")
-    private String tenantBuilding;
-
-    @ApiModelProperty(value = "房号")
-    @TableField("room_number")
-    private String roomNumber;
-
-    @ApiModelProperty(value = "建筑面积")
-    @TableField("building_area")
-    private Integer buildingArea;
+    private String tenantType;
 
     @ApiModelProperty(value = "联系电话")
     @NotBlank(message = "联系电话不能为空")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TContractQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TContractQuery.java
new file mode 100644
index 0000000..5d90194
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TContractQuery.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "合同分页列表查询Query")
+public class TContractQuery extends BasePage {
+    @ApiModelProperty(value = "乙方名称")
+    private String partyTwoName;
+    @ApiModelProperty(value = "合同编号")
+    private String contractNumber;
+    @ApiModelProperty(value = "合同名称")
+    private Integer contractName;
+    @ApiModelProperty(value = "合同状态 1=待提交 2=待审批 3=未签订 4=已签订")
+    private Integer status;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TTenantQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TTenantQuery.java
index 28652a0..83e1748 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/TTenantQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TTenantQuery.java
@@ -11,7 +11,7 @@
 public class TTenantQuery extends BasePage {
 
     @ApiModelProperty(value = "租户姓名")
-    private String tenantName;
+    private String residentName;
 
     @ApiModelProperty(value = "联系电话")
     private String phone;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TContractService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TContractService.java
index 1cb1fd5..b580ba2 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TContractService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TContractService.java
@@ -1,7 +1,9 @@
 package com.ruoyi.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TContract;
+import com.ruoyi.system.query.TContractQuery;
 
 /**
  * <p>
@@ -13,4 +15,5 @@
  */
 public interface TContractService extends IService<TContract> {
 
+    PageInfo<TContract> contractList(TContractQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TTenantService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TTenantService.java
index 883c195..0357962 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TTenantService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TTenantService.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TTenant;
 import com.ruoyi.system.query.TTenantQuery;
+import com.ruoyi.system.vo.TenantVO;
 
 /**
  * <p>
@@ -20,5 +21,5 @@
      * @param query
      * @return
      */
-    PageInfo<TTenant> pageList(TTenantQuery query);
+    PageInfo<TenantVO> pageList(TTenantQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java
index f598310..1cb2a34 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java
@@ -1,10 +1,15 @@
 package com.ruoyi.system.service.impl;
 
+import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.mapper.TContractMapper;
 import com.ruoyi.system.model.TContract;
+import com.ruoyi.system.model.TTenant;
+import com.ruoyi.system.query.TContractQuery;
 import com.ruoyi.system.service.TContractService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * <p>
@@ -17,4 +22,12 @@
 @Service
 public class TContractServiceImpl extends ServiceImpl<TContractMapper, TContract> implements TContractService {
 
+    @Override
+    public PageInfo<TContract> contractList(TContractQuery query) {
+        PageInfo<TContract> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<TContract> list = this.baseMapper.contractList(query,pageInfo);
+        pageInfo.setRecords(list);
+        return pageInfo;
+
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/THouseServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/THouseServiceImpl.java
index 594e1e1..436ae5f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/THouseServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/THouseServiceImpl.java
@@ -1,7 +1,10 @@
 package com.ruoyi.system.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.mapper.TContractMapper;
 import com.ruoyi.system.mapper.THouseMapper;
+import com.ruoyi.system.model.TContract;
 import com.ruoyi.system.model.THouse;
 import com.ruoyi.system.query.THouseQuery;
 import com.ruoyi.system.query.TUserHistoryQuery;
@@ -10,6 +13,8 @@
 import com.ruoyi.system.vo.HouseVO;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -22,11 +27,22 @@
  */
 @Service
 public class THouseServiceImpl extends ServiceImpl<THouseMapper, THouse> implements THouseService {
-
+    @Resource
+    private TContractMapper contractMapper;
     @Override
     public PageInfo<THouse> houseList(THouseQuery query) {
         PageInfo<THouse> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
         List<THouse> list = this.baseMapper.houseList(query,pageInfo);
+        List<TContract> tContracts = contractMapper.selectList(new LambdaQueryWrapper<TContract>()
+                .eq(TContract::getStatus, 4)
+                .le(TContract::getStartTime, LocalDateTime.now())
+                .ge(TContract::getEndTime, LocalDateTime.now()));
+        for (THouse tHouse : list) {
+            TContract tContract = tContracts.stream().filter(e -> e.getHouseId().equals(tHouse.getId())).findFirst().orElse(null);
+            if (tContract!=null){
+                tHouse.setTenantType(tContract.getPayType());
+            }
+        }
         pageInfo.setRecords(list);
         return pageInfo;
     }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTenantServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTenantServiceImpl.java
index 068a061..c6d65f1 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTenantServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTenantServiceImpl.java
@@ -1,12 +1,15 @@
 package com.ruoyi.system.service.impl;
 
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.constant.DictConstants;
+import com.ruoyi.common.utils.DictUtils;
 import com.ruoyi.system.mapper.TTenantMapper;
 import com.ruoyi.system.model.TTenant;
 import com.ruoyi.system.query.TTenantQuery;
 import com.ruoyi.system.service.TTenantService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.system.vo.SysUserVO;
+import com.ruoyi.system.vo.TenantVO;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -23,9 +26,13 @@
 public class TTenantServiceImpl extends ServiceImpl<TTenantMapper, TTenant> implements TTenantService {
 
     @Override
-    public PageInfo<TTenant> pageList(TTenantQuery query) {
-        PageInfo<TTenant> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
-        List<TTenant> list = this.baseMapper.pageList(query,pageInfo);
+    public PageInfo<TenantVO> pageList(TTenantQuery query) {
+        PageInfo<TenantVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<TenantVO> list = this.baseMapper.pageList(query,pageInfo);
+        for (TenantVO tenantVO : list) {
+            tenantVO.setTenantAttributesName(DictUtils.getDictLabel(DictConstants.DICT_TYPE_TENANT_ATTRIBUTE,tenantVO.getTenantAttributes()));
+            tenantVO.setTenantTypeName(DictUtils.getDictLabel(DictConstants.DICT_TYPE_TENANT_TYPE,tenantVO.getTenantType()));
+        }
         pageInfo.setRecords(list);
         return pageInfo;
     }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TContractVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TContractVO.java
new file mode 100644
index 0000000..ce55215
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TContractVO.java
@@ -0,0 +1,35 @@
+package com.ruoyi.system.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.model.TContract;
+import com.ruoyi.system.model.THouse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value = "合同详情页VO")
+public class TContractVO extends TContract {
+
+
+    @ApiModelProperty(value = "递增递减 1=递增 2=递减")
+    private Integer increasingDecreasing;
+
+    @ApiModelProperty(value = "递增递减形式 1=百分比 2=金额元")
+    private Integer increasingDecreasingType;
+
+    @ApiModelProperty(value = "数值")
+    private BigDecimal numericalValue;
+
+    @ApiModelProperty(value = "递增或递减时点")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime changeTime;
+
+    @ApiModelProperty(value = "房屋信息")
+    private THouse house;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TenantVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TenantVO.java
new file mode 100644
index 0000000..52566aa
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TenantVO.java
@@ -0,0 +1,21 @@
+package com.ruoyi.system.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.model.TTenant;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value = "租户列表VO")
+public class TenantVO extends TTenant {
+
+    @ApiModelProperty(value = "租户属性")
+    private String tenantAttributesName;
+
+    @ApiModelProperty(value = "租户类型")
+    private String tenantTypeName;
+
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml
index 8da9030..4fae8d7 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml
@@ -59,8 +59,11 @@
 	<select id="countDictDataByType" resultType="Integer">
 	    select count(1) from sys_dict_data where dict_type=#{dictType}  
 	</select>
-	
-	<delete id="deleteDictDataById" parameterType="Long">
+    <select id="selectDictDataByTypeAndValue" resultType="java.lang.String">
+		select dict_label from sys_dict_data where dict_type=#{dictType} and dict_value=#{dictValue}
+	</select>
+
+    <delete id="deleteDictDataById" parameterType="Long">
  		delete from sys_dict_data where dict_code = #{dictCode}
  	</delete>
  	
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index c0b58fa..7336905 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -137,7 +137,7 @@
 		left join sys_user_role ur on u.user_id = ur.user_id
 		left join sys_role sr on ur.role_id = sr.role_id
 		left join sys_dept sd on u.dept_id = sd.dept_id
-		where u.user_id = #{userId} and u.del_flag = 0 group by u.user_id
+		where u.user_id = #{userId} and u.del_flag = 0
 	</select>
 	
 	<select id="checkUserNameUnique" parameterType="String" resultMap="SysUserResult">
diff --git a/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
index 6531e6f..27b7137 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
@@ -38,5 +38,22 @@
     <sql id="Base_Column_List">
         id, contract_number, contract_name, start_time, end_time, total_rent, deposit, pay_type, first_pay_time, isIncreasing, isIncreasing_deposit, proportion, house_id, party_one_name, party_one_person, party_one_phone, tenant_id, party_two_name, party_two_person, party_two_phone, contract_file, remark, status, create_time, update_time, create_by, update_by, disabled
     </sql>
+    <select id="contractList" resultType="com.ruoyi.system.model.TContract">
+        select t1.* from t_contract t1
+        <where>
+            <if test="query.partyTwoName != null and query.partyTwoName != ''">
+                and t1.party_two_name like concat('%',#{query.partyTwoName},'%')
+            </if>
+            <if test="query.contractNumber != null and query.contractNumber != ''">
+                and t1.contract_number like concat('%',#{query.contractNumber},'%')
+            </if>
+             <if test="query.contractName != null and query.contractName != ''">
+                and t1.contract_name like concat('%',#{query.contractName},'%')
+            </if>
+            <if test="query.status != null">
+                and t1.status = #{query.status}
+            </if>
+        </where>
+    </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TTenantMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TTenantMapper.xml
index 96f74cc..ec45f48 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TTenantMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TTenantMapper.xml
@@ -9,9 +9,6 @@
         <result column="checkIn_time" property="checkinTime" />
         <result column="tenant_attributes" property="tenantAttributes" />
         <result column="tenant_type" property="tenantType" />
-        <result column="tenant_building" property="tenantBuilding" />
-        <result column="room_number" property="roomNumber" />
-        <result column="building_area" property="buildingArea" />
         <result column="phone" property="phone" />
         <result column="id_card" property="idCard" />
         <result column="email" property="email" />
@@ -28,18 +25,19 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, resident_name, checkIn_time, tenant_attributes, tenant_type, tenant_building, room_number, building_area, phone, id_card, email,
+        id, resident_name, checkIn_time, tenant_attributes, tenant_type, phone, id_card, email,
             bank_number, mail_address, create_time, update_time, create_by, update_by, disabled,account,password
     </sql>
-    <select id="pageList" resultType="com.ruoyi.system.model.TTenant">
-        SELECT <include refid="Base_Column_List"/>
+    <select id="pageList" resultType="com.ruoyi.system.vo.TenantVO">
+        SELECT id, resident_name, checkIn_time, tenant_attributes, tenant_type, phone, id_card, email,
+        bank_number, mail_address, create_time, disabled,account,
         FROM t_tenant
         <where>
-            <if test="residentName != null and residentName != ''">
-                AND resident_name LIKE concat('%',#{residentName},'%')
+            <if test="query.residentName != null and query.residentName != ''">
+                AND resident_name LIKE concat('%',#{query.residentName},'%')
             </if>
-            <if test="phone != null and phone != ''">
-                AND phone LIKE concat('%',#{phone},'%')
+            <if test="query.phone != null and query.phone != ''">
+                AND phone LIKE concat('%',#{query.phone},'%')
             </if>
             AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
         </where>
diff --git a/sql/xizang.sql b/sql/xizang.sql
index 3dd7b04..66d6c23 100644
--- a/sql/xizang.sql
+++ b/sql/xizang.sql
@@ -11,7 +11,7 @@
  Target Server Version : 80019
  File Encoding         : 65001
 
- Date: 20/01/2025 10:22:50
+ Date: 21/01/2025 17:37:24
 */
 
 SET NAMES utf8mb4;
@@ -235,7 +235,7 @@
   `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
   `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
   PRIMARY KEY (`config_id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '参数配置表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '参数配置表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Records of sys_config
@@ -268,7 +268,7 @@
   `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者',
   `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
   PRIMARY KEY (`dept_id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 200 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Records of sys_dept
@@ -304,7 +304,7 @@
   `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
   `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
   PRIMARY KEY (`dict_code`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 29 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典数据表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典数据表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Records of sys_dict_data
@@ -338,6 +338,18 @@
 INSERT INTO `sys_dict_data` VALUES (27, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2023-10-02 14:09:11', '', NULL, '清空操作');
 INSERT INTO `sys_dict_data` VALUES (28, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', '2023-10-02 14:09:11', '', NULL, '正常状态');
 INSERT INTO `sys_dict_data` VALUES (29, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', '2023-10-02 14:09:11', '', NULL, '停用状态');
+INSERT INTO `sys_dict_data` VALUES (30, 1, '个人', '1', 't_tenant_attribute', NULL, NULL, 'N', '0', 'admin', '2025-01-21 14:12:04', '', NULL, '属性个人');
+INSERT INTO `sys_dict_data` VALUES (31, 2, '企业', '2', 't_tenant_attribute', NULL, NULL, 'N', '0', 'admin', '2025-01-21 14:12:04', '', NULL, '属性企业');
+INSERT INTO `sys_dict_data` VALUES (32, 3, '联系人', '3', 't_tenant_attribute', NULL, NULL, 'N', '0', 'admin', '2025-01-21 14:12:04', '', NULL, '属性联系人');
+INSERT INTO `sys_dict_data` VALUES (33, 4, '个体户', '4', 't_tenant_attribute', NULL, NULL, 'N', '0', 'admin', '2025-01-21 14:12:04', '', NULL, '属性个体户');
+INSERT INTO `sys_dict_data` VALUES (34, 5, '政府机构', '5', 't_tenant_attribute', NULL, NULL, 'N', '0', 'admin', '2025-01-21 14:12:04', '', NULL, '属性政府机构');
+INSERT INTO `sys_dict_data` VALUES (35, 6, '车主', '6', 't_tenant_attribute', NULL, NULL, 'N', '0', 'admin', '2025-01-21 14:12:04', '', NULL, '属性车主');
+INSERT INTO `sys_dict_data` VALUES (36, 7, '国有企业', '7', 't_tenant_attribute', NULL, NULL, 'N', '0', 'admin', '2025-01-21 14:12:04', '', NULL, '属性国有企业');
+INSERT INTO `sys_dict_data` VALUES (37, 8, '其他', '8', 't_tenant_attribute', NULL, NULL, 'N', '0', 'admin', '2025-01-21 14:12:04', '', NULL, '属性其他');
+INSERT INTO `sys_dict_data` VALUES (38, 1, '业主', '1', 't_tenant_type', NULL, NULL, 'N', '0', 'admin', '2025-01-21 14:15:26', '', NULL, '类型业主');
+INSERT INTO `sys_dict_data` VALUES (39, 2, '业主家庭成员', '2', 't_tenant_type', NULL, NULL, 'N', '0', 'admin', '2025-01-21 14:15:26', '', NULL, '类型业主家庭成员');
+INSERT INTO `sys_dict_data` VALUES (40, 3, '租户', '3', 't_tenant_type', NULL, NULL, 'N', '0', 'admin', '2025-01-21 14:15:26', '', NULL, '类型租户');
+INSERT INTO `sys_dict_data` VALUES (41, 4, '租户家庭成员', '4', 't_tenant_type', NULL, NULL, 'N', '0', 'admin', '2025-01-21 14:15:26', '', NULL, '类型租户家庭成员');
 
 -- ----------------------------
 -- Table structure for sys_dict_type
@@ -370,6 +382,8 @@
 INSERT INTO `sys_dict_type` VALUES (8, '通知状态', 'sys_notice_status', '0', 'admin', '2023-10-02 14:09:11', '', NULL, '通知状态列表');
 INSERT INTO `sys_dict_type` VALUES (9, '操作类型', 'sys_oper_type', '0', 'admin', '2023-10-02 14:09:11', '', NULL, '操作类型列表');
 INSERT INTO `sys_dict_type` VALUES (10, '系统状态', 'sys_common_status', '0', 'admin', '2023-10-02 14:09:11', '', NULL, '登录状态列表');
+INSERT INTO `sys_dict_type` VALUES (11, '租户属性', 't_tenant_attribute', '0', 'admin', '2025-01-21 14:05:14', '', NULL, '租户属性列表');
+INSERT INTO `sys_dict_type` VALUES (12, '租户类别', 't_tenant_type', '0', 'admin', '2025-01-21 14:05:47', '', NULL, '租户类别列表');
 
 -- ----------------------------
 -- Table structure for sys_job
@@ -390,7 +404,7 @@
   `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
   `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注信息',
   PRIMARY KEY (`job_id`, `job_name`, `job_group`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Records of sys_job
@@ -436,7 +450,7 @@
   PRIMARY KEY (`info_id`) USING BTREE,
   INDEX `idx_sys_logininfor_s`(`status`) USING BTREE,
   INDEX `idx_sys_logininfor_lt`(`login_time`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1199 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统访问记录' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 1273 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统访问记录' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Records of sys_logininfor
@@ -1541,6 +1555,101 @@
 INSERT INTO `sys_logininfor` VALUES (1197, '17780483325', '192.168.110.91', '内网IP', 'Mobile Safari', 'iOS 11 (iPhone)', '0', '登录成功', '2024-03-04 10:03:38');
 INSERT INTO `sys_logininfor` VALUES (1198, '17780483325', '192.168.110.29', '内网IP', 'Chrome Mobile', 'Android 1.x', '0', '登录成功', '2024-03-04 10:19:27');
 INSERT INTO `sys_logininfor` VALUES (1199, '17780483325', '192.168.110.29', '内网IP', 'Chrome Mobile', 'Android 1.x', '0', '登录成功', '2024-03-04 10:34:13');
+INSERT INTO `sys_logininfor` VALUES (1200, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '1', '密码输入错误1次', '2025-01-20 17:46:06');
+INSERT INTO `sys_logininfor` VALUES (1201, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '1', '用户不存在/密码错误', '2025-01-20 17:46:06');
+INSERT INTO `sys_logininfor` VALUES (1202, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:47:51');
+INSERT INTO `sys_logininfor` VALUES (1203, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '1', '密码输入错误1次', '2025-01-20 17:48:50');
+INSERT INTO `sys_logininfor` VALUES (1204, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '1', '用户不存在/密码错误', '2025-01-20 17:48:50');
+INSERT INTO `sys_logininfor` VALUES (1205, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:48:56');
+INSERT INTO `sys_logininfor` VALUES (1206, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:49:19');
+INSERT INTO `sys_logininfor` VALUES (1207, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:49:21');
+INSERT INTO `sys_logininfor` VALUES (1208, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:49:35');
+INSERT INTO `sys_logininfor` VALUES (1209, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:51:29');
+INSERT INTO `sys_logininfor` VALUES (1210, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:51:32');
+INSERT INTO `sys_logininfor` VALUES (1211, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:51:48');
+INSERT INTO `sys_logininfor` VALUES (1212, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '1', '密码输入错误1次', '2025-01-20 17:52:06');
+INSERT INTO `sys_logininfor` VALUES (1213, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '1', '用户不存在/密码错误', '2025-01-20 17:52:06');
+INSERT INTO `sys_logininfor` VALUES (1214, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:52:10');
+INSERT INTO `sys_logininfor` VALUES (1215, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '1', '用户不存在/密码错误', '2025-01-20 17:52:27');
+INSERT INTO `sys_logininfor` VALUES (1216, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '1', '密码输入错误1次', '2025-01-20 17:52:27');
+INSERT INTO `sys_logininfor` VALUES (1217, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:52:30');
+INSERT INTO `sys_logininfor` VALUES (1218, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:53:47');
+INSERT INTO `sys_logininfor` VALUES (1219, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:54:08');
+INSERT INTO `sys_logininfor` VALUES (1220, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:54:54');
+INSERT INTO `sys_logininfor` VALUES (1221, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '1', '密码输入错误1次', '2025-01-20 17:56:04');
+INSERT INTO `sys_logininfor` VALUES (1222, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '1', '用户不存在/密码错误', '2025-01-20 17:56:04');
+INSERT INTO `sys_logininfor` VALUES (1223, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:56:08');
+INSERT INTO `sys_logininfor` VALUES (1224, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:56:52');
+INSERT INTO `sys_logininfor` VALUES (1225, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:57:27');
+INSERT INTO `sys_logininfor` VALUES (1226, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 17:59:48');
+INSERT INTO `sys_logininfor` VALUES (1227, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:00:29');
+INSERT INTO `sys_logininfor` VALUES (1228, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:00:44');
+INSERT INTO `sys_logininfor` VALUES (1229, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:01:05');
+INSERT INTO `sys_logininfor` VALUES (1230, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:01:20');
+INSERT INTO `sys_logininfor` VALUES (1231, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:01:46');
+INSERT INTO `sys_logininfor` VALUES (1232, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:02:04');
+INSERT INTO `sys_logininfor` VALUES (1233, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:02:29');
+INSERT INTO `sys_logininfor` VALUES (1234, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:02:46');
+INSERT INTO `sys_logininfor` VALUES (1235, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:03:46');
+INSERT INTO `sys_logininfor` VALUES (1236, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:04:02');
+INSERT INTO `sys_logininfor` VALUES (1237, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:04:41');
+INSERT INTO `sys_logininfor` VALUES (1238, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:04:52');
+INSERT INTO `sys_logininfor` VALUES (1239, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:05:43');
+INSERT INTO `sys_logininfor` VALUES (1240, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:05:55');
+INSERT INTO `sys_logininfor` VALUES (1241, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:06:01');
+INSERT INTO `sys_logininfor` VALUES (1242, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:06:30');
+INSERT INTO `sys_logininfor` VALUES (1243, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:06:42');
+INSERT INTO `sys_logininfor` VALUES (1244, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:08:52');
+INSERT INTO `sys_logininfor` VALUES (1245, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:09:34');
+INSERT INTO `sys_logininfor` VALUES (1246, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:10:06');
+INSERT INTO `sys_logininfor` VALUES (1247, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:10:09');
+INSERT INTO `sys_logininfor` VALUES (1248, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:10:17');
+INSERT INTO `sys_logininfor` VALUES (1249, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:10:45');
+INSERT INTO `sys_logininfor` VALUES (1250, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:11:13');
+INSERT INTO `sys_logininfor` VALUES (1251, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:11:20');
+INSERT INTO `sys_logininfor` VALUES (1252, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:12:41');
+INSERT INTO `sys_logininfor` VALUES (1253, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:12:51');
+INSERT INTO `sys_logininfor` VALUES (1254, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:13:43');
+INSERT INTO `sys_logininfor` VALUES (1255, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:14:14');
+INSERT INTO `sys_logininfor` VALUES (1256, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-20 18:16:44');
+INSERT INTO `sys_logininfor` VALUES (1257, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 10:47:15');
+INSERT INTO `sys_logininfor` VALUES (1258, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 11:08:28');
+INSERT INTO `sys_logininfor` VALUES (1259, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 11:09:55');
+INSERT INTO `sys_logininfor` VALUES (1260, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 11:20:23');
+INSERT INTO `sys_logininfor` VALUES (1261, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 11:21:07');
+INSERT INTO `sys_logininfor` VALUES (1262, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 11:24:52');
+INSERT INTO `sys_logininfor` VALUES (1263, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 11:51:22');
+INSERT INTO `sys_logininfor` VALUES (1264, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 11:57:01');
+INSERT INTO `sys_logininfor` VALUES (1265, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 11:58:29');
+INSERT INTO `sys_logininfor` VALUES (1266, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 11:59:22');
+INSERT INTO `sys_logininfor` VALUES (1267, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 13:18:17');
+INSERT INTO `sys_logininfor` VALUES (1268, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 13:24:19');
+INSERT INTO `sys_logininfor` VALUES (1269, 'admin', '192.168.110.10', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 13:24:48');
+INSERT INTO `sys_logininfor` VALUES (1270, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 13:25:00');
+INSERT INTO `sys_logininfor` VALUES (1271, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 13:27:32');
+INSERT INTO `sys_logininfor` VALUES (1272, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 13:28:40');
+INSERT INTO `sys_logininfor` VALUES (1273, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 13:47:20');
+INSERT INTO `sys_logininfor` VALUES (1274, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 13:55:52');
+INSERT INTO `sys_logininfor` VALUES (1275, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 14:18:41');
+INSERT INTO `sys_logininfor` VALUES (1276, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 14:22:44');
+INSERT INTO `sys_logininfor` VALUES (1277, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 14:23:53');
+INSERT INTO `sys_logininfor` VALUES (1278, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 14:30:34');
+INSERT INTO `sys_logininfor` VALUES (1279, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 14:44:08');
+INSERT INTO `sys_logininfor` VALUES (1280, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 14:45:20');
+INSERT INTO `sys_logininfor` VALUES (1281, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:06:27');
+INSERT INTO `sys_logininfor` VALUES (1282, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:07:13');
+INSERT INTO `sys_logininfor` VALUES (1283, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:08:22');
+INSERT INTO `sys_logininfor` VALUES (1284, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:09:26');
+INSERT INTO `sys_logininfor` VALUES (1285, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:09:55');
+INSERT INTO `sys_logininfor` VALUES (1286, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:11:01');
+INSERT INTO `sys_logininfor` VALUES (1287, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:12:25');
+INSERT INTO `sys_logininfor` VALUES (1288, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:13:00');
+INSERT INTO `sys_logininfor` VALUES (1289, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:13:36');
+INSERT INTO `sys_logininfor` VALUES (1290, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:14:17');
+INSERT INTO `sys_logininfor` VALUES (1291, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:16:40');
+INSERT INTO `sys_logininfor` VALUES (1292, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:17:16');
+INSERT INTO `sys_logininfor` VALUES (1293, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:28:50');
+INSERT INTO `sys_logininfor` VALUES (1294, 'admin', '192.168.110.103', '内网IP', 'Chrome 13', 'Windows 10', '0', '登录成功', '2025-01-21 15:39:35');
 
 -- ----------------------------
 -- Table structure for sys_menu
@@ -1567,7 +1676,7 @@
   `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
   `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注',
   PRIMARY KEY (`menu_id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 54 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 2008 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Records of sys_menu
@@ -4082,7 +4191,7 @@
   `removeDays` int(0) NULL DEFAULT NULL COMMENT '删除天数',
   `postType` int(0) NULL DEFAULT NULL COMMENT '岗位类型 1=经理 2=负责人 3=专员',
   PRIMARY KEY (`role_id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 122 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色信息表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 123 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色信息表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Records of sys_role
@@ -4681,12 +4790,12 @@
   `districtId` int(0) NULL DEFAULT NULL COMMENT '区县id',
   `deptName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门名称',
   PRIMARY KEY (`user_id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 151 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 152 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Records of sys_user
 -- ----------------------------
-INSERT INTO `sys_user` VALUES (1, 100, 'admin', '若依', '00', 'ry@163.com', '15888888888', '1', 'https://we-park-life.oss-cn-beijing.aliyuncs.com/img/ebcc2c95e1504371a8b3f3b1167a03a0.jpg', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '192.168.110.6', '2024-03-04 09:33:39', 'admin', '2023-10-02 14:09:09', 'admin', '2024-03-04 09:33:38', '管理员', 0, 4, '测试部门');
+INSERT INTO `sys_user` VALUES (1, 100, 'admin', '若依', '00', 'ry@163.com', '15888888888', '1', 'https://we-park-life.oss-cn-beijing.aliyuncs.com/img/ebcc2c95e1504371a8b3f3b1167a03a0.jpg', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '192.168.110.103', '2025-01-21 15:39:35', 'admin', '2023-10-02 14:09:09', 'admin', '2025-01-21 15:39:35', '管理员', 0, 4, '测试部门');
 INSERT INTO `sys_user` VALUES (100, 3, '18008172471', '蒲悦添', '00', '', '18008172471', '0', 'https://we-park-life.oss-cn-beijing.aliyuncs.com/img/ebcc2c95e1504371a8b3f3b1167a03a0.jpg', '$2a$10$gL9RGP3b2d9YnmLxWm8GSu8XnvHDdJemGLgrslbe.hJPRKQ6Yk5jK', '0', '2', '', NULL, '若依', '2023-10-20 18:25:45', '若依', '2023-10-21 09:33:02', NULL, 0, 2, '测试部门');
 INSERT INTO `sys_user` VALUES (101, 3, '18008172470', '蒲悦添', '00', '', '18008172470', '0', 'https://we-park-life.oss-cn-beijing.aliyuncs.com/img/ebcc2c95e1504371a8b3f3b1167a03a0.jpg', '$2a$10$PapRFYddk9FIcsKPJLFby.JKnRt2C1dngbr2EUiDgCNca8fxEfafi', '0', '2', '', NULL, '若依', '2023-10-20 18:27:54', '若依', '2023-10-21 09:33:00', 'string', 0, 2, '测试部门');
 INSERT INTO `sys_user` VALUES (102, 3, '18008172471', '蒲悦添', '00', '', '18008172471', '0', 'https://we-park-life.oss-cn-beijing.aliyuncs.com/img/ebcc2c95e1504371a8b3f3b1167a03a0.jpg', '$2a$10$C6fSf7r6uZhWD8kc1nYoAO2oUlp3cFc.Q92Qqa8xQhueD74Ram/pG', '0', '2', '127.0.0.1', '2023-10-23 17:31:08', '若依', '2023-10-21 10:11:08', '蒲悦添', '2023-10-23 17:31:07', NULL, 0, 2, '测试部门');
@@ -4800,7 +4909,7 @@
   `actual_money` double(10, 2) NULL DEFAULT NULL COMMENT '实际收款',
   `voucher` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '凭证上传',
   `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
-  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+  `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
   `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
   `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',
   `disabled` int(0) NULL DEFAULT 0 COMMENT '是否删除 0=否 1=是',
@@ -4832,7 +4941,7 @@
   `check_result` int(0) NULL DEFAULT NULL COMMENT '验收结果 1=合格 2=不合格',
   `check_money` double(10, 2) NULL DEFAULT NULL COMMENT '验收结算金额',
   `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
-  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+  `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
   `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
   `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',
   `disabled` int(0) NULL DEFAULT 0 COMMENT '是否删除 0=否 1=是',
@@ -4868,11 +4977,11 @@
   `party_two_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '乙方名称',
   `party_two_person` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '乙方联系人',
   `party_two_phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '乙方联系方式',
-  `contract_file` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '合同附件',
+  `contract_file` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '合同附件',
   `remark` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '备注',
   `status` int(0) NULL DEFAULT 1 COMMENT '状态 1=待审批 2=未签订 3=已签订',
   `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
-  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+  `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
   `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
   `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',
   `disabled` int(0) NULL DEFAULT 0 COMMENT '是否删除 0=否 1=是',
@@ -4948,12 +5057,12 @@
   `leave_message` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '留言',
   `handle_person` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '处理人',
   `handle_time` datetime(0) NULL DEFAULT NULL COMMENT '处理时间',
-  `reault_describe` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '结果描述',
+  `result_describe` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '结果描述',
   `repair_picture` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '处理照片',
   `attachment` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '附件',
   `status` int(0) NULL DEFAULT 1 COMMENT '状态 1=待处理 2=已处理',
   `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
-  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+  `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
   `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
   `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',
   `disabled` int(0) NULL DEFAULT 0 COMMENT '是否删除 0=否 1=是',
@@ -4982,7 +5091,7 @@
   `pay_type` int(0) NULL DEFAULT NULL COMMENT '支付方式 1=微信支付 2=支付宝支付 3=线下支付',
   `payment_bill_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '缴费账单id',
   `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
-  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+  `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
   `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
   `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',
   `disabled` int(0) NULL DEFAULT 0 COMMENT '是否删除 0=否 1=是',
@@ -5012,10 +5121,12 @@
   `property_right_duration` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '产权年限',
   `lease_status` int(0) NULL DEFAULT 1 COMMENT '租赁状态 1=待出租 2=已出租 3=维修中',
   `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
-  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+  `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
   `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
   `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',
   `disabled` int(0) NULL DEFAULT 0 COMMENT '是否删除 0=否 1=是',
+  `building` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '楼栋',
+  `room_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '房号',
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '房屋管理' ROW_FORMAT = Dynamic;
 
@@ -5036,7 +5147,7 @@
   `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '内容',
   `attachment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '附件',
   `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
-  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+  `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
   `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
   `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',
   `disabled` int(0) NULL DEFAULT 0 COMMENT '是否删除 0=否 1=是',
@@ -5065,7 +5176,7 @@
   `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱',
   `contract_number` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '开票合同编号逗号分割',
   `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
-  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+  `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
   `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
   `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',
   `disabled` int(0) NULL DEFAULT 0 COMMENT '是否删除 0=否 1=是',
@@ -5087,7 +5198,7 @@
   `sort_by` int(0) NULL DEFAULT NULL COMMENT '权重',
   `pictures` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图片',
   `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
-  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+  `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
   `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
   `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',
   `disabled` int(0) NULL DEFAULT 0 COMMENT '是否删除 0=否 1=是',
@@ -5107,7 +5218,7 @@
   `type_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类名称',
   `sort_by` int(0) NULL DEFAULT NULL COMMENT '权重',
   `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
-  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+  `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
   `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
   `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',
   `disabled` int(0) NULL DEFAULT 0 COMMENT '是否删除 0=否 1=是',
@@ -5153,10 +5264,12 @@
   `bank_number` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '银行转账专号',
   `mail_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '通讯地址',
   `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
-  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+  `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
   `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',
   `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',
   `disabled` int(0) NULL DEFAULT 0 COMMENT '是否删除 0=否 1=是',
+  `account` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录账号',
+  `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '密码',
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '租户' ROW_FORMAT = Dynamic;
 

--
Gitblit v1.7.1