From 4788c0abe7193191b3ca024b0f5f8fed196294bd Mon Sep 17 00:00:00 2001
From: yupeng <roc__yu@163.com>
Date: 星期三, 05 三月 2025 14:29:26 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into xizang-changyun

---
 ruoyi-admin/src/main/resources/application-test.yml                                                 |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java                                 |    4 
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java                             |   41 +
 ruoyi-common/src/main/java/com/ruoyi/common/constant/DictConstants.java                             |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TBill.java                                        |    4 
 ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml                                       |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCheckAcceptRecordController.java            |   30 
 ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/StateProcessJob.java                          |   49 +
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java                 |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java            |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TBillVO.java                                         |    4 
 ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml                          |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java                                 |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/query/THouseQuery.java                                  |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TTenantService.java                             |    9 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java                         |   16 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillController.java                        |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java       |  630 +++++++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTenantServiceImpl.java                    |   25 
 ruoyi-system/src/main/java/com/ruoyi/system/task/utils/SpringContextsUtil.java                      |   37 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDeptServiceImpl.java                      |    4 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java            |    5 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java               |    7 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java                 |    6 
 ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml                             |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java              |  238 ++--
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBannerController.java                       |    2 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java                      |    4 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysPostController.java                   |    6 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TItemController.java                         |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java                             |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java                      |    1 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java                    |   18 
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java          |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/task/base/TimeJobType.java                              |   28 
 ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml                                 |    2 
 ruoyi-applet/src/main/resources/application-test.yml                                                |    6 
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseModel.java                              |    1 
 ruoyi-system/src/main/resources/mapper/system/TDeptToUserMapper.xml                                 |    6 
 ruoyi-system/src/main/resources/mapper/system/StateProcessInstanceActionMapper.xml                  |   24 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java                 |   14 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java                                    |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessRefuseBO.java                                 |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java                   |   29 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisConfiguration.java            |   34 
 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml                                     |   23 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java                               |    1 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java                   |    5 
 ruoyi-common/src/main/java/com/ruoyi/common/enums/TaskEventType.java                                |  146 +++
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/THouseController.java                       |   22 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java                  |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysConfigController.java                    |    4 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/THouseController.java                        |   17 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java                   |    6 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java                   |   15 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysUserController.java                   |    9 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java                    |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java                              |   37 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultAreaDicController.java                 |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java                                  |   10 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDeptController.java                         |   24 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java                    |    7 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFlowManagementController.java               |    2 
 ruoyi-system/src/main/resources/mapper/system/THouseMapper.xml                                      |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TDeptToUserMapper.java                           |    5 
 ruoyi-admin/pom.xml                                                                                 |    6 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBankFlowController.java                     |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTenantController.java                       |   24 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java            |    2 
 ruoyi-system/pom.xml                                                                                |    4 
 ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml                                   |    7 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultRepairMessageController.java           |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/task/exceptions/TimeException.java                      |   37 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java                               |    7 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TInformationController.java                  |   12 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TInvoiceController.java                      |    5 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java                   |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java                           |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/task/base/QuartzManager.java                            |  128 +++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultDescribeDicController.java             |   12 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/RevokeDTO.java                                      |   19 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java                    |    7 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java                     |  201 +---
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java               |    6 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java                  |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java                   |   30 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java                  |   97 +
 ruoyi-system/src/main/java/com/ruoyi/system/query/TContractQuery.java                               |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TItemTypeController.java                     |   12 
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java                |   18 
 91 files changed, 1,808 insertions(+), 546 deletions(-)

diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 97f4520..96e7388 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -140,17 +140,17 @@
         <dependency>
             <groupId>cn.afterturn</groupId>
             <artifactId>easypoi-base</artifactId>
-            <version>3.0.3</version>
+            <version>4.3.0</version>
         </dependency>
         <dependency>
             <groupId>cn.afterturn</groupId>
             <artifactId>easypoi-web</artifactId>
-            <version>3.0.3</version>
+            <version>4.3.0</version>
         </dependency>
         <dependency>
             <groupId>cn.afterturn</groupId>
             <artifactId>easypoi-annotation</artifactId>
-            <version>3.0.3</version>
+            <version>4.3.0</version>
         </dependency>
 
         <!-- 阿里云短信 -->
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
index 46e24ae..a00e890 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
@@ -1,6 +1,5 @@
 package com.ruoyi.web.controller.api;
 
-import com.aizuda.bpm.engine.entity.FlwTask;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -8,18 +7,15 @@
 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.BaseEntity;
 import com.ruoyi.common.core.domain.BaseModel;
 import com.ruoyi.common.core.domain.BasePage;
 import com.ruoyi.common.core.domain.entity.SysUser;
-import com.ruoyi.common.core.page.PageDomain;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.exception.GlobalException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.system.bo.*;
 import com.ruoyi.system.model.StateProcessModule;
 import com.ruoyi.system.model.StateProcessTemplate;
-import com.ruoyi.system.model.TContract;
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.service.StateProcessModuleService;
 import com.ruoyi.system.service.StateProcessTemplateService;
@@ -32,7 +28,10 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBankFlowController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBankFlowController.java
index 5f7bd4b..07154a0 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBankFlowController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBankFlowController.java
@@ -44,7 +44,7 @@
     /**
      * 获取流水列表
      */
-    @PreAuthorize("@ss.hasPermi('system:bankFlow:list')")
+    @PreAuthorize("@ss.hasPermi('flow:bank:detail:list')")
     @ApiOperation(value = "获取银行流水列表")
     @PostMapping("/list")
     public R<PageInfo<TBankFlow>> list(@RequestBody TBankFlowQuery query) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBannerController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBannerController.java
index 8eb891f..634f1ce 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBannerController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBannerController.java
@@ -60,7 +60,7 @@
     /**
      * 修改轮播图
      */
-    @PreAuthorize("@ss.hasPermi('system:banner:update')")
+    @PreAuthorize("@ss.hasPermi('system:banner:edit')")
     @Log(title = "轮播图信息-修改轮播图", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "修改轮播图")
     @PostMapping(value = "/update")
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java
index 2dbbbdd..a0340a0 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java
@@ -45,7 +45,7 @@
     @Autowired
     TBillConfirmService tBillConfirmService;
 
-    @PreAuthorize("@ss.hasPermi('system:bill:list')")
+    @PreAuthorize("@ss.hasPermi('bill:list')")
     @PostMapping("list")
     @ApiOperation("分页查询账单列表")
     public R<PageInfo<TBillDto>> list(@RequestBody TBillQuery query){
@@ -53,7 +53,7 @@
         return R.ok(pageInfo);
     }
 
-    @PreAuthorize("@ss.hasPermi('system:bill:add')")
+    @PreAuthorize("@ss.hasPermi('bill:list:addRent')")
     @PostMapping("add")
     @ApiOperation("新增账单")
     public R<PageInfo<TBillDto>> add(@Validated @RequestBody TbillSaveDto bill){
@@ -83,7 +83,7 @@
     }
 
 
-    @PreAuthorize("@ss.hasPermi('system:bill:checkOfflinePay')")
+    @PreAuthorize("@ss.hasPermi('bill:list:paid')")
     @ApiOperation("确认线下缴费")
     @PostMapping("checkOfflinePay")
     public R checkOfflinePay(@Validated @RequestBody  OfflinePayCheckDto dto){
@@ -91,7 +91,7 @@
         return R.ok();
     }
 
-    @PreAuthorize("@ss.hasPermi('system:bill:sendSmsByBillIds')")
+    @PreAuthorize("@ss.hasPermi('bill:list:sendMsg')")
     @ApiOperation("账单批量发送短信通知")
     @PostMapping("sendSmsByBillIds")
     public R sendSmsByBillIds(@Validated @RequestBody SmsByBillDto dto){
@@ -100,8 +100,8 @@
     }
 
 
-    @PreAuthorize("@ss.hasPermi('system:bill:sendMailBatchByBillIds')")
-    @ApiOperation("账单批量发送邮件通知")
+    @PreAuthorize("@ss.hasPermi('bill:list:sendMail')")
+    @ApiOperation("账单批量发送邮箱通知")
     @PostMapping("sendMailBatchByBillIds")
     public R sendMailBatchByBillIds(@Validated @RequestBody SmsByBillDto dto){
         Integer failNum = tBillService.sendMailBatchByBillIds(dto);
@@ -111,7 +111,7 @@
 
 
 
-    @PreAuthorize("@ss.hasPermi('system:bill:cashPay')")
+    @PreAuthorize("@ss.hasPermi('bill:list:receipt')")
     @ApiOperation("收款")
     @PostMapping("cashPay")
     public R cashPay(@RequestBody CachPayDto cachPayDto){
@@ -126,8 +126,6 @@
         BillStatisticsDto dto = tBillService.statistics();
         return R.ok(dto);
     }
-
-
 
 
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCheckAcceptRecordController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCheckAcceptRecordController.java
index 721d961..ab20a9b 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCheckAcceptRecordController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCheckAcceptRecordController.java
@@ -7,10 +7,12 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.model.TBill;
 import com.ruoyi.system.model.TCheckAcceptRecord;
 import com.ruoyi.system.model.TContract;
 import com.ruoyi.system.model.THouse;
 import com.ruoyi.system.query.TCheckAcceptRecordQuery;
+import com.ruoyi.system.service.TBillService;
 import com.ruoyi.system.service.TCheckAcceptRecordService;
 import com.ruoyi.system.service.TContractService;
 import com.ruoyi.system.service.THouseService;
@@ -23,6 +25,7 @@
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.List;
@@ -44,6 +47,8 @@
     private final TContractService contractService;
     private final THouseService houseService;
     @Autowired
+    private TBillService billService;
+    @Autowired
     public TCheckAcceptRecordController(TCheckAcceptRecordService checkAcceptRecordService, TContractService contractService, THouseService houseService) {
         this.checkAcceptRecordService = checkAcceptRecordService;
         this.contractService = contractService;
@@ -53,7 +58,7 @@
     /**
      * 获取验收记录管理列表
      */
-    @PreAuthorize("@ss.hasPermi('system:accept:list')")
+    @PreAuthorize("@ss.hasPermi('houseManage:check:list')")
     @ApiOperation(value = "获取验收记录分页列表")
     @PostMapping(value = "/pageList")
     public R<PageInfo<TCheckAcceptRecordVO>> pageList(@RequestBody TCheckAcceptRecordQuery query) {
@@ -88,7 +93,7 @@
     /**
      * 添加验收记录管理
      */
-    @PreAuthorize("@ss.hasPermi('system:accept:add')")
+    @PreAuthorize("@ss.hasPermi('houseManage:check:add')")
     @Log(title = "验收记录信息-新增验收记录", businessType = BusinessType.INSERT)
     @ApiOperation(value = "添加验收记录")
     @PostMapping(value = "/add")
@@ -101,8 +106,19 @@
         dto.setCode(replace.substring(2)+String.format("%03d", size+1));
         // 添加验收记录
         checkAcceptRecordService.save(dto);
-
-        // TODO 生成结算帐单
+        if (dto.getCheckMoney()!=null&&(dto.getCheckMoney().compareTo(new BigDecimal("0"))!=0)){
+            TContract contract = contractService.getById(dto.getContractId());
+            // TODO 生成结算帐单
+            TBill tBill = new TBill();
+            tBill.setContractId(dto.getContractId());
+            tBill.setContractNumber(contract.getContractNumber());
+            tBill.setPayableFeesMoney(dto.getCheckMoney());
+            tBill.setPayableFeesTime(LocalDate.now());
+            tBill.setPayFeesStatus("1");
+            tBill.setBillType("4");
+            tBill.setSmsStatus(0);
+            billService.save(tBill);
+        }
 
         return R.ok();
     }
@@ -110,7 +126,7 @@
     /**
      * 查看验收记录详情
      */
-    @PreAuthorize("@ss.hasPermi('system:accept:detail')")
+    @PreAuthorize("@ss.hasPermi('houseManage:check:detail')")
     @ApiOperation(value = "查看验收记录详情")
     @GetMapping(value = "/getDetailById")
     public R<TCheckAcceptRecordVO> getDetailById(@RequestParam String id) {
@@ -127,7 +143,7 @@
     /**
      * 删除验收记录
      */
-    @PreAuthorize("@ss.hasPermi('system:accept:delete')")
+    @PreAuthorize("@ss.hasPermi('houseManage:check:delete')")
     @Log(title = "验收记录信息-删除验收记录", businessType = BusinessType.DELETE)
     @ApiOperation(value = "删除验收记录")
     @DeleteMapping(value = "/deleteById")
@@ -138,7 +154,7 @@
     /**
      * 批量删除验收记录
      */
-    @PreAuthorize("@ss.hasPermi('system:accept:delete')")
+    @PreAuthorize("@ss.hasPermi('houseManage:check:delete')")
     @Log(title = "验收记录信息-删除验收记录", businessType = BusinessType.DELETE)
     @ApiOperation(value = "批量删除验收记录")
     @DeleteMapping(value = "/deleteByIds")
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 bb120fb..5a0e81a 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
@@ -3,33 +3,39 @@
 
 import cn.afterturn.easypoi.excel.ExcelExportUtil;
 import cn.afterturn.easypoi.excel.entity.ExportParams;
-import cn.hutool.core.util.ObjectUtil;
+import com.aizuda.bpm.engine.entity.FlwTask;
+import com.aizuda.bpm.mybatisplus.mapper.FlwTaskMapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.collect.ImmutableMap;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.constant.DictConstants;
-import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.enums.ProcessCategoryEnum;
-import com.ruoyi.common.utils.*;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.DictUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.WebUtils;
 import com.ruoyi.system.bo.ProcessStartBO;
-import com.ruoyi.system.dto.*;
+import com.ruoyi.system.dto.RevokeDTO;
+import com.ruoyi.system.dto.SetContractDto;
+import com.ruoyi.system.dto.TContractDTO;
+import com.ruoyi.system.dto.TerminateContractDTO;
 import com.ruoyi.system.export.ContractExport;
-import com.ruoyi.system.export.OpticalInspectionExport;
 import com.ruoyi.system.model.*;
 import com.ruoyi.system.query.TContractBillQuery;
 import com.ruoyi.system.query.TContractQuery;
-import com.ruoyi.system.query.THouseQuery;
-import com.ruoyi.system.query.TUserHistoryQuery;
 import com.ruoyi.system.service.*;
+import com.ruoyi.system.task.base.QuartzManager;
+import com.ruoyi.system.task.base.TimeJobType;
+import com.ruoyi.system.task.jobs.StateProcessJob;
 import com.ruoyi.system.vo.BillVO;
 import com.ruoyi.system.vo.CheckAcceptRecordVO;
-import com.ruoyi.system.vo.HouseVO;
+import com.ruoyi.system.vo.TContractVO;
 import com.ruoyi.web.controller.tool.NumberToChineseUtils;
 import com.ruoyi.web.controller.tool.WordUtil;
-import io.swagger.annotations.Api;
-import com.ruoyi.system.vo.TContractVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -44,7 +50,6 @@
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
@@ -73,121 +78,24 @@
     private TCheckAcceptRecordService checkAcceptRecordService;
     @Autowired
     private StateProcessTemplateService stateProcessTemplateService;
+    @Autowired
+    private FlwTaskMapper flwTaskMapper;
 
-    @ApiOperation(value = "测试生成账单")
-    @PostMapping(value = "/testBill")
-    public R testBill(String id) {
-        TContract contract = contractService.getById(id);
-        // 查询所有已签订的合同并且未生成第一笔账单的
-
-        List<TBill> bills = new ArrayList<>();
-        List<TContractRentType> contractRentTypes = contractRentTypeService.list();
-            contract.setFirstPayTime(contract.getStartTime().plusDays(10));
-            // 第一次应缴费日期
-            LocalDateTime firstPayTime = contract.getStartTime().plusDays(10).withHour(0).withMinute(0).withSecond(0);
-            TBill rentBill = new TBill();
-            rentBill.setContractId(contract.getId());
-            rentBill.setContractNumber(contract.getContractNumber());
-            rentBill.setPayableFeesTime(firstPayTime.toLocalDate());
-            rentBill.setPayFeesStatus("1");
-            rentBill.setBillType("1");
-            rentBill.setStartTime(contract.getStartPayTime());
-            TContractRentType tContractRentType = contractRentTypes.stream().filter(e -> e.getContractId().equals(contract.getId())).findFirst().orElse(null);
-
-            if (tContractRentType!=null && contract.getStartPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12).isAfter(tContractRentType.getChangeTime())){
-                // 计算租金变动的天数
-                long moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), contract.getStartPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12))+1L;
-                contract.setChangeTime(LocalDateTime.now());
-                // 递增递减的租金
-                BigDecimal contractRentTypeMoney = new BigDecimal("0");
-                // 不递增递减的租金
-                BigDecimal originalMoney = new BigDecimal("0");
-                // 原租金
-                switch (tContractRentType.getIncreasingDecreasingType()){
-                    case 1:
-                        switch (tContractRentType.getIncreasingDecreasing()){
-                            case 1:
-                                contractRentTypeMoney =contractRentTypeMoney.add(contract.getChangeRent().multiply(new BigDecimal(100).add(tContractRentType.getNumericalValue())).divide(new BigDecimal(100),2,BigDecimal.ROUND_DOWN).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays)));
-                                contract.setChangeRent(contractRentTypeMoney);
-                                break;
-                            case 2:
-                                contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().multiply((new BigDecimal(100).subtract(tContractRentType.getNumericalValue()))).divide(new BigDecimal(100),2,BigDecimal.ROUND_DOWN).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays)).divide(new BigDecimal(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12),2,BigDecimal.ROUND_DOWN));
-                                contract.setChangeRent(contractRentTypeMoney);
-                                break;
-                        }
-                        break;
-                    case 2:
-                        switch (tContractRentType.getIncreasingDecreasing()){
-                            case 1:
-                                contractRentTypeMoney =contractRentTypeMoney.add(contract.getChangeRent().add(tContractRentType.getNumericalValue())).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays));
-                                contract.setChangeRent(contractRentTypeMoney);
-                                break;
-                            case 2:
-                                contractRentTypeMoney = contractRentTypeMoney.add(contract.getChangeRent().subtract(tContractRentType.getNumericalValue())).divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(moneyDays));
-                                contract.setChangeRent(contractRentTypeMoney);
-
-                                break;
-                        }
-                        break;
-                }
-                // 不需要涨租金的时间段
-                if (contract.getFirstPayTime().isBefore(tContractRentType.getChangeTime())){
-                    long originalDays = ChronoUnit.DAYS.between(contract.getFirstPayTime(), tContractRentType.getChangeTime());
-                    originalMoney=originalMoney.add(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN))
-                            .multiply(new BigDecimal(originalDays));
-                    rentBill.setPayableFeesMoney(contractRentTypeMoney.add(originalMoney));
-                    rentBill.setOutstandingMoney(rentBill.getPayableFeesMoney());
-                }else{
-                    rentBill.setPayableFeesMoney(contractRentTypeMoney);
-                    rentBill.setOutstandingMoney(rentBill.getPayableFeesMoney());
-                }
-
-                if (contract.getFirstPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12).isAfter(contract.getEndTime())){
-                    rentBill.setEndTime(contract.getFirstPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12));
-                }else{
-                    rentBill.setEndTime(contract.getEndTime());
-                }
-            }else{
-                if (contract.getFirstPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12).isAfter(contract.getEndTime())){
-                    rentBill.setEndTime(contract.getFirstPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12));
-                }else{
-                    rentBill.setEndTime(contract.getEndTime());
-                }
-                // 不走递增递减
-                long allDays = ChronoUnit.DAYS.between(contract.getFirstPayTime(), rentBill.getEndTime());
-                rentBill.setPayableFeesMoney(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(allDays)));
-                rentBill.setOutstandingMoney(rentBill.getPayableFeesMoney());
-
-            }
-            // 租金账单
-            bills.add(rentBill);
-            // 押金账单
-            TBill depositBill = new TBill();
-            depositBill.setContractId(contract.getId());
-            depositBill.setContractNumber(contract.getContractNumber());
-            depositBill.setPayableFeesMoney(contract.getDeposit());
-            depositBill.setOutstandingMoney(depositBill.getPayableFeesMoney());
-
-            depositBill.setPayableFeesTime(firstPayTime.toLocalDate());
-            depositBill.setPayFeesStatus("1");
-            depositBill.setBillType("2");
-        contractService.updateById(contract);
-        billService.save(rentBill);
-        billService.save(depositBill);
-        return R.ok();
-    }
     @ApiOperation(value = "获取合同分页列表")
     @PostMapping(value = "/contractList")
-    @PreAuthorize("@ss.hasPermi('system:contract:list')")
-
+    @PreAuthorize("@ss.hasPermi('contract:list')")
     public R<PageInfo<TContract>> contractList(@RequestBody TContractQuery query) {
         return R.ok(contractService.contractList(query));
     }
     @Log(title = "合同管理-新增合同", businessType = BusinessType.INSERT)
     @ApiOperation(value = "新增合同")
     @PostMapping(value = "/addContract")
