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

---
 ruoyi-admin/src/main/resources/application-test.yml                                                 |   13 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessModuleMapper.java                    |    9 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCheckAcceptRecordController.java            |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessExtInstanceServiceImpl.java    |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TFaultRepairMessageServiceImpl.java        |    9 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java                         |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessModuleServiceImpl.java         |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java       |  785 +++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java                     |   12 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCheckAcceptRecordMapper.java                    |    2 
 ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml                                     |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java                               |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/model/THouse.java                                       |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessExtInstance.java                      |   29 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessUpdateBO.java                                 |   22 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java                    |   32 
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java          |    7 
 ruoyi-applet/src/main/resources/application-test.yml                                                |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TContractService.java                           |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TFaultRepairMessageService.java                 |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TFaultRepairMessageMapper.java                   |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCheckAcceptRecordServiceImpl.java         |   30 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessRefuseBO.java                                 |   27 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TFaultRepairMessage.java                          |   12 
 ruoyi-system/src/main/java/com/ruoyi/system/query/TTenantAppletQuery.java                           |   18 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TCheckAcceptRecord.java                           |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/HouseVO.java                                         |    4 
 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml                                     |    2 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TFaultRepairMessageController.java          |   24 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessCreateBO.java                                 |   21 
 ruoyi-system/src/main/resources/mapper/system/StateProcessTemplateMapper.xml                        |   15 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/PdfUtils.java                               |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/query/TFaultRepairMessageAppletQuery.java               |   16 
 ruoyi-common/src/main/java/com/ruoyi/common/enums/SubmitStatusEnum.java                             |   33 
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessModuleService.java                  |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessModuleUpdateBO.java                           |   19 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/MyHouseVO.java                                       |   40 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java                                  |   26 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TInformation.java                                 |    4 
 ruoyi-system/src/main/resources/mapper/system/THouseMapper.xml                                      |    2 
 ruoyi-system/src/main/resources/mapper/system/TInformationMapper.xml                                |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTenantController.java                       |   81 +
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessTemplateMapper.java                  |   15 
 ruoyi-system/src/main/resources/mapper/system/TFaultRepairMessageMapper.xml                         |   46 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ExamineVO.java                                       |   31 
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java                            |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java                     |   55 
 ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessModule.java                           |   39 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTemplatePageBO.java                           |   12 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java                   |  246 +++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java                  |   37 
 ruoyi-system/src/main/java/com/ruoyi/system/query/TContractQuery.java                               |    6 
 ruoyi-common/src/main/java/com/ruoyi/common/exception/state/StateErrorCode.java                     |   19 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java            |   24 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTenantMapper.java                               |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java                |   46 
 ruoyi-system/src/main/java/com/ruoyi/system/query/TExamineAppletQuery.java                          |   36 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java                                 |   17 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java            |    7 
 ruoyi-common/src/main/java/com/ruoyi/common/enums/ProcessCategoryEnum.java                          |   51 
 ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml                          |   26 
 ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java                                           |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TTenantService.java                             |   18 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TCheckAcceptRecordVO.java                            |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/THouseServiceImpl.java                     |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTenantServiceImpl.java                    |   98 +
 ruoyi-applet/src/main/java/com/ruoyi/web/core/config/MybatisPlusConfig.java                         |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/PayListVO.java                                       |   20 
 ruoyi-system/src/main/java/com/ruoyi/system/export/ContractExport.java                              |   14 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TCheckAcceptRecordService.java                  |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/core/config/DataUpdateHandlerConfig.java                    |   24 
 ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml                             |   62 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java                      |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java                             |   30 
 ruoyi-system/src/main/resources/mapper/system/TItemTypeMapper.xml                                   |   16 
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseModel.java                              |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessExtInstanceMapper.java               |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java                              |   42 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java                 |  209 +++
 ruoyi-system/src/main/java/com/ruoyi/system/bo/DeployBO.java                                        |   15 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBannerMapper.java                               |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBannerServiceImpl.java                    |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java                                    |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/TExamineDTO.java                                    |   15 
 ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java                   |   46 
 ruoyi-applet/src/main/java/com/ruoyi/web/core/config/DataUpdateHandlerConfig.java                   |   61 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java                               |  150 ++
 ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java                                |   26 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TContractAppletVO.java                               |   28 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java                  |    5 
 ruoyi-system/src/main/resources/mapper/system/TTenantMapper.xml                                     |   69 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TenantVO.java                                        |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/query/TCheckAcceptRecordAppletQuery.java                |   18 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java                    |    4 
 ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MybatisPlusConfig.java                          |    2 
 ruoyi-system/src/main/resources/mapper/system/TBannerMapper.xml                                     |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessExtInstanceService.java             |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TItemTypeService.java                           |    2 
 ruoyi-admin/pom.xml                                                                                 |   12 
 ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml                                   |    8 
 ruoyi-common/src/main/java/com/ruoyi/common/enums/StateProcessActionEnum.java                       |   26 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java                               |   45 
 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessStartBO.java                                  |   57 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TItemTypeMapper.java                             |    2 
 ruoyi-applet/pom.xml                                                                                |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java                       |   23 
 ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessTemplate.java                         |   49 
 ruoyi-common/pom.xml                                                                                |   14 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/IndexController.java                        |  418 ++++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java                    |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java                  |  209 +++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TItemTypeServiceImpl.java                  |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/MyToDoVO.java                                        |   23 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java                    |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TBannerService.java                             |    3 
 116 files changed, 3,942 insertions(+), 120 deletions(-)

diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 3aa3a62..97f4520 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -26,6 +26,11 @@
             <artifactId>aliyun-sdk-oss</artifactId>
             <version>3.8.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>31.1-jre</version> <!-- 请根据需要选择合适的版本 -->
+        </dependency>
         <!-- spring-boot-devtools -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -93,13 +98,6 @@
 <!--                    <artifactId>pagehelper-spring-boot-starter</artifactId>-->
 <!--                </exclusion>-->
 <!--            </exclusions>-->
-        </dependency>
-
-        <!--二维码开发工具集-->
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>4.6.10</version>
         </dependency>
 
         <!-- zxing生成二维码 -->
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
index b5354e9..558fe10 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -5,12 +5,14 @@
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.core.env.Environment;
 import org.springframework.http.client.SimpleClientHttpRequestFactory;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.web.client.RestTemplate;
+import springfox.documentation.oas.annotations.EnableOpenApi;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -21,6 +23,8 @@
  * @author ruoyi
  */
 @Slf4j
+@EnableOpenApi
+@EnableCaching
 @EnableScheduling//开启定时任务
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
 public class RuoYiApplication
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
new file mode 100644
index 0000000..46e24ae
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
@@ -0,0 +1,209 @@
+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;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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;
+import com.ruoyi.system.vo.ProcessDetailVO;
+import com.ruoyi.system.vo.ProcessTaskListVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Api(tags = "审批流程管理")
+@RequestMapping("/state-process")
+@RestController
+@RequiredArgsConstructor
+public class StateProcessController {
+
+    private final StateProcessTemplateService processTemplateService;
+    private final StateProcessModuleService processModuleService;
+    private final ISysUserService sysUserService;
+
+    //应用流程分页列表
+    @ApiOperation("应用流程分页列表")
+    @PostMapping("/module/page")
+    public AjaxResult<List<StateProcessModule>> modulePage(@RequestBody BasePage basePage) {
+        LambdaQueryWrapper<StateProcessModule> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.orderByAsc(StateProcessModule::getCategory);
+        //查询应用流程列表
+        List<StateProcessModule> result = processModuleService.list(queryWrapper);
+        List<String> updateUserId = result.stream().map(BaseModel::getUpdateBy).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(updateUserId)){
+            //根据用户id查询用户信息
+            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
+            Map<Long, SysUser> sysUserMap;
+            if (!CollectionUtils.isEmpty(sysUsers)){
+                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
+            } else {
+                sysUserMap = new HashMap<>();
+            }
+            //遍历列表,设置更新人名称
+            result.forEach(e -> {
+                SysUser sysUser = sysUserMap.get(e.getUpdateBy());
+                if (Objects.nonNull(sysUser)){
+                    e.setUpdateBy(sysUser.getNickName());
+                }
+            });
+        }
+        return AjaxResult.success(result);
+    }
+    //修改应用流程
+    @Log(title = "审批流程管理-修改应用流程", businessType = BusinessType.UPDATE)
+    @ApiOperation("修改应用流程")
+    @PostMapping("/module/update")
+    public AjaxResult<PageInfo<StateProcessModule>> moduleUpdate(@RequestBody ProcessModuleUpdateBO processModuleUpdateBO) {
+        StateProcessTemplate stateProcessTemplate = processTemplateService.getById(processModuleUpdateBO.getTemplateId());
+        if (Objects.isNull(stateProcessTemplate)) {
+            return AjaxResult.success();
+        }
+        StateProcessModule stateProcessModule = new StateProcessModule();
+        stateProcessModule.setId(processModuleUpdateBO.getId());
+        stateProcessModule.setTemplateId(processModuleUpdateBO.getTemplateId());
+        stateProcessModule.setTemplateName(stateProcessTemplate.getTemplateName());
+        stateProcessModule.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
+        stateProcessModule.setCreateTime(LocalDateTime.now());
+        stateProcessModule.setUpdateTime(LocalDateTime.now());
+        stateProcessModule.setRemark(processModuleUpdateBO.getRemark());
+        processModuleService.updateById(stateProcessModule);
+        return AjaxResult.success();
+    }
+
+    //流程模版分页
+    @ApiOperation("流程模版分页")
+    @PostMapping("/template/page")
+    public AjaxResult<Page<StateProcessTemplate>> page(ProcessTemplatePageBO request) {
+        Page<StateProcessTemplate> templatePage = processTemplateService.page(request);
+        return AjaxResult.success(templatePage);
+    }
+
+    //查询流程模版
+    @ApiOperation("查询流程模版")
+    @GetMapping("/template/getById")
+    public AjaxResult<StateProcessTemplate> selectById(@RequestParam String id) {
+        return AjaxResult.success(processTemplateService.getById(id));
+    }
+
+    //修改并部署模版
+    @Log(title = "审批流程管理-修改并部署模版", businessType = BusinessType.UPDATE)
+    @ApiOperation("修改并部署模版")
+    @PostMapping("/template/update")
+    public AjaxResult<Boolean> update(@RequestBody ProcessUpdateBO processUpdateBO) {
+        return AjaxResult.success(processTemplateService.update(processUpdateBO));
+    }
+
+    //删除模版
+    @Log(title = "审批流程管理-删除模版", businessType = BusinessType.DELETE)
+    @ApiOperation("删除模版")
+    @GetMapping("/template/deleteById")
+    public AjaxResult<Boolean> deleteById(@RequestParam String id) {
+        StateProcessTemplate template = processTemplateService.getById(id);
+        //查询是否存在使用的
+        LambdaUpdateWrapper<StateProcessModule> moduleLambdaUpdateWrapper = new LambdaUpdateWrapper<>();;
+        moduleLambdaUpdateWrapper.eq(StateProcessModule::getTemplateId, template.getId());
+        if (processModuleService.getBaseMapper().exists(moduleLambdaUpdateWrapper)) {
+            throw new GlobalException("该模版在应用流程中已使用!");
+        }
+        //根据key修改所有版本为已删除
+        boolean result = processTemplateService.remove(Wrappers.lambdaQuery(StateProcessTemplate.class)
+                .eq(StateProcessTemplate::getTemplateKey, template.getTemplateKey()));
+        return AjaxResult.success(result);
+    }
+
+    //创建并部署模版
+    @Log(title = "审批流程管理-创建并部署模版", businessType = BusinessType.INSERT)
+    @ApiOperation("创建并部署模版")
+    @PostMapping("/template/create")
+    public AjaxResult<Boolean> create(@RequestBody ProcessCreateBO processCreateBO) {
+        return AjaxResult.success(processTemplateService.create(processCreateBO));
+    }
+
+    //流程发起
+    @Log(title = "审批流程管理-流程发起", businessType = BusinessType.INSERT)
+    @ApiOperation("流程发起")
+    @PostMapping("/start")
+    public AjaxResult<Boolean> start(@RequestBody ProcessStartBO processStartBO) {
+        return AjaxResult.success(processTemplateService.start(processStartBO));
+    }
+
+    //待办
+    @ApiOperation("待办列表")
+    @PostMapping("/wait/task/page")
+    public AjaxResult<PageInfo<ProcessTaskListVO>> waitTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
+        return AjaxResult.success(processTemplateService.waitTaskPage(processTemplatePageBO));
+    }
+
+    //已办
+    @ApiOperation("已办列表")
+    @PostMapping("/deal/task/page")
+    public AjaxResult<PageInfo<ProcessTaskListVO>> dealTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
+        return AjaxResult.success(processTemplateService.dealTaskPage(processTemplatePageBO));
+    }
+
+    //待办和已办列表
+    @ApiOperation("待办和已办列表")
+    @PostMapping("/dealAndWait/task/page")
+    public AjaxResult<PageInfo<ProcessTaskListVO>> dealAndWaitTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
+        return AjaxResult.success(processTemplateService.dealAndWaitTaskPage(processTemplatePageBO));
+    }
+
+    //抄送
+    @ApiOperation("抄送列表")
+    @PostMapping("/copy/task/page")
+    public AjaxResult<PageInfo<ProcessTaskListVO>> copyTaskPage(@RequestBody ProcessTaskListBO processTaskListBO){
+        return AjaxResult.success(processTemplateService.copyTaskPage(processTaskListBO));
+    }
+
+    //审核通过
+    @Log(title = "审批流程管理-审核通过", businessType = BusinessType.UPDATE)
+    @ApiOperation("审核通过")
+    @PostMapping("/agree")
+    public AjaxResult<Object> agree(@RequestBody ProcessAgreeBO processAgreeBO) {
+        processTemplateService.agree(processAgreeBO);
+        return AjaxResult.success();
+    }
+
+    //审核拒绝
+    @Log(title = "审批流程管理-审核拒绝", businessType = BusinessType.UPDATE)
+    @ApiOperation("审核拒绝")
+    @PostMapping("/refuse")
+    public AjaxResult<Object> refuse(@RequestBody ProcessRefuseBO processRefuseBO) {
+        processTemplateService.refuse(processRefuseBO);
+        return AjaxResult.success();
+    }
+
+    //审核详情
+    @ApiOperation("审核详情")
+    @GetMapping("/detail")
+    public AjaxResult<ProcessDetailVO> detail(@RequestParam String taskId) {
+        ProcessDetailVO detail = processTemplateService.detail(taskId);
+        return AjaxResult.success(detail);
+    }
+
+}
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 a7146f1..443cedc 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
@@ -10,6 +10,7 @@
 import com.ruoyi.system.query.TBillQuery;
 import com.ruoyi.system.service.TBillDetailService;
 import com.ruoyi.system.service.TBillService;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -27,6 +28,7 @@
  * @author xiaochen
  * @since 2025-01-17
  */
