功能設(shè)計說明
通過綜合平臺功能菜單->系統(tǒng)管理->基礎(chǔ)數(shù)據(jù)->編碼規(guī)則,即可打開編碼規(guī)則維護界面:

左側(cè)是編碼規(guī)則的分類,無非就是模塊或者集合信息,通過規(guī)則分類進行增、刪、改可以進行相關(guān)操作。這里作為平臺的編碼規(guī)則,我們提前構(gòu)建了一個分類:基礎(chǔ)數(shù)據(jù),設(shè)置平臺編碼時先選擇該分類,就可以呈現(xiàn)如上圖的編碼規(guī)則列表。另外,初始化功能,主要在系統(tǒng)實施初期,可以通過該功能進行基礎(chǔ)數(shù)據(jù)編碼規(guī)則的導(dǎo)入,其他無啥意義。
回到列表,可以通過新增、編輯和查看進行規(guī)則相關(guān)操作,我們以組織機構(gòu)為例,打開【組織機構(gòu)】編碼規(guī)則維護頁面:

字段說明:
編號:決定規(guī)則唯一性編碼,后期接口內(nèi)通過該值進行規(guī)則區(qū)分和調(diào)用。
名稱:描述性說明。
分類:列表左側(cè)分類數(shù)據(jù)。
是否啟用:該規(guī)則停啟狀態(tài),如果停用,那么將無法獲取到編碼。
段分隔符:編碼過程是按段進行的,比如日期一段,常量一段,而段之間可以存在分隔符。
編碼方式:強制自動和可編輯,前者為業(yè)務(wù)點強制采用該規(guī)則,后者是產(chǎn)生編碼但可以修改。
序號重置規(guī)則:流水號段,按照一定日期間隔進行重置,一般是年、月、日。
當(dāng)前重置依賴:當(dāng)前編碼依賴的序號重置規(guī)則。
流水號步長:流水號遞增步伐。
當(dāng)前流水號:生成編碼后,會記錄最后生成編碼的流水號。
最大長度:編碼運行產(chǎn)生的最大長度,如果超過將截斷,此處為了保證編碼滿足業(yè)務(wù)字段的限制。
各段編碼:
1、常量:一般為固定長度文本
2、流水號:遞增式整數(shù)編碼,一般左邊0補齊
3、日期:格式化日期字符,比如yyyyMMdd等。
4、GUID:全球唯一字符,無實際意義。
5、業(yè)務(wù)字段:通過列表的【業(yè)務(wù)字段】配置的業(yè)務(wù)字段鍵值對參數(shù),該參數(shù)在編碼生成過程中接口需要傳遞。
接口說明
使用過程,如果開啟了編碼規(guī)則,且進行了相關(guān)代碼修改,在業(yè)務(wù)新增頁面應(yīng)自動帶入生成編碼,且如果是強制自動的,該編碼不可修改,在保存過程,也會重新獲取實際編碼,進行保存。
使用過程,如果開啟了編碼規(guī)則,且進行了相關(guān)代碼修改,在業(yè)務(wù)新增頁面應(yīng)自動帶入生成編碼,且如果是強制自動的,該編碼不可修改,在保存過程,也會重新獲取實際編碼,進行保存。

