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

news2024/11/18 11:22:00

        当处理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。

效果如下: 

欢迎大佬们交流。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1435294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【技能树学习】Git入门——练习题解析

前言 本篇文章给出了Git入门技能树中部分的练习题解析&#xff0c;包括分支管理&#xff0c;Git标签&#xff0c;在Mac和Windows上使用GitVSCode的步骤。强调了git cherry-pick不直接支持从标签中选择提交&#xff0c;git tag -d只能删除本地标签&#xff0c;Mac系统的终端可以…

【达梦数据库】使用DBeaver管理达梦数据库

使用DBeaver管理达梦数据库 Step1 安装相关程序 达梦8数据库DBeaver社区版 Step2 新建驱动 类型参数驱动名称DM8驱动类型Generic类名dm.jdbc.driver.DmDriverURL模板jdbc:dm://{host}:{port}默认端口5236默认数据库默认用户SYSDBA Step3 连接服务

ideal打包,如何访问项目根目录的libs中的jar包

参考&#xff1a;idea maven 导入lib中jar 并打包_maven引入lib中的jar包-CSDN博客 解决办法&#xff0c;只需要在pom文件中加入 <includeSystemScope>true</includeSystemScope> <build><!-- <includeSystemScope>true</includeSystemScope&g…

【DC渗透系列】DC-2靶场

arp先扫 ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:6b:ed:27, IPv4: 192.168.100.251 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.100.1 00:50:56:c0:00:08 VMware, In…

EasyExcel下载带下拉框和批注模板

