读书人

字据编号的生成

发布时间: 2012-11-08 08:48:12 作者: rapoo

单据编号的生成

1. 单据编号的构成

????????? 为了避免重复及保持有序性,单据编号通常格式为 “关键字+YYMMDD+n位流水号,当然具体规则会根据业务需?? 要变化,包括 年月日的显示变化和流水号的位数变化(及编号升序);

?????? 例如: YS0812250001, YS200812250001,YS2008120001,YS081225001

?

2.代码实现关键

?????? 生成单据号的关键点归纳为两点:a.确定生成规则;b.查询当天尾数最大的单据号

?

3.范例

?

??? /*
???? * TODO:(新增时)生成单据编号(编码规则:“YN”+年月(4位)+流水号(4位) 如YN08110001)
???? * 单据号共10位

???? */
??? public String creatBudPlanNo()
??? {
???????
??????? // 初始化Plan
??????? Plan plan = new Plan();
??????? List<Plan> planList = new ArrayList<Plan>();
??????? // 生成单据编号的前面部分;YN+YY+MM+(四位流水)
??????? String planNoStr = "YN";

??????? //日期格式化--YYMM
??????? String currentDateStr = DateUtil.getDate(DateUtil.getCurrentDate());// 格式为YYYY-MM-DD
??????? String currentDate = currentDateStr.replaceAll("-", "");// 去掉中间的"-"
??????? currentDate = currentDate.substring(2, 6);// 从第三位开始取4个字符(即去掉前后两位)
??????? // 得到 YN+YY+MM
??????? planNoStr = planNoStr + currentDate;
??????? // 取得流水号,查询数据库与planNoStr进行匹配(可模糊查询)
??????? plan.setBudPlanNo(planNoStr);
??????? // 如果查询到记录,则在最大的送检编号基础上加1生成新的编号,如果没有记录则构建"YN+YY+MM+0001"
??????? planList = findByModel(plan);
??????? if (null != planList && planList.size() > 0)
??????? {
??????????? // 循环比较得到最大的ID对应的是那条记录编号t---从而取得最大的送检编号),
??????????? int t = 0;
??????????? // 用于存储id
??????????? long m = 0;
??????????? // 用于存储i值对应的id
??????????? long n = 0;
??????????? for (int i = 0; i < planList.size(); i++)
??????????? {
??????????????? m = planList.get(t).getId();
??????????????? n = planList.get(i).getId();
??????????????? // 比较id值,将更大的id值对应的记录号赋给t
??????????????? if (m < n)
??????????????? {
??????????????????? t = i;
??????????????? }
??????????? }
??????????? // 如果存在,取出最大的编号,取出后四位,转化为Long进行计算
??????????? if (!StringUtil.isRealEmpty(planList.get(t).getBudPlanNo()))
??????????? {
??????????????? // 取得编号
??????????????? String str = planList.get(t).getBudPlanNo();
??????????????? // TODO 先判断是否是长度为10(单据位数),如果不是则提醒有无效数据
??????????????? if (10 != str.length())
??????????????? {
??????????????????? return null;
??????????????? }
??????????????? // 取得字符串长度
??????????????? int k = 0;
??????????????? k = str.length();
??????????????? if (4 < k)
??????????????? {
??????????????????? // 取出最后四位,转换为Long型,自加1;
??????????????????? str = str.substring(k - 4);
??????????????????? long ln = Long.parseLong(str);
??????????????????? if (9999 > ln)
??????????????????? {
??????????????????????? ln++;
??????????????????????? // 转回string类型,将不足3位处补零,组合得到后三位流水号
??????????????????????? str = Long.toString(ln);
??????????????????????? String temp = "";
??????????????????????? for (int i = 0; i < (4 - str.length()); i++)
??????????????????????? {
??????????????????????????? temp += "0";
??????????????????????? }
??????????????????????? str = temp + str;
??????????????????????? // 得到单据编号
??????????????????????? planNoStr = planNoStr + str;
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? return null;
??????????????????? }
??????????????? }
??????????? }
??????? }
??????? else
??????? {
??????????? // 如果没有记录则构建"YN+YY+MM+0001",为编号文本框赋值
??????????? planNoStr = planNoStr + "0001";
??????? }
??????? return planNoStr;
??? }

??

2 楼 xiaoluojinsheng 2009-01-13 有一问题,你这方法如何避免数据库并发? 3 楼 simon_du 2009-01-29 xiaoluojinsheng 写道
有一问题,你这方法如何避免数据库并发?

:),这个问题还没考虑到,如果有好的方法,大家一起分享一下,谢谢,新年快乐!!

读书人网 >软件架构设计

热点推荐