多语言展示
当前在线:1178今日阅读:172今日分享:19

java根据年月日生成订单号+序号

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。      Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 。     订单一般是电商用来区分商品所使用的一组号码。一般是以年月日加序号,序号的位数一般4到8位,这个需要根据日销量来决定。
工具/原料
1

电脑

2

myeclipse或者intellij IDEA

第一步骤:新建一个javaweb项目。

打开myeclipse file --》new--》web project 具体操作如下图所示:

第二步骤:功能实现
1

第一步:实现思路。1、首先获取年月日将日期格式化为自己需要的格式。2、按4到6位的序号+当前年月日存储到数据库或者文件中(理论上文件的读取效率更高,在操作比较频繁的情况下使用文件更合适)3、每次读取时判断日期是否相同如果不同更新日期,并将序号重置。(保证每个年月日的单号都是从初始化的“00001”这样开始)

2

第二步:文件的读写工具类FileUtil1、实现存储文件生成文件的方法rewrite2、实现读取dat文件的方法readList3、具体代码如下:import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;import java.util.List;public class FileUtil { public static void rewrite(File file, String data) { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(file)); bw.write(data); } catch (IOException e) { e.printStackTrace(); } finally { if (bw != null) { try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static List readList(File file) { BufferedReader br = null; List data = new ArrayList(); try { br = new BufferedReader(new FileReader(file)); String str = null; while ((str = br.readLine()) != null) { data.add(str); } } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return data; }}

3

第三步:生成存储订单号。1、主抽象类SerialNumberpublic abstract class SerialNumber { public synchronized String getSerialNumber() { return process(); } protected abstract String process();}2、抽象继承类EveryDaySerialNumber import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.Date;public abstract class EveryDaySerialNumber extends SerialNumber { protected final static SimpleDateFormat sdf = new SimpleDateFormat( 'yyyyMMdd'); protected DecimalFormat df = null; public EveryDaySerialNumber(int width) { if (width < 1) { throw new IllegalArgumentException( 'Parameter length must be great than 1!'); } char[] chs = new char[width]; for (int i = 0; i < width; i++) { chs[i] = '0'; } df = new DecimalFormat(new String(chs)); } protected String process() { Date date = new Date(); int n = getOrUpdateNumber(date, 1); return format(date) + format(n); } protected String format(Date date) { return sdf.format(date); } protected String format(int num) { return df.format(num); } /** * 获得序列号,同时更新持久化存储中的序列 *  * @param current *            当前的日期 * @param start *            初始化的序号 * @return 所获得新的序列号 */ protected abstract int getOrUpdateNumber(Date current, int start);}

4

第四步:逻辑功能类FileEveryDaySerialNumberimport java.io.File;import java.util.Date;import java.util.List;import order.EveryDaySerialNumber;public class FileEveryDaySerialNumber extends EveryDaySerialNumber {/*** 持久化存储的文件*/private File file = null;/*** 存储的分隔符*/private final static String FIELD_SEPARATOR = ',';public FileEveryDaySerialNumber(int width, String filename) {super(width);file = new File(filename);}@Overrideprotected int getOrUpdateNumber(Date current, int start) {String date = format(current);int num = start;if (file.exists()) {List list = FileUtil.readList(file);String[] data = list.get(0).split(FIELD_SEPARATOR);if (date.equals(data[0])) {num = Integer.parseInt(data[1]);}}FileUtil.rewrite(file, date + FIELD_SEPARATOR + (num + 1));return num;}}

第三步骤:功能测试
1

第一步:编写功能测试代码。import java.util.concurrent.TimeUnit;/** * JAVA版本的自动生成有规则的订单号(或编号) 生成的格式是: 2 前面几位为当前的日期,后面五位为系统自增长类型的编号 原理: * 1.获取当前日期格式化值; 2.读取文件,上次编号的值+1最为当前此次编号的值 (新的一天会重新从1开始编号) */public class TestOrderNo { public static void main(String[] args) throws InterruptedException { SerialNumber serial = new FileEveryDaySerialNumber(5, 'SerialOrder.dat'); while (true) { System.out.println(serial.getSerialNumber()); TimeUnit.SECONDS.sleep(2); } }}

2

第二步:执行main方法。测试结果如下下图所示:(生成的SerialOrder.dat文件默认在当前项目下)

注意事项
1

jdk1.6 myeclipse2010

2

获取dat文件内容可是使用for循环替换while循环:for (String str = null; (str = br.readLine()) != null;) { data.add(str); }

推荐信息