1、 ICS 35.240 CCS L77 3502/T 福建省厦门市 地方 标准 DB3502/T 056.4 2020 政务信息共享协同平台 第 4 部分:二次开发 The sharing and collaborative platform of government information Part 4: Secondary development 2020 - 12 - 31 发布 2021 - 01 - 01 实施 厦门市市场监督管理局 发 布 DB3502/T 056.4 2020 I 目 次 前言 . II 引言 . III 1 范围 . 1 2 规范性引用文件 . 1 3 术语和
2、定义 . 1 4 缩略语 . 2 5 业务流程开发 . 2 流程脚本 . 2 数据空间 . 11 6 功能插件开发 . 13 支持语言 . 13 Java插件开发 . 13 Python 插件开发 . 14 附录 A(资料性) 业务流程脚本与数据空间示 例 . 15 A.1 流程脚本代码示例 . 15 A.2 数据空间代码示例 . 28 附录 B(资料性) Java插件代码示例 . 40 B.1 说明 . 40 B.2 Java插件源代码 . 40 B.3 平台流程调用 . 40 附录 C(资料性) Python插件代码示例 . 41 C.1 说明 . 41 C.2 Python插件源代码 .
3、 41 C.3 平台流程调用 . 42 参考文献 . 43 DB3502/T 056.4 2020 II 前 言 本文件按照 GB/T 1.1 2020标准化工作导则 第 1部分:标准化文件的结构和起草规则的规定 起草。 本 文件 为 DB3502/T 056政务信息共享协同平台的第 4部分。 DB3502/T 056已发布了以下部分: 第 1部分: 总体设计 ; 第 2部分:资源管理; 第 3部分:接入 要求 ; 第 4部分:二次开发。 本文件是在 DB3502/Z 033.4 2016政务信息共享协同平台技术规范 第 4部分:平台二次开发的 基础上,根据技术和需求变化,重新立项并制定的。与
4、 DB3502/Z 033.4 2016相比,除结构性调整和编 辑性改动外,主要技术变化如下: a) 更新所支持开发语言版本(见 6.2.1.3、 6.3.1.3, DB3502/Z 033.4 2016的 6.1.1.3、 6.2.1.3); b) 更新二次开发示例代码(见附录 B、附录 C, DB3502/Z 033.4 2016附录 A、附录 B、附录 C)。 请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别专利的责任。 本文件由厦门市工业和信息化局提出。 本文件由厦门市工业和信息化局归口。 本文件起草单位: 厦门市信息中心、厦门畅享信息技术有限公司、厦门市标准化研究院。
5、本文件主要起草人:吕志仁、赖炜炜、巫晓强、杨远军、朱永上、彭明剑、 郭劲军、郭望、傅楚隆、 揭英杰、吴宸勖、陈尚峰、卢淼先、闫焕友、张金梅、刘姗姗、李童、蔡跃华。 DB3502/T 056.4 2020 III 引 言 DB3502/T 056政务信息共享协同平台旨在确立政务信息共享协同平台总体设计、资源管理、接 入要求、二次开发的技术标准,拟由四个部分构成。 第 1部分:总体设计。目的在于确立平台关键技术路线和软件系统的组织形式,确保平台总 体架构满足国家对政务信息交换与共享的要求,明确平台内主要功能模块和模块间的逻辑关 系,避免“过度建设”并确保“必要建设”。 第 2部分:资源管理。目的在
6、于规范平台所支持的多种资源类型、协议标准、提供方式,为 平台对外服务的兼容性提供保障;明确平台不同类型资源的属性,统一属性分类,为平台对 外服务的通用性提供保障;针对资源生产、资源注册、资源测试、资源申请、资源调用、资 源目录、资源检索、资源版本、资源安全等操作提出全生命周期管理要求,为平 台对外服务 的可用性提供保障。 第 3部分:接入要求。目的在于将平台对外接口标准化,明确接口在安全性、完备性、一致 性、易用性、稳定性方面要求,进一步提升平台对外提供服务的能力和质量,并从网络接 入、平台资源生产方、平台资源消费方、区级平台接入等方面,明确接入的实现方式,为保 障平台建设质量及拓展平台应用范
7、围提供技术支撑。 第 4部分:二次开发。目的在于规范平台提供二次开发的工作方式、对扩展模块管理方式, 为后续平台业务流程及插件的完善提供统一标准,既避免了平台直接耦合上层各类业务,又 允许不同部门结合特定业务需要,在授权范围内扩展平台功能。 DB3502/T 056.4 2020 1 政务信息共享协同平台 第 4 部分:二次开发 1 范围 本文件规定了政务信息共享协同平台的业务流程开发和功能插件开发。 本文件适用于政务信息共享协同平台功能扩展,软件开发人员基于本平台 进行 新功能 的扩展 开发 时参照使用 。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款。
8、其中,注日期的引用文件, 仅该日期对应的版本适用于本文件;不注日期的引用文件,其最新版本(包括所有的修改单)适用于本 文件。 DB3502/T 056.1 2020 政务信息共享协同平台 第 1部分: 总体设计 DB3502/T 056.2 2020 政务信息共享协同平台 第 2部分: 资源管理 DB3502/T 056.3 2020 政务信息共享协同平台 第 3部分: 接入 要求 3 术语和定义 DB3502/T 056.1 2020、 DB3502/T 056.2 2020、 DB3502/T 056.3 2020界定的以及下列术语和定 义适用于本文件。 变量 variable 由 一个标
9、识符、一组数据属性、一个或多个地址和各数据值( 地址 与数据值 间 的联系可变) 组成, 通过声明或隐式声明建立的四元组。 注: 在某些 编程语言中,地址可变,因而所结合的数据值可变,在其他编程语言中 , 地址固定不变, 但所结合 的数 据值在执行期间可以改变。 来源: GB/T 5271.15 2008,定义 15.03.03 局部 local 修饰或说明某一语言构造:所具有的作用域仅在对其声明的声明区域内。 来源: GB/T 5271.15 2008, 定义 15.02.11 全局 global 修饰或说明某一语言构造:处于所在程序中所有模块的作用域内。 来源: GB/T 5271.15
10、2008,定义 15.02.12 数组 array DB3502/T 056.4 2020 2 一种作为某一数组型的一个数据实例,其中各元素或适当的元素组都可以随机而独立的加以引用 的聚合。 来源: GB/T 5271.15 2008,定义 15.03.08 数据结构 data structure 数据单元间的物理联系或逻辑联系和数据本身。 来源: GB/T 5271.15 2008,定义 15.03.01 同步 synchronous 用来修饰两个或两个以上的过程,他们取决于特定事件(如公用定时信号)的发生。 来源: GB/T 5271.1 2000,定义 01.01.28 异步 async
11、hronous 用来修饰两个或两个以上的过程,他们不取决于特定事件(如公用定时信号)的发生。 来源: GB/T 5271.1 2000,定义 01.01.29 并发 concurrency 并发是指两个或多个线程(程序)在同一时间间隔内发生。并发性是指在一段时间内宏观上有多个 程序在同时运行。 4 缩略语 下列缩略语适用于本文件。 BPEL:业务流程执行语言( Business Process Execution Language) ID:唯一编码( Identity Document) WSDL: Web服务器描述语言( Web Service Description Language) X
12、ML:扩展性标识语言( eXtensible Markup Language) XSD:文档结构描述( XML Schema Definition) 5 业务流程开发 流程脚本 5.1.1 总则 5.1.1.1 流程结构 流程应支持以下流程结构:空语句、条件分支流 程、循环流程、并发流程、流程中断。 5.1.1.2 应用调用方式 流程应支持以下应用调用方式:同步调用应用、异步调用应用。 5.1.1.3 流程脚本 示例代码 流程脚本示例代码见附录 A。 DB3502/T 056.4 2020 3 5.1.1.4 流程脚本 XSD 描述 流程脚本的 XSD描述见图 1。 图 1 流程总结构 5.1
13、.1.5 流程固有属性 流程固有属性应包含“ INFORMATION”、“ GLOBAL_DATA”和“ REQUESTER”: a) INFORMATION 节点:描述流程名称、流程备注、流程版本、流程作者等信息; DB3502/T 056.4 2020 4 b) GLOBAL_DATA节点:定义流程的入参和返回结果,同时包含帐户设计器自动列出的本流程使用 的全局变量; c) REQUESTER节点:用于在流程每次运行时,自动采集本次请求方的信息。 5.1.2 流程信息 /INFORMATION 节点 流程信息 /INFORMATION节点结构见 图 2, 包括 : a) flow_id:流
14、程在管理平台上注册所获得的全局唯一 ID; b) flow_name:流程可读名称; c) version:流程当前版本号,通常为一数值; d) author:流程作者,可选; e) DESCRIPTION:流程说明,可选; f) FLOWTIME:流程超时。流程将在运行时长超出该数值后,自动退出。格式为一整数,单位为秒; 或者使用 d表示天数、 h表示小时数, m表示分钟数,如: 2d3h,表示超时时长为两天又三小 时。 图 2 流程信息 /INFOMATION 节点结构 5.1.3 流程全局数据 /GLOBALDATA 节点 流程全局数据 /GLOBAL_DATA节点结构见 图 3,包含流
15、程入参列表、出参列表、和全局变量列表: a) 流程入参列表应包含 0到多个入参,值均为 字符串,对应数据空间中的具体变量名; b) 流程出参列表应包含 0到多个出参,值均为字符串,对应数据空间中具体的变量名; c) 全局变量列表由设计器自动生成,开发人员通常无须关注。 图 3 流程全局数据 /GLOBAL_DATA 节点结构 DB3502/T 056.4 2020 5 5.1.4 流程请求方 /REQUESTER 节点 流程请求方 /REQUESTER节点结构见 图 4。流程在运行期自动采集到的请求方信息,包括 “ requester_id/请求方 ID”和“ requester_name/请
16、求方名称”。前者用以在识别同时一刻发起请求的 不同请求方。 图 4 流程请求方 /REQUESTER 节点结构 5.1.5 活动节点 /ACTIVITY 节点 活动节点 /ACTIVITY节点结构 见图 5。 ACTIVITY是流程的语句,每一个 ACTIVITY节点代表发起一次对 功能活动的调用。可调用的功能活动包括外部平台服务资源、流程引擎自带的内核函数、或插件服务, 统称为“活动”。 ACTIVITY内部包含三个子语句: a) INIT:语句集,代表在调用当前活动之前执行的语句; b) INVOKE:含 PARAMETER和 RESULT两个子语句: 1) PARAMETER为本次活动所
17、需入参, 包括 直接入参和表达式入参,其 中 , 直接入参指特定变 量,表达式指需进行计算后以求出入参值,比如 1 + 2; 2) RESULT 为本次活动出参; c) FINI:语句集,代表在调用当前活动之后执行的语句。 图 5 活动 /ACTIVITY 节点结构 DB3502/T 056.4 2020 6 5.1.6 异步活动 /ASYNACTIVITY 节点 异步活动 /ASYNACTIVITY节点结构 见图 6。该结构与 ACTIVITY相同,但在调用上为异步调用,即无需 等待活动返回结果,流程应继续向前执行,直到流程后续通过 BRANCHEWAIT节点主动等待之前发起的异 步操作结果
18、。 图 6 异步活动 /ASYNACTIVITY 节点结构 图 7 ASYNACTIVITY 属性中的 asyn_seed 等信息 DB3502/T 056.4 2020 7 流程可在等待之前多次发起异步操作,为方便在等待时识别具体哪一次的异步调用,应在调用 ASYNACTIVITY之前,通过 ASYNSEED语句获得全局唯一的“异步种”数据,填写在 ASYNACTIVITY节点的 attributes(属性)中, 见 图 7。其中: a) asyn_seed_id为异步种子数据,每一个 ASYNACTIVITY语句都拥有不同的该值; b) asyn_invoke_id 为系统自动产生的异步调
19、用种子数据,即使同一异步调用语句,多次调用也 会产生不同的该值。 5.1.7 异步活动种子 /ASNSEED 节点 异步活动种子 /ASYNSEED节点结构见 图 8。该节点用于产生异步调用所需的异步种,包括获得 “ asyn_seed_id/异步种 ID”及本次异步的超时、后台检查时间时隔等配置。 图 8 异步活动种子 /ASYNSEED 节点结构 5.1.8 并发等待 /BRANCHWAIT 节点 并发等待 /BRANCHWAIT节点结构见 图 9。 BRANCHWAIT语句既用于等待并发,也用于等多个 (次)异步 执行的结果。应在属性中填写所需要等待的异步种。 图 9 并发等待 /BRA
20、NCHWAIT 节点结构 BRANCHWAIT包含三个子语句,三者均为语句集: DB3502/T 056.4 2020 8 a) CONVERGE:在有新的异步或并行运行结果到来时,触发调用,以执行其内部语句 ,通常流程在 此实现多次异步运行结果或多个并发分支的数据合并。系统应保障每一时刻,仅会有一次并发 或异步运行流程进入该合并节点; b) INTERRUP:由后台线程周期性执行; c) TIMEOUE:在指定异步种所对应的并发或异步操作超时后触发。 5.1.9 并发 /CONCURRENCE 节点 并发 /CONCURRENCE节点结构见图 10。 CONCURRENCE应满足 以下条件:
21、 a) 包含零或多个分支子语句 BRANCH,和一个 BRANCHWAIT语句,后者用以等待前 面所有分支持的 运行结束; b) 包含 INIT和 FINI 语句,分别在所有并发开始之前,和 BRANCHWAIT 结束之后执行。 图 10 并发 /CONCURRENCE 节点结构 5.1.10 结束并发等待 /ENDWAIT 节点 结束并发等待 /ENDWAIT节点结构见 图 11。 该节点 用于在 BRANCHWAIT中,中途放弃等待,直接运行 BRANCHWAIT之后的语句。 图 11 结束并发等待 /ENDWAIT 节点结构 5.1.11 条件分支 /IF 节点 DB3502/T 056
22、.4 2020 9 条件分支 /IF节点结构见 图 12。 IF节点包含一个 CONDITION节点和一个 ELSE节点,以及其它语句子集。 CONDITION本身也是语句子集,并带有“ conclusion”属性。 CONDITIONS内部语句执行过程用以确定该 属性的值为 TRUE或 FALSE。如果为 TRUE,则运行其后除 ELSE之后的所有子语句,否则直接运行 ELSE语句。 图 12 条件分支 /IF 节点结构 5.1.12 条件未命中 /ELSE 节点 条件未命中 /ELSE节点结构见 图 13。该节点不作为流程的一级节点出现,仅作为 IF语句的子节点, 在 IF语句中条件为假时
23、执行其内部的子语句。图 13。 图 13 条件未命中 /ELSE 节点结构 5.1.13 空语句 /PASS 节点 空语句,仅作为占位符,不执行任何操作,见图 14。 图 14 空语句 /PASS 节点结构 DB3502/T 056.4 2020 10 5.1.14 多分支 /SWITCH 节点 多分支 /SWITCH节点结构 见图 15。 SWITCH语句提供多分支支持。每个分支为一个 CASE语句。 CASE语 句应符合 5.2.15的 要求 。如果没有任何 CASE语句中的条件成立,则执行 DEFAULT语句。 图 15 多分支 /SWITCH 节点结构 5.1.15 多分支入口 /CA
24、SE 节点 多分支入口 /CASE节点结构 见图 16。 CASE语句不是流程的一级语句,只准许出现在 SWITCH语句中, 提供 case_index属性,用于决定 SWITCH语句判断各 CASE语句的次序。判断 CASE语句的条件为其内的 CONDITIONS语句。 CONDITIONS语句的 执行应符合 5.2.11的 相关要求 。 注: 执行某一 CASE语句之后,不会像 C/C+语言的一样执行后续 CASE,无需 BREAK语句即可自动跳出。 图 16 多分支入口 /CASE 节点结构 5.1.16 流程中断 /TERMINATE 节点 流程中断 /TERMINATE节点结构见图
25、17。 TERMINATE语句用于中途结束整个流程。使用该语句 , 流程 将异常退出。 图 17 流程中断 /TERMINATE 节点结构 5.1.17 循环 /WHILE 节点 循环 /WHILE节点结构 见图 18。 WHILE在其内部的 CONDITION语句条件成立时,将反复执行其内的子语 句,直到条件不成立或遇到 BREAK语句。 DB3502/T 056.4 2020 11 图 18 循环 /WHERE 节点结构 5.1.18 循环跳出 /BREAK 节点 BREAK语句将向上寻找所有父语句,直到遇到第一个 WHILE循环,将中途结束该循环,继续执行 WHILE 之后的语句,见图
26、19。 图 19 循环 跳出 /BREAK 节点结构 5.1.19 循环继续 /CONTINUE 节点 CONTINUE语句将向上寻找所有父语句,直到遇到第一个 WHILE循环,将中途跳出该循环的本次迭代, 直接进入下一遍循环。见图 20。 图 20 循环继续 /CONTINUE 节点结构 数据空间 5.2.1 数据结构类型 5.2.1.1 政务信息共享协同平台支持三类数据结构:简单型、结构型、数组型。其中结构型和数组同 为复杂结构型,二者可组合,如:结构中含有数组数据,或数组的元素是结构类型。数组在理论上应支 持无限维度。 5.2.1.2 数据空间示例代码见附录 A.2。 5.2.2 简单数
27、据 /SimpleItem 简单数据 /SimpleItem结构见 图 21。简单数据包含“名称 /name”、“类型 /type”和“域 /domain” 属性,分别对应该变量的变量名、变量类型和变量可见范围。 支持的简单数据类型包括四种类型:字符串 /string、布尔型 /boolean、整型 /integer和双精度浮 点数 /double。 DB3502/T 056.4 2020 12 图 21 简单数据 /SimpleItem 5.2.3 数组数据 /ArrayItem 数组数据 /ArrayItem结构 见图 22。 ArrayItem应符合以下 要求: a) 提供 DEF节点,
28、以定义其元素的结构类型。如:在 DEF中定义的类型是 SimpleItem结构,且 数据类型为 string,则得到一个字符串类型的数组;在 DEF 中定义的类型是一个一维数组, 则得到一个一维数组的数组,即二维数组。 b) DEF节点之后,为具体的元素数组。 5.2.4 结构数据 /StructItem 图 22 数组数据 /ArrayItem 结构化数据 /StructItem结构 见图 23。 StructItem是多个相同或不同类型数据的组合,应符合以下 要求 : a) 支持结构嵌套子结构的多级结构; b) 支持包含数组的数据。 DB3502/T 056.4 2020 13 图 23
29、结构化数据 /StructItem 6 功能插件开发 支持语言 当前平台支持基于 Java语言和 Python语言的插件开发。 Java 插件开发 6.2.1 Java 插件基本要求 6.2.1.1 插件提供形式: Java 插件应提供 .java 的源文件以进行插件代码审查。审查通过后再由平台 运行环境编译为 .class文件。 6.2.1.2 插件部署位置:插件固定部署在平台部署目录的 bin/plugin/java作为类起始目录,不同插 件项目宜在其下创建不同的子目录。 6.2.1.3 Java运行环境:支持 1.8.0.x版本,未来视平台持续改进,宜使用更高版本。 6.2.1.4 流程
30、脚本中调用方法:通过 ACITIVITY 或 ASYNACTIVITY,指定其所调用的活动类型为 java_plugin,并指定路径为“ core/java/路径名 /类名 /静态方法名”。 6.2.1.5 插件功能调用入口:类似 Java项目的 Main方法,仅允许使用静态方法作为入口。 6.2.1.6 Java插件开发与使用示例,见附录 B。 6.2.2 Java 插件数据结构对应关系 Java插件数据结构对应关系见表 1。 表 1 Java 插件数据结构对应关系 平台数据类型 Java 数据类型 转换过程备注 简单类型的 string String 简单类型 integer int 简单
31、类型 boolean boolean 简单类型 double double StructItem Object 平台结构转换 Java 对象,该对象的 class 定义应存在。 ArrayItem ArrayList DB3502/T 056.4 2020 14 Python 插件开发 6.3.1 Python 插件基本要求 6.3.1.1 插件提供形式: Python插件应提供 .py 的源文件以进行插件代码审查。 6.3.1.2 插件部署位置:插件固定部署在平台部署目录的 bin/plugin/python 作为 python 文件起始 目录,不同插件项目宜在其下创建不同的子目录。 6.3
32、.1.3 Python运行环境:支持 2.6.x及 2.7.x 版本,未来随平台持续改进,宜升级至新版本 Python 运行环境。 6.3.1.4 流程脚本中调用方法:通过 ACITIVITY 或 ASYNACTIVITY,指定其所调用的活动类型为 python_plugin,并指定路径为“ core/java/路径名 /py文件名”。其中 py 文件名不含扩展名。 6.3.1.5 插件功能调用入口:仅允许以自由函数作为入口。 6.3.1.6 Python插件开发与使用示例,见附录 C。 6.3.2 Python 插件数据结构对应关系 Python插件数据结构对应关系见表 2。 表 2 Pyt
33、hon 插件数据结构对应 关系 平台数据类型 Python 数据类型 转换过程备注 简单类型的 string string 简单类型 integer int 简单类型 boolean bool 简单类型 double float StructItem dict 平台结构转换 Python 对象,该对象的 class 定义应存在。 ArrayItem list DB3502/T 056.4 2020 15 A A 附录 A (资料性) 业务流程脚本与数据空间示例 A.1 流程脚本代码示例 Created by CollaGEN FlowDesigner. Copyright 3600s $/XM
34、 $/SFZH $/SHBXH $/hcjgjy $/_OUT_PARAMETERS_REGISTER_ $/_FLOW_EXCEPTION_ $/_BRANCHTASKS_ $/_REQUESTER_INFORMATION_ $/_FLOW_INFORMATION_ $/_NET_FAILD_DISPOSE_ $/_SERVICE_FAILD_DISPOSE_ $/_REQUESTER_SESSION_ID_ $/_REQUESTER_CONNECTION_ID_ DB3502/T 056.4 2020 16 $/_REQUESTER_PORTAL_ID_ $/_LAST_APP_EXCEP
35、TION_ $/_PARENT_CHILD_RELATION_ $/_RUNTIME_TASK_ID_ $/XM $/SFZH $/SHBXH $/hcjgjy $/xm_str $/shbzkcxjg $/zfpj $/jshcjgjy $/jsckxxhcjg $/departmentId $/_REQUESTER_INFORMATION_.id $/applyId $/_REQUESTER_INFORMATION_.authorize_id $/serviceId $/_FLOW_INFORMATION_.id DB3502/T 056.4 2020 17 $/serviceId $/a
36、pplyId $/departmentId $/checkImpowerIdReturn $/_FLOW_EXCEPTION_.ID 19 $/_FLOW_EXCEPTION_.MSG 授权不通过,不允许调用 $/_FLOW_EXCEPTION_.NODE $/_REQUESTER_INFORMATION_.portal_id DB3502/T 056.4 2020 18 XM= $/XM and SFZH= $/xm_str $/xm_str $/SFZH $/zfpj $/_REQUESTER_INFORMATION_.authorize_id XM.GOVXM.GOV:02:XM.GOV
37、.YZ.ZX.JsHc.queryJsHc RequiredItems xm sfzh DB3502/T 056.4 2020 20 SenderID 123 ServiceID IN_10000280 DataObjectCode 1 Condition $/zfpj $/_COBWEB_/context $/_COBWEB_/context $/jsckxxhcjg $/jsckxxhcjg $/jsckxxhcjg DB3502/T 056.4 2020 21 $/_REQUESTER_INFORMATION_.authorize_id XM.GOVXM.GOV:02:XM.GOV.YZ
38、.ZX.JsckHcjgjy inXml $/jsckxxhcjg $/_COBWEB_/context $/_COBWEB_/context $/jshcjgjy $/jshcjgjy $/jshcjgjy $/_REQUESTER_INFORMATION_.authorize_id XM.GOVXM.GOV:02:XM.GOV.YZ.GA.Xxhc.infoConfirmQgRkxx schemeId 8a023c043b9d5d93013bb1017a3d003b condition DB3502/T 056.4 2020 23 $/zfpj uid zwww ywxx ?xml version=1.0 encoding=utf-8 ? ROOTBASIC_INFOSERVICE_TYPE核查目的 /SERVICE_TYPE /BASIC_