💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
#### **什么是脚本** 脚本是一段PHP代码,可以被应用中心执行以实现特定功能。应用中心支持通过脚本实现以下功能: * 自定义计算函数。 * 自定义提取触发器。 * 自定义回填触发器。 编写脚本对于应用中心来说不是必须的,但通过编写脚本却可以极大地增强应用中心的处理能力,这对于实施复杂度高、应用中心标准化功能满足不了的项目是一个很好的选择。 ## 编写脚本需要具备哪些基础 除了要熟悉应用中心以及相关数据库表结构之外,编写脚本还需要有PHP编程基础,写脚本的过程本质上写PHP代码的过程。因此,应用中心的实施人员需要补充些PHP编程知识,这对编写脚本是非常有帮助的。 #### **应用中心库表结构** 应用中心主要库表结构如下图所视: ![](https://www.tongda2000.com/oa/MYOA2019/manual/04%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83/media/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83_127.png) #### **应用中心控件数据结构** 新版应用中心采取前后端分离方式实现,前端和后端采取规定好的数据结构进行通信,因此用户自己编写脚本过程中读取和设置数据时要满足规定好的结构。应用中心各控件数据结构说明如下: \*\*单行文本、多行文本、数字文本、货币文本、自动编号:\*\*具体值,例如:”应用中心”,”2017版\\n应用中心操作手册”,96,25.98,”2017110056”。 \*\*日期文本:\*\*类型为日期时,数据格式为yyyy-M-d,例如:2017-11-20;类型为时间时,数据格式为HH:mm:ss,例如:11:07:01;类型为日期+时间时,数据格式为yyyy-M-d HH:mm:ss,例如:2017-11-20 11:07:01。 \*\*单选框:\*\*选项值结构为:\[\[“code”,”name”\]\],code为代码保存值,name为代码显示值,例如:\[\[“code”=>”01”,”name”=>”男”\],\[“code”=>”02”,”name”=>”女”\]\];选定值为:选择后的代码code值,例如:01。 \*\*多选框:\*\*选项值结构与单选框一样;选定值为:数组,数组里元素为选择后的代码code值,例如:\[“01”,”02”\]。 \*\*下拉选择:\*\*选项值结构与单选框一样;不支持多选的选定值结构与单选框一致,支持多选的选定值结构与多选框一致。 \*\*地址:\*\*数据结构为:\[“prov”=>\[“id”,”name”\],”city”=>\[“id”,”name”\],”country”=>\[“id”,”name”\],”street”\],分别对应省、市、县以及详细地址,例如:\[“prov”=>\[“id”=>”110000”,”name”=>”北京市”\],”city”=>\[“id”=>”110100”,”name”=>”市辖区”\],”country”=>\[“id”=>”110108”,”name”=>”海淀区”\],”street”=>”紫竹院路69号”\]。 \*\*定位:\*\*数据结构为:\[“lat”,”lng”,”address”\],分别对应纬度、经度以及具体地址,例如:\[“lat”=>39.9241,”lng”=>116.404,”address”=>”北京市东城区”\]。 \*\*附件、图片:\*\*数据结构为:\[\[“attach\_id”,”attach\_name”\]\],分别对应附件ID以及附件名称,例如:\[\[“attach\_id”=>” 2873\\@1711\_754692181”,”attach\_name”=>” 报表需求开发.docx”\],\[“attach\_id”=>” 2874\\@1711\_303458136”,”name”=>” 17版应用中心建议.docx”\]\]。 \*\*部门选择:\*\*数据结构为:\[\[“dept\_id”,”dept\_name”\]\],分别对应部门ID以及部门名称,例如:\[\[“dept\_id”=>”ALL\_DEPT”,”dept\_name”=>”全体部门”\]\],\[\[“dept\_id”=>1,”dept\_name”=>”总经理”\],\[“dept\_id”=>2,”dept\_name”=>”财务部”\]\]。 \*\*人员选择:\*\*数据结构为:\[\[“uid”,”username”\]\],分别对应人员的UID以及人员真实姓名,例如:\[\[“uid”=>1,”username”=>”张三”\],\[“uid”=>2,”username”=>”李四”\]\]。 \*\*列表:\*\*数据结构为:\[“flag”,”index”,”data”=>\[\[“field\_id”,”value”\]\]\],解释如下: > flag:新增行标识,新增行flag值为new,非新增行时为空; > index:行id; > data:记录数据,是一个二维数组,每列数据包含field\_id和value,field\_id为该列字段的GUID,value为该列的数值,数值结构参考之前的描述。 列表数据例子如下: \[ \[“flag”=>”new”,”index”=>” 1511236728561”,”data”=>\[\[“field\_id”=>“{4C022D90-83C4-5EBA-EE7B-ED1A98AFD7ED}”,”value”=>2\],\[“field\_id”=>” {6FF2B352-A9D9-C1EC-414C-795016C2141D}”,”value”=>\[11,12\]\]\]\], \[“flag”=>”new”,”index”=>” 1511236715995”, ”data”=> \[\[“field\_id”=>“{4C022D90-83C4-5EBA-EE7B-ED1A98AFD7ED}”,”value”=>1\],\[“field\_id”=>” {6FF2B352-A9D9-C1EC-414C-795016C2141D}”,”value”=>\[5,1\]\]\]\] \] #### **公共函数** 系统内置了一系列公共函数可供自定义函数、自定义脚本插件使用,这些函数封装在一个名为APPPluginUtils的类里,在运行时这个类会实例化为$PLUGIN\_UTILS对象,并以实参或者变量形式传递给自定义函数、自定义插件。具体调用方式请参考后面例子。 ### 获得当前表单id 方法:getFormId() 输入:无 输出:当前表单id ### 获得当前表单guid 方法:getFormGuid() 输入:无。 输出:当前表单guid。 ### 获得表单guid 方法:getFormGuidById($i\_id) 输入: $i\_id 表单id。 输出:指定表单guid。 ### 获得字段guid 方法:getItemGuidByName($i\_formid, $s\_title, $s\_subtitle = “”) 输入:$i\_formid 表单id;$s\_title 字段名称;$s\_subtitle 列表子字段名称,可不传。 输出:字段guid。 ### 根据名称获得当前字段值 方法:getValueByName($s\_item\_name, $s\_subitem\_name = "", $i\_seq = 1) 输入:$s\_item\_name 字段名称;$s\_subitem\_name 列表子字段名称,可不传;$i\_seq 行顺序号,默认取第一行数据。 输出:字段值。 ### 获得当前字段值 方法: getValue($s\_item\_guid, $i\_seq = 1) 输入:$s\_item\_guid 字段guid;$i\_seq 行顺序号,默认取第一行数据。 输出:字段值。 ### 根据名称获得表单基本数据(非列表数据)或者列表数据 方法:getRowByName($s\_list\_name = "", $i\_seq = 0) 输入:$s\_list\_name 列表名称,可不传,不传时返回表单基本数据;$i\_seq 行顺序号,默认取所有数据。 输出:基本数据或者列表数据。 ### 获得表单基本数据(非列表数据)或者列表数据 方法:getRow($s\_list\_guid = "", $i\_seq = 0) 输入:$s\_list\_guid 列表guid,可不传,不传时返回表单基本数据;$i\_seq 行顺序号,默认取所有数据。 输出:基本数据或者列表数据。 ### 设置字段数据 方法:setValue($s\_item\_guid, $value, $i\_seq = 1) 输入:$s\_item\_guid 字段guid;$value 字段值;$i\_seq 记录行顺序号。 输出:无。 ### 设置字段选项数据 方法:setOptionValues($s\_item\_guid, $arr\_options, $i\_seq = 1) 输入:$s\_item\_guid 字段guid;$arr\_options 选项数组;$i\_seq 记录行顺序号。 输出:无。 ### 清除列表数据 方法:function clearDetailTable($s\_item\_guid) 输入:$s\_item\_guid 字段guid。 输出:无。 ### 获得应用中心数据库连接 方法:function getDb() 输入:无。 输出:应用中心数据库连接。 根据数据库连接操作数据库,常见方法举例如下: $command = $connection->createCommand('SELECT \* FROM post'); $posts = $command->queryAll(); $post = $command->queryOne(); $command = $connection->createCommand('UPDATE post SET status=1'); $command->execute(); $command = $connection->createCommand('SELECT \* FROM post WHERE id=:id'); $command->bindValue(':id', $\_GET\['id'\]); $post = $command->query(); ### 获得数据源里配置的数据库连接 方法:function getOtherDB($s\_sername, $s\_db = "") 输入:$s\_sername数据源名称,在系统管理》数据源管理中设置;$s\_db 数据库名称,不传时使用数据源里设置的数据库。 输出:数据库连接。 ### 根据表单名称获得表单id 方法:function getFormIdByName($s\_app, $s\_form) 输入:$s\_app应用名称;$s\_form表单名称。 输出:表单id。 ### 根据表单guid获得表单id 方法:function getFormIdByGuid($s\_guid) 输入:$s\_guid表单guid。 输出:表单id。 ### 根据字段guid获得字段id 方法:function getItemIdByGuid($s\_guid) 输入:$s\_guid字段guid。 输出:字段id。 ### 根据字段名称获得字段id 方法:function getItemIdByName($i\_formid, $s\_title, $s\_subtitle = "") 输入:$i\_formid 表单id;$s\_title 字段名称;$s\_subtitle 列表子字段名称,可不传。 输出:字段id。 ### 获得本表单当前记录号 方法:function getCurPosition() 输入:无 输出:当前记录号(从1开始) ### 获得遍历触发器提取数据的当前记录 方法:function getCurDataRow() 输入:无 输出:遍历提取数据的当前记录 ### 获得触发器提取全部数据 方法:function getCurDataRows() 输入:无 输出:遍历提取的全部数据 #### **自定义函数** 应用中心提供了大量的标准函数,通过组合这些标准函数可以实现各种复杂度不一的数据处理。此外,应用中心还提供了自定义函数功能,方便用户自行扩充数据处理功能。自定义函数语法如下: MYFUNC(\\):返回由\\指定的自定义函数处理后的结果。例如:MYFUNC(“get\_aux\_quantity”)。 处理引擎命名规则为:XXX名称.func,对应的实现文件为:XXX名称.func.php,例如:MYFUNC(“get\_aux\_quantity”),指定处理引擎为get\_aux\_quantity.func,对应的实现文件为:get\_aux\_quantity.func.php。 引擎实现文件存放路径为:webroot\\general\\appbuilder\\modules\\appcenter\\plugin\\表单编号,例如:webroot\\general\\appbuilder\\modules\\appcenter\\plugin \\frm10。 注意:自定义函数只能用在填充表达式中,不能用在筛选条件中。 #### **输入参数与输出结果** 应用中心调用自定义函数时,将给自定义函数传递以下实参(即自定义函数的输入参数): $PLUGIN\_UTILS:插件公共对象,包含了访问公共函数接口; 自定义函数输出结果为计算结果值。 #### **举例** 以倍数换算为例,举例说明如何使用自定义函数。首先,定义如下提取触发器: ![](https://www.tongda2000.com/oa/MYOA2019/manual/04%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83/media/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83_128.png) 其中,MYFUNC("calculate\_it")为自定义函数。处理引擎定义为:calculate.func。引擎实现文件calculate.func.php包含自定义函数calculate\_it,其脚本如下: /\*\* \* 计算基数根据陪数翻番后的结果\* \\@param $PLUGIN\_UTILS 插件公共对象,提供公共方法\* \\@return mixed\*/function calculate\_it($PLUGIN\_UTILS){$i\_basic = $PLUGIN\_UTILS->getValueByName("基数");$i\_power = $PLUGIN\_UTILS->getValueByName("倍数");$i\_result = $i\_basic;while($i\_power > 1){$i\_result \*= $i\_basic;$i\_power--;}return $i\_result;} 运行一结果如下图所示: ![](https://www.tongda2000.com/oa/MYOA2019/manual/04%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83/media/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83_129.png) #### **自定义提取或回填引擎** 自定义函数仅在触发器的局部实现了自定义处理逻辑。除此之外,应用中心还支持在整个触发器范围内自定义处理逻辑。要实现整个触发器范围内的自定义处理,需要满足以下条件: 如果是提取触发器,填充方式里除了匹配之外,其他填充方式不得存在。 如果是回填触发器,则无需定义更新方式。 自定义提取或者回填处理引擎命名规则为:XXX名称,对应的实现文件为:XXX名称.php,例如:处理引擎为get\_goods\_lot,对应的实现文件为:get\_goods\_lot.php。 引擎实现文件存放路径为:webroot\\general\\appbuilder\\modules\\appcenter\\plugin \\表单编号,例如:webroot\\general\\appbuilder\\modules\\appcenter\\plugin \\frm10。 #### **输入参数与输出结果** 应用中心传递给脚本引擎的参数,即引擎文件输入参数为: * $PLUGIN\_UTILS 插件公共对象,包含了访问公共函数接口。 注意:由于自定义提取或回填脚本引擎是被嵌入到应用中心里一起执行的,因此引擎里使用的变量尽可能加前缀“plugin\_”并采用小写形式,例如$plugin\_i、$plugin\_str、$plugin\_arr\_datas等,以区别于应用中心里所使用的变量。 ## 举例 以初始化数据为例,举例说明如何使用脚本引擎实现自定义提取逻辑,触发器定义如下: ![](https://www.tongda2000.com/oa/MYOA2019/manual/04%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83/media/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83_130.png) 处理引擎定义为“fill\_it”,填充方式空着,即什么都不定义。 引擎脚本文件fill\_it.php包含以下内容: \\<?php/\*\*\* 北京通达信科科技有限公司\* Date: 2017/11/21\* Time: 16:34\*/$plugin\_s\_select = $PLUGIN\_UTILS->getItemGuidByName($PLUGIN\_UTILS->getFormId(), "寄送方式");$PLUGIN\_UTILS->setOptionValues($plugin\_s\_select, \[\["code"=>"","name"=>""\],\["code"=>"01","name"=>"自提"\],\["code"=>"02","name"=>"邮寄"\],\["code"=>"03","name"=>"送达"\]\]);$PLUGIN\_UTILS->setValue($plugin\_s\_select, "01");$plugin\_s\_list = $PLUGIN\_UTILS->getItemGuidByName($PLUGIN\_UTILS->getFormId(), "列表");$plugin\_s\_guid = $PLUGIN\_UTILS->getItemGuidByName($PLUGIN\_UTILS->getFormId(), "列表", "发票名称");$plugin\_s\_guid2 = $PLUGIN\_UTILS->getItemGuidByName($PLUGIN\_UTILS->getFormId(), "列表", "发票号");$PLUGIN\_UTILS->clearDetailTable($plugin\_s\_list);$PLUGIN\_UTILS->setValue($plugin\_s\_guid, "充值卡");$PLUGIN\_UTILS->setValue($plugin\_s\_guid2, 19918125);$PLUGIN\_UTILS->setValue($plugin\_s\_guid, "物业费", 2);$PLUGIN\_UTILS->setValue($plugin\_s\_guid2, 19918126, 2);$PLUGIN\_UTILS->setValue($plugin\_s\_guid, "采暖费", 3);$PLUGIN\_UTILS->setValue($plugin\_s\_guid2, 19918127, 3); ?> 以回写发票信息为例,举例说明如何使用脚本引擎实现自定义回填逻辑,触发器定义如下: ![](https://www.tongda2000.com/oa/MYOA2019/manual/04%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83/media/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83_131.png) ![](https://www.tongda2000.com/oa/MYOA2019/manual/04%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83/media/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83_132.png) ![](https://www.tongda2000.com/oa/MYOA2019/manual/04%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83/media/%E5%BA%94%E7%94%A8%E4%B8%AD%E5%BF%83_133.png) 回写条件和更新方式不定义。处理引擎写上back\_it。 脚本引擎文件back\_it.php包含如下内容: \\<?php/\*\*\* 北京通达信科科技有限公司\* User: lhs\* Date: 2017/11/24\* Time: 14:22\*///把本表单列表数据回填到目标表单的列表中//回写目标$plugin*i\_target\_formid = $PLUGIN\_UTILS->getFormIdByName("特性展示", "test112102");//目标表单id**$plugin\_i\_target\_list\_id = $PLUGIN\_UTILS->getItemIdByName($plugin\_i\_target\_formid, "列表");//目标列表id**$plugin\_i\_target\_fph\_id = $PLUGIN\_UTILS->getItemIdByName($plugin\_i\_target\_formid, "列表", "发票号");//目标字段发票号id**$plugin\_i\_target\_bz\_id = $PLUGIN\_UTILS->getItemIdByName($plugin\_i\_target\_formid, "列表", "说明");//目标字段说明id**//本表单**$plugin\_i\_source\_fph\_id = $PLUGIN\_UTILS->getItemIdByGuid("{C55A3264-04D4-297B-7685-26AFE7FE10C2}");//本表单字段发票号id**$plugin\_i\_source\_fpmc\_id = $PLUGIN\_UTILS->getItemIdByGuid("{B8240BDB-5A0B-21F3-D676-2E9A07DC36CF}");//本表单字段发票名称id**////本表单列表数据**$plugin\_arr\_row = $PLUGIN\_UTILS->getRowByName("列表");**if(!empty($plugin\_arr\_row)){**foreach($plugin\_arr\_row as $plugin\_row){**$sql = "select id from app\_data*{$plugin*i\_target\_formid}\_list*{$plugin*i\_target\_list\_id} where col*$plugin*i\_target\_fph\_id='{$plugin\_row\["col*$plugin*i\_source\_fph\_id"\]}'";**$plugin\_target\_row = $PLUGIN\_UTILS->getDb()->createCommand($sql)->queryOne();**if(!empty($plugin\_target\_row)){**$plugin\_s\_value = "发票号:{$plugin\_row\["col*$plugin*i\_source\_fph\_id"\]},发票项目:{$plugin\_row\["col*$plugin*i\_source\_fpmc\_id"\]}";**$sql = "update app\_data*{$plugin*i\_target\_formid}\_list*{$plugin*i\_target\_list\_id} set col*$plugin\_i\_target\_bz\_id='$plugin\_s\_value' where id=$plugin\_target\_row\[id\]";$PLUGIN\_UTILS->getDb()->createCommand($sql)->execute();}}} ?>