工作中常常遇到流水号生成的问题,有的客户要求流水号必须连续,这个我们的开发工作提出了一个小难题。

  解决方法如下:

  方法一:采用最大号表的形式

  在数据库中创建一个表专门存放其他数据库的最大流水号,table_maxOrderID {table1_max,table2_max};

  在向数据库中插入数据的时候,首先想table_maxOrderId表查询到当前表的最大号加1,先更新最大号表,然后保存到业务数据。

  优点:效率高

  缺点:号码浪费大一些(例如保存的时候失败了,那么这个号码就浪费了。)

  方法二:采用抢号的形式

  这个不需要创建最大号表,在向数据库中保存数据的时候,获取当前表的最大流水号。例如:

  select max(ID) from tableName ; 让后将结果加一。

  优点:速度快,不浪费号码;

  缺点:并发的时候,号码重复造成数据无法保存。

  解决办法:抢号。如果保存失败,那么重复抢号例如:

  public synchronized String getOrderId(String shengid) {

  if (shengid == null || "".equals(shengid.trim())) {

  throw new NullPointerException("在获取流水号的时候,省id为空!获取流水号失败!");

  }

  // 首先查找所在地区查找企业表中有没有数据

  int num = xjqyDao.getCountBySql(" and qy_sheng='" + shengid + "'");

  String orderId = null;

  if (num == 0) {

  orderId = "0001";

  } else {

  //必须找到本省最大的档案的id

  String maxDabh = xjqyDao.getMaxDabhBySheng(shengid);

  num = Integer.parseInt(maxDabh.substring(6));

  String temp = (num + 1) + "";

  int LEN = temp.length();

  if (LEN > 4) {

  log.error("出错了!一个省的蚕茧收购加工企业的个数不能超过1万!");

  return null;

  }

  for (int i = 0; i < 4 - LEN; i++) {

  temp = "0" + temp;

  }

  orderId = temp;

  }

  return orderId;

  }
  

 for (int i = 0; i < 5; i++) { // 连续抢号5次,如果失败,请用户稍后再试!

  try {

  String orderId = getOrderId(xjqy.getSheng());// 获取连续的流水号 

  log.debug("获取到的连续的流水号为:" + orderId);

  String dabh = ""; // 档案编号

  String code = ""; // 企业编号

  dabh = xjqy.getSheng() + xjqy.getJdrq().substring(0, 4)

  + orderId;

  log.debug("档案编号为:" + dabh);

  xjqy.setDabh(dabh);

  // 所在省做了js校验

  if (xjqy.getShi() == null || xjqy.getShi().equals("")) {

  // 如果市为空

  code = xjqy.getSheng() + "0000" + xjqy.getLb()

  + orderId;

  } else if (xjqy.getXian() == null

  || xjqy.getXian().equals("")) {

  // 如果县为空

  code = xjqy.getShi() + "00" + xjqy.getLb() + orderId;

  } else {

  code = xjqy.getXian() + xjqy.getLb() + orderId;

  }

  log.debug("企业编号为:" + code);

  xjqy.setCode(code);

  xjqyDao.create(xjqy);

  log.debug("create object");

  flag = true;// 保存成功!

  break; // 退出循环

  } catch (Exception e) {

  log.debug("保存企业信息出错:", e);

  }

  }

  if (!flag) {

  throw new OurException("保存失败!请稍后重试!");

  }



  view plaincopy to clipboardprint?for (int i = 0; i < 5; i++) { // 连续抢号5次,如果失败,请用户稍后再试! try {String orderId = getOrderId(xjqy.getSheng());// 获取连续的流水号log.debug("获取到的连续的流水号为:" + orderId);String dabh = ""; // 档案编号String code = ""; // 企业编号dabh = xjqy.getSheng() + xjqy.getJdrq().substring(0, 4)+ orderId;log.debug("档案编号为:" + dabh);xjqy.setDabh(dabh);// 所在省做了js校验if (xjqy.getShi() == null || xjqy.getShi().equals("")) {// 如果市为空code = xjqy.getSheng() + "0000" + xjqy.getLb()+ orderId;} else if (xjqy.getXian() == null|| xjqy.getXian().equals("")) {// 如果县为空code = xjqy.getShi() + "00" + xjqy.getLb() + orderId;} else {code = xjqy.getXian() + xjqy.getLb() + orderId;} 

  log.debug("企业编号为:" + code);xjqy.setCode(code);xjqyDao.create(xjqy);log.debug("create object");flag = true;// 保存成功!break; // 退出循环} catch (Exception e) {log.debug("保存企业信息出错:", e);}}if (!flag) {throw new OurException("保存失败!请稍后重试!");}for (int i = 0; i < 5; i++) { // 连续抢号5次,如果失败,请用户稍后再试! 

  try {

  String orderId = getOrderId(xjqy.getSheng());// 获取连续的流水号

  log.debug("获取到的连续的流水号为:" + orderId);

  String dabh = ""; // 档案编号

  String code = ""; // 企业编号

  dabh = xjqy.getSheng() + xjqy.getJdrq().substring(0, 4)

  + orderId;

  log.debug("档案编号为:" + dabh);

  xjqy.setDabh(dabh);

  // 所在省做了js校验

  if (xjqy.getShi() == null || xjqy.getShi().equals("")) {

  // 如果市为空

  code = xjqy.getSheng() + "0000" + xjqy.getLb()

  + orderId;

  } else if (xjqy.getXian() == null

  || xjqy.getXian().equals("")) {

  // 如果县为空

  code = xjqy.getShi() + "00" + xjqy.getLb() + orderId;

  } else {

  code = xjqy.getXian() + xjqy.getLb() + orderId;

  }

  log.debug("企业编号为:" + code);

  xjqy.setCode(code);

  xjqyDao.create(xjqy);

  log.debug("create object");

  flag = true;// 保存成功!

  break; // 退出循环

  } catch (Exception e) {

  log.debug("保存企业信息出错:", e);

  }

  }

  if (!flag) {

  throw new OurException("保存失败!请稍后重试!");

  }小结:

  如果要从严格意义上生成连续的流水号,那么应该采用抢号的方法,同时限制用户不准删除记录,这样才能保证流水号的严格 连续,否则录入5条,删掉其中的2条,那么用户看到的记录的号码将无法连续了。


												

