java 一号店生成订单号的部分代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 一号店生成订单号的部分代码相关的知识,希望对你有一定的参考价值。

package com.yihaodian.gos.create.utils;

import com.yihaodian.gos.constant.GosConfigDefaultValue;
import com.yihaodian.gos.constant.dict.GosConfigDict;
import com.yihaodian.gos.genid.util.GenPrimaryKeyFactory;
import com.yihaodian.gos.utils.CharUtils;
import com.yihaodian.gos.utils.GosConfigUtils;

public class PrimaryUtils {
	public static final String PRIMARY_SO="primary_so";
	public static final String PRIMARY_SO_ITEM="primary_so_item";
	public static final String PRIMARY_SO_DELIVERY="primary_so_delivery";
	/**第十五校验位的权重,由14个数字组成*/
	private static final int[] WEIGHT={7,9,10,5,8,4,2,1,6,3,7,9,10,5};    
	/**第十五校验位的校验码,由11个数字组成,按照模11的方式获取*/
	private static final char[] VALIDATE={ '1','0','5','9','8','7','6','5','4','3','2'};   
	
	/**seq对应的订单ID 14位数*/
	private static final int NUM = 14;
	/**userid对应的末3位位数*/
	private static final int NUM_USER = 3;	
	
	/**除数:用于内部校验码生成*/
	private static final int MOD = 11;	
	/**除数:用于获取userid末3位*/
	private static final int MOD_USER = 1000;
	
	/**
	 * 根据用户ID生成订单ID
	 * @param userId
	 * @return 订单ID
	 */
	public static long genSoId(Long userId){
		// 获取步长除数
		long modConfig = GosConfigUtils.getValueByKeyAndTypeLong(GosConfigDict.ORDER_SHARD_MOD_INC, 
				GosConfigDict.TYPE_BUSINESS, 
				GosConfigDefaultValue.ORDER_SHARD_MOD_INC_DEFAULT);
		// 获取步长
		int inc = (int) (System.currentTimeMillis() % modConfig + 1);
		// 获取前14位
		long seq14 = GenPrimaryKeyFactory.nextPrimaryKey(PRIMARY_SO, inc);
		// 获取内部校验位
		char char014[] = CharUtils.longTochars(seq14, new char[NUM]);
		char char015 = getValidateCode(char014);
		// 获取用户ID末3位
		char user[] = CharUtils.longTochars(userId % MOD_USER, new char[NUM_USER]) ;
		// 拼接出数据库保存的订单ID
		char char15[] = CharUtils.charsAdd(char014, char015);
		char char18[] = CharUtils.charsAdd(char15, user);
		return CharUtils.charsToLong(char18);
	}

	/**
	 * 获取内部校验码,以char的形式返回
	 * @param char14 
	 * @return char 校验码 (数字型字符)
	 */
	public static char getValidateCode(char char14[]) {
		int sum = 0;
		int mode = 0;
		for (int i = 0; i < char14.length; i++) {
			sum = sum + Integer.parseInt(String.valueOf(char14[i]))
					* WEIGHT[i];
		}
		mode = sum % MOD;
		return VALIDATE[mode];
	}

	public static long genSoItemId(){
		return GenPrimaryKeyFactory.nextPrimaryKey(PRIMARY_SO_ITEM);
	}

	public static long genSoDeliveryId(){
		return GenPrimaryKeyFactory.nextPrimaryKey(PRIMARY_SO_DELIVERY);
	}
	
	public static String genSoCode(long id){
		return String.valueOf(id);
	}
	
}

以上是关于java 一号店生成订单号的部分代码的主要内容,如果未能解决你的问题,请参考以下文章

iOS跳转第三方应用举例一号店和京东

javascript跨域传递消息总结

java怎么自动生成订单号

《程序员》杂志精选:1号店电商峰值与流式计算

java自动生成订单编号问题?

java中怎么自动生成出入库单号?