基于PHP后端 设计商城快递运费模版系统

先看成品效果:

在这里插入图片描述

编辑页面展示:(以模版一为例)

在这里插入图片描述
先分析下思路,我们最后写一个接口,通过三个参数自动计算快递费用.

首先我们要定义一个全国通用的运费计算方式(即默认运费),即不指定地区的时候,我们按全国通用费用来计算运费.
例如当购买不超过10件时,费用设置为10元,每增加一件,运费涨2元.

其次如果指定地区来收取运费,那么就按照我们定义的地区规则来执行
例如我们设置新疆在购买10件内运费50元,每增加一件,收取5元.
可以指定多个地区,甚至国外…这个是可选的

同时我们还可以指定包邮的地区,同时设置在多少件包邮,如果超过了范围则执行全国默认规则.这个是可选的

数据库:

快递地址省市县表 mxd_express_city
CREATE TABLE mxd_express_city (
id int(11) NOT NULL DEFAULT ‘0’,
pid int(11) DEFAULT NULL,
cityname varchar(255) CHARACTER SET utf8 DEFAULT NULL,
type int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT=‘快递地址省市县表’;
在这里插入图片描述

快递模版表 mxd_express_delivery
CREATE TABLE mxd_express_delivery (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL DEFAULT ‘’ COMMENT ‘模版名称’,
baby_address varchar(1000) NOT NULL DEFAULT ‘’ COMMENT ‘宝贝地址’,
send_time int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘限定发货时间’,
is_free int(255) NOT NULL COMMENT ‘是否包邮 0=不包邮,1=包邮’,
price_method int(8) NOT NULL DEFAULT ‘0’ COMMENT ‘计价方式’,
specify_conditions int(8) NOT NULL DEFAULT ‘0’ COMMENT ‘是否指定条件包邮’,
default_pieces int(255) DEFAULT NULL COMMENT ‘默认件数’,
default_price decimal(10,2) DEFAULT NULL COMMENT ‘默认价格’,
add_pieces int(10) DEFAULT NULL COMMENT ‘续件’,
add_price decimal(10,2) DEFAULT NULL COMMENT ‘续费’,
create_time int(10) NOT NULL DEFAULT ‘0’ COMMENT ‘添加时间’,
update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’,
PRIMARY KEY (id) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT=‘快递模版表’;

在这里插入图片描述

运送方式表 mxd_express_shipping_method

CREATE TABLE mxd_express_shipping_method (
id int(11) NOT NULL AUTO_INCREMENT,
template_id int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘关联模板ID’,
fast_address varchar(10000) NOT NULL DEFAULT ‘0’ COMMENT ‘运送地区’,
first_pieces int(10) unsigned DEFAULT ‘0’ COMMENT ‘首件’,
first_weight decimal(10,2) NOT NULL COMMENT ‘首重’,
first_volume decimal(10,2) NOT NULL DEFAULT ‘0.00’ COMMENT ‘首体积’,
first_amount decimal(10,2) DEFAULT NULL COMMENT ‘首费’,
add_pieces int(10) NOT NULL DEFAULT ‘0’ COMMENT ‘续件’,
add_weight decimal(10,2) NOT NULL COMMENT ‘续重’,
add_volume decimal(10,2) unsigned DEFAULT ‘0.00’ COMMENT ‘续体积’,
add_amount decimal(10,2) NOT NULL DEFAULT ‘0.00’ COMMENT ‘续费’,
create_time varchar(255) NOT NULL,
update_time timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT=‘运送方式表’;

包邮条件表 mxd_express_free

CREATE TABLE mxd_express_free (
id int(11) NOT NULL AUTO_INCREMENT,
template_id int(10) unsigned DEFAULT ‘0’ COMMENT ‘关联模板ID’,
address varchar(1000) DEFAULT ‘’ COMMENT ‘包邮地区’,
pieces int(10) unsigned DEFAULT ‘1’ COMMENT ‘包邮件数’,
weight decimal(6,2) NOT NULL DEFAULT ‘0.00’ COMMENT ‘包邮重量’,
volume decimal(8,2) NOT NULL DEFAULT ‘0.00’ COMMENT ‘包邮体积’,
create_time varchar(255) NOT NULL,
update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT=‘包邮条件表’;

先把前端自己做出来,前端的难度不是很大,增删改查先把后台做出来.

然后前端页面
在这里插入图片描述
我们后端写一个接口自动计算运费.

接口思路是这样的:
我们需要三个参数,首先佳贝艾特2段这个商品用了哪个快递模版,那么这个模版id是必须的,
然后是购买的多少件,
然后是发到地址.

所以我们需要这三个参数就可以自动计算运费了

第一步,我们通过模版id,判断该商品是否包邮,如果包邮,则不执行后续操作,直接
$freight = 0;截断了事.

第二步,我们判断有没有增加指定地区的运费规则,如果有的话,那么我们先判断件数,分两种情况

第三步,我们判断有没有指定地区包邮,如果有包邮的,那么 $freight = 0;直接截断.

第四步,以上三种情况走完后,最后往下继续走,先判断件数,也是两种情况,算出运费即可

最后, return $freight; 即可.

下面贴出这个功能,只要调用了这个接口,运费就自动计算好了:


    /**
     * 通过地址和件数计算运费
     * @param $addr   邮寄地址
     * @param $pieces  邮寄件数
     * @param $express_template_id  快递模板id
     * @return int|string
     */
    public function get_freight($addr,$pieces,$express_template_id){
        $freight = 0;
        $express_template_info = D('ExpressDelivery')->where(['id'=>$express_template_id])->find();

        //包邮
        if($express_template_info['is_free'] == 1){
            $freight = 0;
            return  $freight;
        }

        $express_template_info['child1'] = M()
            ->table('mxd_express_shipping_method')
            ->where(['template_id' => $express_template_id])
            ->select();

        $express_template_info['child2'] = M()
            ->table('mxd_express_free')
            ->where(['template_id'=>$express_template_id])
            ->select();


        $city_id = M()->table('mxd_express_city')
            ->where(['cityname'=>$addr,'type'=>1])
            ->field('id')
            ->find()['id'];


        //首先判断地址在不在child1中,如果在的话就按其规则计算,如果不在就按通用运费计算
        if(!empty($express_template_info['child1'])){
            foreach ($express_template_info['child1'] as $i => $node){

                if(in_array($city_id,explode(',',$node['fast_address']))){
                    //按照指定地区的快递费用规则计算
                    if($pieces <= $node['first_pieces']){
                        $freight = $node['first_amount'];
                        return $freight;
                    }else{
                        if($node['add_pieces']){
                            $add_pieces = bcdiv(($pieces - $node['first_pieces']) , $node['add_pieces'],2);
                            $freight = $node['first_amount'] +  bcmul($add_pieces,$node['add_amount'],2) ;
                            return $freight;
                        }else{
                            $freight = $node['first_amount'];
                            return $freight;
                        }
                    }
                }
            }
        }


        //判断是否在包邮地区
        if(!empty($express_template_info['child2'])){
            foreach ($express_template_info['child2'] as $j => $val){
                if(in_array($city_id,explode(',',$val['address']))){
                    if($pieces <= $val['pieces']){
                        $freight = 0;
                        return  $freight;
                    }
                }
            }
        }



        //获取默认件数
        $default_pieces = $express_template_info['default_pieces'];
        //获取默认运费
        $default_price = $express_template_info['default_price']  ;

        //按默认规则计算运费
        if($pieces <= $default_pieces){
            $freight = $default_price;
        }else{
            if($express_template_info['add_pieces']){
                $add_pieces = bcdiv(($pieces - $default_pieces) , $express_template_info['add_pieces'],2);
                $freight = $default_price +  bcmul($add_pieces,$express_template_info['add_price'],2) ;
            }else{
                $freight = $default_price;
            }
        }

        return $freight;

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章