#DROP FUNCTION IF EXISTS func_getVoucherId ;
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站制作、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的任丘网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
CREATE FUNCTION func_getVoucherId /*生成凭证编号*/
(
f_str varchar(255)
)
returns varchar(255) charset utf8
begin
/*获取最大凭证号*/
declare v_maxVoucherId varchar(255) default '';
/*获取最大凭证号*/
declare v_flowMaxVoucherId varchar(255) default '';
/*新的凭证号*/
declare v_newVoucherId varchar(255) default '';
/*判断是新增存盘还是入账存盘*/
if ifnull(rtrim(f_str),'') = '' then
select max(voucher_code) into v_maxVoucherId from finance_voucher ;
if ifnull(rtrim(v_maxVoucherId),'')='' then
set v_newVoucherId = rpad(replace(cast(curdate() as char(255)),'-',''),11,0); /*生成凭证编号*/
else
set v_newVoucherId = convert((convert(v_maxVoucherId,signed)+1),char(255));
end if ;
elseif ifnull(rtrim(f_str),'') = 'r' then
select max(voucherInfo) into v_flowMaxVoucherId from province_voucher_account_flow ;
if ifnull(rtrim(v_flowMaxVoucherId),'')='' then
set v_newVoucherId = rpad(replace(cast(curdate() as char(255)),'-',''),12,0); /*生成凭证编号*/
else
set v_newVoucherId = convert((convert(v_flowMaxVoucherId,signed)+1),char(255));
end if ;
end if ;
return v_newVoucherId ;
end ;
我目前做的项目也涉及到了这个生成规则,我用MYSQL数据库函数写了一个,你看下吧,希望能帮到你
那就传分类的参数,去生成呗,,,,,从数据中确定下一个编号
~
~
~
提供2个思路:
1:存取最后一次序列号的日期,每次生成序号的时候取该日期和当前日期对比不同则重新计数,并将本次日期覆盖为最后一次序列号的日期;
2:如果用数据库存储的话可以考虑每次去数据库查询是否有like当前日期的序号,没有则重新计数;
public class Main {
private static long n = 1;
public static void main(String[] args) {
System.out.println(test(n));
System.out.println(test(n));
}
public static long test(long l) {
String str = new SimpleDateFormat("yyyyMM")
.format(new java.util.Date());
long m = Long.parseLong((str)) * 10000;
long ret = m + l;
n = l + 1;
return ret;
}
}
可以直接通过jdk基本方法,获取到当前的时间
Date date= new Date();//创建一个时间对象,获取到当前的时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置时间显示格式
String str = sdf.format(date);//将当前时间格式化为需要的类型
System.out.println(str);//输出结果
结果为:2015-11-06 13:53:54(实时)。
public class test1 {
public synchronized static String getNum(){
StringBuffer sb=new StringBuffer();
Calendar cal = new GregorianCalendar();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH)+1;
sb.append(year);
if(month10){
sb.append("0"+month);
}else{
sb.append(month);
}
sb.append(getLastSixNum());
return sb.toString();
}
public static String getLastSixNum(){
int count = 0;
char str[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
StringBuffer pwd = new StringBuffer("");
Random r = new Random();
while (count 6) {
int i = Math.abs(r.nextInt(10));
if (i = 0 i str.length) {
pwd.append(str[i]);
count++;
}
}
return pwd.toString();
}
public static void main(String []args){
System.out.println(test1.getLastSixNum());
System.out.println(test1.getNum());
}
}
在getLastSixNum()方法体中还可以自己设置规则。。
我是采用随即产生的了。。
如果要是产生不重复的号码 最好再getNum()方法上加锁
我有修改了我的方案: 采用日期和后续六位键值对的形式
这样做的好处是 日期改变时候,后续六位从1开始记位
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
public class test1 {
private static MapString,String map=new HashMapString, String();
private static String STATNUM="000001";
public String getYearAndMonth(){
StringBuffer sb=new StringBuffer();
Calendar cal = new GregorianCalendar();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH)+1;
sb.append(year);
if(month10){
sb.append("0"+month);
}else{
sb.append(month);
}
return sb.toString();
}
public String getLastSixNum(String s){
String rs=s;
int i=Integer.parseInt(rs);
i+=1;
rs=""+i;
for (int j = rs.length(); j 6; j++) {
rs="0"+rs;
}
return rs;
}
public synchronized String getNum(){
String yearAMon=getYearAndMonth();
String last6Num=map.get(yearAMon);
if(last6Num==null){
map.put(yearAMon,STATNUM);
}else{
map.put(yearAMon,getLastSixNum(last6Num));
}
return yearAMon+map.get(yearAMon);
}
public static void main(String []args){
test1 t= new test1();
System.out.println(t.getNum());
System.out.println(t.getNum());
System.out.println(t.getNum());
}
}
测试结果:
201109000001
201109000002
201109000003