yupeng
2025-02-26 6f97a42dccaedb7a8950feac205080e63d8be439
Merge remote-tracking branch 'origin/master' into xizang-changyun
1 文件已复制
2 文件已重命名
60个文件已修改
53个文件已添加
4062 ■■■■■ 已修改文件
ruoyi-admin/pom.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCheckAcceptRecordController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTenantController.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/PdfUtils.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/core/config/DataUpdateHandlerConfig.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MybatisPlusConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-test.yml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/IndexController.java 418 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TFaultRepairMessageController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/core/config/DataUpdateHandlerConfig.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/core/config/MybatisPlusConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/resources/application-test.yml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/pom.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseModel.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/ProcessCategoryEnum.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/StateProcessActionEnum.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/SubmitStatusEnum.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/exception/state/StateErrorCode.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/bo/DeployBO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessCreateBO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessModuleUpdateBO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessRefuseBO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessStartBO.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTemplatePageBO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessUpdateBO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/TExamineDTO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/export/ContractExport.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessExtInstanceMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessModuleMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessTemplateMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBannerMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCheckAcceptRecordMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TFaultRepairMessageMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TItemTypeMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTenantMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessExtInstance.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessModule.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessTemplate.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TCheckAcceptRecord.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TFaultRepairMessage.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/THouse.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TInformation.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/TCheckAcceptRecordAppletQuery.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/TContractQuery.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/TExamineAppletQuery.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/TFaultRepairMessageAppletQuery.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/TTenantAppletQuery.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessExtInstanceService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessModuleService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TBannerService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TCheckAcceptRecordService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TContractService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TFaultRepairMessageService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TItemTypeService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TTenantService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessExtInstanceServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessModuleServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java 785 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBannerServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCheckAcceptRecordServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TFaultRepairMessageServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/THouseServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TItemTypeServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTenantServiceImpl.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ExamineVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/HouseVO.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/MyHouseVO.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/MyToDoVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/PayListVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/TCheckAcceptRecordVO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/TContractAppletVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/TenantVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/StateProcessTemplateMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TBannerMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TCheckAcceptRecordMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TFaultRepairMessageMapper.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/THouseMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TInformationMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TItemTypeMapper.xml 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TTenantMapper.xml 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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生成二维码 -->
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
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
New file
@@ -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);
    }
}
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 {
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);
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();
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();
            }
        }
    }
}
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)
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));
    }
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:\\";
ruoyi-admin/src/main/java/com/ruoyi/web/core/config/DataUpdateHandlerConfig.java
File was renamed from ruoyi-common/src/main/java/com/ruoyi/common/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);
        }
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MybatisPlusConfig.java
File was renamed from ruoyi-common/src/main/java/com/ruoyi/common/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;
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: 四川金达通信工程
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>
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/IndexController.java
New file
@@ -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();
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
New file
@@ -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);
    }
}
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()));
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();
    }
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<>();
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);
            }
ruoyi-applet/src/main/java/com/ruoyi/web/core/config/DataUpdateHandlerConfig.java
New file
@@ -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);
//        }
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/core/config/MybatisPlusConfig.java
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
File was copied from ruoyi-common/src/main/java/com/ruoyi/common/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;
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
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>
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;
    /**
ruoyi-common/src/main/java/com/ruoyi/common/enums/ProcessCategoryEnum.java
New file
@@ -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;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/enums/StateProcessActionEnum.java
New file
@@ -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;
}
ruoyi-common/src/main/java/com/ruoyi/common/enums/SubmitStatusEnum.java
New file
@@ -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;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/exception/state/StateErrorCode.java
New file
@@ -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;
}
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
ruoyi-system/src/main/java/com/ruoyi/system/bo/DeployBO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessAgreeBO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessCreateBO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessModuleUpdateBO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessRefuseBO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessStartBO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTemplatePageBO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessUpdateBO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/TExamineDTO.java
New file
@@ -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;
}
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;
ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessExtInstanceMapper.java
New file
@@ -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> {
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessInstanceActionMapper.java
New file
@@ -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> {
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessModuleMapper.java
New file
@@ -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> {
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateProcessTemplateMapper.java
New file
@@ -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);
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java
New file
@@ -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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessExtInstance.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessModule.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessTemplate.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java
New file
@@ -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;
}
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;
}
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;
}
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")
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)
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;
ruoyi-system/src/main/java/com/ruoyi/system/query/TBillAppletQuery.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/query/TCheckAcceptRecordAppletQuery.java
New file
@@ -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;
}
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;
}
ruoyi-system/src/main/java/com/ruoyi/system/query/TExamineAppletQuery.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/query/TFaultRepairMessageAppletQuery.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/query/TTenantAppletQuery.java
New file
@@ -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;
}
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);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessExtInstanceService.java
New file
@@ -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> {
}
ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessInstanceActionService.java
New file
@@ -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> {
}
ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessModuleService.java
New file
@@ -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> {
}
ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java
New file
@@ -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);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java
New file
@@ -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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
New file
@@ -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("错误类型");
        }
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessExtInstanceServiceImpl.java
New file
@@ -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 {
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessInstanceActionServiceImpl.java
New file
@@ -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 {
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessModuleServiceImpl.java
New file
@@ -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 {
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
New file
@@ -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());
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java
New file
@@ -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;
    }
}
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);
    }
}
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;
    }
}
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;
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);
    }
}
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;
    }
}
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;
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);
    }
}
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;
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/ExamineVO.java
New file
@@ -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;
}
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 = "入住日期")
ruoyi-system/src/main/java/com/ruoyi/system/vo/MyHouseVO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/MyToDoVO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/PayListVO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java
New file
@@ -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;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java
New file
@@ -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;
}
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;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/TContractAppletVO.java
New file
@@ -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;
}
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;
}
ruoyi-system/src/main/resources/mapper/system/StateProcessTemplateMapper.xml
New file
@@ -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>
ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml
New file
@@ -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>
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(
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>
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>
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>
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>
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>
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
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
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>
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>