单据编号的生成
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 写道