搜尋
首頁php框架ThinkPHP介紹PHP基於Thinkphp5的砍價活動相關設計

這篇文章向大家介紹PHP基於Thinkphp5的砍價活動相關設計,有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

PHP基於Thinkphp5的砍價活動相關設計

#近期我們公司專案裡陸陸續續有很多為了招募新用戶的活動推出,砍價的活動由我來負責,我們的專案是在微信瀏覽器裡供用戶瀏覽訪問。

大概描述:進入砍價活動列表頁選擇有意向的商品,用戶點擊商品圖片可以看到WEB商城中所賣的商品價格與詳細參數等信息,點擊列表中對應商品標識下的'馬上搶購'可以進入砍價頁面,該頁面有兩個主要按鈕,一個是'請土豪幫忙'(點擊之後起引導分享作用)、'買買買'(砍到一定價位後可以購買),其次包括價格的進度條等信息,用戶分享到朋友圈引來朋友幫忙砍價,在觸發砍價按鈕的同時,如果幫忙的朋友不是本站用戶,那麼幫忙的朋友會成為本站的會員,同時會是該分享用戶的下級,然後根據產品運營採購針對每個商品的討論,會給商品定義好要砍價的活動價和最低價,以及每砍一次所能砍掉的價格區間和要參與的人數做計算,例如(商品原價3000,最低價1000,那麼所能砍掉的價格是2000,規定參與的人數是500人,那麼平均一個人砍掉4塊錢,可以設定區間為1~7元,來設定砍價的起伏大小,來提高用戶的參與興趣),當用戶砍到規定的價格區間內購買時,跳到訂單確認頁面,然後下單支付一系列流程。

頁面截圖:

介紹PHP基於Thinkphp5的砍價活動相關設計

介紹PHP基於Thinkphp5的砍價活動相關設計

# 實作相關:

透過看到幾張圖片大概我想大家也會考慮到所涉及的相關資訊。

想要發布參與活動的商品就有一個商品區分錶示,在資料庫的設計當中,我沒有修改商品表來增加一個區分的字段,而是新創建了一個數據表作為專門放置砍價活動的相關資訊。

來看一下後台的前台展示我是這麼設計的,沒有經過專業前端之手,僅僅在復制了後台商品列表模組代碼的基礎上自己簡單的做了一下佈局。

介紹PHP基於Thinkphp5的砍價活動相關設計

我的資料表設計:

#活动商品设置表:
CREATE TABLE `hp_activity_bargain` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `product_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '商品ID',
  `product_name` varchar(200) COLLATE utf8_unicode_ci NOT NULL COMMENT '商品名称',
  `activity_money` decimal(7,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '活动价',
  `bargain_section` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '砍价区间',
  `bargain_section2` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '砍价区间2【用户线上砍价(新用户砍价区间)】',   #忽略,此处是迭代后期地推而加上的
  `join_count` smallint(3) unsigned NOT NULL DEFAULT '0' COMMENT '参与人数',
  `product_desc` varchar(80) COLLATE utf8_unicode_ci NOT NULL COMMENT '活动商品描述',
  `attr1_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'attr1属性',
  `attr2_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'attr2属性',
  `type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0是线上,1是地推',
  PRIMARY KEY (`id`),
  KEY `product_id` (`product_id`),
  KEY `attr2_id` (`attr2_id`),
  KEY `attr1_id` (`attr1_id`),
  KEY `type` (`type`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
#用户参与进度信息表
CREATE TABLE `hp_activity_bargainirg` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `activity_bargain_id` int(10) unsigned NOT NULL COMMENT 'activity_prodcuts主键id',
  `product_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '参与活动的商品',
  `attr1_id` smallint(5) unsigned NOT NULL COMMENT 'attr1属性id',
  `attr2_id` smallint(5) unsigned NOT NULL COMMENT 'attr2属性id',
  `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '砍价商品发起的用户ID',
  `bargain_count` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '被砍价次数',
  `deal_money` decimal(7,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '最终交易价格',
  `create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '发起时间',
  `is_addorder` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否下单(0:未下单,1已下单)',
  `type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0是线上,1是地推',    #可以忽略,后期地推加上去的
  PRIMARY KEY (`id`),
  KEY `activity_bargain_id` (`activity_bargain_id`),
  KEY `attr1_id` (`attr1_id`),
  KEY `attr2_id` (`attr2_id`),
  KEY `product_id` (`product_id`),
  KEY `user_id` (`user_id`),
  KEY `is_addorder` (`is_addorder`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
#参与砍价详情表
CREATE TABLE `hp_activity_bargain_list` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `bargain_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'activity_bargainirg表主键id',
  `assistor_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '帮助者ID',
  `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '参与时间',
  `bargain_money` decimal(5,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '砍掉价格',
  PRIMARY KEY (`id`),
  KEY `assistor_id` (`assistor_id`),
  KEY `bargain_id` (`bargain_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

控制器幾個方法:

 //线上砍价活动列表
    public function bargainirgAction() 
    {
        $type = 0;
        $way = input('param.way', '','string');
        if (is_not_empty_string($way) && $way == 'live') {
            $type = 1;
        }
        $pageSize = 10;
        if (Request::isAjax()) {
            $page = input('post.page', 0, 'intval');
            $product_list = Hmodel\Activity::getActivityBargainProducts($type, $pageSize,  $page * $pageSize);
            if (is_not_empty_array($product_list)) {
                return json_encode(['status' => 1, 'info' => $product_list]);    
            } else {
                return json_encode(['status' => 0]);
            }
        }
        $product_list = Hmodel\Activity::getActivityBargainProducts($type, 10, 0);
        $view = new view();
        $view->assign('bargainirgList',$product_list);
        if ($type == 0) {
            return $view->fetch('bargainirg');
        } else {
            return $view->fetch('bargainirg_live');
        }
        
    }

    //砍价活动\商品详情\查看贡献度\请帮忙
    public function bargaindetailAction() 
    {

        $this->checkUserLogin();
        $uid = session('userinfo.uid');
        // $uid = 3;
        $seting_id = input('param.id',0,'int');
        $seting_info = Hmodel\Activity::getActivityProductsSeting($seting_id);  //砍价活动商品设置
        $bargain_section2 = !empty($seting_info['bargain_section2']) ? $seting_info['bargain_section2'] : 'no seting';
        if (!is_not_empty_array($seting_info)) notFund(); 

        $bargain_progress = Hmodel\Activity::returnProgressData( $seting_id, $seting_info['product_id'], $uid, $seting_info['attr1_id'],$seting_info['attr2_id'], 
$seting_info['add_money'],$seting_info['type']);
    
        if (!is_not_empty_array($bargain_progress) || $bargain_progress['user_id'] != $uid) notFund();
      
        $username       = session('userinfo.username');
        $user_info      = Hmodel\User::getuser_info($uid);
        $invite_code    = $user_info['invite_code'];
        $encrypt_code   = encrypt_hopeband($bargain_progress['id'] . '(&)' .$bargain_progress['activity_bargain_id'] . '(&)' .$uid . '(&)' . $invite_code . '(&)' 
. $seting_info['product_id'] . '(&)' . $seting_info['activity_money'] . '(&)' . $seting_info['bargain_section'] .  '(&)' . $seting_info['bargain_section2'] .'(&)' 
. $seting_info['join_count'] . '(&)'. $bargain_progress['type'], 'E', 'Hp_HopeBand_Bargainirg');

        //是否已经下单
        // $is_addorder    = Hmodel\Activity::checkIsAddorder($bargain_progress['id']);
        $is_addorder    = $bargain_progress['is_addorder'];

        //帮助列表
        $assistor_list = Hmodel\Activity::getAssistorList($bargain_progress['id']);

        $view = new view();
        $view->assign([
            'bar_code'           => $encrypt_code,
            'seting_info'        => $seting_info,
            'bargain_progress'   => $bargain_progress,
            'assistor_list'      => $assistor_list,
            'seting'             => $seting_id,
            'is_addorder'        => $is_addorder
        ]);
        $view->assign();
        return $view->fetch();

    }

    //帮忙砍价\进度\底部砍价商品列表
    public function bargainirgingAction ()
    {
        $url = $_SERVER['REQUEST_URI'];
        $encrypt_code = substr(substr($url,29),0,strpos(substr($url,29), '?invite_code'));

        $bargain_param = self::retrunBargainCode($encrypt_code);
        $bargain_id          = $bargain_param['bargain_id'];
        $bargainInfo         = Hmodel\Activity::getBargainirgProgress($bargain_id);
        if ( !is_not_empty_array($bargain_param) || !is_not_empty_array($bargainInfo)) {
            notFund();
        }

        $is_addorder = $bargainInfo['is_addorder'] == 1 ? true : false;
  
        $uid = session('userinfo.uid');
        $activity_product_id = $bargain_param['activity_product_id'];

         if ($bargain_param['sponsor_uid'] == $uid) {
            $this->redirect('bargaindetail',['id' => $activity_product_id]);
        }
        $product_id          = $bargain_param['product_id'];
        
        $bargain_list        = Hmodel\Activity::getActivityBargainProducts($bargain_param['type'], 999); //所有参与砍价活动的商品

        foreach ($bargain_list as $v) {
            if ( $v['id'] == $activity_product_id) {
                $product_info = $v;
            }
        }

        if (!is_not_empty_array($product_info)) notFund();
        $type = $bargain_param['type'];
        $activity_bargain_url = url('activity/bargainirg') ;

        $view = new view();
        $view->assign([
            'bar_code'      => $encrypt_code,   //邀请码
            'bargainInfo'   => $bargainInfo,    //当前砍价进度
            'product_info'  => $product_info,   //商品详情
            'bargain_list'  => $bargain_list,   //底部相关推荐 
            'is_addorder'   => $is_addorder,     //是否入库
            'activity_bargain_url' => $activity_bargain_url
        ]);
        
        return $view->fetch();


    }

    //ajax砍价
    public function goBargainAction () 
    {
        if (Request::isAjax()) {

            $uid = session('userinfo.uid');
            $username = session('userinfo.username');
            $encrypt_code  = input('post.bar_code', '', 'string');
            if (empty($uid) || empty($username)) {
                $this->checkUserLogin();
            }
            $bargain_param = self::retrunBargainCode($encrypt_code);
            if (!is_not_empty_array($bargain_param)) {
                echo json_encode(array('status' => -3, 'info' => '不明错误,请联系客服'));die;
            }

            $seting_info = Hmodel\Activity::getActivityProductsSeting($bargain_param['activity_product_id']);  //砍价活动商品设置
            $stock = Hmodel\CategoryAttr::getproductstockbyidsonattr($seting_info['product_id'],$seting_info['attr1_id'],$seting_info['attr2_id']);

            if ($stock['category_sum']  -1, 'info' => '已抢光!']);die;
            }

            
            $userinfo = Hmodel\User::getuser_info($uid);
            $register_time = $userinfo['create_time']; 
            $is_new_user = false;           //用户状态[default:老用户]
            if (($register_time + (60 * 60 * 8)) > time() && Hmodel\Activity::checkUserIsbargainEd($uid) === false) {
                $is_new_user  = true;       //是新用户
            }
    
            $sponsor_uid   = $bargain_param['sponsor_uid'];              //发起者id
            $bargain_id    = $bargain_param['bargain_id'];               //[activity_bargainirg]表主键id
            $join_count    = $bargain_param['join_count'];               //设置砍价次数 
            $section       = $bargain_param['bargain_section'];          //砍价区间(老用户)
            $section2      = $bargain_param['bargain_section2'];         //砍价区间(新用户)
            $type          = $bargain_param['type'] == $seting_info['type'] ? $bargain_param['type'] : ''; //0:线上;  1:地推
            $activity_money= $bargain_param['activity_money'];           //活动最低价
           
            if (!is_not_empty_string($type)) {
                echo json_encode(array('status' => -3, 'info' => '不明错误,请联系客服'));die;
            }

            if ($uid == $sponsor_uid) {
                echo json_encode(array('status' => -1, 'info' => '不能给自己砍价'));die;
            }

            $state = Hmodel\Activity::checkPartBargain($bargain_id, $uid);  //是否帮伙伴砍过当前参与的进度

            if ( $state !== false) {
                echo  json_encode(array('status' => -2, 'info' => '您已帮伙伴砍掉' . $state . '元啦,不要再砍啦!'));die;
            }
            if ($type == 1 && $is_new_user === false) {
                echo json_encode(array('status' => -4, 'info' => '抱歉,该活动仅限新用户参加!'));die;
            }
           
            $state = Hmodel\Activity::givePartBargain($bargain_id, $sponsor_uid, $uid, $section, $section2, $join_count, $is_new_user,
            $activity_money, $type);
            if ($state == -1) {
                 echo json_encode(array('status' => -3, 'info' => '已经最低价啦,不能再砍啦!'));die;
            }
            if ($state === false) {
                echo json_encode(array('status' => -3, 'info' => '哎呀,失败了!稍后帮我砍一次!'));die;
            } else {
                if ($is_new_user === true) {
                    echo json_encode(array('status' => 2, 'info' => '砍掉了' . $state .'元', 'deal_money' => $state));die;
                } else {
                    echo json_encode(array('status' => 1, 'info' => '成功帮伙伴砍掉' . $state .'元!', 'deal_money' => $state));die; 
                }
            }

        }
    }
   
    //返回砍价活动相关数据
    public static function retrunBargainCode( $encrypt_str = '') 
    {
        $data   = [];
        $code_str     = encrypt_hopeband($encrypt_str, 'D', 'Hp_HopeBand_Bargainirg');

        $code_arr     = explode('(&)', $code_str);
  
   
        if (is_not_empty_array($code_arr) && count($code_arr) == 10) {
            $data['bargain_id']             = $code_arr[0];             //砍价活动表主键id
            $data['activity_product_id']    = $code_arr[1];
            $data['sponsor_uid']            = $code_arr[2];             //砍价活动发起者uid
            $data['sponsor_invite_code']    = $code_arr[3];             //砍价活动发起者邀请码
            $data['product_id']             = $code_arr[4];             //砍价活动发起的商品id
            $data['activity_money']         = $code_arr[5];             //活动最低价格
            $data['bargain_section']        = $code_arr[6];             //老用户砍价区间
            $data['bargain_section2']       = $code_arr[7];             //新用户砍价区间
            $data['join_count']             = $code_arr[8];             //设置砍价次数
            $data['type']                   = $code_arr[9];             //设置砍价次数

        }

        return $data;
    }
public function checkOrder2PayAction()
    {
        $this->checkUserLogin();
        if (!Request::isAjax()) { notFund(); }
        $seting_id = input('post.seting',0,'intval');
        $user_id   = session('userinfo.uid');
        //拿付款的额度和商品id
        $BargainPayData = Hmodel\Activity::getBargainResult2Pay($seting_id, $user_id);
        $stock = Hmodel\CategoryAttr::getproductstockbyidsonattr($BargainPayData['product_id'],$BargainPayData['attr1_id'],$BargainPayData['attr2_id']);
        if ($stock['category_sum']  -2, 'info' => '已抢光!']);die;
        }
        if ($BargainPayData['is_addorder'] == 1) {
             return json_encode(['status' => -2, 'info' => '此商品已经购买过,不能重复购买!']);die;
        }
        if (!is_not_empty_array( $BargainPayData)) {
            return json_encode(['status' => -1, 'info' => '不明错误,请联系客服!']);die;
        }

        $product_id = $BargainPayData['product_id'];

        $attr1_name = '';
        $attr2_name = '';
        if (is_not_empty_array($attr1_info = Hmodel\Activity::getAttr1NameByAttrId($BargainPayData['attr1_id'], $product_id))){
            $attr1_name = $attr1_info['attr'];
        }
        if (is_not_empty_array($attr2_info = Hmodel\Activity::getAttr2NameByAttrId($BargainPayData['attr2_id'], $product_id))){
            $attr2_name = $attr2_info['attr'];
        }
        $data = [
            'product_id'  => $product_id,
            'prodcut_num' => 1,
            'attr1'       => $attr1_name,
            'attr2'       => $attr2_name,
            'seting_id'   => $seting_id
        ];
        return json_encode(['status' => 1, 'info' => $data]);
    
    }

     //查看砍价后的预付款订单信息
    public function createActivityOrderAction ()
    {
        $this->checkUserLogin();

        $uid = session('userinfo.uid');

        $product_num = 1;
        $attr1 = input("param.attr1", "" , "trim,string");
        $attr2 = input("param.attr2", "" , "trim,string");
        $seting_id = intval(input('param.seting_id', 0, 'intval'));
        $product_id  = intval(input("param.product_id", "" , "intval"));

        $pay_price_money = Hmodel\Activity::returnPayMoney($product_id, $seting_id, $uid);

        $type = $pay_price_money['type'];

        if (!is_not_empty_array($pay_price_money)) notFund();
        Cookie::set('ready_finish_bargain', encrypt_hopeband($pay_price_money['id'] . '(&)', 'E', 'hp_ready_bargain_pay'));
        $pay_info = $this->calculateFromProduct($product_id, $product_num, $attr1, $attr2, $uid , $pay_price_money['deal_money'], $type);
        $def_address = Hmodel\UserAddress::getDefAddress($uid);
        $view = new View();
        $view->assign('def_address',$def_address);
        $view->assign('product_carlist_bymerchantid',$pay_info['product_carlist_bymerchantid']);
        $view->assign('total_price',sprintf("%.2f",$pay_info['total_price']));

        $view->assign('total_delivery',$pay_info['total_delivery']);
        $view->assign('seting_id',$seting_id);


        

        return $view->fetch('createorder');
    }