+@Api(tags = "账单管理")
 @RestController
 @RequestMapping("/t-bill")
 public class TBillController {
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 b6dee08..721d961 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
@@ -1,6 +1,7 @@
 package com.ruoyi.web.controller.api;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
@@ -22,6 +23,8 @@
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -90,6 +93,12 @@
     @ApiOperation(value = "添加验收记录")
     @PostMapping(value = "/add")
     public R<Boolean> add(@Validated @RequestBody TCheckAcceptRecord dto) {
+        dto.setAcceptanceTime(dto.getCheckTime());
+        LocalDate now = LocalDate.now();
+        String replace = (now + "").replace("-", "");
+        int size = checkAcceptRecordService.list(new LambdaQueryWrapper<TCheckAcceptRecord>()
+                .likeRight(TCheckAcceptRecord::getAcceptanceTime, LocalDate.now())).size();
+        dto.setCode(replace.substring(2)+String.format("%03d", size+1));
         // 添加验收记录
         checkAcceptRecordService.save(dto);
 
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 692c8c5..bb120fb 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,6 +3,7 @@
 
 import cn.afterturn.easypoi.excel.ExcelExportUtil;
 import cn.afterturn.easypoi.excel.entity.ExportParams;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
@@ -10,14 +11,10 @@
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.common.utils.DateUtils;
-import com.ruoyi.common.utils.DictUtils;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.WebUtils;
-import com.ruoyi.system.dto.SetContractDto;
-import com.ruoyi.system.dto.TContractDTO;
-import com.ruoyi.system.dto.THouseDTO;
-import com.ruoyi.system.dto.TerminateContractDTO;
+import com.ruoyi.common.enums.ProcessCategoryEnum;
+import com.ruoyi.common.utils.*;
+import com.ruoyi.system.bo.ProcessStartBO;
+import com.ruoyi.system.dto.*;
 import com.ruoyi.system.export.ContractExport;
 import com.ruoyi.system.export.OpticalInspectionExport;
 import com.ruoyi.system.model.*;
@@ -74,9 +71,11 @@
     private TBillService billService;
     @Autowired
     private TCheckAcceptRecordService checkAcceptRecordService;
+    @Autowired
+    private StateProcessTemplateService stateProcessTemplateService;
+
     @ApiOperation(value = "测试生成账单")
     @PostMapping(value = "/testBill")
-
     public R testBill(String id) {
         TContract contract = contractService.getById(id);
         // 查询所有已签订的合同并且未生成第一笔账单的
@@ -191,6 +190,22 @@
     public R<Boolean> addContract(@Validated @RequestBody TContractDTO dto) {
         dto.setChangeRent(dto.getMonthRent());
         contractService.save(dto);
+        if (dto.getStatus().equals("2")){
+            //发起合同新增审批
+            ProcessStartBO processStartBO = new ProcessStartBO();
+            processStartBO.setCategory(ProcessCategoryEnum.CATEGORY1.getValue().toString());
+            processStartBO.setModuleName("合同新增审批");
+            processStartBO.setName(dto.getContractName());
+            //需要显示发起申请人所在单位
+//            String cedName = SecurityUtils.getLoginUser().getUser().getDept().getDeptName();
+//            String remark = String.format("【镇/街】:%s,【征收实施单位】:%s,【申请金额】:%s万元", stateProject.getStreet(), cedName, stateApplyRecord.getAmount());
+            processStartBO.setRemark("");
+            Map<String, Object> variable = new HashMap<>();
+            variable.put("projectId", dto.getId());
+            processStartBO.setVariable(variable);
+            //开启工作流程
+            stateProcessTemplateService.start(processStartBO);
+        }
         if (dto.getIsIncreasing()){
             TContractRentType tContractRentType = new TContractRentType();
             tContractRentType.setContractId(dto.getId());
@@ -207,7 +222,6 @@
     @ApiOperation(value = "编辑合同")
     @PostMapping(value = "/updateContract")
     @PreAuthorize("@ss.hasPermi('system:contract:update')")
-
     public R<Boolean> updateContract(@Validated @RequestBody TContractDTO dto) {
         contractService.updateById(dto);
         contractRentTypeService.remove(new LambdaQueryWrapper<TContractRentType>()
@@ -229,8 +243,7 @@
     @PreAuthorize("@ss.hasPermi('system:contract:delete')")
 
     @DeleteMapping(value = "/deleteContractByIds")
-    public R<Boolean> deleteContractByIds
-            (@RequestParam String ids) {
+    public R<Boolean> deleteContractByIds(@RequestParam String ids) {
         if (StringUtils.isNotEmpty(ids)){
             contractService.removeBatchByIds(Arrays.asList(ids.split(",")));
         }
@@ -240,7 +253,6 @@
     @ApiOperation(value = "查询合同信息信息")
     @GetMapping(value = "/getContractById")
     @PreAuthorize("@ss.hasPermi('system:contract:detail')")
-
     public R<TContractVO> getContractById(@RequestParam String id) {
         TContractVO res = new TContractVO();
         TContract contract = contractService.getById(id);
@@ -309,6 +321,7 @@
     @PreAuthorize("@ss.hasPermi('system:contract:terminate')")
     public R terminateContract(@RequestBody TerminateContractDTO dto) {
         contractService.terminateContract(dto);
+        // 生成房屋验收记录 待验收
         return R.ok();
     }
     @ApiOperation(value = "根据合同id查看验收记录")
@@ -337,8 +350,10 @@
             templateParam.put("endTime", DateUtils.localDateTimeToStringYear(contract.getEndTime()));
             templateParam.put("monthRent", "¥¥"+contract.getMonthRent()+"元");
             templateParam.put("monthRentString", "人民币"+NumberToChineseUtils.numberToChinese(contract.getMonthRent().setScale(2, BigDecimal.ROUND_DOWN).doubleValue()));
-            templateParam.put("totalYear", "¥¥"+contract.getTotalYear()+"元");
-            templateParam.put("totalYearString", "人民币"+NumberToChineseUtils.numberToChinese(contract.getTotalYear().setScale(2, BigDecimal.ROUND_DOWN).doubleValue()));
+            String totalYear = Objects.nonNull(contract.getTotalYear())?contract.getTotalYear().toString():"";
+            templateParam.put("totalYear", "¥¥"+totalYear+"元");
+            String totalYearString = StringUtils.isNotEmpty(totalYear)?NumberToChineseUtils.numberToChinese(contract.getTotalYear().setScale(2, BigDecimal.ROUND_DOWN).doubleValue()):"";
+            templateParam.put("totalYearString", "人民币"+totalYearString);
             templateParam.put("payType", contract.getPayType().equals("1")?"月":contract.getPayType().equals("2")?"季":"年");
             templateParam.put("firstRent", "¥"+(contract.getPayType().equals("1")?contract.getMonthRent():contract.getPayType().equals("2")?contract.getMonthRent().multiply(new BigDecimal("3")):contract.getMonthRent().multiply(new BigDecimal("12"))).setScale(2,BigDecimal.ROUND_DOWN)+"元");
             templateParam.put("firstRentString", "人民币"+NumberToChineseUtils.numberToChinese((contract.getPayType().equals("1")?contract.getMonthRent():contract.getPayType().equals("2")?contract.getMonthRent().multiply(new BigDecimal("3")):contract.getMonthRent().multiply(new BigDecimal("12")).setScale(2,BigDecimal.ROUND_DOWN)).doubleValue()));
@@ -349,7 +364,7 @@
             templateParam.put("partyOnePhone", contract.getPartyOnePhone());
             templateParam.put("partyTwoPerson", contract.getPartyTwoPerson());
             templateParam.put("partyTwoPhone", contract.getPartyTwoPhone());
-            String url = wordUtil.generatePdf("/templates", "1_yzj_租赁合同.xml", templateParam, "租赁合同", "E:\\");
+            String url = wordUtil.generatePdf("/template", "1_yzj_租赁合同.xml", templateParam, "租赁合同", "E:\\");
             res.add(url);
         }
 
@@ -373,12 +388,13 @@
             contractExport.setContractName(contract.getContractName());
             contractExport.setPartyOneName(contract.getPartyOneName());
             contractExport.setPartyTwoName(contract.getPartyTwoName());
-            contractExport.setCreate_time(contract.getCreateTime());
-            contractExport.setStartTime(contract.getStartTime());
-            contractExport.setEndTime(contract.getEndTime());
+            contractExport.setCreateTime(DateUtils.localDateTimeToStringYear(contract.getCreateTime()));
+            contractExport.setStartTime(DateUtils.localDateTimeToStringYear(contract.getStartTime()));
+            contractExport.setEndTime(DateUtils.localDateTimeToStringYear(contract.getEndTime()));
             contractExport.setPayType(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CONTRACT_PAY_TYPE,contract.getPayType()));
             contractExport.setDeposit(contract.getDeposit()+"");
             contractExport.setStatus(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CONTRACT_STATUS,contract.getStatus()));
+            contractExports.add(contractExport);
         }
         Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), ContractExport.class, contractExports);
         HttpServletResponse response = WebUtils.response();
@@ -395,7 +411,6 @@
             workbook.write(outputStream);
         } catch (IOException e) {
             e.printStackTrace();
-            System.err.println("合同列表信息导出失败");
         } finally {
             try {
                 outputStream.close();
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 5a2b9b7..ad65a32 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
@@ -1,26 +1,37 @@
 package com.ruoyi.web.controller.api;
 
 
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 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.enums.BusinessType;
-import com.ruoyi.common.utils.DictUtils;
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.*;
 import com.ruoyi.system.dto.TTenantDTO;
+import com.ruoyi.system.export.ContractExport;
+import com.ruoyi.system.model.TContract;
 import com.ruoyi.system.model.TTenant;
+import com.ruoyi.system.query.TContractQuery;
 import com.ruoyi.system.query.TTenantQuery;
+import com.ruoyi.system.service.TContractService;
 import com.ruoyi.system.service.TTenantService;
 import com.ruoyi.system.vo.TenantVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -37,9 +48,11 @@
 public class TTenantController {
 
     private final TTenantService tenantService;
+    private final TContractService contractService;
     @Autowired
-    public TTenantController(TTenantService tenantService) {
+    public TTenantController(TTenantService tenantService, TContractService contractService) {
         this.tenantService = tenantService;
+        this.contractService = contractService;
     }
 
     /**
@@ -88,9 +101,16 @@
     @GetMapping(value = "/getDetailById")
     public R<TTenant> getDetailById(@RequestParam String id) {
         TTenant tenant = tenantService.getById(id);
-        tenant.setTenantAttributes(DictUtils.getDictLabel(DictConstants.DICT_TYPE_TENANT_ATTRIBUTE,tenant.getTenantAttributes()));
-        tenant.setTenantType(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) {
+        return R.ok(contractService.list(Wrappers.lambdaQuery(TContract.class).eq(TContract::getTenantId, tenantId)));
     }
 
     /**
@@ -115,5 +135,54 @@
         return R.ok(tenantService.removeByIds(ids));
     }
 
+    /**
+     * 导出
+     */
+    @ApiOperation(value = "导出")
+    @PreAuthorize("@ss.hasPermi('system:contract:export')")
+    @Log(title = "导出", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void exportOpticalInspection(@Validated @RequestBody TContractQuery query)
+    {
+        List<ContractExport> contractExports = new ArrayList<>();
+        List<TContract> exportList = contractService.list(Wrappers.lambdaQuery(TContract.class).eq(TContract::getTenantId, query.getTenantId()));
+        for (TContract contract : exportList) {
+            ContractExport contractExport = new ContractExport();
+            contractExport.setContractNumber(contract.getContractNumber());
+            contractExport.setContractName(contract.getContractName());
+            contractExport.setPartyOneName(contract.getPartyOneName());
+            contractExport.setPartyTwoName(contract.getPartyTwoName());
+            contractExport.setCreateTime(DateUtils.localDateTimeToStringYear(contract.getCreateTime()));
+            contractExport.setStartTime(DateUtils.localDateTimeToStringYear(contract.getStartTime()));
+            contractExport.setEndTime(DateUtils.localDateTimeToStringYear(contract.getEndTime()));
+            contractExport.setPayType(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CONTRACT_PAY_TYPE,contract.getPayType()));
+            contractExport.setDeposit(contract.getDeposit()+"");
+            contractExport.setStatus(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CONTRACT_STATUS,contract.getStatus()));
+            contractExports.add(contractExport);
+        }
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), ContractExport.class, contractExports);
+        HttpServletResponse response = WebUtils.response();
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        ServletOutputStream outputStream = null;
+        try {
+            String fileName = URLEncoder.encode("合同列表.xls", "utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+            System.err.println("合同列表信息导出失败");
+        } finally {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
index ce381d6..494ff97 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
@@ -116,7 +116,7 @@
         return AjaxResult.success(roleService.selectRoleById(roleId));
     }
 
-    @PreAuthorize("@ss.hasPermi('system:role:detail')")
+//    @PreAuthorize("@ss.hasPermi('system:role:detail')")
     @ApiOperation("角色详情")
     @GetMapping("/roleInfo")
     public AjaxResult roleInfo(@RequestParam Long roleId)
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 27aea74..f2ff0c8 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
@@ -192,7 +192,9 @@
         }
 
         user.setUpdateBy(getUsername());
-        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        if(StringUtils.isNotEmpty(user.getPassword())){
+            user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        }
         return AjaxResult.success(userService.updateUser(user));
     }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/PdfUtils.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/PdfUtils.java
index 2668c3c..71c5a6c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/PdfUtils.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/PdfUtils.java
@@ -1,7 +1,5 @@
 package com.ruoyi.web.controller.tool;
 
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.http.HttpUtil;
 import com.documents4j.api.DocumentType;
 import com.documents4j.api.IConverter;
 import com.documents4j.job.LocalConverter;
@@ -11,11 +9,9 @@
 import org.springframework.stereotype.Component;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.annotation.Resource;
 import java.io.*;
 import java.net.URL;
 import java.nio.file.Files;
-import java.util.HashMap;
 
 @Slf4j
 @Component
@@ -213,7 +209,7 @@
     }
 
     public String test(String fileName){
-        String url = "file:///D:\\"+fileName;
+        String url = "file:///E:\\"+fileName;
 //        String filePath = "E:\\qiyeweixin\\WXWork\\1688855207501340\\Cache\\File\\2024-09";
 //        String fileName = "专业技术工作总结.docx";4
         String filePath = "E:\\";
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/DataUpdateHandlerConfig.java b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/DataUpdateHandlerConfig.java
similarity index 68%
rename from ruoyi-common/src/main/java/com/ruoyi/common/config/DataUpdateHandlerConfig.java
rename to ruoyi-admin/src/main/java/com/ruoyi/web/core/config/DataUpdateHandlerConfig.java
index 7b7dba6..e5836a2 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/config/DataUpdateHandlerConfig.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/DataUpdateHandlerConfig.java
@@ -1,6 +1,8 @@
-package com.ruoyi.common.config;
+package com.ruoyi.web.core.config;
 
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.reflection.MetaObject;
 import org.springframework.context.annotation.Configuration;
@@ -27,14 +29,15 @@
     @Override
     public void insertFill(MetaObject metaObject) {
         //  获取登录信息
-       /* String userName = JwtTokenUtils.getUsername();
+        String userName = SecurityUtils.getUsername();
         if (StringUtils.isNotBlank(userName)) {
             this.setFieldValByName("createBy", userName, metaObject);
             this.setFieldValByName("updateBy", userName, metaObject);
         } else {
-            this.setFieldValByName("createBy", "", metaObject);
-            this.setFieldValByName("updateBy", "", metaObject);
-        }*/
+            this.setFieldValByName("createBy", userName, metaObject);
+            this.setFieldValByName("updateBy", userName, metaObject);
+        }
+
     }
 
     /**
@@ -45,13 +48,14 @@
     @Override
     public void updateFill(MetaObject metaObject) {
         //  获取登录信息
-        /*String userName = JwtTokenUtils.getUsername();
-        if (StringUtils.isNotBlank(userName)) {
+        String userName = SecurityUtils.getUsername();
+        if (StringUtils.isNotBlank(userName)){
             this.setFieldValByName("createBy", userName, metaObject);
             this.setFieldValByName("updateBy", userName, metaObject);
         } else {
-            this.setFieldValByName("createBy", "", metaObject);
-            this.setFieldValByName("updateBy", "", metaObject);
-        }*/
+            this.setFieldValByName("createBy", userName, metaObject);
+            this.setFieldValByName("updateBy", userName, metaObject);
+        }
+
     }
 }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/MybatisPlusConfig.java b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MybatisPlusConfig.java
similarity index 97%
rename from ruoyi-common/src/main/java/com/ruoyi/common/config/MybatisPlusConfig.java
rename to ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MybatisPlusConfig.java
index 1366f2b..fac9a9f 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/config/MybatisPlusConfig.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MybatisPlusConfig.java
@@ -1,4 +1,4 @@
-package com.ruoyi.common.config;
+package com.ruoyi.web.core.config;
 
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
diff --git a/ruoyi-admin/src/main/resources/application-test.yml b/ruoyi-admin/src/main/resources/application-test.yml
index 93fd2c2..54159c4 100644
--- a/ruoyi-admin/src/main/resources/application-test.yml
+++ b/ruoyi-admin/src/main/resources/application-test.yml
@@ -70,6 +70,13 @@
   # redis 配置
   redis:
     # 地址
+#    host: 127.0.0.1
+#    # 端口,默认为6379
+#    port: 6379
+#    # 数据库索引
+#    database: 0
+#    # 密码
+#    password: 123456
     host: xzgt.test.591taxi.cn
     # 端口,默认为6379
     port: 16379
@@ -213,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: 四川金达通信工程
\ No newline at end of file
diff --git a/ruoyi-applet/pom.xml b/ruoyi-applet/pom.xml
index f18e8ca..b02986c 100644
--- a/ruoyi-applet/pom.xml
+++ b/ruoyi-applet/pom.xml
@@ -95,13 +95,6 @@
 <!--            </exclusions>-->
         </dependency>
 