為支持平臺調(diào)用,MES綜合平臺提供了響應(yīng)的服務(wù)接口,主要在CodeRuleService服務(wù)中,接口方法包括:
/// <summary>
/// 編碼規(guī)則接口
/// </summary>
public interface ICodeRuleService
{
/// <summary>
/// 獲取信息
/// </summary>
/// <param name="ruleCode"></param>
/// <returns></returns>
RuleCodeInfo GetCodeRuleInfo(string ruleCode);
/// <summary>
/// 嘗試生成編號(不形成記錄,即不影響下次生成,編碼不遞增)
/// </summary>
/// <param name="ruleCode"></param>
/// <returns></returns>
RuleCode TryCreateCodeByRule(string ruleCode);
/// <summary>
/// 嘗試生成編號(不形成記錄,即不影響下次生成,編碼不遞增)
/// </summary>
/// <param name="ruleCode"></param>
/// <param name="billField"></param>
/// <returns></returns>
RuleCode TryCreateCodeByRule(string ruleCode,
Dictionary<string, string> billField);
/// <summary>
/// 批量生成編號
/// </summary>
/// <param name="ruleCode"></param>
/// <param name="count"></param>
/// <returns></returns>
RuleCodes TryCreateCodeByRule(string ruleCode, int count);
/// <summary>
/// 批量生成編號
/// </summary>
/// <param name="ruleCode"></param>
/// <param name="count"></param>
/// <param name="billFields"></param>
/// <returns></returns>
RuleCodes TryCreateCodeByRule(string ruleCode, int count,
List<Dictionary<string, string>> billFields);
/// <summary>
/// 正式生成編號(形成記錄)
/// </summary>
/// <param name="ruleCode"></param>
/// <returns></returns>
RuleCode CreateCodeByRule(string ruleCode);
/// <summary>
/// 正式生成編號(形成記錄)
/// </summary>
/// <param name="ruleCode"></param>
/// <param name="billField"></param>
/// <returns></returns>
RuleCode CreateCodeByRule(string ruleCode,
Dictionary<string, string> billField);
/// <summary>
/// 正式生成編號(形成記錄)
/// </summary>
/// <param name="ruleCode"></param>
/// <param name="count">編碼個數(shù)</param>
/// <returns></returns>
RuleCodes CreateCodeByRule(string ruleCode, int count);
/// <summary>
/// 正式生成編號(形成記錄)
/// </summary>
/// <param name="ruleCode"></param>
/// <param name="count">編碼個數(shù)</param>
/// <param name="billFields"></param>
/// <returns></returns>
RuleCodes CreateCodeByRule(string ruleCode, int count,
List<Dictionary<string, string>> billFields);
}
以上分兩類接口,測試獲取編碼和正式獲取編碼,區(qū)別是測試獲取主要用于新增界面顯示使用,但是在新增過程往往會有并發(fā)或者取消新增的過程,所以獲取的只是顯示編碼,正式獲取往往是保存那下進行,直接獲取直接保存到業(yè)務(wù)點,使用時請注意區(qū)分場景。
接口使用最佳實踐
以Asp.Mvc為例,前提是準(zhǔn)備了平臺集成的相關(guān)DLL,并且服務(wù)可以調(diào)用(不在累述)。
1、新增界面,編碼控件初始化時,根據(jù)編碼規(guī)則獲取編碼(嘗試獲取,不形成記錄,在保存過程中重新獲取最后編碼進行保存),當(dāng)然也可以不做處理,強制編碼字段不可輸入且置灰,等保存時進行填充。
顯示編碼,JS綁定過程代碼如下:
GetCodeByRule: function(orgType) {
var me = this;
/*************************編碼規(guī)范獲取Begin************************************/
//通過Ajax請求獲取編碼規(guī)則生成的編碼
//如果存在業(yè)務(wù)字段,那么業(yè)務(wù)字段以 Name和Value的對象數(shù)組進行傳遞
//此處獲取的編碼是根據(jù)編碼規(guī)則 當(dāng)前單據(jù)的最新編碼,獲取后不會進行跳號,只有進行后臺保存后才會進行記錄
//所以后臺保存前,請進行相關(guān)重新取號
$.Mes.Ajax.Load({
url: '@Url.Content("~/Common/GetCodeForCreateWithField")',
data: { ruleCode: "OrgCode", billsDictionary: [{ Name: "OrgType", Value: orgType }] },
success: function(ret) {
if (ret && ret.success) {
var item = ret.result;
//判斷編碼規(guī)則是否有效:存在并且開啟。
//如果無效,直接跳過,不影響業(yè)務(wù)。
if (item.effective === true) {
//獲取成功后,進行相關(guān)字段綁定和是否可修改控制
if (item.success === true) {
$("#Code").textbox("setValue", item.code);
$("#Code").textbox(item.canEdit === true ? "enable" : "disable");
me.LastNewCode = item.code;
} else {
alert("根據(jù)編碼規(guī)則獲取編碼失敗:" + item.message + ",請聯(lián)系管理員!");
//獲取失敗,阻止繼續(xù)新增
if (me.ListNs && me.ListNs.CloseDialog) {
me.ListNs.CloseDialog();
}
}
}
}
}
});
/*************************編碼規(guī)范獲取End************************************/
}
上圖中Common/GetCodeForCreateWithField 服務(wù)是各個業(yè)務(wù)系統(tǒng)根據(jù)編碼規(guī)則接口,自己編寫的編碼生成請求服務(wù)。
me.LastNewCode 用于記錄該頁面最后生成編碼,保存時需要一并提交到服務(wù)器。
2、在業(yè)務(wù)保存過程,根據(jù)編碼規(guī)則重新獲取編碼,并進行保存。
public JsonResult SaveOrganization(OrganizationInput organizationInput, PageOperate editType, string lastCode)
{
OrganizationAllOutPut organization = null;
if (editType == PageOperate.Create)
{
//*************************處理編碼編碼規(guī)則*********************************************
var ruleCode = _commonAppService.GetCodeRuleInfo("OrgCode");
if (ruleCode.Exist && ruleCode.Start)
{
if (ruleCode.CanEidt && !lastCode.Equals(organizationInput.Code))
{
//可以編輯,并且已經(jīng)編輯的情況,無需在重新獲取,按照新編輯的編碼進行保存
}
else
{
//此處為正式獲取,如果有流水號講進行跳號
var code = _commonAppService.CreateCodeByRule("OrgCode",
new Dictionary<string, string>() {{"OrgType", organizationInput.OrgType.ToString()}});
//有效存在并且啟動,那么根據(jù)獲取情況進行設(shè)置編碼或者異常彈出
if (code.Effective)
{
if (code.Success)
{
organizationInput.Code = code.Code;
}
else
{
throw new UserFriendlyException("編碼獲取失?。? + code.Message);
}
}
}
}
organizationInput.CreateMan = LogonManager.Info.LoginId;
organization = _organizationApplicationService.InsertOrganization(organizationInput);
}
else if (editType == PageOperate.Update)
{
organizationInput.UpdateMan = LogonManager.Info.LoginId;
organization = _organizationApplicationService.UpdateOrganization(organizationInput);
}
return Json(organization);
}
其中_commonAppServer為平臺編碼規(guī)則服務(wù)對象。
其他問題和備注
有的時候,編碼規(guī)則進行了多次調(diào)整,在使用編碼時,會出現(xiàn)提示編碼重復(fù)的現(xiàn)象,那么需要管理員手工調(diào)整規(guī)則編輯頁面的:【當(dāng)前流水號】字段,進行流水號后移,保證編碼不重復(fù)。