1. 程式人生 > >只是因為在人群中多看了你一眼.......

只是因為在人群中多看了你一眼.......

NC客戶化開發手冊

本手冊是北京齊力創輝科技發展有限公司(TTS)內部培訓資料,只限於公司內部應用,任何人未經過書面許可不得擴大本教程的使用範圍。嚴禁任何非法傳播、翻印或仿製,違者必究!

©本手冊的著作權屬於北京齊力創輝科技發展有限公司

前言

目錄

前言 1

第一章 規範篇

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例項中。

第二章 基礎篇

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物件,然後再呼叫EventHandlergetBufferData()獲取快取資料。

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 通過VOclassName

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);   billVOAggregatedValueObject型別

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

表體欄位:

其中引數mmii是表體的行和列

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 獲取列表多條記錄的方法

1int[] selectRows = ((BillManageUI) getBillUI()).getBillListPanel().getHeadTable().getSelectedRows();

2、 ((BillManageUI) getBillUI()).getBillListPanel().getHeadBillModel().getBodySelectedVOs(DemoYsHVO.class.getName());

其中,方法1只在CtrlShift多選時能取到多條記錄的行號。方法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);

//設定列表CtrlShift多選

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 後臺:

1nc.bs.pub.billcodemanage.BillcodeGenerater gene  = new nc.bs.pub.billcodemanage.BillcodeGenerater ();String billcode  = gene.getBillCode (單據型別,公司ID,null,null)

2String 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.setBodyMenuShowfalse);

第三章 高階篇

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 錯誤定位(日誌分析)

相關推薦

只是因為人群一眼.......

NC客戶化開發手冊 本手冊是北京齊力創輝科技發展有限公司(TTS)內部培訓資料,只限於公司內部應用,任何人未經過書面許可不得擴大本教程的使用範圍。嚴禁任何非法傳播、翻印或仿製,違者必究! ©本手冊的著作權屬於北京齊力創輝科技發展有限公司 前言 目錄 前言 1

人群一眼