-    @PreAuthorize("@ss.hasPermi('system:contract:add')")
+    @PreAuthorize("@ss.hasPermi('contract:list:add')")
     public R<Boolean> addContract(@Validated @RequestBody TContractDTO dto) {
+        long count = contractService.count(new LambdaQueryWrapper<TContract>().eq(TContract::getContractNumber, dto.getContractNumber()));
+        if (count!=0){
+            return R.fail("合同编号不可重复");
+        }
         dto.setChangeRent(dto.getMonthRent());
         contractService.save(dto);
         if (dto.getStatus().equals("2")){
@@ -204,7 +112,21 @@
             variable.put("projectId", dto.getId());
             processStartBO.setVariable(variable);
             //开启工作流程
-            stateProcessTemplateService.start(processStartBO);
+            Boolean start = stateProcessTemplateService.start(processStartBO);
+            if(start){
+                FlwTask flwTask = flwTaskMapper.selectOne(Wrappers.lambdaQuery(FlwTask.class)
+                        .like(FlwTask::getVariable, dto.getId())
+                        .orderByDesc(FlwTask::getCreateTime)
+                        .last("LIMIT 1"));
+                if(Objects.nonNull(flwTask)){
+                    // 添加定时任务
+                    Map<String, ? extends Object> maps =
+                            new ImmutableMap.Builder<String, Long>().
+                                    put("id", flwTask.getId())
+                                    .build();
+                    QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name+flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT,new Date(new Date().getTime()+48*60*60*1000L), maps);
+                }
+            }
         }
         if (dto.getIsIncreasing()){
             TContractRentType tContractRentType = new TContractRentType();
@@ -221,7 +143,7 @@
     @Log(title = "合同管理-编辑合同", businessType =  BusinessType.UPDATE)
     @ApiOperation(value = "编辑合同")
     @PostMapping(value = "/updateContract")
-    @PreAuthorize("@ss.hasPermi('system:contract:update')")
+    @PreAuthorize("@ss.hasPermi('contract:list:edit')")
     public R<Boolean> updateContract(@Validated @RequestBody TContractDTO dto) {
         contractService.updateById(dto);
         contractRentTypeService.remove(new LambdaQueryWrapper<TContractRentType>()
@@ -240,8 +162,7 @@
     }
     @Log(title = "合同管理-批量删除合同", businessType = BusinessType.DELETE)
     @ApiOperation(value = "批量删除合同")
-    @PreAuthorize("@ss.hasPermi('system:contract:delete')")
-
+    @PreAuthorize("@ss.hasPermi('contract:list:delete')")
     @DeleteMapping(value = "/deleteContractByIds")
     public R<Boolean> deleteContractByIds(@RequestParam String ids) {
         if (StringUtils.isNotEmpty(ids)){
@@ -252,7 +173,7 @@
 
     @ApiOperation(value = "查询合同信息信息")
     @GetMapping(value = "/getContractById")
-    @PreAuthorize("@ss.hasPermi('system:contract:detail')")
+    @PreAuthorize("@ss.hasPermi('contract:list:detail')")
     public R<TContractVO> getContractById(@RequestParam String id) {
         TContractVO res = new TContractVO();
         TContract contract = contractService.getById(id);
@@ -263,15 +184,13 @@
         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()));
+//        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());
-        }
+        house.setTenantType(contract.getPayType());
         res.setHouse(house);
         List<TBill> list = billService.lambdaQuery()
                 .eq(TBill::getContractId, id)
@@ -289,17 +208,18 @@
     }
     @Log(title = "合同管理-撤销审批", businessType =  BusinessType.UPDATE)
     @ApiOperation(value = "撤销审批")
-    @PreAuthorize("@ss.hasPermi('system:contract:revoke')")
-
-    @GetMapping(value = "/updateContractStatus")
-    public R<Boolean> updateContractStatus(String id) {
-        TContract contract = contractService.getById(id);
+    @PreAuthorize("@ss.hasPermi('contract:list:cancel')")
+    @PostMapping(value = "/updateContractStatus")
+    public R<Boolean> updateContractStatus(@RequestBody RevokeDTO dto) {
+        TContract contract = contractService.getById(dto.getContractId());
         contract.setStatus("1");
         contractService.updateById(contract);
+        // 撤销审批实例
+        stateProcessTemplateService.revoke(dto.getInstanceId());
+
         return R.ok();
     }
-    @PreAuthorize("@ss.hasPermi('system:contract:confirm')")
-
+    @PreAuthorize("@ss.hasPermi('contract:list:settlement')")
     @Log(title = "合同管理-确认结算", businessType =  BusinessType.UPDATE)
     @ApiOperation(value = "确认结算")
     @PostMapping(value = "/confirmSettlement")
@@ -312,21 +232,18 @@
     }
     @ApiOperation(value = "终止合同剩余未缴费账单列表")
     @PostMapping(value = "/contractBillList")
-    @PreAuthorize("@ss.hasPermi('system:contract:billList')")
     public R<PageInfo<BillVO>> contractBillList(@RequestBody TContractBillQuery query) {
         return R.ok(contractService.contractBillList(query));
     }
     @ApiOperation(value = "终止合同")
     @PostMapping(value = "/terminateContract")
-    @PreAuthorize("@ss.hasPermi('system:contract:terminate')")
+    @PreAuthorize("@ss.hasPermi('contract:list:break')")
     public R terminateContract(@RequestBody TerminateContractDTO dto) {
         contractService.terminateContract(dto);
-        // 生成房屋验收记录 待验收
         return R.ok();
     }
     @ApiOperation(value = "根据合同id查看验收记录")
     @GetMapping(value = "/getCheckByContractId")
-    @PreAuthorize("@ss.hasPermi('system:contract:checkDetail')")
     public R<CheckAcceptRecordVO> getCheckByContractId(String id) {
         return R.ok(contractService.getCheckByContractId(id));
     }
@@ -335,7 +252,7 @@
     @ApiOperation(value = "生成合同附件")
     @PostMapping("/set")
     @Log(title = "生成合同附件", businessType = BusinessType.EXPORT)
-    @PreAuthorize("@ss.hasPermi('system:contract:set')")
+    @PreAuthorize("@ss.hasPermi('contract:list:generate')")
     public R<List<String>> set(@RequestBody SetContractDto dto,HttpServletResponse response){
         List<TContract> list = contractService.lambdaQuery().in(TContract::getId, dto.getIds()).list();
         List<String> res = new ArrayList<>();
@@ -375,7 +292,7 @@
      * 导出
      */
     @ApiOperation(value = "导出")
-    @PreAuthorize("@ss.hasPermi('system:contract:export')")
+    @PreAuthorize("@ss.hasPermi('contract:list:export')")
     @Log(title = "导出", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void exportOpticalInspection(@RequestBody TContractQuery query)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDeptController.java
index 91e2ac2..fa0e4a9 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDeptController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDeptController.java
@@ -51,7 +51,7 @@
     /**
      * 获取部门管理管理列表
      */
-    @PreAuthorize("@ss.hasPermi('system:dept:list')")
+    @PreAuthorize("@ss.hasPermi('system:department:list')")
     @ApiOperation(value = "获取部门管理分页列表")
     @PostMapping(value = "/pageList")
     public R<PageInfo<DeptVO>> pageList(@RequestBody TDeptQuery query) {
@@ -59,9 +59,19 @@
     }
 
     /**
+     * 获取部门管理管理列表
+     */
+    @ApiOperation(value = "获取部门管理列表")
+    @PostMapping(value = "/list")
+    public R<List<TDept>> list() {
+        return R.ok(deptService.list(Wrappers.lambdaQuery(TDept.class)
+                .eq(TDept::getStatus, 1)));
+    }
+
+    /**
      * 添加部门管理管理
      */
-    @PreAuthorize("@ss.hasPermi('system:dept:add')")
+    @PreAuthorize("@ss.hasPermi('system:department:add')")
     @Log(title = "部门管理信息-新增部门管理", businessType = BusinessType.INSERT)
     @ApiOperation(value = "添加部门管理")
     @PostMapping(value = "/add")
@@ -77,7 +87,7 @@
     /**
      * 修改部门管理
      */
-    @PreAuthorize("@ss.hasPermi('system:dept:update')")
+    @PreAuthorize("@ss.hasPermi('system:department:edit')")
     @Log(title = "部门管理信息-修改部门管理", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "修改部门管理")
     @PostMapping(value = "/update")
@@ -93,7 +103,7 @@
     /**
      * 查看部门管理详情
      */
-    @PreAuthorize("@ss.hasPermi('system:dept:detail')")
+    @PreAuthorize("@ss.hasPermi('system:department:edit')")
     @ApiOperation(value = "查看部门管理详情")
     @GetMapping(value = "/getDetailById")
     public R<TDept> getDetailById(@RequestParam String id) {
@@ -103,7 +113,7 @@
     /**
      * 删除部门管理
      */
-    @PreAuthorize("@ss.hasPermi('system:dept:delete')")
+    @PreAuthorize("@ss.hasPermi('system:department:delete')")
     @Log(title = "部门管理信息-删除部门管理", businessType = BusinessType.DELETE)
     @ApiOperation(value = "删除部门管理")
     @DeleteMapping(value = "/deleteById")
@@ -117,7 +127,7 @@
     /**
      * 批量删除部门管理
      */
-    @PreAuthorize("@ss.hasPermi('system:dept:delete')")
+    @PreAuthorize("@ss.hasPermi('system:department:delete')")
     @Log(title = "部门管理信息-删除部门管理", businessType = BusinessType.DELETE)
     @ApiOperation(value = "批量删除部门管理")
     @DeleteMapping(value = "/deleteByIds")
@@ -131,7 +141,7 @@
     /**
      * 轮播图上下架
      */
-    @PreAuthorize("@ss.hasPermi('system:dept:upAndDown')")
+    @PreAuthorize("@ss.hasPermi('system:department:open')")
     @ApiOperation(value = "部门管理上下架",notes = "true:上架,false:下架")
     @PostMapping(value = "/upAndDown")
     public R upAndDown(@RequestBody TDeptUpAndDownDTO dto) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultAreaDicController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultAreaDicController.java
index 928ee34..5225de3 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultAreaDicController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultAreaDicController.java
@@ -76,7 +76,7 @@
     /**
      * 修改故障区域
      */
-    @PreAuthorize("@ss.hasPermi('system:faultArea:update')")
+    @PreAuthorize("@ss.hasPermi('system:faultArea:edit')")
     @Log(title = "故障区域信息-修改故障区域", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "修改故障区域")
     @PostMapping(value = "/update")
@@ -90,7 +90,7 @@
     /**
      * 查看故障区域详情
      */
-    @PreAuthorize("@ss.hasPermi('system:faultArea:detail')")
+    @PreAuthorize("@ss.hasPermi('system:faultArea:edit')")
     @ApiOperation(value = "查看故障区域详情")
     @GetMapping(value = "/getDetailById")
     public R<TFaultAreaDic> getDetailById(@RequestParam String id) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultDescribeDicController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultDescribeDicController.java
index a01e2fd..ddd4270 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultDescribeDicController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultDescribeDicController.java
@@ -41,7 +41,7 @@
     /**
      * 获取故障描述管理列表
      */
-    @PreAuthorize("@ss.hasPermi('system:faultDescribe:list')")
+    @PreAuthorize("@ss.hasPermi('system:tag:list')")
     @ApiOperation(value = "获取故障描述分页列表")
     @PostMapping(value = "/pageList")
     public R<PageInfo<TFaultDescribeDicVO>> pageList(@RequestBody TFaultDescribeDicQuery query) {
@@ -51,7 +51,7 @@
     /**
      * 添加故障描述管理
      */
-    @PreAuthorize("@ss.hasPermi('system:faultDescribe:add')")
+    @PreAuthorize("@ss.hasPermi('system:tag:add')")
     @Log(title = "故障描述信息-新增故障描述", businessType = BusinessType.INSERT)
     @ApiOperation(value = "添加故障描述")
     @PostMapping(value = "/add")
@@ -62,7 +62,7 @@
     /**
      * 修改故障描述
      */
-    @PreAuthorize("@ss.hasPermi('system:faultDescribe:update')")
+    @PreAuthorize("@ss.hasPermi('system:tag:edit')")
     @Log(title = "故障描述信息-修改故障描述", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "修改故障描述")
     @PostMapping(value = "/update")
@@ -73,7 +73,7 @@
     /**
      * 查看故障描述详情
      */
-    @PreAuthorize("@ss.hasPermi('system:faultDescribe:detail')")
+    @PreAuthorize("@ss.hasPermi('system:tag:edit')")
     @ApiOperation(value = "查看故障描述详情")
     @GetMapping(value = "/getDetailById")
     public R<TFaultDescribeDic> getDetailById(@RequestParam String id) {
@@ -83,7 +83,7 @@
     /**
      * 删除故障描述
      */
-    @PreAuthorize("@ss.hasPermi('system:faultDescribe:delete')")
+    @PreAuthorize("@ss.hasPermi('system:tag:delete')")
     @Log(title = "故障描述信息-删除故障描述", businessType = BusinessType.DELETE)
     @ApiOperation(value = "删除故障描述")
     @DeleteMapping(value = "/deleteById")
@@ -94,7 +94,7 @@
     /**
      * 批量删除故障描述
      */
-    @PreAuthorize("@ss.hasPermi('system:faultDescribe:delete')")
+    @PreAuthorize("@ss.hasPermi('system:tag:delete')")
     @Log(title = "故障描述信息-删除故障描述", businessType = BusinessType.DELETE)
     @ApiOperation(value = "批量删除故障描述")
     @DeleteMapping(value = "/deleteByIds")
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultRepairMessageController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultRepairMessageController.java
index b5148ff..6365ad9 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultRepairMessageController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFaultRepairMessageController.java
@@ -41,7 +41,7 @@
     /**
      * 获取报修管理列表
      */
-    @PreAuthorize("@ss.hasPermi('system:fault:list')")
+    @PreAuthorize("@ss.hasPermi('houseManage:acceptance:list')")
     @ApiOperation(value = "获取报修分页列表")
     @PostMapping(value = "/pageList")
     public R<PageInfo<TFaultRepairMessageVO>> pageList(@RequestBody TFaultRepairMessageQuery query) {
@@ -51,7 +51,7 @@
     /**
      * 处理维修
      */
-    @PreAuthorize("@ss.hasPermi('system:fault:update')")
+    @PreAuthorize("@ss.hasPermi('houseManage:acceptance:dispose')")
     @Log(title = "报修信息-处理维修", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "处理维修")
     @PostMapping(value = "/update")
@@ -63,7 +63,7 @@
     /**
      * 查看报修详情
      */
-    @PreAuthorize("@ss.hasPermi('system:fault:detail')")
+    @PreAuthorize("@ss.hasPermi('houseManage:acceptance:detail')")
     @ApiOperation(value = "查看报修详情")
     @GetMapping(value = "/getDetailById")
     public R<TFaultRepairMessageVO> getDetailById(@RequestParam String id) {
@@ -74,7 +74,7 @@
     /**
      * 删除报修
      */
-    @PreAuthorize("@ss.hasPermi('system:fault:delete')")
+    @PreAuthorize("@ss.hasPermi('houseManage:acceptance:delete')")
     @Log(title = "报修信息-删除报修", businessType = BusinessType.DELETE)
     @ApiOperation(value = "删除报修")
     @DeleteMapping(value = "/deleteById")
@@ -85,7 +85,7 @@
     /**
      * 批量删除报修
      */
-    @PreAuthorize("@ss.hasPermi('system:fault:delete')")
+    @PreAuthorize("@ss.hasPermi('houseManage:acceptance:delete')")
     @Log(title = "报修信息-删除报修", businessType = BusinessType.DELETE)
     @ApiOperation(value = "批量删除报修")
     @DeleteMapping(value = "/deleteByIds")
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFlowManagementController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFlowManagementController.java
index d32a1a8..1da2389 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFlowManagementController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TFlowManagementController.java
@@ -32,7 +32,7 @@
     /**
      * 获取流水列表
      */
-    @PreAuthorize("@ss.hasPermi('system:flow:list')")
+    @PreAuthorize("@ss.hasPermi('flow:sys:detail:list')")
     @ApiOperation(value = "获取流水列表")
     @PostMapping("/list")
     public R<PageInfo<TFlowManagement>> list(@RequestBody TFlowManagementQuery query) {
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 894920c..f126710 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
@@ -46,45 +46,42 @@
     @Log(title = "房屋基础信息管理-新增房屋", businessType = BusinessType.INSERT)
     @ApiOperation(value = "新增房屋")
     @PostMapping(value = "/addHouse")
-    @PreAuthorize("@ss.hasPermi('system:house:add')")
+    @PreAuthorize("@ss.hasPermi('house:list:add')")
     public R<Boolean> addHouse(@Validated @RequestBody THouseDTO dto) {
         return R.ok(tHouseService.save(dto));
     }
     @Log(title = "房屋基础信息管理-编辑房屋", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "编辑房屋")
     @PostMapping(value = "/updateHouse")
-    @PreAuthorize("@ss.hasPermi('system:house:edit')")
+    @PreAuthorize("@ss.hasPermi('house:list:edit')")
     public R<Boolean> updateHouse(@Validated @RequestBody THouseDTO dto) {
         return R.ok(tHouseService.updateById(dto));
     }
-    @Log(title = "房屋基础信息管理-查询房屋信息", businessType = BusinessType.DELETE)
     @ApiOperation(value = "查询房屋信息")
     @GetMapping(value = "/getHouseById")
-    @PreAuthorize("@ss.hasPermi('system:house:detail')")
+    @PreAuthorize("@ss.hasPermi('house:list:detail')")
     public R<THouse> getHouseById(@RequestParam String id) {
         THouse tHouse = tHouseService.getById(id);
-        tHouse.setLeaseStatus(DictUtils.getDictLabel(DictConstants.DICT_TYPE_LEASE_STATUS,tHouse.getLeaseStatus()));
-        tHouse.setBusinessAttributes(DictUtils.getDictLabel(DictConstants.DICT_TYPE_BUSINESS_ATTRIBUTES,tHouse.getBusinessAttributes()));
+//        tHouse.setLeaseStatus(DictUtils.getDictLabel(DictConstants.DICT_TYPE_LEASE_STATUS,tHouse.getLeaseStatus()));
+//        tHouse.setBusinessAttributes(DictUtils.getDictLabel(DictConstants.DICT_TYPE_BUSINESS_ATTRIBUTES,tHouse.getBusinessAttributes()));
         return R.ok(tHouse);
     }
     @Log(title = "房屋基础信息管理-删除房屋", businessType = BusinessType.DELETE)
     @ApiOperation(value = "删除房屋")
     @DeleteMapping(value = "/deleteHouseById")
-    @PreAuthorize("@ss.hasPermi('system:house:delete')")
+    @PreAuthorize("@ss.hasPermi('house:list:delete')")
 
     public R<Boolean> deleteHouseById(@RequestParam String id) {
         return R.ok(tHouseService.removeById(id));
     }
     @ApiOperation(value = "获取房屋分页列表")
     @PostMapping(value = "/houseList")
-    @PreAuthorize("@ss.hasPermi('system:house:list')")
-
+    @PreAuthorize("@ss.hasPermi('house:list')")
     public R<PageInfo<THouse>> houseList(@RequestBody THouseQuery query) {
         return R.ok(tHouseService.houseList(query));
     }
     @ApiOperation(value = "历史租户列表")
     @PostMapping(value = "/userHistoryList")
-    @PreAuthorize("@ss.hasPermi('system:house:historyList')")
     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/TInformationController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TInformationController.java
index 6152134..8ddb6b1 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TInformationController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TInformationController.java
@@ -39,7 +39,7 @@
     /**
      * 获取资讯管理管理列表
      */
-    @PreAuthorize("@ss.hasPermi('system:information:list')")
+    @PreAuthorize("@ss.hasPermi('dynamic:list')")
     @ApiOperation(value = "获取资讯管理分页列表")
     @PostMapping(value = "/pageList")
     public R<PageInfo<TInformation>> pageList(@RequestBody TInformationQuery query) {
@@ -49,7 +49,7 @@
     /**
      * 添加资讯管理管理
      */
-    @PreAuthorize("@ss.hasPermi('system:information:add')")
+    @PreAuthorize("@ss.hasPermi('dynamic:list:add')")
     @Log(title = "资讯管理信息-新增资讯管理", businessType = BusinessType.INSERT)
     @ApiOperation(value = "添加资讯管理")
     @PostMapping(value = "/add")
@@ -60,7 +60,7 @@
     /**
      * 修改资讯管理
      */
-    @PreAuthorize("@ss.hasPermi('system:information:update')")
+    @PreAuthorize("@ss.hasPermi('dynamic:list:edit')")
     @Log(title = "资讯管理信息-修改资讯管理", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "修改资讯管理")
     @PostMapping(value = "/update")
@@ -71,7 +71,7 @@
     /**
      * 查看资讯管理详情
      */
-    @PreAuthorize("@ss.hasPermi('system:information:detail')")
+    @PreAuthorize("@ss.hasPermi('dynamic:list:detail')")
     @ApiOperation(value = "查看资讯管理详情")
     @GetMapping(value = "/getDetailById")
     public R<TInformation> getDetailById(@RequestParam String id) {
@@ -81,7 +81,7 @@
     /**
      * 删除资讯管理
      */
-    @PreAuthorize("@ss.hasPermi('system:information:delete')")
+    @PreAuthorize("@ss.hasPermi('dynamic:list:delete')")
     @Log(title = "资讯管理信息-删除资讯管理", businessType = BusinessType.DELETE)
     @ApiOperation(value = "删除资讯管理")
     @DeleteMapping(value = "/deleteById")
@@ -92,7 +92,7 @@
     /**
      * 批量删除资讯管理
      */
-    @PreAuthorize("@ss.hasPermi('system:information:delete')")
+    @PreAuthorize("@ss.hasPermi('dynamic:list:delete')")
     @Log(title = "资讯管理信息-删除资讯管理", businessType = BusinessType.DELETE)
     @ApiOperation(value = "批量删除资讯管理")
     @DeleteMapping(value = "/deleteByIds")
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TInvoiceController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TInvoiceController.java
index fd9b109..f074175 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TInvoiceController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TInvoiceController.java
@@ -32,14 +32,14 @@
     private TInvoiceService invoiceService;
     @Autowired
     TBillService tBillService;
-    @PreAuthorize("@ss.hasPermi('system:invoice:list')")
+    @PreAuthorize("@ss.hasPermi('invoice:list')")
     @ApiOperation(value = "获取开票列表")
     @PostMapping("/list")
     public R<PageInfo<TInvoice>> list(@RequestBody TInvoiceQuery query) {
         return R.ok(invoiceService.pageList(query));
     }
 
-    @PreAuthorize("@ss.hasPermi('system:invoice:delete')")
+    @PreAuthorize("@ss.hasPermi('invoice:list:del')")
     @Log(title = "开票信息-删除开票", businessType = BusinessType.DELETE)
     @ApiOperation(value = "删除开票")
     @DeleteMapping(value = "/deleteById")
@@ -55,6 +55,7 @@
 
     @ApiOperation(value = "上传开票凭证")
     @PostMapping("/uploadVoucher")
+    @PreAuthorize("@ss.hasPermi('invoice:list:payment')")
     public R<Boolean> uploadVoucher(@RequestBody TInvoiceQuery query) {
         TInvoice tInvoice = new TInvoice();
         tInvoice.setId(query.getId());
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TItemController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TItemController.java
index b9cfe64..e201e93 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TItemController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TItemController.java
@@ -40,7 +40,7 @@
     /**
      * 获取维修物品管理列表
      */
-    @PreAuthorize("@ss.hasPermi('system:item:list')")
+    @PreAuthorize("@ss.hasPermi('houseManage:list:list')")
     @ApiOperation(value = "获取维修物品分页列表")
     @PostMapping(value = "/pageList")
     public R<PageInfo<TItemVO>> pageList(@RequestBody TItemQuery query) {
@@ -50,7 +50,7 @@
     /**
      * 添加维修物品管理
      */
-    @PreAuthorize("@ss.hasPermi('system:item:add')")
+    @PreAuthorize("@ss.hasPermi('houseManage:list:add')")
     @Log(title = "维修物品信息-新增维修物品", businessType = BusinessType.INSERT)
     @ApiOperation(value = "添加维修物品")
     @PostMapping(value = "/add")
@@ -61,7 +61,7 @@
     /**
      * 修改维修物品
      */
-    @PreAuthorize("@ss.hasPermi('system:item:update')")
+    @PreAuthorize("@ss.hasPermi('houseManage:list:edit')")
     @Log(title = "维修物品信息-修改维修物品", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "修改维修物品")
     @PostMapping(value = "/update")
@@ -82,7 +82,7 @@
     /**
      * 删除维修物品
      */
-    @PreAuthorize("@ss.hasPermi('system:item:delete')")
+    @PreAuthorize("@ss.hasPermi('houseManage:list:delete')")
     @Log(title = "维修物品信息-删除维修物品", businessType = BusinessType.DELETE)
     @ApiOperation(value = "删除维修物品")
     @DeleteMapping(value = "/deleteById")
@@ -93,7 +93,7 @@
     /**
      * 批量删除维修物品
      */
-    @PreAuthorize("@ss.hasPermi('system:item:delete')")
+    @PreAuthorize("@ss.hasPermi('houseManage:list:delete')")
     @Log(title = "维修物品信息-删除维修物品", businessType = BusinessType.DELETE)
     @ApiOperation(value = "批量删除维修物品")
     @DeleteMapping(value = "/deleteByIds")
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TItemTypeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TItemTypeController.java
index 648c2e8..96e1b44 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TItemTypeController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TItemTypeController.java
@@ -44,7 +44,7 @@
     /**
      * 获取维修物品分类管理列表
      */
-    @PreAuthorize("@ss.hasPermi('system:itemType:list')")
+    @PreAuthorize("@ss.hasPermi('houseManage:class_list')")
     @ApiOperation(value = "获取维修物品分类分页列表")
     @PostMapping(value = "/pageList")
     public R<PageInfo<TItemType>> pageList(@RequestBody TItemTypeQuery query) {
@@ -63,7 +63,7 @@
     /**
      * 添加维修物品分类管理
      */
-    @PreAuthorize("@ss.hasPermi('system:itemType:add')")
+    @PreAuthorize("@ss.hasPermi('houseManage:class:add')")
     @Log(title = "维修物品分类信息-新增维修物品分类", businessType = BusinessType.INSERT)
     @ApiOperation(value = "添加维修物品分类")
     @PostMapping(value = "/add")
@@ -77,7 +77,7 @@
     /**
      * 修改维修物品分类
      */
-    @PreAuthorize("@ss.hasPermi('system:itemType:update')")
+    @PreAuthorize("@ss.hasPermi('houseManage:class:edit')")
     @Log(title = "维修物品分类信息-修改维修物品分类", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "修改维修物品分类")
     @PostMapping(value = "/update")
@@ -91,7 +91,7 @@
     /**
      * 查看维修物品分类详情
      */
-    @PreAuthorize("@ss.hasPermi('system:itemType:detail')")
+    @PreAuthorize("@ss.hasPermi('houseManage:class:edit')")
     @ApiOperation(value = "查看维修物品分类详情")
     @GetMapping(value = "/getDetailById")
     public R<TItemType> getDetailById(@RequestParam String id) {
@@ -101,7 +101,7 @@
     /**
      * 删除维修物品分类
      */
-    @PreAuthorize("@ss.hasPermi('system:itemType:delete')")
+    @PreAuthorize("@ss.hasPermi('houseManage:class:delete')")
     @Log(title = "维修物品分类信息-删除维修物品分类", businessType = BusinessType.DELETE)
     @ApiOperation(value = "删除维修物品分类")
     @DeleteMapping(value = "/deleteById")
@@ -116,7 +116,7 @@
     /**
      * 批量删除维修物品分类
      */
-    @PreAuthorize("@ss.hasPermi('system:itemType:delete')")
+    @PreAuthorize("@ss.hasPermi('houseManage:class:delete')")
     @Log(title = "维修物品分类信息-删除维修物品分类", businessType = BusinessType.DELETE)
     @ApiOperation(value = "批量删除维修物品分类")
     @DeleteMapping(value = "/deleteByIds")
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysConfigController.java
index 260c7c2..ab8324b 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysConfigController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysConfigController.java
@@ -44,7 +44,7 @@
     /**
      * 系统公共参数设置详情
      */
-    @PreAuthorize("@ss.hasPermi('system:config:detail')")
+    @PreAuthorize("@ss.hasPermi('system:commonParameter')")
     @ApiOperation(value = "查看系统公共参数设置详情")
     @GetMapping(value = "/getDetailById")
     public R<TSysConfig> getDetailById() {
@@ -54,7 +54,7 @@
     /**
      * 修改系统公共参数设置
      */
-    @PreAuthorize("@ss.hasPermi('system:config:update')")
+    @PreAuthorize("@ss.hasPermi('system:commonParameter:save')")
     @Log(title = "租户信息-修改系统公共参数设置", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "修改系统公共参数设置")
     @PostMapping(value = "/update")
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 ad65a32..c1d5f10 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
@@ -58,7 +58,7 @@
     /**
      * 获取租户管理列表
      */
-    @PreAuthorize("@ss.hasPermi('system:tenant:list')")
+    @PreAuthorize("@ss.hasPermi('tenant:list')")
     @ApiOperation(value = "获取租户分页列表")
     @PostMapping(value = "/pageList")
     public R<PageInfo<TenantVO>> pageList(@RequestBody TTenantQuery query) {
@@ -68,11 +68,14 @@
     /**
      * 添加租户管理
      */
-    @PreAuthorize("@ss.hasPermi('system:tenant:add')")
+    @PreAuthorize("@ss.hasPermi('tenant:list:add')")
     @Log(title = "租户信息-新增租户", businessType = BusinessType.INSERT)
     @ApiOperation(value = "添加租户")
     @PostMapping(value = "/add")
     public R<Boolean> add(@Validated @RequestBody TTenantDTO dto) {
+        if(tenantService.isExit(dto)){
+            return R.fail("该账号已存在");
+        }
         // 密码加密
         dto.setPassword(SecurityUtils.encryptPassword(dto.getPassword()));
         return R.ok(tenantService.save(dto));
@@ -81,11 +84,14 @@
     /**
      * 修改租户
      */
-    @PreAuthorize("@ss.hasPermi('system:tenant:update')")
+    @PreAuthorize("@ss.hasPermi('tenant:list:edit')")
     @Log(title = "租户信息-修改租户", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "修改租户")
     @PostMapping(value = "/update")
     public R<Boolean> update(@Validated @RequestBody TTenantDTO dto) {
+        if(tenantService.isExit(dto)){
+            return R.fail("该账号已存在");
+        }
         // 密码加密
         if(StringUtils.isNotBlank(dto.getPassword())){
             dto.setPassword(SecurityUtils.encryptPassword(dto.getPassword()));
@@ -96,17 +102,16 @@
     /**
      * 查看租户详情
      */
-    @PreAuthorize("@ss.hasPermi('system:tenant:detail')")
+    @PreAuthorize("@ss.hasPermi('tenant:list:detail')")
     @ApiOperation(value = "查看租户详情")
     @GetMapping(value = "/getDetailById")
     public R<TTenant> getDetailById(@RequestParam String id) {
         TTenant tenant = tenantService.getById(id);
-        tenant.setTenantAttributes(StringUtils.isNotEmpty(tenant.getTenantAttributes())?DictUtils.getDictLabel(DictConstants.DICT_TYPE_TENANT_ATTRIBUTE,tenant.getTenantAttributes()):"");
-        tenant.setTenantType(StringUtils.isNotEmpty(tenant.getTenantType())?DictUtils.getDictLabel(DictConstants.DICT_TYPE_TENANT_TYPE,tenant.getTenantType()):"");
+//        tenant.setTenantAttributes(StringUtils.isNotEmpty(tenant.getTenantAttributes())?DictUtils.getDictLabel(DictConstants.DICT_TYPE_TENANT_ATTRIBUTE,tenant.getTenantAttributes()):"");
+//        tenant.setTenantType(StringUtils.isNotEmpty(tenant.getTenantType())?DictUtils.getDictLabel(DictConstants.DICT_TYPE_TENANT_TYPE,tenant.getTenantType()):"");
         return R.ok(tenant);
     }
 
-    @PreAuthorize("@ss.hasPermi('system:contract:list')")
     @ApiOperation(value = "获取合同分页列表")
     @GetMapping(value = "/contractListByTenantId")
     public R<List<TContract>> contractListByTenantId(@RequestParam String tenantId) {
@@ -116,7 +121,7 @@
     /**
      * 删除租户
      */
-    @PreAuthorize("@ss.hasPermi('system:tenant:delete')")
+    @PreAuthorize("@ss.hasPermi('tenant:list:edit')")
     @Log(title = "租户信息-删除租户", businessType = BusinessType.DELETE)
     @ApiOperation(value = "删除租户")
     @DeleteMapping(value = "/deleteById")
@@ -127,7 +132,7 @@
     /**
      * 批量删除租户
      */
-    @PreAuthorize("@ss.hasPermi('system:tenant:delete')")
+    @PreAuthorize("@ss.hasPermi('tenant:list:edit')")
     @Log(title = "租户信息-删除租户", businessType = BusinessType.DELETE)
     @ApiOperation(value = "批量删除租户")
     @DeleteMapping(value = "/deleteByIds")
@@ -139,7 +144,6 @@
      * 导出
      */
     @ApiOperation(value = "导出")
-    @PreAuthorize("@ss.hasPermi('system:contract:export')")
     @Log(title = "导出", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void exportOpticalInspection(@Validated @RequestBody TContractQuery query)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisConfiguration.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisConfiguration.java
index 5390dc1..b2cbb16 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisConfiguration.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisConfiguration.java
@@ -1,17 +1,17 @@
-package com.ruoyi.web.controller.interceptor;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class MybatisConfiguration {
- 
-    /**
-     * 注册拦截器
-     */
-    @Bean
-    public MybatisInterceptor getMybatisInterceptor() {
-        return new MybatisInterceptor();
-    }
-    
-}
\ No newline at end of file
+//package com.ruoyi.web.controller.interceptor;
+//
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//
+//@Configuration
+//public class MybatisConfiguration {
+//
+//    /**
+//     * 注册拦截器
+//     */
+//    @Bean
+//    public MybatisInterceptor getMybatisInterceptor() {
+//        return new MybatisInterceptor();
+//    }
+//
+//}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java
index 8c232f4..fcbd5dc 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/interceptor/MybatisInterceptor.java
@@ -1,119 +1,119 @@
-package com.ruoyi.web.controller.interceptor;
-
-import com.ruoyi.framework.web.service.TokenService;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.executor.Executor;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.SqlCommandType;
-import org.apache.ibatis.plugin.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.lang.reflect.Field;
-import java.time.LocalDateTime;
-import java.util.*;
-
-@Slf4j
-@Component
-@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) })
-public class MybatisInterceptor implements Interceptor {
-
-    @Autowired
-    private TokenService tokenService;
-
-    @Override
-    public Object intercept(Invocation invocation) throws Throwable {
-        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
-        if("com.ruoyi.system.mapper.SysLogininforMapper.insertLogininfor".equals(mappedStatement.getId())){
-            return invocation.proceed();
-        }
-        // sql类型:insert、update、select、delete
-        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
-        Object parameter = invocation.getArgs()[1];
-
-        if (parameter == null) {
-            return invocation.proceed();
-        }
- 
-        // 当sql为新增或更新类型时,自动填充操作人相关信息
-        if (SqlCommandType.INSERT == sqlCommandType) {
-
-            Field[] fields = getAllFields(parameter);
-            for (Field field : fields) {
-                try {
-                    // 注入创建人
-                    if ("createBy".equals(field.getName())) {
-                        // 获取当前登录用户信息
-                        if(Objects.nonNull(tokenService.getLoginUser())){
-                            String userName = tokenService.getLoginUser().getUser().getUserName();
-                            field.setAccessible(true);
-                            field.set(parameter, userName);
-                            field.setAccessible(false);
-                        }
-                    }
-                    //注入创建时间
-                    if ("createTime".equals(field.getName())) {
-                        field.setAccessible(true);
-//                        field.set(parameter, LocalDateTime.now());
-                        field.setAccessible(false);
-                    } 
-                } catch (Exception e) {
-                    log.error("failed to insert data, exception = ", e);
-                }
-            }
-        }
-        if (SqlCommandType.UPDATE == sqlCommandType) {
-            Field[] fields = getAllFields(parameter);
-            for (Field field : fields) {
-                try {
-                    if ("updateBy".equals(field.getName())) {
-                        // 获取当前登录用户信息
-                        if(Objects.nonNull(tokenService.getLoginUser())){
-                            String userName = tokenService.getLoginUser().getUser().getUserName();
-                            field.setAccessible(true);
-                            field.set(parameter, userName);
-                            field.setAccessible(false);
-                        }
-                    }
-                    if ("updateTime".equals(field.getName())) {
-                        field.setAccessible(true);
-//                        field.set(parameter, new Date());
-                        field.setAccessible(false);
-                    }
-                } catch (Exception e) {
-                    log.error("failed to update data, exception = ", e);
-                }
-            }
-        }
-        return invocation.proceed();
-    }
- 
-    @Override
-    public Object plugin(Object target) {
-        return Plugin.wrap(target, this);
-    }
- 
-    @Override
-    public void setProperties(Properties properties) {
-        // TODO Auto-generated method stub
-    }
- 
-    /**
-     * 获取类的所有属性,包括父类
-     *
-     * @param object
-     * @return
-     */
-    private Field[] getAllFields(Object object) {
-        Class<?> clazz = object.getClass();
-        List<Field> fieldList = new ArrayList<>();
-        while (clazz != null) {
-            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
-            clazz = clazz.getSuperclass();
-        }
-        Field[] fields = new Field[fieldList.size()];
-        fieldList.toArray(fields);
-        return fields;
-    }
- 
-}
\ No newline at end of file
+//package com.ruoyi.web.controller.interceptor;
+//
+//import com.ruoyi.framework.web.service.TokenService;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.ibatis.executor.Executor;
+//import org.apache.ibatis.mapping.MappedStatement;
+//import org.apache.ibatis.mapping.SqlCommandType;
+//import org.apache.ibatis.plugin.*;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Component;
+//
+//import java.lang.reflect.Field;
+//import java.time.LocalDateTime;
+//import java.util.*;
+//
+//@Slf4j
+//@Component
+//@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) })
+//public class MybatisInterceptor implements Interceptor {
+//
+//    @Autowired
+//    private TokenService tokenService;
+//
+//    @Override
+//    public Object intercept(Invocation invocation) throws Throwable {
+//        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
+//        if("com.ruoyi.system.mapper.SysLogininforMapper.insertLogininfor".equals(mappedStatement.getId())){
+//            return invocation.proceed();
+//        }
+//        // sql类型:insert、update、select、delete
+//        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
+//        Object parameter = invocation.getArgs()[1];
+//
+//        if (parameter == null) {
+//            return invocation.proceed();
+//        }
+//
+//        // 当sql为新增或更新类型时,自动填充操作人相关信息
+//        if (SqlCommandType.INSERT == sqlCommandType) {
+//
+//            Field[] fields = getAllFields(parameter);
+//            for (Field field : fields) {
+//                try {
+//                    // 注入创建人
+//                    if ("createBy".equals(field.getName())) {
+//                        // 获取当前登录用户信息
+//                        if(Objects.nonNull(tokenService.getLoginUser())){
+//                            String userName = tokenService.getLoginUser().getUser().getUserName();
+//                            field.setAccessible(true);
+//                            field.set(parameter, userName);
+//                            field.setAccessible(false);
+//                        }
+//                    }
+//                    //注入创建时间
+//                    if ("createTime".equals(field.getName())) {
+//                        field.setAccessible(true);
+////                        field.set(parameter, LocalDateTime.now());
+//                        field.setAccessible(false);
+//                    }
+//                } catch (Exception e) {
+//                    log.error("failed to insert data, exception = ", e);
+//                }
+//            }
+//        }
+//        if (SqlCommandType.UPDATE == sqlCommandType) {
+//            Field[] fields = getAllFields(parameter);
+//            for (Field field : fields) {
+//                try {
+//                    if ("updateBy".equals(field.getName())) {
+//                        // 获取当前登录用户信息
+//                        if(Objects.nonNull(tokenService.getLoginUser())){
+//                            String userName = tokenService.getLoginUser().getUser().getUserName();
+//                            field.setAccessible(true);
+//                            field.set(parameter, userName);
+//                            field.setAccessible(false);
+//                        }
+//                    }
+//                    if ("updateTime".equals(field.getName())) {
+//                        field.setAccessible(true);
+////                        field.set(parameter, new Date());
+//                        field.setAccessible(false);
+//                    }
+//                } catch (Exception e) {
+//                    log.error("failed to update data, exception = ", e);
+//                }
+//            }
+//        }
+//        return invocation.proceed();
+//    }
+//
+//    @Override
+//    public Object plugin(Object target) {
+//        return Plugin.wrap(target, this);
+//    }
+//
+//    @Override
+//    public void setProperties(Properties properties) {
+//        // TODO Auto-generated method stub
+//    }
+//
+//    /**
+//     * 获取类的所有属性,包括父类
+//     *
+//     * @param object
+//     * @return
+//     */
+//    private Field[] getAllFields(Object object) {
+//        Class<?> clazz = object.getClass();
+//        List<Field> fieldList = new ArrayList<>();
+//        while (clazz != null) {
+//            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
+//            clazz = clazz.getSuperclass();
+//        }
+//        Field[] fields = new Field[fieldList.size()];
+//        fieldList.toArray(fields);
+//        return fields;
+//    }
+//
+//}
\ No newline at end of file
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 f2ff0c8..e4755e8 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
@@ -26,6 +26,7 @@
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -243,11 +244,15 @@
     @PutMapping("/changeStatus")
     public AjaxResult changeStatus(@RequestBody SysUserUpdateStatusDTO dto)
     {
+        SysUser loginUser = tokenService.getLoginUser().getUser();
         SysUser user = new SysUser();
         user.setUserId(dto.getUserId());
         user.setStatus(String.valueOf(dto.getStatus()));
-        user.setRemark(dto.getRemark());
+//        user.setRemark(dto.getRemark());
         user.setUpdateBy(getUsername());
+        user.setDisableRemark(dto.getRemark());
+        user.setOperatingTime(LocalDateTime.now());
+        user.setOperatingPerson(loginUser.getNickName()+"("+loginUser.getUserName()+")");
         return AjaxResult.success(userService.updateUserStatus(user));
     }
 
diff --git a/ruoyi-admin/src/main/resources/application-test.yml b/ruoyi-admin/src/main/resources/application-test.yml
index 40b121a..c876dc8 100644
--- a/ruoyi-admin/src/main/resources/application-test.yml
+++ b/ruoyi-admin/src/main/resources/application-test.yml
@@ -227,4 +227,4 @@
   appId: 1400957506
   secretid: AKIDCF5EF2c0DE1e5JK8r4EGJF4mNsMgp26x
   secretkey: lLl184rUyFOOE0d5KNGC3kmfNsCWk4GU
-  sign: 四川金达通信工程
\ No newline at end of file
+  sign: 畅云出行
\ No newline at end of file
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
index efaf81f..635ebdf 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
@@ -156,21 +156,21 @@
     @ApiOperation("待办列表")
     @PostMapping("/wait/task/page")
     public AjaxResult<PageInfo<ProcessTaskListVO>> waitTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
-        return AjaxResult.success(processTemplateService.waitTaskPage(processTemplatePageBO));
+        return AjaxResult.success(processTemplateService.waitTaskPageApplet(processTemplatePageBO));
     }
 
     //已办
     @ApiOperation("已办列表")
     @PostMapping("/deal/task/page")
     public AjaxResult<PageInfo<ProcessTaskListVO>> dealTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
-        return AjaxResult.success(processTemplateService.dealTaskPage(processTemplatePageBO));
+        return AjaxResult.success(processTemplateService.dealTaskPageApplet(processTemplatePageBO));
     }
 
-    //待办和已办列表
-    @ApiOperation("待办和已办列表")
-    @PostMapping("/dealAndWait/task/page")
-    public AjaxResult<PageInfo<ProcessTaskListVO>> dealAndWaitTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
-        return AjaxResult.success(processTemplateService.dealAndWaitTaskPage(processTemplatePageBO));
+    //我发起的
+    @ApiOperation("我发起的列表")
+    @PostMapping("/initiate/task/page")
+    public AjaxResult<PageInfo<ProcessTaskListVO>> initiateTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
+        return AjaxResult.success(processTemplateService.initiateTaskPage(processTemplatePageBO));
     }
 
     //抄送
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillController.java
index c90ea72..b6d843e 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillController.java
@@ -21,6 +21,8 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -61,6 +63,14 @@
         return R.ok(pageInfo);
     }
 
+    public static void main(String[] args) {
+        LocalDateTime localDateTime1 = LocalDateTime.now().withYear(2025).withMonth(11).withDayOfMonth(1);
+        LocalDateTime localDateTime2 = LocalDateTime.now().withYear(2025).withMonth(11).withDayOfMonth(28);
+        long allDays = ChronoUnit.DAYS.between(localDateTime1, localDateTime2);
+        System.err.println(allDays);
+
+    }
+
     @ApiOperation(value = "缴费账单查询列表")
     @PostMapping("/getBillIds")
     public R<List<String>> getBillIds(@RequestBody TBillQuery query){
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java
index 0731a2e..7390252 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java
@@ -2,13 +2,16 @@
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.constant.DictConstants;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.domain.model.LoginUserApplet;
+import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.DictUtils;
 import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.system.dto.RevokeDTO;
 import com.ruoyi.system.dto.SignContractDTO;
 import com.ruoyi.system.model.TContract;
 import com.ruoyi.system.model.TContractRentType;
@@ -23,6 +26,7 @@
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
@@ -52,6 +56,8 @@
     private TokenService tokenService;
     @Autowired
     private TTenantService tTenantService;
+    @Autowired
+    private StateProcessTemplateService stateProcessTemplateService;
     @ApiOperation(value = " 签订合同")
     @PostMapping(value = "/signContract")
     public R signContract(@RequestBody SignContractDTO dto) {
@@ -67,6 +73,18 @@
         query.setTenantId(loginUserApplet.getUserId());
         return R.ok(contractService.contractAppletList(query));
     }
+
+    @Log(title = "合同管理-撤销审批", businessType =  BusinessType.UPDATE)
+    @ApiOperation(value = "撤销审批")
+    @PostMapping(value = "/updateContractStatus")
+    public R<Boolean> updateContractStatus(@RequestBody RevokeDTO dto) {
+        TContract contract = contractService.getById(dto.getContractId());
+        contract.setStatus("1");
+        contractService.updateById(contract);
+        // 撤销审批实例
+        stateProcessTemplateService.revoke(dto.getInstanceId());
+        return R.ok();
+    }
     @ApiOperation(value = "查询合同信息信息")
     @GetMapping(value = "/getContractById")
     public R<TContractAppletVO> getContractById(@RequestParam String id) {
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/THouseController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/THouseController.java
index 5e7abda..2942d5e 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/THouseController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/THouseController.java
@@ -1,8 +1,19 @@
 package com.ruoyi.web.controller.api;
 
 
+import com.ruoyi.common.constant.DictConstants;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.utils.DictUtils;
+import com.ruoyi.system.model.THouse;
+import com.ruoyi.system.service.THouseService;
+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.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 /**
@@ -13,9 +24,20 @@
  * @author xiaochen
  * @since 2025-01-17
  */
+@Api(tags = "房屋管理")
 @RestController
 @RequestMapping("/t-house")
 public class THouseController {
+    @Autowired
+    private THouseService tHouseService;
+    @ApiOperation(value = "查询房屋信息")
+    @GetMapping(value = "/getHouseById")
+    public R<THouse> getHouseById(@RequestParam String id) {
+        THouse tHouse = tHouseService.getById(id);
+        tHouse.setLeaseStatus(DictUtils.getDictLabel(DictConstants.DICT_TYPE_LEASE_STATUS,tHouse.getLeaseStatus()));
+        tHouse.setBusinessAttributes(DictUtils.getDictLabel(DictConstants.DICT_TYPE_BUSINESS_ATTRIBUTES,tHouse.getBusinessAttributes()));
+        return R.ok(tHouse);
+    }
 
 }
 
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java
index 3f0f789..17b3fba 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java
@@ -118,8 +118,8 @@
         appletUserDecodeData.setOpenId(openid);
         // 先使用openId和当前手机号进行查询
         TTenant tenant = tTenantService.getOne(Wrappers.lambdaQuery(TTenant.class)
-                .eq(TTenant::getOpenId, appletUserDecodeData.getOpenId())
-                .eq(TTenant::getPhone, appletUserDecodeData.getPhoneNumber()));
+                .and(e->e.eq(TTenant::getOpenId, appletUserDecodeData.getOpenId()).or()
+                .eq(TTenant::getPhone, appletUserDecodeData.getPhoneNumber())));
         if (tenant==null){
 //            appUser.setTenantAttributes();
 //            appUser.setTenantType();
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
index 69470d0..ef8c5dd 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
@@ -44,7 +44,6 @@
         caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
     }
 
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
     @GetMapping()
     public AjaxResult getInfo() throws Exception
     {
@@ -68,14 +67,12 @@
         return AjaxResult.success(result);
     }
 
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
     @GetMapping("/getNames")
     public AjaxResult cache()
     {
         return AjaxResult.success(caches);
     }
 
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
     @GetMapping("/getKeys/{cacheName}")
     public AjaxResult getCacheKeys(@PathVariable String cacheName)
     {
@@ -83,7 +80,6 @@
         return AjaxResult.success(cacheKeys);
     }
 
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
     @GetMapping("/getValue/{cacheName}/{cacheKey}")
     public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey)
     {
@@ -92,7 +88,6 @@
         return AjaxResult.success(sysCache);
     }
 
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
     @DeleteMapping("/clearCacheName/{cacheName}")
     public AjaxResult clearCacheName(@PathVariable String cacheName)
     {
@@ -101,7 +96,6 @@
         return AjaxResult.success();
     }
 
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
     @DeleteMapping("/clearCacheKey/{cacheKey}")
     public AjaxResult clearCacheKey(@PathVariable String cacheKey)
     {
@@ -109,7 +103,6 @@
         return AjaxResult.success();
     }
 
-    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
     @DeleteMapping("/clearCacheAll")
     public AjaxResult clearCacheAll()
     {
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java
index cc805ad..60f09bb 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java
@@ -16,7 +16,6 @@
 @RequestMapping("/monitor/server")
 public class ServerController
 {
-    @PreAuthorize("@ss.hasPermi('monitor:server:list')")
     @GetMapping()
     public AjaxResult getInfo() throws Exception
     {
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
index 1039b43..eb748ba 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
@@ -35,7 +35,6 @@
     @Autowired
     private SysPasswordService passwordService;
 
-    @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')")
     @GetMapping("/list")
     public TableDataInfo list(SysLogininfor logininfor)
     {
@@ -45,7 +44,6 @@
     }
 
 //    @Log(title = "登录日志", businessType = BusinessType.EXPORT)
-//    @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
 //    @PostMapping("/export")
 //    public void export(HttpServletResponse response, SysLogininfor logininfor)
 //    {
@@ -54,7 +52,6 @@
 //        util.exportExcel(response, list, "登录日志");
 //    }
 
-    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
     @Log(title = "登录日志", businessType = BusinessType.DELETE)
     @DeleteMapping("/{infoIds}")
     public AjaxResult remove(@PathVariable Long[] infoIds)
@@ -62,7 +59,6 @@
         return toAjax(logininforService.deleteLogininforByIds(infoIds));
     }
 
-    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
     @Log(title = "登录日志", businessType = BusinessType.CLEAN)
     @DeleteMapping("/clean")
     public AjaxResult clean()
@@ -71,7 +67,6 @@
         return success();
     }
 
-    @PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')")
     @Log(title = "账户解锁", businessType = BusinessType.OTHER)
     @GetMapping("/unlock/{userName}")
     public AjaxResult unlock(@PathVariable("userName") String userName)
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
index a442863..c13bcfc 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
@@ -38,7 +38,6 @@
     @Autowired
     private RedisCache redisCache;
 
-    @PreAuthorize("@ss.hasPermi('monitor:online:list')")
     @GetMapping("/list")
     public TableDataInfo list(String ipaddr, String userName)
     {
@@ -72,7 +71,6 @@
     /**
      * 强退用户
      */
-    @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
     @Log(title = "在线用户", businessType = BusinessType.FORCE)
     @DeleteMapping("/{tokenId}")
     public AjaxResult forceLogout(@PathVariable String tokenId)
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
index 5737466..706ccf2 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
@@ -35,7 +35,6 @@
     private ISysConfigService configService;
 
 //    @Log(title = "参数管理", businessType = BusinessType.EXPORT)
-//    @PreAuthorize("@ss.hasPermi('system:config:export')")
 //    @PostMapping("/export")
 //    public void export(HttpServletResponse response, SysConfig config)
 //    {
@@ -47,7 +46,6 @@
     /**
      * 根据参数编号获取详细信息
      */
-    @PreAuthorize("@ss.hasPermi('system:config:query')")
     @GetMapping(value = "/{configId}")
     public AjaxResult getInfo(@PathVariable Long configId)
     {
@@ -66,7 +64,6 @@
     /**
      * 新增参数配置
      */
-    @PreAuthorize("@ss.hasPermi('system:config:add')")
     @Log(title = "参数管理", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@Validated @RequestBody SysConfig config)
@@ -82,7 +79,6 @@
     /**
      * 修改参数配置
      */
-    @PreAuthorize("@ss.hasPermi('system:config:edit')")
     @Log(title = "参数管理", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@Validated @RequestBody SysConfig config)
@@ -98,7 +94,6 @@
     /**
      * 删除参数配置
      */
-    @PreAuthorize("@ss.hasPermi('system:config:remove')")
     @Log(title = "参数管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{configIds}")
     public AjaxResult remove(@PathVariable Long[] configIds)
@@ -110,7 +105,6 @@
     /**
      * 刷新参数缓存
      */
-    @PreAuthorize("@ss.hasPermi('system:config:remove')")
     @Log(title = "参数管理", businessType = BusinessType.CLEAN)
     @DeleteMapping("/refreshCache")
     public AjaxResult refreshCache()
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
index a74355f..990d0f7 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
@@ -37,7 +37,6 @@
     /**
      * 获取部门列表
      */
-    // @PreAuthorize("@ss.hasPermi('system:dept:list')")
     @GetMapping("/list")
     public AjaxResult list(SysDept dept)
     {
@@ -48,7 +47,6 @@
     /**
      * 查询部门列表(排除节点)
      */
-    // @PreAuthorize("@ss.hasPermi('system:dept:list')")
     @GetMapping("/list/exclude/{deptId}")
     public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
     {
@@ -60,7 +58,6 @@
     /**
      * 根据部门编号获取详细信息
      */
-    // @PreAuthorize("@ss.hasPermi('system:dept:query')")
     @GetMapping(value = "/{deptId}")
     public AjaxResult getInfo(@PathVariable Long deptId)
     {
@@ -71,7 +68,6 @@
     /**
      * 新增部门
      */
-    // @PreAuthorize("@ss.hasPermi('system:dept:add')")
     @Log(title = "部门管理", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@Validated @RequestBody SysDept dept)
@@ -87,7 +83,6 @@
     /**
      * 修改部门
      */
-    // @PreAuthorize("@ss.hasPermi('system:dept:edit')")
     @Log(title = "部门管理", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@Validated @RequestBody SysDept dept)
@@ -113,7 +108,6 @@
     /**
      * 删除部门
      */
-    // @PreAuthorize("@ss.hasPermi('system:dept:remove')")
     @Log(title = "部门管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{deptId}")
     public AjaxResult remove(@PathVariable Long deptId)
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
index d8f207d..23b0c23 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
@@ -40,7 +40,6 @@
     @Autowired
     private ISysDictTypeService dictTypeService;
 
-    @PreAuthorize("@ss.hasPermi('system:dict:list')")
     @GetMapping("/list")
     public TableDataInfo list(SysDictData dictData)
     {
@@ -50,7 +49,6 @@
     }
 
 //    @Log(title = "字典数据", businessType = BusinessType.EXPORT)
-//    @PreAuthorize("@ss.hasPermi('system:dict:export')")
 //    @PostMapping("/export")
 //    public void export(HttpServletResponse response, SysDictData dictData)
 //    {
@@ -62,7 +60,6 @@
     /**
      * 查询字典数据详细
      */
-    @PreAuthorize("@ss.hasPermi('system:dict:query')")
     @GetMapping(value = "/{dictCode}")
     public AjaxResult getInfo(@PathVariable Long dictCode)
     {
@@ -86,7 +83,6 @@
     /**
      * 新增字典类型
      */
-    @PreAuthorize("@ss.hasPermi('system:dict:add')")
     @Log(title = "字典数据", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@Validated @RequestBody SysDictData dict)
@@ -98,7 +94,6 @@
     /**
      * 修改保存字典类型
      */
-    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
     @Log(title = "字典数据", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@Validated @RequestBody SysDictData dict)
@@ -110,7 +105,6 @@
     /**
      * 删除字典类型
      */
-    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
     @Log(title = "字典类型", businessType = BusinessType.DELETE)
     @DeleteMapping("/{dictCodes}")
     public AjaxResult remove(@PathVariable Long[] dictCodes)
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
index 855d191..1c5ab6b 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
@@ -34,7 +34,6 @@
     @Autowired
     private ISysDictTypeService dictTypeService;
 
-    @PreAuthorize("@ss.hasPermi('system:dict:list')")
     @GetMapping("/list")
     public TableDataInfo list(SysDictType dictType)
     {
@@ -44,7 +43,6 @@
     }
 
 //    @Log(title = "字典类型", businessType = BusinessType.EXPORT)
-//    @PreAuthorize("@ss.hasPermi('system:dict:export')")
 //    @PostMapping("/export")
 //    public void export(HttpServletResponse response, SysDictType dictType)
 //    {
@@ -56,7 +54,6 @@
     /**
      * 查询字典类型详细
      */
-    @PreAuthorize("@ss.hasPermi('system:dict:query')")
     @GetMapping(value = "/{dictId}")
     public AjaxResult getInfo(@PathVariable Long dictId)
     {
@@ -66,7 +63,6 @@
     /**
      * 新增字典类型
      */
-    @PreAuthorize("@ss.hasPermi('system:dict:add')")
     @Log(title = "字典类型", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@Validated @RequestBody SysDictType dict)
@@ -82,7 +78,6 @@
     /**
      * 修改字典类型
      */
-    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
     @Log(title = "字典类型", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@Validated @RequestBody SysDictType dict)
@@ -98,7 +93,6 @@
     /**
      * 删除字典类型
      */
-    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
     @Log(title = "字典类型", businessType = BusinessType.DELETE)
     @DeleteMapping("/{dictIds}")
     public AjaxResult remove(@PathVariable Long[] dictIds)
@@ -110,7 +104,6 @@
     /**
      * 刷新字典缓存
      */
-    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
     @Log(title = "字典类型", businessType = BusinessType.CLEAN)
     @DeleteMapping("/refreshCache")
     public AjaxResult refreshCache()
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index b239bd0..c32e796 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -130,7 +130,7 @@
             String code = String.valueOf((int) (Math.random() * 1000000));
             redisCache.setCacheObject(phone, code,5*60,TimeUnit.SECONDS);
             try {
-                smsUtil.sendSms(phone, "", new String[]{code});
+                smsUtil.sendSms(phone, "2369926", new String[]{code});
             } catch (Exception e) {
                 throw new RuntimeException(e);
             }
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
index ad9b0f4..2b5e89c 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
@@ -62,7 +62,6 @@
     /**
      * 获取菜单列表
      */
-    // @PreAuthorize("@ss.hasPermi('system:menu:list')")
     @GetMapping("/list")
     public AjaxResult list(SysMenu menu)
     {
@@ -73,7 +72,6 @@
     /**
      * 根据菜单编号获取详细信息
      */
-    // @PreAuthorize("@ss.hasPermi('system:menu:query')")
     @GetMapping(value = "/{menuId}")
     public AjaxResult getInfo(@PathVariable Long menuId)
     {
@@ -106,7 +104,6 @@
     /**
      * 新增菜单
      */
-    // @PreAuthorize("@ss.hasPermi('system:menu:add')")
     @Log(title = "菜单管理", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@Validated @RequestBody SysMenu menu)
@@ -126,7 +123,6 @@
     /**
      * 修改菜单
      */
-    // @PreAuthorize("@ss.hasPermi('system:menu:edit')")
     @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@Validated @RequestBody SysMenu menu)
@@ -150,7 +146,6 @@
     /**
      * 删除菜单
      */
-    // @PreAuthorize("@ss.hasPermi('system:menu:remove')")
     @Log(title = "菜单管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{menuId}")
     public AjaxResult remove(@PathVariable("menuId") Long menuId)
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
index 3d7352a..92a1d6b 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
@@ -35,7 +35,6 @@
     /**
      * 获取通知公告列表
      */
-    @PreAuthorize("@ss.hasPermi('system:notice:list')")
     @GetMapping("/list")
     public TableDataInfo list(SysNotice notice)
     {
@@ -47,7 +46,6 @@
     /**
      * 根据通知公告编号获取详细信息
      */
-    @PreAuthorize("@ss.hasPermi('system:notice:query')")
     @GetMapping(value = "/{noticeId}")
     public AjaxResult getInfo(@PathVariable Long noticeId)
     {
@@ -57,7 +55,6 @@
     /**
      * 新增通知公告
      */
-    @PreAuthorize("@ss.hasPermi('system:notice:add')")
     @Log(title = "通知公告", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@Validated @RequestBody SysNotice notice)
@@ -69,7 +66,6 @@
     /**
      * 修改通知公告
      */
-    @PreAuthorize("@ss.hasPermi('system:notice:edit')")
     @Log(title = "通知公告", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@Validated @RequestBody SysNotice notice)
@@ -81,7 +77,6 @@
     /**
      * 删除通知公告
      */
-    @PreAuthorize("@ss.hasPermi('system:notice:remove')")
     @Log(title = "通知公告", businessType = BusinessType.DELETE)
     @DeleteMapping("/{noticeIds}")
     public AjaxResult remove(@PathVariable Long[] noticeIds)
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysPostController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
index 4d18083..a7a3e13 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
@@ -37,7 +37,6 @@
     /**
      * 获取岗位列表
      */
-    @PreAuthorize("@ss.hasPermi('system:post:list')")
     @GetMapping("/list")
     public TableDataInfo list(SysPost post)
     {
@@ -47,7 +46,6 @@
     }
     
 //    @Log(title = "岗位管理", businessType = BusinessType.EXPORT)
-//    @PreAuthorize("@ss.hasPermi('system:post:export')")
 //    @PostMapping("/export")
 //    public void export(HttpServletResponse response, SysPost post)
 //    {
@@ -59,7 +57,6 @@
     /**
      * 根据岗位编号获取详细信息
      */
-    @PreAuthorize("@ss.hasPermi('system:post:query')")
     @GetMapping(value = "/{postId}")
     public AjaxResult getInfo(@PathVariable Long postId)
     {
@@ -69,7 +66,6 @@
     /**
      * 新增岗位
      */
-    @PreAuthorize("@ss.hasPermi('system:post:add')")
     @Log(title = "岗位管理", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@Validated @RequestBody SysPost post)
@@ -89,7 +85,6 @@
     /**
      * 修改岗位
      */
-    @PreAuthorize("@ss.hasPermi('system:post:edit')")
     @Log(title = "岗位管理", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@Validated @RequestBody SysPost post)
@@ -109,7 +104,6 @@
     /**
      * 删除岗位
      */
-    @PreAuthorize("@ss.hasPermi('system:post:remove')")
     @Log(title = "岗位管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{postIds}")
     public AjaxResult remove(@PathVariable Long[] postIds)
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
index 3aeaac9..fecb55c 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
@@ -61,7 +61,6 @@
     @Autowired
     private ISysMenuService menuService;
 
-    // @PreAuthorize("@ss.hasPermi('system:role:list')")
     @ApiOperation(value = "角色列表")
     @PostMapping("/list")
     public AjaxResult list(@RequestBody SysRoleQuery query)
@@ -94,7 +93,6 @@
     }
 
 //    @Log(title = "角色管理", businessType = BusinessType.EXPORT)
-//    // @PreAuthorize("@ss.hasPermi('system:role:export')")
 //    @PostMapping("/export")
 //    public void export(HttpServletResponse response, SysRole role)
 //    {
@@ -106,7 +104,6 @@
     /**
      * 根据角色编号获取详细信息
      */
-    // @PreAuthorize("@ss.hasPermi('system:role:query')")
     @GetMapping(value = "/{roleId}")
     public AjaxResult getInfo(@PathVariable Long roleId)
     {
@@ -150,7 +147,6 @@
     /**
      * 新增角色
      */
-    // @PreAuthorize("@ss.hasPermi('system:role:add')")
     @ApiOperation(value = "新增角色")
     @Log(title = "角色信息-新增角色", businessType = BusinessType.INSERT)
     @PostMapping("/add")
@@ -168,7 +164,6 @@
     /**
      * 修改保存角色
      */
-    // @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @ApiOperation(value = "编辑角色")
     @Log(title = "角色信息-编辑角色", businessType = BusinessType.UPDATE)
     @PutMapping
@@ -196,7 +191,6 @@
     /**
      * 修改保存数据权限
      */
-    // @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.UPDATE)
     @PutMapping("/dataScope")
     public AjaxResult dataScope(@RequestBody SysRole role)
@@ -209,7 +203,6 @@
     /**
      * 状态修改
      */
-    // @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @ApiOperation(value = "状态修改")
     @Log(title = "角色信息-角色状态修改", businessType = BusinessType.UPDATE)
     @PutMapping("/changeStatus")
@@ -223,7 +216,6 @@
     /**
      * 删除角色
      */
-    // @PreAuthorize("@ss.hasPermi('system:role:remove')")
     @ApiOperation(value = "删除角色")
     @Log(title = "角色信息-角色删除角色", businessType = BusinessType.DELETE)
     @DeleteMapping("/deleteById/{ids}")
@@ -240,7 +232,6 @@
     /**
      * 获取角色选择框列表
      */
-    // @PreAuthorize("@ss.hasPermi('system:role:query')")
     @GetMapping("/optionselect")
     public AjaxResult optionselect()
     {
@@ -250,7 +241,6 @@
     /**
      * 查询已分配用户角色列表
      */
-    // @PreAuthorize("@ss.hasPermi('system:role:list')")
     @GetMapping("/authUser/allocatedList")
     public TableDataInfo allocatedList(SysUser user)
     {
@@ -262,7 +252,6 @@
     /**
      * 查询未分配用户角色列表
      */
-    // @PreAuthorize("@ss.hasPermi('system:role:list')")
     @GetMapping("/authUser/unallocatedList")
     public TableDataInfo unallocatedList(SysUser user)
     {
@@ -274,7 +263,6 @@
     /**
      * 取消授权用户
      */
-    // @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.GRANT)
     @PutMapping("/authUser/cancel")
     public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole)
@@ -285,7 +273,6 @@
     /**
      * 批量取消授权用户
      */
-    // @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.GRANT)
     @PutMapping("/authUser/cancelAll")
     public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds)
@@ -296,7 +283,6 @@
     /**
      * 批量选择用户授权
      */
-    // @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.GRANT)
     @PutMapping("/authUser/selectAll")
     public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds)
@@ -308,7 +294,6 @@
     /**
      * 获取对应角色部门树列表
      */
-    // @PreAuthorize("@ss.hasPermi('system:role:query')")
     @GetMapping(value = "/deptTree/{roleId}")
     public AjaxResult deptTree(@PathVariable("roleId") Long roleId)
     {
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
index 310a24a..24335f4 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -232,7 +232,6 @@
 
 
 //    @Log(title = "用户管理", businessType = BusinessType.EXPORT)
-////    // @PreAuthorize("@ss.hasPermi('system:user:export')")
 //    @PostMapping("/export")
 //    public void export(HttpServletResponse response, SysUser user)
 //    {
@@ -242,7 +241,6 @@
 //    }
 
 //    @Log(title = "用户管理", businessType = BusinessType.IMPORT)
-////    // @PreAuthorize("@ss.hasPermi('system:user:import')")
 //    @PostMapping("/importData")
 //    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
 //    {
@@ -264,7 +262,6 @@
     /**
      * 新增用户
      */
-    // @PreAuthorize("@ss.hasPermi('system:user:add')")
     @ApiOperation(value = "新增用户管理")
     @Log(title = "用户信息-新增用户", businessType = BusinessType.INSERT)
     @PostMapping("/add")
@@ -288,7 +285,6 @@
     /**
      * 修改用户
      */
-    // @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @ApiOperation(value = "修改用户管理")
     @Log(title = "用户信息-修改用户", businessType = BusinessType.UPDATE)
     @PostMapping("/edit")
@@ -314,7 +310,6 @@
     /**
      * 删除用户
      */
-    // @PreAuthorize("@ss.hasPermi('system:user:remove')")
     @ApiOperation(value = "批量删除用户")
     @Log(title = "用户信息-批量删除用户", businessType = BusinessType.DELETE)
     @DeleteMapping("/deleteById/{ids}")
@@ -335,7 +330,6 @@
     /**
      * 重置密码
      */
-    // @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
     @ApiOperation(value = "重置密码")
     @Log(title = "用户信息-重置密码", businessType = BusinessType.UPDATE)
     @PostMapping("/resetPwd")
@@ -367,7 +361,6 @@
     /**
      * 根据用户编号获取授权角色
      */
-    // @PreAuthorize("@ss.hasPermi('system:user:query')")
     @GetMapping("/authRole/{userId}")
     public AjaxResult authRole(@PathVariable("userId") Long userId)
     {
@@ -382,7 +375,6 @@
     /**
      * 用户授权角色
      */
-    // @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.GRANT)
     @PutMapping("/authRole")
     public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
@@ -395,7 +387,6 @@
     /**
      * 获取部门树列表
      */
-    // @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/deptTree")
     public AjaxResult deptTree(SysDept dept)
     {
diff --git a/ruoyi-applet/src/main/resources/application-test.yml b/ruoyi-applet/src/main/resources/application-test.yml
index 14afafa..e9018b1 100644
--- a/ruoyi-applet/src/main/resources/application-test.yml
+++ b/ruoyi-applet/src/main/resources/application-test.yml
@@ -220,3 +220,9 @@
     bucketAddr: ap-chengdu
     rootSrc: https://xzgttest-1305134071.cos.ap-chengdu.myqcloud.com/
     location: xizang
+sms:
+  enable: true
+  appId: 1400957506
+  secretid: AKIDCF5EF2c0DE1e5JK8r4EGJF4mNsMgp26x
+  secretkey: lLl184rUyFOOE0d5KNGC3kmfNsCWk4GU
+  sign: 畅云出行
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
index 35fdf8f..9c5491e 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/DictConstants.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/DictConstants.java
@@ -40,7 +40,7 @@
      */
     public static final String DICT_TYPE_PAY_FEES_STATUS = "t_pay_fees_status";
     /**
-     * 账单类型 1=租金 2=押金 3=生活费用
+     * 账单类型 1=租金 2=押金 3=生活费用 4=房屋验收
      */
     public static final String DICT_TYPE_BILL_TYPE = "t_bill_type";
     /**
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
index 15bf66b..4b27433 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
@@ -1,12 +1,16 @@
 package com.ruoyi.common.core.domain;
 
 import java.io.Serializable;
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
+
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
 
 /**
  * Entity基类
@@ -38,6 +42,43 @@
     /** 备注 */
     private String remark;
 
+    @ApiModelProperty(value = "禁用备注")
+    @TableField("disable_remark")
+    private String disableRemark;
+
+    @ApiModelProperty(value = "操作时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField("operating_time")
+    private LocalDateTime operatingTime;
+
+    @ApiModelProperty(value = "操作人  登录名(登录账号)")
+    @TableField("operating_person")
+    private String operatingPerson;
+
+    public String getDisableRemark() {
+        return disableRemark;
+    }
+
+    public void setDisableRemark(String disableRemark) {
+        this.disableRemark = disableRemark;
+    }
+
+    public LocalDateTime getOperatingTime() {
+        return operatingTime;
+    }
+
+    public void setOperatingTime(LocalDateTime operatingTime) {
+        this.operatingTime = operatingTime;
+    }
+
+    public String getOperatingPerson() {
+        return operatingPerson;
+    }
+
+    public void setOperatingPerson(String operatingPerson) {
+        this.operatingPerson = operatingPerson;
+    }
+
     /** 请求参数 */
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
     private Map<String, Object> params;
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseModel.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseModel.java
index 3e5ea1d..94db5c6 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseModel.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseModel.java
@@ -60,7 +60,6 @@
      * 最后修改时间
      */
     @ApiModelProperty(value = "记录修改时间,前端忽略")
-    @JsonIgnore
     @TableField("update_time")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime updateTime;
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/TaskEventType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/TaskEventType.java
new file mode 100644
index 0000000..f96fc9c
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/TaskEventType.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2023-2025 Licensed under the Dual Licensing
+ * website: https://aizuda.com
+ */
+package com.ruoyi.common.enums;
+
+/**
+ * 流程引擎监听类型
+ *
+ * <p>
+ * <a href="https://aizuda.com">官网</a>尊重知识产权,不允许非法使用,后果自负
+ * </p>
+ *
+ * @author lizhongyuan
+ * @since 1.0
+ */
+public enum TaskEventType {
+    /**
+     * 发起
+     */
+    start,
+    /**
+     * 创建
+     */
+    create,
+    /**
+     * 再创建,仅用于流程回退
+     */
+    recreate,
+    /**
+     * 抄送
+     */
+    cc,
+    /**
+     * 分配
+     */
+    assignment,
+    /**
+     * 委派任务解决
+     */
+    delegateResolve,
+    /**
+     * 任务加签
+     */
+    addTaskActor,
+    /**
+     * 任务减签
+     */
+    removeTaskActor,
+    /**
+     * 驳回至上一步处理
+     */
+    reject,
+    /**
+     * 角色认领
+     */
+    claimRole,
+    /**
+     * 部门认领
+     */
+    claimDepartment,
+    /**
+     * 拿回未执行任务
+     */
+    reclaim,
+    /**
+     * 撤回指定任务
+     */
+    withdraw,
+    /**
+     * 唤醒历史任务
+     */
+    resume,
+    /**
+     * 完成
+     */
+    complete,
+    /**
+     * 撤销
+     */
+    revoke,
+    /**
+     * 终止
+     */
+    terminate,
+    /**
+     * 更新
+     */
+    update,
+    /**
+     * 删除
+     */
+    delete,
+    /**
+     * 调用外部流程任务【办理子流程】
+     */
+    callProcess,
+    /**
+     * 超时
+     */
+    timeout,
+    /**
+     * 跳转
+     */
+    jump,
+    /**
+     * 自动跳转
+     */
+    autoJump,
+    /**
+     * 驳回跳转
+     */
+    rejectJump,
+    /**
+     * 路由跳转
+     */
+    routeJump,
+    /**
+     * 驳回重新审批跳转
+     */
+    reApproveJump,
+    /**
+     * 自动审批完成
+     */
+    autoComplete,
+    /**
+     * 自动审批拒绝
+     */
+    autoReject,
+    /**
+     * 触发器任务
+     */
+    trigger,
+    /**
+     * 结束
+     */
+    end;
+
+    public boolean eq(TaskEventType eventType) {
+        return this == eventType;
+    }
+
+    public boolean ne(TaskEventType eventType) {
+        return this != eventType;
+    }
+}
diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml
index da794d7..b55145b 100644
--- a/ruoyi-system/pom.xml
+++ b/ruoyi-system/pom.xml
@@ -32,6 +32,10 @@
 <!--                </exclusion>-->
 <!--            </exclusions>-->
         </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-quartz</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>cn.afterturn</groupId>
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java
index 7638f4d..b52551e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java
@@ -1,5 +1,6 @@
 package com.ruoyi.system.bo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -22,5 +23,14 @@
      * 理由
      */
     private String remark;
+    /**
+     * 图片
+     */
+    private String pictures;
+    /**
+     * 审批用户id
+     */
+    @ApiModelProperty(value = "前端忽略")
+    private Long userId;
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessRefuseBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessRefuseBO.java
index 8072394..6b0c34e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessRefuseBO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessRefuseBO.java
@@ -22,6 +22,9 @@
      * 理由
      */
     private String remark;
-
+    /**
+     * 图片
+     */
+    private String pictures;
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java
index 528e3ac..750a429 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java
@@ -42,4 +42,11 @@
     @ApiModelProperty(value = "前端忽略")
     private List<String> instanceIds;
 
+    @ApiModelProperty(value = "时间筛选 1=1天 2=7天 3=30天")
+    private Integer timeType;
+
+    @ApiModelProperty(value = "排序  1=最早到达 2=最新到达")
+    private Integer sortBy=2;
+
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/RevokeDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/RevokeDTO.java
new file mode 100644
index 0000000..324f9ce
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/RevokeDTO.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "撤销DTO")
+public class RevokeDTO implements Serializable {
+
+    @ApiModelProperty(value = "审批流实例id")
+    private Long instanceId;
+
+    @ApiModelProperty(value = "合同id")
+    private String contractId;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java
index 81dcaa1..be2c3dc 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java
@@ -4,4 +4,6 @@
 import com.ruoyi.system.model.StateProcessInstanceAction;
 
 public interface StateProcessInstanceActionMapper extends BaseMapper<StateProcessInstanceAction> {
+    void saveData(StateProcessInstanceAction stateProcessInstanceAction);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java
index 843a7fc..10b64d6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java
@@ -72,5 +72,5 @@
      */
     public int deleteUserRoleInfos(@Param("roleId") Long roleId, @Param("userIds") Long[] userIds);
 
-    void insertBatchUserDept(List<TDeptToUser> deptToUserList);
+    void insertBatchUserDept(@Param("deptToUserList")List<TDeptToUser> deptToUserList);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TDeptToUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TDeptToUserMapper.java
index 37dfe49..664fa59 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TDeptToUserMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TDeptToUserMapper.java
@@ -3,6 +3,9 @@
 import com.ruoyi.system.model.TDeptToUser;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -22,4 +25,6 @@
      * @return 删除结果
      **/
     int deleteUserDeptByUserId(Long userId);
+
+    void insertBatchUserDept(@Param("deptToUserList") List<TDeptToUser> deptToUserList);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java
index b80da00..0ed879b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java
@@ -1,20 +1,22 @@
 package com.ruoyi.system.model;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.ruoyi.common.core.domain.BaseModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
 @Data
 @EqualsAndHashCode(callSuper = false)
 @ApiModel(value = "工作流-实例操作记录表")
 @TableName(value = "state_process_instance_action")
-public class StateProcessInstanceAction extends BaseModel {
+public class StateProcessInstanceAction implements Serializable {
 
     @TableId(value = "id", type = IdType.ASSIGN_ID)
     private String id;
@@ -42,5 +44,22 @@
     @ApiModelProperty(value = "备注")
     @TableField("remark")
     private String remark;
+    @ApiModelProperty(value = "图片")
+    @TableField("pictures")
+    private String pictures;
+    /**
+     * 删除  未删除
+     */
+    @TableField("`disabled`")
+    @TableLogic
+    private Boolean disabled;
+
+    @ApiModelProperty(value = "记录创建时间,前端忽略")
+    @TableField("create_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @TableField(exist = false)
+    private String nickName;
 
 }
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 8baef49..42b77b4 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
@@ -67,7 +67,7 @@
     private BigDecimal payFeesMoney;
 
     @ApiModelProperty(value = "缴费日期")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     @TableField("pay_fees_time")
     private LocalDateTime payFeesTime;
 
@@ -75,7 +75,7 @@
     @TableField("pay_fees_type")
     private Integer payFeesType;
 
-    @ApiModelProperty(value = "账单类型 1=租金 2=押金 3=生活费用")
+    @ApiModelProperty(value = "账单类型 1=租金 2=押金 3=生活费用 4=房屋验收")
     @TableField("bill_type")
     private String billType;
 
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 12c8605..c2c2834 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
@@ -16,6 +16,8 @@
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import javax.validation.constraints.NotBlank;
+
 /**
  * <p>
  * 合同管理
@@ -127,6 +129,7 @@
 
     @ApiModelProperty(value = "合同附件,多个逗号拼接")
     @TableField("contract_file")
+    @NotBlank(message = "合同附件不能为空")
     private String contractFile;
 
     @ApiModelProperty(value = "备注")
@@ -167,5 +170,8 @@
     @ApiModelProperty(value = "房屋地址")
     @TableField(exist = false)
     private String houseAddress;
+    @ApiModelProperty(value = "审批流实例id")
+    @TableField(exist = false)
+    private Long instanceId;
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java
index 3727f0a..3c7b3d4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java
@@ -12,10 +12,10 @@
 public class SysUserQuery extends BasePage {
 
     @ApiModelProperty(value = "姓名")
-    private String nickNameAndPhone;
+    private String nickNameOrPhone;
 
     @ApiModelProperty(value = "角色id")
-    private Integer roleId;
+    private List<Integer> roleIds;
 
     @ApiModelProperty(value = "部门id集合")
     private List<String> deptIds;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java
index e2141dd..c4a5b44 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java
@@ -1,12 +1,14 @@
 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;
 
 import java.util.List;
 
 @Data
+@ApiModel("租户详情-缴费账单列表查询")
 public class TBillAppletQuery extends BasePage {
     /**
      * 缴费状态 1=未缴费 2=待确认 3=已缴费 4=已逾期
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
index 3b0238e..f5a3a67 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/TContractQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TContractQuery.java
@@ -16,7 +16,7 @@
     @ApiModelProperty(value = "合同编号")
     private String contractNumber;
     @ApiModelProperty(value = "合同名称")
-    private Integer contractName;
+    private String contractName;
     @ApiModelProperty(value = "合同状态 1=待提交 2=待审批 3=未签订 4=已签订 5=已驳回 6=已终止 7=待结算 8=已结算")
     private Integer status;
     @ApiModelProperty(value = "选中的行")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/THouseQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/THouseQuery.java
index 74fe8b7..1eb82ac 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/THouseQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/THouseQuery.java
@@ -16,6 +16,6 @@
     private String propertyRightPerson;
 
     @ApiModelProperty(value = "租赁状态 1=待出租 2=已出租 3=维修中")
-    private Integer leaseStatus;
+    private String leaseStatus;
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java
index 85b5090..58bee7e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java
@@ -4,4 +4,7 @@
 import com.ruoyi.system.model.StateProcessInstanceAction;
 
 public interface StateProcessInstanceActionService extends IService<StateProcessInstanceAction> {
+
+    void saveData(StateProcessInstanceAction stateProcessInstanceAction);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java
index 450d70e..fb31683 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.service;
 
 
+import com.aizuda.bpm.engine.core.FlowCreator;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.basic.PageInfo;
@@ -25,11 +26,20 @@
      */
     Boolean start(ProcessStartBO processStartBO);
 
+    /**
+     * 启动流程
+     * @param processStartBO
+     * @return
+     */
+    Boolean startApplet(ProcessStartBO processStartBO);
+
     //待办
     PageInfo<ProcessTaskListVO> waitTaskPage(ProcessTaskListBO processTaskListBO);
+    PageInfo<ProcessTaskListVO> waitTaskPageApplet(ProcessTaskListBO processTaskListBO);
 
     //已办
     PageInfo<ProcessTaskListVO> dealTaskPage(ProcessTaskListBO processTaskListBO);
+    PageInfo<ProcessTaskListVO> dealTaskPageApplet(ProcessTaskListBO processTaskListBO);
 
     //抄送
     PageInfo<ProcessTaskListVO> copyTaskPage(ProcessTaskListBO processTaskListBO);
@@ -39,8 +49,16 @@
 
     //拒绝
     void refuse(ProcessRefuseBO processRefuseBO);
+    /**
+     * 流程实例撤销(用于错误发起审批申请,发起人主动撤销)
+     *
+     * @param instanceId  流程实例ID
+     */
+    void revoke(Long instanceId);
 
     PageInfo<ProcessTaskListVO> dealAndWaitTaskPage(ProcessTaskListBO processTemplatePageBO);
 
     ProcessDetailVO detail(String taskId);
+
+    PageInfo<ProcessTaskListVO> initiateTaskPage(ProcessTaskListBO processTemplatePageBO);
 }
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 989de6c..6097744 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
@@ -3,7 +3,9 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.dto.TBillDto;
+import com.ruoyi.system.dto.TTenantDTO;
 import com.ruoyi.system.model.TContract;
+import com.ruoyi.system.model.TDept;
 import com.ruoyi.system.model.THouse;
 import com.ruoyi.system.query.TBillAppletQuery;
 import com.ruoyi.system.query.TExamineAppletQuery;
@@ -45,4 +47,11 @@
 
     PageInfo<ExamineVO> examineList(TExamineAppletQuery dto);
 
+    /**
+     * 判断租户是否已存在
+     * @param dto
+     * @return
+     */
+    boolean isExit(TTenantDTO dto);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
index d8efb13..4926b6d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
@@ -25,19 +25,21 @@
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.google.common.collect.ImmutableMap;
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.enums.ProcessCategoryEnum;
 import com.ruoyi.common.enums.SubmitStatusEnum;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.system.service.ISysRoleService;
 import com.ruoyi.system.service.TContractService;
+import com.ruoyi.system.task.base.QuartzManager;
+import com.ruoyi.system.task.base.TimeJobType;
+import com.ruoyi.system.task.jobs.StateProcessJob;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
@@ -93,6 +95,15 @@
                     if (ObjectUtil.isEmpty(flwHisTask)) {
                         return true;
                     }
+
+                    // 添加定时任务
+                    Map<String, ? extends Object> maps =
+                            new ImmutableMap.Builder<String, Long>().
+                                    put("id", flwTask.getId())
+                                    .build();
+                    QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name+flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT,new Date(new Date().getTime()+48*60*60*1000L), maps);
+
+
                     //对比发起人和节点审批人
                     if (nodeAssigneeList.stream().noneMatch(t -> Objects.equals(t.getId(), flwHisTask.getCreateId()))) {
                         return true;
@@ -135,6 +146,15 @@
                     if (ObjectUtil.isEmpty(flwHisTask)) {
                         return true;
                     }
+
+                    // 添加定时任务
+                    Map<String, ? extends Object> maps =
+                            new ImmutableMap.Builder<String, Long>().
+                                    put("id", flwTask.getId())
+                                    .build();
+                    QuartzManager.addJob(StateProcessJob.class, (StateProcessJob.name+flwTask.getId()).toUpperCase(), TimeJobType.AUTO_AUDIT,new Date(new Date().getTime()+48*60*60*1000L), maps);
+
+
                     //对比发起人和节点审批人
                     if (flwTaskActors.stream().noneMatch(t -> Objects.equals(t.getActorId(), flwHisTask.getCreateId()))) {
                         return true;
@@ -231,10 +251,14 @@
             }
             case CATEGORY2: {
                 // 合同签订审批
+                int submitStatus = status==0?3:(status==1?4:5);
+                contractService.updateContractAuditStatus(processParameter.getString("projectId"), submitStatus);
                 break;
             }
             case CATEGORY3: {
                 // 合同提前终止审批
+                int submitStatus = status==0?4:(status==1?6:5);
+                contractService.updateContractAuditStatus(processParameter.getString("projectId"), submitStatus);
                 break;
             }
             default:
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java
index 45a3d5a..013972a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java
@@ -8,4 +8,8 @@
 
 @Service
 public class StateProcessInstanceActionServiceImpl extends ServiceImpl<StateProcessInstanceActionMapper, StateProcessInstanceAction> implements StateProcessInstanceActionService {
+    @Override
+    public void saveData(StateProcessInstanceAction stateProcessInstanceAction) {
+        this.baseMapper.saveData(stateProcessInstanceAction);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
index 3597645..cbefcad 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
@@ -1,13 +1,17 @@
 package com.ruoyi.system.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.aizuda.bpm.engine.FlowLongEngine;
+import com.aizuda.bpm.engine.TaskService;
 import com.aizuda.bpm.engine.core.FlowCreator;
+import com.aizuda.bpm.engine.core.enums.InstanceState;
 import com.aizuda.bpm.engine.core.enums.TaskType;
+import com.aizuda.bpm.engine.dao.FlwInstanceDao;
 import com.aizuda.bpm.engine.entity.*;
 import com.aizuda.bpm.engine.model.NodeModel;
 import com.aizuda.bpm.mybatisplus.mapper.*;
@@ -18,17 +22,21 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.ImmutableMap;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.BaseModel;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.core.domain.model.LoginUserApplet;
 import com.ruoyi.common.enums.StateProcessActionEnum;
+import com.ruoyi.common.enums.TaskEventType;
 import com.ruoyi.common.exception.GlobalException;
 import com.ruoyi.common.exception.state.StateErrorCode;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.uuid.IdUtils;
 import com.ruoyi.system.bo.*;
 import com.ruoyi.system.mapper.StateProcessTemplateMapper;
+import com.ruoyi.system.mapper.TContractMapper;
 import com.ruoyi.system.model.*;
 import com.ruoyi.system.service.*;
 import com.ruoyi.system.vo.ProcessDetailVO;
@@ -45,6 +53,7 @@
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.function.Function;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 @Service
@@ -63,6 +72,8 @@
     @Autowired
     private FlwTaskMapper flwTaskMapper;
     @Autowired
+    private TaskService taskService;
+    @Autowired
     private StateTaskCenterService stateTaskCenterService;
     @Autowired
     private StateProcessModuleService stateProcessModuleService;
@@ -73,7 +84,7 @@
     @Autowired
     private ISysUserService sysUserService;
     @Autowired
-    private TContractService contractService;
+    private TContractMapper contractMapper;
 
     /**
      * 流程模版分页
@@ -290,6 +301,83 @@
     }
 
     /**
+     * 启动流程
+     * @param processStartBO
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean startApplet(ProcessStartBO processStartBO) {
+        String userId = "1";
+        String nickName = "admin";
+        FlowCreator creator = FlowCreator.of(userId, nickName);
+        //查询流程绑定
+        StateProcessModule stateProcessModule = stateProcessModuleService.getOne(Wrappers.<StateProcessModule>lambdaQuery()
+                .eq(StateProcessModule::getCategory, processStartBO.getCategory()));
+        if (ObjectUtil.isNull(stateProcessModule) || ObjectUtil.isEmpty(stateProcessModule.getTemplateId())) {
+            throw new GlobalException("请先配置流程引擎模版!");
+        }
+        //查询模版,准备启动
+        StateProcessTemplate template = this.getById(stateProcessModule.getTemplateId());
+        StateProcessTemplate lastTemplate = this.getOne(Wrappers.<StateProcessTemplate>lambdaQuery()
+                .eq(StateProcessTemplate::getTemplateKey, template.getTemplateKey())
+                .apply("(template_key, template_version) in(" +
+                        "SELECT template_key, MAX(template_version) " +
+                        "FROM state_process_template " +
+                        "GROUP BY template_key)")
+        );
+
+        if (ObjectUtil.isNull(lastTemplate)) {
+            throw new GlobalException(StateErrorCode.PROCESS_TEMPLATE_NOT_EXISTS.getValue());
+        }
+        FlwProcess flwProcess = flowLongEngine.processService().getProcessById(lastTemplate.getWorkFlowId());
+        if (ObjectUtil.isNull(flwProcess)) {
+            throw new GlobalException(StateErrorCode.PROCESS_NOT_DEPLOY.getValue());
+        }
+        if (!Objects.equals(lastTemplate.getWorkflowVersion(), flwProcess.getProcessVersion())) {
+            throw new GlobalException(StateErrorCode.PROCESS_VERSION_ERROR.getValue());
+        }
+        //监听器参数补全
+        processStartBO.getVariable().put("category", processStartBO.getCategory());
+        // 开启流程
+        Optional<FlwInstance> flwInstanceOptional = flowLongEngine.startInstanceById(flwProcess.getId(), creator, processStartBO.getVariable());
+        if(flwInstanceOptional.isPresent()){
+            FlwInstance instance = flwInstanceOptional.get();
+            //存储任务中心信息
+            StateTaskCenter stateTaskCenter = new StateTaskCenter();
+            stateTaskCenter.setId(IdUtils.simpleUUID());
+            stateTaskCenter.setName(processStartBO.getName());
+            stateTaskCenter.setModuleName(processStartBO.getModuleName());
+            stateTaskCenter.setCategory(processStartBO.getCategory());
+            stateTaskCenter.setFlowId(instance.getId().toString());
+            stateTaskCenter.setRemark(processStartBO.getRemark());
+            stateTaskCenter.setCreateBy(nickName);
+            stateTaskCenter.setVariable(JSONUtil.toJsonStr(processStartBO.getVariable()));
+            stateTaskCenter.setProjectId(JSONObject.parseObject(JSONUtil.toJsonStr(processStartBO.getVariable())).getString("projectId"));
+            stateTaskCenterService.save(stateTaskCenter);
+
+            // action记录
+            StateProcessInstanceAction stateProcessInstanceAction = new StateProcessInstanceAction();
+            stateProcessInstanceAction.setId(IdUtils.simpleUUID());
+            stateProcessInstanceAction.setInstanceId(instance.getId().toString());
+            stateProcessInstanceAction.setActionType(StateProcessActionEnum.START.getValue());
+            stateProcessInstanceAction.setAuditorId(creator.getCreateId());
+            stateProcessInstanceActionService.save(stateProcessInstanceAction);
+
+            // 添加拓展信息
+            StateProcessExtInstance stateProcessExtInstance = new StateProcessExtInstance();
+            stateProcessExtInstance.setId(instance.getId().toString());
+            stateProcessExtInstance.setTemplateId(lastTemplate.getId());
+            stateProcessExtInstance.setProcessId(flwProcess.getId().toString());
+
+            //保存version
+            stateProcessExtInstance.setProcessVersion(flwProcess.getProcessVersion());
+            stateProcessExtInstanceService.save(stateProcessExtInstance);
+        }
+        return true;
+    }
+
+    /**
      * 待办
      * @param processTaskListBO
      * @return
@@ -360,7 +448,149 @@
         // 查询合同信息
         for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
             // 查询合同信息
-            TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
+            TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
+            processTaskListVO.setContract(contract);
+        }
+
+        pageInfo.setRecords(processTaskListVOS);
+
+        List<String> updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
+        Map<Long, SysUser> sysUserMap;
+        if (!CollectionUtils.isEmpty(updateUserId)) {
+            //根据用户id查询更新人信息
+            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
+
+            if (!CollectionUtils.isEmpty(sysUsers)) {
+                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
+            } else {
+                sysUserMap = new HashMap<>();
+            }
+        } else {
+            sysUserMap = new HashMap<>();
+        }
+
+
+        Map<Long, List<FlwTask>> flwHisTaskMap = flwTasks.stream().collect(Collectors.groupingBy(FlwTask::getInstanceId));
+
+        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
+            List<FlwTask> flwTask = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId()));
+            if (!CollectionUtils.isEmpty(flwTask) && ObjectUtil.isNotEmpty(flwTask.get(0))) {
+                //待审核
+                processTaskListVO.setStatus("0");
+                processTaskListVO.setNodeName(flwTask.get(0).getTaskName());
+                processTaskListVO.setTaskId(flwTask.get(0).getId().toString());
+                processTaskListVO.setVariable(flwTask.get(0).getVariable());
+            }
+            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
+            if (Objects.nonNull(sysUser)) {
+                processTaskListVO.setCreateBy(sysUser.getNickName());
+            }
+        }
+        return pageInfo;
+    }
+    /**
+     * 待办
+     * @param processTaskListBO
+     * @return
+     */
+    @Override
+    public PageInfo<ProcessTaskListVO> waitTaskPageApplet(ProcessTaskListBO processTaskListBO) {
+
+        String startTime = null;
+        String endTime = null;
+        if(Objects.nonNull(processTaskListBO.getTimeType())){
+            switch (processTaskListBO.getTimeType()){
+                case 1:
+                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 00:00:00";
+                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
+                    break;
+                case 2:
+                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -7), "yyyy-MM-dd") + " 00:00:00";
+                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
+                    break;
+                case 3:
+                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -30), "yyyy-MM-dd") + " 00:00:00";
+                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
+                    break;
+            }
+        }
+
+        //获取当前登录用户信息
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+
+        //或签时查询其他审批人是否通过(不能省略),比如 同一任务需要A,B审核,A通过了,B不用在审核了,在历史表查询A的审核记录
+        LambdaQueryWrapper<FlwHisInstance> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.orderByDesc(FlowEntity::getCreateTime);
+        //待审核
+        lambdaQueryWrapper.eq(FlwHisInstance::getInstanceState, 0);
+
+        List<Long> flwHisInstances = flwHisInstanceMapper.selectList(lambdaQueryWrapper).stream()
+                .map(FlwHisInstance::getId).collect(Collectors.toList());
+        if (ObjectUtil.isEmpty(flwHisInstances)) {
+            return new PageInfo<>();
+        }
+
+        //查询任务参与者
+        LambdaQueryWrapper<FlwTaskActor> query = new LambdaQueryWrapper<>();
+        query.and(qy -> qy.eq(FlwTaskActor::getActorId, userId)
+                //0指定用户
+                .eq(FlwTaskActor::getActorType, 0)
+                .or().in(FlwTaskActor::getActorId, userId)
+                //1指定角色
+                .eq(FlwTaskActor::getActorType, 1));
+        if (ObjectUtil.isNotNull(processTaskListBO) && ObjectUtil.isNotNull(flwHisInstances)) {
+            // 添加条件
+            query = query.in(FlwTaskActor::getInstanceId, flwHisInstances);
+        }
+        List<FlwTaskActor> flwTaskActorPage = flwTaskActorMapper.selectList(query);
+        if (ObjectUtil.isEmpty(flwTaskActorPage)) {
+            return new PageInfo<>();
+        }
+        //查询任务信息
+        List<FlwTask> flwTasks = flwTaskMapper.selectList(Wrappers.<FlwTask>lambdaQuery()
+                .orderByDesc(FlwTask::getCreateTime)
+                .in(FlwTask::getId, flwTaskActorPage.stream()
+                        .map(FlwTaskActor::getTaskId).collect(Collectors.toList())));
+
+        if (ObjectUtil.isNull(flwTasks)) {
+            return new PageInfo<>();
+        }
+        List<String> instanceIds = flwTasks.stream().map(FlwTask::getInstanceId)
+                .map(String::valueOf).collect(Collectors.toList());
+        //分页查询任务中心任务
+        LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>();
+        if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) {
+            stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName());
+        }
+        if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) {
+            stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName());
+        }
+        if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) {
+            stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy());
+        }
+        if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
+            stateTaskQuery.between(StateTaskCenter::getCreateTime, startTime, endTime);
+        }
+        if(Objects.isNull(processTaskListBO.getSortBy())){
+            processTaskListBO.setSortBy(2);
+        }
+        if (processTaskListBO.getSortBy() == 1) {
+            stateTaskQuery.orderByAsc(BaseModel::getCreateTime);
+        }
+        if (processTaskListBO.getSortBy() == 2) {
+            stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
+        }
+        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceIds);
+        PageInfo pageInfo = new PageInfo(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
+        PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
+
+        //转换类
+        List<ProcessTaskListVO> processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class);
+
+        // 查询合同信息
+        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
+            // 查询合同信息
+            TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
             processTaskListVO.setContract(contract);
         }
 
@@ -429,6 +659,122 @@
             new PageInfo<>();
         }
 
+        List<String> instanceIds = flwHisTaskList.stream().map(FlwTask::getInstanceId)
+                .map(String::valueOf).collect(Collectors.toList());
+        //分页查询任务中心任务
+//        LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>();
+//        if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) {
+//            stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName());
+//        }
+//        if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) {
+//            stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName());
+//        }
+//        if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) {
+//            stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy());
+//        }
+//        if (ObjectUtil.isEmpty(instanceId)) {
+//            return new PageInfo<>();
+//        }
+//        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId);
+//        stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
+        processTaskListBO.setInstanceIds(instanceIds);
+        PageInfo<ProcessTaskListVO> processTaskListVOS = stateTaskCenterService.pageList(processTaskListBO);
+
+        if (ObjectUtil.isEmpty(processTaskListVOS)) {
+            return new PageInfo<>();
+        }
+        Map<Long, List<FlwHisTask>> flwHisTaskMap = flwHisTaskList.stream().collect(Collectors.groupingBy(FlwHisTask::getInstanceId));
+        //查询原因
+        List<String> taskIds = flwHisTaskList.stream().map(FlowEntity::getId).map(String::valueOf).collect(Collectors.toList());
+        List<StateProcessInstanceAction> actions = stateProcessInstanceActionService.list(
+                Wrappers.<StateProcessInstanceAction>lambdaQuery().in(StateProcessInstanceAction::getNodeId, taskIds));
+        Map<String, StateProcessInstanceAction> actionMap = actions.stream().collect(Collectors.toMap(StateProcessInstanceAction::getNodeId, Function.identity()));
+
+        List<String> updateUserId = processTaskListVOS.getRecords().stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
+        Map<Long, SysUser> sysUserMap;
+        if (!CollectionUtils.isEmpty(updateUserId)) {
+            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
+
+            if (!CollectionUtils.isEmpty(sysUsers)) {
+                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
+            } else {
+                sysUserMap = new HashMap<>();
+            }
+        } else {
+            sysUserMap = new HashMap<>();
+        }
+
+        for (ProcessTaskListVO processTaskListVO : processTaskListVOS.getRecords()) {
+            List<FlwHisTask> flwHisTasks = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId()));
+            if (ObjectUtil.isNotEmpty(flwHisTaskMap)) {
+                //当某个用户在同一个模块审批流的多个节点都存在时,多次审核后,已审核列表页报错
+                for (FlwHisTask flwHisTask : flwHisTasks) {
+                    if (flwHisTask.getInstanceId().toString().equals(processTaskListVO.getFlowId())) {
+                        //10等于发起人与审批人一致自动审核完成
+                        processTaskListVO.setStatus(flwHisTask.getTaskState() == 10 ? "2" : flwHisTask.getTaskState().toString());
+                        processTaskListVO.setNodeName(flwHisTask.getTaskName());
+                        processTaskListVO.setTaskId(flwHisTask.getId().toString());
+                        processTaskListVO.setVariable(flwHisTask.getVariable());
+                    }
+                }
+            }
+            StateProcessInstanceAction action = actionMap.get(processTaskListVO.getTaskId());
+            if (ObjectUtil.isNotEmpty(action)) {
+                processTaskListVO.setReason(action.getRemark());
+            }
+            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
+            if (Objects.nonNull(sysUser)) {
+                processTaskListVO.setCreateBy(sysUser.getNickName());
+            }
+        }
+        return processTaskListVOS;
+    }
+    @Override
+    public PageInfo<ProcessTaskListVO> dealTaskPageApplet(ProcessTaskListBO processTaskListBO) {
+        String startTime = null;
+        String endTime = null;
+        if(Objects.nonNull(processTaskListBO.getTimeType())){
+            switch (processTaskListBO.getTimeType()){
+                case 1:
+                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 00:00:00";
+                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
+                    break;
+                case 2:
+                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -7), "yyyy-MM-dd") + " 00:00:00";
+                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
+                    break;
+                case 3:
+                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -30), "yyyy-MM-dd") + " 00:00:00";
+                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
+                    break;
+            }
+        }
+        //获取当前登录用户信息
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        LambdaQueryWrapper<FlwHisTaskActor> query = Wrappers.<FlwHisTaskActor>lambdaQuery()
+                .and(qy -> qy.eq(FlwTaskActor::getActorId, userId)
+                        //0指定用户
+                        .eq(FlwTaskActor::getActorType, 0)
+                        //指定角色
+                        .or().in(FlwTaskActor::getActorId, userId)
+                        .eq(FlwTaskActor::getActorType, 1));
+        List<FlwHisTaskActor> flwHisTaskActors = flwHisTaskActorMapper.selectList(query);
+
+        List<Long> hisTaskIds = flwHisTaskActors.stream().map(FlwTaskActor::getTaskId).collect(Collectors.toList());
+
+        if (hisTaskIds.isEmpty()) {
+            return new PageInfo<>();
+        }
+
+        List<FlwHisTask> flwHisTaskList = flwHisTaskMapper.selectList(
+                Wrappers.<FlwHisTask>lambdaQuery()
+                        .notIn(FlwHisTask::getTaskType, TaskType.cc.getValue(), TaskType.major.getValue())
+                        .orderByDesc(FlwHisTask::getCreateTime)
+                        .in(FlwHisTask::getId, hisTaskIds));
+        if (ObjectUtil.isEmpty(flwHisTaskList)) {
+            new PageInfo<>();
+        }
+
         List<String> instanceId = flwHisTaskList.stream().map(FlwTask::getInstanceId)
                 .map(String::valueOf).collect(Collectors.toList());
         //分页查询任务中心任务
@@ -445,8 +791,19 @@
         if (ObjectUtil.isEmpty(instanceId)) {
             return new PageInfo<>();
         }
+        if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
+            stateTaskQuery.between(StateTaskCenter::getCreateTime, startTime, endTime);
+        }
+        if(Objects.isNull(processTaskListBO.getSortBy())){
+            processTaskListBO.setSortBy(2);
+        }
+        if (processTaskListBO.getSortBy() == 1) {
+            stateTaskQuery.orderByAsc(BaseModel::getCreateTime);
+        }
+        if (processTaskListBO.getSortBy() == 2) {
+            stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
+        }
         stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId);
-        stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
         PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
         PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
         //转换类
@@ -455,7 +812,7 @@
         // 查询合同信息
         for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
             // 查询合同信息
-            TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
+            TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
             processTaskListVO.setContract(contract);
         }
 
@@ -623,15 +980,21 @@
         if (ObjectUtil.isNull(flwTask)) {
             throw new GlobalException("任务已处理或者不存在");
         }
-        flowLongEngine.executeTask(taskId, currentFlowCreator());
-        // 动作执行记录
         StateProcessInstanceAction stateProcessInstanceAction = new StateProcessInstanceAction();
+        if(Objects.nonNull(processAgreeBO.getUserId())){
+            flowLongEngine.executeTask(taskId, currentFlowCreator(processAgreeBO.getUserId()));
+            stateProcessInstanceAction.setAuditorId(String.valueOf(processAgreeBO.getUserId()));
+        }else {
+            stateProcessInstanceAction.setAuditorId(String.valueOf(SecurityUtils.getUserId()));
+            flowLongEngine.executeTask(taskId, currentFlowCreator());
+        }
+        // 动作执行记录
         stateProcessInstanceAction.setId(IdUtils.simpleUUID());
         stateProcessInstanceAction.setInstanceId(flwTask.getInstanceId().toString());
-        stateProcessInstanceAction.setAuditorId(String.valueOf(SecurityUtils.getUserId()));
         stateProcessInstanceAction.setActionType(StateProcessActionEnum.APPROVED.getValue());
         stateProcessInstanceAction.setNodeId(processAgreeBO.getTaskId());
         stateProcessInstanceAction.setRemark(processAgreeBO.getRemark());
+        stateProcessInstanceAction.setPictures(processAgreeBO.getPictures());
         stateProcessInstanceActionService.save(stateProcessInstanceAction);
     }
 
@@ -649,7 +1012,13 @@
         record.setActionType(StateProcessActionEnum.REJECTED.getValue());
         record.setNodeId(processRefuseBO.getTaskId());
         record.setRemark(processRefuseBO.getRemark());
+        record.setPictures(processRefuseBO.getPictures());
         stateProcessInstanceActionService.save(record);
+    }
+    @Override
+    public void revoke(Long instanceId) {
+        FlowCreator flowCreator = FlowCreator.of(String.valueOf(SecurityUtils.getUserId()), SecurityUtils.getLoginUser().getUser().getNickName());
+        flowLongEngine.runtimeService().revoke(instanceId, flowCreator);
     }
 
     @Override
@@ -759,19 +1128,251 @@
         return processTaskListVOS;
     }
 
+//    @Override
+//    public PageInfo<ProcessTaskListVO> dealAndWaitTaskPage(ProcessTaskListBO processTaskListBO) {
+//        //获取当前登录用户信息
+//        Long userId = SecurityUtils.getLoginUser().getUserId();
+//
+//        //或签时查询其他审批人是否通过(不能省略),比如 同一任务需要A,B审核,A通过了,B不用在审核了,在历史表查询A的审核记录
+//        LambdaQueryWrapper<FlwHisInstance> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+//        lambdaQueryWrapper.orderByDesc(FlowEntity::getCreateTime);
+//        //待审核,通过,拒绝
+//        lambdaQueryWrapper.in(FlwHisInstance::getInstanceState, 0,1,2);
+//
+//        List<Long> flwHisInstances = flwHisInstanceMapper.selectList(lambdaQueryWrapper).stream()
+//                .map(FlwHisInstance::getId).collect(Collectors.toList());
+//
+//        //查询任务参与者
+//        LambdaQueryWrapper<FlwTaskActor> query = new LambdaQueryWrapper<>();
+//        query.and(qy -> qy.eq(FlwTaskActor::getActorId, userId)
+//                //0指定用户
+//                .eq(FlwTaskActor::getActorType, 0)
+//                .or().in(FlwTaskActor::getActorId, userId)
+//                //1指定角色
+//                .eq(FlwTaskActor::getActorType, 1));
+//        if (ObjectUtil.isNotNull(processTaskListBO) && ObjectUtil.isNotNull(flwHisInstances)) {
+//            // 添加条件
+//            query = query.in(FlwTaskActor::getInstanceId, flwHisInstances);
+//        }
+//        List<FlwTaskActor> flwTaskActorPage = flwTaskActorMapper.selectList(query);
+//        List<String> instanceIds = new ArrayList<>();
+//        List<FlwTask> flwTasks = new ArrayList<>();
+//        if (ObjectUtil.isNotEmpty(flwTaskActorPage)) {
+//            //查询任务信息
+//            flwTasks = flwTaskMapper.selectList(Wrappers.<FlwTask>lambdaQuery()
+//                    .orderByDesc(FlwTask::getCreateTime)
+//                    .in(FlwTask::getId, flwTaskActorPage.stream()
+//                            .map(FlwTaskActor::getTaskId).collect(Collectors.toList())));
+//            if (ObjectUtil.isNotNull(flwTasks)) {
+//                instanceIds = flwTasks.stream().map(FlwTask::getInstanceId)
+//                        .map(String::valueOf).collect(Collectors.toList());
+//            }
+//        }
+//
+//        LambdaQueryWrapper<FlwHisTaskActor> hisQuery= Wrappers.<FlwHisTaskActor>lambdaQuery()
+//                .and(qy -> qy.eq(FlwTaskActor::getActorId, userId)
+//                        //0指定用户
+//                        .eq(FlwTaskActor::getActorType, 0)
+//                        //指定角色
+//                        .or().in(FlwTaskActor::getActorId, userId)
+//                        .eq(FlwTaskActor::getActorType, 1));
+//        List<FlwHisTaskActor> flwHisTaskActors = flwHisTaskActorMapper.selectList(hisQuery);
+//        List<Long> hisTaskIds = flwHisTaskActors.stream().map(FlwTaskActor::getTaskId).collect(Collectors.toList());
+//
+//        if (!CollectionUtils.isEmpty(hisTaskIds)) {
+//            List<FlwHisTask> flwHisTaskList = flwHisTaskMapper.selectList(
+//                    Wrappers.<FlwHisTask>lambdaQuery()
+//                            .notIn(FlwHisTask::getTaskType, TaskType.cc.getValue(), TaskType.major.getValue())
+//                            .orderByDesc(FlwHisTask::getCreateTime)
+//                            .in(FlwHisTask::getId, hisTaskIds));
+//            if (ObjectUtil.isNotEmpty(flwHisTaskList)) {
+//                instanceIds.addAll(flwHisTaskList.stream().map(FlwHisTask::getInstanceId)
+//                        .map(String::valueOf).collect(Collectors.toList()));
+//            }
+//        }
+//
+//
+//        //分页查询任务中心任务
+////        LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>();
+////        if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) {
+////            stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName());
+////        }
+////        if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) {
+////            stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName());
+////        }
+////        if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) {
+////            stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy());
+////        }
+////        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceIds);
+////        stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
+//        processTaskListBO.setInstanceIds(instanceIds);
+////        PageInfo pageInfo = new PageInfo(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
+////        PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
+////        //转换类
+////        List<ProcessTaskListVO> processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class);
+////        // 查询合同信息
+////        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
+////            // 查询合同信息
+////            TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
+////            processTaskListVO.setContract(contract);
+////        }
+////        pageInfo.setRecords(processTaskListVOS);
+//
+//        PageInfo<ProcessTaskListVO> processTaskListVOS = stateTaskCenterService.pageList(processTaskListBO);
+//
+//        List<String> updateUserId = processTaskListVOS.getRecords().stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
+//        Map<Long, SysUser> sysUserMap;
+//        if (!CollectionUtils.isEmpty(updateUserId)) {
+//            //根据用户id查询更新人信息
+//            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
+//
+//            if (!CollectionUtils.isEmpty(sysUsers)) {
+//                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
+//            } else {
+//                sysUserMap = new HashMap<>();
+//            }
+//        } else {
+//            sysUserMap = new HashMap<>();
+//        }
+//
+//        Map<Long, List<FlwTask>> flwHisTaskMap = new HashMap<>();
+//        if(!CollectionUtils.isEmpty(flwTasks)){
+//            flwHisTaskMap = flwTasks.stream().collect(Collectors.groupingBy(FlwTask::getInstanceId));
+//        }
+//
+//        for (ProcessTaskListVO processTaskListVO : processTaskListVOS.getRecords()) {
+//            if(!CollectionUtils.isEmpty(flwHisTaskMap)){
+//                List<FlwTask> flwTask = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId()));
+//                if (!CollectionUtils.isEmpty(flwTask) && ObjectUtil.isNotEmpty(flwTask.get(0))) {
+//                    //待审核
+//                    processTaskListVO.setStatus("0");
+//                    processTaskListVO.setNodeName(flwTask.get(0).getTaskName());
+//                    processTaskListVO.setTaskId(flwTask.get(0).getId().toString());
+//                    processTaskListVO.setVariable(flwTask.get(0).getVariable());
+//                }
+//            }
+//            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
+//            if (Objects.nonNull(sysUser)) {
+//                processTaskListVO.setCreateBy(sysUser.getNickName());
+//            }
+//        }
+//        return processTaskListVOS;
+//    }
+
     @Override
     public ProcessDetailVO detail(String taskId) {
         ProcessDetailVO processDetailVO = new ProcessDetailVO();
         FlwTask flwTask = flwTaskMapper.selectById(Long.valueOf(taskId));
-        // 查询合同信息
-        TContract contract = contractService.getById(JSONObject.parseObject(flwTask.getVariable()).getString("projectId"));
+        TContract contract;
+        Long instanceId;
+        if(Objects.nonNull(flwTask)){
+            instanceId = flwTask.getInstanceId();
+            // 查询合同信息
+            contract = contractMapper.selectById(JSONObject.parseObject(flwTask.getVariable()).getString("projectId"));
+        }else {
+            FlwHisTask flwHisTask = flwHisTaskMapper.selectById(Long.valueOf(taskId));
+            if(Objects.isNull(flwHisTask)){
+                throw new GlobalException("流程不存在");
+            }
+            instanceId = flwHisTask.getInstanceId();
+            contract = contractMapper.selectById(Objects.requireNonNull(JSONObject.parseObject(flwHisTask.getVariable())).getString("projectId"));
+        }
         BeanUtil.copyProperties(contract, processDetailVO);
 
-        List<StateProcessInstanceAction> list = stateProcessInstanceActionService.list(Wrappers.<StateProcessInstanceAction>lambdaQuery().eq(StateProcessInstanceAction::getInstanceId, flwTask.getInstanceId())
-                .orderByDesc(StateProcessInstanceAction::getCreateTime));
+        // 查询历史任务
+        List<FlwHisTask> flwHisTasks = flwHisTaskMapper.selectList(Wrappers.<FlwHisTask>lambdaQuery().eq(FlwHisTask::getInstanceId, instanceId));
+
+        processDetailVO.setFlwHisTasks(flwHisTasks);
+
+        List<StateProcessInstanceAction> list = stateProcessInstanceActionService.list(Wrappers.<StateProcessInstanceAction>lambdaQuery().eq(StateProcessInstanceAction::getInstanceId, instanceId)
+                .orderByAsc(StateProcessInstanceAction::getCreateTime));
+        for (StateProcessInstanceAction stateProcessInstanceAction : list) {
+            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(stateProcessInstanceAction.getAuditorId()));
+            if(Objects.nonNull(sysUser)){
+                stateProcessInstanceAction.setNickName(sysUser.getNickName());
+            }
+        }
         processDetailVO.setInstanceActions(list);
 
         return processDetailVO;
+    }
+
+    @Override
+    public PageInfo<ProcessTaskListVO> initiateTaskPage(ProcessTaskListBO processTaskListBO) {
+        String startTime = null;
+        String endTime = null;
+        if(Objects.nonNull(processTaskListBO.getTimeType())){
+            switch (processTaskListBO.getTimeType()){
+                case 1:
+                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 00:00:00";
+                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
+                    break;
+                case 2:
+                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -7), "yyyy-MM-dd") + " 00:00:00";
+                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
+                    break;
+                case 3:
+                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -30), "yyyy-MM-dd") + " 00:00:00";
+                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
+                    break;
+            }
+        }
+        //获取当前登录用户信息
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+
+        //分页查询任务中心任务
+        LambdaQueryWrapper<FlwHisTask> stateTaskQuery = new LambdaQueryWrapper<>();
+        if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
+            stateTaskQuery.between(FlwHisTask::getCreateTime, startTime, endTime);
+        }
+        if(Objects.isNull(processTaskListBO.getSortBy())){
+            processTaskListBO.setSortBy(2);
+        }
+        if (processTaskListBO.getSortBy() == 1) {
+            stateTaskQuery.orderByAsc(FlwHisTask::getCreateTime);
+        }
+        if (processTaskListBO.getSortBy() == 2) {
+            stateTaskQuery.orderByDesc(FlwHisTask::getCreateTime);
+        }
+        stateTaskQuery.eq(FlwHisTask::getParentTaskId, 0L);
+        stateTaskQuery.like(FlwHisTask::getCreateId, userId);
+        PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
+        PageInfo<FlwHisTask> taskCenters = flwHisTaskMapper.selectPage(pageInfo,stateTaskQuery);
+        //转换类
+        List<ProcessTaskListVO> processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class);
+
+        // 查询合同信息
+        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
+            // 查询合同信息
+            TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
+            processTaskListVO.setContract(contract);
+        }
+
+        if (ObjectUtil.isEmpty(processTaskListVOS)) {
+            return pageInfo;
+        }
+        List<String> updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
+        Map<Long, SysUser> sysUserMap;
+        if (!CollectionUtils.isEmpty(updateUserId)) {
+            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
+
+            if (!CollectionUtils.isEmpty(sysUsers)) {
+                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
+            } else {
+                sysUserMap = new HashMap<>();
+            }
+        } else {
+            sysUserMap = new HashMap<>();
+        }
+        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
+            processTaskListVO.setTaskId(processTaskListVO.getId());
+            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
+            if (Objects.nonNull(sysUser)) {
+                processTaskListVO.setCreateBy(sysUser.getNickName());
+            }
+        }
+        pageInfo.setRecords(processTaskListVOS);
+        return pageInfo;
     }
 
     private FlowCreator currentFlowCreator() {
@@ -781,5 +1382,12 @@
         }
         return FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName());
     }
