当前位置: 首页 > wzjs >正文

没有网站怎么做推广制作英文

没有网站怎么做推广,制作英文,自己做的网站 360不兼容,个人网站建设心得前言 前文完成了我的待办的查询功能,本文就在此基础上从源码解读到完成审批任务的功能,审批界面我就先不带表单,直接单纯审批通过,这里需要注意的事,审批的表单其实每个节点都可能需要不同的表单内容,后续要…

前言

        前文完成了我的待办的查询功能,本文就在此基础上从源码解读到完成审批任务的功能,审批界面我就先不带表单,直接单纯审批通过,这里需要注意的事,审批的表单其实每个节点都可能需要不同的表单内容,后续要实现自定义动态表单。

一、TaskService.complete(taskId) 的核心逻辑

① 方法签名定位

        多种重载最终委托给 TaskServiceImpl.completeInternal。

② 加载与校验任务

        从数据库中读取任务实体并检测其状态。

③ 流程/本地变量处理

        将用户在完成时传入的变量写入运行时或本地作用域。

④ 事件派发与历史记录

        在任务完成前后触发引擎事件,并将运行时与历史数据持久化。

⑤ 流程执行推进

        调用执行实体(ExecutionEntity)的 signal() 或 BPMN 行为的 leave(),推动流程继续。

⑥ 任务删除与身份链接清理

        移除任务记录及其在身份链接表中的关联。

⑦ 异步后置逻辑

        根据异步配置生成作业(JobEntity),由引擎后续调度执行。

二、方法签名定位

        在 TaskService 接口中,complete 提供多种重载,如:

void complete(String taskId);

void complete(String taskId, Map<String,Object> variables);

void complete(String taskId, String userId, Map<String,Object> variables);

        所有重载方法最终委托给实现类 org.flowable.engine.impl.TaskServiceImpl 的 completeInternal(...) 方法,以统一执行流程。 

        本文使用的是第一种重载方法。

三、加载与校验任务

        加载任务实体,从运行时任务表(ACT_RU_TASK)中读取对应 TaskEntity 对象:

TaskEntity task = taskEntityManager.findById(taskId);

        存在性校验,若无此任务,抛出 FlowableObjectNotFoundException。

if (task == null) {
    throw new FlowableObjectNotFoundException("No task found with id '" + taskId + "'");
}

         委派状态校验,拒绝完成处于“待确认”(PENDING)状态的委派任务。

if (task.getDelegationState() == DelegationState.PENDING) {
    throw new FlowableException("Cannot complete a task that is in delegation state PENDING");
}

四、流程/本地变量处理

① 流程变量写入

        默认将变量保存在流程实例作用域,调用 VariableService 完成存储。

② 本地变量写入

        若传入参数指定 localScoped=true,则写入任务本地范围。

③ 持久化历史变量

        若开启历史记录,变量的写入会在 ACT_HI_VARINST 表中留存审计轨迹。

五、事件派发与历史记录

① 事件分发

        在任务完成前后,通过 EventDispatcher 发布 TASK_COMPLETED 等引擎事件,供监听器或审计插件使用。

② 历史任务记录

        若引擎历史级别(historyLevel) ≥ AUDIT,会在 ACT_HI_TASKINST 表中记录任务结束信息(结束时间、原因等)。

③ 事务一致性

        事件与历史写入与运行时数据同一事务提交,避免不一致风险。

六、流程执行推进

① 获取执行实体

        若任务绑定在流程节点上,execution 不为 null。

ExecutionEntity execution = task.getExecution();

② 调用 BPMN 行为

        对用户任务,执行 UserTaskActivityBehavior.leave(execution),其内部会调用一下方法,从而沿着流程定义的连线推进到下一个节点。

execution.signal(null, null);

七、任务删除与身份链接清理

① 删除任务记录

        将任务从 ACT_RU_TASK 表中移除。

taskEntityManager.delete(task);

② 移除身份链接

        同时清理 ACT_RU_IDENTITYLINK 表中与该任务相关的用户/组关联,防止孤立数据。

八、异步后置逻辑

