Index
前言
在使用 kintone 流程管理时,有没有遇到过这样的问题,就是“在确认XX应用(※“XX”是其他应用的名称)申请后提交审批”?
(举例)在营业部内部确认了出差申请获得批准后,希望在会计部批准差旅费申请。
在这种情况下,审批人不得不费心去寻找另一个申请的申请记录,或者申请人每次都要告诉另一个申请记录的URL,这太麻烦了。
今天就给大家介绍这篇自定义文章:当一个应用的流程完成时,另一个应用的状态会自动更新!
※ 如果在 IE 中使用,需要用到 Webpack 和 Polyfill,参考 webpack入门 ~Babel,Polyfill为你带来美好的ES6体验~。
申请流程图
本次将使用在“相同内容可一键申请!一次管理多个应用的流程”中创建的应用,运用流程管理的设置来实现自定义!
应用A用于父流程应用,应用B用于子流程应用。
实现自定义流程管理的流程如下:
申请者在应用A中创建一条记录,并执行流程
根据在应用A中输入的内容,在应用B中自动创建记录,并执行流程
※应用B的申请获得批准之前,应用A中的记录无法执行下一步流程应用B的审批人批准记录内容
应用A记录中的“应用B审批完成标志”自动变成“完成”就执行下一步流程
应用A的审批人批准记录内容
(此次,通过新自定义实现的范围将是2的※部分和4的处理。)
在以下描述中,我将重点介绍上一篇文章中设置的应用状态更改的内容。
事前准备
应用的准备
在应用A和应用B中添加以下字段。
应用A
字段名称 | 字段代码 | 字段类型 | 项目 |
应用B的审批完成标志 | 应用B的审批完成标志 | 复选框 | 完成 |
应用B
字段名称 | 字段代码 | 字段类型 |
应用A的记录ID | 应用A的记录ID | 单行文本框 |
流程管理的设置
在应用 A 和应用 B 中将流程管理设置更改为:
应用A:流程管理的设置
“2. 状态”的设置
状态“处理中”更改为“处理中(应用B未审批)”。
添加“处理中(应用B审批完成)”。
“3. 流程”的设置
将执行未处理后的状态设置为“处理中(应用B未审批)”。
在“未处理”的下一行添加一个流程,并将执行操作之前的状态设置为“处理中(应用B未审批)”。
将状态“处理中(应用B未审批)”中可执行动作的条件设置为“应用B的审批完成标志:包括以下任意一个:完成”。
将状态“处理中(应用B未审批)”中的动作名称设置为“向最终审批人申请”。
状态“处理中(应用B未审批)”执行后的状态是“处理中(应用B审批完成)”。
将状态“处理中(应用B审批完成)”的执行者选择为“以下用户中其中1人”,并设置任意用户。
应用B:流程管理的设置
将状态“处理中”的执行者选择为“以下用户中其中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的记录,并执行流程。”
至此,操作显示和“相同内容可一键申请!一次管理多个应用的流程”相同。
此外,在应用 A 中创建的"应用 B 的审批完成标志"通过自定义在添加、编辑页面或记录列表页面无法进行更改。
然后以流程执行者的用户身份打开应用B,并查看自定义创建的记录。
确保流程管理状态为“处理中”,申请标题和申请内容就是之前填写在应用A中的内容,然后执行“完成”操作。
若弹出窗口“执行应用A的记录流程。”,则证明自定义已完成!
打开应用A的记录时,流程状态将转到“处理中(应用B审批完成)”,并且“应用B的审批完成标志”将确认为“完成”。
最后,当负责审批的用户执行“完成”操作,申请流程就完成了!
结束语
怎么样?通过使用「流程管理的动作执行事件」和「更新记录状态的API」就可以与其他应用整合流程管理。
那么如果下次遇到标准功能无法实现的申请流程,希望大家可以想一想“是否可以通过自定义来实现呢?”!
注意事项
程序范例不保证其能正常运行。
才望子不为程序范例提供技术支持。
本自定义仅适用于 PC 端。
本自定义未兼容 Internet Explorer。
该Tips在2021年8月版 kintone 中进行过确认。