功能设计说明
通过综合平台功能菜单->系统管理->基础数据->编码规则,即可打开编码规则维护界面:
左侧是编码规则的分类,无非就是模块或者集合信息,通过规则分类进行增、删、改可以进行相关操作。这里作为平台的编码规则,我们提前构建了一个分类:基础数据,设置平台编码时先选择该分类,就可以呈现如上图的编码规则列表。另外,初始化功能,主要在系统实施初期,可以通过该功能进行基础数据编码规则的导入,其他无啥意义。
回到列表,可以通过新增、编辑和查看进行规则相关操作,我们以组织机构为例,打开【组织机构】编码规则维护页面:
字段说明:
编号:决定规则唯一性编码,后期接口内通过该值进行规则区分和调用。
名称:描述性说明。
分类:列表左侧分类数据。
是否启用:该规则停启状态,如果停用,那么将无法获取到编码。
段分隔符:编码过程是按段进行的,比如日期一段,常量一段,而段之间可以存在分隔符。
编码方式:强制自动和可编辑,前者为业务点强制采用该规则,后者是产生编码但可以修改。
序号重置规则:流水号段,按照一定日期间隔进行重置,一般是年、月、日。
当前重置依赖:当前编码依赖的序号重置规则。
流水号步长:流水号递增步伐。
当前流水号:生成编码后,会记录最后生成编码的流水号。
最大长度:编码运行产生的最大长度,如果超过将截断,此处为了保证编码满足业务字段的限制。
各段编码:
1、常量:一般为固定长度文本
2、流水号:递增式整数编码,一般左边0补齐
3、日期:格式化日期字符,比如yyyyMMdd等。
4、GUID:全球唯一字符,无实际意义。
5、业务字段:通过列表的【业务字段】配置的业务字段键值对参数,该参数在编码生成过程中接口需要传递。
接口说明
使用过程,如果开启了编码规则,且进行了相关代码修改,在业务新增页面应自动带入生成编码,且如果是强制自动的,该编码不可修改,在保存过程,也会重新获取实际编码,进行保存。
使用过程,如果开启了编码规则,且进行了相关代码修改,在业务新增页面应自动带入生成编码,且如果是强制自动的,该编码不可修改,在保存过程,也会重新获取实际编码,进行保存。
为支持平台调用,MES综合平台提供了响应的服务接口,主要在CodeRuleService服务中,接口方法包括:
///
/// 编码规则接口
///
public interface ICodeRuleService
{
///
/// 获取信息
///
///
///
RuleCodeInfo GetCodeRuleInfo(string ruleCode);
///
/// 尝试生成编号(不形成记录,即不影响下次生成,编码不递增)
///
///
///
RuleCode TryCreateCodeByRule(string ruleCode);
///
/// 尝试生成编号(不形成记录,即不影响下次生成,编码不递增)
///
///
///
///
RuleCode TryCreateCodeByRule(string ruleCode,
Dictionary billField);
///
/// 批量生成编号
///
///
///
///
RuleCodes TryCreateCodeByRule(string ruleCode, int count);
///
/// 批量生成编号
///
///
///
///
///
RuleCodes TryCreateCodeByRule(string ruleCode, int count,
List> billFields);
///
/// 正式生成编号(形成记录)
///
///
///
RuleCode CreateCodeByRule(string ruleCode);
///
/// 正式生成编号(形成记录)
///
///
///
///
RuleCode CreateCodeByRule(string ruleCode,
Dictionary billField);
///
/// 正式生成编号(形成记录)
///
///
/// 编码个数
///
RuleCodes CreateCodeByRule(string ruleCode, int count);
///
/// 正式生成编号(形成记录)
///
///
/// 编码个数
///
///
RuleCodes CreateCodeByRule(string ruleCode, int count,
List> billFields);
}
以上分两类接口,测试获取编码和正式获取编码,区别是测试获取主要用于新增界面显示使用,但是在新增过程往往会有并发或者取消新增的过程,所以获取的只是显示编码,正式获取往往是保存那下进行,直接获取直接保存到业务点,使用时请注意区分场景。
接口使用最佳实践
以Asp.Mvc为例,前提是准备了平台集成的相关DLL,并且服务可以调用(不在累述)。
1、新增界面,编码控件初始化时,根据编码规则获取编码(尝试获取,不形成记录,在保存过程中重新获取最后编码进行保存),当然也可以不做处理,强制编码字段不可输入且置灰,等保存时进行填充。
显示编码,JS绑定过程代码如下:
GetCodeByRule: function(orgType) {
var me = this;
/*************************编码规范获取Begin************************************/
//通过Ajax请求获取编码规则生成的编码
//如果存在业务字段,那么业务字段以 Name和Value的对象数组进行传递
//此处获取的编码是根据编码规则 当前单据的最新编码,获取后不会进行跳号,只有进行后台保存后才会进行记录
//所以后台保存前,请进行相关重新取号
$.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;
//判断编码规则是否有效:存在并且开启。
//如果无效,直接跳过,不影响业务。
if (item.effective === true) {
//获取成功后,进行相关字段绑定和是否可修改控制
if (item.success === true) {
$("#Code").textbox("setValue", item.code);
$("#Code").textbox(item.canEdit === true ? "enable" : "disable");
me.LastNewCode = item.code;
} else {
alert("根据编码规则获取编码失败:" + item.message + ",请联系管理员!");
//获取失败,阻止继续新增
if (me.ListNs && me.ListNs.CloseDialog) {
me.ListNs.CloseDialog();
}
}
}
}
}
});
/*************************编码规范获取End************************************/
}
上图中Common/GetCodeForCreateWithField 服务是各个业务系统根据编码规则接口,自己编写的编码生成请求服务。
me.LastNewCode 用于记录该页面最后生成编码,保存时需要一并提交到服务器。
2、在业务保存过程,根据编码规则重新获取编码,并进行保存。
public JsonResult SaveOrganization(OrganizationInput organizationInput, PageOperate editType, string lastCode)
{
OrganizationAllOutPut organization = null;
if (editType == PageOperate.Create)
{
//*************************处理编码编码规则*********************************************
var ruleCode = _commonAppService.GetCodeRuleInfo("OrgCode");
if (ruleCode.Exist && ruleCode.Start)
{
if (ruleCode.CanEidt && !lastCode.Equals(organizationInput.Code))
{
//可以编辑,并且已经编辑的情况,无需在重新获取,按照新编辑的编码进行保存
}
else
{
//此处为正式获取,如果有流水号讲进行跳号
var code = _commonAppService.CreateCodeByRule("OrgCode",
new Dictionary() {{"OrgType", organizationInput.OrgType.ToString()}});
//有效存在并且启动,那么根据获取情况进行设置编码或者异常弹出
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为平台编码规则服务对象。
其他问题和备注
有的时候,编码规则进行了多次调整,在使用编码时,会出现提示编码重复的现象,那么需要管理员手工调整规则编辑页面的:【当前流水号】字段,进行流水号后移,保证编码不重复。