Các công việc chính trong công ty:
Phòng hành chính, kế toán, nhân sự thực hiện các công việc liên quan đến nhân sự, kế toán, kế hoạch tài vụ…
Phòng kinh doanh chủ yếu ký kết hợp đồng và tìm kiếm khách hàng
Phòng biên tập đưa nội dung tin tức lên các website nội bộ của công ty
Phòng kỹ thuật được chia thành các nhóm khác nhau, phụ trách việc phát triển ứng dụng, thiết kế đồ họa.
Quy trình hoạt động:
Nhân viên kinh doanh tìm kiếm khách hàng, cập nhật và chuyển hợp đồng cho bộ phận kế toán kiểm tra, duyệt hợp đồng.
Nếu hợp đồng được duyệt, sẽ chuyển tiếp cho các bộ phận thiết kế, trưởng nhóm thiết kế sẽ tiếp nhận và phân công thiết kế. Khi kết thúc thiết kế, bộ phận kỹ thuật sẽ tiếp nhận công việc.
Trưởng nhóm kỹ thuật sau khi tiếp nhận hợp đồng sẽ phân công công việc lập trình cho các cá nhân khác trong phòng ban.
Sau khi lập trình và test xong, bộ phận kỹ thuật sẽ chuyển cho bộ phận chăm sóc khách hàng làm việc đến khi hợp đồng được chấp nhận. Giữa các bộ phận sẽ xảy ra trường hợp hủy yêu cầu nếu chưa đạt.
Các kiểu công việc và hợp đồng bao gồm:
Theo quy trình: Các công việc được thực hiện khi nhận được hợp đồng dưới dạng dịch vụ như: hợp đồng Domain hosting, hợp đồng quảng cáo Google adwords, hợp đồng Bizweb
Công việc trực tiếp: Là các công việc được giao trực tiếp giữa các cá nhân
Công việc theo dự án: Phụ thuộc vào quản lý dự án phân công, tùy từng dự án cụ thể.
Dưới đây là một số đặc tả quy trình làm việc trong công ty DKT:
Trước khi vào workflow: Nhân viên kinh doanh tiếp cận khách hàng, gửi tài liệu, site demo, lấy thông tin
Gửi tài liệu hướng dẫn sử dụng
Điền các thông tin thu được vào phiếu yêu cầu của khách hàng
Thông nhất với khách hàng về giá cả....
Hình 20: Quy trình dịch vụ Bizweb trong công ty DKT
Chuẩn bị hợp đồng:
Kinh doanh nhập thông tin khách hàng lên hệ thống, chọn loại hợp đồng tương ứng để triết ra hợp đồng tương ứng
Sau khi ký hợp đồng, Kinh doanh vào chọn loại hợp đồng, thông tin khách hàng đã lưu để tạo hợp đồng ban đầu (Bắt đầu bước 1)
Bƣớc 1
Kinh doanh tạo hợp đồng mới trên hệ thống, với các thông tin (thông tin khách hàng, thông tin hợp đồng, file đính kèm…)
Hợp đồng vẫn đang ở trạng thái “Hợp đồng mới” thì Kinh doanh vẫn có thể chỉnh sửa, cập nhật thông tin, hay xóa hợp đồng được.
Bƣớc 2
Sau khi có hợp đồng mới, màn hình của kế toán hiện lên hợp đồng, kế toán vào xem hợp đồng và xác nhận hợp đồng. Nếu Hợp đồng không hợp lệ, kế toán “không xác nhận” hợp đồng và sẽ chuyển trạng thái “Chờ xác nhận”
Màn hình của kinh doanh hiện hợp đồng không được xác nhận, kinh doanh thống nhất lại hợp đồng và cập nhật thông tin để kế toán xác nhận lại
Việc này chỉ dừng lại khi kế toán chấp nhận xác nhận cho hợp đồng
Hợp đồng chuyển trạng thái “Đang thiết kế” và chuyển sang trưởng nhóm thiết kế
Bƣớc 3
Sau khi nhận được Hợp đồng ở trạng thái “Đang thiết kế”, trưởng nhóm thiết kế sẽ: Xem các thông tin đính kèm trên bản hợp đồng, xem xét và tiến hành phân công công việc cho các nhân viên thiết kế đồng thời đưa ra hạn hoàn thành cho nhóm thiết kế
Trong quá trình làm nếu có yêu cầu nào đột xuất từ khách hàng về thiết kế, trạng thái hợp đồng vẫn giữ “Đang thiết kế” , việc này được lưu lại dưới dạng “comment” hoặc “tài liệu thêm” cho hợp đồng
Nếu hết thời gian mà thiết kế chưa hoàn thành thì vẫn chuyển trạng thái hợp đồng về “Chờ thiết kế”
Nhóm thiết kế hoàn thành, nhưng kinh doanh và chăm sóc khách hàng bổ sung thêm về việc làm chưa đúng yêu cầu khách hàng, thì sẽ chuyển trạng thái hợp đồng về “Chờ thiết kế”
Chỉ đến khi nhóm thiết kế, kinh doanh, chăm sóc khách hàng thống nhất về việc hoàn thành bản thiết kế đã đúng yêu cầu thì chuyển hợp đồng về trạng thái “đang triển khai” , và đưa về màn hình của trưởng nhóm triển khai.
Bƣớc 4
Sau khi nhận được hợp đồng ở trạng thái “Đang triển khai”, trưởng nhóm triển khai sẽ: Xem các thông tin đính kèm trên bản hợp đồng, xem xét và tiến hành phân công công việc cho các nhân viên triển khai đồng thời đưa ra hạn hoàn thành cho nhóm triển khai
Trong quá trình làm nếu có yêu cầu nào đột xuất từ khách hàng về triển khai, trạng thái hợp đồng vẫn giữ “đang triển khai” , việc này được lưu lại dưới dạng “comment” hoặc “tài liệu thêm” cho hợp đồng
Nếu hết thời gian triển khai chưa hoàn thành, sẽ chuyển hợp đồng về trạng thái “Chờ triển khai” (mục đích là để đánh giá sự hoàn thành của nhóm triển khai dựa trên khoảng thời gian chờ triển khai)
Nhóm triển khai hoàn thành, nhưng kinh doanh và và chăm sóc khách hàng bổ sung thêm về việc làm chưa đúng yêu cầu khách hàng thì sẽ chuyển trạng thái hợp đồng về dạng “chờ triển khai”
Chỉ đến khi nhóm triển khai, kinh doanh, chăm sóc khách hàng thống nhất về việc hoàn thành bản thiết kế đã đúng yêu cầu, sẽ chuyển hợp đồng về trạng thái “Đang bàn giao”, và chuyển đến trưởng nhóm chăm sóc khách hàng.
Bƣớc 5
Sau khi nhận được hợp đồng “Đang bàn giao”, trưởng nhóm chăm sóc khách hàng sẽ: Xem các thông tin đính kèm trên bản hợp đồng, xem xét và tiến hành phân công công việc cho các nhân viên chăm sóc khách hàng đồng thời đưa ra hạn hoàn thành cho nhóm chăm sóc khách hàng.
Chăm sóc khách hàng làm việc với khách hàng, nếu khách hàng chấp nhận, sẽ chuyển hợp đồng về dạng “Hoàn thành” và kết thúc hợp đồng, nếu khách hàng yêu cầu thêm về
- Thiết kế: sẽ chuyển hợp đồng về “chờ bàn giao thiết kế” - Kỹ thuật: sẽ chuyển hợp đồng về “Chờ bàn giao triển khai”
Chỉ khi khách hàng không yêu cầu thì chuyển hợp đồng về trạng thái hoàn thành, kết thúc hợp đồng.
Bƣớc 6
Chăm sóc khách hàng bàn giao đầy đủ cho khách hàng, quyết toán và kết thúc hợp đồng.
3.2 Thiêt kế hệ thống
Việc xác định được quy trình công việc có nghĩa quan trọng, từ đó tôi đã xây dựng các sơ đồ sau:
Hình 22: Class diagram miêu tả quy trình dịch vụ
3.3 Xây dựng chƣơng trình
Áp dụng một số nội dung WCF trong dự án tại một số phần như:
Cấu hình WCF
Tổ chức dự án thành ứng dụng n-tiers.
Xây dựng ứng dụng gadget dùng json-Ajax
Sử dụng IIS hosting để hosting dịch vụ
Cấu hình WCF
Khi làm việc với các ứng dụng WCF, cấu hình là một công việc không hề dễ dàng, việc cấu hình trong file config nhằm giúp cho trình dịch vụ và Client có thể biết và giao tiếp với nhau thông qua địa chỉ, tên hợp đồng, các binding, behaviors.
Cấu hình dịch vụ WCF, phải được đặt trong khối <system.serviceModel>. Chủ yếu cấu hình phần services và phần behaviors.
<system.serviceModel> <services>
<service behaviorConfiguration="GadgetBehavior" name="Gadget"> <endpoint address="" behaviorConfiguration="Ajax2Behavior" binding="webHttpBinding" contract="IGadget"> <identity> <dns value="localhost" /> </identity> </endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <behaviors> <endpointBehaviors> <behavior name="AjaxBehavior"> <enableWebScript /> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="GadgetBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> Tổ chức dự án thành ứng dụng n-tiers
Dự án có thể được tổ chức theo nhiều mô hình khác nhau. Trong dự án này, tôi tổ chức dự án theo mô hình n-tiers, bởi sự rõ ràng, dễ cài đặt và phù hợp với môi trường ASP 2.0.
Tầng UI: là các ứng dụng phía trình khách, có thể là các website khai thác dịch vụ, chương trình winform…
Tầng WCF Services: Triển khai xuất bản các hàm chức năng dưới dạng dịch vụ
Tầng Business: triển khai các chức năng trung gian từ tầng UI và DataAccess
Tầng DataAccess: Triển khai các chức năng thao tác trực tiếp với cơ sở dữ liệu Mối liên hệ giữa các tầng trong ứng dụng được mô tả theo sơ đồ sau:
Hình 23: Kiến trúc chương trình ứng dụng
Trước đây, việc trao đổi dữ liệu giữa trình khách và dịch vụ chỉ thực hiện trên các kiểu dữ liệu cơ bản như số nguyên, xâu, logic…hoặc nếu kiểu dữ liệu object thì việc
Client
Business Layer Data Contract
WCF services
Data Access Layer
Database Services
cài đặt cũng rất khó khăn. Với WCF, Datacontract được tạo ra như những object info, thuận lợi khi trao đổi dữ liệu kiểu đối tượng giữa Client và services.
Việc tạo ra các object này tương đối dễ dàng, để tạo ra một datacontract, chỉ cần thêm thẻ <Datacontract> trước mỗi class đối tượng cần publish, trước mỗi thuộc tính cần thêm thẻ <DataMember> nếu cần xuất bản thuộc tính này xuống phía Client.
Tầng WCFServices: Tổ chức dự án tường minh bằng cách khai báo các giao diện và các class thực thi giao diện này tương ứng.
Imports System.ServiceModel <ServiceContract()> _
Public Interface IStaff #Region "DMS_Groups"
Function DMS_Groups_GetById(ByVal Id As Integer) As _GroupInfo <OperationContract()> _
Function DMS_Groups_GetAll() As List(Of _GroupInfo) <OperationContract()> _
Function DMS_Groups_Insert(ByVal objInfo As _GroupInfo) As Integer <OperationContract()> _
Sub DMS_Groups_Delete(ByVal Id As Integer) <OperationContract()> _
Sub DMS_Groups_Update(ByVal objInfo As _GroupInfo) #End Region
Tạo DataContract
#Region "ObjectInfo" <DataContract()> _
Public Class _REQProjectInfo
Private _ContractId As Integer Private _AppendixTech As String Private _AppendixCost As String Private _Plan As String
<DataMember()> _
Public Property ContractId() As Integer Get
Return _ContractId End Get
Set(ByVal Value As Integer) _ContractId = Value End Set
End Property <DataMember()> _
Public Property AppendixTech() As String Get
Return _AppendixTech End Get
Set(ByVal Value As String) _AppendixTech = Value End Set
End Property
Tầng Business
Imports WcfService
Public Class Contract_BL #Region "DMS_Contract"
Public Function DMS_Contract_GetById(ByVal Id As Integer) As _ContractInfo
Dim ctr As New DMSContractController() Return ctr.GetById(Id)
End Function
Public Function DMS_Contract_GetAll() As List(Of _ContractInfo) Dim ctr As New DMSContractController()
Return ctr.GetAll() End Function
Public Function DMS_Contract_GetbyStaffId(ByVal id As Integer, ByVal type As Integer) As List(Of _ContractInfo)
Dim ctr As New DMSContractController() Return ctr.GetByStaffId(id, type)
End Function
Public Function DMS_Contracts_Insert(ByVal obj As _ContractInfo) As Integer
Dim ctr As New DMSContractController Return ctr.Insert(obj)
End Function
Tầng DataAccsess
#Region "DMS_Groups"
Public Overrides Function DMS_Groups_GetById(ByVal Id As Integer) As IDataReader
Return SqlHelper.ExecuteReader(ConnectionString, "DMS_Groups_SelectById", Id)
End Function
Public Overrides Function DMS_Groups_GetAll() As IDataReader Return SqlHelper.ExecuteReader(ConnectionString,
"DMS_Groups_SelectAll") End Function
Public Overrides Function DMS_Groups_Insert(ByVal objInfo As _GroupInfo) As Integer
Return CInt(SqlHelper.ExecuteScalar(ConnectionString,
"DMS_Groups_Insert", objInfo.Name, objInfo.Description, objInfo.Leader,
objInfo.DepartmentId)) End Function
Public Overrides Sub DMS_Groups_Update(ByVal objInfo As _GroupInfo)
SqlHelper.ExecuteNonQuery(ConnectionString,
"DMS_Groups_Update", objInfo.Id, objInfo.Name, objInfo.Description,
objInfo.Leader, objInfo.DepartmentId) End Sub
#End Region
Tầng UI
Tầng UI thực hiện các ứng dụng phía trình khách để gọi dịch vụ, đó có thể là các website khai thác dịch vụ hoặc các ứng dụng winform.
Public Class frmContract
Public Delegate Sub capnhat() Public Shared id As Integer
Private Sub btnThem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnThem.Click
Dim frm As New frmInputContract()
frm.capnhat = New capnhat(AddressOf getdata) frm.Show()
End Sub
Private Sub getdata()
Dim sv As New ContractService.Service3Client() _ContractInfoDataGridView.DataSource =
sv.DMS_Contracts_GetByStaffId(frmLogin.Staff, 1) sv.Close()
End Sub
Private Sub frmContract_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
getdata() End Sub
Xây dựng ứng dụng Gadget dùng JSON-AJAX
Trong chương trình này, tôi có thực hiện viết một ứng dụng gadget để gọi dịch vụ( Chương trình này có tham khảo video bài giảng gadget của Trịnh Minh Cường, giảng viên tại msdnvietnam).
var serviceURI = "http://gadget.com/Gadget.svc/" var photoURL = "http://gadget.com/photo/";
var timer; var LabelFullName; var LabelPosition; var Photo; var runShow; var job; var searchTags; document.onreadystatechange = function() { if (document.readyState == "complete") {
staffService = new StaffService(); //Construct StaffService object LabelFullName = document.getElementById("fullname"); LabelPosition = document.getElementById("position"); Photo = document.getElementById("photo"); job = document.getElementById("job"); System.Gadget.settingsUI = "Settings.htm"; System.Gadget.onUndock = resizeGadget; System.Gadget.onDock = resizeGadget; System.Gadget.Flýout.file = "flýout.html"; System.Gadget.onSettingsClosed = settingsClosed; runShow = true; staffService.getAllStaffIDs();
if (staffService.AllIDs != null) { //Check if AllIDs is not null if (staffService.AllIDs.length > 0) { showStaff(); } } searchTags = System.Gadget.Settings.read("searchTags"); if (searchTags='') { searchTags='admin'; } GetInfo(); } } function GetInfo() { if (timer == null) { timer = setInterval("GetInfo()", 2000); } staffService.GetInfo(); } function StaffService() { this.xmlHttp = CreateXmlHttpRequestObject(); this.AllIDs = new Array();
this.staff = null; this.day=null }
StaffService.prototype.getAllStaffIDs = function() { var currentTime = new Date();
this.xmlHttp.open("GET", serviceURI + "/getAllStaffIDs", false);
this.xmlHttp.send();
var temp = eval('(' + this.xmlHttp.responseText + ')'); this.AllIDs = temp.d;
}
StaffService.prototype.getRandomStaff = function() { var numberOfStaffs = this.AllIDs.length;
if (numberOfStaffs > 0) {
var randomIndex = Math.floor(Math.random() * numberOfStaffs);
var ID = this.AllIDs[randomIndex]; var currentTime = new Date();
this.xmlHttp.open("GET", serviceURI + "/getStaffbyID?Id=" + ID+"&timer=" +currentTime.getTime(), false);
this.xmlHttp.send();
var temp = eval('(' + this.xmlHttp.responseText + ')'); this.staff = temp.d;
LabelFullName.innerHTML = this.staff.FirstName+" " +this.staff.LastName;
LabelPosition.innerHTML = this.staff.JobTitle; Photo.src = photoURL + this.staff.Image;
if (System.Gadget.Flyout.show) { addContentToFlyout();
} }
}
Hình 24: DMS gadget
Sử dụng IIS để hosting dịch vụ
Dịch vụ cũng là một chương trình, và chương trình cũng phải cần một môi trường đã thực thi, có nhiều cách để hosting dịch vu, mỗi một phương pháp đều có những ưu nhược điểm riêng, trong chương trình này, tôi đã sử dụng IIS để hosting dịch vụ
Việc thực hiện hosting dịch vụ WCF, có thể tham khảo [15].
3.4 Các chức năng đã thực hiện
Trong chương trình này, tôi đã vận dụng các kiến thức nền tảng cơ bản của WCF, thực hiện cấu hình trong file webconfig, sử dụng mô hình ABC, chia sẻ Datacontract, viết các dịch vụ tại Services, gọi các dịch vụ tại Client...
Chương trình có thể tích hợp vào trong các website công ty, giúp công ty nâng cao hiệu quả công việc, ban lãnh đạo có thể kiểm soát được tiến độ công việc dự án trong công ty, các nhân viên có thể hợp tác hỗ trợ lẫn nhau trong quy trình hoạt động. Ngoài ra, tôi đã áp dụng công nghệ gadget, có thể hiển thị công việc trên mỗi màn hình nhân viên, giúp nhân viên có thể xác định được tiến độ công việc của mình, từ đó định ra thời gian biểu phù hợp. Chương trình đã các chức năng sau:
Chức năng tin tức:
Tin tức là vấn đề quan trọng đối với bất kỳ website nào, đặc biệt với một website công ty, do đó chức năng quản trị tin tức cho phép người dùng trong công ty có thể cập nhật nội dung, chỉnh sửa, xuất bản, ngưng xuất bản với bất kỳ bài viết nào.
Chức năng quản lý trang, module:
Mỗi một trang trong website được đặc trưng bởi một tabid, trên mỗi trang sẽ có nhiều module, các module này có thể bố trí ở các vị trí khác nhau như left, right, center, với các thứ tự khác nhau. Chương trình có thể giúp người dùng có thể thêm, sửa, xóa, cập nhật thứ tự các module và các trang một cách dễ dàng.
Chức năng quản lý Role, ngƣời dùng
Người dùng tham gia hệ thống bao gồm tất cả các nhân viên trong công ty. Quản trị hệ thống có thể quản lý người dùng, quản lý Role và phân quyền. Phân quyền người dùng dựa trên từng tabid. Có thể thêm, sửa, xóa một role và người dùng một cách dễ dàng.
Có 2 loại khách hàng chính: cá nhân và tổ chức. Mỗi loại khách hàng có những đặc điểm thông tin khác nhau, chương trình đã cung cấp 2 loại form nhập liệu, tương ứng với các kiểu khách hàng này.
Nhân viên kinh doanh có thể được thực hiện nhập mới, xem, sửa, xóa một hợp đồng dễ dàng, các hợp đồng này đều thuộc một trong bốn loại: hợp đồng bizweb, hợp đồng domain-hosting, hợp đồng Google Adwords, hay hợp đồng dự án.
Hình 25: Giao diện cập nhật hợp đồng
Chức năng Chat-Forum
Việc trao đổi thông tin trong nội bộ công ty trở nên cần thiết nhằm duy trì một văn hóa doanh nghiệp lành mạnh, bảo mật thông tin với bên ngoài, chương trình hỗ trợ chức năng chat-forum đơn giản, giúp mọi người có thể trao đổi thông tin một cách dễ dàng, bảo mật, tin cậy.
Chức năng quản lý nhân viên
Khi công ty càng lớn, số lượng nhân viên tăng, vấn đề quản lý nhân viên thực sự được đặt ra. Chương trình cho phép người dùng có thể cập nhật thông tin nhân viên, dữ liệu hợp đồng lao động, hồ sơ học vấn- đào tạo, quản lý việc tăng lương, chấm công theo từng ngày.
Chức năng quản lý công việc
Khi số lượng nhân viên càng lớn, việc quản lý công việc, hợp đồng, khách hàng càng trở nên khó khăn hơn. Chức năng quản lý công việc giúp ban lãnh đạo công ty