生成自增的编号,生成订单号

生成自增的编号:

	/**
	 * 生成工单编码
	 * 
	 * @param workSheetType
	 *            工单类型
	 * @param systemName
	 *            系统名称
	 * @param cityCode
	 *            城市编码
	 * @return 形如AAA-BBB-CC-081127-0029
	 */
	public synchronized String nextWorkSheetNum(String workSheetType, String systemName, String cityCode)
	{
		String seqName = workSheetType + SEPARATOR + systemName + SEPARATOR + cityCode;
		int nextSequnceValue = nextDailySequnceValue(seqName);
		String result = seqName + SEPARATOR + todayStr() + SEPARATOR + leftPadWithZero(nextSequnceValue, PAD4);
		return result;
	}

	//org.apache.commons.lang.StringUtils
	//num为原数字,padwith为总共补齐的位数,0 为用什么补齐。 leftPad 是在左边用0补齐。
	return StringUtils.leftPad(String.valueOf(num), padWith, ‘0‘);

	//存储编号的类
	public class IdSequnce {
		private String name;
		private int curVal;
		private Date updatedAt;
		....
	}

	/**
	 * 下一序列值,以天为周期
	 * 
	 * @param name
	 *            序列名
	 * @return int数值>=1
	 */
	public int nextDailySequnceValue(String name)
	{
		IdSequnce seq = idSequnceDAO.getSequnceByName(name);
		if (seq == null)
		{
			seq = new IdSequnce();
			seq.setName(name);
			seq.setCurVal(0);
			seq.setUpdatedAt(new Date());
			try
			{
				idSequnceDAO.insert(seq);
			}
			catch (Exception e)
			{// 集群环境并发情况下,已被别应用服初始化该记录
				seq = idSequnceDAO.getSequnceByName(name);
			}
		}
		if (seq.getUpdatedAt() != null && DateUtil.isBeforeToday(seq.getUpdatedAt()))//(修改日期不为空,并且是今天之前修改的)所以,今天还没有编号
		{
			DevLog.debug("initial seq value");
			seq.setCurVal(0);
		}
		seq.setUpdatedAt(new Date());
		idSequnceDAO.increaseSequnce(seq);
		return seq.getCurVal();
	}

	/**
	 * 今天之前的日期
	 * 
	 * @return boolean
	 */
	public static boolean isBeforeToday(Date date) {
		Date todayZero = getTodayZeroClock();
		return isBefore(date, todayZero);
	}
	//编号加一
	public void increaseSequnce(IdSequnce sequnce){
		sequnce.setCurVal(sequnce.getCurVal()+1);
		update(sequnce);
	}

说明:IdSequnce 创建了一个表,一个类,用来存储当前的最大的编号。

结果为:形如AAA-BBB-CC-081127-0005
时间: 2024-10-07 07:00:44

生成自增的编号,生成订单号的相关文章

订单号生成规则

前阵子,公司有个电子商务项目,需要生成订单号.当时的考虑很简单,取系统时间加上随机数,或者使用 uniqid() 方法.我们都知道,订单号最基本的要求就是唯一,这个条件必须满足.仔细考虑下上述方法,在顾客购买量少的情况下,订单重复的可能性为零,但是在购买高蜂期生成的订单号重复是很有可能发生的.所以上述方法不可靠,有待强化.在网上找了一番,发现这位同学的想法挺不错的,redtamo,具体的请稳步过去看看,我作简要概述,该方法用上了英文字母.年月日.Unix 时间戳和微秒数.随机数,重复的可能性大大

订单号的生成

订单号有3个属性:1.唯一性 2.不可推测性 3.效率性 唯一性是当中最重要的一个,重复了这个订单号就没有意义.其次就是效率性,反复查找数据库会生成的很慢! 不规则订单号生成思路:System.currentTimeMillis()+几位随机数,就OK了.System.currentTimeMillis()这个数一般是不会出现同一个的. 在一些公司的内部系统中可能会要求我们给出一个规则的顺序订单号,比如:年月日+(当前订单数+1),特殊字符串+(当前订单数+1).因为两个人同时操作时会是同一个订

生成26位唯一的订单号

/** * Note : 生成26位数字的唯一订单号 * Author : LMZ * Time : 2019/9/2 10:50 * @return string */ function create_order_sn(){ //date("Ymdhis") . sprintf("%08d", $user_id) . mt_rand(1000, 9999);//郝英晨的生成方法 $sn = date('Ymdhis') . substr(implode(null,

PHP版本的自动生成有规则的订单号(或编号)

<?php /** * PHP版本的自动生成有规则的订单号(或编号) * 生成的格式是: 20130103000001 前面几位为当前的日期,后面6位为系统自增长类型的编号 * 原理:  * 1.获取当前日期格式化值; * 2.读取文件,上次编号的值+1最为当前此次编号的值(记录以文件的形式存储) * (下月会接着这个编号) */ class FileEveryDaySerialNumber { private $filename; //文件名  private $separate; //系统分

C#:lock锁与订单号(或交易号)的生成

1.新建项目(控制台应用程序) 2.新建一个类:OrderIdHelper.cs 1 /// <summary> 2 /// 订单助手 3 /// </summary> 4 class OrderIdHelper 5 { 6 private static readonly object Locker = new object(); 7 private static string _tempId = ""; 8 9 /// <summary> 10 /

订单号生成办法

1.Redis Incr public class RedisConnection { private static readonly ConfigurationOptions ConfigurationOptions = ConfigurationOptions.Parse("127.0.0.1" + ":" + "6379"); private static ConnectionMultiplexer _redisConn; private

简易发号SQL,可用于生成指定前缀自增序列,如订单号,生成优惠券码等

需求1:订单号要求唯一.长度不太长.自增.但不能通过早上订单号和晚上订单号相减推算出平台大概一天的单量 需求2:要求生成10w张优惠券,要求券码唯一.不能太长,不能轻易猜测出其他券码 根据这些需求提供一个简单的数据库发号的sql来满足上面的需求,介绍如下 Increments表设计两个字段,Prefix和MaxNum,不需要设计主键和聚集索引,在Prefix上建立唯一索引,可Include[MaxNum]字段,这样查询时可以保证索引覆盖 将前缀和数据拼接的服务由应用来提供,数据库自负责拿到增加后

Thinkphp 生成订单号小案例

Thinkphp 生成订单号小案例小伙伴们在日常的商城项目开发中,都会遇到订单号生成的问题,今天呢思梦PHP就带领大家去解读一下生成订单号的问题!首先,订单号我们要明确它有有3个性质:1.唯一性 2.不可推测性 3.效率性,唯一性和不可推测性不用说了,效率性是指不能频繁的去数据库查询以避免重复.况且满足这些条件的同时订单号还要足够的短.不知道小伙伴们在日常的项目中是否也和我一样去思考过生成订单的一些小问题,可能你也会说,这些东西不用想的那么复杂,其实呢,小编也是同意大家的看法,但是殊不知我们做程

生成订单号

生成订单号,最大的问题是要考虑高并发的时候.在网上找的一些方案往往在这种情况下难以适用,比如,查询订单序列最大数,根据系统时间生成等. 再考虑另一种可行的方案:数据库递增序列,没错,确实能解决高并发的问题,但在集群等情况下对数据库压力比较大,而且有些数据库对递增序列没有很好的支持,同时递增序列的位数是一直增加的,也有可能会超出数据库表字段限制. 最好的方案是用java的uuid工具类生成唯一的字符串,然后再取这个字符串对象的hashcode值,因为字符串的值是唯一的,它的hashcode也是唯一