+    private FlowCreator currentFlowCreator(Long userId) {
+        if (null == userId) {
+            throw new GlobalException("非法用户");
+        }
+        SysUser sysUser = sysUserService.selectUserById(userId);
+        return FlowCreator.of(String.valueOf(sysUser.getUserId()), sysUser.getNickName());
+    }
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index ed7ae34..82743d4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -61,6 +61,8 @@
     @Autowired
     private SysUserPostMapper userPostMapper;
     @Autowired
+    private TDeptToUserService deptToUserService;
+    @Autowired
     private TDeptToUserMapper deptToUserMapper;
 
     @Autowired
@@ -495,7 +497,7 @@
                 deptToUser.setDeptId(deptId);
                 deptToUserList.add(deptToUser);
             }
-            userRoleMapper.insertBatchUserDept(deptToUserList);
+            deptToUserService.saveBatch(deptToUserList);
         }
     }
 
@@ -670,11 +672,12 @@
         List<Long> userIds = list.stream().map(SysUserVO::getUserId).collect(Collectors.toList());
         // 查询所有部门
         List<TDept> depts = deptMapper.selectList(Wrappers.lambdaQuery(TDept.class));
-        List<TDeptToUser> tDeptToUsers = deptToUserMapper.selectList(Wrappers.lambdaQuery(TDeptToUser.class)
+        List<TDeptToUser> tDeptToUsers = deptToUserService.list(Wrappers.lambdaQuery(TDeptToUser.class)
                 .in(TDeptToUser::getUserId, userIds));
         for (SysUserVO sysUserVO : list) {
             tDeptToUsers.stream().filter(tDeptToUser -> tDeptToUser.getUserId().equals(sysUserVO.getUserId())).forEach(tDeptToUser -> {
                 sysUserVO.setDeptList(depts.stream().filter(tDept -> tDept.getId().equals(tDeptToUser.getDeptId())).map(TDept::getDeptName).collect(Collectors.toList()));
+                sysUserVO.setDeptIds(depts.stream().map(TDept::getId).filter(id -> id.equals(tDeptToUser.getDeptId())).collect(Collectors.toList()));
             });
         }
         pageInfo.setRecords(list);
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java
index f5b560c..2d778f6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.config.SmsProperties;
 import com.ruoyi.common.constant.AmountConstant;
 import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.core.redis.RedisCache;
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 4084b2c..63040be 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,12 +1,16 @@
 package com.ruoyi.system.service.impl;
 
+import com.aizuda.bpm.engine.entity.FlwHisTask;
+import com.aizuda.bpm.mybatisplus.mapper.FlwHisTaskMapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.constant.DictConstants;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.enums.ProcessCategoryEnum;
 import com.ruoyi.common.utils.DictUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.system.bo.ProcessStartBO;
 import com.ruoyi.system.dto.SignContractDTO;
 import com.ruoyi.system.dto.TerminateContractDTO;
 import com.ruoyi.system.mapper.TBillMapper;
@@ -17,6 +21,7 @@
 import com.ruoyi.system.query.TContractAppletQuery;
 import com.ruoyi.system.query.TContractBillQuery;
 import com.ruoyi.system.query.TContractQuery;
+import com.ruoyi.system.service.StateProcessTemplateService;
 import com.ruoyi.system.service.TBillService;
 import com.ruoyi.system.service.TContractRentTypeService;
 import com.ruoyi.system.service.TContractService;
@@ -25,6 +30,7 @@
 import com.ruoyi.system.vo.CheckAcceptRecordVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -32,9 +38,8 @@
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAdjusters;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -56,6 +61,10 @@
     private TBillService billService;
     @Resource
     private TContractMapper contractMapper;
+    @Autowired
+    private StateProcessTemplateService stateProcessTemplateService;
+    @Autowired
+    private FlwHisTaskMapper flwHisTaskMapper;
 
     @Override
     public PageInfo<TContract> contractList(TContractQuery query) {
@@ -77,6 +86,12 @@
         for (TContract tContract : list) {
             tContract.setPayType(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CONTRACT_PAY_TYPE,tContract.getPayType()));
             tContract.setStatus(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CONTRACT_STATUS,tContract.getStatus()));
+            FlwHisTask flwHisTask = flwHisTaskMapper.selectOne(new LambdaQueryWrapper<FlwHisTask>()
+                    .like(FlwHisTask::getVariable, tContract.getId())
+                    .last("LIMIT 1"));
+            if (Objects.nonNull(flwHisTask)){
+                tContract.setInstanceId(flwHisTask.getInstanceId());
+            }
         }
         pageInfo.setRecords(list);
         return pageInfo;