Model層部分方法:

//根据主键id查询活动产品相关属性设置
    public static function getActivityProductsSeting( $id = 0) {
        $data = [];
        if (!is_positive_integer($id)) {
            return $data;
        }
        $sql = "SELECT a.`id`,a.`product_id`,a.`activity_money`,a.`bargain_section`,a.`join_count`,a.`product_desc`,a.`product_name`,
                a.`attr1_id`,a.`attr2_id`,
                b.`give_score`,b.`category_img`,b.`add_money`,b.`category_sum`
                FROM `hp_activity_bargain` AS a
                LEFT JOIN `hp_category_attr` AS b
                ON a.`attr1_id` = b.`attr1_son_id` AND a.`attr2_id` = b.`attr2_son_id` AND a.`product_id` = b.`category_id`
                WHERE a.`id` = $id
                LIMIT 1";
        $res = Db::query($sql);
        if (is_not_empty_array($res)) {
            $data = $res[0];
        }
        return $data;
    }
    //通过主键id拿砍价活动表的相关信息
    public static function getBargainirgProgress($id = 0) {
        $data = [];
        $sql = "SELECT `id`,`activity_bargain_id`,`product_id`,`attr1_id`,`attr2_id`,`user_id`,`bargain_count`,`deal_money`,`is_addorder` 
                FROM `hp_activity_bargainirg` 
                WHERE `id` = $id LIMIT 1";
        $res = self::query($sql);
        if (is_not_empty_array($res)) {
            $data = $res[0];
        }
        return $data;
    }
    //返回要砍
    public static function returnProgressData($a_b_id = 0, $product_id = 0, $user_id = 0, $attr1_son_id = 0, $attr2_son_id = 0, $deal_money= 0){
        $data = [];
        $sql = "SELECT `id`,`activity_bargain_id`,`product_id`,`attr1_id`,`attr2_id`,`user_id`,`bargain_count`,`deal_money`,`is_addorder`
                FROM `hp_activity_bargainirg` 
                WHERE `activity_bargain_id` = $a_b_id AND `attr1_id` = $attr1_son_id AND `attr2_id` = $attr2_son_id AND `product_id` = $product_id AND `user_id` = $user_id 
                LIMIT 1";

        $res = self::query($sql);
        if (is_not_empty_array($res)) {
            $data = $res[0];
        } else {
            $data['activity_bargain_id'] = $a_b_id;
            $data['product_id']          = $product_id;
            $data['user_id']             = $user_id;
            $data['deal_money']          = $deal_money; 
            $data['attr1_id']            = $attr1_son_id; 
            $data['attr2_id']            = $attr2_son_id;   
            $data['create_time']         = time(); 
            $data['bargain_count']       = 0; 
            Db::name('activity_bargainirg')->insert($data);
            $insertId =  Db::name('activity_bargainirg')->getLastInsID();
            $data['id']                  = $insertId;
            // $data = self::getBargainirgProgress($insert_id);
        }
        return $data;
    }
    //通过 表[activity_products] 主键id 和 user_id 拿到用户购买前要付款的额度和购买商品
    public static function getBargainResult2Pay($a_b_id = 0, $user_id = 0) {
        $data  = [];
        if ( !is_positive_integer($a_b_id) || !is_positive_integer($user_id)) {
            return $data;
        }
        $sql = "SELECT `id`,`deal_money`,`product_id`,`attr1_id`,`attr2_id` FROM `hp_activity_bargainirg`
                WHERE `activity_bargain_id` = $a_b_id AND `user_id` = $user_id
                LIMIT 1";
        $res = Db::query($sql);
        if (is_not_empty_array($res)) {
            $data = $res[0];
        }
        return $data;
    }

    //检测是否帮助伙伴砍价
    //$bargain_id       [activity_bargainirg]表主键id
    //$assistor_id      帮助砍价者用户id
    public static function checkPartBargain ($bargain_id = 0, $assistor_id = 0) {
        $state = false;
        if (!is_positive_integer($bargain_id) || !is_positive_integer($assistor_id)) {
            return $state;
        }
        $sql = "SELECT `bargain_money` FROM `hp_activity_bargain_list`
                WHERE  `bargain_id` = $bargain_id AND  `assistor_id` = $assistor_id 
                LIMIT 1";

        $res = self::query($sql);

        if (is_not_empty_array($res)) {

            return $res[0]['bargain_money'];
        }
        return $state;

    }

    //查询帮忙砍价的伙伴列表
    public static function getAssistorList ( $bargain_id = 0){
        $data = [];
        if (is_positive_integer($bargain_id) && is_positive_integer($assistor_id)) 
            return $data;
        $sql = "SELECT a.`create_time`, a.`bargain_money`, b.`nickname`, b.`headimgurl` 
                FROM `hp_activity_bargain_list` AS a
                LEFT JOIN `hp_user_auths` AS b
                ON a.`assistor_id` = b.`user_id`
                WHERE a.`bargain_id` = $bargain_id
                ORDER BY a.`id` DESC";

        $data = self::query($sql);
        return $data;
    }

    //拿到上次所砍掉的价格
    public static function getBeforeMoney ( $bargain_id = 0, $limit = 1) {
        $beforemoney_sum = 0;
        $sql = "SELECT SUM(`bargain_money`) AS beforemoney_sum FROM 
                (SELECT `bargain_money` FROM `hp_activity_bargain_list` 
                WHERE `bargain_id` = $bargain_id
                ORDER BY `id` DESC
                LIMIT $limit) sum";
         
        $res = Db::query($sql);
        if (is_not_empty_array($res)) {
            $beforemoney_sum = $res[0]['beforemoney_sum'];
        }
        return $beforemoney_sum;
    }
    
     /**
     * 砍价相关数据操作
     *$bargain_id    [activity_bargainirg] 表主键id
     *$sponsor_id    砍价发起者id
     *$assistor_id   帮助砍价者id
     *$min           最小值
     *$max           最大值
     *$join_count    设置要参与砍价的人数
     *return bool
     */
    public static function givePartBargain($bargain_id = 0, $sponsor_id = 0, $assistor_id = 0, $min = 0, $max = 0,$join_count = 0) {
        $state = false;
        if (is_positive_integer($assistor_id) && $bargain_id > 0 && is_positive_integer($sponsor_id)) {
            $bargainirg_info = Db::name('activity_bargainirg')->find($bargain_id);

            if ( !$bargainirg_info ) {
                return $state;
            }

            $fp = fopen('./bargain_lock.txt','r');
            $try = 5; 
            do {
                $lock = flock($fp,LOCK_EX);
                if(!$lock)
                    usleep(5000); 
            } while (!$lock && --$try >= 0) ;
            if ($lock) {
                Db::startTrans();
                try {
                    $bargain_money = self::returnRandMoney($bargain_id, $min, $max, $join_count);
                    /*-------------*/
                    $id  = 0;
                    $sql = "UPDATE `hp_activity_bargainirg` 
                            SET `deal_money` = `deal_money` - $bargain_money,`bargain_count` = `bargain_count`+ 1 
                            WHERE `id` = $bargain_id AND `user_id` = $sponsor_id AND `deal_money` > $bargain_money
                            AND `bargain_count`  0) {
                        $insert_data = [];
                        $insert_data['bargain_id']      = $bargain_id;
                        $insert_data['assistor_id']     = $assistor_id;
                        $insert_data['bargain_money']   = $bargain_money;
                        $insert_data['create_time']     = time();
                        $id = Db::name('activity_bargain_list')->insert($insert_data);
                    }
                    /*-------------*/
                    if ($id > 0) 
                        $state = true; 
                    Db::commit();
                }catch(\Exception $e){
                    $state = false;
                    Db::rollback();
                }
        flock($lock,LOCK_UN);
        fclose($lock);

            } 
        }
        if ($state !== false ) {
            return $bargain_money;
        }
        return $state;
    }

    //返回要砍的价格
    public static function returnRandMoney ($bargain_id = 0, $min = 0 ,$max = 0, $join_count = 0 ){
        $randMoney       = self::randomFloat( $min, $max);                  //返回随机价格  
        $prev_Progress   = self::getBargainirgProgress($bargain_id);            
        $prev_bargain_count = $prev_Progress['bargain_count'];              //返回已经被砍价的次数  
        $remainder = $prev_bargain_count % 3; 

        $bout_count = floor($join_count / 3) * 3;  //最后一轮结束的刀数       39
        $last_num = $join_count - $bout_count;
        $avg = ($min + $max) / 2;
        $before_sum  = self::getBeforeMoney($bargain_id, $remainder);

        if ($prev_bargain_count >= $bout_count) {
            if ($last_num == 1){
                return $avg;
            } elseif ($last_num == 2) {
                $end = $join_count - $prev_Progress['bargain_count'] ;
                if ($end == 2) {
                    return $randMoney;
                } elseif($end == 1) {
                    return $avg * 2 - $before_sum;
                }
            }  
        }
        // $remainder_num   = $join_count % 3;         //总回合数的余数
        if ($remainder > 0) {
            if ( $remainder == 1) { 
                $point      = $max * 0.8;    //最大额度的80%
                $bout_sum   = 3 * $avg;
                if ($before_sum >= $point) {
                    $randMoney = self::randomFloat($min, ($bout_sum - $before_sum) / 2);
                } else {
                    $randMoney = self::randomFloat(($bout_sum - $before_sum) / 2 , $point);
                }
            }
            if ($remainder == 2) {
                $round_sum_money = 3 * $avg;            
                $randMoney       = $round_sum_money - $before_sum;
            }
        } 
        return $randMoney;
                
    }
    //拿随机价格
    public static function randomFloat($min = 0, $max = 1) {
         return round($min + mt_rand() / mt_getrandmax() * ($max - $min),2);
    }



   //拿砍价活动下所有商品
    public static function getActivityBargainProducts ( $limit = 0, $offset = 0) {
        $data = [];
        $sql = "SELECT a.`id`,a.`product_id`,a.`activity_money`,a.`bargain_section`,a.`join_count`,a.`product_desc`,a.`product_name`,
                a.`attr1_id`,a.`attr2_id`,
                b.`give_score`,b.`category_img`,b.`add_money`,b.`category_sum`
                FROM `hp_activity_bargain` AS a
                LEFT JOIN `hp_category_attr` AS b
                ON a.`attr1_id` = b.`attr1_son_id` AND a.`attr2_id` = b.`attr2_son_id` AND a.`product_id` = b.`category_id`
                WHERE 1 = 1
                ORDER BY a.`id` DESC
                LIMIT $limit OFFSET $offset";
        $data = self::query($sql);        
        return $data;
    }

