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()); 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(); 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,6 +50,8 @@ private TBillService billService; @Autowired private TokenService tokenService; @Autowired private TTenantService tTenantService; @ApiOperation(value = "签订合同") @PostMapping(value = "/signContract") public R signContract(@RequestBody SignContractDTO 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.javacopy 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 >= DATE_SUB(NOW(), INTERVAL 1 DAY) </when> <when test="query.time == 2"> AND t1.create_time >= DATE_SUB(NOW(), INTERVAL 7 DAY) </when> <when test="query.time == 3"> AND t1.create_time >= 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>