1. 程式人生 > >通達OA應用中心使用手冊(腳本編寫指南)

通達OA應用中心使用手冊(腳本編寫指南)

cit ted 點擊 ble 計算 文本 ppp 必須 組合

腳本編寫必備基礎

1.1 什麽是腳本

腳本是一段 PHP 代碼,可以被應用中心執行以實現特定功能。應用中心支持通過腳本

實現以下功能:

  • 自定義計算函數。

  • 自定義提取觸發器。

  • 自定義回填觸發器。

編寫腳本對於應用中心來說不是必須的,但通過編寫腳本卻可以極大地增強應用中心的

處理能力,這對於實施復雜度高、應用中心標準化功能滿足不了的項目是一個很好的選擇。

1.2 編寫腳本需要具備哪些基礎

除了要熟悉應用中心以及相關數據庫表結構之外,編寫腳本還需要有 PHP 編程基礎,

寫腳本的過程本質上寫 PHP 代碼的過程。因此,應用中心的實施人員需要補充些

PHP 編程

知識,這對編寫腳本是非常有幫助的。

1.3 應用中心庫表結構

應用中心主要庫表結構如下圖所屬:

1

app_form 表單id 表單idPKguid 表單guidPKfrmno 表單編號label 表單名稱1對多app_item 字段信息id 字段idPKguid 字段guidPKform_guid 所屬表單guidFKFKitem_guid 所屬列表guidtitle 字段名稱datatype2 字段數據類型 1對1 技術分享圖片 1對1 app_data_XXX 表單除列表之外且 不是大文本字段數據存儲表,XXX 對應表單id,該表為表單數據主 表id 記錄idPKguid 數據記錄guidPK FK main_id 主表的數據記錄id run_id 工作流水號 isdeleted 刪除標識 position 記錄順序號 create_userid 創建者uid create_time 創建時間 update_userid 最後更新者 uid update_time 最後更新時間 col_XXX 字段數據,XXX代表字段id app_data_XXX_text 表單除列表之 技術分享圖片

外的大文本字段數據存儲表,XXX 對應表單idid 記錄idPKguid 數據記錄guidPK FK main_id 主表的數據記錄id run_id 工作流水號 isdeleted 刪除標識 position 記錄順序號 create_userid 創建者uid create_time 創建時間 update_userid 最後更新者 uid update_time 最後更新時間 col_XXX 字段數據,XXX代 表字段id app_data_XXX_list_YYY 表單列表 字段數據存儲表,XXX對應表單 id,YYY為列表字段id PKid 記錄idguid 數據記錄guidPK FK main_id 主表的數據記錄id run_id 工作流水號 isdeleted 刪除標識 position 記錄順序號 create_userid 創建者uid create_time 創建時間 update_userid 最後更新者 uid update_time 最後更新時間 col_XXX 字段數據,XXX代 表字段id 1.4 應用中心控件數據結構 新版應用中心采取前後端分離方式實現,前端和後端采取規定好的數據結構進行通信, 因此用戶自己編寫腳本過程中讀取和設置數據時要滿足規定好的結構。應用中心各控件數據 2 結構說明如下: 單行文本、多行文本、數字文本、貨幣文本、自動編號:具體值,例如:"應用中心","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,非新增行時為空; 3 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]]]] ] 1.5 公共函數 系統內置了一系列公共函數可供自定義函數、自定義腳本插件使用,這些函數封裝在一 個名為 APPPluginUtils 的類裏,在運行時這個類會實例化為$PLUGIN_UTILS 對象,並以實 參或者變量形式傳遞給自定義函數、自定義插件。具體調用方式請參考後面例子。 1.5.1 獲得當前表單 id 方法:getFormId() 輸入:無 輸出:當前表單 id 1.5.2 獲得當前表單 guid 方法:getFormGuid() 輸入:無。 輸出:當前表單 guid。 4 1.5.3 獲得表單 guid 方法:getFormGuidById($i_id) 輸入: $i_id 表單 id。 輸出:指定表單 guid。 1.5.4 獲得字段 guid 方法:getItemGuidByName($i_formid, $s_title, $s_subtitle = "") 輸入:$i_formid 表單 id;$s_title 字段名稱;$s_subtitle 列表子字段名稱,可不傳。 輸出:字段 guid。 1.5.5 根據名稱獲得當前字段值 方法:getValueByName($s_item_name, $s_subitem_name = "", $i_seq = 1) 輸入:$s_item_name 字段名稱;$s_subitem_name 列表子字段名稱,可不傳;$i_seq 行 順序號,默認取第一行數據。 輸出:字段值。 1.5.6 獲得當前字段值 方法: getValue($s_item_guid, $i_seq = 1) 輸入:$s_item_guid 字段 guid;$i_seq 行順序號,默認取第一行數據。 輸出:字段值。 1.5.7 根據名稱獲得表單基本數據(非列表數據)或者 列表數據 方法:getRowByName($s_list_name = "", $i_seq = 0) 輸入:$s_list_name 列表名稱,可不傳,不傳時返回表單基本數據;$i_seq 行順序號, 默認取所有數據。 輸出:基本數據或者列表數據。 5 1.5.8 獲得表單基本數據(非列表數據)或者列表數據 方法:getRow($s_list_guid = "", $i_seq = 0) 輸入:$s_list_guid 列表 guid,可不傳,不傳時返回表單基本數據;$i_seq 行順序號, 默認取所有數據。 輸出:基本數據或者列表數據。 1.5.9 設置字段數據 方法:setValue($s_item_guid, $value, $i_seq = 1) 輸入:$s_item_guid 字段 guid;$value 字段值;$i_seq 記錄行順序號。 輸出:無。 1.5.10 設置字段選項數據 方法:setOptionValues($s_item_guid, $arr_options, $i_seq = 1) 輸入:$s_item_guid 字段 guid;$arr_options 選項數組;$i_seq 記錄行順序號。 輸出:無。 1.5.11 清除列表數據 方法:function clearDetailTable($s_item_guid) 輸入:$s_item_guid 字段 guid。 輸出:無。 1.5.12 獲得應用中心數據庫連接 方法:function getDb() 輸入:無。 輸出:應用中心數據庫連接。 根據數據庫連接操作數據庫,常見方法舉例如下: 6 $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(); 1.5.13 獲得數據源裏配置的數據庫連接 方法:function getOtherDB($s_sername, $s_db = "") 輸入:$s_sername 數據源名稱,在系統管理》數據源管理中設置;$s_db 數據庫名稱, 不傳時使用數據源裏設置的數據庫。 輸出:數據庫連接。 1.5.14 根據表單名稱獲得表單 id 方法:function getFormIdByName($s_app, $s_form) 輸入:$s_app 應用名稱;$s_form 表單名稱。 輸出:表單 id。 1.5.15 根據表單 guid 獲得表單 id 方法:function getFormIdByGuid($s_guid) 輸入:$s_guid 表單 guid。 輸出:表單 id。 7 1.5.16 根據字段 GUID 獲得字段 ID 方法:function getItemIdByGuid($s_guid) 輸入:$s_guid 字段 guid。 輸出:字段 id。 1.5.17 根據字段名稱獲得字段 ID 方法:function getItemIdByName($i_formid, $s_title, $s_subtitle = "") 輸入:$i_formid 表單 id;$s_title 字段名稱;$s_subtitle 列表子字段名稱,可不傳。 輸出:字段 id。 8 自定義函數 1.6 概述 應用中心提供了大量的標準函數,通過組合這些標準函數可以實現各種復雜度不一的數 據處理。此外,應用中心還提供了自定義函數功能,方便用戶自行擴充數據處理功能。自定 義函數語法如下: 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\表單 id, 例如:webroot\general\reportshop\utils\plugins\1。 如何查看表單 id?點擊該表單設計界面,瀏覽器地址欄上會顯示 formId=XXX,XXX 即為該表單 id。 註意:自定義函數只能用在填充表達式中,不能用在篩選條件中。 1.7 輸入參數與輸出結果 應用中心調用自定義函數時,將給自定義函數傳遞以下實參(即自定義函數的輸入參 數): $PLUGIN_UTILS:插件公共對象,包含了訪問公共函數接口; 自定義函數輸出結果為計算結果值。 1.8 舉例 以倍數換算為例,舉例說明如何使用自定義函數。首先,定義如下提取觸發器: 9 技術分享圖片
其中,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;

}