@@ -101,6 +116,19 @@
         contract.setTerminateRemark(dto.getTerminateRemark());
         contract.setStatus("4");
         this.baseMapper.updateById(contract);
+
+        // 进入合同提前终止审批流程
+        ProcessStartBO processStartBO = new ProcessStartBO();
+        processStartBO.setCategory(ProcessCategoryEnum.CATEGORY3.getValue().toString());
+        processStartBO.setModuleName("合同提前终止审批");
+        processStartBO.setName(contract.getContractName());
+        processStartBO.setRemark("");
+        Map<String, Object> variable = new HashMap<>();
+        variable.put("projectId", dto.getId());
+        processStartBO.setVariable(variable);
+        //开启工作流程
+        stateProcessTemplateService.start(processStartBO);
+
         // 生成验收记录
         TCheckAcceptRecord tCheckAcceptRecord = new TCheckAcceptRecord();
         tCheckAcceptRecord.setContractId(dto.getId());
@@ -158,8 +186,17 @@
         contract.setFirstPayTime(contract.getStartTime().plusDays(10));
         contractMapper.updateById(contract);
 
-        // TODO 进入签订审批流程
-
+        // 进入签订审批流程
+        ProcessStartBO processStartBO = new ProcessStartBO();
+        processStartBO.setCategory(ProcessCategoryEnum.CATEGORY2.getValue().toString());
+        processStartBO.setModuleName("合同签订审批");
+        processStartBO.setName(contract.getContractName());
+        processStartBO.setRemark("");
+        Map<String, Object> variable = new HashMap<>();
+        variable.put("projectId", dto.getId());
+        processStartBO.setVariable(variable);
+        //开启工作流程
+        stateProcessTemplateService.startApplet(processStartBO);
 
         List<TContractRentType> contractRentTypes = contractRentTypeService.list();
         // 生成第一笔账单