資料結構設計 1.設計一個魔方(六面)的程式 思路: 把魔方從正面看展開成一個平面,如圖1所示。設計一個類,其中Spacexy[SPACE][LEN][LEN];中的SPACE為0~5表示六個面,每個數字代表哪一面見圖1.LEN為0~2,[LEN][LEN

【春華秋實】.NET Core之只是一眼

solid 服務器環境 開放源代碼 私有 creat 針對 otto 展示 由於 感官初體驗 技術學習是一件系統性的事情,如果拒絕學習,那麽自己就會落後以至於被替代。.NET也是一樣,當開源、跨平臺成為主流的時候,如果再故步自封,等待.NET的就是死路一條,幸好.NET

蘋果稽核ipv6到底有坑?會少走很多路。

蘋果6月1日出的IPV6協議阻礙了國內大多數積極開發者,我司也不外乎,遂在網上查詢關於IPV6稽核的相關事宜,怪我年少無知以為這種開源協議的東西應該是免費的,當然,我說的免費是想著看幾篇成熟的IPV6

Linux用戶和權限管理就會用啦

CQ user In zhong bit 學習 pass table Go 前言 只有光頭才能變強 回顧前面: 看完這篇Linux基本的操作就會了 沒想到上一篇能在知乎獲得千贊呀,Linux也快期末考試了,也有半個月沒有寫文章了。這篇主要將Linux下的用戶和權限知

學Java培訓,要英語基礎嗎?就明白

有人問這樣的問題:英語成績差可以學Java嗎?英語不好影響Java學習嗎?到睿峰諮詢Java課程的同學也常常有這樣的擔憂,經常有人問到成都Java培訓機構學習要英語基礎嗎?今天就告訴大家答案。 到成都Java培訓機構學習要英語基礎嗎?答案是肯定的,每個人的心裡也是明白的,畢竟所有的程式設計程式碼都是由英語單

每日踩坑 2018-11-26 MVC Razor ActionLink 生成的URL生成一個引數 ?length=n

RouteConfig 的路由註冊如下: routes.MapRoute( name: "Default", url: "{controller}/{action}", def

扎心!為何HR的簡歷卻不通知面試?

 還只是老老實實地寫簡歷、投簡歷、默默地等待面試通知?那只有兩種可能:你太天真;或者是,你真的很久沒有“求職”了。如果你細心觀察會發現,當你完成一份簡歷之後,它的狀態也會有變化。然而,卻有很多求職者並沒有搞清楚這些“狀態”到底代表著什麼,但小編可以負責任地告訴你們:這些

深度學習模型stacking模型融合python代碼,就會使

shuffle The max and ots shape onf 第一個 求平均值 話不多說,直接上代碼 1 def stacking_first(train, train_y, test): 2 savepath = ‘./stack_op{}_dt

各式各樣的裙子畫法!保證會畫好裙子!

漫畫女性人物裙子怎麼畫?裙子那種翩翩然的感覺,要畫出立體感不容易,本來就不太清楚是什麼形狀,所以畫出來會變成奇怪的樣子,裙子的畫法

Java線程只要這一篇就夠

== 討論 cin 線程池。 locking nth lis dset tro 引 如果對什麽是線程、什麽是進程仍存有疑惑,請先Google之,因為這兩個概念不在本文的範圍之內。 用多線程只有一個目的,那就是更好的利用cpu的資源,因為所有的多線程代碼都可以用單線程來實現。

轉:Java線程只要這一篇就夠

無法 線程不安全 str his ace oat 情況下 containe live 如果對什麽是線程、什麽是進程仍存有疑惑,請先Google之,因為這兩個概念不在本文的範圍之內。 用多線程只有一個目的,那就是更好的利用cpu的資源,因為所有的多線程代碼都可以用單線程來實現

Java執行緒只要這一篇就夠(轉)

引 如果對什麼是執行緒、什麼是程序仍存有疑惑,請先Google之,因為這兩個概念不在本文的範圍之內。 用多執行緒只有一個目的,那就是更好的利用cpu的資源,因為所有的多執行緒程式碼都可以用單執行緒來實現。說這個話其實只有一半對,因為反應“多角色”的程式程式碼,最起碼每個角色要給他一個執行緒吧,否

Java執行緒只要這一篇就夠

/** * 生產者生產出來的產品交給店員 */ public synchronized void produce() { if(this.product >= MAX_PRODUCT) { try {

Java 執行緒只要這一篇就夠

如果對什麼是執行緒、什麼是程序仍存有疑惑,請先Google之,因為這兩個概念不在本文的範圍之內。 用多執行緒只有一個目的,那就是更好的利用cpu的資源,因為所有的多執行緒程式碼都可以用單執行緒來實現。說這個話其實只有一半對,因為反應“多角色”的程式程式碼,最起碼每個角色要給他一個

Java 線程只要這一篇就夠

並發 進入 事務 相同 人工 出了 研究 class pool 引 如果對什麽是線程、什麽是進程仍存有疑惑,請先Google之,因為這兩個概念不在本文的範圍之內。 用多線程只有一個目的,那就是更好的利用cpu的資源,因為所有的多線程代碼都可以用單線程來實現。說這個話其實只有

執行緒(本文轉載而來) Java執行緒只要這一篇就夠

Java中的多執行緒你只要看這一篇就夠了    引 如果對什麼是執行緒、什麼是程序仍存有疑惑,請先Google之,因為這兩個概念不在本文的範圍之內。 用多執行緒只有一個目的,那就是更好的利用cpu的資源,因為所有的多執行緒程式碼都可以用單執行緒來實現。說

Java長見到的面試題,能答出幾題,就知道自己有

作者:Java3y 前言 只有光頭才能變強 Redis目前還在看,今天來分享一下我在秋招看過(遇到)的一些面試題(相對比較常見的) 0、final關鍵字 簡要說一下final關鍵字,final可以用來修飾什麼? 這題我是在真實的面試中遇到的,當時答得不太好,現在來整理一

iOS關鍵字copy與mutableCopy的詳解,就都懂

對於有一定iOS開發經驗的同學來說,對於copy關鍵字一定不陌生,從字義上來看,應該就是複製一個物件,然後我們對於NSString型別的屬性,一般也用copy關鍵字。但是大家對於copy關鍵字真正有什麼具體瞭解呢,什麼時候用copy,什麼時候用mutableCopy,區別又在

這個有趣的例子,就秒懂執行緒同步

[TOC] #### 寫在前面 - 把技術概念通過文字的形式寫下來,理清邏輯,加深認知; - 把知識點通過系列文章的形式分段寫下來,讓思維進行刻意的訓練; - 把難懂的東西通過有趣的故事或者例子講出來,讓技術變得生動。 #### 電影票的案例 ##### 單執行緒的例子 我們設定有一個電影院,該電影