该方法用上了英文字母、年月日、Unix
时间戳和微秒数、随机数,重复的可能性大大降低,还是很不错的。使用字母很有代表性,一个字母对应一个年份,总共16位,不多也不少,呵呵。 <?php $yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'); $orderSn = $yCode[intval(date('Y')) - 2011] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99)); ?> 生成效果:A422694333616096 /** * 生成随机订单号 * 该方法用上了英文字母、年月日、Unix 时间戳和微秒数、随机数,重复的可能性大大降低,还是很不错的。使用字母很有代表性,一个字母对应一个年份,总共16位。 */ function generate_order_code(){ $yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'); $orderSn = $yCode[intval(date('Y')) - 2011] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99)); return $orderSn; } /** * 生成规则工单号(GD+当天日期【20160628】+5位顺序号)GD2016062800005 */ function generate_gd_order_code(){ // $orderSn = 'GD' . strtoupper(date('Ymd')) . sprintf('%05d', rand(0, 99999)); $randSn = session('userinfo["randSn"]'); if($randSn['today'] && $randSn['today'] == date('Y-m-d')){ $randSns['today'] = date('Y-m-d'); $num = $randSn['num']; $randSns['num'] = $num + 1; session('userinfo["randSn"]', $randSns); }else{//无session时,从工单表里调取5位序列号值 $orderExitNo = D('order')->order('id DESC')->getField('order_no'); if($orderExitNo){ $orderExitNo_today = substr($orderExitNo,2,8); if($orderExitNo_today == date('Ymd')){ $randSns['today'] = date('Ymd'); $num = (int)substr($orderExitNo,10,5) + 1; $randSns['num'] = $num + 1; }else{ $randSns['today'] = date('Y-m-d'); $randSns['num'] = 2; $num = 1; } }else{ $randSns['today'] = date('Y-m-d'); $randSns['num'] = 2; $num = 1; } session('userinfo["randSn"]', $randSns); } $orderSn = 'GD' . strtoupper(date('Ymd')) . sprintf('%05d', $num); return $orderSn; } /** * 生成规则结算单号(JS开头,日期(20140608),流水号(00001))GD2016062800005 */ function generate_js_order_code(){ $randJs = session('userinfo["randJs"]'); if($randJs['today'] && $randJs['today'] == date('Y-m-d')){ $randJss['today'] = date('Y-m-d'); $num = $randJs['num']; $randJss['num'] = $num + 1; session('userinfo["randJs"]', $randJss); }else{//无session时,从工单表里调取结算单号5位序列号值 $orderExitNo = D('order')->order('js_no DESC')->getField('js_no'); if($orderExitNo){ $orderExitNo_today = substr($orderExitNo,2,8); if($orderExitNo_today == date('Ymd')){ $randJss['today'] = date('Ymd'); $num = (int)substr($orderExitNo,10,5) + 1; $randJss['num'] = $num + 1; }else{ $randJss['today'] = date('Y-m-d'); $randJss['num'] = 2; $num = 1; } }else{ $randJss['today'] = date('Y-m-d'); $randJss['num'] = 2; $num = 1; } session('userinfo["randJs"]', $randJss); } $orderSn = 'JS' . strtoupper(date('Ymd')) . sprintf('%05d', $num); return $orderSn; } /** * 获取单号 * @param string $prefix 单号前缀,默认大写,GD、JS 、SK * @param int $serial_len 单号中流水长度(不包含前缀和年月日),默认5位 * @return string */ function get_orderno($prefix='gd', $serial_len=5) { !empty($prefix) && $prefix = strtoupper($prefix); $today = date('Y-m-d',time()); $s_time = strtotime($today . ' 00:00:00'); $e_time = strtotime($today . ' 23:59:59'); $map = array(); switch ($prefix) { /*工单*/ case 'gd': case 'GD': $M_obj = D('order'); $map['create_time'] = array(array('egt', $s_time), array('elt', $e_time)); break; /*结算*/ case 'js': case 'JS': $M_obj = D('order'); $map['js_time'] = array(array('egt', $s_time), array('elt', $e_time)); break; /*收款*/ case 'sk': case 'SK': $M_obj = D('receipt'); $map['create_time'] = array(array('egt', $s_time), array('elt', $e_time)); break; default: $map['create_time'] = array(array('egt', $s_time), array('elt', $e_time)); return null; } $num = $M_obj->where($map)->count(); if (empty($num)) { $repeat = intval($serial_len)-1; $serial = str_repeat('0', $repeat) . '1'; } else { $serial = intval($num) + 1; $repeat = intval($serial_len) - strlen($serial); $repeat < 0 && $repeat = 0; $serial = str_repeat('0', $repeat) . $serial; } $orderno = $prefix . date('Ymd') . $serial; return $orderno; } |
|
来自: xibeifneg3 > 《IT-php》