@@ -169,11 +206,8 @@
         rentBill.setContractId(contract.getId());
         rentBill.setContractNumber(contract.getContractNumber());
         rentBill.setPayableFeesTime(firstPayTime.toLocalDate());
-        if (firstPayTime.toLocalDate().equals(LocalDate.now())){
-            rentBill.setPayFeesStatus("1");
-        }else {
-            rentBill.setPayFeesStatus("2");
-        }
+        rentBill.setPayFeesStatus("1");
+
         rentBill.setBillType("1");
         rentBill.setStartTime(contract.getStartPayTime());
         TContractRentType tContractRentType = contractRentTypes.stream().filter(e -> e.getContractId().equals(contract.getId())).findFirst().orElse(null);
@@ -226,12 +260,15 @@
             }
         }else{
             if (contract.getFirstPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12).isAfter(contract.getEndTime())){
-                rentBill.setEndTime(contract.getFirstPayTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12));
-            }else{
                 rentBill.setEndTime(contract.getEndTime());
+
+            }else{
+                LocalDateTime firstPayTime1 = contract.getFirstPayTime();
+                // 将firstPayTime1的日设置为当月最后一天
+                rentBill.setEndTime(firstPayTime1.with(TemporalAdjusters.lastDayOfMonth()));
             }
             // 不走递增递减