① 异步任务创建

        若任务或流程节点配置了异步 (async="true"),完成时会生成新的 JobEntity。

② 调度执行

        JobExecutor 后续会在独立线程中触发这些异步作业,解耦长耗时操作,提升吞吐。

③ 异步历史

        若开启异步历史,同步写入历史的操作也会改为异步,进一步优化性能。

九、完成后端接口

① 定义请求参数

        在前文中,我们已经在查询我的待办任务数据中,包含了任务ID,所以直接传递当前行数据中的任务ID给到后端执行审批操作即可。

package com.ceair.entity.request;import lombok.Data;import java.io.Serial;
import java.io.Serializable;/*** @author wangbaohai* @ClassName ApprovalMyTaskReq* @description: 审批我的任务请求参数* @date 2025年05月02日* @version: 1.0.0*/
@Data
public class ApprovalMyTaskReq implements Serializable {@Serialprivate static final long serialVersionUID = 1L;// 任务编号private String taskId;}

② 创建后端接口

        接口部分主要就是使用 TaskService.complete(taskId) 这个重载方法。

/*** 审批我的待办任务。* <p>* 权限: /api/v1/myTask/approvalMyTask* 参数: approvalMyTaskReq - 包含任务ID的审批请求对象* 返回: Result<Boolean> 表示审批是否成功* <p>* 异常处理:* - 任务ID为空 → 参数错误* - Flowable异常 → 返回审批失败信息* - 其他异常 → 系统异常提示*/
@PreAuthorize("hasAnyAuthority('/api/v1/myTask/approvalMyTask')")
@Parameter(name = "approvalMyTaskReq", description = "审批我的待办任务请求对象", required = true)
@Operation(summary = "审批我的待办任务")
@PostMapping("/approvalMyTask")
public Result<Boolean> approvalMyTask(@RequestBody ApprovalMyTaskReq approvalMyTaskReq) {// 参数校验if (approvalMyTaskReq == null || approvalMyTaskReq.getTaskId() == null) {log.warn("审批失败:非法的任务ID");return Result.error("参数不能为空或任务ID无效");}try {// 调用Flowable 任务服务完成任务审批taskService.complete(approvalMyTaskReq.getTaskId());return Result.success(true);} catch (FlowableException | IllegalArgumentException e) {log.error("审批我的待办任务失败,原因:{}", e.getMessage(), e);return Result.error("审批我的待办任务失败,原因:" + e.getMessage());} catch (Exception e) {log.error("发生未知异常,审批失败:", e);return Result.error("系统异常,请联系管理员");}
}

十、完成前端按钮功能

① 定义前端类型

// 审批任务请求参数

export interface ApprovalMyTaskReq {

