请教一个问题,系统自动生成的一个流水码,由今年年份数字4位+从0001-9999每次递增1的4位数字组成的8位字符串。。。
该编号由当年年份的4位数字(如2010)+0001-9999的4位每次递增1的4位数字(如0002)组成的8位字符串(20100002)
这个是写在DaoImpl内的。。具体该怎么做。。感谢指导
[解决办法]
我这有个差不多的,利用数据库生成的,可以参考下
- Java code
package com.hhh.platform.beton.tm.share;import java.util.Calendar;import java.util.HashMap;import java.util.Map;import com.hhh.platform.beton.tm.dao.current_number.Current_numberDao;/** * 编号生成器(暂用,以后再做进一步修改) * 默认生成格式为:yyyy-xxxxx格式 * @author 3hlgw * */public class NumberGenerater { private static final String TIME_FORMATER = "yyyy"; //时间格式 private static final String SERIAL_NUMBER = "XXXXX"; //流水号格式 private static final String NUMBER_FORMATER = TIME_FORMATER+"-"+SERIAL_NUMBER; //编码格式 private static final String SERIAL_CHAR="X"; private static NumberGenerater numberGenerater = null; private NumberGenerater(){ } /** * 取得NumberGenerater的单例实现 * @return */ public static NumberGenerater getInstance(){ if(numberGenerater==null){ synchronized(NumberGenerater.class){ if(numberGenerater==null){ numberGenerater = new NumberGenerater(); } }; } return numberGenerater; } /** * 生成下一个编号 * @param type * @param customer_id * @return */ public synchronized String geneterNextNumber(int type,String customer_id){ Current_numberDao current_numberDao = new Current_numberDao(); //判断项目是否已经有编号存在 boolean isExist = this.isExistNumber(type, customer_id); //取得序列号格式化字符串// int serial_start_index = NUMBER_FORMATER.indexOf(SERIAL_CHAR);// int serial_end_index = NUMBER_FORMATER.lastIndexOf(SERIAL_CHAR); int count =SERIAL_NUMBER.length(); StringBuilder sb = new StringBuilder(); for(int i=0;i<count;i++){ sb.append("0"); } java.text.DecimalFormat df = new java.text.DecimalFormat(sb.toString()); //如果存在 if(isExist){ //取得数据库中现存的编号 Map<String,Object> parametersMap = new HashMap<String,Object>(); parametersMap.put("TYPE", type); parametersMap.put("CUSTOMER_ID", customer_id); Map resultMap = current_numberDao.getCurrent_number(parametersMap); String old_current_number = (String) resultMap.get("CURRENT_NUMBER"); //数据库所存的编号的年 String year_str = old_current_number.substring(0,4); int current_number_year = Integer.parseInt(year_str); //数据库所存的编号的流水号 String seriou_num_str = old_current_number.substring(5,10); int current_number_seriou = Integer.parseInt(seriou_num_str); //当前系统时间的年份 Calendar nowCalendar = Calendar.getInstance(); int year = nowCalendar.get(Calendar.YEAR); if(year>current_number_year){ int current_serial =1 ; //生成当前的流水号 String current_serial_number = df.format(current_serial); String current_number = year+"-"+current_serial_number; this.updateCurrent_Number(type, customer_id, current_number); return current_number; }else{ int current_serial =1+current_number_seriou ; //生成当前的流水号 String current_serial_number = df.format(current_serial); String current_number = year+"-"+current_serial_number; this.updateCurrent_Number(type, customer_id, current_number); return current_number; } //不存在 }else{ int current_serial =1 ; //当前的流水号 String current_serial_number = df.format(current_serial); //取得当前所在年份 Calendar nowCalendar = Calendar.getInstance(); int year = nowCalendar.get(Calendar.YEAR); String current_number = year+"-"+current_serial_number; this.updateCurrent_Number(type, customer_id, current_number); return current_number; } } /** * 修改当前编号 * @param type 项目ID * @param customer_id * @param current_number */ public void updateCurrent_Number(int type,String customer_id,String current_number){ Map<String, Object> parametersMap = new HashMap<String, Object>(); parametersMap.put("TYPE", type); parametersMap.put("CUSTOMER_ID", customer_id); parametersMap.put("CURRENT_NUMBER", current_number); boolean isExist = this.isExistNumber(type, customer_id); Current_numberDao current_numberDao = new Current_numberDao(); if(isExist){ current_numberDao.updateCurrent_number(parametersMap); }else{ current_numberDao.saveCurrent_number(parametersMap); } } /** * * 判断指定用户指定类型的当前编号是否已经存在 * @param type * @param customer_id * @return */ private boolean isExistNumber(int type,String customer_id){ boolean isExist = false; Current_numberDao current_numberDao = new Current_numberDao(); Map<String, Object> parametersMap = new HashMap<String, Object>(); parametersMap.put("TYPE", type); parametersMap.put("CUSTOMER_ID", customer_id); Map resultMap = current_numberDao.countCurrent_number(parametersMap); if(resultMap==null){ isExist =false; }else{ java.math.BigDecimal total = (java.math.BigDecimal) resultMap.get("TOTAL"); if(total.longValue()>0){ isExist =true; }else{ isExist =false; } } return isExist; } }
[解决办法]
你首先要获取最大的那个流水号,具体的就不说了
String str = "";
String aa = "20100054";
String bb = aa.substring(4,8);
long cc = new Long(bb) + 1;
if (cc < 10) {
str = "000"+cc;
}else if (cc < 100) {
str = "00"+cc;
}else if (cc < 1000) {
str = "0"+cc;
}else {
str = ""+cc;
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
String returnString = dateFormat.format(new Date()) + str;
[解决办法]
我这没文档,你自己查一下,不过有个思路
- Java code
Date date = new Date();date.setTime(System.currentIimeMills());//毫秒数设置当前时间SimpleDateFormat sdf = new SimpleDateFormat("yyyy");String year = sdf.format();/*这里你应该定义一个方法getMaxCode(),是返回数据库最新一条数据的id,就是你那个流水码*/String maxCode = getMaxCode();String str = maxCode.subString(4);//截取最后4位字符int num = Integer.parseInt(str);num++;String numCode = "";if(num >= 0 && num < 10) { numCode = "000" + num;} else if(num >= 10 && num < 100) { numCode = "00" + num;} else if(num >= 100 && num < 1000) { numCode = "0" + num;} else { numCode = "" + num;}String resultCode = maxCode + numCode;/*入库*/
[解决办法]
Java code
Date date = new Date();
date.setTime(System.currentIimeMills());//毫秒数设置当前时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
String year = sdf.format();
这种是一般的做法,根据日前生成。
[解决办法]
这个流水码的数据应该在数据库中有保存的吧,那么直接用DB的写一个function不就可以了啊
- SQL code
BEGIN --定义一个8位的流水码临时变量 DECLARE NWE_ID VARCHAR(8);. --定义一个4位的年份变量 DECLARE YYYY VARCHAR(4); SET NWE_ID=NULL; -- 取得当前的年份 SET YYYY = DATE_FORMAT(NOW(), '%Y'); -- SELECT SCOUT_CODE INTO NWE_ID FROM CONSIGN -- 以指定年份V_YEAR取得最大流水码 WHERE LEFT(SCOUT_CODE,4) = V_YEAR ORDER BY SCOUT_CODE DESC LIMIT 1 ; --递增1 IF NWE_ID IS NULL THEN SET NWE_ID = CONCAT(YYYY,'0001'); ELSE SET NWE_ID = CONCAT(YYYY,LPAD((RIGHT(NWE_ID,4)+1),4,'0')); END IF; RETURN NWE_ID;END