-            long allDays = ChronoUnit.DAYS.between(contract.getFirstPayTime(), rentBill.getEndTime());
+            long allDays = ChronoUnit.DAYS.between(contract.getStartPayTime().minusDays(1), rentBill.getEndTime());
             rentBill.setPayableFeesMoney(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(allDays)));
             rentBill.setOutstandingMoney(rentBill.getPayableFeesMoney());
 
@@ -245,13 +282,10 @@
         depositBill.setStartTime(contract.getStartPayTime());
         depositBill.setEndTime(contract.getEndTime());
         depositBill.setPayableFeesTime(firstPayTime.toLocalDate());
-        if (firstPayTime.toLocalDate().equals(LocalDate.now())){
-            depositBill.setPayFeesStatus("1");
 
-        }else {
-            depositBill.setPayFeesStatus("2");
+        depositBill.setPayFeesStatus("1");
 
-        }
+
         depositBill.setBillType("2");
         this.updateById(contract);
         billService.save(rentBill);
@@ -264,7 +298,6 @@
 
 
             while(beforeBill.getEndTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12).isBefore(contract.getEndTime())){
-
                     TBill tBill = new TBill();
                     tBill.setContractId(contract.getId());
                     tBill.setContractNumber(contract.getContractNumber());
@@ -419,10 +452,8 @@
 
                             }
                         }else{
-                            long allDays = ChronoUnit.DAYS.between(beforeBill.getEndTime(), (contract.getPayType().equals("1")?
-                                    beforeBill.getEndTime().plusMonths(1):contract.getPayType().equals("2")?
-                                    beforeBill.getEndTime().plusMonths(3):beforeBill.getEndTime().plusMonths(12)).with(TemporalAdjusters.lastDayOfMonth()));
-                            tBill.setPayableFeesMoney(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(allDays)));
+
+                            tBill.setPayableFeesMoney(contract.getMonthRent());
                             tBill.setOutstandingMoney(tBill.getPayableFeesMoney());
 
                         }