-        <!--二维码开发工具集-->
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>4.6.10</version>
-        </dependency>
-
         <!-- zxing生成二维码 -->
         <dependency>
             <groupId>com.google.zxing</groupId>
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/IndexController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/IndexController.java
new file mode 100644
index 0000000..fdc926c
--- /dev/null
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/IndexController.java
@@ -0,0 +1,418 @@
+package com.ruoyi.web.controller.api;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+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.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+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.TBillDto;
+import com.ruoyi.system.dto.TInvoiceDTO;
+import com.ruoyi.system.model.*;
+import com.ruoyi.system.query.*;
+import com.ruoyi.system.service.*;
+import com.ruoyi.system.vo.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import jdk.nashorn.internal.parser.Token;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
+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.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 租金账单 前端控制器
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-01-17
+ */
+@Api(tags = "首页")
+@RestController
+@RequestMapping("/t-index")
+public class IndexController {
+
+    @Autowired
+    private TBannerService bannerService;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private TContractService contractService;
+    @Autowired
+    private TBillService billService;
+    @Autowired
+    private THouseService houseService;
+    @Autowired
+    private TFaultRepairMessageService tFaultRepairMessageService;
+    @Autowired
+    private TCheckAcceptRecordService checkAcceptRecordService;
+    @Autowired
+    private TTenantService tenantService;
+    @Autowired
+    private ISysUserService sysUserService;
+    @Autowired
+    private TContractRentTypeService contractRentTypeService;
+    /**
+     * 获取轮播图管理列表
+     */
+    @ApiOperation(value = "获取轮播图列表")
+    @PostMapping(value = "/list")
+    public R<List<TBanner>> list(@RequestBody TBannerQuery query) {
+        return R.ok(bannerService.list(query));
+    }
+
+    /**
+     * 获取轮播图管理列表
+     */
+    @ApiOperation(value = "租户-我的待办")
+    @PostMapping(value = "/tenant/myToDo")
+    public R<MyToDoVO> tenantMyToDo() {
+        MyToDoVO myToDoVO = new MyToDoVO();
+        LoginUserApplet loginUserApplet = tokenService.getLoginUserApplet();
+        if (loginUserApplet != null) {
+            long contractCount = contractService.count(new LambdaQueryWrapper<TContract>()
+                    .eq(TContract::getStatus, 3).eq(TContract::getTenantId, loginUserApplet.getUserId()));
+            myToDoVO.setContractCount((int) contractCount);
+            List<String> contractIds = contractService.lambdaQuery().eq(TContract::getTenantId, loginUserApplet.getUserId()).list()
+                    .stream().map(TContract::getId).collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(contractIds)) {
+                myToDoVO.setBillCount(0);
+                myToDoVO.setContractCount(0);
+                return R.ok(myToDoVO);
+            }
+            int billCount = billService.lambdaQuery().in(TBill::getContractId, contractIds).eq(TBill::getPayFeesStatus, 1).list().size();
+            myToDoVO.setBillCount(billCount);
+        } else {
+            myToDoVO.setBillCount(0);
+            myToDoVO.setContractCount(0);
+        }
+        return R.ok(myToDoVO);
+    }
+
+    @ApiOperation(value = "租户-当前在租房源")
+    @PostMapping(value = "/tenant/myHouse")
+    public R<List<MyHouseVO>> myHouse() {
+        List<MyHouseVO> myHouseVOS = new ArrayList<>();
+        LoginUserApplet loginUserApplet = tokenService.getLoginUserApplet();
+
+        if (loginUserApplet != null) {
+            List<TContract> contractList = contractService.lambdaQuery().eq(TContract::getTenantId, loginUserApplet.getUserId())
+                    .eq(TContract::getStatus, 4).list();
+            List<THouse> houseList = houseService.list();
+            List<TBill> bills = billService.lambdaQuery().orderByDesc(TBill::getPayableFeesTime).list();
+            for (TContract contract : contractList) {
+                THouse tHouse = houseList.stream().filter(e -> e.getId().equals(contract.getHouseId())).findFirst().orElse(null);
+                TBill bill = bills.stream().filter(e -> e.getContractId().equals(contract.getId()) && e.getPayFeesStatus().equals("3")).findFirst().orElse(null);
+                if (bill == null) {
+                    bill = bills.stream().filter(e -> e.getContractId().equals(contract.getId())).findFirst().orElse(null);
+                }
+                if (tHouse != null && bill != null) {
+                    MyHouseVO myToDoVO = new MyHouseVO();
+                    myToDoVO.setId(contract.getId());
+                    myToDoVO.setHouseAddress(tHouse.getHouseAddress());
+                    myToDoVO.setMonthRent(contract.getMonthRent());
+                    myToDoVO.setPayType(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CONTRACT_PAY_TYPE, contract.getPayType()));
+                    myToDoVO.setMonth(bill.getPayFeesTime() == null ? bill.getPayableFeesTime().getMonth() + "月" : bill.getPayFeesTime().getMonth() + "月");
+                    myToDoVO.setHouseArea(tHouse.getHouseArea());
+                    myToDoVO.setHouseType(tHouse.getHouseType());
+                    myToDoVO.setEndTime(DateUtils.localDateTimeToStringYear(contract.getEndTime()));
+                    myToDoVO.setStartTime(DateUtils.localDateTimeToStringYear(contract.getStartTime()));
+                    myToDoVO.setPropertyRightPerson(tHouse.getPropertyRightPerson());
+                    myToDoVO.setPhone(tHouse.getPhone());
+                    List<TBill> billList = bills.stream().filter(e -> e.getContractId().equals(contract.getId())).collect(Collectors.toList());
+                    List<PayListVO> payList = new ArrayList<>();
+                    for (TBill tBill : billList) {
+                        if (tBill.getPayFeesTime()==null){
+                            continue;
+                        }
+                        PayListVO payListVO = new PayListVO();
+                        payListVO.setPayFeesTime(DateUtils.localDateTimeToStringYear(tBill.getPayFeesTime()));
+                        payListVO.setPayFeesMoney("-" + tBill.getPayFeesMoney() + "元");
+                        payList.add(payListVO);
+                    }
+                    myToDoVO.setPayList(payList);
+                    myHouseVOS.add(myToDoVO);
+                }
+
+            }
+            return R.ok(myHouseVOS);
+        } else {
+            return R.ok(myHouseVOS);
+        }
+    }
+
+    @ApiOperation(value = "租户-当前在租房源-租赁详情")
+    @GetMapping(value = "/tenant/myHouseDetail")
+    public R<MyHouseVO> myHouseDetail(String id) {
+        LoginUserApplet loginUserApplet = tokenService.getLoginUserApplet();
+
+        if (loginUserApplet != null) {
+            MyHouseVO myToDoVO = new MyHouseVO();
+            TContract contract = contractService.getById(id);
+            List<TBill> bills = billService.lambdaQuery().orderByDesc(TBill::getPayableFeesTime).list();
+            THouse tHouse = houseService.getById(contract.getHouseId());
+            TBill bill = bills.stream().filter(e -> e.getContractId().equals(contract.getId()) && e.getPayFeesStatus().equals("3")).findFirst().orElse(null);
+            if (bill == null) {
+                bill = bills.stream().filter(e -> e.getContractId().equals(contract.getId())).findFirst().orElse(null);
+            }
+            if (tHouse != null && bill != null) {
+                myToDoVO.setId(contract.getId());
+                myToDoVO.setHouseAddress(tHouse.getHouseAddress());
+                myToDoVO.setMonthRent(contract.getMonthRent());
+                myToDoVO.setPayType(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CONTRACT_PAY_TYPE, contract.getPayType()));
+                myToDoVO.setMonth(bill.getPayFeesTime() == null ? bill.getPayableFeesTime().getMonth() + "月" : bill.getPayFeesTime().getMonth() + "月");
+                myToDoVO.setHouseArea(tHouse.getHouseArea());
+                myToDoVO.setHouseType(tHouse.getHouseType());
+                myToDoVO.setEndTime(DateUtils.localDateTimeToStringYear(contract.getEndTime()));
+                myToDoVO.setStartTime(DateUtils.localDateTimeToStringYear(contract.getStartTime()));
+                myToDoVO.setPropertyRightPerson(tHouse.getPropertyRightPerson());
+                myToDoVO.setPhone(tHouse.getPhone());
+                List<TBill> billList = bills.stream().filter(e -> e.getContractId().equals(contract.getId())).collect(Collectors.toList());
+                List<PayListVO> payList = new ArrayList<>();
+                for (TBill tBill : billList) {
+                    if (tBill.getPayFeesTime()==null){
+                        continue;
+                    }
+                    PayListVO payListVO = new PayListVO();
+                    payListVO.setPayFeesTime(DateUtils.localDateTimeToStringYear(tBill.getPayFeesTime()));
+                    payListVO.setPayFeesMoney("-" + tBill.getPayFeesMoney() + "元");
+                    payList.add(payListVO);
+                }
+                myToDoVO.setPayList(payList);
+            }
+
+            return R.ok(myToDoVO);
+        } else {
+            return R.ok(new MyHouseVO());
+        }
+    }
+
+    @ApiOperation(value = "管理员-我的待办")
+    @PostMapping(value = "/admin/myToDo")
+    public R<MyToDoVO> adminMyToDo() {
+        MyToDoVO myToDoVO = new MyToDoVO();
+        LoginUserApplet loginUserApplet = tokenService.getLoginUserApplet();
+        if (loginUserApplet != null) {
+            long examineCount = contractService.count(new LambdaQueryWrapper<TContract>()
+                    .eq(TContract::getStatus, 2));
+            myToDoVO.setExamineCount((int) examineCount);
+            List<String> contractIds = billService.lambdaQuery().eq(TBill::getPayFeesStatus, 4).list()
+                    .stream().map(TBill::getContractId).collect(Collectors.toList());
+            int overdueCount = contractService.lambdaQuery().in(TContract::getId, contractIds).list()
+                    .stream().map(TContract::getTenantId).distinct().collect(Collectors.toList()).size();
+            myToDoVO.setOverdueCount(overdueCount);
+        } else {
+            myToDoVO.setExamineCount(0);
+            myToDoVO.setOverdueCount(0);
+        }
+        return R.ok(myToDoVO);
+    }
+
+    /**
+     * 获取验收记录管理列表
+     */
+    @ApiOperation(value = "管理员-房屋验收单列表")
+    @PostMapping(value = "/admin/houseCheck")
+    public R<PageInfo<TCheckAcceptRecordVO>> houseCheck(@RequestBody TCheckAcceptRecordAppletQuery query) {
+        return R.ok(checkAcceptRecordService.pageListApplet(query));
+    }
+
+    /**
+     * 查看验收记录详情
+     */
+    @ApiOperation(value = "管理员-查看验收记录详情")
+    @GetMapping(value = "/getDetailById")
+    public R<TCheckAcceptRecordVO> getDetailById(@RequestParam String id) {
+        TCheckAcceptRecord checkAcceptRecord = checkAcceptRecordService.getById(id);
+        checkAcceptRecord.setCleanSituation(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CHECK_SITUATION, checkAcceptRecord.getCleanSituation()));
+        checkAcceptRecord.setOverallSituation(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CHECK_SITUATION, checkAcceptRecord.getOverallSituation()));
+        checkAcceptRecord.setDeviceSituation(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CHECK_SITUATION, checkAcceptRecord.getDeviceSituation()));
+        checkAcceptRecord.setFurnitureSituation(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CHECK_SITUATION, checkAcceptRecord.getFurnitureSituation()));
+        TCheckAcceptRecordVO checkAcceptRecordVO = new TCheckAcceptRecordVO();
+        BeanUtils.copyProperties(checkAcceptRecord, checkAcceptRecordVO);
+        // 查询合同信息
+        checkAcceptRecordVO.setContract(contractService.getById(checkAcceptRecord.getContractId()));
+        // 查询房屋信息
+        checkAcceptRecordVO.setHouse(houseService.getById(checkAcceptRecord.getHouseId()));
+        return R.ok(checkAcceptRecordVO);
+    }
+
+    @ApiOperation(value = "管理员-新增验收")
+    @PostMapping(value = "/addRecord")
+    public R<TCheckAcceptRecordVO> addRecord(@Validated @RequestBody TCheckAcceptRecord dto) {
+        dto.setAcceptanceTime(LocalDateTime.now());
+        dto.setCheckTime(LocalDateTime.now());
+        LocalDate now = LocalDate.now();
+        String replace = (now + "").replace("-", "");
+        int size = checkAcceptRecordService.list(new LambdaQueryWrapper<TCheckAcceptRecord>()
+                .likeRight(TCheckAcceptRecord::getAcceptanceTime, LocalDate.now())).size();
+        dto.setCode(replace.substring(2)+String.format("%03d", size+1));
+        dto.setStatus(true);
+        // 添加验收记录
+        checkAcceptRecordService.updateById(dto);
+        return R.ok();
+    }
+    /**
+     * 获取报修管理列表
+     */
+    @ApiOperation(value = "管理员-房屋维修分页列表")
+    @PostMapping(value = "/housePageList")
+    public R<PageInfo<TFaultRepairMessageVO>> pageList(@RequestBody TFaultRepairMessageAppletQuery query) {
+        return R.ok(tFaultRepairMessageService.pageListApplet(query));
+    }
+    /**
+     * 查看报修详情
+     */
+    @ApiOperation(value = "管理员-房屋维修查看详情")
+    @GetMapping(value = "/getDetailByIdRepair")
+    public R<TFaultRepairMessageVO> getDetailByIdRepair(@RequestParam String id) {
+        TFaultRepairMessageVO faultRepairMessageVO = tFaultRepairMessageService.getDetailById(id);
+        return R.ok(faultRepairMessageVO);
+    }
+
+    /**
+     * 处理维修
+     */
+    @Log(title = "报修信息-处理维修", businessType = BusinessType.UPDATE)
+    @ApiOperation(value = "管理员-维修处理")
+    @PostMapping(value = "/handle")
+    public R<Boolean> handle(@Validated @RequestBody TFaultRepairMessage faultRepairMessage) {
+        faultRepairMessage.setStatus(2);
+        return R.ok(tFaultRepairMessageService.updateById(faultRepairMessage));
+    }
+
+    /**
+     * 获取租户管理列表
+     */
+    @ApiOperation(value = "获取租户分页列表")
+    @PostMapping(value = "/pageList")
+    public R<PageInfo<TenantVO>> pageList(@RequestBody TTenantAppletQuery query) {
+        return R.ok(tenantService.pageListApplet(query));
+    }
+    /**
+     * 获取租户管理列表
+     */
+    @ApiOperation(value = "获取租户详情")
+    @GetMapping(value = "/getTenantDetailById")
+    public R<TTenant> getTenantDetailById(@RequestParam String id) {
+        return R.ok(tenantService.getById(id));
+    }
+    /**
+     * 租户详情-租房信息
+     */
+    @ApiOperation(value = "租户详情-租房信息列表")
+    @GetMapping(value = "/listHouse")
+    public R<List<THouse>> listHouse(@RequestParam String id) {
+        List<THouse> res = tenantService.listHouse(id);
+        return R.ok(res);
+    }
+    /**
+     * 租户详情-租房信息
+     */
+    @ApiOperation(value = "租户详情-合同列表")
+    @GetMapping(value = "/listContract")
+    public R<List<TContract>> listContract(@RequestParam String id) {
+        List<TContract> res = tenantService.listContract(id);
+        return R.ok(res);
+    }
+    @ApiOperation(value = "租户详情-缴费账单列表")
+    @PostMapping("/listBill")
+    public R<PageInfo<TBillVO>> listBill(@RequestBody TBillAppletQuery query){
+        PageInfo<TBillVO> pageInfo = tenantService.listBill(query);
+        return R.ok(pageInfo);
+    }
+    @ApiOperation(value = "租户详情-缴费账单-账单详情")
+    @PostMapping("/billDetail")
+    public R<TBillVO> billDetail(String id){
+        TBillVO res = new TBillVO();
+        TBill bill = billService.getById(id);
+        BeanUtils.copyProperties(bill, res);
+        TContract contract = contractService.getById(bill.getContractId());
+        THouse tHouse = houseService.getById(contract.getHouseId());
+        res.setHouse(tHouse);
+        return R.ok(res);
+    }
+    @ApiOperation(value = "管理员-我的审批分页列表")
+    @PostMapping("/listExamine")
+    public R<PageInfo<ExamineVO>> examineList(@RequestBody TExamineAppletQuery dto){
+        LoginUser loginUser = tokenService.getLoginUser();
+        if (loginUser==null){
+            return R.fail(401,"登录失效");
+        }
+        SysUser sysUser = sysUserService.selectUserById(loginUser.getUserId());
+        dto.setUserName(sysUser.getUserName());
+        PageInfo<ExamineVO> pageInfo = tenantService.examineList(dto);
+        return R.ok(pageInfo);
+    }
+    @ApiOperation(value = "管理员-审批详情")
+    @GetMapping("/examineDetail")
+    public R<TContractVO> examineDetail(@RequestParam String id){
+        TContractVO res = new TContractVO();
+        TContract contract = contractService.getById(id);
+        BeanUtils.copyProperties(contract,res);
+        res.setPayType(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CONTRACT_PAY_TYPE,res.getPayType()));
+        res.setStatus(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CONTRACT_STATUS,res.getStatus()));
+        TContractRentType contractRentType = contractRentTypeService.lambdaQuery().eq(TContractRentType::getContractId, id).one();
+        if (contractRentType!=null){
+            BeanUtils.copyProperties(contractRentType,res);
+        }
+        TContract oldContract = contractService.getOne(new LambdaQueryWrapper<TContract>()
+                .eq(TContract::getHouseId,contract.getHouseId())
+                .eq(TContract::getStatus, 4)
+                .le(TContract::getStartTime, LocalDateTime.now())
+                .ge(TContract::getEndTime, LocalDateTime.now()));
+        THouse house = houseService.getById(contract.getHouseId());
+        if (oldContract!=null){
+            house.setTenantType(oldContract.getPayType());
+        }
+        res.setHouse(house);
+        List<TBill> list = billService.lambdaQuery()
+                .eq(TBill::getContractId, id)
+                .in(TBill::getPayFeesStatus, Arrays.asList("1,4"))
+                .list();
+        BigDecimal payMoney = new BigDecimal("0");
+        for (TBill tBill : list) {
+            payMoney = payMoney.add(tBill.getPayFeesMoney()).add(tBill.getPayableFeesPenalty());
+        }
+        TCheckAcceptRecord tCheckAcceptRecord = checkAcceptRecordService.lambdaQuery().eq(TCheckAcceptRecord::getContractId, id).one();
+        res.setCheckResult(Objects.nonNull(tCheckAcceptRecord)?tCheckAcceptRecord.getCheckResult():false);
+        res.setPayMoney(payMoney);
+
+        return R.ok(res);
+    }
+    @ApiOperation(value = "管理员-我的审批-撤销")
+    @GetMapping("/cancel")
+    public R cancel(@RequestParam String id){
+        return R.ok();
+    }
+    @ApiOperation(value = "管理员-我的审批-审批")
+    @GetMapping("/examine")
+    public R examine(@RequestParam String id){
+        return R.ok();
+    }
+
+
+
+}
+
+
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
new file mode 100644
index 0000000..efaf81f
--- /dev/null
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
@@ -0,0 +1,209 @@
+package com.ruoyi.web.controller.api;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.BaseModel;
+import com.ruoyi.common.core.domain.BasePage;
+import com.ruoyi.common.core.domain.entity.SysUser;
+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;
+import com.ruoyi.system.vo.ProcessDetailVO;
+import com.ruoyi.system.vo.ProcessTaskListVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+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;
+
+@Api(tags = "审批流程管理")
+@RequestMapping("/state-process")
+@RestController
+@RequiredArgsConstructor
+public class StateProcessController {
+
+    private final StateProcessTemplateService processTemplateService;
+    private final StateProcessModuleService processModuleService;
+    private final ISysUserService sysUserService;
+
+    //应用流程分页列表
+    @ApiOperation("应用流程分页列表")
+    @PostMapping("/module/page")
+    public AjaxResult<List<StateProcessModule>> modulePage(@RequestBody BasePage basePage) {
+        LambdaQueryWrapper<StateProcessModule> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.orderByAsc(StateProcessModule::getCategory);
+        //查询应用流程列表
+        List<StateProcessModule> result = processModuleService.list(queryWrapper);
+        List<String> updateUserId = result.stream().map(BaseModel::getUpdateBy).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(updateUserId)){
+            //根据用户id查询用户信息
+            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
+            Map<Long, SysUser> sysUserMap;
+            if (!CollectionUtils.isEmpty(sysUsers)){
+                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
+            } else {
+                sysUserMap = new HashMap<>();
+            }
+            //遍历列表,设置更新人名称
+            result.forEach(e -> {
+                SysUser sysUser = sysUserMap.get(e.getUpdateBy());
+                if (Objects.nonNull(sysUser)){
+                    e.setUpdateBy(sysUser.getNickName());
+                }
+            });
+        }
+        return AjaxResult.success(result);
+    }
+    //修改应用流程
+    @Log(title = "审批流程管理-修改应用流程", businessType = BusinessType.UPDATE)
+    @ApiOperation("修改应用流程")
+    @PostMapping("/module/update")
+    public AjaxResult<PageInfo<StateProcessModule>> moduleUpdate(@RequestBody ProcessModuleUpdateBO processModuleUpdateBO) {
+        StateProcessTemplate stateProcessTemplate = processTemplateService.getById(processModuleUpdateBO.getTemplateId());
+        if (Objects.isNull(stateProcessTemplate)) {
+            return AjaxResult.success();
+        }
+        StateProcessModule stateProcessModule = new StateProcessModule();
+        stateProcessModule.setId(processModuleUpdateBO.getId());
+        stateProcessModule.setTemplateId(processModuleUpdateBO.getTemplateId());
+        stateProcessModule.setTemplateName(stateProcessTemplate.getTemplateName());
+        stateProcessModule.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
+        stateProcessModule.setCreateTime(LocalDateTime.now());
+        stateProcessModule.setUpdateTime(LocalDateTime.now());
+        stateProcessModule.setRemark(processModuleUpdateBO.getRemark());
+        processModuleService.updateById(stateProcessModule);
+        return AjaxResult.success();
+    }
+
+    //流程模版分页
+    @ApiOperation("流程模版分页")
+    @PostMapping("/template/page")
+    public AjaxResult<Page<StateProcessTemplate>> page(ProcessTemplatePageBO request) {
+        Page<StateProcessTemplate> templatePage = processTemplateService.page(request);
+        return AjaxResult.success(templatePage);
+    }
+
+    //查询流程模版
+    @ApiOperation("查询流程模版")
+    @GetMapping("/template/getById")
+    public AjaxResult<StateProcessTemplate> selectById(@RequestParam String id) {
+        return AjaxResult.success(processTemplateService.getById(id));
+    }
+
+    //修改并部署模版
+    @Log(title = "审批流程管理-修改并部署模版", businessType = BusinessType.UPDATE)
+    @ApiOperation("修改并部署模版")
+    @PostMapping("/template/update")
+    public AjaxResult<Boolean> update(@RequestBody ProcessUpdateBO processUpdateBO) {
+        return AjaxResult.success(processTemplateService.update(processUpdateBO));
+    }
+
+    //删除模版
+    @Log(title = "审批流程管理-删除模版", businessType = BusinessType.DELETE)
+    @ApiOperation("删除模版")
+    @GetMapping("/template/deleteById")
+    public AjaxResult<Boolean> deleteById(@RequestParam String id) {
+        StateProcessTemplate template = processTemplateService.getById(id);
+        //查询是否存在使用的
+        LambdaUpdateWrapper<StateProcessModule> moduleLambdaUpdateWrapper = new LambdaUpdateWrapper<>();;
+        moduleLambdaUpdateWrapper.eq(StateProcessModule::getTemplateId, template.getId());
+        if (processModuleService.getBaseMapper().exists(moduleLambdaUpdateWrapper)) {
+            throw new GlobalException("该模版在应用流程中已使用!");
+        }
+        //根据key修改所有版本为已删除
+        boolean result = processTemplateService.remove(Wrappers.lambdaQuery(StateProcessTemplate.class)
+                .eq(StateProcessTemplate::getTemplateKey, template.getTemplateKey()));
+        return AjaxResult.success(result);
+    }
+
+    //创建并部署模版
+    @Log(title = "审批流程管理-创建并部署模版", businessType = BusinessType.INSERT)
+    @ApiOperation("创建并部署模版")
+    @PostMapping("/template/create")
+    public AjaxResult<Boolean> create(@RequestBody ProcessCreateBO processCreateBO) {
+        return AjaxResult.success(processTemplateService.create(processCreateBO));
+    }
+
+    //流程发起
+    @Log(title = "审批流程管理-流程发起", businessType = BusinessType.INSERT)
+    @ApiOperation("流程发起")
+    @PostMapping("/start")
+    public AjaxResult<Boolean> start(@RequestBody ProcessStartBO processStartBO) {
+        return AjaxResult.success(processTemplateService.start(processStartBO));
+    }
+
+    //待办
+    @ApiOperation("待办列表")
+    @PostMapping("/wait/task/page")
+    public AjaxResult<PageInfo<ProcessTaskListVO>> waitTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
+        return AjaxResult.success(processTemplateService.waitTaskPage(processTemplatePageBO));
+    }
+
+    //已办
+    @ApiOperation("已办列表")
+    @PostMapping("/deal/task/page")
+    public AjaxResult<PageInfo<ProcessTaskListVO>> dealTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
+        return AjaxResult.success(processTemplateService.dealTaskPage(processTemplatePageBO));
+    }
+
+    //待办和已办列表
+    @ApiOperation("待办和已办列表")
+    @PostMapping("/dealAndWait/task/page")
+    public AjaxResult<PageInfo<ProcessTaskListVO>> dealAndWaitTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
+        return AjaxResult.success(processTemplateService.dealAndWaitTaskPage(processTemplatePageBO));
+    }
+
+    //抄送
+    @ApiOperation("抄送列表")
+    @PostMapping("/copy/task/page")
+    public AjaxResult<PageInfo<ProcessTaskListVO>> copyTaskPage(@RequestBody ProcessTaskListBO processTaskListBO){
+        return AjaxResult.success(processTemplateService.copyTaskPage(processTaskListBO));
+    }
+
+    //审核通过
+    @Log(title = "审批流程管理-审核通过", businessType = BusinessType.UPDATE)
+    @ApiOperation("审核通过")
+    @PostMapping("/agree")
+    public AjaxResult<Object> agree(@RequestBody ProcessAgreeBO processAgreeBO) {
+        processTemplateService.agree(processAgreeBO);
+        return AjaxResult.success();
+    }
+
+    //审核拒绝
+    @Log(title = "审批流程管理-审核拒绝", businessType = BusinessType.UPDATE)
+    @ApiOperation("审核拒绝")
+    @PostMapping("/refuse")
+    public AjaxResult<Object> refuse(@RequestBody ProcessRefuseBO processRefuseBO) {
+        processTemplateService.refuse(processRefuseBO);
+        return AjaxResult.success();
+    }
+
+    //审核详情
+    @ApiOperation("审核详情")
+    @GetMapping("/detail")
+    public AjaxResult<ProcessDetailVO> detail(@RequestParam String taskId) {
+        ProcessDetailVO detail = processTemplateService.detail(taskId);
+        return AjaxResult.success(detail);
+    }
+
+}
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 83d5a2f..0731a2e 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
@@ -5,18 +5,19 @@
 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.utils.DateUtils;
 import com.ruoyi.common.utils.DictUtils;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.dto.SignContractDTO;
 import com.ruoyi.system.model.TContract;
 import com.ruoyi.system.model.TContractRentType;
 import com.ruoyi.system.model.THouse;
+import com.ruoyi.system.model.TTenant;
 import com.ruoyi.system.query.TContractAppletQuery;
 import com.ruoyi.system.query.TContractQuery;
-import com.ruoyi.system.service.TBillService;
-import com.ruoyi.system.service.TContractRentTypeService;
-import com.ruoyi.system.service.TContractService;
-import com.ruoyi.system.service.THouseService;
+import com.ruoyi.system.service.*;
+import com.ruoyi.system.vo.TContractAppletVO;
 import com.ruoyi.system.vo.TContractVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -49,7 +50,9 @@
     private TBillService billService;
     @Autowired
     private TokenService tokenService;
