解决订单收据编号的累加问题。格式 D0000001;java+ mysql

版权声明:原创版权声明! https://blog.csdn.net/csdn4600/article/details/84029643

1.需求:第一次生成的订单号为:D0000001,以后的每个新订单编号都累加1;

2.实现思路

 当初我也是碰到一个需求里面要用到编号生成,百度看了一下别人的例子,好多都不符合我的需求,于是自己写了俩demo;同时也就发了出来,跟着思路随手写的当然里面还有很多需要优化的地方。

   1.直接在数据库写一个自定义函数; 以后要是如果有订单编号取值规则变动的话直接维护函数即可;这种方式对程序的兼容性和扩展性比较好;

-- 创建自定义函数 
create function testNum() returns varchar(50)
begin 
  -- 声明一个变量用来存放输出值
    declare outNumStr varchar(50);
    -- 查询逻辑体
    select concat(left('D0000000',length('D0000000') - length(cast(substr(signNum,2,length(signNum)) as unsigned)+1)),
            cast(substr(signNum,2,length(signNum)) as unsigned)+1) as signNum  
    FROM 你的订单表名 order by createTime desc limit 1 into outNumStr ;
   -- 返回值
     return outNumStr;
end;
/
-- 删除函数
drop function testNum
/
-- 查询函数
select  testNum() 

   2.第二种相对于第一种来讲比较繁琐一点,利用Java代码进行处理;先利用sql查询出来最大的编号,然后再进入工具类里面进行格式化处理;具体方法如下:

service调用的sql:

   /**
     * 编号+1
     * 第一次从D0000001开始;满十向左进位;编号超过7位溢出后异常;
     * 暂未作超出7位处理
     **/
    public static synchronized String signNum(){

        String num =  subscribeService.getMaxElecSignNum();
        String signNum = null;
        String numStr = "D0000000";//初始化计数字符串 
        if(num == null ||"".equals(num)){
            signNum = "D0000001";
        }else{
            Integer maxSignNum =  Integer.parseInt(num);
            maxSignNum = maxSignNum+1;
             signNum =  numStr.substring(0, numStr.length()-maxSignNum.toString().length()).concat(maxSignNum.toString());
        }
        return signNum;
    }

猜你喜欢

转载自blog.csdn.net/csdn4600/article/details/84029643