用户审批意见回填到审批表单

需求

将审批同意时填写的审批意见以及图片回填到审批表单中。(填写节点同理)

用户审批意见回填到审批表单

实现方式一

通过审批后置函数操作流程参数的数据,并将流程参数数据回写到流程中。

流程设计

  1. 流程参数中自定义需要传递的字段。
    用户审批意见回填到审批表单

  2. 审批节点设计审批后置函数,后置函数由后端定义。
    用户审批意见回填到审批表单

  3. 添加更新数据节点,选择需要更新的业务表单字段,并在表达式中选择流程参数中自定义的字段。我这里更新审批意见和图片两个字段。
    用户审批意见回填到审批表单
    用户审批意见回填到审批表单

后置函数定义:

    /**
     * 审批后数据处理
     *
     * @param approvalNode 审批节点
     * @param context      上下文
     * @param dataJson     审批提交数据
     * @param result       审批结果
     */
    @Function(name = "approvalDataProcessFun", openLevel = API)
    @Function.Advanced(type = FunctionTypeEnum.QUERY, displayName = "审批后数据处理", category = FunctionCategoryEnum.CUSTOM_DESIGNER)
    public void approvalDataProcessFun(ApprovalNode approvalNode, WorkflowContext context, String dataJson, Boolean result) {
        List<WorkflowUserTask> workflowUserTasks = Models.origin().queryListByWrapper(Pops.<WorkflowUserTask>lambdaQuery()
                .from(WorkflowUserTask.MODEL_MODEL)
                .eq(WorkflowUserTask::getTaskId, context.getLastTaskInstanceId())
        );
        // 获取审批意见等放入流程参数
        for (WorkflowUserTask userTask : workflowUserTasks) {
            String remark = userTask.getRemark();
            List<String> pics = userTask.getPics();
            List<PamirsFile> attachments = userTask.getAttachments();

            Map<String, Object> paramMap = (Map<String, Object>) context.getContext().getOrDefault(ParamNode.PARAM_PREFIX, new HashMap<String, Object>());
            paramMap.put("remark", remark);
            paramMap.put("pics", pics);
        }

    }

实现方式二

通过审批动作(WorkflowUserTaskAction )扩展点实现

1、扩展点的定义

package pro.shushi.pamirs.work.core.extpoint;

import pro.shushi.pamirs.meta.annotation.Ext;
import pro.shushi.pamirs.meta.annotation.ExtPoint;
import pro.shushi.pamirs.workflow.app.api.model.WorkflowUserTask;

// @see:pro.shushi.pamirs.workflow.app.core.action.WorkflowUserTaskAction
/**
 *  Oinone所有的函数都提供了默认的前置扩展点、重载扩展点和后置扩展点,
 *  其技术名称的规则是所扩展函数的函数编码fun加上“Before”、“Override”和“After”后缀
  *  
  *  根据实际情况保留扩展点的接口和实现(可增加、可删减)
 */
@Ext(WorkflowUserTask.class)
public interface WorkflowUserTaskDealExtPoint {

    // 实际需要几个扩展点根据业务情况自行 增加 和 删除
    @ExtPoint(displayName = "审批同意后")
    WorkflowUserTask approveAgreeAfter(WorkflowUserTask workflowUserTask);

    @ExtPoint(displayName = "审批撤销后")
    WorkflowUserTask recallAfter(WorkflowUserTask workflowUserTask);

    @ExtPoint(displayName = "审批转审后")
    WorkflowUserTask approveTrangerAfter(WorkflowUserTask workflowUserTask);

    @ExtPoint(displayName = "审批转审前")
    WorkflowUserTask approveFallbackBefore(WorkflowUserTask workflowUserTask);

    @ExtPoint(displayName = "审批拒绝后")
    WorkflowUserTask approveRejustAfter(WorkflowUserTask workflowUserTask);

    @ExtPoint(displayName = "审批转审后")
    WorkflowUserTask approveFallbackAfter(WorkflowUserTask workflowUserTask);

    // …………
}

2、扩展点的实现

package pro.shushi.pamirs.work.core.extpoint;

import org.springframework.stereotype.Component;
import pro.shushi.pamirs.meta.annotation.Ext;
import pro.shushi.pamirs.meta.annotation.ExtPoint;
import pro.shushi.pamirs.meta.annotation.fun.extern.Slf4j;
import pro.shushi.pamirs.meta.util.JsonUtils;
import pro.shushi.pamirs.work.api.model.monthplan.WorkMonthlyPlan;
import pro.shushi.pamirs.work.api.model.monthplan.WorkPlanDelayApplication;
import pro.shushi.pamirs.workflow.app.api.model.WorkflowUserTask;