-    @ApiOperation(value = "签订合同")
+    @Autowired
+    private TTenantService tTenantService;
+    @ApiOperation(value = " 签订合同")
     @PostMapping(value = "/signContract")
     public R signContract(@RequestBody SignContractDTO dto) {
         return contractService.signContract(dto);
@@ -57,23 +60,36 @@
     @ApiOperation(value = "我的合同分页列表")
     @PostMapping(value = "/contractList")
     public R<PageInfo<TContract>> contractList(@RequestBody TContractAppletQuery query) {
-        // todo 获取登陆人id
+        LoginUserApplet loginUserApplet = tokenService.getLoginUserApplet();
+        if (loginUserApplet==null){
+            return R.fail(401,"登录失效");
+        }
+        query.setTenantId(loginUserApplet.getUserId());
         return R.ok(contractService.contractAppletList(query));
     }
     @ApiOperation(value = "查询合同信息信息")
     @GetMapping(value = "/getContractById")
-    public R<TContractVO> getContractById(@RequestParam String id) {
-        TContractVO res = new TContractVO();
+    public R<TContractAppletVO> getContractById(@RequestParam String id) {
+        LoginUserApplet loginUserApplet = tokenService.getLoginUserApplet();
+        if (loginUserApplet==null){
+            return R.fail(401,"登录失效");
+        }
+        TContractAppletVO res = new TContractAppletVO();
         TContract contract = contractService.getById(id);
         BeanUtils.copyProperties(contract,res);
+        res.setStartTimeString(DateUtils.localDateTimeToStringYear(contract.getStartTime()));
+        res.setEndTimeString(DateUtils.localDateTimeToStringYear(contract.getEndTime()));
         res.setPayType(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CONTRACT_PAY_TYPE,res.getPayType()));
         res.setStatus(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CONTRACT_STATUS,res.getStatus()));
         TContractRentType contractRentType = contractRentTypeService.lambdaQuery().eq(TContractRentType::getContractId, id).one();
         if (contractRentType!=null){
             BeanUtils.copyProperties(contractRentType,res);
         }
+        TTenant tTenant = tTenantService.getById(contract.getTenantId());
+        res.setTenant(tTenant);
         TContract oldContract = contractService.getOne(new LambdaQueryWrapper<TContract>()
                 .eq(TContract::getHouseId,contract.getHouseId())
+                .eq(TContract::getTenantId,loginUserApplet.getUserId())
                 .eq(TContract::getStatus, 4)
                 .le(TContract::getStartTime, LocalDateTime.now())
                 .ge(TContract::getEndTime, LocalDateTime.now()));
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TFaultRepairMessageController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TFaultRepairMessageController.java
index 9ea04c2..cc86304 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TFaultRepairMessageController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TFaultRepairMessageController.java
@@ -1,6 +1,7 @@
 package com.ruoyi.web.controller.api;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.framework.web.service.TokenService;
@@ -13,12 +14,9 @@
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
-
+import java.time.LocalDate;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -60,9 +58,9 @@
      * 获取维修物品二级结构
      */
     @ApiOperation(value = "获取维修物品二级结构")
-    @PostMapping(value = "/getItemList")
-    public R<List<TItemTypeVO>> getItemList() {
-        List<TItemTypeVO> itemTypes = itemTypeService.getItemList();
+    @GetMapping(value = "/getItemList")
+    public R<List<TItemTypeVO>> getItemList(@RequestParam(required = false) String itemName) {
+        List<TItemTypeVO> itemTypes = itemTypeService.getItemList(itemName);
         List<TItem> items = itemService.list();
         itemTypes.forEach(itemType -> {
             itemType.setItemList(items.stream().filter(item -> itemType.getId().equals(item.getTypeId())).collect(Collectors.toList()));
@@ -91,8 +89,7 @@
     @PostMapping(value = "/getConcatByTenantId")
     public R<List<TContract>> getConcatByTenantId() {
 
-//        Long userId = tokenService.getLoginUser().getUserId();
-        String tenantId = "1881967035070177281";
+        String tenantId = tokenService.getLoginUserApplet().getUserId();
         // 查询合同信息
         List<TContract> list = contractService.list(Wrappers.lambdaQuery(TContract.class)
                 .eq(TContract::getTenantId, tenantId)
@@ -105,6 +102,7 @@
                 .in(THouse::getId, houseIds));
         list.forEach(item -> {
             item.setHouseName(houseList.stream().filter(house -> house.getId().equals(item.getHouseId())).findFirst().orElse(new THouse()).getHouseName());
+            item.setHouseAddress(houseList.stream().filter(house -> house.getId().equals(item.getHouseId())).findFirst().orElse(new THouse()).getHouseAddress());
         });
         return R.ok(list);
     }
@@ -115,6 +113,12 @@
     @ApiOperation(value = "添加报修信息")
     @PostMapping(value = "/addFault")
     public R<String> addFault(@RequestBody TFaultRepairMessageDTO dto) {
+        dto.setTenantId(tokenService.getLoginUserApplet().getUserId());
+        LocalDate now = LocalDate.now();
+        String replace = (now + "").replace("-", "");
+        int size = tFaultRepairMessageService.list(new LambdaQueryWrapper<TFaultRepairMessage>()
+                .likeRight(TFaultRepairMessage::getCreateTime, LocalDate.now())).size();
+        dto.setCode(replace.substring(2)+String.format("%03d", size+1));
         tFaultRepairMessageService.save(dto);
         return R.ok();
     }
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 c784c42..3f0f789 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
@@ -135,6 +135,7 @@
         LoginUserApplet loginUserApplet = new LoginUserApplet();
         TTenantResp tTenantResp = new TTenantResp();
         BeanUtils.copyProperties(tenant, tTenantResp);
+        tTenantResp.setResidentName(appletUserDecodeData.getPhoneNumber());
         loginUserApplet.setUser(tTenantResp);
         loginUserApplet.setUserId(tenant.getId());
         Map<String, Object> tokenInfos = new HashMap<>();
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 a9f2046..b239bd0 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
@@ -10,6 +10,7 @@
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.SmsUtil;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.service.ISysRoleService;
 import com.ruoyi.web.controller.tool.MsgUtils;
@@ -54,6 +55,8 @@
     private ISysRoleService roleService;
     @Autowired
     private MsgUtils msgUtils;
+    @Autowired
+    private SmsUtil smsUtil;
 
     /**
      * 账号密码登录
@@ -127,7 +130,7 @@
             String code = String.valueOf((int) (Math.random() * 1000000));
             redisCache.setCacheObject(phone, code,5*60,TimeUnit.SECONDS);
             try {
-                msgUtils.sendMsg(phone, code);
+                smsUtil.sendSms(phone, "", new String[]{code});
             } catch (Exception e) {
                 throw new RuntimeException(e);
             }
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/core/config/DataUpdateHandlerConfig.java b/ruoyi-applet/src/main/java/com/ruoyi/web/core/config/DataUpdateHandlerConfig.java
new file mode 100644
index 0000000..e27f2a5
--- /dev/null
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/core/config/DataUpdateHandlerConfig.java
@@ -0,0 +1,61 @@
+package com.ruoyi.web.core.config;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author xiaochen
+ * @ClassName DataUpdateInterceptor
+ * @Description 数据更新操作处理
+ * @date 2021-12-15
+ * <p>
+ * 注意,之前在此处注入了 JwtTokenUtils
+ * <p>
+ * 造成spring循环依赖,项目支棱不起来
+ */
+@Slf4j
+@Configuration
+public class DataUpdateHandlerConfig implements MetaObjectHandler {
+
+    /**
+     * 新增数据执行
+     *
+     * @param metaObject
+     */
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        //  获取登录信息
+//        String userName = SecurityUtils.getUsernameApplet();
+//        if (StringUtils.isNotBlank(userName)) {
+//            this.setFieldValByName("createBy", userName, metaObject);
+//            this.setFieldValByName("updateBy", userName, metaObject);
+//        } else {
+//            this.setFieldValByName("createBy", userName, metaObject);
+//            this.setFieldValByName("updateBy", userName, metaObject);
+//        }
+
+    }
+
+    /**
+     * 修改数据执行
+     *
+     * @param metaObject
+     */
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        //  获取登录信息
+//        String userName = SecurityUtils.getUsernameApplet();
+//        if (StringUtils.isNotBlank(userName)){
+//            this.setFieldValByName("createBy", userName, metaObject);
+//            this.setFieldValByName("updateBy", userName, metaObject);
+//        } else {
+//            this.setFieldValByName("createBy", userName, metaObject);
+//            this.setFieldValByName("updateBy", userName, metaObject);
+//        }
+
+    }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/MybatisPlusConfig.java b/ruoyi-applet/src/main/java/com/ruoyi/web/core/config/MybatisPlusConfig.java
similarity index 97%
copy from ruoyi-common/src/main/java/com/ruoyi/common/config/MybatisPlusConfig.java
copy to ruoyi-applet/src/main/java/com/ruoyi/web/core/config/MybatisPlusConfig.java
index 1366f2b..fac9a9f 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/config/MybatisPlusConfig.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/core/config/MybatisPlusConfig.java
@@ -1,4 +1,4 @@
-package com.ruoyi.common.config;
+package com.ruoyi.web.core.config;
 
 import com.baomidou.mybatisplus.annotation.DbType;
 import com.baomidou.mybatisplus.core.config.GlobalConfig;
diff --git a/ruoyi-applet/src/main/resources/application-test.yml b/ruoyi-applet/src/main/resources/application-test.yml
index a0e94e7..14afafa 100644
--- a/ruoyi-applet/src/main/resources/application-test.yml
+++ b/ruoyi-applet/src/main/resources/application-test.yml
@@ -70,6 +70,13 @@
   # redis 配置
   redis:
     # 地址
+#    host: 127.0.0.1
+#    # 端口,默认为6379
+#    port: 6379
+#    # 数据库索引
+#    database: 0
+#    # 密码
+#    password: 123456
     host: xzgt.test.591taxi.cn
     # 端口,默认为6379
     port: 16379
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index b63b467..33e2a27 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -187,6 +187,20 @@
             <version>4.0.11</version>
         </dependency>
 
+        <!-- 工作流-->
+        <dependency>
+            <groupId>com.aizuda</groupId>
+            <artifactId>flowlong-spring-boot-starter</artifactId>
+            <version>1.0.4</version>
+        </dependency>
+
+        <!-- hutool-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.4</version>
+        </dependency>
+
     </dependencies>
 
 </project>
\ No newline at end of file
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 88f8dc3..3e5ea1d 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
@@ -41,7 +41,6 @@
      * 新增和更新执行
      */
     @ApiModelProperty(value = "记录修改人,前端忽略")
-    @JsonIgnore
     @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
     private String updateBy;
     /**
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/ProcessCategoryEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/ProcessCategoryEnum.java
new file mode 100644
index 0000000..5aef891
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/ProcessCategoryEnum.java
@@ -0,0 +1,51 @@
+package com.ruoyi.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 1. 入户调查
+ * 2. 价格评估
+ * 3. 协议签订
+ * 固定对应表 state_process_module
+ */
+@Getter
+@AllArgsConstructor
+public enum ProcessCategoryEnum {
+    CATEGORY0(0, "错误分类"),
+    CATEGORY1(1, "合同新增审批"),
+    CATEGORY2(2, "合同签订审批"),
+    CATEGORY3(3, "合同提前终止审批"),
+    ;
+
+
+    private final Integer value;
+    private final String text;
+
+    public static Integer getValue(String text) {
+        for (ProcessCategoryEnum v : ProcessCategoryEnum.values()) {
+            if (v.text.equals(text)) {
+                return v.value;
+            }
+        }
+        return 0;
+    }
+
+    public static String getValueByKey(Integer key) {
+        for (ProcessCategoryEnum v : ProcessCategoryEnum.values()) {
+            if (v.getValue().equals(key)) {
+                return v.getText();
+            }
+        }
+        return "";
+    }
+
+    public static ProcessCategoryEnum getEnumByKey(Integer key) {
+        for (ProcessCategoryEnum v : ProcessCategoryEnum.values()) {
+            if (v.getValue().equals(key)) {
+                return v;
+            }
+        }
+        return CATEGORY0;
+    }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/StateProcessActionEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/StateProcessActionEnum.java
new file mode 100644
index 0000000..d61daea
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/StateProcessActionEnum.java
@@ -0,0 +1,26 @@
+package com.ruoyi.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 流程动作枚举
+ *
+ */
+@Getter
+@AllArgsConstructor
+public enum StateProcessActionEnum {
+
+    START(0), // "发起"
+    REJECTED(3), // "拒绝"
+    APPROVED(4), // "通过"
+    CANCELED(5), // "撤销"
+    BACK(7), // "回退"
+    COPY(12), // "抄送"
+    FORWARD(13), // "转发"
+    COMMENT(14), // "评论"
+    TRANSACT(15); // "办理"
+
+    private final int value;
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/SubmitStatusEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/SubmitStatusEnum.java
new file mode 100644
index 0000000..9e231f3
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/SubmitStatusEnum.java
@@ -0,0 +1,33 @@
+package com.ruoyi.common.enums;
+
+import lombok.Getter;
+
+import java.util.Objects;
+
+@Getter
+public enum SubmitStatusEnum {
+    SUBMITTED(-1, ""),
+    REJECT(0, "已退回"),
+    PENDING_REVIEW(1, "待审核"),
+    ACCEPT(3, "已接收");
+
+    private final int value;
+    private final String text;
+
+    public static String getTextByValue(Integer value) {
+        if (Objects.isNull(value)) {
+            return "";
+        }
+        for (SubmitStatusEnum v : SubmitStatusEnum.values()) {
+            if (v.getValue() == (value)) {
+                return v.getText();
+            }
+        }
+        return "";
+    }
+
+    SubmitStatusEnum(int value, String text) {
+        this.text = text;
+        this.value = value;
+    }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/state/StateErrorCode.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/state/StateErrorCode.java
new file mode 100644
index 0000000..9e38eef
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/state/StateErrorCode.java
@@ -0,0 +1,19 @@
+package com.ruoyi.common.exception.state;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum StateErrorCode {
+
+    PROCESS_TEMPLATE_KEY_EXISTS("已经存在此名称的模版了!"),
+    PROCESS_TEMPLATE_NOT_EXISTS("流程模版不存在!"),
+    PROCESS_NOT_DEPLOY("模版尚未部署成功"),
+    PROCESS_VERSION_ERROR("流程引擎版本不一致"),
+    ;
+
+    private final String value;
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java
index a6f3d53..adea656 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java
@@ -1,5 +1,6 @@
 package com.ruoyi.common.utils;
 
+import com.ruoyi.common.core.domain.model.LoginUserApplet;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@@ -58,6 +59,20 @@
             throw new ServiceException("获取用户账户异常", HttpStatus.UNAUTHORIZED);
         }
     }
+    /**
+     * 获取用户账户小程序
+     **/
+    public static String getUsernameApplet()
+    {
+        try
+        {
+            return getLoginUserApplet().getUsername();
+        }
+        catch (Exception e)
+        {
+            throw new ServiceException("获取用户账户异常", HttpStatus.UNAUTHORIZED);
+        }
+    }
 
     /**
      * 获取用户
@@ -73,6 +88,17 @@
             throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED);
         }
     }
+    public static LoginUserApplet getLoginUserApplet()
+    {
+        try
+        {
+            return (LoginUserApplet) getAuthentication().getPrincipal();
+        }
+        catch (Exception e)
+        {
+            throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED);
+        }
+    }
 
     /**
      * 获取Authentication
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/DeployBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/DeployBO.java
new file mode 100644
index 0000000..7adf52f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/DeployBO.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.bo;
+
+import com.aizuda.bpm.engine.model.NodeModel;
+import lombok.Data;
+
+@Data
+public class DeployBO {
+    private String key;
+    private String name;
+    private String instanceUrl;
+    /**
+     * 流程定义
+     */
+    private NodeModel nodeConfig;
+}
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
new file mode 100644
index 0000000..7638f4d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java
@@ -0,0 +1,26 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+/**
+ * 流程审批请求参数 同意
+ *
+ * <p>
+ * 尊重知识产权,不允许非法使用,后果自负
+ * </p>
+ *
+ */
+@Data
+public class ProcessAgreeBO {
+
+    /**
+     * 任务id
+     */
+    private String taskId;
+
+    /**
+     * 理由
+     */
+    private String remark;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessCreateBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessCreateBO.java
new file mode 100644
index 0000000..ed40541
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessCreateBO.java
@@ -0,0 +1,21 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+@Data
+public class ProcessCreateBO {
+
+
+    /**
+     * 模版名称
+     */
+    private String templateName;
+
+    /**
+     * json流程模版
+     */
+    private String process;
+
+    private String remark;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessModuleUpdateBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessModuleUpdateBO.java
new file mode 100644
index 0000000..6510129
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessModuleUpdateBO.java
@@ -0,0 +1,19 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+@Data
+public class ProcessModuleUpdateBO {
+
+    /**
+     * 模块id
+     */
+    private String id;
+
+    /**
+     * 流程id
+     */
+    private String templateId;
+    private String remark;
+
+}
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
new file mode 100644
index 0000000..8072394
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessRefuseBO.java
@@ -0,0 +1,27 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+/**
+ * 流程审批请求参数 拒绝
+ *
+ * <p>
+ * 尊重知识产权,不允许非法使用,后果自负
+ * </p>
+ *
+ */
+@Data
+public class ProcessRefuseBO {
+
+    /**
+     * 任务id
+     */
+    private String taskId;
+
+    /**
+     * 理由
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessStartBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessStartBO.java
new file mode 100644
index 0000000..6bd43bc
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessStartBO.java
@@ -0,0 +1,57 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class ProcessStartBO {
+
+    /**
+     * 阶段类型
+     * 1入户调查
+     * 2价格评估
+     * 3协议签订
+     * 4资金管理-预算资金
+     * 5住宅临时安置补助费
+     * 6停产停业经济损失补助费
+     * 7安置情况
+     */
+    private String category;
+
+    /**
+     * 任务中心-项目名称
+     */
+    private String name;
+
+    /**
+     * 模块名称
+     */
+    private String moduleName;
+
+    /**
+     * 系统摘要
+     * 入户调查摘要:【镇/街】【征收实施单位】【调查户数】
+     * 价格评估摘要:【镇/街】【征收实施单位】【价格评估合计】
+     * 协议签订摘要:【镇/街】【征收实施单位】【权利人】【协议类型】
+     * 预算资金摘要:【镇/街】【征收实施单位】【预算金额】
+     * 住宅临时安置补助费摘要:【镇/街】【征收实施单位】【开始时间-截止时间】【申请金额】
+     * 停产停业经济损失补助费摘要:【镇/街】【征收实施单位】【开始时间-截止时间】【申请金额】
+     * 安置情况摘要:【镇/街】【征收实施单位】【批次名称】【安置类型】
+     */
+    private String remark;
+
+
+    /**
+     * 类型 1集体 2国有
+     */
+    private Integer type = 2;
+
+    /**
+     * 变量:流程完成后需要修改状态的表id信息
+     * 例如:
+     * variable.put("objectId",12);
+     */
+    private Map<String, Object> variable;
+
+}
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
new file mode 100644
index 0000000..528e3ac
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java
@@ -0,0 +1,45 @@
+package com.ruoyi.system.bo;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Setter
+@Getter
+public class ProcessTaskListBO extends BasePage {
+    /**
+     * 任务名称
+     */
+    @ApiModelProperty(value = "任务名称")
+    private String name;
+
+    /**
+     * 任务名称
+     */
+    @ApiModelProperty(value = "任务名称")
+    private String moduleName;
+//    /**
+//     * 流程实例状态( 0,审批中 1,审批通过 2,审批拒绝 3)
+//     */
+//    private Integer instanceState;
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "乙方名称")
+    private String partyTwoName;
+    @ApiModelProperty(value = "合同编号")
+    private String contractNumber;
+    @ApiModelProperty(value = "合同名称")
+    private String contractName;
+    @ApiModelProperty(value = "合同状态")
+    private String status;
+    @ApiModelProperty(value = "前端忽略")
+    private List<String> instanceIds;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTemplatePageBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTemplatePageBO.java
new file mode 100644
index 0000000..9502e83
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTemplatePageBO.java
@@ -0,0 +1,12 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+@Data
+public class ProcessTemplatePageBO {
+
+    private Integer currentPage;
+    private Integer pageSize;
+    private String name;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessUpdateBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessUpdateBO.java
new file mode 100644
index 0000000..09ac837
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessUpdateBO.java
@@ -0,0 +1,22 @@
+package com.ruoyi.system.bo;
+
+import lombok.Data;
+
+@Data
+public class ProcessUpdateBO {
+
+    private String id;
+
+    /**
+     * 模版名称
+     */
+    private String templateName;
+
+    /**
+     * json流程模版
+     */
+    private String process;
+
+    private String remark;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/TExamineDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TExamineDTO.java
new file mode 100644
index 0000000..63c5c6e
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TExamineDTO.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.dto;
+
+import com.ruoyi.system.model.TTenant;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "审批DTO")
+public class TExamineDTO{
+    @ApiModelProperty(value = "审批id")
+    private String id;
+    @ApiModelProperty(value = "审批状态")
+    private Integer status;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/export/ContractExport.java b/ruoyi-system/src/main/java/com/ruoyi/system/export/ContractExport.java
index b5f25f7..ac9c72f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/export/ContractExport.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/export/ContractExport.java
@@ -9,7 +9,7 @@
 import java.util.Date;
 
 @Data
-@ApiModel(value = "光缆巡检导出excel")
+@ApiModel(value = "合同导出excel")
 public class ContractExport implements Serializable {
 
     @Excel(name = "合同编号",width = 30)
@@ -24,15 +24,15 @@
     @Excel(name = "乙方名称",width = 30)
     private String partyTwoName;
 
-    @Excel(name = "创建时间",width = 30,exportFormat = "yyyy-MM-dd")
-    private LocalDateTime create_time;
+    @Excel(name = "创建时间",width = 30)
+    private String createTime;
 
 
-    @Excel(name = "生效日期",width = 30,exportFormat = "yyyy-MM-dd")
-    private LocalDateTime startTime;
+    @Excel(name = "生效日期",width = 30)
+    private String startTime;
 
-    @Excel(name = "终止日期",width = 30,exportFormat = "yyyy-MM-dd")
-    private LocalDateTime endTime;
+    @Excel(name = "终止日期",width = 30)
+    private String endTime;
 
     @Excel(name = "租金支付方式",width = 30)
     private String payType;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessExtInstanceMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessExtInstanceMapper.java
new file mode 100644
index 0000000..5c81fcc
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessExtInstanceMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.StateProcessExtInstance;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface StateProcessExtInstanceMapper extends BaseMapper<StateProcessExtInstance> {
+}
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
new file mode 100644
index 0000000..81dcaa1
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java
@@ -0,0 +1,7 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.StateProcessInstanceAction;
+
+public interface StateProcessInstanceActionMapper extends BaseMapper<StateProcessInstanceAction> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessModuleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessModuleMapper.java
new file mode 100644
index 0000000..527a07b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessModuleMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.StateProcessModule;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface StateProcessModuleMapper extends BaseMapper<StateProcessModule> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessTemplateMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessTemplateMapper.java
new file mode 100644
index 0000000..a620b09
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessTemplateMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.system.bo.ProcessTemplatePageBO;
+import com.ruoyi.system.model.StateProcessTemplate;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface StateProcessTemplateMapper extends BaseMapper<StateProcessTemplate> {
+
+    Page<StateProcessTemplate> page(Page<StateProcessTemplate> page, @Param("request") ProcessTemplatePageBO request);
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java
new file mode 100644
index 0000000..8fa2afc
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java
@@ -0,0 +1,23 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.bo.ProcessTaskListBO;
+import com.ruoyi.system.model.StateTaskCenter;
+import com.ruoyi.system.vo.ProcessTaskListVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface StateTaskCenterMapper extends BaseMapper<StateTaskCenter> {
+    /**
+     * 分页查询
+     * @param processTaskListBO
+     * @param pageInfo
+     * @return
+     */
+    List<ProcessTaskListVO> pageList(@Param("query") ProcessTaskListBO processTaskListBO, @Param("pageInfo") PageInfo<ProcessTaskListVO> pageInfo);
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java
index 9d66e47..ada62eb 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java
@@ -127,4 +127,6 @@
 
     List<SysRole> selectPageList(@Param("query")SysRoleQuery query,@Param("pageInfo") PageInfo<SysRole> pageInfo);
 
+    List<SysRole> selectRoleByUserIds(@Param("roleIds")List<String> roleIds);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBannerMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBannerMapper.java
index b258375..800c3c6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBannerMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBannerMapper.java
@@ -25,5 +25,6 @@
      * @return
      */
     List<TBanner> pageList(@Param("query") TBannerQuery query, @Param("pageInfo")PageInfo<TBanner> pageInfo);
+    List<TBanner> list(@Param("query") TBannerQuery query);
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCheckAcceptRecordMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCheckAcceptRecordMapper.java
index ee37eff..7e6f416 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCheckAcceptRecordMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCheckAcceptRecordMapper.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TCheckAcceptRecord;
+import com.ruoyi.system.query.TCheckAcceptRecordAppletQuery;
 import com.ruoyi.system.query.TCheckAcceptRecordQuery;
 import com.ruoyi.system.vo.TCheckAcceptRecordVO;
 import org.apache.ibatis.annotations.Param;
@@ -26,6 +27,7 @@
      * @return
      */
     List<TCheckAcceptRecordVO> pageList(@Param("query") TCheckAcceptRecordQuery query, @Param("pageInfo")PageInfo<TCheckAcceptRecordVO> pageInfo);
+    List<TCheckAcceptRecordVO> pageListApplet(@Param("query") TCheckAcceptRecordAppletQuery query, @Param("pageInfo")PageInfo<TCheckAcceptRecordVO> pageInfo);
 
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TFaultRepairMessageMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TFaultRepairMessageMapper.java
index b9774a9..fbd1b49 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TFaultRepairMessageMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TFaultRepairMessageMapper.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TFaultRepairMessage;
+import com.ruoyi.system.query.TFaultRepairMessageAppletQuery;
 import com.ruoyi.system.query.TFaultRepairMessageQuery;
 import com.ruoyi.system.vo.TFaultRepairMessageVO;
 import org.apache.ibatis.annotations.Param;
@@ -33,5 +34,6 @@
      * @return
      */
     List<TFaultRepairMessageVO> pageList(@Param("query") TFaultRepairMessageQuery query, @Param("pageInfo")PageInfo<TFaultRepairMessageVO> pageInfo);
+    List<TFaultRepairMessageVO> pageListApplet(@Param("query") TFaultRepairMessageAppletQuery query, @Param("pageInfo")PageInfo<TFaultRepairMessageVO> pageInfo);
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TItemTypeMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TItemTypeMapper.java
index 3edc837..7ded449 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TItemTypeMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TItemTypeMapper.java
@@ -27,7 +27,7 @@
      */
     List<TItemType> pageList(@Param("query") TItemTypeQuery query, @Param("pageInfo")PageInfo<TItemType> pageInfo);
 
-    List<TItemTypeVO> getItemList();
+    List<TItemTypeVO> getItemList(@Param("itemName") String itemName);
 
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTenantMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTenantMapper.java
index a93206e..e0812d5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTenantMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTenantMapper.java
@@ -3,7 +3,12 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TTenant;
+import com.ruoyi.system.query.TBillAppletQuery;
+import com.ruoyi.system.query.TExamineAppletQuery;
+import com.ruoyi.system.query.TTenantAppletQuery;
 import com.ruoyi.system.query.TTenantQuery;
+import com.ruoyi.system.vo.ExamineVO;
+import com.ruoyi.system.vo.TBillVO;
 import com.ruoyi.system.vo.TenantVO;
 import org.apache.ibatis.annotations.Param;
 
@@ -26,6 +31,11 @@
      * @return
      */
     List<TenantVO> pageList(@Param("query") TTenantQuery query, @Param("pageInfo")PageInfo<TenantVO> pageInfo);
+    List<TenantVO> pageListApplet(@Param("query") TTenantAppletQuery query, @Param("pageInfo")PageInfo<TenantVO> pageInfo);
 
 
+    List<TBillVO> listBill(@Param("query") TBillAppletQuery query,@Param("pageInfo") PageInfo<TBillVO> pageInfo);
+
+    List<ExamineVO> examineList(@Param("query")TExamineAppletQuery dto, @Param("pageInfo")PageInfo<ExamineVO> pageInfo);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessExtInstance.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessExtInstance.java
new file mode 100644
index 0000000..3d15679
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessExtInstance.java
@@ -0,0 +1,29 @@
+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.ruoyi.common.core.domain.BaseModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName(value = "state_process_ext_instance")
+public class StateProcessExtInstance extends BaseModel {
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+    @ApiModelProperty(value = "模板id")
+    @TableField("template_id")
+    private String templateId;
+    @ApiModelProperty(value = "flw流程id")
+    @TableField("process_id")
+    private String processId;
+    @ApiModelProperty(value = "flw流程版本")
+    @TableField("process_version")
+    private Integer processVersion;
+
+}
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
new file mode 100644
index 0000000..b80da00
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java
@@ -0,0 +1,46 @@
+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.ruoyi.common.core.domain.BaseModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "工作流-实例操作记录表")
+@TableName(value = "state_process_instance_action")
+public class StateProcessInstanceAction extends BaseModel {
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+    @ApiModelProperty(value = "流程实例id")
+    @TableField("instance_id")
+    private String instanceId;
+    @ApiModelProperty(value = "抄送、自动审批:true")
+    @TableField("robot")
+    private boolean robot;
+    @ApiModelProperty(value = "审批办理人id")
+    @TableField("auditor_id")
+    private String auditorId;
+    @ApiModelProperty(value ="动作类型")
+    @TableField("action_type")
+    private Integer actionType;
+    @ApiModelProperty(value = "抄送人")
+    @TableField("user_ids")
+    private String userIds;
+    @ApiModelProperty(value = "分配人ID")
+    @TableField("assignee_id")
+    private String assigneeId;
+    @ApiModelProperty(value = "节点ID")
+    @TableField("node_id")
+    private String nodeId;
+    @ApiModelProperty(value = "备注")
+    @TableField("remark")
+    private String remark;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessModule.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessModule.java
new file mode 100644
index 0000000..5b41fda
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessModule.java
@@ -0,0 +1,39 @@
+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.ruoyi.common.core.domain.BaseModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName(value = "state_process_module")
+public class StateProcessModule extends BaseModel {
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+    /**
+     * 1=合同新增
+     * 2=合同签订
+     * 3=合同提前终止
+     */
+    @ApiModelProperty(value = "规格类型")
+    @TableField("category")
+    private String category;
+    @ApiModelProperty(value = "涉及类型")
+    @TableField("name")
+    private String name;
+    @ApiModelProperty(value = "流程名称")
+    @TableField("template_name")
+    private String templateName;
+    @ApiModelProperty(value = "流程id")
+    @TableField("template_id")
+    private String templateId;
+    @ApiModelProperty(value = "备注")
+    @TableField("remark")
+    private String remark;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessTemplate.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessTemplate.java
new file mode 100644
index 0000000..fef5305
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessTemplate.java
@@ -0,0 +1,49 @@
+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.ruoyi.common.core.domain.BaseModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "工作流-模版")
+@TableName(value = "state_process_template")
+public class StateProcessTemplate extends BaseModel {
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+    @ApiModelProperty(value = "模版标识")
+    @TableField("template_key")
+    private String templateKey;
+    @ApiModelProperty(value = "版本,默认1")
+    @TableField("template_version")
+    private Integer templateVersion;
+    @ApiModelProperty(value = "模版名称")
+    @TableField("template_name")
+    private String templateName;
+    @ApiModelProperty(value = "基础设置")
+    @TableField("settings")
+    private String settings;
+    @ApiModelProperty(value = "流程定义")
+    @TableField("process")
+    private String process;
+    @ApiModelProperty(value = "备注")
+    @TableField("remark")
+    private String remark;
+    @ApiModelProperty(value = "0:停用;1:正常")
+    @TableField("status")
+    private Integer status;
+    @ApiModelProperty(value = "workflow_id")
+    @TableField("work_flow_id")
+    private Long workFlowId;
+    @ApiModelProperty(value = "workflow流程版本")
+    @TableField("workflow_version")
+    private Integer workflowVersion;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java
new file mode 100644
index 0000000..ab25bf9
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java
@@ -0,0 +1,42 @@
+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.ruoyi.common.core.domain.BaseModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "任务")
+@TableName(value = "state_task_center" )
+public class StateTaskCenter extends BaseModel {
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+    @ApiModelProperty(value = "任务名称")
+    @TableField("name")
+    private String name;
+    @ApiModelProperty(value = "模块名称")
+    @TableField("module_name")
+    private String moduleName;
+    @ApiModelProperty(value = "系统摘要")
+    @TableField("remark")
+    private String remark;
+    @ApiModelProperty(value = "类型")
+    @TableField("category")
+    private String category;
+    @ApiModelProperty(value = "流程id")
+    @TableField("flow_id")
+    private String flowId;
+    @TableField("variable")
+    private String variable;
+    @ApiModelProperty(value = "合同项目id")
+    @TableField("project_id")
+    private String projectId;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TCheckAcceptRecord.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TCheckAcceptRecord.java
index 6a50c67..7dbba85 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TCheckAcceptRecord.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TCheckAcceptRecord.java
@@ -47,6 +47,10 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @TableField("check_time")
     private LocalDateTime checkTime;
+    @ApiModelProperty(value = "应验收日期")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @TableField("acceptance_time")
+    private LocalDateTime acceptanceTime;
 
     @ApiModelProperty(value = "退租原因")
     @TableField("lease_reason")
@@ -91,8 +95,11 @@
     @ApiModelProperty(value = "验收结算金额")
     @TableField("check_money")
     private BigDecimal checkMoney;
-    @ApiModelProperty(value = "验收状态 待验收 已验收")
+    @ApiModelProperty(value = "验收状态 0待验收 1已验收")
     @TableField("status")
-    private String status;
+    private Boolean status;
+    @ApiModelProperty(value = "验收单号 前端忽略不传")
+    @TableField("code")
+    private String code;
 
 }
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 800f497..12c8605 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
@@ -143,7 +143,7 @@
      * 7	待结算
      * 8	已结算
      */
-    @ApiModelProperty(value = "状态 待提交 待审批 未签订 已签订....")
+    @ApiModelProperty(value = "合同状态 1=待提交 2=待审批 3=未签订 4=已签订 5=已驳回 6=已终止 7=待结算 8=已结算")
     @TableField("status")
     private String status;
     @ApiModelProperty(value = "内存大小多个文件逗号拼接")
@@ -164,5 +164,8 @@
     @ApiModelProperty(value = "房屋名称")
     @TableField(exist = false)
     private String houseName;
+    @ApiModelProperty(value = "房屋地址")
+    @TableField(exist = false)
+    private String houseAddress;
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TFaultRepairMessage.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TFaultRepairMessage.java
index c1dec51..ea3d9ec 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TFaultRepairMessage.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TFaultRepairMessage.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
@@ -74,9 +76,8 @@
     private Integer repairType;
 
     @ApiModelProperty(value = "上门时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @TableField("visit_time")
-    private LocalDateTime visitTime;
+    private String visitTime;
 
     @ApiModelProperty(value = "联系电话")
     @TableField("contact_number")
@@ -91,9 +92,9 @@
     private String handlePerson;
 
     @ApiModelProperty(value = "处理时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     @TableField("handle_time")
-    private LocalDateTime handleTime;
+    private LocalDate handleTime;
 
     @ApiModelProperty(value = "结果描述")
     @TableField("result_describe")
@@ -110,6 +111,9 @@
     @ApiModelProperty(value = "附件名称  逗号分割")
     @TableField("attachment_name")
     private String attachmentName;
+    @ApiModelProperty(value = "维修单号")
+    @TableField("code")
+    private String code;
 
     @ApiModelProperty(value = "状态 1=待处理 2=已处理")
     @TableField("status")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/THouse.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/THouse.java
index 50fd212..9a03ab2 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/THouse.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/THouse.java
@@ -47,7 +47,7 @@
 
     @ApiModelProperty(value = "建筑面积")
     @TableField("house_area")
-    private Integer houseArea;
+    private String houseArea;
 
     @ApiModelProperty(value = "户型")
     @TableField("house_type")
@@ -87,6 +87,9 @@
     @ApiModelProperty(value = "房号")
     @TableField("room_number")
     private String roomNumber;
+    @ApiModelProperty(value = "产权人联系方式")
+    @TableField("phone")
+    private String phone;
 
     @ApiModelProperty(value = "住户类型 1月租 2季租 3年租")
     @TableField(exist = false)
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TInformation.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TInformation.java
index eb090cf..3132361 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TInformation.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TInformation.java
@@ -59,6 +59,10 @@
     @TableField("cover")
     private String cover;
 
+    @ApiModelProperty(value = "简介")
+    @TableField("brief_introduction")
+    private String briefIntroduction;
+
     @ApiModelProperty(value = "内容")
     @TableField("content")
     private String content;
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
new file mode 100644
index 0000000..e2141dd
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java
@@ -0,0 +1,30 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class TBillAppletQuery extends BasePage {
+    /**
+     * 缴费状态 1=未缴费 2=待确认 3=已缴费 4=已逾期
+     */
+    @ApiModelProperty("缴费状态 全部不传 1=未缴费 2=待确认 3=已缴费 4=已逾期")
+    private Integer payFeesStatus;
+    /**
+     * 租户ID
+     */
+    @ApiModelProperty("租户ID")
+    private String id;
+    /**
+     * 合同ids
+     */
+    @ApiModelProperty("合同ids 前端忽略")
+    private List<String> contractIds;
+
+
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TCheckAcceptRecordAppletQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TCheckAcceptRecordAppletQuery.java
new file mode 100644
index 0000000..9c6ff23
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TCheckAcceptRecordAppletQuery.java
@@ -0,0 +1,18 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.model.TimeRangeQueryBody;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "小程序管理员-验收记录查询对象query")
+public class TCheckAcceptRecordAppletQuery extends TimeRangeQueryBody {
+
+    @ApiModelProperty(value = "房屋名称或地址")
+    private String houseNameOrAddress;
+
+    @ApiModelProperty(value = "状态 不传为全部 1待验收 2已验收")
+    private Integer status;
+
+}
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 52031d9..3b0238e 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
@@ -5,6 +5,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotBlank;
 import java.util.List;
 
 @Data
@@ -16,8 +17,11 @@
     private String contractNumber;
     @ApiModelProperty(value = "合同名称")
     private Integer contractName;
-    @ApiModelProperty(value = "合同状态 1=待提交 2=待审批 3=未签订 4=已签订")
+    @ApiModelProperty(value = "合同状态 1=待提交 2=待审批 3=未签订 4=已签订 5=已驳回 6=已终止 7=待结算 8=已结算")
     private Integer status;
     @ApiModelProperty(value = "选中的行")
     private List<String> ids;
+    @NotBlank(message = "租户id不可为空")
+    @ApiModelProperty(value = "租户id")
+    private String tenantId;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TExamineAppletQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TExamineAppletQuery.java
new file mode 100644
index 0000000..e2d4612
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TExamineAppletQuery.java
@@ -0,0 +1,36 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "我的审批查询query")
+public class TExamineAppletQuery extends BasePage {
+    /**
+     * 1待审批 2已审批 3我发起的
+     */
+    @ApiModelProperty("1待审批 2已审批 3我发起的")
+    private Integer status;
+    /**
+     * 时间 1最近1天 2最近7天 3最近30天
+     */
+    @ApiModelProperty("时间全部不传 1最近1天 2最近7天 3最近30天")
+    private Integer time;
+    /**
+     * 1倒序 2正序 首次默认倒序排
+     */
+    @ApiModelProperty("最新到达1倒序  最早到达2正序 首次默认倒序排")
+    private Integer sort;
+    @ApiModelProperty("登陆人名称 前端忽略")
+    private String userName;
+
+
+
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TFaultRepairMessageAppletQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TFaultRepairMessageAppletQuery.java
new file mode 100644
index 0000000..aa43d32
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TFaultRepairMessageAppletQuery.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "小程序房屋维修受理列表query")
+public class TFaultRepairMessageAppletQuery extends BasePage {
+
+    @ApiModelProperty(value = "房屋地址")
+    private String houseAddress;
+    @ApiModelProperty(value = "处理状态 1=待处理 2=已处理")
+    private Integer status;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TTenantAppletQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TTenantAppletQuery.java
new file mode 100644
index 0000000..5d1b35c
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TTenantAppletQuery.java
@@ -0,0 +1,18 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "租户查询Query")
+public class TTenantAppletQuery extends BasePage {
+
+    @ApiModelProperty(value = "租户姓名或电话")
+    private String residentNameOrPhone;
+
+
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
index 7a50061..063e8a5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
@@ -232,4 +232,6 @@
      * @return 结果
      */
     public int editRole(SysRoleDTO dto);
+
+    List<SysRole> selectRoleByUserIds(List<String> roleIds);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessExtInstanceService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessExtInstanceService.java
new file mode 100644
index 0000000..902e39d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessExtInstanceService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.model.StateProcessExtInstance;
+
+public interface StateProcessExtInstanceService extends IService<StateProcessExtInstance> {
+}
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
new file mode 100644
index 0000000..85b5090
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.model.StateProcessInstanceAction;
+
+public interface StateProcessInstanceActionService extends IService<StateProcessInstanceAction> {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessModuleService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessModuleService.java
new file mode 100644
index 0000000..3a010e1
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessModuleService.java
@@ -0,0 +1,8 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.model.StateProcessModule;
+
+public interface StateProcessModuleService extends IService<StateProcessModule> {
+
+}
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
new file mode 100644
index 0000000..450d70e
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java
@@ -0,0 +1,46 @@
+package com.ruoyi.system.service;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.bo.*;
+import com.ruoyi.system.model.StateProcessTemplate;
+import com.ruoyi.system.vo.ProcessDetailVO;
+import com.ruoyi.system.vo.ProcessTaskListVO;
+
+public interface StateProcessTemplateService extends IService<StateProcessTemplate> {
+
+    Page<StateProcessTemplate> page(ProcessTemplatePageBO request);
+
+    Boolean update(ProcessUpdateBO processUpdateBO);
+
+    //新增
+    Boolean create(ProcessCreateBO processCreateBO);
+
+    /**
+     * 启动流程
+     * @param processStartBO
+     * @return
+     */
+    Boolean start(ProcessStartBO processStartBO);
+
+    //待办
+    PageInfo<ProcessTaskListVO> waitTaskPage(ProcessTaskListBO processTaskListBO);
+
+    //已办
+    PageInfo<ProcessTaskListVO> dealTaskPage(ProcessTaskListBO processTaskListBO);
+
+    //抄送
+    PageInfo<ProcessTaskListVO> copyTaskPage(ProcessTaskListBO processTaskListBO);
+
+    //同意
+    void agree(ProcessAgreeBO  processAgreeBO);
+
+    //拒绝
+    void refuse(ProcessRefuseBO processRefuseBO);
+
+    PageInfo<ProcessTaskListVO> dealAndWaitTaskPage(ProcessTaskListBO processTemplatePageBO);
+
+    ProcessDetailVO detail(String taskId);
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java
new file mode 100644
index 0000000..05fd6b1
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java
@@ -0,0 +1,12 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.bo.ProcessTaskListBO;
+import com.ruoyi.system.model.StateTaskCenter;
+import com.ruoyi.system.vo.ProcessTaskListVO;
+
+public interface StateTaskCenterService extends IService<StateTaskCenter> {
+    PageInfo<ProcessTaskListVO> pageList(ProcessTaskListBO processTaskListBO);
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TBannerService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TBannerService.java
index b2ed584..9b7b161 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TBannerService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TBannerService.java
@@ -5,6 +5,8 @@
 import com.ruoyi.system.model.TBanner;
 import com.ruoyi.system.query.TBannerQuery;
 
+import java.util.List;
+
 /**
  * <p>
  * 轮播图管理 服务类
@@ -21,4 +23,5 @@
      * @return
      */
     PageInfo<TBanner> pageList(TBannerQuery query);
+    List<TBanner> list(TBannerQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TCheckAcceptRecordService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TCheckAcceptRecordService.java
index dd07c92..974dfb3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TCheckAcceptRecordService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TCheckAcceptRecordService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TCheckAcceptRecord;
+import com.ruoyi.system.query.TCheckAcceptRecordAppletQuery;
 import com.ruoyi.system.query.TCheckAcceptRecordQuery;
 import com.ruoyi.system.vo.TCheckAcceptRecordVO;
 
@@ -22,4 +23,5 @@
      * @return
      */
     PageInfo<TCheckAcceptRecordVO> pageList(TCheckAcceptRecordQuery query);
+    PageInfo<TCheckAcceptRecordVO> pageListApplet(TCheckAcceptRecordAppletQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TContractService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TContractService.java
index 5139836..00b2a31 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TContractService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TContractService.java
@@ -40,4 +40,7 @@
     void export(TContractQuery query);
 
     List<TContract> contractExportList(TContractQuery query);
+
+    Boolean updateContractAuditStatus(String projectId, Integer submitStatus);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TFaultRepairMessageService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TFaultRepairMessageService.java
index 272ec26..5ae51db 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TFaultRepairMessageService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TFaultRepairMessageService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TFaultRepairMessage;
+import com.ruoyi.system.query.TFaultRepairMessageAppletQuery;
 import com.ruoyi.system.query.TFaultRepairMessageQuery;
 import com.ruoyi.system.vo.TFaultRepairMessageVO;
 
@@ -29,4 +30,5 @@
      * @return
      */
     PageInfo<TFaultRepairMessageVO> pageList(TFaultRepairMessageQuery query);
+    PageInfo<TFaultRepairMessageVO> pageListApplet(TFaultRepairMessageAppletQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TItemTypeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TItemTypeService.java
index 14ee3d1..3b8af03 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TItemTypeService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TItemTypeService.java
@@ -32,5 +32,5 @@
      */
     PageInfo<TItemType> pageList(TItemTypeQuery query);
 
-    List<TItemTypeVO> getItemList();
+    List<TItemTypeVO> getItemList(String itemName);
 }
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 590f644..989de6c 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
@@ -2,11 +2,20 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.dto.TBillDto;
+import com.ruoyi.system.model.TContract;
+import com.ruoyi.system.model.THouse;
+import com.ruoyi.system.query.TBillAppletQuery;
+import com.ruoyi.system.query.TExamineAppletQuery;
+import com.ruoyi.system.query.TTenantAppletQuery;
 import com.ruoyi.system.utils.wx.pojo.AppletUserDecodeData;
 import com.ruoyi.system.model.TTenant;
 import com.ruoyi.system.query.TTenantQuery;
+import com.ruoyi.system.vo.ExamineVO;
+import com.ruoyi.system.vo.TBillVO;
 import com.ruoyi.system.vo.TenantVO;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -25,6 +34,15 @@
      * @return
      */
     PageInfo<TenantVO> pageList(TTenantQuery query);
+    PageInfo<TenantVO> pageListApplet(TTenantAppletQuery query);
 
 
+    List<THouse> listHouse(String id);
+
+    List<TContract> listContract(String id);
+
+    PageInfo<TBillVO> listBill(TBillAppletQuery query);
+
+    PageInfo<ExamineVO> examineList(TExamineAppletQuery 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
new file mode 100644
index 0000000..d8efb13
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
@@ -0,0 +1,246 @@
+package com.ruoyi.system.service.impl;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import com.aizuda.bpm.engine.FlowLongEngine;
+import com.aizuda.bpm.engine.assist.ObjectUtils;
+import com.aizuda.bpm.engine.core.FlowCreator;
+import com.aizuda.bpm.engine.core.FlowLongContext;
+import com.aizuda.bpm.engine.core.enums.EventType;
+import com.aizuda.bpm.engine.core.enums.NodeApproveSelf;
+import com.aizuda.bpm.engine.core.enums.NodeSetType;
+import com.aizuda.bpm.engine.core.enums.TaskType;
+import com.aizuda.bpm.engine.entity.FlwExtInstance;
+import com.aizuda.bpm.engine.entity.FlwHisTask;
+import com.aizuda.bpm.engine.entity.FlwTask;
+import com.aizuda.bpm.engine.entity.FlwTaskActor;
+import com.aizuda.bpm.engine.listener.TaskListener;
+import com.aizuda.bpm.engine.model.NodeAssignee;
+import com.aizuda.bpm.engine.model.NodeModel;
+import com.aizuda.bpm.engine.model.ProcessModel;
+import com.aizuda.bpm.mybatisplus.mapper.FlwExtInstanceMapper;
+import com.aizuda.bpm.mybatisplus.mapper.FlwHisTaskMapper;
+import com.aizuda.bpm.mybatisplus.mapper.FlwTaskActorMapper;
+import com.aizuda.bpm.mybatisplus.mapper.FlwTaskMapper;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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 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.function.Supplier;
+import java.util.stream.Collectors;
+
+
+/**
+ * 工作流程全局任务监听 同步方式  只监听流程完成、流程中断类型,修改拒绝状态
+ * <p>
+ * 1. 入户调查
+ * 2. 价格评估
+ * 3. 协议签订
+ * 4. 资金管理-预算资金
+ * 5. 住宅临时安置补助费
+ * 6. 停产停业经济损失补助费
+ * 7. 安置情况(流程图中叫做录入货币补偿金额信息)
+ * 固定对应表 state_process_module
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class FlowListenerService implements TaskListener {
+
+    private final FlwExtInstanceMapper flwExtInstanceMapper;
+    private final FlowLongEngine flowLongEngine;
+    private final FlwTaskActorMapper flwTaskActorMapper;
+    private final FlwHisTaskMapper flwHisTaskMapper;
+    private final ISysRoleService sysRoleService;
+    private final FlwTaskMapper flwTaskMapper;
+    private final TContractService contractService;
+
+
+    @Override
+    public boolean notify(EventType eventType, Supplier<FlwTask> supplier, NodeModel nodeModel, FlowCreator flowCreator) {
+        FlwTask flwTask = supplier.get();
+        if (ObjectUtil.isNull(flwTask)) {
+            return true;
+        }
+        // 创建任务时候,判断是否自动审批通过
+        if (EventType.create.eq(eventType)) {
+            Integer approveSelf = nodeModel.getApproveSelf();
+            if (NodeApproveSelf.AutoSkip.eq(approveSelf)) {
+                // 普通成员情况
+                List<NodeAssignee> nodeAssigneeList = null;
+                if (NodeSetType.specifyMembers.eq(nodeModel.getSetType())) {
+                    nodeAssigneeList = nodeModel.getNodeAssigneeList();
+                    if (ObjectUtil.isEmpty(nodeAssigneeList)) {
+                        return true;
+                    }
+                    //查询发起人
+                    LambdaQueryWrapper<FlwHisTask> flwHisTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                    flwHisTaskLambdaQueryWrapper.eq(FlwTask::getTaskType, TaskType.major.getValue());
+                    flwHisTaskLambdaQueryWrapper.eq(FlwTask::getInstanceId, flwTask.getInstanceId());
+                    FlwHisTask flwHisTask = flwHisTaskMapper.selectOne(flwHisTaskLambdaQueryWrapper);
+                    if (ObjectUtil.isEmpty(flwHisTask)) {
+                        return true;
+                    }
+                    //对比发起人和节点审批人
+                    if (nodeAssigneeList.stream().noneMatch(t -> Objects.equals(t.getId(), flwHisTask.getCreateId()))) {
+                        return true;
+                    }
+                    //查询当前节点审核人是否与创建人一致
+                    List<FlwTaskActor> flwTaskActor = flwTaskActorMapper.selectListByTaskId(flwTask.getId());
+                    if (ObjectUtil.isNotEmpty(flwTaskActor)) {
+                        for (FlwTaskActor flwTaskActor1 : flwTaskActor) {
+                            if (flwTaskActor1.getActorId().equals(flwHisTask.getCreateId())) {
+                                return flowLongEngine.autoJumpTask(flwTask.getId(), flowCreator);
+                            }
+                        }
+                    }
+                } else if (NodeSetType.role.eq(nodeModel.getSetType())) {
+                    //角色任务跳过
+                    nodeAssigneeList = nodeModel.getNodeAssigneeList();
+                    //获取角色下的用户
+                    List<String> roleIds = nodeAssigneeList.stream().map(NodeAssignee::getId).collect(Collectors.toList());
+                    List<SysRole> actorList = sysRoleService.selectRoleByUserIds(roleIds);
+                    List<FlwTaskActor> flwTaskActors = new ArrayList<>();
+                    if(ObjectUtils.isNotEmpty(actorList)) {
+                        for (SysRole sysRole : actorList) {
+                            if(ObjectUtil.isEmpty(sysRole.getRoleName())) {
+                                continue;
+                            }
+                            NodeAssignee nodeAssignee = new NodeAssignee();
+                            nodeAssignee.setId(String.valueOf(sysRole.getRoleId()));
+                            nodeAssignee.setName(sysRole.getRoleName());
+                            flwTaskActors.add(FlwTaskActor.of(nodeAssignee, 0));
+                        }
+                    }
+                    if (ObjectUtil.isEmpty(flwTaskActors)) {
+                        return true;
+                    }
+                    //查询发起人
+                    LambdaQueryWrapper<FlwHisTask> flwHisTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                    flwHisTaskLambdaQueryWrapper.eq(FlwTask::getTaskType, TaskType.major.getValue());
+                    flwHisTaskLambdaQueryWrapper.eq(FlwTask::getInstanceId, flwTask.getInstanceId());
+                    FlwHisTask flwHisTask = flwHisTaskMapper.selectOne(flwHisTaskLambdaQueryWrapper);
+                    if (ObjectUtil.isEmpty(flwHisTask)) {
+                        return true;
+                    }
+                    //对比发起人和节点审批人
+                    if (flwTaskActors.stream().noneMatch(t -> Objects.equals(t.getActorId(), flwHisTask.getCreateId()))) {
+                        return true;
+                    }
+                    //查询当前节点审核人是否与创建人一致
+                    List<FlwTaskActor> flwTaskActor = flwTaskActorMapper.selectListByTaskId(flwTask.getId());
+                    if (ObjectUtil.isNotEmpty(flwTaskActor)) {
+                        for (FlwTaskActor flwTaskActor1 : flwTaskActor) {
+                            if (flwTaskActor1.getActorId().equals(flwHisTask.getCreateId())) {
+                                return flowLongEngine.autoJumpTask(flwTask.getId(), flowCreator);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        if (eventType.equals(EventType.reject) || eventType.equals(EventType.autoReject)) {
+            System.out.println("流程失败:" + flwTask.getVariable());
+            handlerBusiness(flwTask.getVariable(), 2);
+        } else if (eventType.equals(EventType.complete)) {
+            // 查询流程模型
+            FlwExtInstance flwExtInstance = flwExtInstanceMapper.selectById(flwTask.getInstanceId());
+            String modelContent = flwExtInstance.getModelContent();
+            ProcessModel processModel = FlowLongContext.parseProcessModel(modelContent, null, false);
+            NodeModel node = processModel.getNode(flwTask.getTaskKey());
+            if (ObjectUtil.isEmpty(node)) {
+                log.error("节点不存在 TaskName:{} InstanceId:{}", flwTask.getTaskName(), flwTask.getInstanceId());
+                return true;
+            }
+            long count = flwTaskMapper.selectCount(new LambdaQueryWrapper<FlwTask>().eq(FlwTask::getInstanceId,flwTask.getInstanceId()));
+            if(count > 0){
+                return true;
+            }
+            //最后一个节点
+            if (ObjectUtil.isEmpty(node.getChildNode()) || ObjectUtil.isEmpty(node.getChildNode().getNodeName())) {
+                System.out.println("流程完成:" + flwTask.getVariable());
+                handlerBusiness(flwTask.getVariable(), 1);
+            }
+        } else if (eventType.eq(EventType.cc)) {
+            // 查询流程模型//抄送
+            FlwExtInstance flwExtInstance = flwExtInstanceMapper.selectById(flwTask.getInstanceId());
+            String modelContent = flwExtInstance.getModelContent();
+            ProcessModel processModel = FlowLongContext.parseProcessModel(modelContent, null, false);
+            NodeModel node = processModel.getNode(flwTask.getTaskKey());
+            if (ObjectUtil.isEmpty(node)) {
+                log.error("节点不存在 TaskName:{} InstanceId:{}", flwTask.getTaskName(), flwTask.getInstanceId());
+                return true;
+            }
+            //抄送是最后一个节点
+            if (ObjectUtil.isEmpty(node.getChildNode()) || ObjectUtil.isEmpty(node.getChildNode().getNodeName())) {
+                System.out.println("流程完成:" + flwTask.getVariable());
+                handlerBusiness(flwTask.getVariable(), 1);
+            }
+        } else if(eventType.eq(EventType.autoJump)){
+            // 查询流程模型 自动跳转
+            FlwExtInstance flwExtInstance = flwExtInstanceMapper.selectById(flwTask.getInstanceId());
+            String modelContent = flwExtInstance.getModelContent();
+            ProcessModel processModel = FlowLongContext.parseProcessModel(modelContent, null, false);
+            NodeModel node = processModel.getNode(flwTask.getTaskKey());
+            if (ObjectUtil.isEmpty(node)) {
+                log.error("节点不存在 TaskName:{} InstanceId:{}", flwTask.getTaskName(), flwTask.getInstanceId());
+                return true;
+            }
+            long count = flwTaskMapper.selectCount(new LambdaQueryWrapper<FlwTask>().eq(FlwTask::getInstanceId,flwTask.getInstanceId()));
+            if(count > 0){
+                return true;
+            }
+            //最后一个节点
+            if (ObjectUtil.isEmpty(node.getChildNode()) || ObjectUtil.isEmpty(node.getChildNode().getNodeName())) {
+                System.out.println("流程完成:" + flwTask.getVariable());
+                handlerBusiness(flwTask.getVariable(), 1);
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 业务状态变更
+     */
+    private void handlerBusiness(String variable, Integer status) {
+        JSONObject processParameter = JSON.parseObject(variable);
+        //必须参数,肯定有不判断null
+        Integer category = processParameter.getInteger("category");
+        //状态 暂定:0待审核 1审核通过 2审核拒绝
+        ProcessCategoryEnum categoryEnum = ProcessCategoryEnum.getEnumByKey(category);
+        switch (categoryEnum) {
+            case CATEGORY1: {
+                // 合同新增审批
+                int submitStatus = status==0?2:(status==1?3:5);
+                contractService.updateContractAuditStatus(processParameter.getString("projectId"), submitStatus);
+                // TODO 发短信
+                break;
+            }
+            case CATEGORY2: {
+                // 合同签订审批
+                break;
+            }
+            case CATEGORY3: {
+                // 合同提前终止审批
+                break;
+            }
+            default:
+                throw new ServiceException("错误类型");
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessExtInstanceServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessExtInstanceServiceImpl.java
new file mode 100644
index 0000000..f79908a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessExtInstanceServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.mapper.StateProcessExtInstanceMapper;
+import com.ruoyi.system.model.StateProcessExtInstance;
+import com.ruoyi.system.service.StateProcessExtInstanceService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class StateProcessExtInstanceServiceImpl extends ServiceImpl<StateProcessExtInstanceMapper, StateProcessExtInstance> implements StateProcessExtInstanceService {
+}
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
new file mode 100644
index 0000000..45a3d5a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.mapper.StateProcessInstanceActionMapper;
+import com.ruoyi.system.model.StateProcessInstanceAction;
+import com.ruoyi.system.service.StateProcessInstanceActionService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class StateProcessInstanceActionServiceImpl extends ServiceImpl<StateProcessInstanceActionMapper, StateProcessInstanceAction> implements StateProcessInstanceActionService {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessModuleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessModuleServiceImpl.java
new file mode 100644
index 0000000..709e99f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessModuleServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.mapper.StateProcessModuleMapper;
+import com.ruoyi.system.model.StateProcessModule;
+import com.ruoyi.system.service.StateProcessModuleService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class StateProcessModuleServiceImpl extends ServiceImpl<StateProcessModuleMapper, StateProcessModule> implements StateProcessModuleService {
+}
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
new file mode 100644
index 0000000..3597645
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
@@ -0,0 +1,785 @@
+package com.ruoyi.system.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+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.core.FlowCreator;
+import com.aizuda.bpm.engine.core.enums.TaskType;
+import com.aizuda.bpm.engine.entity.*;
+import com.aizuda.bpm.engine.model.NodeModel;
+import com.aizuda.bpm.mybatisplus.mapper.*;
+import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson2.JSONWriter;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+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.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.enums.StateProcessActionEnum;
+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.model.*;
+import com.ruoyi.system.service.*;
+import com.ruoyi.system.vo.ProcessDetailVO;
+import com.ruoyi.system.vo.ProcessTaskListVO;
+import lombok.AllArgsConstructor;
+import org.apache.commons.io.IOUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Service
+public class StateProcessTemplateServiceImpl extends ServiceImpl<StateProcessTemplateMapper, StateProcessTemplate> implements StateProcessTemplateService {
+
+    @Autowired
+    private FlowLongEngine flowLongEngine;
+    @Autowired
+    private StateProcessInstanceActionService stateProcessInstanceActionService;
+    @Autowired
+    private StateProcessExtInstanceService stateProcessExtInstanceService;
+    @Autowired
+    private FlwHisInstanceMapper flwHisInstanceMapper;
+    @Autowired
+    private FlwTaskActorMapper flwTaskActorMapper;
+    @Autowired
+    private FlwTaskMapper flwTaskMapper;
+    @Autowired
+    private StateTaskCenterService stateTaskCenterService;
+    @Autowired
+    private StateProcessModuleService stateProcessModuleService;
+    @Autowired
+    private FlwHisTaskMapper flwHisTaskMapper;
+    @Autowired
+    private FlwHisTaskActorMapper flwHisTaskActorMapper;
+    @Autowired
+    private ISysUserService sysUserService;
+    @Autowired
+    private TContractService contractService;
+
+    /**
+     * 流程模版分页
+     * @param request
+     * @return
+     */
+    @Override
+    public Page<StateProcessTemplate> page(ProcessTemplatePageBO request) {
+        //查询流程模板列表
+        Page<StateProcessTemplate> templatePage = this.baseMapper.page(new Page<>(request.getCurrentPage(), request.getPageSize()), request);
+
+        //更新人id列表
+        List<String> updateUserNameList = templatePage.getRecords().stream().map(BaseModel::getUpdateBy).collect(Collectors.toList());
+        if (!CollectionUtils.isEmpty(updateUserNameList)) {
+            //根据用户id列表查询用户信息
+            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserNameList);
+            Map<String, SysUser> sysUserMap;
+            if (!CollectionUtils.isEmpty(sysUsers)) {
+                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserName, Function.identity()));
+            } else {
+                sysUserMap = new HashMap<>();
+            }
+            //遍历列表,设置更新人名称
+            templatePage.getRecords().forEach(e -> {
+                SysUser sysUser = sysUserMap.get(e.getUpdateBy());
+                if (Objects.nonNull(sysUser)) {
+                    e.setUpdateBy(sysUser.getNickName());
+                }
+            });
+        }
+        return templatePage;
+    }
+
+    /**
+     * 修改并部署模版
+     * @param processUpdateBO
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean update(ProcessUpdateBO processUpdateBO) {
+        //查询流程模板
+        StateProcessTemplate temp = this.getById(processUpdateBO.getId());
+        //根据template_key查询最新版本的模板
+        StateProcessTemplate template = this.getOne(Wrappers.<StateProcessTemplate>lambdaQuery()
+                .eq(StateProcessTemplate::getTemplateKey, temp.getTemplateKey())
+                .apply("(template_key, template_version) in("
+                        + "SELECT template_key, MAX(template_version) "
+                        + "FROM state_process_template " + "GROUP BY template_key)"));
+
+        if (Objects.isNull(template)) {
+            throw new GlobalException(StateErrorCode.PROCESS_TEMPLATE_NOT_EXISTS.getValue());
+        }
+
+        // 部署流程
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+
+        FlowCreator creator = FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName());
+        DeployBO deployBO = new DeployBO();
+        deployBO.setKey(template.getTemplateKey());
+        deployBO.setName(processUpdateBO.getTemplateName());
+        deployBO.setNodeConfig(JSONObject.parseObject(processUpdateBO.getProcess(), NodeModel.class));
+
+        String deployResult = JSONObject.toJSONString(deployBO, JSONWriter.Feature.WriteMapNullValue);
+        InputStream inputStream = IOUtils.toInputStream(deployResult, StandardCharsets.UTF_8.name());
+        Long deployId = flowLongEngine.processService().deploy(inputStream, creator, true, null);
+        FlwProcess flwProcess = flowLongEngine.processService().getProcessById(deployId);
+
+        // 更新模板, version+1
+        StateProcessTemplate processTemplate = new StateProcessTemplate();
+        processTemplate.setId(processUpdateBO.getId());
+        processTemplate.setWorkFlowId(deployId);
+        processTemplate.setWorkflowVersion(flwProcess.getProcessVersion());
+        processTemplate.setTemplateName(processUpdateBO.getTemplateName());
+
+        processTemplate.setTemplateKey(template.getTemplateKey());
+        processTemplate.setProcess(processUpdateBO.getProcess());
+        processTemplate.setRemark(processUpdateBO.getRemark());
+        processTemplate.setUpdateBy(SecurityUtils.getLoginUser().getUsername());
+        processTemplate.setUpdateTime(LocalDateTime.now());
+        processTemplate.setTemplateVersion(temp.getTemplateVersion() + 1);
+        return this.updateById(processTemplate);
+
+        //查询版本是否绑定流程,更新
+//        LambdaQueryWrapper<StateProcessModule> queryWrapper = new LambdaQueryWrapper<>();
+//        queryWrapper.eq(StateProcessModule::getTemplateId, processUpdateBO.getId());
+//        List<StateProcessModule> stateProcessModules = stateProcessModuleService.list(queryWrapper);
+//        if (Objects.isNull(stateProcessModules) || stateProcessModules.isEmpty()) {
+//            return true;
+//        }
+//        for (StateProcessModule stateProcessModule : stateProcessModules) {
+//            stateProcessModule.setTemplateId(processTemplate.getId());
+//            stateProcessModule.setTemplateName(processTemplate.getTemplateName());
+//        }
+//        return stateProcessModuleService.updateBatchById(stateProcessModules);
+    }
+
+    /**
+     * 创建并部署模版
+     * @param processCreateBO
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean create(ProcessCreateBO processCreateBO) {
+        //查询模版是否存在
+        List<StateProcessTemplate> keys = this.list(Wrappers.<StateProcessTemplate>lambdaQuery().
+                eq(StateProcessTemplate::getTemplateName, processCreateBO.getTemplateName()));
+        if (!CollectionUtils.isEmpty(keys)) {
+            throw new GlobalException(StateErrorCode.PROCESS_TEMPLATE_KEY_EXISTS.getValue());
+        }
+
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        FlowCreator creator = FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName());
+
+        DeployBO deployBO = new DeployBO();
+        deployBO.setKey(IdUtil.simpleUUID());
+        deployBO.setName(processCreateBO.getTemplateName());
+        deployBO.setNodeConfig(JSONObject.parseObject(processCreateBO.getProcess(), NodeModel.class));
+
+        String deployResult = JSONObject.toJSONString(deployBO, JSONWriter.Feature.WriteMapNullValue);
+
+        InputStream inputStream = IOUtils.toInputStream(deployResult, StandardCharsets.UTF_8.name());
+        Long deployId = flowLongEngine.processService().deploy(inputStream, creator, false);
+        FlwProcess flwProcess = flowLongEngine.processService().getProcessById(deployId);
+
+        StateProcessTemplate processTemplate = new StateProcessTemplate();
+        processTemplate.setId(IdUtils.simpleUUID());
+        processTemplate.setWorkFlowId(deployId);
+        processTemplate.setWorkflowVersion(flwProcess.getProcessVersion());
+        processTemplate.setTemplateName(deployBO.getName());
+        processTemplate.setTemplateKey(deployBO.getKey());
+        processTemplate.setProcess(processCreateBO.getProcess());
+        processTemplate.setRemark(processCreateBO.getRemark());
+        processTemplate.setUpdateBy(loginUser.getUser().getUserName());
+        processTemplate.setUpdateTime(LocalDateTime.now());
+        return this.save(processTemplate);
+    }
+
+    /**
+     * 启动流程
+     * @param processStartBO
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean start(ProcessStartBO processStartBO) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        FlowCreator creator = FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName());
+        //查询流程绑定
+        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(loginUser.getUser().getNickName());
+            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
+     */
+    @Override
+    public PageInfo<ProcessTaskListVO> waitTaskPage(ProcessTaskListBO processTaskListBO) {
+        //获取当前登录用户信息
+        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());
+        }
+        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceIds);
+        stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
+        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);
+
+        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;
+    }
+
+    @Override
+    public PageInfo<ProcessTaskListVO> dealTaskPage(ProcessTaskListBO processTaskListBO) {
+        //获取当前登录用户信息
+        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());
+        //分页查询任务中心任务
+        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);
+        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);
+
+        if (ObjectUtil.isEmpty(processTaskListVOS)) {
+            return 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.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) {
+            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 pageInfo;
+    }
+
+    @Override
+    public PageInfo<ProcessTaskListVO> copyTaskPage(ProcessTaskListBO processTaskListBO) {
+        Long userId = SecurityUtils.getUserId();
+        QueryWrapper<FlwHisInstance> queryWrapper = new QueryWrapper<>();
+        queryWrapper.orderByDesc("create_time");
+        List<Long> flwHisInstances = flwHisInstanceMapper.selectList(queryWrapper).stream()
+                .map(FlwHisInstance::getId).collect(Collectors.toList());
+
+        LambdaQueryWrapper<FlwHisTaskActor> query = Wrappers.<FlwHisTaskActor>lambdaQuery()
+                .and(qy -> qy.eq(FlwTaskActor::getActorId, userId)
+                        .eq(FlwTaskActor::getActorType, 0)
+                        .or().in(FlwTaskActor::getActorId, userId)
+                        .eq(FlwTaskActor::getActorType, 1));
+        query = query.in(FlwHisTaskActor::getInstanceId, flwHisInstances);
+        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()
+                        //2=抄送
+                        .eq(FlwHisTask::getTaskType, 2)
+                        .in(FlwHisTask::getId, hisTaskIds));
+
+        if(ObjectUtil.isEmpty(flwHisTaskList)){
+            return new PageInfo<>();
+        }
+        List<String> instanceId = 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);
+        PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
+        PageInfo taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
+        //转换类
+        List<ProcessTaskListVO> processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class);
+        pageInfo.setRecords(processTaskListVOS);
+
+        if (ObjectUtil.isEmpty(processTaskListVOS)) {
+            return pageInfo;
+        }
+        Map<Long, List<FlwHisTask>> flwHisTaskMap = flwHisTaskList.stream().collect(Collectors.groupingBy(FlwHisTask::getInstanceId));
+
+        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<>();
+        }
+
+        //查询原因
+        List<String> taskIds = flwHisTaskList.stream().map(FlwTask::getParentTaskId).filter(ObjectUtil::isNotEmpty).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()));
+
+
+        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
+            List<FlwHisTask> flwHisTasks = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId()));
+            if (ObjectUtil.isNotEmpty(flwHisTaskMap)) {
+                //当某个用户在同一个模块审批流的多个节点都存在时,多次审核后,已审核列表页报错
+                for (FlwHisTask flwHisTask : flwHisTasks) {
+                    if (flwHisTask.getInstanceId().toString().equals(processTaskListVO.getFlowId())) {
+                        processTaskListVO.setStatus(flwHisTask.getTaskState().toString());
+                        processTaskListVO.setNodeName(flwHisTask.getTaskName());
+                        processTaskListVO.setParentTaskId(flwHisTask.getParentTaskId().toString());
+                        processTaskListVO.setTaskId(flwHisTask.getId().toString());
+                        processTaskListVO.setVariable(flwHisTask.getVariable());
+                    }
+                }
+            }
+            StateProcessInstanceAction action = actionMap.get(processTaskListVO.getParentTaskId());
+            if (ObjectUtil.isNotEmpty(action)) {
+                processTaskListVO.setReason(action.getRemark());
+            }
+            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
+            if (Objects.nonNull(sysUser)) {
+                processTaskListVO.setCreateBy(sysUser.getNickName());
+            }
+        }
+        return pageInfo;
+    }
+
+    @Override
+    public void agree(ProcessAgreeBO processAgreeBO) {
+        Long taskId = Long.valueOf(processAgreeBO.getTaskId());
+        FlwTask flwTask = flwTaskMapper.selectById(taskId);
+        if (ObjectUtil.isNull(flwTask)) {
+            throw new GlobalException("任务已处理或者不存在");
+        }
+        flowLongEngine.executeTask(taskId, currentFlowCreator());
+        // 动作执行记录
+        StateProcessInstanceAction stateProcessInstanceAction = new StateProcessInstanceAction();
+        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());
+        stateProcessInstanceActionService.save(stateProcessInstanceAction);
+    }
+
+    @Override
+    public void refuse(ProcessRefuseBO processRefuseBO) {
+        Long taskId = Long.valueOf(processRefuseBO.getTaskId());
+        FlwTask flwTask = flwTaskMapper.selectById(taskId);
+        // 直接拒绝当前流程
+        flowLongEngine.runtimeService().reject(flwTask.getInstanceId(), currentFlowCreator());
+        // 动作执行记录
+        StateProcessInstanceAction record = new StateProcessInstanceAction();
+        record.setId(IdUtils.simpleUUID());
+        record.setInstanceId(flwTask.getInstanceId().toString());
+        record.setAuditorId(String.valueOf(SecurityUtils.getUserId()));
+        record.setActionType(StateProcessActionEnum.REJECTED.getValue());
+        record.setNodeId(processRefuseBO.getTaskId());
+        record.setRemark(processRefuseBO.getRemark());
+        stateProcessInstanceActionService.save(record);
+    }
+
+    @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());
+        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());
+//        }
+//        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 = flwTasks.stream().collect(Collectors.groupingBy(FlwTask::getInstanceId));
+
+        for (ProcessTaskListVO processTaskListVO : processTaskListVOS.getRecords()) {
+            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"));
+        BeanUtil.copyProperties(contract, processDetailVO);
+
+        List<StateProcessInstanceAction> list = stateProcessInstanceActionService.list(Wrappers.<StateProcessInstanceAction>lambdaQuery().eq(StateProcessInstanceAction::getInstanceId, flwTask.getInstanceId())
+                .orderByDesc(StateProcessInstanceAction::getCreateTime));
+        processDetailVO.setInstanceActions(list);
+
+        return processDetailVO;
+    }
+
+    private FlowCreator currentFlowCreator() {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if (null == loginUser || null == loginUser.getUser().getUserId()) {
+            throw new GlobalException("非法用户");
+        }
+        return FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName());
+    }
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java
new file mode 100644
index 0000000..83ad381
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java
@@ -0,0 +1,24 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.bo.ProcessTaskListBO;
+import com.ruoyi.system.mapper.StateTaskCenterMapper;
+import com.ruoyi.system.model.StateTaskCenter;
+import com.ruoyi.system.model.TFaultAreaDic;
+import com.ruoyi.system.service.StateTaskCenterService;
+import com.ruoyi.system.vo.ProcessTaskListVO;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class StateTaskCenterServiceImpl extends ServiceImpl<StateTaskCenterMapper, StateTaskCenter> implements StateTaskCenterService {
+    @Override
+    public PageInfo<ProcessTaskListVO> pageList(ProcessTaskListBO processTaskListBO) {
+        PageInfo<ProcessTaskListVO> pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
+        List<ProcessTaskListVO> list = this.baseMapper.pageList(processTaskListBO,pageInfo);
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
index 86924f1..a310cf7 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
@@ -606,4 +606,9 @@
 
         return roleMenuMapper.batchRoleMenu(sysRoleMenus);
     }
+
+    @Override
+    public List<SysRole> selectRoleByUserIds(List<String> roleIds) {
+        return roleMapper.selectRoleByUserIds(roleIds);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBannerServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBannerServiceImpl.java
index 6dae322..7da7f08 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBannerServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBannerServiceImpl.java
@@ -29,4 +29,10 @@
         pageInfo.setRecords(list);
         return pageInfo;
     }
+
+    @Override
+    public List<TBanner> list(TBannerQuery query) {
+        List<TBanner> list = this.baseMapper.list(query);
+        return list;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCheckAcceptRecordServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCheckAcceptRecordServiceImpl.java
index 48052e2..d84a843 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCheckAcceptRecordServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCheckAcceptRecordServiceImpl.java
@@ -4,12 +4,18 @@
 import com.ruoyi.common.constant.DictConstants;
 import com.ruoyi.common.utils.DictUtils;
 import com.ruoyi.system.mapper.TCheckAcceptRecordMapper;
+import com.ruoyi.system.mapper.TContractMapper;
+import com.ruoyi.system.mapper.THouseMapper;
 import com.ruoyi.system.model.TCheckAcceptRecord;
+import com.ruoyi.system.model.TContract;
+import com.ruoyi.system.model.THouse;
+import com.ruoyi.system.query.TCheckAcceptRecordAppletQuery;
 import com.ruoyi.system.query.TCheckAcceptRecordQuery;
 import com.ruoyi.system.service.TCheckAcceptRecordService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.system.vo.SysUserVO;
 import com.ruoyi.system.vo.TCheckAcceptRecordVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -25,15 +31,39 @@
 @Service
 public class TCheckAcceptRecordServiceImpl extends ServiceImpl<TCheckAcceptRecordMapper, TCheckAcceptRecord> implements TCheckAcceptRecordService {
 
+    @Autowired
+    private TContractMapper contractMapper;
+    @Autowired
+    private THouseMapper houseMapper;
     @Override
     public PageInfo<TCheckAcceptRecordVO> pageList(TCheckAcceptRecordQuery query) {
         PageInfo<TCheckAcceptRecordVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
         List<TCheckAcceptRecordVO> list = this.baseMapper.pageList(query,pageInfo);
+
         list.forEach(item -> {
             item.setCleanSituation(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CHECK_SITUATION,item.getCleanSituation()));
             item.setOverallSituation(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CHECK_SITUATION,item.getOverallSituation()));
             item.setDeviceSituation(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CHECK_SITUATION,item.getDeviceSituation()));
             item.setFurnitureSituation(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CHECK_SITUATION,item.getFurnitureSituation()));
+
+        });
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
+
+    @Override
+    public PageInfo<TCheckAcceptRecordVO> pageListApplet(TCheckAcceptRecordAppletQuery query) {
+        List<TContract> tContracts = contractMapper.selectList(null);
+        List<THouse> tHouses = houseMapper.selectList(null);
+        PageInfo<TCheckAcceptRecordVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<TCheckAcceptRecordVO> list = this.baseMapper.pageListApplet(query,pageInfo);
+        list.forEach(item -> {
+            item.setCleanSituation(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CHECK_SITUATION,item.getCleanSituation()));
+            item.setOverallSituation(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CHECK_SITUATION,item.getOverallSituation()));
+            item.setDeviceSituation(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CHECK_SITUATION,item.getDeviceSituation()));
+            item.setFurnitureSituation(DictUtils.getDictLabel(DictConstants.DICT_TYPE_CHECK_SITUATION,item.getFurnitureSituation()));
+            item.setContract(tContracts.stream().filter(contract -> contract.getId().equals(item.getContractId())).findFirst().orElse(null));
+            item.setHouse(tHouses.stream().filter(house -> house.getId().equals(item.getHouseId())).findFirst().orElse(null));
         });
         pageInfo.setRecords(list);
         return pageInfo;
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 387581d..4084b2c 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,6 +1,7 @@
 package com.ruoyi.system.service.impl;
 
 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;