運行一結果如下圖所示:

10

技術分享圖片

11

自定義提取或回填引擎

1.9 概述

自定義函數僅在觸發器的局部實現了自定義處理邏輯。除此之外,應用中心還支持在整

個觸發器範圍內自定義處理邏輯。要實現整個觸發器範圍內的自定義處理,需要滿足以下條

件:

如果是提取觸發器,填充方式裏除了匹配之外,其他填充方式不得存在。

如果是回填觸發器,則無需定義更新方式。

自定義提取或者回填處理引擎命名規則為:XXX 名稱,對應的實現文件為:XXX

.php,例如:處理引擎為 get_goods_lot,對應的實現文件為:get_goods_lot.php

引擎實現文件存放路徑為:webroot\general\appbuilder\modules\appcenter\plugin \模板 id

例如:webroot\general\appbuilder\modules\appcenter\plugin \1

1.10 輸入參數與輸出結果

應用中心傳遞給腳本引擎的參數,即引擎文件輸入參數為:

  • $PLUGIN_UTILS 插件公共對象,,包含了訪問公共函數接口。

註意:由於自定義提取或回填腳本引擎是被嵌入到應用中心裏一起執行的,因此引擎裏

  • 用的變量盡可能加前綴 " plugin_ " 並采用小寫形式,例如 $plugin_i $plugin_str

$plugin_arr_datas 等,以區別於應用中心裏所使用的變量。

1.11 舉例

以初始化數據為例,舉例說明如何使用腳本引擎實現自定義提取邏輯,觸發器定義如下:

12

技術分享圖片

處理引擎定義為"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, "充值卡");

13

$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);

?>

以回寫發票信息為例,舉例說明如何使用腳本引擎實現自定義回填邏輯,觸發器定義如

下:

技術分享圖片

14

技術分享圖片

回寫條件和更新方式不定義。處理引擎寫上 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-26AFE7FE 10C2}");//本表單字段發票號 id

$plugin_i_source_fpmc_id =

$PLUGIN_UTILS->getItemIdByGuid("{B8240BDB-5A0B-21F3-D676-2E9A07DC 36CF}");//本表單字段發票名稱 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_f

ph_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();

}

}

}

?>

通達OA應用中心使用手冊(腳本編寫指南)