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