@@ -104,8 +105,16 @@
         TCheckAcceptRecord tCheckAcceptRecord = new TCheckAcceptRecord();
         tCheckAcceptRecord.setContractId(dto.getId());
         tCheckAcceptRecord.setHouseId(contract.getHouseId());
-        tCheckAcceptRecord.setLeaseReason("后台终止");
-        tCheckAcceptRecord.setStatus("1");
+        tCheckAcceptRecord.setLeaseReason("后台终止合同");
+        tCheckAcceptRecord.setStatus(false);
+        tCheckAcceptRecord.setAcceptanceTime(LocalDateTime.now());
+        LocalDate now = LocalDate.now();
+        String replace = (now + "").replace("-", "");
+        int size = checkAcceptRecordMapper.selectList(new LambdaQueryWrapper<TCheckAcceptRecord>()
+                .likeRight(TCheckAcceptRecord::getAcceptanceTime, LocalDate.now())).size();
+        tCheckAcceptRecord.setCode(replace.substring(2)+String.format("%03d", size+1));
+
+
         checkAcceptRecordMapper.insert(tCheckAcceptRecord);
         // 将所有未缴费账单设置未已失效
         List<TBill> tBills = billMapper.selectList(new LambdaQueryWrapper<TBill>()
@@ -117,7 +126,13 @@
         billService.updateBatchById(tBills);
     }
 
