buy_first.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 16/9/19
  6. * Time: 下午6:48
  7. */
  8. require_once(BASE_ROOT_PATH . '/helper/activity_helper.php');
  9. require_once(BASE_ROOT_PATH . '/helper/goods_helper.php');
  10. require_once(BASE_ROOT_PATH . '/helper/pay_helper.php');
  11. require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
  12. class buy_first
  13. {
  14. private $mLogicOut;
  15. private $mUserFcode;
  16. private $mPriceCalculate;
  17. public function __construct($logic_out,bonus\IPriceCalculate $priceCalculate)
  18. {
  19. $this->mPriceCalculate = $priceCalculate;
  20. $this->mLogicOut = $logic_out;
  21. $this->mUserFcode = null;
  22. }
  23. //商品金额相关信息
  24. private function payinfo()
  25. {
  26. $result = [];
  27. //商品总价,红包可抵扣,满减金额
  28. $goods_amount = 0.00;
  29. $store_goods_total = $this->mLogicOut['store_goods_total'];
  30. foreach ($store_goods_total as $store_id => $value) {
  31. $goods_amount += doubleval($value);
  32. }
  33. $result['goods_amount'] = $goods_amount;
  34. //满送
  35. $full_discount = 0.00;
  36. $full_desc = '';
  37. $store_mansong_rule_list = $this->mLogicOut['store_mansong_rule_list'];
  38. foreach ($store_mansong_rule_list as $store_id => $value) {
  39. $full_discount += doubleval($value['discount']);
  40. $full_desc = $this->full_desc($value['desc']);
  41. }
  42. $result['full_discount'] = $full_discount;
  43. $result['full_desc'] = $full_desc;
  44. $result['full_goods'] = $this->full_goods();
  45. //运费
  46. if($this->freight($freight,$offpay_hash,$offpay_hash_batch) == true) {
  47. $result['freight'] = $freight;
  48. $result['offpay_hash_batch'] = $offpay_hash_batch;
  49. $result['offpay_hash'] = $offpay_hash;
  50. } else {
  51. $result['freight'] = 0;
  52. $result['offpay_hash_batch'] = "";
  53. $result['offpay_hash'] = "";
  54. }
  55. $result['freight_hash'] = $this->mLogicOut['freight_list'];
  56. //红包信息
  57. $result['total_pred'] = doubleval($this->mLogicOut['available_predeposit']);
  58. $result['total_bonus'] = doubleval($this->mLogicOut['available_bonus']);
  59. $result['opgoods_discount'] = $this->optional_goods();
  60. $result['opgoods_desc'] = 'N元任选优惠';
  61. $calcer = $this->calc_goods();
  62. $bonusable_goods_amount = $calcer['bonusable_goods_amount'];
  63. $lowest_price_amount = $calcer['lowest_price_amount'];
  64. $total_bonus = $this->mPriceCalculate->bonus_amount($bonusable_goods_amount,$lowest_price_amount);
  65. $ways = $this->mPriceCalculate->bonus_way($total_bonus);
  66. $result['user_bonus'] = $ways['user_bonus'];
  67. $result['show_room'] = $ways['show_room'];
  68. $result['room_bonus'] = $ways['room_bonus'];
  69. $result['rooms'] = $ways['rooms'];
  70. $order_cash = $this->mPriceCalculate->order_cash($bonusable_goods_amount,$lowest_price_amount);
  71. $discount_gap = $this->mPriceCalculate->discount_gap($order_cash,$lowest_price_amount);
  72. if($discount_gap == false) {
  73. $result['gap_show'] = false;
  74. $result['gap_desc'] = "";
  75. $result['discount_gap'] = 0.00;
  76. }
  77. else
  78. {
  79. global $config;
  80. if(intval($discount_gap * 100 + 0.5) == 0) {
  81. $result['gap_desc'] = $config['bonus_gap']['no_gap'];
  82. } else {
  83. $result['gap_desc'] = sprintf($config['bonus_gap']['have_gap'],$lowest_price_amount,$discount_gap);
  84. }
  85. $result['discount_gap'] = $discount_gap;
  86. }
  87. $result['bonus_rates'] = $this->formate_rates([ 30 => $result['user_bonus'] + $result['room_bonus']]);
  88. $result['earn_bonus'] = $config['bonus_gap']['earn_bonus'];
  89. $result['usable_pred'] = true;
  90. $cash_amount = $result['goods_amount'] + $result['freight'] - $result['full_discount'] - $result['opgoods_discount'] - $result['user_bonus'] - $result['room_bonus'];
  91. $total_pred_cent = intval($result['total_pred'] * 100 + 0.5);
  92. $cash_amount_cent = intval($cash_amount * 100 + 0.5);
  93. if($total_pred_cent >= $cash_amount_cent) {
  94. $pay_pred = $cash_amount_cent / 100;
  95. }
  96. else {
  97. $pay_pred = $total_pred_cent / 100;
  98. }
  99. $result['user_pred'] = $pay_pred;
  100. $result['pay_cash_pred'] = $result['goods_amount'] + $result['freight'] - $result['full_discount'] - $result['opgoods_discount'] - $result['user_bonus'] - $result['room_bonus'] - $pay_pred;
  101. $result['pay_cash_nopred'] = $result['goods_amount'] + $result['freight'] - $result['full_discount'] - $result['opgoods_discount'];
  102. //购物车显示应付现金
  103. $result['pay_car_pred'] = $result['goods_amount'] - $result['full_discount'] - $result['user_bonus'] - $result['opgoods_discount'] - $result['room_bonus'];
  104. //商品总价
  105. $result['pay_car_nopred'] = $result['goods_amount'] - $result['full_discount'] - $result['opgoods_discount'];
  106. //是否可以开增值税发票
  107. $result['vat_deny'] = $this->mLogicOut['vat_deny'];
  108. //发票
  109. $result['vat_hash'] = $this->mLogicOut['vat_hash'];
  110. if(intval($result['goods_amount'] + 0.005) > 0) {
  111. $discount_amount = $result['goods_amount'] - $result['pay_car_pred'];
  112. } else {
  113. $discount_amount = 0;
  114. }
  115. $result['discount_desc'] = $this->discount_desc($bonusable_goods_amount - $lowest_price_amount,$discount_amount);
  116. $result['deduct_tip'] = '提示:累计商品天猫总价后再抵扣';
  117. return $result;
  118. }
  119. private function vpayinfo()
  120. {
  121. $result = [];
  122. return $result;
  123. }
  124. private function discount_desc($usable_bonus,$discount)
  125. {
  126. $usable_bonus = intval($usable_bonus * 100 + 0.5);
  127. $discount = intval($discount * 100 + 0.5);
  128. if ($usable_bonus > $discount) {
  129. $discount = $discount / 100;
  130. return "节省¥{$discount},未达员工价";
  131. }
  132. else {
  133. $discount = $discount / 100;
  134. return "节省¥{$discount},已达员工价";
  135. }
  136. }
  137. private function optional_goods()
  138. {
  139. $discount = 0;
  140. $result = [];
  141. $store_cart_list = $this->mLogicOut['store_cart_list'];
  142. foreach ($store_cart_list as $store_id => $cart_list)
  143. {
  144. if($store_id == 6)
  145. {
  146. $matcher = new optional_match($cart_list);
  147. $op_result = $matcher->match();
  148. if($op_result != false) {
  149. $result[$store_id] = $op_result;
  150. $discount += $op_result['discount'];
  151. } else {
  152. $result[$store_id] = array('discount' => 0,'goods_nums' => []);
  153. }
  154. }
  155. else {
  156. $result[$store_id] = array('discount' => 0,'goods_nums' => []);
  157. }
  158. }
  159. $this->mLogicOut['optional_goods'] = $result;
  160. return $discount;
  161. }
  162. private function formate_rates($rates)
  163. {
  164. if(empty($rates)) return null;
  165. $result = [];
  166. foreach ($rates as $rate => $val) {
  167. $item['rate'] = $rate;
  168. $item['total'] = $val;
  169. $result[] = $item;
  170. }
  171. return $result;
  172. }
  173. private function full_desc($desc)
  174. {
  175. $ret = preg_match('#(.*?)<a.*?title=("|\')(.*?)\2.*?>.*?</a>#s',$desc,$matches);
  176. if($ret != false && count($matches) == 4) {
  177. $desc = $matches[1] . $matches[3];
  178. }
  179. return $desc;
  180. }
  181. private function full_goods()
  182. {
  183. $store_mansong_rule_list = $this->mLogicOut['store_mansong_rule_list'];
  184. foreach ($store_mansong_rule_list as $store_id => $value) {
  185. return intval($value['goods_id']);
  186. }
  187. return 0;
  188. }
  189. private function city_id()
  190. {
  191. $address_info = $this->mLogicOut['address_info'];
  192. if(empty($address_info)) {
  193. return false;
  194. } else {
  195. return intval($address_info['city_id']);
  196. }
  197. }
  198. private function area_id()
  199. {
  200. $address_info = $this->mLogicOut['address_info'];
  201. if(empty($address_info)) {
  202. return false;
  203. } else {
  204. return intval($address_info['area_id']);
  205. }
  206. }
  207. private function paytype()
  208. {
  209. return pay_helper::pay_types();
  210. }
  211. //运费相关信息
  212. private function freight(&$freight,&$offpay_hash,&$offpay_hash_batch)
  213. {
  214. $logic_buy = Logic("buy");
  215. $freight_hash = $this->mLogicOut['freight_list'];
  216. $city_id = $this->city_id();
  217. $area_id = $this->area_id();
  218. $data = $logic_buy->changeAddr($freight_hash, $city_id, $area_id, $_SESSION['member_id']);
  219. if (!empty($data) && $data['state'] == 'success')
  220. {
  221. $offpay_hash = $data['offpay_hash'];
  222. $offpay_hash_batch = $data['offpay_hash_batch'];
  223. $freight = 0.00;
  224. foreach ($data['content'] as $value) {
  225. $freight += $value['value'];
  226. }
  227. return true;
  228. }
  229. else {
  230. return false;
  231. }
  232. }
  233. private function goods_ids()
  234. {
  235. $ids = [];
  236. $sent_id = $this->full_goods();
  237. if($sent_id > 0) {
  238. $ids[] = $sent_id;
  239. }
  240. $carts = $this->goods_list();
  241. foreach ($carts as $item)
  242. {
  243. if($item['bl_id'] > 0)
  244. {
  245. $bl_goods = activity_helper::bundling_goods($item['bl_id']);
  246. if($bl_goods != false) {
  247. foreach ($bl_goods as $gid) {
  248. $ids[] = $gid;
  249. }
  250. }
  251. }
  252. else
  253. {
  254. $ids[] = $item['goods_id'];
  255. }
  256. }
  257. return $ids;
  258. }
  259. private function summary()
  260. {
  261. $goods_ids = $this->goods_ids();
  262. $helper = new goods_helper($this->mPriceCalculate);
  263. $summaries = $helper->online_summary($goods_ids,$related_goods);
  264. $summary_list = $summaries['summary'];
  265. if(!empty($related_goods)) {
  266. $related_summary = $helper->cart_summary($related_goods,$x);
  267. $summary_list = array_merge($summary_list,$related_summary['summary']);
  268. }
  269. $ret['summary'] = $summary_list;
  270. $ret['groupbuy'] = $summaries['groupbuy'];
  271. $ret['limitime'] = $summaries['limitime'];
  272. $ret['bundling'] = $summaries['bundling'];
  273. return $ret;
  274. }
  275. private function address()
  276. {
  277. return $this->mLogicOut['address_info'];
  278. }
  279. private function goods_list()
  280. {
  281. //购物车中商品列表
  282. $goods_list = [];
  283. $store_cart_list = $this->mLogicOut['store_cart_list'];
  284. foreach ($store_cart_list as $store_id => $carts)
  285. {
  286. foreach ($carts as $value) {
  287. $item['goods_id'] = intval($value['goods_id']);
  288. $item['goods_num'] = intval($value['goods_num']);
  289. $item['bl_id'] = intval($value['bl_id']);
  290. $goods_list[] = $item;
  291. }
  292. }
  293. return $goods_list;
  294. }
  295. private function invoice()
  296. {
  297. return $this->mLogicOut['inv_info'];
  298. }
  299. //计算购物车中所有商品,最多能用多少红包
  300. private function calc_goods()
  301. {
  302. $bonus_amount = 0.00;
  303. $goods_amount = 0.00;
  304. $lowest_amount = 0.00;
  305. $store_cart_list = $this->mLogicOut['store_cart_list'];
  306. foreach ($store_cart_list as $store_id => $cart_list)
  307. {
  308. $opgoods = $this->mLogicOut['optional_goods'][$store_id];
  309. foreach ($cart_list as $cart)
  310. {
  311. $goods_price = $cart['goods_price'];
  312. $lowest_price = $cart['goods_lowest_price'];
  313. $goods_num = intval($cart['goods_num']);
  314. $bonus_total = $goods_num * ($goods_price - $lowest_price);
  315. $goods_total = $goods_num * $goods_price;
  316. $lowest_total = $goods_num * $lowest_price;
  317. if(intval($cart['bl_id']) > 0) {
  318. }
  319. elseif(!empty($cart['groupbuy_info'])) {
  320. }
  321. elseif(!empty($cart['xianshi_info'])) {
  322. }
  323. else
  324. {
  325. if(empty($opgoods)) {
  326. $bonus_amount += $bonus_total;
  327. $goods_amount += $goods_total;
  328. $lowest_amount += $lowest_total;
  329. }
  330. else
  331. {
  332. $goods_id = intval($cart['goods_id']);
  333. if(array_key_exists($goods_id,$opgoods['goods_nums']))
  334. {
  335. $goods_price = $cart['goods_price'];
  336. $goods_num = intval($cart['goods_num']);
  337. $opnum = $opgoods['goods_nums'][$goods_id];
  338. if($goods_num > $opnum) {
  339. $bonus_amount += ($goods_price - $lowest_price) * ($goods_num - $opnum);
  340. $goods_amount += $goods_price * ($goods_num - $opnum);
  341. $lowest_amount += $lowest_price * ($goods_num - $opnum);
  342. }
  343. }
  344. else {
  345. $bonus_amount += $bonus_total;
  346. $goods_amount += $goods_total;
  347. $lowest_amount += $lowest_total;
  348. }
  349. }
  350. }
  351. }
  352. }
  353. $bonus_amount = intval($bonus_amount * 100 + 0.5) / 100;
  354. $goods_amount = intval($goods_amount * 100 + 0.5) / 100;
  355. $lowest_amount = intval($lowest_amount * 100 + 0.5) / 100;
  356. return ['bonusable_goods_amount' => $goods_amount, 'max_bonus_amount' => $bonus_amount,'lowest_price_amount' => $lowest_amount];
  357. }
  358. // private function available_pred($goods_amount,$full_discount,$pd_total,&$rates,&$discount_gap,&$gap_show)
  359. // {
  360. // $full = intval($full_discount * 100 + 0.5);
  361. // $pred_amound = $this->pred_goods_amount();
  362. // $pred_cent = intval($pred_amound * 100 + 0.5);
  363. // if($pred_cent > 0)
  364. // {
  365. // $gap_show = true;
  366. // if($full > 0) {
  367. // $pred_amound = $pred_amound - ($pred_amound / $goods_amount) * $full_discount;
  368. // }
  369. // $bonus_goods_amount = $pred_amound;
  370. // $pred_amound = $pred_amound - account::order_cash($pred_amound,$rates);
  371. //
  372. // $pred_cend = intval($pred_amound * 100 + 0.5);
  373. // $pd_total = intval($pd_total * 100 + 0.5);
  374. //
  375. // $ret = ($pred_cend > $pd_total) ? ($pd_total / 100) : ($pred_cend / 100);
  376. // $discount_gap = $this->mPriceCalculate->discount_gap($bonus_goods_amount - $ret,$bonus_goods_amount);
  377. //
  378. // return $ret;
  379. // }
  380. // else
  381. // {
  382. // $rates = [];
  383. // $gap_show = false;
  384. // $discount_gap = 0.00;
  385. //
  386. // return 0.00;
  387. // }
  388. // }
  389. // private function pred_goods_amount()
  390. // {
  391. // $pred_amount = 0.00;
  392. // $store_cart_list = $this->mLogicOut['store_cart_list'];
  393. // foreach ($store_cart_list as $store_id => $cart_list)
  394. // {
  395. // $opgoods = $this->mLogicOut['optional_goods'][$store_id];
  396. //
  397. // foreach ($cart_list as $cart)
  398. // {
  399. // $goods_total = $cart['goods_total'];
  400. // if(intval($cart['bl_id']) > 0) {
  401. // }
  402. // elseif(!empty($cart['groupbuy_info'])) {
  403. // }
  404. // elseif(!empty($cart['xianshi_info'])) {
  405. // }
  406. // else
  407. // {
  408. // if(empty($opgoods)) {
  409. // $pred_amount += $goods_total;
  410. // }
  411. // else
  412. // {
  413. // $goods_id = intval($cart['goods_id']);
  414. // if(array_key_exists($goods_id,$opgoods['goods_nums']))
  415. // {
  416. // $goods_price = $cart['goods_price'];
  417. // $goods_num = intval($cart['goods_num']);
  418. // $opnum = $opgoods['goods_nums'][$goods_id];
  419. // if($goods_num > $opnum) {
  420. // $pred_amount += $goods_price * ($goods_num - $opnum);
  421. // }
  422. // }
  423. // else {
  424. // $pred_amount += $goods_total;
  425. // }
  426. // }
  427. // }
  428. // }
  429. // }
  430. // return $pred_amount;
  431. // }
  432. public function check_fcode(&$err)
  433. {
  434. $cids = [];
  435. $store_cart_list = $this->mLogicOut['store_cart_list'];
  436. foreach ($store_cart_list as $store_id => $carts)
  437. {
  438. foreach ($carts as $value)
  439. {
  440. $bl_id = intval($value['bl_id']);
  441. if($bl_id > 0) continue;
  442. $fcode = intval($value['is_fcode']) == 1 ? true : false;
  443. if($fcode)
  444. {
  445. $goods_id = intval($value['goods_id']);
  446. $goods_num = intval($value['goods_num']);
  447. $commonid = commonid_helper::instance()->common_id($goods_id);
  448. if(isset($cids[$commonid])) {
  449. $cids[$commonid]['num'] += $goods_num;
  450. } else {
  451. $cids[$commonid]['num'] = $goods_num;
  452. $cids[$commonid]['name'] = $value['goods_name'];
  453. }
  454. }
  455. }
  456. }
  457. if(!empty($cids))
  458. {
  459. if($this->mUserFcode == null) {
  460. $this->mUserFcode = new user_session\fcode();
  461. $this->mUserFcode->onStatus();
  462. }
  463. foreach ($cids as $commonid => $val)
  464. {
  465. $goods_num = $val['num'];
  466. $name = $val['name'];
  467. if($goods_num <= 0) continue;
  468. $num = $this->mUserFcode->usable_num($commonid,$lock_num);
  469. if($num == false)
  470. {
  471. if(isset($lock_num) && $lock_num > 0) {
  472. $err = "您购买<{$name}>的F码处于锁定状态,激活后可以购买.";
  473. } else {
  474. $err = "您没有购买<{$name}>的F码,请重新选择商品.";
  475. }
  476. return false;
  477. }
  478. elseif($num < $goods_num) {
  479. $err = "您只有购买{$num}支<{$name}>的F码, 请修改商品数量.";
  480. return false;
  481. }
  482. }
  483. }
  484. return true;
  485. }
  486. public function format()
  487. {
  488. $result = [];
  489. $result['payinfo'] = $this->payinfo();
  490. $result['address'] = $this->address();
  491. $result['invoice'] = $this->invoice();
  492. $result['paytype'] = $this->paytype();
  493. $result['goods_list'] = $this->goods_list();
  494. $result['rooms'] = $result['payinfo']['rooms'];
  495. unset($result['payinfo']['rooms']);
  496. $summary = $this->summary();
  497. $result['summary'] = $summary['summary'];
  498. $result['groupbuy'] = $summary['groupbuy'];
  499. $result['limitime'] = $summary['limitime'];
  500. $result['bundling'] = $summary['bundling'];
  501. return $result;
  502. }
  503. }
  504. class buyv_first
  505. {
  506. private $mLogicOut;
  507. private $mPriceCalculate;
  508. public function __construct($logic_out,bonus\IPriceCalculate $priceCalculate)
  509. {
  510. $this->mPriceCalculate = $priceCalculate;
  511. $this->mLogicOut = $logic_out;
  512. }
  513. public function payinfo()
  514. {
  515. $result = [];
  516. $goods_info = $this->mLogicOut['goods_info'];
  517. $result['goods_amount'] = $goods_info['goods_total'];
  518. $minfo = $this->mLogicOut['member_info'];
  519. $mobile = $minfo['member_mobile'];
  520. $result['consignee'] = $mobile;
  521. return $result;
  522. }
  523. private function goods_list()
  524. {
  525. $goods_list = [];
  526. $value = $this->mLogicOut['goods_info'];
  527. $item['goods_id'] = intval($value['goods_id']);
  528. $item['goods_num'] = intval($value['quantity']);
  529. $item['bl_id'] = intval($value['bl_id']);
  530. $goods_list[] = $item;
  531. return $goods_list;
  532. }
  533. private function summary()
  534. {
  535. $goods_info = $this->mLogicOut['goods_info'];
  536. $goods_id = intval($goods_info['goods_id']);
  537. $goods_ids = [$goods_id];
  538. $helper = new goods_helper($this->mPriceCalculate);
  539. $summaries = $helper->online_summary($goods_ids,$related_goods);
  540. $summary_list = $summaries['summary'];
  541. if(!empty($related_goods)) {
  542. $related_summary = $helper->cart_summary($related_goods,$x);
  543. $summary_list = array_merge($summary_list,$related_summary['summary']);
  544. }
  545. $ret['summary'] = $summary_list;
  546. $ret['groupbuy'] = $summaries['groupbuy'];
  547. $ret['limitime'] = $summaries['limitime'];
  548. $ret['bundling'] = $summaries['bundling'];
  549. return $ret;
  550. }
  551. private function paytype()
  552. {
  553. return pay_helper::pay_types();
  554. }
  555. public function check_fcode(&$err)
  556. {
  557. return true;
  558. }
  559. public function format()
  560. {
  561. $result = [];
  562. $result['vpayinfo'] = $this->payinfo();
  563. $result['paytype'] = $this->paytype();
  564. $result['goods_list'] = $this->goods_list();
  565. $summary = $this->summary();
  566. $result['summary'] = $summary['summary'];
  567. $result['groupbuy'] = $summary['groupbuy'];
  568. $result['limitime'] = $summary['limitime'];
  569. $result['bundling'] = $summary['bundling'];
  570. return $result;
  571. }
  572. }