【问题篇】activiti工作流转办并处理备注问题

简介: 【问题篇】activiti工作流转办并处理备注问题


       当处理activiti转办问题时,需要做的就是处理审批人和备注问题。

       处理的思路是,先将当前环节标志成转办标签,再通过BUSINESS_KEY_找到流程实例的历史记录,找到最新的一条复制一份出来,表示需要转办到的人的历史记录并设置好审批人(默认转办人的环节‘单位领导’也是做转办人的环节名字,如不是则手动处理下),在更换当前流程的审批人,将任务分到转办人那里去,再将原来最新的历史记录处理掉(通过修改endTime改为处理完成,并将主键进行替换,为了将他隔离开,不与复制出来的id冲突,再通过同样的方式进行comment表的处理并将comment表新增的记录与上面的相关)。

代码如下:

public Boolean giveOther(String taskId, String userCode, String message) {
 
        // 先查任务
        Task task = activitiService.loadTaskInfo(taskId);
        if (task == null) {
            throw new BusinessException("任务不存在");
        }
 
        task.setDescription("转办");
        taskService.saveTask(task);
 
        boolean result = false;
        if (!StringUtils.isEmpty(taskId)) {
 
            // 查询最新的审批记录
            List<ActHiTaskInst> list = jt.queryForBeans(ActHiTaskInst.class, " SELECT\n" +
                    "\ta.* \n" +
                    "FROM\n" +
                    "\t`act_hi_taskinst` AS a\n" +
                    "\tLEFT JOIN act_hi_procinst AS b ON b.PROC_INST_ID_ = a.PROC_INST_ID_ \n" +
                    "\twhere b.BUSINESS_KEY_ = ?\n" +
                    "ORDER BY\n" +
                    "\ta.START_TIME_ DESC ", taskId);
            ActHiTaskInst oldHiTaskInst = list.get(0);
 
            // 复制一份最新的
            ActHiTaskInst hiTaskInst = new ActHiTaskInst();
            BeanUtils.copyProperties(oldHiTaskInst, hiTaskInst);
            hiTaskInst.setASSIGNEE_(userCode);
            //hiTaskInst.setNAME_("转办");
            hiTaskInst.setASSIGNEE_(userCode);
            hiTaskInst.setSTART_TIME_(new Date());
            actHiTaskInstRepo.save(hiTaskInst);
 
            // 更换审核人
            taskService.setAssignee(taskService.createTaskQuery().processInstanceBusinessKey(taskId).list().get(0).getId(), userCode);
 
            // 先处理原来的
            String id = UUIDUtil.getUUID();
 
            oldHiTaskInst.setEND_TIME_(new Date());
            oldHiTaskInst.setID_(id);
            actHiTaskInstRepo.save(oldHiTaskInst);
 
            // 处理备注
            // 查询最新的备注记录
            List<ActHiComment> list2 = jt.queryForBeans(ActHiComment.class, " SELECT\n" +
                    "\ta.* \n" +
                    "FROM\n" +
                    "\t`act_hi_comment` AS a\n" +
                    "\tLEFT JOIN act_hi_taskinst AS b ON a.PROC_INST_ID_ = b.PROC_INST_ID_ \n" +
                    "WHERE\n" +
                    "\ta.TASK_ID_ = ?\n" +
                    "ORDER BY\n" +
                    "\tb.START_TIME_ DESC ", hiTaskInst.getID_());
            ActHiComment oldActHiComment = list2.get(0);
 
            // 复制一份备注记录
            ActHiComment actHiComment = new ActHiComment();
            BeanUtils.copyProperties(oldActHiComment, actHiComment);
 
            actHiComment.setTASK_ID_(id);// 作为老的转办提出人的备注
            actHiComment.setMESSAGE_(message);
            actHiComment.setTYPE_("comment");
            actHiComment.setFULL_MSG_(message.getBytes(StandardCharsets.UTF_8));
            actHiCommentRepo.save(actHiComment);
 
            result = true;
        }
        return result;
    }
@Entity
@Table(name = "act_hi_taskinst")
@DynamicInsert
@DynamicUpdate
@Data
public class ActHiTaskInst {
 
    @Id
    @Column(name = "ID_")
    private String ID_;
 