-
+    public static void main(String[] args) {
+//        LocalDate now = LocalDate.now();
+//        String replace = (now + "").replace("-", "");
+//        System.err.println(replace.substring(2));
+//
+//        System.err.println(String.format("%03d",1));
+    }
     @Override
     public CheckAcceptRecordVO getCheckByContractId(String id) {
         CheckAcceptRecordVO checkAcceptRecordVO = new CheckAcceptRecordVO();
@@ -139,10 +154,13 @@
         if (contract==null)return R.fail("合同不存在");
         if (contract.getStatus().equals("4"))return R.fail("该合同已签订");
         contract.setSignature(dto.getSignature());
-        contract.setStatus("2");
-        contractMapper.updateById(contract);
+        contract.setStatus("4");
         contract.setFirstPayTime(contract.getStartTime().plusDays(10));
-        List<TBill> bills = new ArrayList<>();
+        contractMapper.updateById(contract);
+
+        // TODO 进入签订审批流程
+
+
         List<TContractRentType> contractRentTypes = contractRentTypeService.list();
         // 生成第一笔账单
         // 第一次应缴费日期
@@ -624,4 +642,11 @@
 
         return list;
     }
+
+    @Override
+    public Boolean updateContractAuditStatus(String projectId, Integer status) {
+        LambdaUpdateWrapper<TContract> contractLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        contractLambdaUpdateWrapper.eq(TContract::getId, projectId).set(TContract::getStatus, status);
+        return this.update(contractLambdaUpdateWrapper);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TFaultRepairMessageServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TFaultRepairMessageServiceImpl.java
index 8c3df80..e763517 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TFaultRepairMessageServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TFaultRepairMessageServiceImpl.java
@@ -3,6 +3,7 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.mapper.TFaultRepairMessageMapper;
 import com.ruoyi.system.model.TFaultRepairMessage;
+import com.ruoyi.system.query.TFaultRepairMessageAppletQuery;
 import com.ruoyi.system.query.TFaultRepairMessageQuery;
 import com.ruoyi.system.service.TFaultRepairMessageService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -35,4 +36,12 @@
         pageInfo.setRecords(list);
         return pageInfo;
     }