/**
 * 流程审操作扩展  @see:pro.shushi.pamirs.workflow.app.core.action.WorkflowUserTaskAction
 *  Oinone所有的函数都提供了默认的前置扩展点、重载扩展点和后置扩展点,
 *  其技术名称的规则是所扩展函数的函数编码fun加上“Before”、“Override”和“After”后缀
  *  
  *  根据实际情况保留扩展点的接口和实现 (可增加、可删减)
 */
@Ext(WorkflowUserTask.class)
@Component
@Slf4j
public class WorkflowUserTaskDealExtPointImpl implements WorkflowUserTaskDealExtPoint {

    // 根据实际情况是否保留
    @ExtPoint.Implement
    @Override
    public WorkflowUserTask approveRejustAfter(WorkflowUserTask userTask) {
        userTask.getNodeDataBizId();
        userTask.getModel();
         // 业务数据ID:userTask.getNodeDataBizId();
        log.info("=====================approveRejustAfter============================");
        return userTask;
    }

    @ExtPoint.Implement
    @Override
    public WorkflowUserTask approveAgreeAfter(WorkflowUserTask userTask) {
        log.info("=====================approveAgreeAfter============================");
        // WorkPlanDelayApplication 是具体的业务模型,根据事情情况修改。 其他的模型直接写else分支
        if (WorkPlanDelayApplication.MODEL_MODEL.equals(userTask.getModel())) {
            WorkPlanDelayApplication workPlanDelayApplication = JsonUtils.parseObject(userTask.getNodeContext(), WorkPlanDelayApplication.class);
            workPlanDelayApplication.setAuditRemark(userTask.getRemark());
            workPlanDelayApplication.setAuditAttachments(userTask.getAttachments());
            userTask.setPics(userTask.getPics());
            workPlanDelayApplication.updateById();
            userTask.setContent(JsonUtils.toJSONString(workPlanDelayApplication));
        } else if (WorkMonthlyPlan.MODEL_MODEL.equals(userTask.getModel())) {
            // WorkMonthlyPlan逻辑 ………… 其他模版类似
        }

        return userTask;
    }

    // 根据实际情况是否保留
    @ExtPoint.Implement
    @Override
    public WorkflowUserTask recallAfter(WorkflowUserTask userTask) {
        log.info("=====================recallAfter============================");
        return userTask;
    }

    // 根据实际情况是否保留
    @ExtPoint.Implement
    @Override
    public WorkflowUserTask approveTrangerAfter(WorkflowUserTask workflowUserTask) {
        return workflowUserTask;
    }

    // 根据实际情况是否保留
    @ExtPoint.Implement
    @Override
    public WorkflowUserTask approveFallbackBefore(WorkflowUserTask workflowUserTask) {
        return workflowUserTask;
    }

    // 根据实际情况是否保留
    @ExtPoint.Implement
    @Override
    public WorkflowUserTask approveFallbackAfter(WorkflowUserTask workflowUserTask) {
        return workflowUserTask;
    }

}

更多后置函数参考:自定义函数示例代码汇总

Oinone社区 作者:yexiu原创文章,如若转载,请注明出处:https://doc.oinone.top/other/25502.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

Like (0)
yexiu's avataryexiu数式员工
Previous 2026年1月7日 pm3:51
Next 2026年3月12日 pm7:53

