過去我們使用過一些周報工具來完成項目組或部門的周報填寫與考核工作,但多少有些不理想,要么功能太過簡單,要么功能特別繁雜,不接地氣,使用不便。
后來我們就考慮自己開發一個簡單的,實用的,易用的,接地氣的周報填報考核系統。
一開始預想比較簡單,就是些簡單的增刪改查,但是做下來會發現,把一件產品做好,不管他是簡單是復雜,想要做好,都是需要投入巨大的時間和精力的。
技術選型:
ASP.NET MVC + Razor 視圖引擎,jQuery,數據庫 SQL Server 2008 R2
微軟企業庫
數據訪問層使用了自有ORM解決方案
表結構設計:
除了基本的組織機構,角色,人員,權限這些表以外,周報的表使用了一對多的兩張關進行關聯,一張主表用於存儲周報主要信息,子表用於存儲周報的內容條目,也就是說一個周報,是多條數據組織匯總起來的。
為了方便對數據的統計分析和查詢,周報表中對周次,日期,年月等做了冗余。
使用 ASP.NET MVC Razor 來開發 WEB 畫面,非常的簡單高效,只要在視圖頂部聲明視圖所使用的模型類,就可以在此視圖中直接訪問模型類實例中的數據。
在 JavaScript 腳本中訪問模型中的數據:
使用 Razor 語法輸出HTML
使用 Razor 視圖引擎開發WEB應用的生產性非常的高,代碼可讀性好,結構工整。
此外,周報系統一個通用的底層功能就是對周次的計算,直接貼出代碼如下:
/// <summary> /// 獲取指定日期,在為一年中為第幾周 /// </summary> /// <param name="dt">指定時間</param> /// <reutrn>返回第幾周</reutrn> public static int GetWeekOfYear(DateTime dt) { GregorianCalendar gc = new GregorianCalendar(); int weekOfYear = gc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Monday); return weekOfYear; } /// <summary> /// 獲取指定日期為當月的第幾周 /// </summary> /// <param name="dt"></param> /// <param name="weekStart"></param> /// <returns></returns> public static int GetWeekOfMonth(DateTime dt) { int weekStart = 1; //WeekStart //1表示 周一至周日 為一周 //2表示 周日至周六 為一周 DateTime FirstofMonth; FirstofMonth = Convert.ToDateTime(dt.Date.Year + "-" + dt.Date.Month + "-" + 1); int i = (int)FirstofMonth.Date.DayOfWeek; if (i == 0) { i = 7; } if (weekStart == 1) { return (dt.Date.Day + i - 2) / 7 + 1; } if (weekStart == 2) { return (dt.Date.Day + i - 1) / 7; } return 0; //錯誤返回值0 } /// <summary> /// 計算本周起始日期(禮拜一的日期) /// </summary> /// <param name="someDate">該周中任意一天</param> /// <returns>返回禮拜一日期,后面的具體時、分、秒和傳入值相等</returns> public static DateTime CalculateFirstDateOfWeek(DateTime someDate) { int i = someDate.DayOfWeek - DayOfWeek.Monday; if (i == -1) i = 6;// i值 > = 0 ,因為枚舉原因,Sunday排在最前,此時Sunday-Monday=-1,必須+7=6。 TimeSpan ts = new TimeSpan(i, 0, 0, 0); return someDate.Subtract(ts); } /// <summary> /// 計算本周結束日期(禮拜日的日期) /// </summary> /// <param name="someDate">該周中任意一天</param> /// <returns>返回禮拜日日期,后面的具體時、分、秒和傳入值相等</returns> public static DateTime CalculateLastDateOfWeek(DateTime someDate) { int i = someDate.DayOfWeek - DayOfWeek.Sunday; if (i != 0) i = 7 - i;// 因為枚舉原因,Sunday排在最前,相減間隔要被7減。 TimeSpan ts = new TimeSpan(i, 0, 0, 0); return someDate.Add(ts); }
最終完成功能與效果:
一:周報的填寫;
1)周報中的“工作類型”、“工作任務”、“完成情況”作為基礎數據自由配置;
2)“工作類型”、“工作任務”只需簡單設置名稱即可,無需繁雜的參與人負責人進度時間等數據,術業有專攻,這部分工作交給項目管理軟件處理,此外,周報與績效考核的使用場景不單單是項目研發,行管團隊或傳統企業一般不需要有“項目”的概念,只需一個工作分類即可。
3)可按組織機構或按個人對周報進行查詢;
二:考核功能
1)可自由設置人員之間的考核關系,不和組織機構綁定,因為多數時候項目領導或部門領導都不會直接考核每一個人,另外也存在人員臨時借調的情況,與組織機構並不一定完全一致;
2)考核項可自由配置,可根據自身需求自行添加要考核的項,如工作完成情況,工作質量,是否加班等,考核結果可設置分值,用於績效統計;
三:統計
1)根據指定的時間段,對指定組織機構中的人員經過考核的周報進行匯總,並將考核得分累計排名,人員的工作績效情況一目了然。
四:其它
完整的組織機構管理,人員管理,角色權限管理功能,可在此基礎上繼續開發。
截圖:
填寫周報:
注意,填寫周報前,需要到“設置”下的“周報”中,添加工作類型,工作任務等基礎數據。
如果該周報經過審核,則不再允許修改,並顯示審核結果。
按組織機構查詢:
按個人查詢:
考核:
支持考核與撤銷考核,考核之后該周報不再允許修改,撤銷考核后填寫人可以再次修改周報。
注意:圖中的“完成質量”、“完成情況”、“工作狀態”、“加班”這些考核項目,是在“設置”下的“周報”中自行定義的。
統計:
統計中的得分項目是根據考核項生成的,而考核項允許自定義。
設置工作類型/任務
設置考核項目
設置考核關系
分配角色與權限