+
+    @Override
+    public PageInfo<TFaultRepairMessageVO> pageListApplet(TFaultRepairMessageAppletQuery query) {
+        PageInfo<TFaultRepairMessageVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<TFaultRepairMessageVO> list = this.baseMapper.pageListApplet(query,pageInfo);
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/THouseServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/THouseServiceImpl.java
index 5d59da6..9aa06f9 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/THouseServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/THouseServiceImpl.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.constant.DictConstants;
 import com.ruoyi.common.utils.DictUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.mapper.TContractMapper;
 import com.ruoyi.system.mapper.THouseMapper;
 import com.ruoyi.system.model.TContract;
@@ -56,7 +57,7 @@
         PageInfo<HouseVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
         List<HouseVO> list = this.baseMapper.userHistoryList(query,pageInfo);
         for (HouseVO houseVO : list) {
-            houseVO.setBusinessAttributes(DictUtils.getDictLabel(DictConstants.DICT_TYPE_BUSINESS_ATTRIBUTES,houseVO.getBusinessAttributes()));
+            houseVO.setTenantAttributes(StringUtils.isNotEmpty(houseVO.getTenantAttributes())?DictUtils.getDictLabel(DictConstants.DICT_TYPE_TENANT_ATTRIBUTE,houseVO.getTenantAttributes()):"");
         }
         pageInfo.setRecords(list);
         return pageInfo;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TItemTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TItemTypeServiceImpl.java
index d579295..be72660 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TItemTypeServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TItemTypeServiceImpl.java
@@ -46,7 +46,7 @@
     }
 
     @Override
-    public List<TItemTypeVO> getItemList() {
-        return this.baseMapper.getItemList();
+    public List<TItemTypeVO> getItemList(String itemName) {
+        return this.baseMapper.getItemList(itemName);
     }
 }
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 95a8452..f20404c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTenantServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTenantServiceImpl.java
@@ -1,20 +1,35 @@
 package com.ruoyi.system.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.constant.DictConstants;
 import com.ruoyi.common.utils.DictUtils;
 import com.ruoyi.common.utils.StringUtils;
+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.THouse;
 import com.ruoyi.system.model.TTenant;
+import com.ruoyi.system.query.TBillAppletQuery;
+import com.ruoyi.system.query.TExamineAppletQuery;
+import com.ruoyi.system.query.TTenantAppletQuery;
 import com.ruoyi.system.query.TTenantQuery;
 import com.ruoyi.system.service.TTenantService;
