流程管理和审批流程协同工作! 在应用之间协调流程管理

betsy_yan发表于:2022年03月02日 14:15:02更新于:2023年09月13日 14:26:47

Index

前言

在使用 kintone 流程管理时,有没有遇到过这样的问题,就是“在确认XX应用(※“XX”是其他应用的名称)申请后提交审批”?

 (举例)在营业部内部确认了出差申请获得批准后,希望在会计部批准差旅费申请。

在这种情况下,审批人不得不费心去寻找另一个申请的申请记录,或者申请人每次都要告诉另一个申请记录的URL,这太麻烦了。

今天就给大家介绍这篇自定义文章:当一个应用的流程完成时,另一个应用的状态会自动更新!

※ 如果在 IE 中使用,需要用到 Webpack 和 Polyfill,参考 webpack入门 ~Babel,Polyfill为你带来美好的ES6体验~

申请流程图

本次将使用在“相同内容可一键申请!一次管理多个应用的流程”中创建的应用,运用流程管理的设置来实现自定义!

应用A用于父流程应用,应用B用于子流程应用。

实现自定义流程管理的流程如下:

  1. 申请者在应用A中创建一条记录,并执行流程

  2. 根据在应用A中输入的内容,在应用B中自动创建记录,并执行流程
    ※应用B的申请获得批准之前,应用A中的记录无法执行下一步流程

  3. 应用B的审批人批准记录内容

  4. 应用A记录中的“应用B审批完成标志”自动变成“完成”就执行下一步流程

  5. 应用A的审批人批准记录内容
    (此次,通过新自定义实现的范围将是2的※部分和4的处理。)

flow_image.png

在以下描述中,我将重点介绍上一篇文章中设置的应用状态更改的内容。

事前准备

应用的准备

在应用A和应用B中添加以下字段。

应用A

字段名称字段代码字段类型项目
应用B的审批完成标志应用B的审批完成标志复选框完成

应用B

字段名称字段代码字段类型
应用A的记录ID应用A的记录ID单行文本框

流程管理的设置

在应用 A 和应用 B 中将流程管理设置更改为:

应用A:流程管理的设置

processA.png

  1. “2. 状态”的设置

    1. 状态“处理中”更改为“处理中(应用B未审批)”。

    2. 添加“处理中(应用B审批完成)”。

  2. “3. 流程”的设置

    1. 将执行未处理后的状态设置为“处理中(应用B未审批)”。

    2. 在“未处理”的下一行添加一个流程,并将执行操作之前的状态设置为“处理中(应用B未审批)”。

    3. 将状态“处理中(应用B未审批)”中可执行动作的条件设置为“应用B的审批完成标志:包括以下任意一个:完成”。

    4. 将状态“处理中(应用B未审批)”中的动作名称设置为“向最终审批人申请”。

    5. 状态“处理中(应用B未审批)”执行后的状态是“处理中(应用B审批完成)”。

    6. 将状态“处理中(应用B审批完成)”的执行者选择为“以下用户中其中1人”,并设置任意用户。

应用B:流程管理的设置

processB.png

将状态“处理中”的执行者选择为“以下用户中其中1人”,并设置任意用户。

JavaScript 自定义

准备好后,我们将添加 JavaScript 自定义。

首先,将以下的 JavaScript 运用于应用A。 将第20行更改为应用B的应用ID。

(例如应用B的应用ID是2)

更改前:const appId = 'xxx';

更改后:const appId = '2';