如何生成连续的流水号相关推荐

  1. 自动生成业务单据流水号方案

    我们在开发管理软件的时候,常常遇到流水号(单据号.登记号)自动生成.控制和管理的问题.由于流水号 具有唯一性和连续性的特点,在实际开发过程中若处理不好,会产生流水号重复及断号的问题.特别是多个并发用 ...

  2. python随机生成列表_python 实现快速生成连续、随机字母列表

    0.摘要 本文介绍了生成连续和随机字母表的方法,用于快速生成大量字母数据. 主要使用chr()函数,将数字通过ASCII表转换为相应字母. 1.chr() 函数 chr() 用一个范围在 range( ...

  3. 如何生成16位流水号

    如何生成16位流水号 原文:如何生成16位流水号 /*** @Description: 获取long类型16流水号* @return serialNo long类型16流水号* @date 2017年 ...

  4. html 自动日期,excel自动生成连续日期

    如何自动生成有规律连续的时间段,效果如下图 公式: =TEXT((19+(ROW()-1)/12)/24,"hh:mm") &"-" & TEX ...

  5. python读取rtsp流_python cv2读取rtsp实时码流按时生成连续视频文件方式

    我就废话不多说了,直接上代码吧! # coding: utf-8 import datetime import cv2 import os ip = '192.168.3.160'.replace(& ...

  6. php生成连续递增的excel列索引

    PHPExcel_IOFactory导出excel之列索引 生成连续递增的excel列索引 生成连续递增的excel列索引 俺其实是学java的,最近工作需要用到了php,有个导出excel的功能,改 ...

  7. UE4用Spline Component蓝图生成连续SplineMesh路径模型

    Spline Component(不是SplineMesh)是UE4常用的样条曲线组件,是生成各种可视化路径.控制物体运行轨迹.生成排列组合模型等的基础. Spline可以不断增加控制点,以生成复杂的 ...

  8. mysql存入订单号不重复_MSSQL高并发下生成连续不重复的订单号

    一.确定需求 只要做过开发的基本上都有做过订单,只要做过订单的基本上都要涉及生成订单号,可能项目订单号生成规则都不一样,但是大多数规则都是连续增长. 所以假如给你一个这样的需求,在高并发下,以天为单位 ...

  9. 低代码学习教程:生成固定格式流水号

    方法1:RECNO() 方法2:MAPX() 表单设计中经常涉及流水号的制作问题,下面就分别介绍下两种编号的实现方法,大家可以根据需要自行选择. 注意: 百数已支持[流水号]控件,如有特殊要求可参考文 ...

最新文章

  1. 35国,14年,世界最大科学项目,「人造太阳」即将诞生!
  2. C语言flood fill 泛洪算法(附完整源码)
  3. 四川中级职称计算机考试考b级,四川省职称计算机B级考试1卷
  4. 【今日CS 视觉论文速览】Wed, 16 Jan 2019
  5. POS Tagging 标签类型查询表(Penn Treebank Project)
  6. 银河水滴张曼:远距离步态识别系统与应用 |量子位沙龙回顾
  7. .net登录界面_JAVA实现简单的用户登录客户端
  8. HTTP中的POST、GET区别
  9. ExtJS 教程目录
  10. 透明网桥算法c++实现
  11. 《中华颂》朗诵比赛准备
  12. oracle中的userenv,Oracle 中的userenv()
  13. LL(1)预测分析程序
  14. 制造企业使用APS计划排产需要的条件
  15. 如何使用FFmpeg的解码器
  16. 一、ping与arping介绍
  17. 监控系统为什么要加流媒体服务器,视频监控系统为什么要使用流媒体服务器做视频分发?...
  18. 2.4.XXX 内核配置 介绍
  19. mysql当前读与快照读
  20. WordNet发展概况

热门文章

  1. 以太坊开发入门实战视频教程-杨正威-专题视频课程
  2. 自己制作本地yum源镜像
  3. 如何预防嗓音障碍使其健康
  4. 短视频的引爆点在哪?
  5. 简单认识JavaScript 与 DOM结构的文本、标签和属性节点
  6. 直播平台开发,防止直播过程中被截屏或录屏
  7. 【无标题】AP计算机全方位解读
  8. Cocos Creator 教程:生成二维码
  9. 电商小程序实战教程-店铺数据源设计
  10. [HTML5CSS3]20 个酷炫 应用及源码