-import com.ruoyi.system.utils.wx.pojo.AppletUserDecodeData;
+import com.ruoyi.system.vo.ExamineVO;
+import com.ruoyi.system.vo.TBillVO;
 import com.ruoyi.system.vo.TenantVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.token.TokenService;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -27,6 +42,10 @@
 @Service
 public class TTenantServiceImpl extends ServiceImpl<TTenantMapper, TTenant> implements TTenantService {
 
+    @Autowired
+    private THouseMapper houseMapper;
+    @Autowired
+    private TContractMapper contractMapper;
     @Override
     public PageInfo<TenantVO> pageList(TTenantQuery query) {
         PageInfo<TenantVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
@@ -39,4 +58,79 @@
         return pageInfo;
     }
 
+    @Override
+    public PageInfo<TenantVO> pageListApplet(TTenantAppletQuery query) {
+        PageInfo<TenantVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<TenantVO> list = this.baseMapper.pageListApplet(query,pageInfo);
+        List<String> ids = list.stream().map(TTenant::getId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(ids)){
+            return new PageInfo<>();
+        }
+        List<TContract> contracts = contractMapper.selectList(Wrappers.lambdaQuery(TContract.class)
+                .in(TContract::getTenantId, ids)
+                .eq(TContract::getStatus, 4));
+        List<THouse> houses = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(contracts)){
+            List<String> houseIds = contracts.stream().map(TContract::getHouseId).collect(Collectors.toList());
+            houses = houseMapper.selectList(Wrappers.lambdaQuery(THouse.class)
+                    .in(THouse::getId, houseIds));
+        }
+
+        for (TenantVO tenantVO : list) {
+            tenantVO.setTenantAttributesName(StringUtils.isNotBlank(tenantVO.getTenantAttributes())?DictUtils.getDictLabel(DictConstants.DICT_TYPE_TENANT_ATTRIBUTE,tenantVO.getTenantAttributes()):"");
+            tenantVO.setTenantTypeName(StringUtils.isNotBlank(tenantVO.getTenantType())?DictUtils.getDictLabel(DictConstants.DICT_TYPE_TENANT_TYPE,tenantVO.getTenantType()):"");
+            if(!CollectionUtils.isEmpty(houses)){
+                List<TContract> contractList = contracts.stream().filter(contract -> contract.getTenantId().equals(tenantVO.getId())).collect(Collectors.toList());
+                if(!CollectionUtils.isEmpty(contractList)){
+                    TContract contract = contractList.get(0);
+                    List<THouse> houseList = houses.stream().filter(house -> house.getId().equals(contract.getHouseId())).collect(Collectors.toList());
+                    if(!CollectionUtils.isEmpty(houseList))
+                        tenantVO.setHouseName(houseList.get(0).getHouseName());
+                }
+            }
+        }
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
+
+    @Override
+    public List<THouse> listHouse(String id) {
+        List<TContract> tContracts = contractMapper.selectList(new LambdaQueryWrapper<TContract>()
+                        .eq(TContract::getTenantId,id)
+                .eq(TContract::getStatus, 4));
+        List<String> houseIds = tContracts.stream().map(TContract::getHouseId).collect(Collectors.toList());
+        if (houseIds.isEmpty())houseIds.add("-1");
+        return houseMapper.selectList(new LambdaQueryWrapper<THouse>()
+                .in(THouse::getId, houseIds));
+    }
+
+    @Override
+    public List<TContract> listContract(String id) {
+        return contractMapper.selectList(new LambdaQueryWrapper<TContract>()
+                .eq(TContract::getTenantId,id)
+                .eq(TContract::getStatus, 4));
+    }
+
+    @Override
+    public PageInfo<TBillVO> listBill(TBillAppletQuery query) {
+        List<String> contractIds = contractMapper.selectList(new LambdaQueryWrapper<TContract>()
+                        .eq(TContract::getTenantId, query.getId())).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()));
+        }
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
+
+    @Override
+    public PageInfo<ExamineVO> examineList(TExamineAppletQuery dto) {
+        PageInfo<ExamineVO> pageInfo = new PageInfo<>(dto.getPageNum(), dto.getPageSize());
+        List<ExamineVO> list = this.baseMapper.examineList(dto,pageInfo);
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ExamineVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ExamineVO.java
new file mode 100644
index 0000000..63d54e3
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ExamineVO.java
@@ -0,0 +1,31 @@
+package com.ruoyi.system.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.model.TBill;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value = "我的审批分页列表VO")
+public class ExamineVO{
+    @ApiModelProperty(value = "合同id")
+    private String id;
+    @ApiModelProperty(value = "合同编号")
+    private String contractNumber;
+    @ApiModelProperty(value = "合同名称")
+    private String contractName;
+    @ApiModelProperty(value = "租户信息")
+    private String partyTwoName;
+    @ApiModelProperty(value = "提交人")
+    private String createBy;
+    @ApiModelProperty(value = "提交时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+    @ApiModelProperty(value = "合同状态")
+    private String status;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/HouseVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/HouseVO.java
index 722a6de..4e74bbb 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/HouseVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/HouseVO.java
@@ -17,6 +17,8 @@
 
     @ApiModelProperty(value = "房屋id")
     private String houseId;
+    @ApiModelProperty(value = "房屋id")
+    private String tenantId;
 
     @ApiModelProperty(value = "租户姓名")
     private String residentName;
@@ -25,7 +27,7 @@
     private String phone;
 
     @ApiModelProperty(value = "属性")
-    private String businessAttributes;
+    private String tenantAttributes;
     @ApiModelProperty(value = "类型")
     private String productType;
     @ApiModelProperty(value = "入住日期")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/MyHouseVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/MyHouseVO.java
new file mode 100644
index 0000000..a591dbb
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/MyHouseVO.java
@@ -0,0 +1,40 @@
+package com.ruoyi.system.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.model.TBill;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@ApiModel(value = "我的在租VO")
+public class MyHouseVO {
+    @ApiModelProperty(value = "合同id")
+    private String id;
+    @ApiModelProperty(value = "地址")
+    private String houseAddress;
+    @ApiModelProperty(value = "月付租金")
+    private BigDecimal monthRent;
+    @ApiModelProperty(value = "支付方式 月付、季付、年付")
+    private String payType;
+    @ApiModelProperty(value = "付款当月月份")
+    private String month;
+    @ApiModelProperty(value = "建筑面积")
+    private String houseArea;
+    @ApiModelProperty(value = "户型")
+    private String houseType;
+    @ApiModelProperty(value = "结束时间")
+    private String endTime;
+    @ApiModelProperty(value = "开始时间")
+    private String startTime;
+    @ApiModelProperty(value = "房东")
+    private String propertyRightPerson;
+    @ApiModelProperty(value = "房东联系方式")
+    private String phone;
+    @ApiModelProperty(value = "交租记录")
+    private List<PayListVO> payList;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/MyToDoVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/MyToDoVO.java
new file mode 100644
index 0000000..944177e
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/MyToDoVO.java
@@ -0,0 +1,23 @@
+package com.ruoyi.system.vo;
+
+import com.ruoyi.system.model.TBill;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "我的待办VO")
+public class MyToDoVO  {
+
+    @ApiModelProperty(value = "租户-待缴费订单数量")
+    private Integer billCount;
+
+    @ApiModelProperty(value = "租户-待签订合同数量")
+    private Integer contractCount;
+
+    @ApiModelProperty(value = "管理员-待审批数量")
+    private Integer examineCount;
+
+    @ApiModelProperty(value = "管理员-账单逾期租户数量数量")
+    private Integer overdueCount;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/PayListVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/PayListVO.java
new file mode 100644
index 0000000..4bbb7b9
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/PayListVO.java
@@ -0,0 +1,20 @@
+package com.ruoyi.system.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.model.TBill;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@ApiModel(value = "我的在租-交租记录VO")
+public class PayListVO {
+    @ApiModelProperty(value = "时间")
+    private String payFeesTime;
+    @ApiModelProperty(value = "缴费金额 (处理了负号和元 直接展示就行)")
+    private String payFeesMoney;
+}
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
new file mode 100644
index 0000000..1816774
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java
@@ -0,0 +1,17 @@
+package com.ruoyi.system.vo;
+
+import com.ruoyi.system.model.StateProcessInstanceAction;
+import com.ruoyi.system.model.TContract;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+@Data
+@ApiModel(value = "审批流详情返回VO")
+public class ProcessDetailVO extends TContract {
+
+    @ApiModelProperty(value = "操作记录集合")
+    private List<StateProcessInstanceAction> instanceActions;
+
+}
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
new file mode 100644
index 0000000..337a265
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java
@@ -0,0 +1,150 @@
+package com.ruoyi.system.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.model.TContract;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+@Data
+public class ProcessTaskListVO {
+
+    private String nodeName;
+
+    private String flowId;
+
+    private String name;
+
+    private String moduleName;
+
+    private String createBy;
+
+    private String remark;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    private String status;
+
+    private String taskId;
+
+    private String parentTaskId;
+
+
+    private String category;
+
+    private String variable;
+
+    private String reason;
+
+    @ApiModelProperty(value = "合同信息")
+    private TContract contract;
+
+    @ApiModelProperty(value = "合同id")
+    private String contractId;
+
+    @ApiModelProperty(value = "合同编号")
+    private String contractNumber;
+
+    @ApiModelProperty(value = "合同名称")
+    private String contractName;
+
+    @ApiModelProperty(value = "开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime startTime;
+
+    @ApiModelProperty(value = "结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime endTime;
+    @ApiModelProperty(value = "开始计费时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime startPayTime;
+
+    @ApiModelProperty(value = "每月租金")
+    private BigDecimal monthRent;
+
+    @ApiModelProperty(value = "押金")
+    private BigDecimal deposit;
+    @ApiModelProperty(value = "变动后递增或递减之后的每月租金 前端忽略")
+    private BigDecimal changeRent;
+
+    @ApiModelProperty(value = "租金支付方式 月付 季付 年付")
+    private String payType;
+
+    @ApiModelProperty(value = "账单第一次支付日期 合同生效日期+10天 (不是真正的支付日期)生成第一次帐单后存值")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime firstPayTime;
+    @ApiModelProperty(value = "变动时间 根据周期改变 前端忽略")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime changeTime;
+
+    @ApiModelProperty(value = "是否递增递减 true=是 false=否")
+    private Boolean isIncreasing;
+
+    @ApiModelProperty(value = "押金是否随租金递增递减 true=是 false=否")
+    private Boolean isIncreasingDeposit;
+
+    @ApiModelProperty(value = "违约金比例")
+    private BigDecimal proportion;
+
+    @ApiModelProperty(value = "房屋id")
+    private String houseId;
+
+    @ApiModelProperty(value = "甲方名称")
+    private String partyOneName;
+
+    @ApiModelProperty(value = "甲方联系人")
+    private String partyOnePerson;
+
+    @ApiModelProperty(value = "甲方联系方式")
+    private String partyOnePhone;
+
+    @ApiModelProperty(value = "租户id")
+    private String tenantId;
+
+    @ApiModelProperty(value = "乙方名称")
+    private String partyTwoName;
+
+    @ApiModelProperty(value = "乙方联系人")
+    private String partyTwoPerson;
+
+    @ApiModelProperty(value = "乙方联系方式")
+    private String partyTwoPhone;
+
+    @ApiModelProperty(value = "合同附件,多个逗号拼接")
+    private String contractFile;
+
+    /**
+     * 1	待提交
+     * 2	待审批
+     * 3	未签订
+     * 4	已签订
+     * 5	已驳回
+     * 6	已终止
+     * 7	待结算
+     * 8	已结算
+     */
+    @ApiModelProperty(value = "合同状态 1=待提交 2=待审批 3=未签订 4=已签订 5=已驳回 6=已终止 7=待结算 8=已结算")
+    private String contractStatus;
+    @ApiModelProperty(value = "内存大小多个文件逗号拼接")
+    private String memory;
+    @ApiModelProperty(value = "附件名称 逗号拼接")
+    private String contractFileName;
+    @ApiModelProperty(value = "租户确认合同电子签名")
+    private String signature;
+    @ApiModelProperty(value = "终止合同备注说明")
+    private String terminateRemark;
+    @ApiModelProperty(value = "合计年租金")
+    private BigDecimal totalYear;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TCheckAcceptRecordVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TCheckAcceptRecordVO.java
index 23de55e..eb9b904 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TCheckAcceptRecordVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TCheckAcceptRecordVO.java
@@ -17,4 +17,11 @@
     @ApiModelProperty(value = "房屋信息")
     private THouse house;
 
+    @ApiModelProperty(value = "房屋名称")
+    private String houseName;
+    @ApiModelProperty(value = "合同编号")
+    private String contractNumber;
+    @ApiModelProperty(value = "房屋地址")
+    private String houseAddress;
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TContractAppletVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TContractAppletVO.java
new file mode 100644
index 0000000..71f2690
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TContractAppletVO.java
@@ -0,0 +1,28 @@
+package com.ruoyi.system.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.system.model.TContract;
+import com.ruoyi.system.model.THouse;
+import com.ruoyi.system.model.TTenant;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value = "小程序-合同详情页VO")
+public class TContractAppletVO extends TContract {
+
+    @ApiModelProperty(value = "房屋信息")
+    private THouse house;
+    @ApiModelProperty(value = "租户信息")
+    private TTenant tenant;
+    @ApiModelProperty(value = "生效日期")
+    private String startTimeString;
+
+    @ApiModelProperty(value = "终止日期")
+    private String endTimeString;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TenantVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TenantVO.java
index 52566aa..1514830 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TenantVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TenantVO.java
@@ -18,4 +18,7 @@
     @ApiModelProperty(value = "租户类型")
     private String tenantTypeName;
 
+    @ApiModelProperty(value = "房屋名称")
+    private String houseName;
+
 }
diff --git a/ruoyi-system/src/main/resources/mapper/system/StateProcessTemplateMapper.xml b/ruoyi-system/src/main/resources/mapper/system/StateProcessTemplateMapper.xml
new file mode 100644
index 0000000..6ae2931
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/StateProcessTemplateMapper.xml
@@ -0,0 +1,15 @@
+<?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.StateProcessTemplateMapper">
+    
+
+    <select id="page" resultType="com.ruoyi.system.model.StateProcessTemplate">
+        SELECT * FROM state_process_template
+        WHERE (template_key, template_version) in (select template_key, MAX(template_version)from state_process_template group by template_key)
+        <if test="request.name != null and request.name != ''">
+            AND template_name::text LIKE CONCAT('%',#{request.name}, '%' )
+        </if>
+        and disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+    </select>
+    
+</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
new file mode 100644
index 0000000..f8488c0
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml
@@ -0,0 +1,62 @@
+<?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.StateTaskCenterMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.system.model.StateTaskCenter">
+        <id column="id" property="id" />
+        <result column="`name`" property="name" />
+        <result column="module_name" property="moduleName" />
+        <result column="remark" property="remark" />
+        <result column="category" property="category" />
+        <result column="flow_id" property="flowId" />
+        <result column="variable" property="variable" />
+        <result column="project_id" property="projectId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, `name`, module_name, remark,category,flow_id,variable,project_id,create_time, update_time, create_by, update_by, disabled
+    </sql>
+    <select id="pageList" resultType="com.ruoyi.system.vo.ProcessTaskListVO">
+        select stc.id, stc.`name`, stc.module_name, stc.remark,stc.category,stc.flow_id,stc.variable,
+               tc.id AS contractId, tc.contract_number, tc.contract_name, tc.start_time, tc.end_time,tc.deposit, tc.pay_type,
+               tc.first_pay_time, tc.isIncreasing,tc.isIncreasing_deposit,tc.proportion, tc.house_id, tc.party_one_name, tc.party_one_person,
+               tc.party_one_phone, tc.tenant_id, tc.party_two_name,tc.party_two_person, tc.party_two_phone,tc.memory, tc.contract_file_name,
+               tc.signature, tc.terminate_remark, tc.total_year,tc.status AS contractStatus
+        from state_task_center stc
+        LEFT JOIN t_contract tc ON stc.project_id = tc.id
+        <where>
+            <if test="query.instanceIds != null and query.instanceIds.size()>0">
+                AND stc.flow_id IN
+                <foreach collection="query.instanceIds" item="item" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="query.name != null and query.name !=''">
+                AND stc.`name` like concat('%',#{query.name},'%')
+            </if>
+            <if test="query.moduleName != null and query.moduleName !=''">
+                AND stc.module_name like concat('%',#{query.moduleName},'%')
+            </if>
+            <if test="query.createBy != null and query.createBy !=''">
+                AND stc.create_by like concat('%',#{query.createBy},'%')
+            </if>
+            <if test="query.partyTwoName != null and query.partyTwoName !=''">
+                AND tc.party_two_name like concat('%',#{query.partyTwoName},'%')
+            </if>
+            <if test="query.contractNumber != null and query.contractNumber !=''">
+                AND tc.contract_number like concat('%',#{query.contractNumber},'%')
+            </if>
+            <if test="query.contractName != null and query.contractName !=''">
+                AND tc.contract_name like concat('%',#{query.contractName},'%')
+            </if>
+            <if test="query.status != null and query.status !=''">
+                AND tc.status like concat('%',#{query.status},'%')
+            </if>
+            AND tc.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        ORDER BY stc.create_time DESC
+    </select>
+
+</mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
index f24c54f..f3dfeeb 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
@@ -148,6 +148,17 @@
 		left join sys_role t2 on t1.role_id = t2.role_id
 		where t1.user_id = #{userId}
 	</select>
+    <select id="selectRoleByUserIds" resultType="com.ruoyi.common.core.domain.entity.SysRole">
+		select
+		a.user_id as role_id,
+		b.nick_name as role_name
+		from sys_user_role a
+		left join sys_user b on a.user_id = b.user_id
+		where a.role_id in
+		<foreach item="item" index="index" collection="roleIds" open="(" separator="," close=")">
+			#{item}
+		</foreach>
+	</select>
 
     <insert id="insertRole" parameterType="SysRole" useGeneratedKeys="true" keyProperty="roleId">
  		insert into sys_role(
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index 7487409..477a6ee 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -191,7 +191,7 @@
 		from sys_user u
 		WHERE u.del_flag = 0
 		<if test="names != null and names.size()>0">
-			AND u.nick_name IN
+			AND u.user_name IN
 			<foreach collection="names" close=")" open="(" item="name" separator=",">
 				#{name}
 			</foreach>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TBannerMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TBannerMapper.xml
index d9bd46a..3cfee87 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TBannerMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TBannerMapper.xml
@@ -25,5 +25,12 @@
         where disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
         order by sort_by, create_time desc
     </select>
+    <select id="list" resultType="com.ruoyi.system.model.TBanner">
+        select
+        <include refid="Base_Column_List"/>
+        from t_banner
+        where disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        order by sort_by, create_time desc
+    </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml
index 2e99a8c..cbff79f 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml
@@ -53,8 +53,12 @@
         t.create_by,
         t.update_by,
         t.disabled,
+        t.code,
+        t.checkMoney,
+        t.status,
         c.contract_number,
-        h.house_name
+        h.house_name,
+        h.house_address
         from t_check_accept_record t
         left join t_contract c on t.contract_id = c.id
         left join t_house h on t.house_id = h.id
@@ -76,5 +80,25 @@
         </where>
         ORDER BY t.create_time DESC
     </select>
+    <select id="pageListApplet" resultType="com.ruoyi.system.vo.TCheckAcceptRecordVO">
+        select
+        t.*,
+        c.contract_number,
+        h.house_name
+        from t_check_accept_record t
+        left join t_contract c on t.contract_id = c.id
+        left join t_house h on t.house_id = h.id
+        <where>
+
+            <if test="query.status != null">
+                AND t.status = #{query.status}
+            </if>
+            <if test="query.houseNameOrAddress != null and query.houseNameOrAddress != ''">
+                AND (h.house_name LIKE concat('%', #{query.houseNameOrAddress}, '%') or h.house_address LIKE concat('%', #{query.houseNameOrAddress}, '%'))
+            </if>
+            AND t.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        ORDER BY t.create_time DESC
+    </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
index eb9f2e8..c2abe7d 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
@@ -9,7 +9,6 @@
         <result column="contract_name" property="contractName" />
         <result column="start_time" property="startTime" />
         <result column="end_time" property="endTime" />
-        <result column="month_rent" property="monthRent" />
         <result column="deposit" property="deposit" />
         <result column="pay_type" property="payType" />
         <result column="first_pay_time" property="firstPayTime" />
@@ -41,9 +40,9 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, contract_number, contract_name, start_time, end_time, total_rent, deposit, pay_type, first_pay_time, isIncreasing, isIncreasing_deposit,
+        id, contract_number, contract_name, start_time, end_time, deposit, pay_type, first_pay_time, isIncreasing, isIncreasing_deposit,
             proportion, house_id, party_one_name, party_one_person, party_one_phone, tenant_id, party_two_name, party_two_person, party_two_phone,
-            memory, contract_file_name, signature, terminate_remark, total_year
+            memory, contract_file_name, signature, terminate_remark, total_year,status
     </sql>
     <select id="contractList" resultType="com.ruoyi.system.model.TContract">
         select t1.* from t_contract t1
@@ -73,6 +72,7 @@
             <if test="query.tenantId != null">
                 and t1.tenant_id = #{query.tenantId}
             </if>
+            and (t1.status=3 or t1.status=4)
             AND t1.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
         </where>
     </select>
@@ -96,7 +96,7 @@
                     #{item}
                 </foreach>
             </if>
-            <if test="query.ids == null and query.ids.size()=0">
+            <if test="query.ids != null and 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/TFaultRepairMessageMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TFaultRepairMessageMapper.xml
index efeb10c..217157a 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TFaultRepairMessageMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TFaultRepairMessageMapper.xml
@@ -130,5 +130,51 @@
         </where>
         ORDER BY t.create_time DESC
     </select>
+    <select id="pageListApplet" resultType="com.ruoyi.system.vo.TFaultRepairMessageVO">
+        SELECT
+        t.id,
+        t.tenant_id,
+        t.item_id,
+        t.item_type_id,
+        t.contract_id,
+        t.fault_area_name,
+        t.describe_name,
+        t.describe_detail,
+        t.fault_pictures,
+        t.service_address,
+        t.repair_type,
+        t.visit_time,
+        t.contact_number,
+        t.leave_message,
+        t.handle_person,
+        t.handle_time,
+        t.result_describe,
+        t.repair_picture,
+        t.attachment,
+        t.attachment_name,
+        t.status,
+        t.create_time,
+        t.update_time,
+        t.create_by,
+        t.update_by,
+        t.disabled,
+        i.item_name AS itemName,
+        it.type_name AS itemTypeName,
+        tnt.resident_name AS residentName
+        from t_fault_repair_message t
+        LEFT JOIN t_item i ON t.item_id = i.id
+        LEFT JOIN t_item_type it ON t.item_type_id = it.id
+        LEFT JOIN t_tenant tnt ON t.tenant_id = tnt.id
+        <where>
+            <if test="query.houseAddress != null and query.houseAddress != ''">
+                AND t.service_address LIKE CONCAT('%', #{query.houseAddress}, '%')
+            </if>
+            <if test="query.status != null">
+                AND t.status = #{query.status}
+            </if>
+            AND t.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        ORDER BY t.create_time DESC
+    </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/THouseMapper.xml b/ruoyi-system/src/main/resources/mapper/system/THouseMapper.xml
index d09143d..a4bb3e9 100644
--- a/ruoyi-system/src/main/resources/mapper/system/THouseMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/THouseMapper.xml
@@ -55,9 +55,11 @@
             t3.room_number as roomNumber,
             t3.house_area as houseArea,
             t2.phone as loginAccount,
+            t2.id as tenantId,
             t2.id_card as idCard,
             t2.bank_number as bankNumber,
             t2.mail_address as mailAddress,
+            t2.tenant_attributes as tenantAttributes
         from t_contract t1
         left join t_tenant t2 on t1.tenant_id = t2.id
         LEFT JOIN t_house t3 on t3.id = t1.house_id
diff --git a/ruoyi-system/src/main/resources/mapper/system/TInformationMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TInformationMapper.xml
index c8aa23a..1137271 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TInformationMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TInformationMapper.xml
@@ -11,6 +11,7 @@
         <result column="release_time" property="releaseTime" />
         <result column="cover" property="cover" />
         <result column="content" property="content" />
+        <result column="brief_introduction" property="briefIntroduction" />
         <result column="attachment" property="attachment" />
         <result column="attachment_name" property="attachmentName" />
         <result column="create_time" property="createTime" />
@@ -22,7 +23,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, title_name, sort_by, info_source, release_time,cover, content, attachment,attachment_name, create_time, update_time, create_by, update_by, disabled
+        id, title_name, sort_by, info_source, release_time,cover, brief_introduction,content, attachment,attachment_name, create_time, update_time, create_by, update_by, disabled
     </sql>
     <select id="pageList" resultType="com.ruoyi.system.model.TInformation">
         select
diff --git a/ruoyi-system/src/main/resources/mapper/system/TItemTypeMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TItemTypeMapper.xml
index 4f0c44e..c92258e 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TItemTypeMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TItemTypeMapper.xml
@@ -26,11 +26,19 @@
         ORDER BY sort_by,create_time DESC
     </select>
     <select id="getItemList" resultType="com.ruoyi.system.vo.TItemTypeVO">
-        select
-        <include refid="Base_Column_List"/>
+        select <include refid="Base_Column_List"></include>
         from t_item_type
-        where disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
-        ORDER BY sort_by,create_time DESC
+        where id in (
+        select
+            tit.id
+        from t_item_type tit
+        left join t_item ti on tit.id = ti.type_id
+        where tit.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        <if test="itemName != null and itemName != ''">
+            and ti.item_name like concat('%', #{itemName}, '%')
+        </if>
+        GROUP BY tit.id
+        ORDER BY tit.sort_by,tit.create_time DESC)
     </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TTenantMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TTenantMapper.xml
index 4e23099..112f54f 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TTenantMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TTenantMapper.xml
@@ -43,5 +43,74 @@
         </where>
         ORDER BY create_time DESC
     </select>
+    <select id="pageListApplet" resultType="com.ruoyi.system.vo.TenantVO">
+        SELECT id, resident_name, checkIn_time, tenant_attributes, tenant_type, phone, id_card, email,
+        bank_number, mail_address, create_time, disabled,account
+        FROM t_tenant
+        <where>
+            <if test="query.residentNameOrPhone != null and query.residentNameOrPhone != ''">
+                AND (resident_name LIKE concat('%',#{query.residentNameOrPhone},'%')or phone LIKE concat('%',#{query.residentNameOrPhone},'%'))
+            </if>
+            AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        ORDER BY create_time DESC
+    </select>
+    <select id="listBill" resultType="com.ruoyi.system.vo.TBillVO">
+        select t1.* from
+                     t_bill t1
+        where 1=1
+        <if test="query.payFeesStatus != null and query.payFeesStatus != ''">
+          AND t1.pay_fees_status = #{query.payFeesStatus}
+        </if>
+        <if test="null != query.contractIds and query.contractIds.size() > 0">
+            and t1.contract_id in
+            <foreach collection="query.contractIds" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        AND t1.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+    </select>
+    <select id="examineList" resultType="com.ruoyi.system.vo.ExamineVO">
+        select t1.* from t_contract t1
+        <where>
+            <if test="query.status == 1">
+                AND t1.status = 2
+            </if>
+            <if test="query.status == 2">
+                AND (t1.status !=1 and t1.status !=2)
+            </if>
+            <if test="query.status == 3">
+                AND t1.create_by = #{query.userName}
+            </if>
+            <if test="query.time != null and query.time != ''">
+                <choose>
+                    <when test="query.time == 1">
+                        AND t1.create_time &gt;= DATE_SUB(NOW(), INTERVAL 1 DAY)
+                    </when>
+                    <when test="query.time == 2">
+                        AND t1.create_time &gt;= DATE_SUB(NOW(), INTERVAL 7 DAY)
+                    </when>
+                    <when test="query.time == 3">
+                        AND t1.create_time &gt;= DATE_SUB(NOW(), INTERVAL 30 DAY)
+                    </when>
+                </choose>
+            </if>
+        </where>
+        <choose>
+            <when test="query.sort != null and query.sort != ''">
+                <choose>
+                    <when test="query.sort == 1">
+                        ORDER BY t1.create_time DESC
+                    </when>
+                    <when test="query.sort == 2">
+                        ORDER BY t1.create_time ASC
+                    </when>
+                </choose>
+            </when>
+            <otherwise>
+                ORDER BY t1.create_time DESC
+            </otherwise>
+        </choose>
+    </select>
 
 </mapper>

--
Gitblit v1.7.1