用友 NC客戶化開發手冊
NC客戶化開發手冊
本手冊是北京齊力創輝科技發展有限公司(TTS)內部培訓資料,只限於公司內部應用,任何人未經過書面許可不得擴大本教程的使用范圍。嚴禁任何非法傳播、翻印或仿制,違者必究!
©本手冊的著作權屬於北京齊力創輝科技發展有限公司
前言
目錄
第一章 規范篇
1.1 代碼規范
1.1.1 程序中代碼規范
1.1.1.1 常量命名
所有的字符都必須大寫。采用有意義的單詞組合表達,單詞與單詞之間以“_”下划線隔開。
Ø 命名盡量簡短,不要超過16個字符。
程序開發中最好不要直接對literal進行工作,最好引入常量方式應用;只有在特別的情況下才能使用, 如在for循環中初始化變量時可直接用-1,0,1這些常量。
例如:public final int MAX_SIZE = 120;
public final int MAX_WIDTH = 100;
public final String PROPERTY_NAME= "menu" ;
1.1.1.2 變量命名
變量的命名包括實例變量,靜態變量,函數參數的命名。
Ø 避免在命名中采用數字,除非命名意義明確,程序更加清晰,對實例變量的命名中不應該有數字。
Ø 變量名稱是名詞意義。
Ø 采用有符合問題域意義的單詞或單詞組合。第一個單詞全部小寫,后續的每個單詞采用首字母大寫,其余小寫(特殊單詞除外,如URL)。
Ø 命名盡量簡短,不要超過16個字符。
Ø 除了生命周期很短的臨時變量外,避免采用單字符作為變量名,實例變量的命名不要用單字符。常用的單字符變量如整型用 i、j、 k、 m、 n字符型用c、d、 e,坐標用x、y、z。
Ø 在某些情況下,變量可能需要加上類型前綴,所有的類型前綴必須是小寫,他與變量名稱的實體部分沒有任何間隔,實體部的每個單詞都是首字母大寫,其余字母小寫(特殊單詞除外如URL),類的全局變量強烈建議使用,一般的類型前綴如下:
類型前綴 |
類型 |
例子 |
b |
Boolean、boolean |
bsingle |
f |
浮點數 |
fsize |
d |
UFDouble |
dmoney |
dt |
Date |
dtToday |
c |
Character,、char |
cinput |
obj |
OBJECT變量 |
ObjUser |
str |
字符串(String, StringBuffer) |
strFileName |
i |
整型數 |
iCount |
ary |
數組 |
aryName |
conn |
連接 |
ConnActiveConnection |
stmt |
Statement |
StmtFindUser |
rs |
Resultset |
RsUsers |
al |
ArrayList |
alData |
map |
Map |
map_key_value |
set |
Set |
setValue |
col |
Collection |
colNames |
msg |
消息 |
msgText |
err |
錯誤 |
errCode |
btn |
按鈕 |
btnSubmit |
Ø 不在特別的情況下,Java中不推薦采用前綴,而是推薦保持名稱的語義
例如:public int width;
public String fileName;
public static ApplicationContext context;
1.1.1.3 方法、類和接口的命名和規范
命名多數為動詞結構。
Ø 采用有符合問題域意義的單詞或單詞組合。第一個單詞采用小寫,后續的每個單詞采用首字母大寫,其余小寫(特殊字除外如URL),沒有特別理由不用下划線作為分隔符。
一般功能性的方法不允許方法的代碼長度超過200行,如果方法實現邏輯比較復雜就拆分類若干個小方法,每個方法添加功能注釋。
一個類文件最好不要超過2000行。
1.1.1.4 包的命名
采用邏輯上的層次結構,從而減少依賴。
Ø 產品模塊對外的接口定義放在nc.itf.模塊名.xx。
Ø 服務的實現類nc.impl.模塊名.xx。
Ø 后台業務類代碼nc.bs.xx。
Ø 值對象命名:nc.vo.模塊名。
Ø UI層命名:nc.ui.模塊名。
Ø 命名簡短,常采用縮寫。
Ø 包名所有字符都為小寫。
Ø 不要用java, javax作為自定義包的前綴。
1.1.2 數據庫設計規范
1.1.2.1 sql書寫規范
1) SQL語句全部使用小寫。
2) 連接符或運算符or、in、and、=、<=、>=, +,- 等前后加上一個空格。
3) 嚴禁使用select * …….形式的語句,必須指出select的具體字段,即select col1, col2,… from tablea where …。★。
4) 嚴禁使用 insert into table values(?,?,?),必須指出具體要賦值的字段,即 insert into tablea (col1, col2,…) values(?,?,…)。
5) SQL語句包含多表連接時,建議對每個表命名別名,對每個字段的使用都要帶上表別名,即 select a.col1, a.col2, b.col3 from tablea a, tableb b where a.col4=b.col5。
1.1.2.2 性能規范
1) 在進行多條記錄的增加、修改、刪除時,建議使用批處理功能,批處理的次數以整個SQL語句不超過相應數據庫的SQL語句大小的限制為准。
2) 禁止使用or 超過 500,如 xx =’123’ or xx=’456’,禁止在SQL 語句中in中的元素個數在50以上。
3) 禁止在一條SQL語句中使用3層以上的嵌套查詢,如果有,請考慮使用臨時表或中間結果集。
4) 如果有多表連接時,應該有主從之分,並盡量從一個表取數。
1.1.2.3 數據庫字段級表名的命名規范
模塊名稱規則表,一般數據庫表設計的前綴默認采用以下規則,以下表的詳細信息請參考NC規范中的NC產品形態文檔:
模塊名稱 |
系統規則名 |
模塊名稱 |
系統規則名 |
模塊名稱 |
系統規則名 |
||
UAP |
|||||||
系統管理 |
sm |
UAP |
pub |
財務會計平台 |
dap |
||
基礎數據 |
bd |
外部交換平台 |
xx |
管理會計平台 |
dmp |
||
報表&BPM |
|||||||
報表 |
iufo |
BI平台 |
bi |
BPM |
bpm |
||
財務 |
|||||||
總賬管理 |
gl |
收付報 |
arap |
固定資產 |
fa |
||
存貨核算 |
ia |
項目成本 |
jc |
||||
資金 |
|||||||
資金結算 |
fts |
資金監控 |
fvm |
資金計划 |
fp |
||
票據管理 |
fbm |
信貸管理 |
fi |
資金預測 |
fi |
||
資金計息 |
fi |
網上銀行 |
ebank |
||||
預算 |
|||||||
預算管理 |
ntb |
||||||
人力資源 |
|||||||
人力資源規划 |
HRP |
職務職能管理 |
OM |
員工信息管理 |
HI |
||
招聘甄選管理 |
RM |
員工調配管理 |
HI |
員工離職管理 |
HI |
||
政策制度管理 |
HRPM |
勞動合同管理 |
HRCM |
培訓開發管理 |
TRM |
||
考勤管理 |
TBM |
出差管理 |
HRBT |
休假管理 |
HRLM |
||
加班管理 |
HROM |
績效管理 |
PE |
薪酬管理 |
WA |
||
福利管理 |
BM |
經理自助 |
MSS |
基礎設置 |
HR |
||
人力資源取數函數 |
RPT |
員工自助 |
ESS |
|
|
||
供應鏈 |
|||||||
采購管理 |
po |
銷售/分銷管理 |
so |
庫存管理 |
ic |
||
銷售價格 |
prm |
內部交易 |
to |
供應商管理 |
vrm |
||
合同管理 |
ct |
委外加工 |
sc |
發運管理 |
dm |
||
供應鏈公共 |
scm |
||||||
制造 |
|||||||
設備管理 |
fm |
成本管理 |
cm |
||||
制造基礎數據 |
pd |
需求管理 |
mm |
生產計划 |
mm |
||
生產定單 |
mm |
車間作業 |
sf |
能力計划 |
crp |
||
裝配計划 |
mm |
檢修管理 |
er |
||||
質量管理 |
|||||||
質量管理 |
qc |
||||||
其他 |
|||||||
cdm |
pm |
||||||
2)所有表、視圖、觸發器、索引、函數、約束、主外鍵必須指定名稱,規則如下:
對於各種數據庫對象的命名規則,目前的NC系統中存在兩種風格,采用拼音和采用英文的,目前這兩種規范都可以,但是注釋一定要清楚。
數據庫對象 |
規則 |
最大長度 |
例子 |
表 |
系統規則名_名稱 |
18 |
sm_firm |
字段名 |
18 |
acc_code, acc_name |
|
視圖 |
v_系統規則名_名稱(*) |
18 |
ac_accsub |
觸發器 |
t_表名_名稱(*) |
18 |
t_firm |
函數 |
f_名稱 |
18 |
f_fun() |
Check |
ck_表名_字段名(*) |
18 |
ck_gl_accsub_code |
主鍵 |
pk_表名 |
18 |
pk_gl_accsub |
外鍵 |
fk_表名_字段名(*)--此處超過18位處理 |
18 |
fk_gl_vouch_accsub_code |
索引 |
i_表名_字段名(*) |
18 |
i_gl_accsub_code |
表空間 |
ts_名稱 |
18 |
ts_sys |
(*)注:由於數據庫對象之間的命名規則與最大長度限制可能造成命名存在沖突。如存在,可以通過縮減表名或字段字符來實現;
1) 所有的外鍵、約束、索引、函數、觸發器、存儲過程名不允許重復;
4)業務中主子表的命名規則:
系統規則名_名稱 或 主表:系統規則名_名稱_h 子表:系統規則名_英文名稱_b。
5)業務中主子子表的命名規則:
主表:系統規則名_英文名稱_h
子表:系統規則名_英文名稱_b
子子表:系統規則名_英文名稱_bs
1.1.2.4 業務數據類型規范
類型 |
規則(使用SQL Server描述) |
編碼類 |
字符型。依據規則確定用char還是varchar。 |
名稱類 |
字符型。依據規則確定用char還是varchar。 |
布爾類 |
Char(1),Y/N |
狀態類 |
Smallint,用0,1,2,3……表示 |
級次類 |
16位整型Smallint |
金額類 |
精確數值型,一般為decimal(20,8) |
大金額 |
32,10 |
系統標識類 |
估計可能最大值<32,767: 16位整型smallint 估計可能最大值>32,767: 32位整型 smallint |
摘要備注類 |
可變字符型。需要定義幾種:200,1000 |
價格數量類 |
精確數值型,一般為decimal(20,8) |
單價類 |
精確數值型,一般為decimal(20,8) |
比率類 |
精確數值型,一般為decimal(20,8) |
3)不要用SQL 保留字來命名表、視圖、字段、索引。數據庫的保留字見各數據庫廠商規范;
4)字符型字段的確定。長度固定用char,不固定用varchar;
5)不要將Null 與 空串“”視為相同。在不同的數據庫中對這兩者的理解是不相同的。在
Oracle中空串與Null理解一樣。如果碰到這種情況統一用Null;
6)空值問題:
所有經常用來做為查詢條件的字段都不允許使用空值,引用基礎檔案的,在基礎檔案增加表示空值的檔案,其他使用N/A表示。
1.2 注釋規范
1.2.1 類、方法注釋
類、方法開始必須要加上注釋,標注方法或者類的用途、作者、時間。如果是方法注釋必須加上方法的參數說明(注釋每個參數代表的實際意義),
1.2.2 主要算法注釋
算法描述指在實現級別的描述注釋,如在方法內的注釋,對類實現的注釋,這樣使得程序更加易懂,方便程序算法的修改和BUG的修復。一般采用塊/行注釋,對於簡短的描述采用行注釋,不要用文檔注釋。注釋的主要內容包括:
Ø 1)某些局部變量的意義和用途;
Ø 2)復雜的控制結構的注釋,如循環、分枝、條件表達式,說明控制所要達到的目標;
Ø 3)復雜的代碼段的描述,說明代碼完成的功能,以及為什么這樣做。
1.2.3 修改原有產品或者其他人代碼注釋
如果是修改產品或者其他人代碼時必須加上注釋
1) 如果是單行修改代碼,注釋要加上修改的目的、時間、修改人。
例如://edit by 張三 增加此行代碼目的 2012-03- 05
2) 如果是塊修改代碼必須在要修改的代碼開始和結尾做標記
例如://edit by 張三 增加參照入庫單生單的額外條件 2012-03- 05 begin
中間部分添加修改的代碼塊
//edit by 張三 增加參照入庫單生單的額外條件 2012-03- 05 end
3) 如果是單行增加代碼,注釋要加上增加的目的、時間、修改人。
例如://add by 張三 增加此行代碼目的 2012-03- 05
4) 如果是塊修改代碼必須在要修改的代碼開始和結尾做標記
例如:/add by 張三 增加參照入庫單生單的額外條件 2012-03- 05 begin
中間部分添加修改的代碼塊
// add by 張三 增加參照入庫單生單的額外條件 2012-03- 05 end
1.2.4 整體代碼注釋
比較長的代碼,規定必須每行或者每隔一行必須有邏輯上的注釋(即:代碼思路的注釋)。
1.3 異常規范
1.3.1 代碼中異常處理
代碼中異常處理必須遵循NC平台的異常處理,禁止在自己寫的方法中進行異常的撲捉、打印異常信息,如果在自己的代碼中必須做異常的處理的話就進行異常的throw,由最外層的異常捕獲機制進行捕獲和用戶的交互。
1.4 其他規范
1.4.1 SVN使用規范
1) SVN服務器的使用規范,每個人必須使用自己的用戶,每天早上上班時進行代碼的更新,每天下班前對已經完工的功能進行代碼的提交。
2) 代碼在提交前必須先進行更新,預防自己本地的代碼覆蓋他人並發修改的代碼。
1.4.2 數據庫服務器使用規范
在還原用戶數據庫到服務器上時,如果客戶的數據庫文件超過5G,必須建立單獨的實例。如果不超過5G就可以還原到公用的orcl實例中。
第二章 基礎篇
1
2
2.1 單據信息
1.4.3 獲取卡片和列表容器(Panel)
F 卡片
UI端:getBillCardPanelWrapper().getBillCardPanel()或者getBillCardPanel()
EventHandler:getBillCardPanelWrapper().getBillCardPanel()
F 列表
UI端:getBillCardPanelWrapper().getBillListPanel()或者getBillListPanel()
EventHandler:getBillCardPanelWrapper().getBillListPanel()
1.4.4 當前界面卡片/列表狀態
getBillManageUI().isListPanelSelected()
1.4.5 獲取/設置當前單據的操作狀態:
getBillUI().setBillOperate(intnewBillOperate);
getBillUI().getBillOperate()
1.4.6 獲取選擇的樹節點
getBillTreeCardUI().getBillTreeSelectNode();
getBillTreeCardUI().getBillTreeSelectNode().getData();
1.4.7 是否單表體
isSingleDetail() true:為單表體;false:為單表頭;(在校驗類里)
1.4.8 設置單據卡片表頭區域比例
((nc.ui.pub.bill.BillCardLayout)getBillCardPanel().getLayout()).setHeadScale(80);
1.4.9 設置表體頁簽狀態
F 顯示狀態:getBillCardPanel().getBodyPanel("").setVisible(false);
F 可用狀態:getBillCardPanel().getBillModel("subbillb").setEnabled(false);
F 獲取當前頁簽編碼:getBillCardPanelWrapper().getBillCardPanel().getCurrentBodyTableCode()
1.4.10 獲取單據模板上定義的所有字段
nc.vo.pub.bill.BillTempletBodyVO[] tbodyvos =
(nc.vo.pub.bill.BillTempletBodyVO[]) billCardPanel.getTempletData().getChildrenVO();
1.4.11 列表啟用表頭多選對話框
getBillListPanel().setParentMultiSelect(true);
2.2 VO的獲取和賦值及更新
1.4.12 VO的獲取
1.4.12.1 getBufferData():
EventHandler中可以直接調用,可以獲取單據對應的緩存數據,getBufferData().getCurrentVO()卡片下為獲取當前單據的VO對象,列表下則為獲取當前選擇行的VO對象。UI類當和EventHandler類在同一個包下時,也可以直接調用該方法。當UI類與EventHandler類不在同一個包下時,可以通過getManageEventHandler()獲取EventHandler對象,然后再調用EventHandler的getBufferData()獲取緩存數據。
1.4.12.2 界面取值
F 得到單據表體當前被選中的VO:
getBillCardPanelWrapper().getSelectedBodyVOs(); //如果沒有被選擇的行那么返回NULL
F 從界面上得到VO
getBillCardPanelWrapper().getBillVOFromUI();//得到界面上全部數據的VO
getBillListWrapper().getVOFromUI()//被選擇行的VO
F 得到界面變化數據的VO
(ClientUI)getChangedVOFromUI()或者getBillListWrapper().getChangedVOFromUI()
1.4.12.3 通過VO的className
F 卡片
getBillCardPanel().getBillData().getBillValueVO(billVOName, headVOName, bodyVOName)
getBillCardPanel().getBillData().getBillValueChangeVO(billVOName, headVOName, bodyVOName)
F 列表
getBillListPanel().getBillListData().getBillSelectValueVO(billVOName, headVOName, bodyVOName)
getBillListPanel().getBillListData().getBillSelectValueVOs(billVOName, headVOName, bodyVOName)
getBillListPanel().getBillListData().getBillValueVO(row, billVOName, headVOName, bodyVOName)
1.4.12.4 通過PK值查詢
InvbasdocVOinvbasdocVO = (InvbasdocVO)HYPubBO_Client.queryByPrimaryKey(InvbasdocVO.class, pk_inv);
1.4.13 VO的操作
1.4.13.1 界面VO操作
F 設置Buffer中的TS到當前設置VO:
setTSFormBufferToVO(billVO); billVO為AggregatedValueObject類型
F 得到當前VO的一個副本:getBufferData().getCurrentVOClone()
F 刷新某一行的VO
BillManageUI.getBillListWrapper().updateListVo(hvo, selectedRows[i]);
1.4.13.2 VO的數據庫操作
1.4.13.2.1 SuperVO
針對SuperVO,通用的方式為下面兩種。如果是特殊的單據如供應鏈等需要特殊的操作,不能使用下面的方法
F 前台:HYPubBO_Client
F 后台:BaseDAO
1.4.13.2.2 (供應鏈)的GeneralBillHelper類
ret = GeneralBillHelper.queryBills(單據類型, (QryConditionVO)voCond);
2.3 字段處理
1.4.14 表頭字段值
取值
F getBillCardPanel().getHeadItem("strKey").getValueObject()
F 表頭VO.getAttributeValue('"字段名");
賦值
F 表頭VO.setAttributeValue("字段名" ,值); 聚合VO.setHeaderValue("字段名" ,值);
F getBillCardPanel().setHeadItem("字段名" ,值);
1.4.15 表體字段值
獲取
F getBillCardPanelWrapper().getBillCardPanel().getBodyValueAt(rowIndex, "strKey")。其中rowIndex為要獲取字段所在的行。
F 卡片下獲取表體相應頁簽下的字段:getBillCardPanel().getBodyItem("plh_topics_b2", "nitemmny")
F 獲取單據模板上定義的所有字段
nc.vo.pub.bill.BillTempletBodyVO[] tbodyvos = nc.vo.pub.bill.BillTempletBodyVO[]) billCardPanel.getTempletData().getChildrenVO();
賦值
為表體某行某個字段賦值:
F 聚合VO.setItemValue(行索引值, “字段名”, 值);
F getBillCardPanel().setBodyValueAt(aValue, row, strKey);
aValue:為要賦的值; row:為所在的行;strKey:為字段名;
注意:
得到表體上的值,得到的類型是object類型的。要進行一下轉換(),但是不能直接轉:如下getBillCardPanel().getHeadItem(“字段名”).getValueObject().toString();這樣轉是容易出錯。正確定的轉換方式為:Object obj = getBillCardPanel().getHeadItem("pk_npic_schedule_id").getValueObject();
String pk_contract=obj==null?"":obj.toString();
1.4.16 字段設置可編輯:
getBillCardPanel().getBodyItem("字段名").setEdit(true);
1.4.17 隱藏字段
getBillCardPanel().hideBodyTableCol("bodyitem");
代碼設置卡片狀態下表頭和表體某一字段的編輯狀態:
// 表頭
getBillCardPanel().getHeadItem("").setEdit(false);
// 表體
getBillCardPanel().getBillModel().setCellEditable(row,"nqichunum",false);
1.4.18 設置精度
// 先獲取BillModel
nc.ui.pub.bill.BillModelbm = getReportBase().getBillModel();
// 通過以下方法設置精度
bm.getItemByKey(key).setDecimalDigits(3);
1.4.19 將UFDouble顯示為小數點后2位的操作
UFDouble().setScale(2, UFDouble.ROUND_HALF_UP); //保留小數點后2位,並“四舍五入”
1.4.20 設置字段焦點
表頭字段:
getBillCardPanel().getHeadItem("jobname").getComponent().requestFocus()
表體字段:
其中參數mm和ii是表體的行和列
getBillCardPanel().getBillTable().setColumnSelectionInterval(m,m); getBillCardPanel().getBillTable().setRowSelectionInterval(i,i);
2.4 公式
1.4.21 執行、設置公式:
F getBillCardPanel().execHeadFormula(formula),其他方法請參照getBillCardPanel().或getBillListPanel()中的針對公式的方法。
1.4.22 公式解析器:
F 參照紅皮書《NCV5-公式技術紅皮書》
2.5 單據行操作
1.4.23 獲取表體選擇行
F 獲取表體的選中行的行號getBillCardPanelWrapper().getBillCardPanel().getBillTable().getSelectedRow();或getBillCardPanelWrapper().getBillCardPanel().getBodyPanel().getTable().getSelectedRow();
F 獲取編輯行getBillCardPanelWrapper().getBillCardPanel().getBillTable().getEditingRow()
F 獲取總行數getBillCardPanelWrapper().getBillCardPanel().getBillTable().getRowCount()
F 獲取列表多條記錄的方法
1、int[] selectRows = ((BillManageUI) getBillUI()).getBillListPanel().getHeadTable().getSelectedRows();
2、 ((BillManageUI) getBillUI()).getBillListPanel().getHeadBillModel().getBodySelectedVOs(DemoYsHVO.class.getName());
其中,方法1只在Ctrl、Shift多選時能取到多條記錄的行號。方法2都能取到多選記錄的VO。
1.4.24 刪除表體的自動排序
F getBillCardPanel().getBillTable().setSortEnabled(false);
F 卡片和列表下的排序方法(TRUE:升序;FALSE:降序)
列表:getBillListWrapper().getBillListPanel().getBodyBillModel().setSortColumn("vdef21");
卡片:getBillCardPanelWrapper().getBillCardPanel().getBillModel().sortByColumn("reserve6", true);
F 鎖定頁面排序:
getBillTable().setSortEnabled(false);
1.4.25 行編輯狀態:
F getBillCardPanelWrapper().getBillCardPanel().getBillModel().setRowEditState(true)
F 設置表格為行不可編輯狀態:
getBillCardPanelWrapper().getBillCardPanel().getBillModel().setNotEditAllowedRows(rows);
rows是一個INT類型的數組
F 終止編輯getBillCardPanel().stopEditing();
1.4.26 選中表體所有行
BillCardPanel card = getBillCardPanel();
card.getBillTable("uap_quotarev_b").selectAll();
1.4.27 列表下,表頭行可多選的實現
//設置列表多選框
getBillListPanel().setMultiSelect(true);
//設置列表Ctrl、Shift多選
getBillListWrapper().getBillListPanel().getHeadTable().
setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
1.4.28 行操作(刪除,增行等)
F 刪行 getBillCardPanel().delLine();getBillCardPanel().getBodyPanel("plh_presstask_b6").delLine();
F 增行getBillCardPanel().addLine();getBillCardPanel().getBodyPanel("plh_presstask_b6"). addLine ();
F 行操作不可用:getButtonManager().getButton(IBillButton.Line).setVisible(false);
F 更新行操作按鈕:getBillUI().updateButton(getButtonManager().getButton(IBillButton.Line));
F 清空表體行:
getBillCardPanel().getBillTable().selectAll();
getBillCardPanel().delLine();
F 列表多行選擇: getBillListPanel().setMultiSelect(true);
F BillListPanel.setParentMultiSelect(true);
F 單據列表支持選中多行:
getBillListPanel().getHeadTable().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
2.6 獲取系統相關
1.4.29 常量的獲取(公司,操作員,時間)
F 得到當前登錄公司的主鍵(UI):
ClientEnvironment.getInstance().getCorporation().getPrimaryKey();
getClientEnvironment().getCorporation().pk_corp.toString();
F 得到當前登錄用戶的主鍵(UI):
ClientEnvironment.getInstance().getUser().getPrimaryKey();
F 公司主鍵:ClientEnvironment.getInstance().getCorporation().getPrimaryKey();
getBillUI()._getCorp().getPrimaryKey();
F 操作員主鍵:ClientEnvironment.getInstance().getUser().getPrimaryKey();
getBillUI()._getOperator();
F 服務端時間:ClientEnvironment.getServerTime();
getBillUI().getServerTime();
SFServiceFacility.getServiceProviderService().getServerTime().toString()
F 客戶端日期:ClientEnvironment.getInstance().getDate();
getBillUI().getDate();
1.4.30 單據號的獲取
F 前台:billNo = HYPubBO_Client.getBillNo(單據類型, 公司ID, null, null);
F 后台:
1、nc.bs.pub.billcodemanage.BillcodeGenerater gene = new nc.bs.pub.billcodemanage.BillcodeGenerater ();String billcode = gene.getBillCode (單據類型,公司ID,null,null)
2、String billNo = new nc.bs.trade.business.HYPubBO().getBillNo(單據類型, 公司ID,null,null);
2.7 程序健壯性及易用性
1.4.31 單據保存時強制調用非空驗證方法:
getBillCardPanelWrapper().getBillCardPanel().dataNotNullValidate()
1.4.32 彈出消息框代碼:
在UI類中:showWarningMessage(“提示消息”);showHintMessage(“狀態欄上的消息”);
在EventHandler類中:getBillUI().showErrorMessage(“提示消息”);
1.4.33 在編輯事件中常用的判斷
判斷是不是對表體進行的編輯: e.getPos()==IBillItem.BODY或者e.getPos()==0
判斷是不是對表體進行的編輯: e.getPos()==IBillItem.HEAD或者e.getPos()==1
判斷是對單據上哪個字段進行的編輯: “字段名“.equals(e.getKey());
1.4.34 設置表體沒有右鍵菜單方法
BillCardPanel.setBodyMenuShow(false);
第三章 高級篇
3
3.1 審批流
1.4.35 審批流開發注意事項
1) 開發帶審批流單據,單據上必須包含以下字段
字段編碼 |
中文名 |
數據類型 |
是否必輸 |
說明 |
pk_corp |
公司ID |
char(4) |
N |
|
vbillno |
單據號 |
varchar(20) |
Y |
|
dbilldate |
單據日期 |
char(10) |
N |
|
voperatorid |
操作人 |
char(20) |
N |
|
pk_billtype |
單據類型 |
varchar(4) |
|
|
pk_busitype |
業務類型 |
char(20) |
|
|
vbusicode |
業務編碼 |
varchar(20) |
|
|
vbillstatus |
單據狀態 |
smallint |
|
|
vapproveid |
審核人 |
char(20) |
|
|
dapprovedate |
審核日期 |
char(10) |
|
|
vapprovenote |
審核批語 |
varchar(100) |
|
|
vmodifiid |
修改人 |
char(20) |
|
|
dmodifidate |
修改日期 |
char(10) |
|
|
tlastmodifitime |
修改時間 |
char(19) |
|
|
dr |
刪除標志 |
smallint |
N |
|
ts |
時間戳 |
char(19) |
N |
|
2) 單據如果要在審批過程中進行一些回寫和其他邏輯必須指定一個審批后台類,指定審批后台類的放入如下:
圖中那個畫圈的DMO類就是后天審批流的檢查類,里面提供了審批流執行中各個環節的方法。審批中要處理的邏輯就在這個類中寫。
如果某個單據要在審批中做業務處理,就參照產品的其他單據的DMO類仿寫一個類在自己的單據類型上進行指定,然后在相應的方法中寫具體的業務代碼。
DMO類的主要幾個方法說明如下:
1) checkPass: 流程結束,整個單據審批通過。
2) checkNoPass:流程結束,整個單據審批不通過。
3) checkGoing: 流程運行中,單據審批進行中。
4) checkCommit: 單據提交方法。
5) backNoState:單據棄審方法。
6) backGoing:審批流接口方法:實現逐級棄審時匹配的接口方法。
3.2 后台預警
1.4.36 后台預警插件開發方法
新增加的業務插件類必須繼承IBusinessPlugin接口,在implementReturnObject方法中構造自己的預警方法體,需要預警的時候再返回一個非空的P2PAlartMessage對象。
3.3 后台任務
1.4.37 后台任務插件開發方法
新增加的后台任務類必須繼承IBackgroundWorkPlugin接口,在executeTask這個方法中添加后台任務的具體邏輯。返回一個字符串類型的任務處理信息。
3.4 消息
1)消息的存儲表在pub_workflownote
3.5 錯誤定位(日志分析)