mysql存储过程生成流程号 时间+三位序列号 mybatis 注解获取流程号

-- 创建过程和表
DROP TABLE IF EXISTS test_orders;
CREATE TABLE `test_orders` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `order_no` varchar(25) NOT NULL DEFAULT '',  
    `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)  
) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8;


DROP PROCEDURE IF EXISTS generate_orderNo;
CREATE PROCEDURE `generate_orderNo`(in orderNamePre char(2),out newOrderNo varchar(25))  
BEGIN  
  DECLARE currentDate VARCHAR (15) ;-- 当前日期,有可能包含时分秒   
  DECLARE maxNo INT DEFAULT 0 ; -- 离现在最近的满足条件的订单编号的流水号最后5位,如:SH2013011000002的maxNo=2   
  DECLARE oldOrderNo VARCHAR (25) DEFAULT '' ;-- 离现在最近的满足条件的订单编号   
    
    SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate ;-- 订单编号形式:前缀+年月日+流水号,如:SH2013011000002   
    
  SELECT IFNULL(order_no, '') INTO oldOrderNo   
  FROM test_orders   
  WHERE SUBSTRING(order_no, 3, 8) = currentDate   
    AND SUBSTRING(order_no, 1, 2) = orderNamePre   
    and length(order_no) =  13  
  ORDER BY id DESC LIMIT 1 ; -- 有多条时只显示离现在最近的一条   
    
  IF oldOrderNo != '' THEN   
    SET maxNo = CONVERT(SUBSTRING(oldOrderNo, -3), DECIMAL) ;-- SUBSTRING(oldOrderNo, -5):订单编号如果不为‘‘截取订单的最后5位   
  END IF ;  
  SELECT   
    CONCAT(orderNamePre, currentDate,  LPAD((maxNo + 1), 3, '0')) INTO newOrderNo ; -- LPAD((maxNo + 1), 5, '0'):如果不足5位,将用0填充左边   
    
  INSERT INTO test_orders (order_no) VALUES (newOrderNo) ; -- 向订单表中插入数据   

  SELECT   
    newOrderNo ;  
END;

 

-- navicat中获取流程号

SET @orderNo = '';  
CALL `generate_orderNo`('PD', @orderNo);  
SELECT @orderNo;

 

-- java 代码实现

 

@GetMapping()
public String getNo(){
    Map map = new HashMap<String,String>();
    map.put("preFix","PD");
    map.put("orderNo","");
    myService.getOrderNo(map);

    System.out.println(map);
    System.out.println(map.get("orderNo"));
    return null;
}

@Select("call generate_orderNo(#{map.preFix,mode=IN,jdbcType=VARCHAR},#{map.orderNo,mode=OUT,jdbcType=VARCHAR})")
@Options(statementType=StatementType.CALLABLE)
String callProcedure(@Param("map")Map map);

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值