本文目錄:
一)項目背景
二)項目需求說明
三)項目開發過程
四)項目成果演示
五)項目補充說明
正文:
一)項目背景
由於某公司實行新的費用制度,涉及部門的年終考覈事項,考覈部門需要根據各個部門的費用實際使用情況做預算,分析,統計,指標評估,作爲公司降本節支的重要依據,最大限度的降低公司的運營成本。費用分攤項目應運而生,由於人力不足,一切簡單從簡,以滿足最基本的需求爲目標,遵循流程簡化,界面簡潔,操作簡單爲基本原則,進行小型系統開發。
二)項目需求說明
項目需求主要來源於XXX部的實際工作需要,簡單介紹如下:
1)總體需要:能登記各個部門的實際發生的費用明細,具體如:商品的基本資料(名稱,規格,品牌,單價,數量,金額,承擔部門等等);招待費用,車輛派遣(車牌號,車型,司機,公里數,費用發生額等);錄入時指定特定部門或者人員,可以查詢,需要經過相關審覈(部門審覈,上級領導審覈)。
2)費用錄入要求如下:
表 2-1 費用錄入說明
說明:公司費用大致分爲這四大類,即:日常費用,招待費用,物流日常費用(指物流部門的日常費用),商務車費用,錄入時根據此分類對應錄入系統即可。
3)費用分類資料細則說明:(部分,樣式表)
表 2-2 費用分類資料細則
說明:費用分類統一編號由錄入部門決定,例如:人力資源部錄入費用編號以10開頭,財務部錄入費用編號以20開頭……等。
4)費用明細如下:
表 2-3 費用細則說明
說明:錄入的時候,需要存儲,如:人力資源部登記福利費的時候需要說明是什麼?婦女節,生日福利,……做查詢的時候,只需要看到福利費,以費用編號爲最小單位統計依據,不再進行細分。
5)錄入和審覈需求如下:
表 2-4 錄入與審覈要求說明
說明:任何費用必須由部門領導審覈,分管領導審覈需要滿足一定條件,如某筆費用發生額超過規定額時,才需要上級領導審覈。有些費用需要指定某部門某專員錄入,如商務車費用只能由物流事業部相關人士錄入等。
三)項目開發過程
分析相關需求,與提供相關需要的人員進行多次多次溝通,進行簡單的相關的設計。
1)邏輯分析:
哪些人屬於哪個部門,是否擁有系統的使用權限,系統的權限分哪些等級?==>人員,部門,人員與部門關係等基礎資料;可以在給人員分配部門的同時分配系統使用權限;
哪些費用有哪些部門哪些人錄入,需要什麼相關審覈?==>費用明細的基礎資料,費用錄入生成相關單據,審覈流水確定需要考慮部門的相關負責人等。
生成的單據的編號,新增用戶,部門的相關編號怎麼產生?單據審覈節點判斷?==>存儲過程,標量值函數實現。
哪些人可以查詢什麼費用?==>費用的相關查詢,暫定只能普通用戶看到本部門的費用信息。
2 )數據庫設計:有邏輯分析不難得出本系統需要的基礎表及其相關存儲過程,函數。
圖 3-1 數據庫設計
詳細說明,此處略去。
3)模塊設計,如圖所示:
圖 3-2 模塊設計
相關說明:基礎資料維護(1)包括:
人員維護:新增,查詢,保存,修改,修改用戶密碼,刪除,關閉等基本功能;
部門維護:新增,查詢,保存,修改,刪除,關閉等基本功能;
人員部門維護:新增,查詢,保存,修改,刪除,關閉等基本功能;
費用項目維護:新增,查詢,保存,修改,刪除,關閉等基本功能;
費用項目登記(2)包括:
日常費用錄入:新增,保存,修改,刪除,關閉等基本功能;
招待費用錄入:新增,保存,修改,刪除,關閉等基本功能;
物流日常費用錄入:新增,保存,修改,刪除,關閉等基本功能;
商務車費用錄入:新增,保存,修改,刪除,關閉等基本功能;
特別說明:所有單據一旦被審覈,均不能被修改或者刪除。
費用審覈審覈流程(3)包括:
部門審覈:查詢,審覈通過,審覈不通過,退出等基本功能;
分管領導審覈:查詢,審覈通過,審覈不通過,退出等基本功能;
總經理審覈:查詢,審覈通過,審覈不通過,退出等基本功能;
費用查詢(4),主要用於查詢,可以看到費用明細,審覈進度等,有待進一步細分,本系統只是初稿,後期會有擴充。
退出(5):退出本系統並關閉;
關於(6):計算器功能,屬於輔助功能擴展。
說明:本系統分四個角色,分別擁有不同的模塊,介紹如下:
a)管理員:權限最大,擁有系統的全部功能(1)--(6);(說明:(1)代表模塊基礎資料維護)
b)審覈:擁有模塊(2)(3)(4)(5)(6);
c)錄入:擁有模塊(2)(4)(5)(6);
d)查詢:權限最小,擁有模塊(4)(5)(6);
總體設計圖如下:
圖 3-3 總體設計
4)代碼設計(略)(列幾個比較常用的,希望對初學者有所幫助)
SQL基本操作:(SQLHelper.cs)
參見:http://zhangbc.blog.51cto.com/6066576/1401228
EXEel導出功能:(untCommon.cs)
參見:http://zhangbc.blog.51cto.com/6066576/1401234
treeNode相關用法(這是本次寫代碼的一次重要收穫):
private void getBm(TreeNode treenode) { treenode.Text = "組織機構 "; treenode.NodeFont = new Font("楷體", 14, FontStyle.Underline | FontStyle.Bold); DataSet ds = new DataSet(); jc_bmdoc bm = new jc_bmdoc(); ds = bm.getList(" and beactive='是'"); DataTable dt=ds.Tables[0]; for (int i = 0; i < dt.Rows.Count; i++) { treenode.Nodes.Add(dt.Rows[i][2].ToString().Trim()); } } private void hr_Bmzhygw_Load(object sender, EventArgs e) { this.tvBM.LabelEdit = true; TreeNode node = new TreeNode(); getBm(node); tvBM.Nodes.Add(node); tvBM.ExpandAll(); } private void tvBM_AfterSelect(object sender, TreeViewEventArgs e) { jc_bmzhygx bmzg = new jc_bmzhygx(); DataSet ds = new DataSet(); dvZhiydoc.DataSource = null; ds = bmzg.getList(e.Node.Text.ToString().Trim(),1); //MessageBox.Show(e.Node.Text);//獲取選擇中節點的內容 dvZhiydoc.DataSource = ds.Tables[0]; }
獲得漢字的助記碼:(SQL標量值函數)
參見:http://zhangbc.blog.51cto.com/6066576/1401258
單據錄入功能:(事務處理,這是本次寫代碼的又一次重要收穫)
private void djSave_Click(object sender, EventArgs e) { using (System.Transactions.TransactionScope TranSop = new System.Transactions.TransactionScope())//開始事務 { try { getDjhz(); try { for (int i = 0; i < dvRcfy.Rows.Count - 1; i++) { #region djmx.djbh = djhz.djbh; djmx.dj_sort = dvRcfy.Rows[i].Cells["dj_sort"].Value.ToString(); djmx.fylx = ""; djmx.is_zx = "否"; try { djmx.fybh = dvRcfy.Rows[i].Cells["fybh"].Value.ToString(); } catch { ut.InfoMsg("費用編號不能爲空!"); return; } try { djmx.fymch = dvRcfy.Rows[i].Cells["fymch"].Value.ToString(); } catch { ut.InfoMsg(dvRcfy.Rows[i].Cells["fymch"].Value.ToString() + "費用名稱不能爲空!"); return; } try { djmx.shpgg = dvRcfy.Rows[i].Cells["shpgg"].Value.ToString(); } catch { ut.InfoMsg("規格不能爲空!"); return; } try { djmx.zrbm = dvRcfy.Rows[i].Cells["zrbm"].Value.ToString(); } catch { ut.InfoMsg("費用承擔部門不能爲空!"); return; } if ((decimal)dvRcfy.Rows[i].Cells["dj"].Value == 0) { ut.InfoMsg("單價不能爲0!"); return; } else { djmx.dj = (decimal)dvRcfy.Rows[i].Cells["dj"].Value; } if ((decimal)dvRcfy.Rows[i].Cells["shl"].Value == 0) { ut.InfoMsg("數量不能爲0!"); return; } else { djmx.shl = (decimal)dvRcfy.Rows[i].Cells["shl"].Value; } djmx.je = (decimal)dvRcfy.Rows[i].Cells["je"].Value; try { djmx.pinp = dvRcfy.Rows[i].Cells["pinp"].Value.ToString(); } catch { djmx.pinp = ""; } djmx.chph = ""; djmx.chex = ""; djmx.yongt = ""; djmx.days = 0; djmx.distance = 0; djmx.chlr = ""; djmx.gangw = ""; try { djmx.beizhu = dvRcfy.Rows[i].Cells["beizhu"].Value.ToString(); } catch { djmx.beizhu = ""; } #endregion dj_mx.Insert(djmx); } if(djhz.app_bm==""||djhz.shenqr==""||djhz.lyr=="") { ut.InfoMsg("擡頭不能有空項!"); return; } if (dvRcfy.Rows.Count <= 1 || dj_hz.Insert(djhz) == 0) { ut.InfoMsg("保存失敗!"); return; } dj_hz.Insert(djhz); ut.InfoMsg("保存成功!"); } catch (Exception ex) { ut.ErrorMsg("新增失敗,請檢查!" + ex.ToString()); } TranSop.Complete(); } catch (Exception ex) { MessageBox.Show("錯誤原因:\n"+ex.ToString()); TranSop.Dispose(); } } clear(); }
四)項目成果
1)系統登陸界面相關:
圖 4-1 登陸入口
圖 4-2 登陸信息
2)系統主界面相關:
圖 4-3 部門職員信息維護
圖 4-4 單據錄入界面
圖 4-5 單據審覈
圖 4-6 費用查詢
五)項目補充說明
本小系統基本達到預定目標,新手上路,歷時將近一個月,收穫頗多,後期將有許多需求都很在此基礎擴展(如統計報表等),但仍有很多有待改進之處,歡迎各位指正,不甚感激!
完整demo及其代碼不便分享,敬請諒解!