通用的业务编码规则设计实现(一)

2014-11-23 22:06:32 · 作者: · 浏览: 4
一、背景
每一个企业应用中不可避免的都会涉及到业务编码规则的问题,比如订单管理系统中的订单编号,比如商品管理系统中的商品编码,比如项目管理系统中的项目编码等等,这一系列的编码都需要管理起来,那么它们的应该如何编码的,具体的编码规则我们很多时候都是直接写在程序当中
常用的的编码有:
1、 数据库自增长ID或最大值加1
2、GUID
3、时间戳
4、常量+自增长
5、常量+时间戳+自增长
6、根据单据属性编码 比如商品编码:第X是代码商品颜,第Y位是代码商品产地
7、自定义函数处理返回
8、其它
添加一张单据时,这个单据的编码是比较头疼
第一个问题就是单据编码的时间顺序:
1、新增前先预取得新单据编码
优点是保存处理很简单,而且保存后不需要再刷新UI,缺点就是如果放弃表单那么编码计数已经跳号,做不到连续的单据号,而且没法实现上面编码的第6种情况。
2、保存时才生成单据编码
缺点是保存比较麻烦点,而且保存后需要再刷新UI中的单据编码字段,但是如果是需要根据单据属性编码,那就必做得使用这种方式了,而且能做到单据连续。
第二个问题是这个编码该怎么去取,怎么保证唯一性
这里要看是使用哪种编码方式,比如 max + 1 这种方式 就直接检索数据库 select max(id) + 1 from table 取得编码,如果是GUID则比较方便,但是GUID看着实在是有点恶心,使用时间戳的话如果精确到秒的话是没办法保证唯一性的,即使精确到毫秒理论上也是不行的。其它复杂的编码获取就更麻烦点了。总之不是很方便就能取得。
第三个问题如果这个编码规则需要更换怎么办
这个如果没有特别设计编码规则一般都要修改程序,没办法说不动程序直接修改配置就能实现
二、目的及设计
Ⅰ、鉴于以上几个问题,我们想设计一个比较通用的业务编码规则模块,以后的项目也可复用,它应该要实现以下功能及特点:
1、满足各种编码规则的需求
a.背景中提到的那7种都要实现,还要求各种规则可以自由组合
b.依赖重置,比如日期变化时序号自动重置为1
b.支持SAAS模式的业务需求
2、拓展性强,可添加自定义规则
3、通过配置文件或数据进行配置,修改业务编码规则只需要修改配置文件或数据
4、使用简单
Ⅱ、我们先从配置来设计,我们把规则配置放在数据库中,可以考虑以后再做个界面来管理这些配置。设计三张表来保存这些规则
1、单据编码规则
2、租户单据编码规则 (考虑SAAS多租户模式)
3、单据编码规则 用来存储基础规则组合,一种单据编码对应多种规则
image
Ⅲ、基础的配置及储存确认,我们再设计类,我一般设计是从入口开始的,先考虑怎么用,再考虑怎么去实现。
比如在WebApi的控制器中要 番取得采购订单编码及采购订单明细的行号,代码如下
复制代码
public class PurchasingApiController : ApiController
{
private ISequenceFactory _sequenceFactory;
public PurchasingApiController(ISequenceFactory sequenceFactory)
{
_sequenceFactory = sequenceFactory;
}
//取得主表的BillNo
public string GetNextBillNo()
{
var sequence = _sequenceFactory.Create("sdx_purchasing");
return sequence.Next();
}
//用BillNo过滤取得从表中的RowId
public string GetNextRowId(string key)
{
var sequence = _sequenceFactory.Create("sdx_purchasingLine");
sequence.SetValue("BillNo", key)
return sequence.Next();
}
}
复制代码
通过以上使用,我们大致清楚,Sequence对象中主要就是一个Next()的实现,创建交给SequenceFactory以下是我的一个实现截图
image
稍微解释说明下:
1、DefaultSequenceFacotry 继承自接口ISequenceFactory负责构建Squence
2、Sequence 继承自ISeqence是 番的主要处理类
3、SequenceContext Sequence上下文
4、Resets文件夹中类 继承自ISequenceReset,由SequenceResetFactory构建
5、Rules文件夹中类 继承自抽象类SequenceRuleBase,由SequenceRuleFactory构建
6、IClassSequenceHandler是自定义类规则接口,实现这个添口可添加自定义规则,SequenceHandler中是两个自定义类规则的实现
Ⅳ、下面贴出代码
ISequenceFactory.cs
public interface ISequenceFactory
{
ISequence Create(string name);
}
DefaultSequenceFactory.cs
复制代码
public class DefaultSequenceFactory : ISequenceFactory
{
public ISequence Create(string name)
{
return new Sequence(name);
}
}
复制代码
ISequence.cs
复制代码
public interface ISequence
{
ISequence SetDbContext(IDbContext db);
ISequence SetTenantID(string tenantId);
ISequence SetValues(Dictionary row);
ISequence SetValues(JToken row);
ISequence SetValue(string na