  taskId: string // 任务编号,对应 Java 中的 String taskId

}

② 封装请求接口

/**

 * 审批待办任务

 */

export function approvalMyTask(data: ApprovalMyTaskReq) {

  return request.post<any>({

    url: '/pm-process/api/v1/myTask/approvalMyTask',

    data,

  })

}

③ 完善按钮界面

<el-button v-if="scope.row.status === 0 || scope.row.status === 2" v-hasButton="`btn.myTask.approvalMyTask`" type="primary" @click="onApproval(scope.row)">
  审批
</el-button>

④ 创建审批按钮方法

/*** 异步函数:处理任务审批** @param row 任务对象,包含任务ID等信息*/
async function onApproval(row: TaskVO) {try {// 获取当前任务ID并设置参数const param: ApprovalMyTaskReq = {taskId: row.taskId,}// 调用后端接口进行审批操作const result: any = await approvalMyTask(param)// 如果接口调用成功且返回的状态码为200,则显示成功提示信息if (result.success && result.code === 200) {ElMessage({message: '审批成功',type: 'success',})}else {ElMessage({message: `审批失败: ${result.message}`,type: 'error',})}}catch (error) {// 捕获异常并提取错误信息let errorMessage = '未知错误'if (error instanceof Error) {errorMessage = error.message}// 显示操作失败的错误提示信息ElMessage({message: `审批失败: ${errorMessage || '未知错误'}`,type: 'error',})}
}

十一、创建权限并分配

注意给至少两个用户分配角色权限

十二、测试&验证

        我们用admin用户作为第一个节点审批人,BOB用户作为第二个节点审批人,当admin审批后,我们应该切换BOB用户能看到待办任务。

发布之后我们看部署的流程的xml

然后我们启动这个最新的流程

保持当前admin账号查看我的待办任务

然后办理任务

成功之后我们切换用户到BOB

可以看到刚才的任务已经扭转到BOB帐号了

后记

        下一篇文章来梳理任务的梳理以及具体的实现方法,本文的完整代码仓库地址请查看专栏第一篇文章的说明。

本文的后端分支是 process-10

本文的前端分支是 process-12


文章转载自:

http://g8DuVGmt.fdzzh.cn
http://QMNyU1Zm.fdzzh.cn
http://IL4r3HdT.fdzzh.cn
http://ZB0uX0Pv.fdzzh.cn
http://rL2PzLYS.fdzzh.cn
http://nDW3ThKd.fdzzh.cn
http://LRRV3KEK.fdzzh.cn
http://eXG4CAQZ.fdzzh.cn
http://MyKi80Ff.fdzzh.cn
http://aizTDPcn.fdzzh.cn
http://ybQMtWGA.fdzzh.cn
http://Q0UabQPD.fdzzh.cn
http://HpU2KD2q.fdzzh.cn
http://JbRwv84i.fdzzh.cn
http://S5wwO2HM.fdzzh.cn
http://LzaaAkSH.fdzzh.cn
http://8kVjJjoJ.fdzzh.cn
http://2nRnvz2H.fdzzh.cn
http://P8bYp4jl.fdzzh.cn
http://E0Sw3syd.fdzzh.cn
http://ou8aRPWs.fdzzh.cn
http://z59QSj7o.fdzzh.cn
http://xxvG67cm.fdzzh.cn
http://8c1I99tJ.fdzzh.cn
http://ok7GvPMy.fdzzh.cn
http://Oy1bVert.fdzzh.cn
http://edaiZXDl.fdzzh.cn
http://QzABASEJ.fdzzh.cn
http://QpXbOhr0.fdzzh.cn
http://IxXNeReL.fdzzh.cn
http://www.dtcms.com/wzjs/774788.html

相关文章:

  • 建设银行手机不用了怎么登陆网站html表格的完整代码
  • 网站两列导航wordpress 角色权限
  • 自己做网站php好做吗正规制作网站公司哪家好
  • 大兴安岭建设局网站深圳网站开发学习
  • 深圳网站建设一条龙淘宝关键词排名怎么查
  • 新网站建设ppt上海工程建设信息网官网
  • 个人业务网站教程微信公众平台功能开发
  • 网站制作的网站做网站是咋收费的
  • 上海有多少个网站科技公司聊城百度做网站的
  • 网站开发用户名不存在简单的装x编程代码
  • 设计的商城网站建设asp网站 会员注册
  • 南京网站制作公司怎么样网站logo
  • 网站开发英文参考文献2015年后外贸网站特效
  • 青海西宁制作网站企业帝国做视频网站
  • 招商网站建设哪家好室内设计效果图在哪里找
  • 代理服务网站万网域名证书
  • 新人怎么自己做网站学校网站的建设
  • 箱包网站模板seo公司培训
  • 怎么做网站反向链接北京seo网站设计
  • 学校机构网站建设内容h5开发网站优点
  • 小说网站开发背景网页建站怎么做
  • 如何给自己的公司做网站简洁文章类网站
  • 专门做二手书网站或app五 网站开发总体进度安排
  • 网站的设计方法有哪些市场营销策略名词解释
  • 成都电子商城网站开发wordpress登录页面修改
  • 网站手机版建设网站域名备案在阿里云怎么做
  • 中文的网站做不成二维码wordpress迁移typecho
  • 公司和公司网站的关系wordpress局部内容
  • 瑞金网站建设推广做网站大概需要多少费用
  • 网站制作如皋定制微信怎么做