From a4b961262680c1bc4ed47a423dfc43c986062769 Mon Sep 17 00:00:00 2001 From: xuhy <3313886187@qq.com> Date: 星期三, 26 二月 2025 14:01:19 +0800 Subject: [PATCH] 审批流 --- ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml | 62 +++++ ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java | 17 + ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml | 5 ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java | 18 + ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java | 108 +++++++++ ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java | 1 ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java | 14 + ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java | 33 +- ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java | 2 ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java | 3 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java | 17 + ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java | 208 +++++++++++++++++ ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java | 142 +++++++++++ ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java | 7 ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java | 5 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java | 13 + ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java | 4 ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java | 5 18 files changed, 639 insertions(+), 25 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java index abb00c3..69b4c28 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java @@ -1,5 +1,6 @@ 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; @@ -18,6 +19,7 @@ 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; @@ -163,6 +165,13 @@ 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") @@ -188,4 +197,12 @@ return AjaxResult.success(); } + //审核拒绝 + @ApiOperation("审核详情") + @GetMapping("/detail") + public AjaxResult<TContract> detail(@RequestParam String taskId) { + processTemplateService.detail(taskId); + return AjaxResult.success(); + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java index c35b38a..bb120fb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java @@ -190,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()); @@ -199,23 +215,6 @@ tContractRentType.setChangeTime(dto.getChangeTime()); tContractRentType.setCycleTime(dto.getCycleTime()); contractRentTypeService.save(tContractRentType); - - 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); - } } return R.ok(); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java index ce381d6..494ff97 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java @@ -116,7 +116,7 @@ return AjaxResult.success(roleService.selectRoleById(roleId)); } - @PreAuthorize("@ss.hasPermi('system:role:detail')") +// @PreAuthorize("@ss.hasPermi('system:role:detail')") @ApiOperation("角色详情") @GetMapping("/roleInfo") public AjaxResult roleInfo(@RequestParam Long roleId) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index 27aea74..f2ff0c8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -192,7 +192,9 @@ } user.setUpdateBy(getUsername()); - user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + if(StringUtils.isNotEmpty(user.getPassword())){ + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + } return AjaxResult.success(userService.updateUser(user)); } diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java new file mode 100644 index 0000000..740ebcd --- /dev/null +++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java @@ -0,0 +1,208 @@ +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.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<TContract> detail(@RequestParam String taskId) { + processTemplateService.detail(taskId); + return AjaxResult.success(); + } + +} diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java index d2bc514..0731a2e 100644 --- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java +++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TContractController.java @@ -60,7 +60,6 @@ @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,"登录失效"); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java index cbfde78..528e3ac 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java @@ -1,8 +1,11 @@ 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 @@ -10,11 +13,13 @@ /** * 任务名称 */ + @ApiModelProperty(value = "任务名称") private String name; /** * 任务名称 */ + @ApiModelProperty(value = "任务名称") private String moduleName; // /** // * 流程实例状态( 0,审批中 1,审批通过 2,审批拒绝 3) @@ -23,5 +28,18 @@ /** * 创建人 */ + @ApiModelProperty(value = "创建人") private String createBy; + + @ApiModelProperty(value = "乙方名称") + private String partyTwoName; + @ApiModelProperty(value = "合同编号") + private String contractNumber; + @ApiModelProperty(value = "合同名称") + private String contractName; + @ApiModelProperty(value = "合同状态") + private String status; + @ApiModelProperty(value = "前端忽略") + private List<String> instanceIds; + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java index 804ad41..8fa2afc 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/StateTaskCenterMapper.java @@ -1,9 +1,23 @@ package com.ruoyi.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.common.basic.PageInfo; +import com.ruoyi.system.bo.ProcessTaskListBO; import com.ruoyi.system.model.StateTaskCenter; +import com.ruoyi.system.vo.ProcessTaskListVO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; @Mapper public interface StateTaskCenterMapper extends BaseMapper<StateTaskCenter> { + /** + * 分页查询 + * @param processTaskListBO + * @param pageInfo + * @return + */ + List<ProcessTaskListVO> pageList(@Param("query") ProcessTaskListBO processTaskListBO, @Param("pageInfo") PageInfo<ProcessTaskListVO> pageInfo); + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java index 310fb95..ab25bf9 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/StateTaskCenter.java @@ -35,5 +35,8 @@ private String flowId; @TableField("variable") private String variable; + @ApiModelProperty(value = "合同项目id") + @TableField("project_id") + private String projectId; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java index a127cd6..450d70e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java @@ -6,6 +6,7 @@ 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> { @@ -38,4 +39,8 @@ //拒绝 void refuse(ProcessRefuseBO processRefuseBO); + + PageInfo<ProcessTaskListVO> dealAndWaitTaskPage(ProcessTaskListBO processTemplatePageBO); + + ProcessDetailVO detail(String taskId); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java index c4a80d5..05fd6b1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/StateTaskCenterService.java @@ -1,7 +1,12 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.basic.PageInfo; +import com.ruoyi.system.bo.ProcessTaskListBO; import com.ruoyi.system.model.StateTaskCenter; +import com.ruoyi.system.vo.ProcessTaskListVO; public interface StateTaskCenterService extends IService<StateTaskCenter> { + PageInfo<ProcessTaskListVO> pageList(ProcessTaskListBO processTaskListBO); + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java index b25418c..3597645 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java @@ -31,6 +31,7 @@ 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; @@ -71,6 +72,8 @@ private FlwHisTaskActorMapper flwHisTaskActorMapper; @Autowired private ISysUserService sysUserService; + @Autowired + private TContractService contractService; /** * 流程模版分页 @@ -262,6 +265,7 @@ 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记录 @@ -352,6 +356,14 @@ //转换类 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()); @@ -439,6 +451,14 @@ 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)) { @@ -632,6 +652,128 @@ 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()) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java index c982a57..83ad381 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateTaskCenterServiceImpl.java @@ -1,11 +1,24 @@ package com.ruoyi.system.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.basic.PageInfo; +import com.ruoyi.system.bo.ProcessTaskListBO; import com.ruoyi.system.mapper.StateTaskCenterMapper; import com.ruoyi.system.model.StateTaskCenter; +import com.ruoyi.system.model.TFaultAreaDic; import com.ruoyi.system.service.StateTaskCenterService; +import com.ruoyi.system.vo.ProcessTaskListVO; import org.springframework.stereotype.Service; + +import java.util.List; @Service public class StateTaskCenterServiceImpl extends ServiceImpl<StateTaskCenterMapper, StateTaskCenter> implements StateTaskCenterService { + @Override + public PageInfo<ProcessTaskListVO> pageList(ProcessTaskListBO processTaskListBO) { + PageInfo<ProcessTaskListVO> pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize()); + List<ProcessTaskListVO> list = this.baseMapper.pageList(processTaskListBO,pageInfo); + pageInfo.setRecords(list); + return pageInfo; + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java index 61c5b1f..4084b2c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java @@ -155,9 +155,12 @@ if (contract.getStatus().equals("4"))return R.fail("该合同已签订"); contract.setSignature(dto.getSignature()); contract.setStatus("4"); - contractMapper.updateById(contract); contract.setFirstPayTime(contract.getStartTime().plusDays(10)); - List<TBill> bills = new ArrayList<>(); + contractMapper.updateById(contract); + + // TODO 进入签订审批流程 + + List<TContractRentType> contractRentTypes = contractRentTypeService.list(); // 生成第一笔账单 // 第一次应缴费日期 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java new file mode 100644 index 0000000..1816774 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java @@ -0,0 +1,17 @@ +package com.ruoyi.system.vo; + +import com.ruoyi.system.model.StateProcessInstanceAction; +import com.ruoyi.system.model.TContract; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; +@Data +@ApiModel(value = "审批流详情返回VO") +public class ProcessDetailVO extends TContract { + + @ApiModelProperty(value = "操作记录集合") + private List<StateProcessInstanceAction> instanceActions; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java index 8b4fee1..337a265 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessTaskListVO.java @@ -1,11 +1,18 @@ 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 @@ -39,4 +46,105 @@ private String variable; private String reason; + + @ApiModelProperty(value = "合同信息") + private TContract contract; + + @ApiModelProperty(value = "合同id") + private String contractId; + + @ApiModelProperty(value = "合同编号") + private String contractNumber; + + @ApiModelProperty(value = "合同名称") + private String contractName; + + @ApiModelProperty(value = "开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime startTime; + + @ApiModelProperty(value = "结束时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime endTime; + @ApiModelProperty(value = "开始计费时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime startPayTime; + + @ApiModelProperty(value = "每月租金") + private BigDecimal monthRent; + + @ApiModelProperty(value = "押金") + private BigDecimal deposit; + @ApiModelProperty(value = "变动后递增或递减之后的每月租金 前端忽略") + private BigDecimal changeRent; + + @ApiModelProperty(value = "租金支付方式 月付 季付 年付") + private String payType; + + @ApiModelProperty(value = "账单第一次支付日期 合同生效日期+10天 (不是真正的支付日期)生成第一次帐单后存值") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime firstPayTime; + @ApiModelProperty(value = "变动时间 根据周期改变 前端忽略") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime changeTime; + + @ApiModelProperty(value = "是否递增递减 true=是 false=否") + private Boolean isIncreasing; + + @ApiModelProperty(value = "押金是否随租金递增递减 true=是 false=否") + private Boolean isIncreasingDeposit; + + @ApiModelProperty(value = "违约金比例") + private BigDecimal proportion; + + @ApiModelProperty(value = "房屋id") + private String houseId; + + @ApiModelProperty(value = "甲方名称") + private String partyOneName; + + @ApiModelProperty(value = "甲方联系人") + private String partyOnePerson; + + @ApiModelProperty(value = "甲方联系方式") + private String partyOnePhone; + + @ApiModelProperty(value = "租户id") + private String tenantId; + + @ApiModelProperty(value = "乙方名称") + private String partyTwoName; + + @ApiModelProperty(value = "乙方联系人") + private String partyTwoPerson; + + @ApiModelProperty(value = "乙方联系方式") + private String partyTwoPhone; + + @ApiModelProperty(value = "合同附件,多个逗号拼接") + private String contractFile; + + /** + * 1 待提交 + * 2 待审批 + * 3 未签订 + * 4 已签订 + * 5 已驳回 + * 6 已终止 + * 7 待结算 + * 8 已结算 + */ + @ApiModelProperty(value = "合同状态 1=待提交 2=待审批 3=未签订 4=已签订 5=已驳回 6=已终止 7=待结算 8=已结算") + private String contractStatus; + @ApiModelProperty(value = "内存大小多个文件逗号拼接") + private String memory; + @ApiModelProperty(value = "附件名称 逗号拼接") + private String contractFileName; + @ApiModelProperty(value = "租户确认合同电子签名") + private String signature; + @ApiModelProperty(value = "终止合同备注说明") + private String terminateRemark; + @ApiModelProperty(value = "合计年租金") + private BigDecimal totalYear; + } diff --git a/ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml b/ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml new file mode 100644 index 0000000..f8488c0 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.system.mapper.StateTaskCenterMapper"> + + <!-- 通用查询映射结果 --> + <resultMap id="BaseResultMap" type="com.ruoyi.system.model.StateTaskCenter"> + <id column="id" property="id" /> + <result column="`name`" property="name" /> + <result column="module_name" property="moduleName" /> + <result column="remark" property="remark" /> + <result column="category" property="category" /> + <result column="flow_id" property="flowId" /> + <result column="variable" property="variable" /> + <result column="project_id" property="projectId" /> + </resultMap> + + <!-- 通用查询结果列 --> + <sql id="Base_Column_List"> + id, `name`, module_name, remark,category,flow_id,variable,project_id,create_time, update_time, create_by, update_by, disabled + </sql> + <select id="pageList" resultType="com.ruoyi.system.vo.ProcessTaskListVO"> + select stc.id, stc.`name`, stc.module_name, stc.remark,stc.category,stc.flow_id,stc.variable, + tc.id AS contractId, tc.contract_number, tc.contract_name, tc.start_time, tc.end_time,tc.deposit, tc.pay_type, + tc.first_pay_time, tc.isIncreasing,tc.isIncreasing_deposit,tc.proportion, tc.house_id, tc.party_one_name, tc.party_one_person, + tc.party_one_phone, tc.tenant_id, tc.party_two_name,tc.party_two_person, tc.party_two_phone,tc.memory, tc.contract_file_name, + tc.signature, tc.terminate_remark, tc.total_year,tc.status AS contractStatus + from state_task_center stc + LEFT JOIN t_contract tc ON stc.project_id = tc.id + <where> + <if test="query.instanceIds != null and query.instanceIds.size()>0"> + AND stc.flow_id IN + <foreach collection="query.instanceIds" item="item" open="(" separator="," close=")"> + #{item} + </foreach> + </if> + <if test="query.name != null and query.name !=''"> + AND stc.`name` like concat('%',#{query.name},'%') + </if> + <if test="query.moduleName != null and query.moduleName !=''"> + AND stc.module_name like concat('%',#{query.moduleName},'%') + </if> + <if test="query.createBy != null and query.createBy !=''"> + AND stc.create_by like concat('%',#{query.createBy},'%') + </if> + <if test="query.partyTwoName != null and query.partyTwoName !=''"> + AND tc.party_two_name like concat('%',#{query.partyTwoName},'%') + </if> + <if test="query.contractNumber != null and query.contractNumber !=''"> + AND tc.contract_number like concat('%',#{query.contractNumber},'%') + </if> + <if test="query.contractName != null and query.contractName !=''"> + AND tc.contract_name like concat('%',#{query.contractName},'%') + </if> + <if test="query.status != null and query.status !=''"> + AND tc.status like concat('%',#{query.status},'%') + </if> + AND tc.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()} + </where> + ORDER BY stc.create_time DESC + </select> + +</mapper> diff --git a/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml index c413736..c2abe7d 100644 --- a/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml @@ -9,7 +9,6 @@ <result column="contract_name" property="contractName" /> <result column="start_time" property="startTime" /> <result column="end_time" property="endTime" /> - <result column="month_rent" property="monthRent" /> <result column="deposit" property="deposit" /> <result column="pay_type" property="payType" /> <result column="first_pay_time" property="firstPayTime" /> @@ -41,9 +40,9 @@ <!-- 通用查询结果列 --> <sql id="Base_Column_List"> - id, contract_number, contract_name, start_time, end_time, total_rent, deposit, pay_type, first_pay_time, isIncreasing, isIncreasing_deposit, + id, contract_number, contract_name, start_time, end_time, deposit, pay_type, first_pay_time, isIncreasing, isIncreasing_deposit, proportion, house_id, party_one_name, party_one_person, party_one_phone, tenant_id, party_two_name, party_two_person, party_two_phone, - memory, contract_file_name, signature, terminate_remark, total_year + memory, contract_file_name, signature, terminate_remark, total_year,status </sql> <select id="contractList" resultType="com.ruoyi.system.model.TContract"> select t1.* from t_contract t1 -- Gitblit v1.7.1