相關推薦:最新的10個thinkphp影片教學

#

以上是介紹PHP基於Thinkphp5的砍價活動相關設計的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除
宝塔部署thinkphp5报错怎么办宝塔部署thinkphp5报错怎么办Dec 19, 2022 am 11:04 AM

宝塔部署thinkphp5报错的解决办法:1、打开宝塔服务器,安装php pathinfo扩展并启用;2、配置“.access”文件,内容为“RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L]”;3、在网站管理里面,启用thinkphp的伪静态即可。

thinkphp5 url重写不行怎么办thinkphp5 url重写不行怎么办Dec 12, 2022 am 09:31 AM

thinkphp5 url重写不行的解决办法:1、查看httpd.conf配置文件中是否加载了mod_rewrite.so模块;2、将AllowOverride None中的None改为All;3、修改Apache配置文件.htaccess为“RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]”保存即可。

thinkphp5 post得不到值怎么办thinkphp5 post得不到值怎么办Dec 06, 2022 am 09:29 AM

thinkphp5 post得不到值是因为TP5是通过strpos函数在Header的content-type值中查找app/json字符串的,其解决办法就是设置Header的content-type值为app/json即可。

thinkphp5怎么获取请求过来的网址thinkphp5怎么获取请求过来的网址Dec 20, 2022 am 09:48 AM