    @Column(name = "PROC_DEF_ID_")
    private String PROC_DEF_ID_;
 
    @Column(name = "TASK_DEF_KEY_")
    private String TASK_DEF_KEY_;
 
    @Column(name = "PROC_INST_ID_")
    private String PROC_INST_ID_;
 
    @Column(name = "EXECUTION_ID_")
    private String EXECUTION_ID_;
 
    @Column(name = "NAME_")
    private String NAME_;
 
    @Column(name = "PARENT_TASK_ID_")
    private String PARENT_TASK_ID_;
 
    @Column(name = "DESCRIPTION_")
    private String DESCRIPTION_;
 
    @Column(name = "OWNER_")
    private String OWNER_;
 
    @Column(name = "ASSIGNEE_")
    private String ASSIGNEE_;
 
    @Column(name = "START_TIME_")
    private Date START_TIME_;
 
    @Column(name = "CLAIM_TIME_")
    private String CLAIM_TIME_;
 
    @Column(name = "END_TIME_")
    private Date END_TIME_;
 
    @Column(name = "DURATION_")
    private String DURATION_;
 
    @Column(name = "DELETE_REASON_")
    private String DELETE_REASON_;
 
    @Column(name = "PRIORITY_")
    private String PRIORITY_;
 
    @Column(name = "DUE_DATE_")
    private String DUE_DATE_;
 
    @Column(name = "FORM_KEY_")
    private String FORM_KEY_;
 
    @Column(name = "CATEGORY_")
    private String CATEGORY_;
 
    @Column(name = "TENANT_ID_")
    private String TENANT_ID_;
 
}

save方法是采用jpa的方式,可自行采用项目对应的方式使用。taskService是activiti的api。

效果如下:

欢迎大佬们交流。。

目录
相关文章
|
NoSQL Java Redis
redis: jedis连接超时(需要手动注入连接超时检测的配置)
redis: jedis连接超时(需要手动注入连接超时检测的配置)
1533 0
|
XML 数据格式
hutool工具 XML工具
hutool工具 XML工具
|
人工智能 运维 Serverless
OpenManus:开源版 Manus,无需邀请码,5 分钟极速体验!
OpenManus 是一款基于多智能体协作的开源自动化系统,能将复杂任务拆解为可执行子流程。通过多智能体机制分解任务、协调工具调用,实现代码执行、文件处理、网络搜索等复杂操作。本方案基于函数计算 FunctionAI 开发平台和阿里云百炼模型服务,提供一键部署方案,让企业无需过多运维投入即可获得灵活透明的智能任务处理能力。方案具备三大核心优势:Serverless 架构降本、实时反馈与透明化、模块化自由组合,支持快速接入多种功能模块。用户可通过简单步骤获取 API-KEY 并完成部署,体验 AI 自动化任务处理。
|
API C# Windows
LabVIEW​​共享​变量生命周期
LabVIEW​​共享​变量生命周期
311 1
|
消息中间件 关系型数据库 Kafka
实时计算 Flink版产品使用合集之想要加快消费 Kafka 数据的速度,该怎么配置参数
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
792 2
|
机器学习/深度学习 自然语言处理 数据可视化
《自然语言处理架构的隐秘力量:FFN深度揭秘》
前馈神经网络(FFN)是自然语言处理(NLP)领域中不可或缺的组件,尤其在Transformer等架构中发挥重要作用。FFN通过非线性变换和特征提取,增强模型对复杂语义的理解能力,同时平衡注意力机制输出,提升泛化性能。其基本结构包括输入层、隐藏层和输出层,工作原理涉及加权求和与激活函数处理。尽管存在训练成本高和可解释性差等问题,未来的研究可能通过稀疏连接、动态计算等方式优化FFN,推动NLP技术进一步发展。
981 3
|
XML Java 数据格式
Spring中Bean注入与获取几种方式详解
Spring中Bean注入与获取几种方式详解
1169 0
|
运维
【问题篇】activiti通过修改表手动退回流程
【问题篇】activiti通过修改表手动退回流程
788 1
|
XML Java 数据库
【二十三】springboot整合activiti7(1)实战演示篇
【二十三】springboot整合activiti7(1)实战演示篇
1618 0

热门文章

最新文章