/*
* 程序范例,在流程中自动为另一个应用添加记录并推进状态
* Copyright (c) 2021 Cybozu
*
* Licensed under the MIT License
* https://opensource.org/licenses/mit-license.php
*/
(() => {
    'use strict';
    // 防止在页面上编辑应用B的审批完成标志
    kintone.events.on(['app.record.create.show', 'app.record.edit.show', 'app.record.index.edit.show'], event => {
        event.record['应用B的审批完成标志'].disabled = true;
        return event;
    });
    kintone.events.on('app.record.detail.process.proceed', event => {
        const action = event.action.value;
        const appId = 'xxx'; // 请替换为应用B的应用ID
        const record = event.record;
        const paramRecordPost = {
            app: appId,
            record: {
                申请标题B: {
                    value: record['申请标题A'].value
                },
                申请内容B: {
                    value: record['申请内容A'].value
                },
                应用A的记录ID: {
                    value: record.$id.value
                }
            }
        };
        if (action !== '开始处理') {
            return event;
        }
        return kintone.api(kintone.api.url('/k/v1/record.json', true), 'POST', paramRecordPost).then(resp => {
            const recordId = resp.id;
            const paramStatusPut = {
                action: action,
                app: appId,
                id: recordId
            };
            return kintone.api(kintone.api.url('/k/v1/record/status.json', true), 'PUT', paramStatusPut);
        }).then(() => {
            alert('创建应用B的记录,并执行流程。');
            return event;
        }).catch(err => {
            console.log(err);
            return event;
        });
    });
})();

将以下的 JavaScript 运用于应用B。 将第14行更改为应用A的应用ID。

(例如应用A的应用ID是1)

更改前:const appId = 'xxx';

更改后:const appId = '1';

/*
 * 程序范例,用于更新另一个相关应用的记录并随着流程的进行而推进状态
 * Copyright (c) 2021 Cybozu
 *
 * Licensed under the MIT License
 * https://opensource.org/licenses/mit-license.php
*/

(() => {
    'use strict';

    kintone.events.on('app.record.detail.process.proceed', event => {
        const actionB = event.action.value;
        const appId = 'xxx'; // 请替换为应用A的应用ID
        const recordId = event.record['应用A的记录ID'].value;
        const paramsRecordPut = {
            app: appId,
            id: recordId,
            record: {
                应用B的审批完成标志: {
                    value: ['完成']
                }
            }
        };

        if (actionB !== '完成') {
            return event;
        }

        return kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', paramsRecordPut).then(resp => {
            const actionA = '向最终审批人申请';
            const paramStatusPut = {
                action: actionA,
                app: appId,
                id: recordId
            };
            return kintone.api(kintone.api.url('/k/v1/record/status.json', true), 'PUT', paramStatusPut);
        }).then(() => {
            alert('执行应用A的记录流程。');
            return event;
        }).catch(err => {
            console.log(err);
            return event;
        });
    });
})();

操作检查

应用自定义后,我们来检验一下。

在应用A中创建一条记录,单击“开始处理”并选择“确定”执行该流程。

当应用B的记录创建和流程进展成功时,显示“创建应用B的记录,并执行流程。”

至此,操作显示和“相同内容可一键申请!一次管理多个应用的流程”相同。

check1.png

此外,在应用 A 中创建的"应用 B 的审批完成标志"通过自定义在添加、编辑页面或记录列表页面无法进行更改。

check2.png

然后以流程执行者的用户身份打开应用B,并查看自定义创建的记录。

确保流程管理状态为“处理中”,申请标题和申请内容就是之前填写在应用A中的内容,然后执行“完成”操作

若弹出窗口“执行应用A的记录流程。”,则证明自定义已完成!

check3.png

打开应用A的记录时,流程状态将转到“处理中(应用B审批完成)”,并且“应用B的审批完成标志”将确认为“完成”

check4.png

最后,当负责审批的用户执行“完成”操作,申请流程就完成了!

结束语

怎么样?通过使用「流程管理的动作执行事件」和「更新记录状态的API」就可以与其他应用整合流程管理

那么如果下次遇到标准功能无法实现的申请流程,希望大家可以想一想“是否可以通过自定义来实现呢?”!

注意事项

  • 程序范例不保证其能正常运行。

  • 才望子不为程序范例提供技术支持。

  • 本自定义仅适用于 PC 端。

  • 本自定义未兼容 Internet Explorer。

该Tips在2021年8月版 kintone 中进行过确认。