@@ -434,27 +465,23 @@
                                     beforeBill.getEndTime().plusMonths(1).withDayOfMonth(15).toLocalDate():contract.getPayType().equals("2")?
                                     beforeBill.getEndTime().plusMonths(3).withDayOfMonth(15).toLocalDate():beforeBill.getEndTime().withDayOfMonth(15).plusMonths(12).toLocalDate()));
                         }
-                        tBill.setPayFeesStatus("2");
+                        tBill.setPayFeesStatus("1");
                         tBill.setBillType("1");
                         tBill.setStartTime(beforeBill.getEndTime().plusDays(1));
-                        tBill.setEndTime(contract.getEndTime());
+                        tBill.setEndTime(beforeBill.getEndTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12).with(TemporalAdjusters.lastDayOfMonth()));
+                        billMapper.insert(tBill);
                     }
-                    billMapper.insert(tBill);
-                }
+                beforeBill.setEndTime(beforeBill.getEndTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12).with(TemporalAdjusters.lastDayOfMonth()));
+            }
             }
 
         } catch (Exception e) {
             e.printStackTrace();
         }
-        TBill beforeBill = billService.lambdaQuery().eq(TBill::getContractId, contract.getId()).eq(TBill::getBillType, 1).orderByDesc(TBill::getCreateTime)
+        TBill beforeBill = billService.lambdaQuery().eq(TBill::getContractId, contract.getId()).eq(TBill::getBillType, 1).orderByDesc(TBill::getStartTime)
                 .last("limit 1").one();
         // 生成最后一笔账单
         if (!(beforeBill.getEndTime().toLocalDate().equals(contract.getEndTime().toLocalDate()))
-                &&
-                (contract.getPayType().equals("1")?
-                        beforeBill.getEndTime().plusMonths(1):contract.getPayType().equals("2")?
-                        beforeBill.getEndTime().plusMonths(3):beforeBill.getEndTime().plusMonths(12))
-                        .with(TemporalAdjusters.lastDayOfMonth()).isAfter(contract.getEndTime())
                 && beforeBill.getEndTime().isBefore(contract.getEndTime())
         ){
             TBill tBill = new TBill();
@@ -614,7 +641,7 @@
 
             }
             tBill.setContractNumber(contract.getContractNumber());
