`

电子商务订单号生成策略

 
阅读更多
一般采用: 时间+序列号

20111001+000001 = 20111001000001
规则 : 前面以年月日前缀+序列号每天从1天始 第二天又是从1开始

代码:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.sql.DataSource;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.springframework.batch.item.database.support.DefaultDataFieldMaxValueIncrementerFactory;
import org.springframework.batch.support.DatabaseType;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;

public class DailyRollingIncrementer implements InitializingBean {

/**
* define bean as :
* <bean id="dailyRollingIncrementer" class="com.book511.incrementer.DailyRollingIncrementer">
*   <property name="dataSource" ref="dataSource"/>
*   <property name="incrementerName" value="TEST_SEQ"/>
*  </bean>

*  and run sql in MySQL as :
*  CREATE TABLE TEST_SEQ (ID BIGINT NOT NULL) ENGINE=MYISAM;
*  INSERT INTO TEST_SEQ(id) select 0 from DUAL where not exists (select id from TEST_SEQ);
*  CREATE TABLE TEST_SEQ_ROLLING (`YMD` CHAR(8) NOT NULL , `SEQ_NUMBER` BIGINT NULL , PRIMARY KEY (`YMD`) ) ENGINE = MyISAM;

*/
private String incrementerName;

private DataSource dataSource;

private DefaultDataFieldMaxValueIncrementerFactory maxValueIncrementerFactory;

private DataFieldMaxValueIncrementer maxValueIncrementer;

private String rollingTable;


private String selectSql;

private String insertSql;

private String currentYmd = null;

private Long currentSeq = null;

private DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYYMMdd");

/**
* Caution !!!
* you should check if return value is not 0
* @return
*/
public long nextLongValue() {
DateTime dt = new DateTime();
String ymd = formatter.print(dt);
return nextLongValue(ymd);
}


public synchronized long nextLongValue(String ymd) {
Long nextSeq = 0L;
try {
nextSeq = maxValueIncrementer.nextLongValue();
System.out.println("nextSeq is : " + nextSeq);
} catch (Exception e) {
return 0L;
}
long number = seqNumber(ymd);
if (number == 0) {
number = nextSeq;
insertSeqNumber(ymd, number);
/*try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}*/
}
return nextSeq - number + 1;
}

private synchronized long seqNumber(String ymd) {
if (ymd != null) {
if (ymd.equals(currentYmd))
return currentSeq;
}
Connection con = null;
PreparedStatement selectPreparedStatement = null;
try {
con = DataSourceUtils.getConnection(getDataSource());
selectPreparedStatement = con.prepareStatement(selectSql);
DataSourceUtils.applyTransactionTimeout(selectPreparedStatement,
getDataSource());
selectPreparedStatement.setString(1, ymd);
ResultSet rs = selectPreparedStatement.executeQuery();
if (rs.next()) {
long seq = (long) rs.getLong(1);
currentYmd = ymd;
currentSeq = seq;
return seq;
}
} catch (Exception ex) {
// throw new DataAccessResourceFailureException(
// "Error ...", ex);
} finally {
JdbcUtils.closeStatement(selectPreparedStatement);
DataSourceUtils.releaseConnection(con, getDataSource());
}
return 0;
}

private synchronized boolean insertSeqNumber(String ymd, long seqNumber) {
Connection con = null;
PreparedStatement selectPreparedStatement = null;
try {
con = DataSourceUtils.getConnection(getDataSource());
PreparedStatement insertPreparedStatement = con
.prepareStatement(insertSql);
insertPreparedStatement.setString(1, ymd);
insertPreparedStatement.setLong(2, seqNumber);
int count = insertPreparedStatement.executeUpdate();
System.out.println("count is : " + count);
return count > 0;
} catch (Exception ex) {
System.out.println("seqNumber = " + seqNumber);
ex.printStackTrace();
} finally {
JdbcUtils.closeStatement(selectPreparedStatement);
DataSourceUtils.releaseConnection(con, getDataSource());
}
return false;
}

public String genSn(int bit){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date dNow = new Date();
String dateStr = sdf.format(dNow).toString();
long v = nextLongValue(dateStr);
String v_s = String.valueOf(v);
int num = getNumBit(v_s);
if(num<bit){
int zeroNum = bit - num;
String zeroStr = "";
for(int i=0;i<zeroNum;i++){
zeroStr += "0";
}
System.out.println("result is : " + zeroStr);
v_s = zeroStr + v_s;
}
if(v_s.length()!=bit){
System.out.println("error");
}
return v_s;
}

public int getNumBit(String str){
if(str!=null){
str = str.trim();
}
int numlen=0;
        for (int i=0;i<str.length();i++){
            System.out.print(str.substring(i, i+1)+",");//substring把STR的每一个字符取出
            numlen++;//计数
        }
return numlen;
}


@Override
public void afterPropertiesSet() throws Exception {
DatabaseType incrementerType = DatabaseType.fromMetaData(dataSource);
maxValueIncrementerFactory = new DefaultDataFieldMaxValueIncrementerFactory(
dataSource);
maxValueIncrementer = maxValueIncrementerFactory.getIncrementer(
incrementerType.getProductName(), incrementerName);
rollingTable = incrementerName + "_ROLLING";
selectSql = "select SEQ_NUMBER from " + rollingTable + " where YMD = ?";
insertSql = "insert into " + rollingTable + "(YMD,SEQ_NUMBER) values(?,?)";
}

public String getIncrementerName() {
return incrementerName;
}

public void setIncrementerName(String incrementerName) {
this.incrementerName = incrementerName;
}

public DataSource getDataSource() {
return dataSource;
}

public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}

}
分享到:
评论

相关推荐

    2009计算机 毕业设计 诚信体育用品

    更快速的流通和低廉的价格:电子商务减少了商品流通的中间环节,节省了大量的开支,从而也大大降低了商品流通和交易的成本。 更符合时代的要求:如今人们越来越追求时尚、讲究个性,注重购物的环境,网上购物,更能...

    唐网中英繁(三语)企业网站管理系统源码asp+access

    本系统有宣传,介绍,展示,推广,销售公司企业产品与服务,开展网上电子商务业务的,实现营利,是整站系统设计功能的最终目标.完善的网站子模块,如企业简历,企业文化,企业新闻,业内资讯,产品展示,下载中心,企业荣誉,营销...

    企业网站管理系统

    本系统有宣传,介绍,展示,推广,销售公司企业的产品与服务,开展网上电子商务业务的,实现营利,是整站系统设计功能的最终目标.完善的网站子模块,如企业简历,企业文化,企业新闻,业内资讯,产品展示,下载中心,企业荣誉,营销...

    PHP和MySQL Web开发第4版pdf以及源码

    第14章 运营一个电子商务网站 14.1 我们要实现什么目标 14.2 考虑电子商务网站的类型 14.2.1 使用在线说明书公布信息 14.2.2 接收产品或服务的订单 14.2.3 提供服务和数字产品 14.2.4 为产品或服务增值 ...

    PHP和MySQL Web开发第4版

    第14章 运营一个电子商务网站 14.1 我们要实现什么目标 14.2 考虑电子商务网站的类型 14.2.1 使用在线说明书公布信息 14.2.2 接收产品或服务的订单 14.2.3 提供服务和数字产品 14.2.4 为产品或服务增值 ...

    客户管理的相关概念和事例

    电子商务。  主要功能包括:个性化界面、服务;网站内容管理;店面;订单和业务处理;销售空间拓展;客户自助服务;网站运行情况的分析和报告。  当然,如果我们把观察的镜头更换一下就会发现,国内CRM市场有着待...

    PHP和MySQL WEB开发(第4版)

    第14章 运营一个电子商务网站 14.1 我们要实现什么目标 14.2 考虑电子商务网站的类型 14.2.1 使用在线说明书公布信息 14.2.2 接收产品或服务的订单 14.2.3 提供服务和数字产品 14.2.4 为产品或服务增值 14.2.5 减少...

    MallBuilder多用户商城管理系统官方v1.0

    MallBuilder为拓展企业销售渠道,突显电子商务商业价值,致力于推动电子商务技术的发展而不断努力。 多语言英文版 系统采用独立语言包开发模式,可以制作不语言版的商城,现英文版已经发布,轻松满足您进军海外的...

    MallBuilder多用户商城管理系统最新官方版

    MallBuilder为拓展企业销售渠道,突显电子商务商业价值,致力于推动电子商务技术的发展而不断努力。 多语言英文版 系统采用独立语言包开发模式,可以制作不语言版的商城,现英文版已经发布,轻松满足您进军海外的...

Global site tag (gtag.js) - Google Analytics