為保證ERP系統的信息流準確快速的傳遞,需要給系統設計一個消息盒子機制。當系統中發生業務操作後,需要提醒下一個環節的操作人員,以保證ERP信息流快速準確傳遞。比如生產任務單(工作單,加工單,制單)過帳完成後,需要通知倉庫準備材料供車間領料生產。消息盒子的界面大致如下所示:
消息盒子包含業務通知(Messages)和工作流審批(Workflow)。業務通知比如採購人員下達採購訂單PO後,需要通知倉庫人員準備收貨。工作流審批是以審批為基礎的單據流程控制。
在實現消息盒子過程中,遇到一個客戶需要將消息同時發送到電子郵件系統中,於是撰此文以分享實現過程。
客戶的目的很簡單,發送消息的同時,也將此消息抄送到相應的郵件帳戶中:
實施部分
有以下幾種選擇
1 與Outlook搭配的郵件服務器Exchange Server是一個很好的郵件服務器,只是配置稍微複雜一點。
2 Magic WinMail ,WinWebMail 免費版可發佈50-100個帳戶,超過此限制需要購買授權。
3 hMailServer 開源,免費,無限制。提供COM接口可供二次開發。
最終選擇hMailServer作為ERP系統的郵件服務器。配置過程此處略過。
安裝好hMailServer後,創建域名EnterpriseSolution.com,並啟用它。
打開同步程序,如下圖所示,輸入管理員密碼後連接到郵件服務器中。這是我調用COM接口完成的程序。
在這個程序中, 可以將ERP用戶的郵件同步到hMailServer的帳戶表中。
點擊同步按鈕,打開ERP帳戶選擇窗體,再點擊確認之後,ERP中的帳戶就同步到hMailServer郵件系統中。
查看hMailServer的帳戶:
開發部分
下面詳細講解一下上面的同步程序是如何實現的,它是一個簡單的C#調用C++ COM接口的程序。hMailServer官方給出的COM幫助文檔地址在這裡:https://www.hmailserver.com/documentation/v5.6/?page=com_objects
private Domain HMailServerConnection()
{
string hMailDomain = txtDomain.Text;
string HMailUsername = "Administrator";
string HMailPassword = txtPassword.Text;
var objGlobal = new ApplicationClass();
objGlobal.Authenticate(HMailUsername, HMailPassword);
return objGlobal.Domains.get_ItemByName(hMailDomain);
}
DataTable table = new DataTable("Table");
table.Columns.Add("Address", typeof (string));
table.Columns.Add("Password", typeof (string));
table.Columns.Add("PersonFirstName", typeof (string));
table.Columns.Add("PersonLastName", typeof (string));
_domain = HMailServerConnection();
Accounts accounts = _domain.Accounts;
for (int i = 0; i < accounts.Count; i++)
{
Account account = accounts[i];
DataRow dataRow = table.NewRow();
dataRow["Address"] = account.Address;
dataRow["Password"] = account.Password;
dataRow["PersonFirstName"] = account.PersonFirstName;
dataRow["PersonLastName"] = account.PersonLastName;
table.Rows.Add(dataRow);
}
gridAccount.AutoGenerateColumns = false;
gridAccount.DataSource = table;
參考下面的代碼調用
Domain domain = HMailServerConnection();
Accounts accounts = domain.Accounts;
Account mailbox = accounts.Add();
mailbox.Address = email;
mailbox.Password = password;
mailbox.Save();
參考下面的代碼
Accounts accounts = _domain.Accounts;
int count = accounts.Count;
while (count > 0)
{
_domain.Accounts.Delete(0);
count--;
}
_domain.Accounts.Refresh();
hMailSever提供的COM接口是x86架構的,所以這個項目我只能設x86編譯平臺。
這個項目還有涉及到多語言實現,我採用的是一個公共方法翻譯界面上的控件,參考下面的代碼。
public static void TranslateForm(Form form)
{
string labelText = string.Empty;
DataRow dataRow = null;
string translation = string.Empty;
switch (Application.CurrentCulture.LCID)
{
case 2052:
translation = "CHS";
break;
case 1028:
case 3076:
case 5124:
translation = "CHT";
break;
}
foreach (var label in GetAllControlsRecusrvive<Label>(form))
{
labelText = label.Text.Trim().TrimEnd(':');
dataRow = Shared.TranslationTable.Rows.Find(labelText);
if (dataRow != null)
label.Text = Convert.ToString(dataRow[translation]);
}
我只需要在每個界面的窗體加載事件中調用上面的方法即可完成多語言功能。
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Shared.TranslateForm(this);
}
界面翻譯項來自於項目嵌入的Xml資源文件。
項目源代碼文件:http://files.cnblogs.com/files/JamesLi2015/Synchronization.zip