单据编号的生成

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

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值