原理
单号:前缀字符(不同的业务有着不同的前缀)+日期字符串+流水号。
由于系统的订单号生成规则都一致,所以可以试用一个插件进行单号的自动生成。
步骤
(1)创建规则表;
(2)创建规则生成的插件;
(3)调用插件生成订单号。
数据库设计
规则表
字段 | 类型 | 备注 |
---|---|---|
ID | VARCHAR2(36) | 规则ID |
CODE | VARCHAR2(20) | 业务单号编码, |
PREFIX | VARCHAR2(20) | 前缀 |
DATA_TYPE | VARCHAR2(20) | 日期格式 |
SERIAL_LENGTH | NUMBER | 流水号的长度 |
INITIAL_VALUE | NUMBER | 流水号的初始化值 |
STEP_VALUE | NUMBER | 流水号的递增值 |
LAST_CREATE_DATE | DATE | 最后生成日期 |
LAST_CREATE_NUMBER | VARCHAR2(20) | 最后生成流水号 |
代码
代码一:定义一个规则对象OrderNo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 插件测试
{
//单号规则对象
class OrderNo
{
public string id; //ID
public string code; //业务单号编码
public string prefix; //前缀字符
public string data_type; //日期格式
public int length; //流水号长度
public int initVal; //流水号初始值
public int addVal; //流水号递增值
public string lastDate; //最后生成单号的日期
public string lastNumber; //最后生成单号的流水号
}
}
代码二:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySQLDriverCS;
using System.Data;
using System.Data.Common;
namespace 插件测试
{
/// <summary>
/// 说明:生成单号
/// 作者:叶晓东
/// 时间:2015-08-11
/// </summary>
class AutoCreateOrderFrom
{
MySQLConnection conn1 = new MySQLConnection(new MySQLConnectionString("localhost", "test", "root", "root").AsString); //连接数据库
#region 生成
/// <summary>
/// 生成业务单号
/// </summary>
/// <param name="billCode">业务单号编码</param>
/// <returns>业务单号</returns>
public String CreateOrderFrom(string billCode)
{
StringBuilder str = new StringBuilder();
conn1.Open(); //打开数据库连接
OrderNo orderNo = new OrderNo();
orderNo = GetOrderFromRule(billCode);
str.Append(orderNo.prefix);//前缀字符
str.Append(DateTime.Now.ToString(orderNo.data_type)); //时间
//判断是否需要将流水号初始化(初始值--每天都需要)
if (string.IsNullOrEmpty(orderNo.lastDate) || DateTime.Now.Date > Convert.ToDateTime(orderNo.lastDate).Date)
{
orderNo.lastDate = orderNo.initVal.ToString();
}
int number=0;
//第一次使用,判断最后一个流水号。
if (string.IsNullOrEmpty(orderNo.lastNumber))
{
number = orderNo.initVal;
}
else
{
number = Convert.ToInt32(orderNo.lastNumber) + orderNo.addVal;
}
if (number.ToString().Length > orderNo.length)
{
return "流水长度大于最大流水长度";
}
str.Append(number.ToString().PadLeft(orderNo.length, '0'));//流水号
int i = UpdateOrderRromRule(billCode,DateTime.Now.ToString(), number.ToString().PadLeft(orderNo.length, '0'));//更新
if (i != 1)
return "保存失败!!";
return str.ToString();
}
#endregion
#region 获取规则
/// <summary>
/// 获取规则
/// </summary>
/// <param name="billCode">业务单号编码</param>
/// <returns>规则对象</returns>
private OrderNo GetOrderFromRule(string billCode)
{
conn1.Open();
OrderNo orderNo = new OrderNo();
String sql = "SELECT * FROM create_no where CODE='" + billCode+"'";
MySQLCommand cmd = new MySQLCommand(sql, conn1);
DbDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
orderNo.id = reader.GetString(0);
orderNo.code = reader.GetString(1);
orderNo.prefix = reader.GetString(2);
orderNo.data_type = reader.GetString(3);
orderNo.length = reader.GetInt32(4);
orderNo.initVal = reader.GetInt32(5);
orderNo.addVal = reader.GetInt32(6);
orderNo.lastDate = reader.GetString(7);
orderNo.lastNumber = reader.GetString(8);
}
reader.Close();
return orderNo;
}
#endregion
#region 修改规则
/// <summary>
/// 修改规则表的最后生成日期、最后生成流水号
/// </summary>
/// <param name="billCode">业务单号编码</param>
/// <param name="last_date">最后生成日期</param>
/// <param name="last_number">最后生成流水号</param>
/// <returns></returns>
private int UpdateOrderRromRule(string billCode, string last_date, string last_number)
{
string sql = "update create_no set last_date='" + last_date + "',last_number='" + last_number + "' where code='" + billCode + "'";
MySQLCommand cmd = new MySQLCommand(sql, conn1);
int i = cmd.ExecuteNonQuery();
cmd.Dispose();
conn1.Close();
return i;
}
#endregion
}
}
感谢李磊同事。