自动生成单号

原理

单号:前缀字符(不同的业务有着不同的前缀)+日期字符串+流水号。
由于系统的订单号生成规则都一致,所以可以试用一个插件进行单号的自动生成。

步骤

(1)创建规则表;
(2)创建规则生成的插件;
(3)调用插件生成订单号。

数据库设计

规则表

字段类型备注
IDVARCHAR2(36)规则ID
CODEVARCHAR2(20)业务单号编码,
PREFIXVARCHAR2(20)前缀
DATA_TYPEVARCHAR2(20)日期格式
SERIAL_LENGTHNUMBER流水号的长度
INITIAL_VALUENUMBER流水号的初始化值
STEP_VALUENUMBER流水号的递增值
LAST_CREATE_DATEDATE最后生成日期
LAST_CREATE_NUMBERVARCHAR2(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
    }
}

感谢李磊同事。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值