thinkphp5获取请求网址的方法:1、使用“\think\Request”类的“$request = Request::instance();”方法获取当前的url信息;2、通过自带的助手函数“$request->url()”获取包含域名的完整URL地址。

怎么去除thinkphp5标题栏icon怎么去除thinkphp5标题栏iconDec 20, 2022 am 09:24 AM

去除thinkphp5标题栏icon的方法:1、找到thinkphp5框架public下的favicon.ico文件;2、删除该文件或者选择另一张图片命名改为favicon.ico,并替换原favicon.ico文件即可。

thinkphp5提示控制器不存在怎么办thinkphp5提示控制器不存在怎么办Dec 06, 2022 am 10:43 AM

thinkphp5提示控制器不存在的解决办法:1、检查对应的控制器里面的命名空间是否写对,修改为正确的命名空间;2、打开相应的tp文件,修改类名即可。

ThinkPHP5怎么查询昨天的数据ThinkPHP5怎么查询昨天的数据Dec 05, 2022 am 09:20 AM

ThinkPHP5查询昨天数据的方法:1、打开ThinkPHP5相关文件;2、通过表达式“db('table')->whereTime('c_time', 'yesterday')->select();”查询昨天的数据即可。

thinkphp5报错提示怎么设置thinkphp5报错提示怎么设置Dec 07, 2022 am 10:31 AM

thinkphp5设置报错提示的方法:1、进入项目根目录下的public文件夹,打开index.php入口文件;2、查看调试模式开关的注释;3、将“APP_DEBUG”常量的值调整为true即可展示错误信息提示。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),