1.表:mysql建表语句
DROP TABLE IF EXISTS `keycode`; CREATE TABLE `keycode` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `KeyName` varchar(50) NOT NULL, `KeyRemark` varchar(100) NOT NULL, `Prefix` varchar(20) DEFAULT NULL, `ReSetType` int(11) NOT NULL, `DateFormat` longtext, `Length` int(11) NOT NULL, `Step` int(11) NOT NULL, `InitialValue` int(11) NOT NULL, `NowDate` longtext, `CurrentValue` int(11) NOT NULL PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
2.实体:Entity
/// <summary> /// 自动生成不重复流水号 /// </summary> public class KeyCode { /// <summary> /// 键名称 /// </summary> [Required, MaxLength(50)] public string KeyName { get; set; } /// <summary> /// 键说明 /// </summary> [Required, MaxLength(100)] public string KeyRemark { get; set; } /// <summary> /// 前标字母 /// </summary> [MaxLength(20)] public string Prefix { get; set; } /// <summary> /// 重置类型:0不重置 1重置 /// </summary> public int ReSetType { get; set; } /// <summary> /// 日期格式 日期格式格式可以是yyyymm,yy-mm,yyyymmdd,yyyymmdd-hh等, /// 如果按年重置,则日期格式中必须有年,如果按月重置,则日期格式中必须有月. /// 如果日期格式为空:则编号中不加入日期字段 /// </summary> public string DateFormat { get; set; } /// <summary> /// 流水号长度:如长度为4,当前流水号为123,则出来的编码为0123,不足4位的前面补0 /// </summary> public int Length { get; set; } /// <summary> /// 步长 每个流水号生成间隔是多少,如2,表示每个生成0001,0003这种流水号'; /// </summary> public int Step { get; set; } /// <summary> /// 初始值 初始流水号是多少,默认是0 /// </summary> public int InitialValue { get; set; } /// <summary> /// 当前使用的日期【需更新】 /// </summary> public string NowDate { get; set; } /// <summary> /// 当前流水号【需更新】 流水号当前值,如234表示当前的流水号生成到了234,下一个为234+STEP(步长)'; /// </summary> public int CurrentValue { get; set; } }
3.C#调用方法
/// <summary> /// 不重复编码生成 /// </summary> /// <param name="keyName"></param> /// <returns></returns> public string GetKeyCode(string keyName) { string returnKey = ""; KeyCode key = _keyRepository.FirstOrDefault(k => k.KeyName == keyName); //步长 int step = key.Step <= 0 ? 1 : key.Step; //如果日期格式化为空:表示编码不需要日期 if (string.IsNullOrEmpty(key.DateFormat)) key.NowDate = ""; else key.NowDate = DateTime.Now.ToString(key.DateFormat); //重置类型: 0不重置,1重置 //不重置:后面序号一直增加,不按年月日重置 if (key.ReSetType == 0) key.CurrentValue = key.CurrentValue <= 0 ? 1 : (key.CurrentValue + step); //重置:年月日变化时,会重新从1开始 else { //如果日期不一样了,序号从1开始 if (!string.IsNullOrEmpty(key.NowDate) &&key.NowDate != DateTime.Now.ToString(key.DateFormat)) key.CurrentValue = key.InitialValue <= 0 ? 0 : key.InitialValue; //否则,序号从原序号+step else key.CurrentValue = key.CurrentValue <= 0 ? 1 : (key.CurrentValue + step); } //更新当前值为新的值; _keyRepository.Update(key); //拼接编码 string newCode = key.CurrentValue.ToString().PadLeft(key.Length, '0'); returnKey = key.Prefix + key.NowDate + newCode; return returnKey; }