-            if (beforeBill.getEndTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12).getDayOfMonth()<=15){
+            if (contract.getEndTime().getDayOfMonth()<=15){
                 tBill.setPayableFeesTime(contract.getEndTime().withHour(0).withMinute(0).withSecond(0).toLocalDate());
             }else{
                 tBill.setPayableFeesTime((contract.getPayType().equals("1")?
@@ -624,7 +651,7 @@
             tBill.setPayFeesStatus("1");
             tBill.setBillType("1");
             tBill.setStartTime(beforeBill.getEndTime().plusDays(1));
-            tBill.setEndTime(beforeBill.getEndTime().plusMonths(contract.getPayType().equals("1")? 1:contract.getPayType().equals("2")? 3:12));
+            tBill.setEndTime(contract.getEndTime());
             billService.save(tBill);
         }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDeptServiceImpl.java
index 730c8cf..40deee2 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDeptServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDeptServiceImpl.java
@@ -2,7 +2,6 @@
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.basic.PageInfo;
-import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.mapper.SysMenuMapper;
 import com.ruoyi.system.model.TDept;
 import com.ruoyi.system.mapper.TDeptMapper;
@@ -12,6 +11,7 @@
 import com.ruoyi.system.vo.DeptVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 import java.util.List;
 
@@ -30,7 +30,7 @@
     private SysMenuMapper sysMenuMapper;
     @Override
     public boolean isExit(TDept dto) {
-        if(StringUtils.isNotEmpty(dto.getDeptId())){
+        if(StringUtils.hasLength(dto.getId())){
             // 修改
             return this.count(Wrappers.lambdaQuery(TDept.class).ne(TDept::getId, dto.getId()).eq(TDept::getDeptId, dto.getDeptId())) > 0;
         }else {
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 f20404c..0c1e19f 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
@@ -7,11 +7,13 @@
 import com.ruoyi.common.constant.DictConstants;
 import com.ruoyi.common.utils.DictUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.dto.TTenantDTO;
 import com.ruoyi.system.mapper.SysUserMapper;
 import com.ruoyi.system.mapper.TContractMapper;
 import com.ruoyi.system.mapper.THouseMapper;
 import com.ruoyi.system.mapper.TTenantMapper;
 import com.ruoyi.system.model.TContract;
+import com.ruoyi.system.model.TDept;
 import com.ruoyi.system.model.THouse;
 import com.ruoyi.system.model.TTenant;
 import com.ruoyi.system.query.TBillAppletQuery;
@@ -113,14 +115,20 @@
 
     @Override
     public PageInfo<TBillVO> listBill(TBillAppletQuery query) {
-        List<String> contractIds = contractMapper.selectList(new LambdaQueryWrapper<TContract>()
-                        .eq(TContract::getTenantId, query.getId())).stream().map(TContract::getId)
+        List<TContract> tContracts = contractMapper.selectList(new LambdaQueryWrapper<TContract>()
+                .eq(TContract::getTenantId, query.getId()));
+        List<String> contractIds = tContracts.stream().map(TContract::getId)
                 .collect(Collectors.toList());
         if (contractIds.isEmpty())contractIds.add("0");
         PageInfo<TBillVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
         List<TBillVO> list = this.baseMapper.listBill(query,pageInfo);
         for (TBillVO tBillVO : list) {
-            tBillVO.setPayFeesStatus(DictUtils.getDictLabel(DictConstants.DICT_TYPE_LEASE_STATUS,tBillVO.getPayFeesStatus()));
+            TContract contract = tContracts.stream().filter(e -> e.getId().equals(tBillVO.getContractId()))
+                    .findFirst().orElse(null);
+            if (contract!=null){
+                tBillVO.setHouse(houseMapper.selectById(contract.getHouseId()));
+            }
+            tBillVO.setPayFeesStatus(tBillVO.getPayFeesStatus());
         }
         pageInfo.setRecords(list);
         return pageInfo;
@@ -133,4 +141,15 @@
         pageInfo.setRecords(list);
         return pageInfo;
     }
+
+    @Override
+    public boolean isExit(TTenantDTO dto) {
+        if(StringUtils.isNotEmpty(dto.getId())){
+            // 修改
+            return this.count(Wrappers.lambdaQuery(TTenant.class).ne(TTenant::getId, dto.getId()).eq(TTenant::getPhone, dto.getPhone())) > 0;
+        }else {
+            // 新增
+            return this.count(Wrappers.lambdaQuery(TTenant.class).eq(TTenant::getPhone, dto.getPhone())) > 0;
+        }
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java
new file mode 100644
index 0000000..c6aee66
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/AbstractJob.java
@@ -0,0 +1,37 @@
+package com.ruoyi.system.task.base;
+
+import com.aizuda.bpm.mybatisplus.mapper.FlwTaskActorMapper;
+import com.aizuda.bpm.mybatisplus.mapper.FlwTaskMapper;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.SmsUtil;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.service.StateProcessTemplateService;
+import com.ruoyi.system.task.utils.SpringContextsUtil;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractJob implements Job{
+	protected Logger logger = LoggerFactory.getLogger(getClass());
+
+	@Override
+	public abstract void execute(JobExecutionContext context) throws JobExecutionException;
+
+	protected StateProcessTemplateService stateProcessTemplateService;
+	protected FlwTaskMapper flwTaskMapper;
+	protected FlwTaskActorMapper flwTaskActorMapper;
+	protected SmsUtil smsUtil;
+	protected ISysUserService sysUserService;
+
+	public AbstractJob(){
+		this.stateProcessTemplateService = SpringContextsUtil.getBean(StateProcessTemplateService.class);
+		this.flwTaskMapper = SpringContextsUtil.getBean(FlwTaskMapper.class);
+		this.flwTaskActorMapper = SpringContextsUtil.getBean(FlwTaskActorMapper.class);
+		this.smsUtil = SpringContextsUtil.getBean(SmsUtil.class);
+		this.sysUserService = SpringContextsUtil.getBean(ISysUserService.class);
+	}
+
+	 
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/base/QuartzManager.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/QuartzManager.java
new file mode 100644
index 0000000..90a0017
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/QuartzManager.java
@@ -0,0 +1,128 @@
+package com.ruoyi.system.task.base;
+
+import org.quartz.*;
+import org.quartz.impl.StdSchedulerFactory;
+
+import java.util.Date;
+import java.util.Map;
+
+public class QuartzManager {
+	private static SchedulerFactory factory = new StdSchedulerFactory();
+	private static final String TRIGGER_NAME_PREFIX = "TRIGGER_PREFIX_";
+	private static final String JOB_NAME_PREFIX = "JOB_PREFIX_";
+	
+	/**
+	 * 添加定时任务:具体某个时间点执行一次的任务,如:在某个2015-06-01 12:00发送一条消息
+	 * 
+	 * @param jobName
+	 *            具体的任务名+ID标识唯一
+	 * @param jobType
+	 * @param date
+	 * @param jp
+	 */
+	public synchronized static void addJob(Class<? extends Job> jobClass, String jobName, TimeJobType jobType, Date date,
+                                           Map<String,  ? extends Object> jp) {
+		//logger.debug("ADD JOB {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date);
+		try {
+			Scheduler sched = factory.getScheduler();
+			JobDetail job = JobBuilder.newJob(jobClass).withIdentity(JOB_NAME_PREFIX + jobName, jobType.getType())
+					.setJobData(new JobDataMap(jp)).build();
+
+			SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
+					.withIdentity(TRIGGER_NAME_PREFIX + jobName, jobType.getType()).startAt(date).build();
+			removeJob(jobName, jobType);
+			
+			sched.scheduleJob(job, trigger);
+
+			if (!sched.isShutdown()) {
+				sched.start();
+			}
+		} catch (Exception e) {
+			//logger.error("ADD JOB exception {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date);
+		}
+	}
+	
+	   /**
+	    * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) 
+	    * @param jobName 
+	    * @param time 
+	    */  
+	    public synchronized static void modifyJobTime(String jobName,TimeJobType jobType, Date time) {  
+	    	 //logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time);
+	        try {  
+	        	JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType());
+				TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType());
+				
+				
+	            Scheduler sched = factory.getScheduler();  
+	            SimpleTrigger trigger = (SimpleTrigger) sched.getTrigger(key);  
+	            if(trigger == null) {  
+	                return;  
+	            }  
+	            Date oldTime = trigger.getStartTime();
+	          
+	            if (oldTime.getTime() != time.getTime()) {  
+	                JobDetail jobDetail = sched.getJobDetail(jobKey);  
+	                Class<? extends Job> objJobClass = jobDetail.getJobClass();  
+	                removeJob(jobName,jobType);  
+	                Map<String, Object> jp = jobDetail.getJobDataMap();
+	                addJob(objJobClass, jobName, jobType, time, jp); 
+	            }  
+	        } catch (Exception e) {  
+	           // logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time);
+	        }  
+	    }
+
+	/**
+	 * 移除一个任务
+	 * 
+	 * @param jobName
+	 */
+	public synchronized static void removeJob(String jobName, TimeJobType jobType) {
+		try {
+			JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType());
+			TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType());
+			Scheduler sched = factory.getScheduler();
+
+			JobDetail detail = sched.getJobDetail(jobKey);
+			if (detail != null) {
+				sched.pauseJob(jobKey);
+				sched.pauseTrigger(key);// 停止触发器
+				sched.unscheduleJob(key);// 移除触发器
+				sched.deleteJob(jobKey);// 删除任务
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * 启动所有定时任务
+	 */
+	public synchronized static void startJobs() {
+		try {
+			Scheduler sched = factory.getScheduler();
+			sched.start();
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * 关闭所有定时任务
+	 */
+	public synchronized static void shutdownJobs() {
+		try {
+			Scheduler sched = factory.getScheduler();
+			if (!sched.isShutdown()) {
+				sched.shutdown();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/base/TimeJobType.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/TimeJobType.java
new file mode 100644
index 0000000..8bacc4a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/base/TimeJobType.java
@@ -0,0 +1,28 @@
+package com.ruoyi.system.task.base;
+
+/**
+ * @Description 按时间点发布的任务类型
+ * @date 2025年2月17日 下午7:22:28
+ */
+public enum TimeJobType {
+	AUTO_AUDIT("auto_audit","自动审核");
+	private String type;
+	private String desc;
+	private TimeJobType(String type, String desc) {
+		this.type = type;
+		this.desc = desc;
+	}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getDesc() {
+		return desc;
+	}
+	public void setDesc(String desc) {
+		this.desc = desc;
+	}
+	
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/exceptions/TimeException.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/exceptions/TimeException.java
new file mode 100644
index 0000000..efd9cf8
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/exceptions/TimeException.java
@@ -0,0 +1,37 @@
+package com.ruoyi.system.task.exceptions;
+
+/** 
+ * @文件说明:定时器任务执行异常 
+ * @版权所有:成都喜来达
+ * @项目名称: fengsheng
+ * @创建者: Leeyns 
+ * @创建日期: 2016年5月18日
+ * @最近修改者:Leeyns 
+ * @最近修改日期:2016年5月18日
+ */ 
+public class TimeException extends Exception {
+
+	/**
+	 *  TODO
+	 */
+	private static final long serialVersionUID = 5703430073981692250L;
+
+	private String message;
+	
+	public TimeException() {
+		super();
+	}
+	
+	public TimeException(String message) {
+		super(message);
+		this.message = message;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/StateProcessJob.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/StateProcessJob.java
new file mode 100644
index 0000000..73e2ab2
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/jobs/StateProcessJob.java
@@ -0,0 +1,49 @@
+package com.ruoyi.system.task.jobs;
+
+import com.aizuda.bpm.engine.entity.FlwTaskActor;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.system.bo.ProcessAgreeBO;
+import com.ruoyi.system.task.base.AbstractJob;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import java.util.Objects;
+
+/**
+ * 发票定时任务
+ * @author Administrator
+ *
+ */
+public class StateProcessJob extends AbstractJob {
+	
+	public static final String name = "stateProcess_";
+	
+	@Override
+	public void execute(JobExecutionContext context)
+			throws JobExecutionException {
+		JobDataMap maps = context.getMergedJobDataMap();
+		Long taskId = maps.getLong("id");
+		try {
+			System.err.println("执行定时任务");
+			ProcessAgreeBO processAgreeBO = new ProcessAgreeBO();
+			processAgreeBO.setTaskId(String.valueOf(taskId));
+			FlwTaskActor flwTaskActor = flwTaskActorMapper.selectOne(Wrappers.lambdaQuery(FlwTaskActor.class).eq(FlwTaskActor::getTaskId, taskId).last("LIMIT 1"));
+			if(Objects.isNull(flwTaskActor)){
+				System.err.println("该任务不存在");
+				return;
+			}
+			processAgreeBO.setRemark("自动审批");
+			processAgreeBO.setUserId(Long.valueOf(flwTaskActor.getActorId()));
+			stateProcessTemplateService.agree(processAgreeBO);
+			// 短信发送
+			SysUser sysUser = sysUserService.selectUserById(Long.valueOf(flwTaskActor.getActorId()));
+			smsUtil.sendSms(sysUser.getPhonenumber(), "2369951", new String[]{""});
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+	}
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/task/utils/SpringContextsUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/task/utils/SpringContextsUtil.java
new file mode 100644
index 0000000..558257f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/task/utils/SpringContextsUtil.java
@@ -0,0 +1,37 @@
+package com.ruoyi.system.task.utils;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SpringContextsUtil implements ApplicationContextAware{
+
+	private static ApplicationContext applicationContext;
+	 
+	@Override	
+	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {		
+		if (SpringContextsUtil.applicationContext == null) {			
+			SpringContextsUtil.applicationContext = applicationContext;		
+		}	
+	} 	
+	// 获取applicationContext	
+	public static ApplicationContext getApplicationContext() {		
+		return applicationContext;	
+	} 	
+	// 通过name获取 Bean.	
+	public static Object getBean(String name) {		
+		return getApplicationContext().getBean(name);	
+	} 	
+	// 通过class获取Bean.	
+	public static <T> T getBean(Class<T> clazz) {		
+		return getApplicationContext().getBean(clazz);	
+	} 	
+	// 通过name,以及Clazz返回指定的Bean	
+	public static <T> T getBean(String name, Class<T> clazz) {	
+		System.out.println(getApplicationContext().getBean(name, clazz));
+		return getApplicationContext().getBean(name, clazz);	
+	}
+    
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java
index 1816774..02f4eed 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java
@@ -1,5 +1,6 @@
 package com.ruoyi.system.vo;
 
+import com.aizuda.bpm.engine.entity.FlwHisTask;
 import com.ruoyi.system.model.StateProcessInstanceAction;
 import com.ruoyi.system.model.TContract;
 import io.swagger.annotations.ApiModel;
@@ -14,4 +15,7 @@
     @ApiModelProperty(value = "操作记录集合")
     private List<StateProcessInstanceAction> instanceActions;
 
+    @ApiModelProperty(value = "历史任务")
+    private List<FlwHisTask> flwHisTasks;
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java
index 337a265..cada03f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java
@@ -19,6 +19,7 @@
 public class ProcessTaskListVO {
 
     private String nodeName;
+    private String id;
 
     private String flowId;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TBillVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TBillVO.java
index 604ff8b..d45a85a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TBillVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TBillVO.java
@@ -37,9 +37,9 @@
     @ApiModelProperty(value = "甲方联系方式")
     private String partyOnePhone;
     @ApiModelProperty(value = "合同开始时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private LocalDateTime concatStartTime;
     @ApiModelProperty(value = "合同结束时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private LocalDateTime concatEndTime;
 }
diff --git a/ruoyi-system/src/main/resources/mapper/system/StateProcessInstanceActionMapper.xml b/ruoyi-system/src/main/resources/mapper/system/StateProcessInstanceActionMapper.xml
new file mode 100644
index 0000000..6dbf513
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/StateProcessInstanceActionMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.StateProcessInstanceActionMapper">
+
+
+    <insert id="saveData">
+        insert into state_process_instance_action(
+            id,
+            instance_id,
+            auditor_id,
+            action_type,
+            node_id,
+            remark,
+            pictures
+            values
+                (#{id},
+                #{instanceId},
+                #{auditorId},
+                #{actionType},
+                #{nodeId},
+                #{remark},
+                #{pictures})
+    </insert>
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml b/ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml
index f8488c0..6d4fd63 100644
--- a/ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml
@@ -52,7 +52,7 @@
                 AND tc.contract_name like concat('%',#{query.contractName},'%')
             </if>
             <if test="query.status != null and query.status !=''">
-                AND tc.status like concat('%',#{query.status},'%')
+                AND tc.status = #{query.status}
             </if>
             AND tc.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
         </where>
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index 477a6ee..a3fff3f 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -221,21 +221,17 @@
 		select * from sys_user
 	</select>
     <select id="pageList" resultType="com.ruoyi.system.vo.SysUserVO">
-		select u.user_id AS userId, u.dept_id AS deptId, u.user_name AS userName, u.nick_name AS nickName, u.email AS email, u.avatar AS avatar,
-			   u.phonenumber AS phonenumber, u.sex AS sex, u.status AS status, u.del_flag AS delFlag, u.login_ip AS loginIp,
+		select u.user_id AS userId, u.dept_id AS deptId, u.user_name AS userName, u.nick_name AS nickName, u.email AS email, u.avatar AS avatar,u.disable_remark AS disableRemark,
+			   u.phonenumber AS phonenumber, u.sex AS sex, u.status AS status, u.del_flag AS delFlag, u.login_ip AS loginIp,u.operating_time AS operatingTime,u.operating_person AS operatingPerson,
 			   u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark,u.ifBlack AS ifBlack, u.districtId AS districtId,
 			   r.role_id AS roleId, r.role_name AS roleName, r.role_key AS roleKey, r.role_sort AS roleSort, r.data_scope AS dataScope, r.status as role_status,u.deptName as deptName
 		from sys_user u
 		left join sys_user_role ur on u.user_id = ur.user_id
 		left join sys_role r on r.role_id = ur.role_id
-		left join t_dept_to_user tdtu on u.user_id = tdtu.user_id
 		WHERE u.del_flag = 0
-		<if test="query.nickNameAndPhone != null and query.nickNameAndPhone != ''">
-			AND (u.nick_name LIKE concat('%',#{query.nickNameAndPhone},'%')
-			    OR u.phonenumber LIKE concat('%',#{query.nickNameAndPhone},'%'))
-		</if>
-		<if test="query.roleId != null">
-			AND r.role_id = #{query.roleId}
+		<if test="query.nickNameOrPhone != null and query.nickNameOrPhone != ''">
+			AND (u.nick_name LIKE concat('%',#{query.nickNameOrPhone},'%')
+			    OR u.phonenumber LIKE concat('%',#{query.nickNameOrPhone},'%'))
 		</if>
 		<if test="query.status != null and query.status != ''">
 			AND u.status = #{query.status}
@@ -245,6 +241,12 @@
 			<foreach collection="query.deptIds" close=")" open="(" item="deptId" separator=",">
 				#{deptId}
 			</foreach>)
+		</if>
+		<if test="query.roleIds != null and query.roleIds.size()>0">
+			AND r.role_id IN
+			<foreach collection="query.roleIds" close=")" open="(" item="roleId" separator=",">
+				#{roleId}
+			</foreach>
 		</if>
 		ORDER BY u.create_time DESC
 	</select>
@@ -310,6 +312,9 @@
  			<if test="remark != null">remark = #{remark},</if>
 			<if test="ifBlack != null">ifBlack = #{ifBlack},</if>
 			<if test="districtId != null">districtId = #{districtId},</if>
+			<if test="disableRemark != null">disable_remark = #{disableRemark},</if>
+			<if test="operatingTime != null">operating_time = #{operatingTime},</if>
+			<if test="operatingPerson != null">operating_person = #{operatingPerson},</if>
  			update_time = sysdate()
  		</set>
  		where user_id = #{userId}
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml
index 9b0d3cd..9f93e27 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml
@@ -34,7 +34,7 @@
 		insert into sys_user_role(user_id, role_id) values (#{userRole.userId},#{userRole.roleId})
 	</insert>
     <insert id="insertBatchUserDept">
-		insert into sys_user_role(user_id, dept_id) values
+		insert into t_dept_to_user(user_id, dept_id) values
 		<foreach item="item" index="index" collection="deptToUserList" separator=",">
 			(#{item.userId},#{item.deptId})
 		</foreach>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml
index aaa1347..5415d26 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml
@@ -95,7 +95,7 @@
             </if>
             and b.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
         </where>
-        order by b.payable_fees_time
+        order by b.bill_type,b.payable_fees_time
     </select>
     <select id="invoiceList" resultType="com.ruoyi.system.dto.TBillDto">
         SELECT
diff --git a/ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml
index cbff79f..d1b8b4b 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml
@@ -54,7 +54,7 @@
         t.update_by,
         t.disabled,
         t.code,
-        t.checkMoney,
+        t.check_money,
         t.status,
         c.contract_number,
         h.house_name,
diff --git a/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
index c2abe7d..fa366f5 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
@@ -59,9 +59,12 @@
             <if test="query.status != null">
                 and t1.status = #{query.status}
             </if>
+            <if test="query.tenantId != null">
+                and t1.tenant_id = #{query.tenantId}
+            </if>
             AND t1.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
-
         </where>
+        order by t1.create_time desc
     </select>
     <select id="contractAppletList" resultType="com.ruoyi.system.model.TContract">
         select t1.* from t_contract t1
@@ -96,7 +99,7 @@
                     #{item}
                 </foreach>
             </if>
-            <if test="query.ids != null and query.ids.size()=0">
+            <if test="query.ids == null or query.ids.size()==0">
                 <if test="query.partyTwoName != null and query.partyTwoName != ''">
                     and t1.party_two_name like concat('%',#{query.partyTwoName},'%')
                 </if>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TDeptToUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TDeptToUserMapper.xml
index a740cf8..7fc30bd 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TDeptToUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TDeptToUserMapper.xml
@@ -13,6 +13,12 @@
     <sql id="Base_Column_List">
         id, dept_id, user_id
     </sql>
+    <insert id="insertBatchUserDept">
+        insert into t_dept_to_user (dept_id, user_id) values
+        <foreach collection="deptToUserList" item="item" separator=",">
+            (#{item.deptId},#{item.userId})
+        </foreach>
+    </insert>
     <delete id="deleteUserDeptByUserId">
         delete from t_dept_to_user where user_id=#{userId}
     </delete>
diff --git a/ruoyi-system/src/main/resources/mapper/system/THouseMapper.xml b/ruoyi-system/src/main/resources/mapper/system/THouseMapper.xml
index a4bb3e9..0eefc41 100644
--- a/ruoyi-system/src/main/resources/mapper/system/THouseMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/THouseMapper.xml
@@ -43,6 +43,7 @@
             </if>
             AND t1.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
         </where>
+        order by t1.create_time desc
     </select>
     <select id="userHistoryList" resultType="com.ruoyi.system.vo.HouseVO">
         select

--
Gitblit v1.7.1