#### **什么是腳本**
腳本是一段PHP代碼,可以被應用中心執行以實現特定功能。應用中心支持通過腳本實現以下功能:
* 自定義計算函數。
* 自定義提取觸發器。
* 自定義回填觸發器。
編寫腳本對于應用中心來說不是必須的,但通過編寫腳本卻可以極大地增強應用中心的處理能力,這對于實施復雜度高、應用中心標準化功能滿足不了的項目是一個很好的選擇。
## 編寫腳本需要具備哪些基礎
除了要熟悉應用中心以及相關數據庫表結構之外,編寫腳本還需要有PHP編程基礎,寫腳本的過程本質上寫PHP代碼的過程。因此,應用中心的實施人員需要補充些PHP編程知識,這對編寫腳本是非常有幫助的。
#### **應用中心庫表結構**
應用中心主要庫表結構如下圖所視: 
#### **應用中心控件數據結構**
新版應用中心采取前后端分離方式實現,前端和后端采取規定好的數據結構進行通信,因此用戶自己編寫腳本過程中讀取和設置數據時要滿足規定好的結構。應用中心各控件數據結構說明如下:
\*\*單行文本、多行文本、數字文本、貨幣文本、自動編號:\*\*具體值,例如:”應用中心”,”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:插件公共對象,包含了訪問公共函數接口;
自定義函數輸出結果為計算結果值。
#### **舉例**
以倍數換算為例,舉例說明如何使用自定義函數。首先,定義如下提取觸發器:

其中,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;}
運行一結果如下圖所示:

#### **自定義提取或回填引擎**
自定義函數僅在觸發器的局部實現了自定義處理邏輯。除此之外,應用中心還支持在整個觸發器范圍內自定義處理邏輯。要實現整個觸發器范圍內的自定義處理,需要滿足以下條件:
如果是提取觸發器,填充方式里除了匹配之外,其他填充方式不得存在。
如果是回填觸發器,則無需定義更新方式。
自定義提取或者回填處理引擎命名規則為: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等,以區別于應用中心里所使用的變量。
## 舉例
以初始化數據為例,舉例說明如何使用腳本引擎實現自定義提取邏輯,觸發器定義如下:

處理引擎定義為“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);
?>
以回寫發票信息為例,舉例說明如何使用腳本引擎實現自定義回填邏輯,觸發器定義如下:



回寫條件和更新方式不定義。處理引擎寫上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();}}}
?>
- 個人事務
- 電子郵件
- 消息管理
- 任務管理
- 公告通知
- 新聞
- 投票
- 個人考勤
- 日程安排
- 工作日志
- 通訊簿
- 個人文件柜
- 任務中心
- 流程中心
- 流程中心簡介及菜單構成
- 新建工作
- 我的工作
- 工作查詢
- 工作監控
- 超時統計分析
- 工作委托
- 工作銷毀
- 流程日志查詢
- 數據報表
- 工作流設置
- 流程中心應用實例
- 行政辦公
- 公告通知管理
- 公告通知審批
- 新聞管理
- 投票管理
- 詞語過濾管理
- 信息過濾審核
- 工作計劃
- 辦公用品管理
- 會議管理
- 車輛申請與安排
- 固定資產管理
- 圖書管理
- 資源申請與管理
- 組織機構信息
- 知識管理
- 公共文件柜
- 公共文件柜設置
- 網絡硬盤
- 網絡硬盤設置
- 圖片瀏覽
- 圖片瀏覽設置
- 智能門戶
- 門戶管理
- 我的門戶
- 門戶日志管理
- 門戶內容管理
- 應用中心
- 功能介紹
- 使用說明
- EXCEL表單設計器
- 系統自帶應用介紹
- 函數詳解
- 腳本編寫指南
- 報表中心
- 我的報表
- 報表管理
- 復雜報表
- 分類管理
- 回收站
- 人力資源
- 人事管理
- 招聘管理
- 培訓管理
- 考勤管理
- 績效考核
- 積分管理
- 薪酬管理
- 人力資源設置
- 在線考試
- 檔案管理
- 卷庫管理
- 案卷管理
- 文件管理
- 案卷借閱
- 檔案統計
- 檔案銷毀
- 交流園地
- 企業社區
- 討論區
- 討論區設置
- 企業開放平臺
- 單點登錄平臺
- 統一工作待辦
- 移動開放平臺
- 附件程序
- 實用信息
- 即時通訊
- 系統管理
- 組織機構設置
- 行政辦公設置
- 信息交流設置
- 企業微信釘釘集成
- 印章管理
- 手機簽章管理
- 水印管理
- 功能管理中心
- 定時任務管理
- 緊急通知設置
- 界面設置
- 狀態欄設置
- 菜單設置
- 系統代碼設置
- 自定義字段設置
- 數據庫管理
- 系統日志管理
- 系統資源管理
- 附件管理
- 系統訪問控制
- 系統參數設置
- 系統接口設置
- 服務器監控
- 移動設備綁定管理
- 數據源管理
- 注冊外部應用
- 系統信息
- PC客戶端使用手冊
- 移動客戶端使用手冊