分享

生成订单编号

 xibeifneg3 2015-12-06
该方法用上了英文字母、年月日、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;

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多