EasyExcel下载带下拉框和批注模板 一、 代码实现 controller下载入口 /***下载excel模板* author youlu* date 2023/8/14 17:31* param response* param request* return void*/PostMapping("/downloadTemplate")public void downloadExcel(HttpServletResponse r…

【计算机学院寒假社会实践】——服务走进社区,共绘幸福蓝图

为深入贯彻落实志愿者服务精神&#xff0c;扎实推进志愿者服务质量&#xff0c;2024年1月28日&#xff0c;曲阜师范大学计算机学院“青年扎根基层&#xff0c;服务走进社区”社会实践队队员周兴睿在孙宇老师的指导下&#xff0c;来到山东省滨州市陈集街道社区开展了为期一天的“…

SaperaCamExpert(相机专家)中文使用指南

参考&#xff1a;SaperaCamExpert中文使用指南.PDF 文章目录 软件介绍安装首次打开资源占用率功能主界面布局菜单栏FileViewPre-Processing&#xff1a;预处理 Tools&#xff1a; 快捷键&#xff1a;新建&#xff1b;打开&#xff1b;保存&#xff1b;帮助Device窗体属性树图像…

GPTs保姆级教程之实践

GPTs什么 使用GPTs的前提&#xff1a;ChatGPT Plus帐号 GTPs的作用&#xff1a;把我们和GPT对话的prompt&#xff0c;封装起来成为一个“黑匣子”。 主要有两个作用&#xff1a; 1、避免反复输入prompt&#xff0c;“黑匣子”打开&#xff0c;输入问题即可使用 2、在别人可以…

docker安装etherpad文档系统

效果 安装 1.创建并进入目录 mkdir -p /opt/etherpad cd /opt/etherpad 2.修改目录权限 chmod -R 777 /opt/etherpad 3.创建并启动容器 docker run -d --name etherpad --restart always -p 10054:9001 -v /opt/etherpad/data:/opt/etherpad-lite/var etherpad/etherpad:la…

docker安装zpan

安装 1.创建数据库 docker run -di --namezpan_mysql -p 3309:3306 -e MYSQL_ROOT_PASSWORD123456 mysql 2.手动新建数据库zpan 3.创建目录 mkdir -p /opt/zpan cd /opt/zpan 4.编写配置文件 vim config.yml #详细配置文档可参考&#xff1a; https://zpan.space/#/zh…

Linux 网络:PTP 简介

文章目录 1. 前言2. PTP(Precision Time Protocol​) IEEE 1588 协议简介2.1 PTP IEEE 1588 协议时间同步原理2.2 PTP IEEE 1588 协议时钟类型2.2.1 普通时钟(OC: Ordinary Clock)2.2.2 边界时钟(BC: Boundary Clock)2.2.3 透明时钟(TC: Transparent Clock)2.2.3.1 端对端透明时…

Redis 命令大全

文章目录 启动与连接Key&#xff08;键&#xff09;相关命令String&#xff08;字符串&#xff09;Hash&#xff08;哈希&#xff09;List&#xff08;列表&#xff09;Set&#xff08;集合&#xff09;Sorted Set&#xff08;有序集合&#xff09;其他常见命令HyperLogLog&…

FPGA解码MIPI视频:Xilinx Artix7-35T低端FPGA,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的 MIPI 编解码方案本方案在Xilinx Artix7-100T上解码MIPI视频的应用本方案在Xilinx Kintex7上解码MIPI视频的应用本方案在Xilinx Zynq7000上解码MIPI视频的应用本方案在Xilinx Zynq UltraScale上解码MIPI视频的应用纯VHDL代码解…

docker-学习-5

docker-学习第五天 docker-学习第五天1. 昨天的练习回顾1.1. 练习11.2. 练习2 2. 命令2.1. 看镜像的详细信息 3. Dockerfile指令3.1. 常见的指令3.2. ENTRYPOINT和CMD的区别3.3. RUN中的set指令 4. 镜像的原理4.1. 为什么 Docker 镜像要采用这种分层结构呢&#xff1f;4.2. doc…

无人机集群协同导航构型自适应选择算法

无人机集群协同导航构型自适应选择算法 Evandworld E-mail&#xff1a;evandworldfoxmail.com 摘要 针对卫星定位系统用于无人机集群时成本高、精度低等问题&#xff0c;本文提出一种基于卡尔曼滤波和概率的无人机集群构型自适应选择算法。在自适应扩展卡尔曼滤波的基础上&a…

忘记 RAG:拥抱Agent设计,让 ChatGPT 更智能更贴近实际

RAG&#xff08;检索增强生成&#xff09;设计模式通常用于开发特定数据领域的基于实际情况的ChatGPT。 然而&#xff0c;重点主要是改进检索工具的效率&#xff0c;如嵌入式搜索、混合搜索和微调嵌入&#xff0c;而不是智能搜索。 这篇文章介绍了一种新的方法&#xff0c;灵感…

Windows11安装运行Linux(Ubuntu)

一、安装windows支持 输入windows打开界面 选择虚拟机监控程序平台、适用于linux的子系统、虚拟机平台 在 Windows 系统中&#xff0c;"虚拟机平台"和"虚拟机监控程序平台"是两个与虚拟化相关的功能&#xff0c;但它们各自有着不同的作用和用途。 虚拟机…

如何使用VSCode上运行Jupyter,详细案例过程出可视化图

Python作为最受AI喜欢的语言之一&#xff0c;我们与大家共同学习下如何在VS Code上运行Jupyter&#xff0c;并且用简单案例实现出图。 环境 VS Code version: 1.80.1 Python: 3.12.0 小白安装过程&#xff1a; 在准备好基础环境&#xff0c;小白心想&#xff0c;AI可是霸占科…

42、WEB攻防——通用漏洞文件包含LFIRFI伪协议编码算法代码审计

文章目录 文件包含文件包含原理攻击思路文件包含分类 sessionPHP伪协议进行文件包含 文件包含 文件包含原理 文件包含其实就是引用&#xff0c;相当于C语言中的include <stdio.h>。文件包含漏洞常出现于php脚本中&#xff0c;当include($file)中的$file变量用户可控&am…

University Program VWF仿真步骤__全加器

本教程将以全加器为例&#xff0c;选择DE2-115开发板的Cyclone IV EP4CE115F29C7 FPGA&#xff0c;使用Quartus Lite v18.1&#xff0c;循序渐进的介绍如何创建Quartus工程&#xff0c;并使用Quartus Prime软件的University Program VWF工具创建波形文件&#xff0c;对全加器的…