`

电子商务订单号生成策略

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

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;
}

}
分享到:
评论

相关推荐

    web项目里用到的工具类(正则校验、图片验证码、json解析、订单号生成)

    例如,正则校验类可以提供更多的验证规则,图片验证码类可以支持自定义颜色、背景、字体等,订单号生成类可以考虑更多的业务需求,如区分不同的订单类型等。这些工具类的复用不仅简化了开发工作,还降低了维护成本。

    PHP生成唯一订单号

    一个良好的订单号生成策略可以保证订单的唯一性,避免因为订单号重复造成的数据错误和管理混乱。 在提供的文件中,介绍了两种生成唯一订单号的方法。这两种方法都使用了日期、时间戳、微秒数和随机数等元素来构建一...

    生成订单编码

    在电子商务和企业管理中,生成订单编码是一个至关重要的过程,它确保了每一笔交易的独特性和可追溯性。订单编号是订单处理系统中的一个核心组件,它通常由一系列数字、字母或两者组合而成,用于唯一地标识每个订单。...

    php电子商务系统电子商务系统

    在设计时,需要考虑用户表(包含用户名、密码、联系方式等)、商品表(商品ID、名称、描述、价格等)、购物车表(用户ID、商品ID、数量)、订单表(订单号、用户ID、商品详情、总价、状态)、支付表(订单号、支付...

    java 电子商务 源码

    Java电子商务源码是一种用于开发在线购物平台的软件代码,它基于Java编程语言,涵盖了电子商务系统的各项功能模块。本文将深入探讨这些源码背后的原理、设计模式以及如何利用它们来构建一个完整的电子商务系统。 1....

    PHP最实用的电子商务网站案例

    订单处理涉及多个步骤,包括确认订单详情、计算总价、生成订单号、更新库存,并触发支付流程。在这个过程中,PHP可以与第三方支付网关如PayPal或Stripe进行接口集成,安全地处理用户的支付信息,确保交易的安全。 ...

    ASP做的电子商务网站

    4. **订单处理**:用户提交订单后,ASP可以验证用户信息、处理支付请求、检查库存、生成订单号等,确保订单的准确无误。 5. **支付集成**:电子商务网站通常需要集成第三方支付平台,如支付宝、微信支付等。ASP可以...

    电子商务网站电子商务网站

    3. 订单处理:在用户完成购物后,ASP可以处理订单信息,包括验证用户输入、计算运费、生成订单号等。同时,ASP还可以通过邮件服务向用户发送订单确认信息。 4. 用户账户管理:ASP可以提供用户注册、登录、密码重置...

    基于WAP技术的移动电子商务平台的设计

    3. **订单表**:记录所有交易记录,包括订单号、商品信息、购买者信息、支付状态等。 4. **支付表**:跟踪支付信息,包括支付方式、金额、交易时间等。 5. **物流表**:记录商品的配送信息,如发货地址、收货地址、...

    电子商务系统需求报告

    【电子商务系统需求报告】 在构建一个电子商务系统时,首要任务是明确系统的需求,以便为用户提供高效、便捷且安全的在线交易环境。以下是根据提供的报告内容,解析出的关键知识点: 1. **用户模块**: - **用户...

    利用sql函数生成不重复的订单号的代码

    首先,我们创建了一个名为`dbo.GetOrderNum`的SQL函数,它接收一个参数`@ebaystockflag`,这个参数通常用于表示订单的特定规则或来源(例如,'B'可能代表'Buy'或'电子商务平台')。函数返回一个字符串类型的订单号,...

    电子商务商城源代码

    3. **订单处理**:当用户下单后,系统会自动处理订单,包括生成订单号、计算总价、处理优惠券或折扣、确认支付状态等。同时,它还需要与库存系统实时同步,确保商品的可购性。 4. **支付集成**:集成多种支付方式,...

    网上商店程序(VB)源码_dotnet电子商务系统源代码.rar

    4. **订单处理**:当用户完成购物并提交订单时,系统会处理订单信息,包括计算总价、验证库存、生成订单号等。订单状态(如待付款、待发货、已完成等)也会被跟踪记录。 5. **支付集成**:电子商务系统通常需要与第...

    电子商务二手交易网站

    【电子商务二手交易网站】是一种在线平台,它允许个人和企业买卖二手商品,为用户提供便捷的交易体验。在电子商务课程设计中,这样的项目是理解和实践电商运营、网站开发和用户交互设计的重要实例。在这个系统中,...

    php生成唯一的订单函数分享

    在电子商务和类似电子商务的系统中,订单号的生成是一个至关重要的功能,因为它需要确保每个订单的唯一性,以便于跟踪和管理。在PHP中,有多种方法可以生成唯一的订单号,而本文主要讨论的是一个自定义的函数,用于...

    基于Java的在线电子商务网站设计与实现.pdf

    9. 订单管理流程:订单模块处理用户购买商品后的结算、选择送货和付款方式、生成订单号等功能,是电子商务交易的核心环节。 10. 热门商品排序:通过记录商品点击量和购买量,系统可以自动更新热门商品排名,从而...

    电子商务 流程图 图

    电子商务流程图是描述在线商业活动从开始到结束的可视化工具,涵盖了从消费者购买到商家配送的各个阶段。这里我们将深入探讨BtoC(Business to Consumer)和BtoB(Business to Business)两种主要的工作流程,并关注...

    电子商务系统数据库设计(一)

    4. 订单历史表:保存用户的购买记录,包括订单号、商品信息、购买时间、总价等。 5. 收藏夹表:存储用户收藏的商品信息。 6. 评价表:记录用户对商品的评价和评分。 其次,“管理员.xmind”文件可能涉及管理员角色...

    网络电子商务网站在线购物系统源码

    网络电子商务网站在线购物系统源码是构建一个完整的电商网站的核心组成部分,它包含了处理用户交互、商品展示、订单处理、支付接口集成、库存管理等多个关键功能的编程代码。这个源码通常基于一种或多种编程语言,如...

    asp.net电子商务网站后台模板

    ASP.NET电子商务网站后台模板是一款专为电子商务平台设计的管理界面模板,它提供了高效、直观且美观的用户界面,便于管理员进行商品管理、订单处理、用户管理等日常运营工作。这款模板通常包含了一系列预设的页面...

Global site tag (gtag.js) - Google Analytics