使用流程管理记录任务完成日和负责人

aki发表于:2016年10月05日 12:44:35更新于:2019年02月02日 17:09:45

Index

概 要

本范例介绍当故障处理应用的流程状态变为【完成】时,系统自动记录任务完成日及负责人(登录用户)的自定义方法。另外,还加入以下功能。

  • 添加记录时自动生成编号

  • 任务完成日字段和负责人字段设为不可编辑

  • 重复利用记录时,自动清除任务完成日和负责人字段中的数据

完成图

 00157f48976227e459076543a7f3a53

事前准备

  • 创建【故障处理管理】应用。
    表单设置详情如下:

    字段名称

    字段类型

    字段代码

    受理编号

    单行文本框

    受理编号

    类型

    单选框

    类型

    任务期限

    日期

    任务期限

    开始执行

    创建时间

    开始执行

    任务完成时间

    日期与时间

    任务完成时间

    负责人

    选择用户

    负责人

    所用时间

    计算

    所用时间

    ※其他字段任意设置。
    ※所用时间的计算公式为:任务完成时间-开始执行
    00157f48cd4a918661335fa46614986

  • 流程管理的设置
    状态有:未处理、受理、调查中、执行中、完成、保留
    具体流程设置如下:
    00157f48d62cb067f63827457c6412c

  • 编辑器
    选择符合自己使用习惯的文本编辑器。

程序范例

注意事项

  • 直接使用此处提供的程序范例的情况,才望子不予以保证程序的正常运行

  • 才望子不提供对程序范例的技术支持

  • 有些地方使用XMLHttpRequest 进行同步处理。处理过程中,浏览器可能会卡住。另外,部分浏览器无法使用XMLHttpRequest ,请注意!

PC专用的JavaScript文件

在应用设置页面打开【通过JavaScript / CSS自定义】,从Cybozu CDN 中选择以下库。

  • Mement.js
    https://js.cybozu.com/momentjs/2.8.4/moment-with-locales.min.js (使用version 2.8.4 )

JavaScript 范例

  • 将以下代码拷贝到编辑器,文件命名为【sample.js】,文字编码设为【UTF-8】、无BOM,保存
    ※文件名任意,但是文件的扩展名要指定为【js】

  • 在【通过JavaScript / CSS自定义】页面中上传保存的文件


    /*
     * 故障处理管理应用的程序范例
     * Copyright (c) 2014 Cybozu
     *
     * Licensed under the MIT License
     */
    (function() {
        "use strict";
        // 记录创建/编辑页面显示时
        var eventsCreateShow = ['app.record.create.show', 'app.record.index.create.show',
                                'app.record.edit.show', 'app.record.index.edit.show'];
        kintone.events.on(eventsCreateShow, function(event) {
            var record = event.record;
            // 设置字段不可编辑
            record['受理编号']['disabled'] = true;
            record['任务完成时间']['disabled'] = true;
            record['负责人']['disabled'] = true;
            switch (event.type) {
                case 'app.record.create.show':
                case 'app.record.index.create.show':
                    record['受理编号']['value'] = "";
                    // 指定从今日起2天后
                    record['任务期限']['value'] = moment().add("days", 2).format("YYYY-MM-DD");
                    record['任务完成时间']['value'] = null;
                    record['负责人']['value'] = [];
                    break;
                default:
                    break;
            }
            return event;
        });
        // 记录添加页面保存时
        var eventsSubmit = ['app.record.create.submit', 'app.record.edit.submit',
                            'app.record.index.edit.submit'];
        kintone.events.on(eventsSubmit, function(event) {
            var record = event.record;
            // 【受理编号】中自动生成【CD-YYMM-XXXX】格式的编号
            if (!record['受理编号']['value']) {
                var recId = 1;
                // 获取记录编号的最大值
                var appId = kintone.app.getId();
                // 设置URL
                var appUrl = kintone.api.url(
                    '/k/v1/records', true) + '?app=' + appId + '&query=' + encodeURI('order by 记录编号 desc limit 1'
                    );
                var xmlHttp;
                // 为了使用记录编号的最大值,需要同步处理
                xmlHttp = new XMLHttpRequest();
                xmlHttp.open("GET", appUrl, false);
                xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
                xmlHttp.send(null);
                if (xmlHttp.status === 200) {
                    if (window.JSON) {
                        var obj = JSON.parse(xmlHttp.responseText);
                        if (obj.records[0] !== null) {
                            try {
                                recId = parseInt(obj.records[0]['$id']['value'], 10) + 1;
                            } catch(e) {
                                event.error = '无法获取受理编号。';
                            }
                        }
                        //设置自动生成编号
                        var r4 = zeroformat(recId, 4);
                        var m = moment();
                        var shipmentNo = "CD" + m.format("YY") + m.format("MM") + "-" + r4;
                        record['受理编号']['value'] = shipmentNo;
                    } else {
                        event.error = xmlHttp.statusText;
                    }
                } else {
                    record.error = '无法获取受理编号。';
                }
            }
            return event;
        });
        // 流程管理的动作执行时
        kintone.events.on(["app.record.detail.process.proceed"], function(event) {
            var record = event.record;
            var nStatus = event.nextStatus.value;
            // 状态为【完成】时,自动设置任务完成日和负责人
            switch (nStatus) {
                case "完成":
                    var user = kintone.getLoginUser();
                    record['任务完成时间']['value'] = moment().format("YYYY-MM-DDTHH:mmZ");
                    record['负责人']['value'][0] = {code: user.code};
                    break;
            }
            return event;
        });
        // 统一位数的函数
        function zeroformat(v, n) {
            var vl = String(v).length;
            if (n > vl) {
                return (new Array((n - vl) + 1).join(0)) + v;
            } else {
                return v;
            }
        }
    })();


设置的页面

以下是【通过JavaScript / CSS自定义】页面的设置范例。
00157f48f72efbff743f157a0945db0

使用的API

  1. 添加事件句柄

  2. 记录添加页面显示时的事件

  3. 记录编辑页面显示时的事件

  4. 记录添加页面在执行保存之前的事件

  5. 记录编辑页面在执行保存之前的事件

  6. 在记录列表页面点击【保存】按钮时的事件

  7. 获取URL(无查询字符串)

  8. 流程管理的动作执行事件


    注意:贴代码时请注意格式并使用"代码语言",与本文无关的问题请至“讨论社区”提问。
    您需要登录后才可以回复