相关推荐

  • IP黑白名单实现拦截三方用户

    已知厂商IP为10.139.0.1,经系统检测122.233.24.28、138.122.12.9为风险IP,需要禁止访问。 白名单配置:10.139.0.1 黑名单配置:122.233.24.28、138.122.12.9 厂商请求到Oinone开放平台请求头需携带X-Forwarded-For和X-Real-IP,例如: X-Forwarded-For 122.233.24.28 X-Real-IP 122.233.24.28 经Nginx代理后,oinone获取的请求头内容: X-Forwarded-For 122.233.24.28, 10.139.0.1 # 代理追加厂商IP到末尾 X-Real-IP 122.233.24.28 # 保持客户端原始值,Nginx不处理 效果:厂商10.139.0.1发送的请求且用户X-Real-IP不在黑名单内才放行。 注意事项 Nginx如果配置X-Real-IP需关闭,否则拿到的永远是厂商IP。 proxy_set_header X-Real-IP $remote_addr; 相关文章 开放应用中的ip黑白名单

    2025年5月15日
    52800
  • Oinone 初级学习路径

    文档说明 文档链接 介绍Oinone前端相关知识点 前端基础学习路径 介绍Oinone后端相关知识点 后端基础学习路径 介绍平台基础组件 平台基础组件 介绍平台设计器常用场景实操 设计器基础学习路径 设计器实操案例示例 7.2 实战训练(积分发放)

    2024年6月15日
    1.4K00
  • 数式Oinone培训前注意事项

    一、快速上手 (建议至少预习 6 小时) 在正式培训之前,建议需要完成以下任务,以便对培训内容有基本了解: 点击阅读:快速启动入门 该文档为学员提供了从入门到实现 demo 的全过程说明,涵盖了开发工具、框架搭建、常见问题解答等内容 开始培训前,请参与人员确保完成以下任务 阅读并理解文档中的每个步骤。 配置好前后端开发环境。 完成 demo 的基础框架搭建,验证是否能够成功运行。 二、预期成果 通过上述预习,大家完成以下事项:• 成功搭建本地开发环境,并能运行前后端的基本 demo。• 对前后端技术栈有初步了解,为正式培训中的深度学习打下基础,并且提出对应的疑问点 三、其他准备工作 1.技术工具检查:请确在本地已安装并配置好必要的开发工具和环境(如 IDE、Node.js、数据库等);2.参与者反馈:在预习过程中,学员如遇到困难或无法解决的问题(前后端疑问),请提前记录并提交,以便培训期间重点解答;3.版本是否是最新的版本,且建议研发人员版本一致,且类型是 mini; ps:部署包相关信息,联系数式相关人员获取

    未分类 2024年8月2日
    3.1K00
  • 自定义字段样式

    在日常开发中,我们经常会遇到需要根据业务规则动态展示字段样式的场景,比如表格、表单或详情中的某些字段需要改变文字颜色。本文将通过一个具体的案例,带大家实现这一功能。 以下以 自定义表格字段文字颜色 为例。 实现步骤 1. 在界面设计器中添加组件 通过界面设计器,添加一个组件 2. 创建元件 以表格的「金额字段」为例,创建对应的元件(可根据自己的业务场景调整)。 3. 配置元件属性 进入元件设计页面,从组件库中拖入「单行文本」到设计区域。在右侧属性面板中填写相关配置并保存 4. 保存元件 完成配置后,保存元件。 5. 发布元件 将元件发布,供页面设计使用。 6. 切换表格字段 进入页面设计器,将表格中的字段切换为刚刚创建的元件。 7. 配置字段颜色 在右侧属性面板中,配置字段的文字颜色: 固定颜色:直接输入颜色值(如 red)。 动态颜色:输入表达式,根据业务逻辑动态展示颜色。例如:当前行的名称等于 1 时显示红色,否则为蓝色。 示例表达式: activeRecord.name === '1' ? 'red' : 'blue' 8: 在代码中,自定义对应的表格字段 import { SPI, BaseFieldWidget, ModelFieldType, ViewType, TableCurrencyFieldWidget, Widget, RowContext, numberZeroFill, numberAddThousandth, Expression, ExpressionRunParam } from '@kunlun/dependencies'; import { toString } from 'lodash-es'; import { createVNode, VNode } from 'vue'; @SPI.ClassFactory( BaseFieldWidget.Token({ viewType: [ViewType.Table], ttype: [ModelFieldType.Currency], widget: 'TableCurrencyColor' }) ) export class TableCustomCurrencyFieldWidget extends TableCurrencyFieldWidget { computedFieldColor(context: RowContext) { const { fieldColor = ' ' } = this.getDsl(); if (!fieldColor) { return null; } // 如果当前颜色是表达式,则需要计算 if (Expression.hasKeywords(fieldColor)) { const params: ExpressionRunParam = { activeRecords: [context.data], rootRecord: {}, openerRecord: {}, scene: '' }; return Expression.run(params, fieldColor, fieldColor)!; } return fieldColor; } @Widget.Method() public renderDefaultSlot(context: RowContext): VNode[] | string { let value = numberZeroFill(toString(super.compute(context)), this.getPrecision(context)); if (this.getShowThousandth(context)) { value = numberAddThousandth(value); } return [ createVNode( 'div', { style: { color: this.computedFieldColor(context) } }, value ) ]; } } 9: 页面效果图

    2025年1月9日
    6.1K00

Leave a Reply

Please Login to Comment