123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655 |
- <?php
- /**
- * Created by PhpStorm.
- * User: stanley-king
- * Date: 16/9/19
- * Time: 下午6:48
- */
- require_once(BASE_ROOT_PATH . '/helper/activity_helper.php');
- require_once(BASE_ROOT_PATH . '/helper/goods_helper.php');
- require_once(BASE_ROOT_PATH . '/helper/pay_helper.php');
- require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
- class buy_first
- {
- private $mLogicOut;
- private $mUserFcode;
- private $mPriceCalculate;
- public function __construct($logic_out,bonus\IPriceCalculate $priceCalculate)
- {
- $this->mPriceCalculate = $priceCalculate;
- $this->mLogicOut = $logic_out;
- $this->mUserFcode = null;
- }
- //商品金额相关信息
- private function payinfo()
- {
- $result = [];
- //商品总价,红包可抵扣,满减金额
- $goods_amount = 0.00;
- $store_goods_total = $this->mLogicOut['store_goods_total'];
- foreach ($store_goods_total as $store_id => $value) {
- $goods_amount += doubleval($value);
- }
- $result['goods_amount'] = $goods_amount;
- //满送
- $full_discount = 0.00;
- $full_desc = '';
- $store_mansong_rule_list = $this->mLogicOut['store_mansong_rule_list'];
- foreach ($store_mansong_rule_list as $store_id => $value) {
- $full_discount += doubleval($value['discount']);
- $full_desc = $this->full_desc($value['desc']);
- }
- $result['full_discount'] = $full_discount;
- $result['full_desc'] = $full_desc;
- $result['full_goods'] = $this->full_goods();
- //运费
- if($this->freight($freight,$offpay_hash,$offpay_hash_batch) == true) {
- $result['freight'] = $freight;
- $result['offpay_hash_batch'] = $offpay_hash_batch;
- $result['offpay_hash'] = $offpay_hash;
- } else {
- $result['freight'] = 0;
- $result['offpay_hash_batch'] = "";
- $result['offpay_hash'] = "";
- }
- $result['freight_hash'] = $this->mLogicOut['freight_list'];
- //红包信息
- $result['total_pred'] = doubleval($this->mLogicOut['available_predeposit']);
- $result['total_bonus'] = doubleval($this->mLogicOut['available_bonus']);
- $result['opgoods_discount'] = $this->optional_goods();
- $result['opgoods_desc'] = 'N元任选优惠';
- $calcer = $this->calc_goods();
- $bonusable_goods_amount = $calcer['bonusable_goods_amount'];
- $lowest_price_amount = $calcer['lowest_price_amount'];
- $total_bonus = $this->mPriceCalculate->bonus_amount($bonusable_goods_amount,$lowest_price_amount);
- $ways = $this->mPriceCalculate->bonus_way($total_bonus);
- $result['user_bonus'] = $ways['user_bonus'];
- $result['show_room'] = $ways['show_room'];
- $result['room_bonus'] = $ways['room_bonus'];
- $result['rooms'] = $ways['rooms'];
- $order_cash = $this->mPriceCalculate->order_cash($bonusable_goods_amount,$lowest_price_amount);
- $discount_gap = $this->mPriceCalculate->discount_gap($order_cash,$lowest_price_amount);
- if($discount_gap == false) {
- $result['gap_show'] = false;
- $result['gap_desc'] = "";
- $result['discount_gap'] = 0.00;
- }
- else
- {
- global $config;
- if(intval($discount_gap * 100 + 0.5) == 0) {
- $result['gap_desc'] = $config['bonus_gap']['no_gap'];
- } else {
- $result['gap_desc'] = sprintf($config['bonus_gap']['have_gap'],$lowest_price_amount,$discount_gap);
- }
- $result['discount_gap'] = $discount_gap;
- }
- $result['bonus_rates'] = $this->formate_rates([ 30 => $result['user_bonus'] + $result['room_bonus']]);
- $result['earn_bonus'] = $config['bonus_gap']['earn_bonus'];
- $result['usable_pred'] = true;
- $cash_amount = $result['goods_amount'] + $result['freight'] - $result['full_discount'] - $result['opgoods_discount'] - $result['user_bonus'] - $result['room_bonus'];
- $total_pred_cent = intval($result['total_pred'] * 100 + 0.5);
- $cash_amount_cent = intval($cash_amount * 100 + 0.5);
- if($total_pred_cent >= $cash_amount_cent) {
- $pay_pred = $cash_amount_cent / 100;
- }
- else {
- $pay_pred = $total_pred_cent / 100;
- }
- $result['user_pred'] = $pay_pred;
- $result['pay_cash_pred'] = $result['goods_amount'] + $result['freight'] - $result['full_discount'] - $result['opgoods_discount'] - $result['user_bonus'] - $result['room_bonus'] - $pay_pred;
- $result['pay_cash_nopred'] = $result['goods_amount'] + $result['freight'] - $result['full_discount'] - $result['opgoods_discount'];
- //购物车显示应付现金
- $result['pay_car_pred'] = $result['goods_amount'] - $result['full_discount'] - $result['user_bonus'] - $result['opgoods_discount'] - $result['room_bonus'];
- //商品总价
- $result['pay_car_nopred'] = $result['goods_amount'] - $result['full_discount'] - $result['opgoods_discount'];
- //是否可以开增值税发票
- $result['vat_deny'] = $this->mLogicOut['vat_deny'];
- //发票
- $result['vat_hash'] = $this->mLogicOut['vat_hash'];
- if(intval($result['goods_amount'] + 0.005) > 0) {
- $discount_amount = $result['goods_amount'] - $result['pay_car_pred'];
- } else {
- $discount_amount = 0;
- }
- $result['discount_desc'] = $this->discount_desc($bonusable_goods_amount - $lowest_price_amount,$discount_amount);
- $result['deduct_tip'] = '提示:累计商品天猫总价后再抵扣';
- return $result;
- }
- private function vpayinfo()
- {
- $result = [];
- return $result;
- }
- private function discount_desc($usable_bonus,$discount)
- {
- $usable_bonus = intval($usable_bonus * 100 + 0.5);
- $discount = intval($discount * 100 + 0.5);
- if ($usable_bonus > $discount) {
- $discount = $discount / 100;
- return "节省¥{$discount},未达员工价";
- }
- else {
- $discount = $discount / 100;
- return "节省¥{$discount},已达员工价";
- }
- }
- private function optional_goods()
- {
- $discount = 0;
- $result = [];
- $store_cart_list = $this->mLogicOut['store_cart_list'];
- foreach ($store_cart_list as $store_id => $cart_list)
- {
- if($store_id == 6)
- {
- $matcher = new optional_match($cart_list);
- $op_result = $matcher->match();
- if($op_result != false) {
- $result[$store_id] = $op_result;
- $discount += $op_result['discount'];
- } else {
- $result[$store_id] = array('discount' => 0,'goods_nums' => []);
- }
- }
- else {
- $result[$store_id] = array('discount' => 0,'goods_nums' => []);
- }
- }
- $this->mLogicOut['optional_goods'] = $result;
- return $discount;
- }
- private function formate_rates($rates)
- {
- if(empty($rates)) return null;
- $result = [];
- foreach ($rates as $rate => $val) {
- $item['rate'] = $rate;
- $item['total'] = $val;
- $result[] = $item;
- }
- return $result;
- }
- private function full_desc($desc)
- {
- $ret = preg_match('#(.*?)<a.*?title=("|\')(.*?)\2.*?>.*?</a>#s',$desc,$matches);
- if($ret != false && count($matches) == 4) {
- $desc = $matches[1] . $matches[3];
- }
- return $desc;
- }
- private function full_goods()
- {
- $store_mansong_rule_list = $this->mLogicOut['store_mansong_rule_list'];
- foreach ($store_mansong_rule_list as $store_id => $value) {
- return intval($value['goods_id']);
- }
- return 0;
- }
- private function city_id()
- {
- $address_info = $this->mLogicOut['address_info'];
- if(empty($address_info)) {
- return false;
- } else {
- return intval($address_info['city_id']);
- }
- }
- private function area_id()
- {
- $address_info = $this->mLogicOut['address_info'];
- if(empty($address_info)) {
- return false;
- } else {
- return intval($address_info['area_id']);
- }
- }
- private function paytype()
- {
- return pay_helper::pay_types();
- }
- //运费相关信息
- private function freight(&$freight,&$offpay_hash,&$offpay_hash_batch)
- {
- $logic_buy = Logic("buy");
- $freight_hash = $this->mLogicOut['freight_list'];
- $city_id = $this->city_id();
- $area_id = $this->area_id();
- $data = $logic_buy->changeAddr($freight_hash, $city_id, $area_id, $_SESSION['member_id']);
- if (!empty($data) && $data['state'] == 'success')
- {
- $offpay_hash = $data['offpay_hash'];
- $offpay_hash_batch = $data['offpay_hash_batch'];
- $freight = 0.00;
- foreach ($data['content'] as $value) {
- $freight += $value['value'];
- }
- return true;
- }
- else {
- return false;
- }
- }
- private function goods_ids()
- {
- $ids = [];
- $sent_id = $this->full_goods();
- if($sent_id > 0) {
- $ids[] = $sent_id;
- }
- $carts = $this->goods_list();
- foreach ($carts as $item)
- {
- if($item['bl_id'] > 0)
- {
- $bl_goods = activity_helper::bundling_goods($item['bl_id']);
- if($bl_goods != false) {
- foreach ($bl_goods as $gid) {
- $ids[] = $gid;
- }
- }
- }
- else
- {
- $ids[] = $item['goods_id'];
- }
- }
- return $ids;
- }
- private function summary()
- {
- $goods_ids = $this->goods_ids();
- $helper = new goods_helper($this->mPriceCalculate);
- $summaries = $helper->online_summary($goods_ids,$related_goods);
- $summary_list = $summaries['summary'];
- if(!empty($related_goods)) {
- $related_summary = $helper->cart_summary($related_goods,$x);
- $summary_list = array_merge($summary_list,$related_summary['summary']);
- }
- $ret['summary'] = $summary_list;
- $ret['groupbuy'] = $summaries['groupbuy'];
- $ret['limitime'] = $summaries['limitime'];
- $ret['bundling'] = $summaries['bundling'];
- return $ret;
- }
- private function address()
- {
- return $this->mLogicOut['address_info'];
- }
- private function goods_list()
- {
- //购物车中商品列表
- $goods_list = [];
- $store_cart_list = $this->mLogicOut['store_cart_list'];
- foreach ($store_cart_list as $store_id => $carts)
- {
- foreach ($carts as $value) {
- $item['goods_id'] = intval($value['goods_id']);
- $item['goods_num'] = intval($value['goods_num']);
- $item['bl_id'] = intval($value['bl_id']);
- $goods_list[] = $item;
- }
- }
- return $goods_list;
- }
- private function invoice()
- {
- return $this->mLogicOut['inv_info'];
- }
- //计算购物车中所有商品,最多能用多少红包
- private function calc_goods()
- {
- $bonus_amount = 0.00;
- $goods_amount = 0.00;
- $lowest_amount = 0.00;
- $store_cart_list = $this->mLogicOut['store_cart_list'];
- foreach ($store_cart_list as $store_id => $cart_list)
- {
- $opgoods = $this->mLogicOut['optional_goods'][$store_id];
- foreach ($cart_list as $cart)
- {
- $goods_price = $cart['goods_price'];
- $lowest_price = $cart['goods_lowest_price'];
- $goods_num = intval($cart['goods_num']);
- $bonus_total = $goods_num * ($goods_price - $lowest_price);
- $goods_total = $goods_num * $goods_price;
- $lowest_total = $goods_num * $lowest_price;
- if(intval($cart['bl_id']) > 0) {
- }
- elseif(!empty($cart['groupbuy_info'])) {
- }
- elseif(!empty($cart['xianshi_info'])) {
- }
- else
- {
- if(empty($opgoods)) {
- $bonus_amount += $bonus_total;
- $goods_amount += $goods_total;
- $lowest_amount += $lowest_total;
- }
- else
- {
- $goods_id = intval($cart['goods_id']);
- if(array_key_exists($goods_id,$opgoods['goods_nums']))
- {
- $goods_price = $cart['goods_price'];
- $goods_num = intval($cart['goods_num']);
- $opnum = $opgoods['goods_nums'][$goods_id];
- if($goods_num > $opnum) {
- $bonus_amount += ($goods_price - $lowest_price) * ($goods_num - $opnum);
- $goods_amount += $goods_price * ($goods_num - $opnum);
- $lowest_amount += $lowest_price * ($goods_num - $opnum);
- }
- }
- else {
- $bonus_amount += $bonus_total;
- $goods_amount += $goods_total;
- $lowest_amount += $lowest_total;
- }
- }
- }
- }
- }
- $bonus_amount = intval($bonus_amount * 100 + 0.5) / 100;
- $goods_amount = intval($goods_amount * 100 + 0.5) / 100;
- $lowest_amount = intval($lowest_amount * 100 + 0.5) / 100;
- return ['bonusable_goods_amount' => $goods_amount, 'max_bonus_amount' => $bonus_amount,'lowest_price_amount' => $lowest_amount];
- }
- // private function available_pred($goods_amount,$full_discount,$pd_total,&$rates,&$discount_gap,&$gap_show)
- // {
- // $full = intval($full_discount * 100 + 0.5);
- // $pred_amound = $this->pred_goods_amount();
- // $pred_cent = intval($pred_amound * 100 + 0.5);
- // if($pred_cent > 0)
- // {
- // $gap_show = true;
- // if($full > 0) {
- // $pred_amound = $pred_amound - ($pred_amound / $goods_amount) * $full_discount;
- // }
- // $bonus_goods_amount = $pred_amound;
- // $pred_amound = $pred_amound - account::order_cash($pred_amound,$rates);
- //
- // $pred_cend = intval($pred_amound * 100 + 0.5);
- // $pd_total = intval($pd_total * 100 + 0.5);
- //
- // $ret = ($pred_cend > $pd_total) ? ($pd_total / 100) : ($pred_cend / 100);
- // $discount_gap = $this->mPriceCalculate->discount_gap($bonus_goods_amount - $ret,$bonus_goods_amount);
- //
- // return $ret;
- // }
- // else
- // {
- // $rates = [];
- // $gap_show = false;
- // $discount_gap = 0.00;
- //
- // return 0.00;
- // }
- // }
- // private function pred_goods_amount()
- // {
- // $pred_amount = 0.00;
- // $store_cart_list = $this->mLogicOut['store_cart_list'];
- // foreach ($store_cart_list as $store_id => $cart_list)
- // {
- // $opgoods = $this->mLogicOut['optional_goods'][$store_id];
- //
- // foreach ($cart_list as $cart)
- // {
- // $goods_total = $cart['goods_total'];
- // if(intval($cart['bl_id']) > 0) {
- // }
- // elseif(!empty($cart['groupbuy_info'])) {
- // }
- // elseif(!empty($cart['xianshi_info'])) {
- // }
- // else
- // {
- // if(empty($opgoods)) {
- // $pred_amount += $goods_total;
- // }
- // else
- // {
- // $goods_id = intval($cart['goods_id']);
- // if(array_key_exists($goods_id,$opgoods['goods_nums']))
- // {
- // $goods_price = $cart['goods_price'];
- // $goods_num = intval($cart['goods_num']);
- // $opnum = $opgoods['goods_nums'][$goods_id];
- // if($goods_num > $opnum) {
- // $pred_amount += $goods_price * ($goods_num - $opnum);
- // }
- // }
- // else {
- // $pred_amount += $goods_total;
- // }
- // }
- // }
- // }
- // }
- // return $pred_amount;
- // }
- public function check_fcode(&$err)
- {
- $cids = [];
- $store_cart_list = $this->mLogicOut['store_cart_list'];
- foreach ($store_cart_list as $store_id => $carts)
- {
- foreach ($carts as $value)
- {
- $bl_id = intval($value['bl_id']);
- if($bl_id > 0) continue;
- $fcode = intval($value['is_fcode']) == 1 ? true : false;
- if($fcode)
- {
- $goods_id = intval($value['goods_id']);
- $goods_num = intval($value['goods_num']);
- $commonid = commonid_helper::instance()->common_id($goods_id);
- if(isset($cids[$commonid])) {
- $cids[$commonid]['num'] += $goods_num;
- } else {
- $cids[$commonid]['num'] = $goods_num;
- $cids[$commonid]['name'] = $value['goods_name'];
- }
- }
- }
- }
- if(!empty($cids))
- {
- if($this->mUserFcode == null) {
- $this->mUserFcode = new user_session\fcode();
- $this->mUserFcode->onStatus();
- }
- foreach ($cids as $commonid => $val)
- {
- $goods_num = $val['num'];
- $name = $val['name'];
- if($goods_num <= 0) continue;
- $num = $this->mUserFcode->usable_num($commonid,$lock_num);
- if($num == false)
- {
- if(isset($lock_num) && $lock_num > 0) {
- $err = "您购买<{$name}>的F码处于锁定状态,激活后可以购买.";
- } else {
- $err = "您没有购买<{$name}>的F码,请重新选择商品.";
- }
- return false;
- }
- elseif($num < $goods_num) {
- $err = "您只有购买{$num}支<{$name}>的F码, 请修改商品数量.";
- return false;
- }
- }
- }
- return true;
- }
- public function format()
- {
- $result = [];
- $result['payinfo'] = $this->payinfo();
- $result['address'] = $this->address();
- $result['invoice'] = $this->invoice();
- $result['paytype'] = $this->paytype();
- $result['goods_list'] = $this->goods_list();
- $result['rooms'] = $result['payinfo']['rooms'];
- unset($result['payinfo']['rooms']);
- $summary = $this->summary();
- $result['summary'] = $summary['summary'];
- $result['groupbuy'] = $summary['groupbuy'];
- $result['limitime'] = $summary['limitime'];
- $result['bundling'] = $summary['bundling'];
- return $result;
- }
- }
- class buyv_first
- {
- private $mLogicOut;
- private $mPriceCalculate;
- public function __construct($logic_out,bonus\IPriceCalculate $priceCalculate)
- {
- $this->mPriceCalculate = $priceCalculate;
- $this->mLogicOut = $logic_out;
- }
- public function payinfo()
- {
- $result = [];
- $goods_info = $this->mLogicOut['goods_info'];
- $result['goods_amount'] = $goods_info['goods_total'];
- $minfo = $this->mLogicOut['member_info'];
- $mobile = $minfo['member_mobile'];
- $result['consignee'] = $mobile;
- return $result;
- }
- private function goods_list()
- {
- $goods_list = [];
- $value = $this->mLogicOut['goods_info'];
- $item['goods_id'] = intval($value['goods_id']);
- $item['goods_num'] = intval($value['quantity']);
- $item['bl_id'] = intval($value['bl_id']);
- $goods_list[] = $item;
- return $goods_list;
- }
- private function summary()
- {
- $goods_info = $this->mLogicOut['goods_info'];
- $goods_id = intval($goods_info['goods_id']);
- $goods_ids = [$goods_id];
- $helper = new goods_helper($this->mPriceCalculate);
- $summaries = $helper->online_summary($goods_ids,$related_goods);
- $summary_list = $summaries['summary'];
- if(!empty($related_goods)) {
- $related_summary = $helper->cart_summary($related_goods,$x);
- $summary_list = array_merge($summary_list,$related_summary['summary']);
- }
- $ret['summary'] = $summary_list;
- $ret['groupbuy'] = $summaries['groupbuy'];
- $ret['limitime'] = $summaries['limitime'];
- $ret['bundling'] = $summaries['bundling'];
- return $ret;
- }
- private function paytype()
- {
- return pay_helper::pay_types();
- }
- public function check_fcode(&$err)
- {
- return true;
- }
- public function format()
- {
- $result = [];
- $result['vpayinfo'] = $this->payinfo();
- $result['paytype'] = $this->paytype();
- $result['goods_list'] = $this->goods_list();
- $summary = $this->summary();
- $result['summary'] = $summary['summary'];
- $result['groupbuy'] = $summary['groupbuy'];
- $result['limitime'] = $summary['limitime'];
- $result['bundling'] = $summary['bundling'];
- return $result;
- }
- }
|