From 32a8d6f59ca8cc961d1ff9d2656e9fdb00db93d6 Mon Sep 17 00:00:00 2001 From: dimengzhe Date: Mon, 13 Jan 2025 14:37:04 +0800 Subject: [PATCH] =?UTF-8?q?oaform=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OrgVo.java | 2 +- .../anrui/oa/biz/oaform/OaFormService.java | 219 +++++++++++++----- .../oaform/flowable/BusinessVariablesDto.java | 11 +- .../oa/biz/oaform/flowable/DelegateDto.java | 4 +- .../oa/biz/oaform/flowable/OaFormFlowDto.java | 2 +- 5 files changed, 168 insertions(+), 70 deletions(-) rename anrui-portal/anrui-portal-api/src/main/java/com/yxt/anrui/portal/api/{sysstafforg => sysorganization}/OrgVo.java (84%) diff --git a/anrui-portal/anrui-portal-api/src/main/java/com/yxt/anrui/portal/api/sysstafforg/OrgVo.java b/anrui-portal/anrui-portal-api/src/main/java/com/yxt/anrui/portal/api/sysorganization/OrgVo.java similarity index 84% rename from anrui-portal/anrui-portal-api/src/main/java/com/yxt/anrui/portal/api/sysstafforg/OrgVo.java rename to anrui-portal/anrui-portal-api/src/main/java/com/yxt/anrui/portal/api/sysorganization/OrgVo.java index 6329c6634c..83c43780ac 100644 --- a/anrui-portal/anrui-portal-api/src/main/java/com/yxt/anrui/portal/api/sysstafforg/OrgVo.java +++ b/anrui-portal/anrui-portal-api/src/main/java/com/yxt/anrui/portal/api/sysorganization/OrgVo.java @@ -1,4 +1,4 @@ -package com.yxt.anrui.portal.api.sysstafforg; +package com.yxt.anrui.portal.api.sysorganization; import lombok.Data; diff --git a/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/OaFormService.java b/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/OaFormService.java index 893a211c04..6898a1a1fc 100644 --- a/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/OaFormService.java +++ b/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/OaFormService.java @@ -19,12 +19,14 @@ import com.yxt.anrui.oa.feign.flowable.flowtask.LatestTaskVo; import com.yxt.anrui.oa.feign.message.MessageFeign; import com.yxt.anrui.oa.feign.message.MessageFlowVo; import com.yxt.anrui.oa.feign.message.MessageFlowableQuery; +import com.yxt.anrui.oa.feign.portal.sysorganization.OrgVo; import com.yxt.anrui.oa.feign.portal.sysorganization.SysOrganizationFeign; import com.yxt.anrui.oa.feign.portal.sysorganization.SysOrganizationVo; -import com.yxt.anrui.oa.feign.portal.sysstafforg.OrgVo; import com.yxt.anrui.oa.feign.portal.sysstafforg.SysStaffOrgFeign; import com.yxt.anrui.oa.feign.sysuser.SysUserFeign; import com.yxt.anrui.oa.feign.sysuser.SysUserVo; +import com.yxt.anrui.oa.feign.sysuser.UserQuery; +import com.yxt.anrui.oa.feign.sysuser.UserRoleQuery; import com.yxt.common.base.service.MybatisBaseService; import com.yxt.common.base.utils.PagerUtil; import com.yxt.common.base.utils.StringUtils; @@ -76,7 +78,7 @@ public class OaFormService extends MybatisBaseService { BeanUtil.copyProperties(dto, oaForm, "billNo", "orgSidPath"); try { // 获取组织信息,根据orgSidPath字段调用外部服务 - OrgVo orgVo = sysStaffOrgFeign.getOrgByPath(dto.getOrgSidPath()).getData(); + OrgVo orgVo = sysOrganizationFeign.getOrgByPath(dto.getOrgSidPath()).getData(); // 如果组织信息为空,返回失败信息 if (orgVo == null) { return rb.setMsg("未找到对应的组织信息"); @@ -118,6 +120,12 @@ public class OaFormService extends MybatisBaseService { } } + /** + * 详情初始化 + * + * @param sid + * @return + */ public ResultBean fetchDetailsBySid(String sid) { ResultBean rb = ResultBean.fireFail(); OaFormDetailsVo detailsVo = baseMapper.fetchDetailsBySid(sid); @@ -127,6 +135,12 @@ public class OaFormService extends MybatisBaseService { return rb.success().setData(detailsVo); } + /** + * 分页列表 + * + * @param pq + * @return + */ public PagerVo listPageVo(PagerQuery pq) { OaFormQuery query = pq.getParams(); QueryWrapper qw = new QueryWrapper<>(); @@ -136,6 +150,12 @@ public class OaFormService extends MybatisBaseService { return p; } + /** + * 删除 + * + * @param sids + * @return + */ public ResultBean delAll(String[] sids) { ResultBean rb = ResultBean.fireFail(); delBySids(sids); @@ -159,15 +179,27 @@ public class OaFormService extends MybatisBaseService { return baseMapper.updateFlowFiled(map); } + /** + * 办理(同意) + * + * @param dto + * @return + */ public ResultBean complete(BusinessVariablesDto dto) { ResultBean rb = ResultBean.fireFail(); BusinessVariables bv = new BusinessVariables(); BeanUtil.copyProperties(dto, bv); String businessSid = bv.getBusinessSid(); OaForm oaForm = fetchBySid(businessSid); - SysOrganizationVo deptVo = sysOrganizationFeign.fetchBySid(oaForm.getDeptSid()).getData(); - bv.setOrgSidPath(deptVo.getOrgSidPath()); - bv.setModelId(oaForm.getProcDefId()); + SubmitDto submitDto = new SubmitDto(); + BeanUtil.copyProperties(dto, submitDto); + //构造参数 + ResultBean businessVariablesResultBean = getGatewayParameter(submitDto); + if (!businessVariablesResultBean.getSuccess()) { + return rb.setMsg(businessVariablesResultBean.getMsg()); + } + BeanUtil.copyProperties(businessVariablesResultBean.getData(), bv, "taskDefKey", "taskId"); + bv.setInstanceId(oaForm.getProcInstId()); if (bv.getTaskId().equals(oaForm.getTaskId())) { ResultBean resultBean = flowFeign.handleProsess(bv); if (!resultBean.getSuccess()) { @@ -216,36 +248,38 @@ public class OaFormService extends MybatisBaseService { } } + /** + * 获取上一环节 + * + * @param query + * @return + */ public ResultBean> getPreviousNodesForReject(NodeQuery query) { ResultBean> rb = ResultBean.fireFail(); BusinessVariables bv = new BusinessVariables(); BeanUtil.copyProperties(query, bv); - //流程中的参数赋值、若有网关,则赋值网关中判断的字段。 - Map variables = new HashMap<>(); //查询业务信息 OaForm oaForm = fetchBySid(query.getBusinessSid()); - //网关 - bv.setModelId(oaForm.getProcDefId()); - bv.setFormVariables(variables); ResultBean>> resultBean = flowTaskFeign.getPreviousNodesForReject(bv); //判断数组是否为空,若为空则赋值,若不为空,则遍历循环将map中的数据赋值给getNodeVo List voList = Optional.ofNullable(resultBean.getData()).orElse(new ArrayList<>()).stream().map(m -> JSON.parseObject(JSON.toJSONString(m), NodeVo.class)).collect(Collectors.toList()); return rb.success().setData(voList); } + /** + * 获取下一环节 + * + * @param query + * @return + */ public ResultBean> getNextNodesForSubmit(NodeQuery query) { ResultBean> rb = ResultBean.fireFail(); BusinessVariables bv = new BusinessVariables(); BeanUtil.copyProperties(query, bv); - //流程中的参数赋值、若有网关,则赋值网关中判断的字段。 - Map variables = new HashMap<>(); //查询业务信息 OaForm oaForm = fetchBySid(query.getBusinessSid()); - //网关 - bv.setModelId(oaForm.getProcDefId()); - bv.setFormVariables(variables); //======================================= ResultBean>> resultBean = flowTaskFeign.getNextNodesForSubmit(bv); //判断数组是否为空,若为空则赋值,若不为空,则遍历循环将map中的数据赋值给getNodeVo @@ -253,7 +287,12 @@ public class OaFormService extends MybatisBaseService { return rb.success().setData(voList); } - + /** + * 驳回 + * + * @param dto + * @return + */ public ResultBean reject(TaskDto dto) { ResultBean rb = ResultBean.fireFail(); String businessSid = dto.getBusinessSid(); @@ -324,6 +363,12 @@ public class OaFormService extends MybatisBaseService { return rb.setMsg("操作失败!提交的数据不一致!"); } + /** + * 撤回 + * + * @param dto + * @return + */ public ResultBean revokeProcess(TaskDto dto) { ResultBean rb = ResultBean.fireFail(); if (StringUtils.isBlank(dto.getUserSid())) { @@ -348,10 +393,16 @@ public class OaFormService extends MybatisBaseService { return rb.setMsg("操作失败,提交的数据不一致!"); } + /** + * 终止 + * + * @param dto + * @return + */ public ResultBean breakProcess(TaskDto dto) { ResultBean rb = ResultBean.fireFail(); - if (StringUtils.isBlank(dto.getInstanceId())) { - return rb.setMsg("参数错误:instanceId"); + if (StringUtils.isBlank(dto.getProcInsId())) { + return rb.setMsg("参数错误:procInsId"); } if (StringUtils.isBlank(dto.getUserSid())) { return rb.setMsg("参数错误:userSid"); @@ -391,63 +442,52 @@ public class OaFormService extends MybatisBaseService { return rb.setMsg("操作失败!提交的数据不一致!"); } + /** + * 加签 + * + * @param dto + * @return + */ public ResultBean delegate(DelegateDto dto) { ResultBean rb = ResultBean.fireFail(); FlowDelegateQuery delegateQuery = new FlowDelegateQuery(); BeanUtil.copyProperties(dto, delegateQuery); + delegateQuery.setInstanceId(dto.getProcInsId()); flowFeign.delegate(delegateQuery); return rb.success(); } + /** + * 转办 + * + * @param dto + * @return + */ public ResultBean assignTask(DelegateDto dto) { ResultBean rb = ResultBean.fireFail(); FlowDelegateQuery delegateQuery = new FlowDelegateQuery(); BeanUtil.copyProperties(dto, delegateQuery); + delegateQuery.setInstanceId(dto.getProcInsId()); flowFeign.assignTask(delegateQuery); return rb.success(); } - + /** + * 更新流程名称和标题 + * + * @param oaForm + * @return + */ public int updateFormType(OaForm oaForm) { return baseMapper.updateById(oaForm); } - - public ResultBean submit1(BusinessVariables bv) { - String businessSid = bv.getBusinessSid(); - //启动流程 - ResultBean voResultBean = flowFeign.startProcess(bv); - UpdateFlowFieldVo ufVo = voResultBean.getData(); - OaFormFlowDto oaFormFlowDto = new OaFormFlowDto(); - BeanUtil.copyProperties(ufVo, oaFormFlowDto, "sid"); - oaFormFlowDto.setSid(businessSid); - updateFlow(oaFormFlowDto); - OaForm oaForm = fetchBySid(businessSid); - try { - ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() - .setNameFormat("demo-pool-%d").build(); - ExecutorService pool = new ThreadPoolExecutor(2, 100, - 0L, TimeUnit.MILLISECONDS, - new LinkedBlockingQueue(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy()); - Future future1 = pool.submit(() -> { - //极光推送 - MessageFlowableQuery messageFlowableQuery = new MessageFlowableQuery(); - MessageFlowVo messageFlowVo = new MessageFlowVo(); - BeanUtil.copyProperties(ufVo, messageFlowVo); - messageFlowableQuery.setUfVo(messageFlowVo); - messageFlowableQuery.setAppMap((Map) bv.getFormVariables().get("app")); - messageFlowableQuery.setBusinessSid(businessSid); - messageFlowableQuery.setModuleName(oaForm.getFormType()); - messageFlowableQuery.setMsgContent(oaForm.getCreateByName() + "提交的" + messageFlowableQuery.getModuleName() + ",请审批"); - messageFlowableQuery.setMsgTitle(oaForm.getFormType()); - messageFeign.pushMessage(messageFlowableQuery); - }); - } catch (Exception e) { - e.printStackTrace(); - } - return voResultBean; - } - + /** + * 提交 + * + * @param dto + * @return + */ public ResultBean submit(SubmitDto dto) { ResultBean rb = ResultBean.fireFail(); ResultBean businessVariablesResultBean = getGatewayParameter(dto); @@ -462,7 +502,7 @@ public class OaFormService extends MybatisBaseService { ResultBean voResultBean = flowFeign.startProcess(bv); UpdateFlowFieldVo ufVo = voResultBean.getData(); OaFormFlowDto oaFormFlowDto = new OaFormFlowDto(); - BeanUtil.copyProperties(ufVo, oaFormFlowDto, "sid"); + BeanUtil.copyProperties(ufVo, oaFormFlowDto); updateFlow(oaFormFlowDto); try { ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() @@ -488,18 +528,24 @@ public class OaFormService extends MybatisBaseService { } return voResultBean; } else if (r == 2) { - bv.setTaskId(oaForm.getTaskId()); - bv.setTaskDefKey(oaForm.getNodeId()); - bv.setComment("重新提交"); - bv.setInstanceId(oaForm.getProcInstId()); BusinessVariablesDto businessVariablesDto = new BusinessVariablesDto(); BeanUtil.copyProperties(bv, businessVariablesDto); + businessVariablesDto.setProcInsId(oaForm.getProcInstId()); + businessVariablesDto.setTaskId(oaForm.getTaskId()); + businessVariablesDto.setTaskDefKey(oaForm.getNodeId()); + businessVariablesDto.setComment("重新提交"); return complete(businessVariablesDto); } return rb; } + /** + * 提交锁 + * + * @param dto + * @return + */ private synchronized int submitBusinessData(SubmitDto dto) { int r = 0; OaForm oaForm = fetchBySid(dto.getBusinessSid()); @@ -529,7 +575,11 @@ public class OaFormService extends MybatisBaseService { SysOrganizationVo deptVo = sysOrganizationFeign.fetchBySid(oaForm.getDeptSid()).getData(); bv.setOrgSidPath(deptVo.getOrgSidPath()); //流程定义id - bv.setModelId(dto.getProcDefId()); + if (StringUtils.isBlank(oaForm.getProcDefId())) { + bv.setModelId(dto.getProcDefId()); + } else { + bv.setModelId(oaForm.getProcDefId()); + } int rule = dto.getRule(); if (rule == OaFormRuleEnum.DIRECTLY_UNDER.getRule()) { SysOrganizationVo organizationVo = sysOrganizationFeign.fetchBySid(oaForm.getDeptSid()).getData(); @@ -540,10 +590,55 @@ public class OaFormService extends MybatisBaseService { } else if (rule == OaFormRuleEnum.INSTITUTION.getRule()) { //获取本机构链(含集团、事业部、分公司部门)中角色的用户(角色sid,发起人orgsidPath) + NodeQuery query = new NodeQuery(); + query.setBusinessSid(dto.getBusinessSid()); + query.setTaskDefKey(oaForm.getNodeId()); + ResultBean> resultBean = getNextNodesForSubmit(query); + List voList = resultBean.getData(); + List candidateGroups = voList.get(0).getCandidateGroups(); + UserQuery userQuery = new UserQuery(); + userQuery.setRoleSid(candidateGroups.get(0)); + userQuery.setOrgSidPath(bv.getOrgSidPath()); + List sysUserVos = sysUserFeign.getUserByRole(userQuery).getData(); + StringBuilder nextNodeUserSids = new StringBuilder(); + if (sysUserVos.size() > 0) { + for (SysUserVo sysUserVo : sysUserVos) { + String sid = sysUserVo.getSid(); + nextNodeUserSids.append(sid).append(","); + } + } + if (StringUtils.isBlank(nextNodeUserSids)) { + bv.setNextNodeUserSids(""); + } else { + String substring = nextNodeUserSids.substring(0, nextNodeUserSids.lastIndexOf(",")); + bv.setNextNodeUserSids(substring); + } } else if (rule == OaFormRuleEnum.OTHER_INSTITUTION.getRule()) { //获取其他机构链角色的用户(角色sid,机构sid]) - + NodeQuery query = new NodeQuery(); + query.setBusinessSid(dto.getBusinessSid()); + query.setTaskDefKey(oaForm.getNodeId()); + ResultBean> resultBean = getNextNodesForSubmit(query); + List voList = resultBean.getData(); + List candidateGroups = voList.get(0).getCandidateGroups(); + UserRoleQuery userRoleQuery = new UserRoleQuery(); + userRoleQuery.setRoleSid(candidateGroups.get(0)); + userRoleQuery.setOrgSid(dto.getOrgSid()); + List sysUserVos = sysUserFeign.getOtherOrgRoleUser(userRoleQuery).getData(); + StringBuilder nextNodeUserSids = new StringBuilder(); + if (sysUserVos.size() > 0) { + for (SysUserVo sysUserVo : sysUserVos) { + String sid = sysUserVo.getSid(); + nextNodeUserSids.append(sid).append(","); + } + } + if (StringUtils.isBlank(nextNodeUserSids)) { + bv.setNextNodeUserSids(""); + } else { + String substring = nextNodeUserSids.substring(0, nextNodeUserSids.lastIndexOf(",")); + bv.setNextNodeUserSids(substring); + } } else { bv.setNextNodeUserSids(""); } diff --git a/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/flowable/BusinessVariablesDto.java b/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/flowable/BusinessVariablesDto.java index 46e2cff07c..728ceaace7 100644 --- a/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/flowable/BusinessVariablesDto.java +++ b/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/flowable/BusinessVariablesDto.java @@ -1,5 +1,6 @@ package com.yxt.anrui.oa.biz.oaform.flowable; +import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -31,10 +32,8 @@ public class BusinessVariablesDto { * 审批意见 */ private String comment; - /** - * 流程实例的id - */ - private String instanceId; + @ApiModelProperty("实例id") + private String procInsId; /** * taskId */ @@ -63,4 +62,8 @@ public class BusinessVariablesDto { * 业务参数,按需传递 */ private Map formVariables = new HashMap<>(); + /** + * 规则:请查看OaFormRuleEnum + */ + private int rule; } diff --git a/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/flowable/DelegateDto.java b/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/flowable/DelegateDto.java index eb2dcbdb03..566df680e4 100644 --- a/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/flowable/DelegateDto.java +++ b/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/flowable/DelegateDto.java @@ -13,8 +13,8 @@ public class DelegateDto { @ApiModelProperty private String userSid; - @ApiModelProperty("流程实例id") - private String instanceId; + @ApiModelProperty("实例id") + private String procInsId; @ApiModelProperty("任务Id") private String taskId; @ApiModelProperty("审批人sid") diff --git a/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/flowable/OaFormFlowDto.java b/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/flowable/OaFormFlowDto.java index 99e040025a..cd1a9f8c1e 100644 --- a/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/flowable/OaFormFlowDto.java +++ b/yxt-oa/src/main/java/com/yxt/anrui/oa/biz/oaform/flowable/OaFormFlowDto.java @@ -16,7 +16,7 @@ public class OaFormFlowDto { private String procDefId; @ApiModelProperty("流程状态") private String nodeState; - @ApiModelProperty("流程实例id") + @ApiModelProperty("实例id") private String procInsId; @ApiModelProperty("环节id") private String taskDefKey;