cart.php 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881
  1. <?php
  2. /**
  3. * 购物车
  4. */
  5. defined('InShopNC') or exit('Access Invalid!');
  6. require_once(BASE_ROOT_PATH . '/helper/goods_helper.php');
  7. require_once(BASE_ROOT_PATH . '/helper/activity_helper.php');
  8. require_once(BASE_ROOT_PATH . '/helper/algorithm.php');
  9. require_once(BASE_ROOT_PATH . '/helper/predeposit_helper.php');
  10. require_once (BASE_ROOT_PATH . '/helper/user_session/fcode.php');
  11. require_once (BASE_ROOT_PATH . '/helper/special_helper.php');
  12. class cart_item
  13. {
  14. private $cart_id;
  15. private $bl_id;
  16. private $goods_id;
  17. private $goods_num;
  18. public function __construct($cart_id,$bl_id,$goods_id,$goods_num)
  19. {
  20. $this->cart_id = intval($cart_id);
  21. $this->bl_id = intval($bl_id);
  22. $this->goods_id = intval($goods_id);
  23. $this->goods_num = intval($goods_num);
  24. }
  25. public function is_bl() {
  26. return $this->bl_id > 0;
  27. }
  28. public function format() {
  29. $cart_item['cart_id'] = $this->cart_id;
  30. $cart_item['goods_id'] = $this->goods_id;
  31. $cart_item['bl_id'] = $this->bl_id;
  32. $cart_item['goods_num'] = $this->goods_num;
  33. return $cart_item;
  34. }
  35. public function goods_ids()
  36. {
  37. if($this->is_bl()) {
  38. return activity_helper::bundling_goods($this->bl_id);
  39. }
  40. else {
  41. return array($this->goods_id);
  42. }
  43. }
  44. }
  45. class cartControl extends mobileControl
  46. {
  47. const db_type = 'db';
  48. const session_type = 'Session';
  49. private $mUserFcode;
  50. private $mFcodeBannerID;
  51. public function __construct() {
  52. parent::__construct();
  53. $this->mUserFcode = null;
  54. global $config;
  55. $this->mFcodeBannerID = $config['autosend_fcodes']['cart_spid'];
  56. }
  57. public function rate_moneyOp()
  58. {
  59. if($_SESSION['is_login'] == 1)
  60. {
  61. $pred = new predeposit_helper($_SESSION['member_id']);
  62. $bonus_rate = $pred->bonus_rate();
  63. if($bonus_rate != null)
  64. {
  65. $rates = $bonus_rate->format();
  66. $rates_money = [];
  67. foreach ($rates as $rate => $money) {
  68. $item['rate'] = $rate;
  69. $item['total'] = $money;
  70. $rates_money[] = $item;
  71. }
  72. } else {
  73. $rates_money = null;
  74. }
  75. if(empty($rates_money)) {
  76. $result['bonus_rate'] = null;
  77. } else {
  78. $result['bonus_rate'] = $rates_money;
  79. }
  80. return self::outsuccess($result);
  81. }
  82. else {
  83. return self::outsuccess(null);
  84. }
  85. }
  86. public function listOp()
  87. {
  88. $model_cart = Model('cart');
  89. $minest_cartid = intval($_GET['minest_cartid']);
  90. if($minest_cartid < 0) $minest_cartid = 0;
  91. $save_type = $this->save_type();
  92. if($_SESSION['is_login'] == 1)
  93. {
  94. $page_size = $this->page_size();
  95. if($minest_cartid > 0) {
  96. $condition = array('buyer_id'=>$_SESSION['member_id'],'cart_id' => array('lt',$minest_cartid));
  97. $left = $model_cart->getCartListCount($condition);
  98. $has_more = $left > $page_size;
  99. $total = $model_cart->getCartListCount(array('buyer_id'=>$_SESSION['member_id']));
  100. $pages = $this->pages($total);
  101. } else {
  102. $condition = array('buyer_id'=>$_SESSION['member_id']);
  103. $total = $model_cart->getCartListCount(array('buyer_id'=>$_SESSION['member_id']));
  104. $pages = $this->pages($total);
  105. $has_more = $total > $page_size;
  106. }
  107. $cart_list = $model_cart->listCart($save_type,$condition,$page_size);
  108. }
  109. else
  110. {
  111. $cart_list = $model_cart->listCart($save_type);
  112. $total = count($cart_list);
  113. $has_more = false;
  114. $pages = 1;
  115. }
  116. $goods_ids = array();
  117. $cart_infos = array();
  118. foreach ($cart_list as $item) {
  119. $cart_item['cart_id'] = intval($item['cart_id']);
  120. $cart_item['goods_id'] = intval($item['goods_id']);
  121. $cart_item['bl_id'] = intval($item['bl_id']);
  122. $cart_item['goods_num'] = intval($item['goods_num']);
  123. $goods_ids[] = intval($item['goods_id']);
  124. $cart_infos[] = $cart_item;
  125. }
  126. $helper = new goods_helper(false);
  127. $summaries = $helper->cart_summary($goods_ids,$related_goods);
  128. $summary_list = $summaries['summary'];
  129. if(!empty($related_goods)) {
  130. $related_summary = $helper->cart_summary($related_goods,$x);
  131. $summary_list = array_merge($summary_list,$related_summary['summary']);
  132. }
  133. //有可能购物车中的商品被删除....
  134. $avables_goods = [];
  135. foreach ($summary_list as $summay) {
  136. $avables_goods[] = $summay['goods_id'];
  137. }
  138. $err_goods = algorithm::not_in($goods_ids,$avables_goods);
  139. $cart_infos = $this->remove_err($cart_infos,$err_goods);
  140. if($minest_cartid == 0) {
  141. $ret['free_info'] = $this->full_send();
  142. }
  143. $ret['cart_count'] = $total;
  144. $ret['cart_list'] = $cart_infos;
  145. $ret['summary'] = $summary_list;
  146. $ret['groupbuy'] = $summaries['groupbuy'];
  147. $ret['limitime'] = $summaries['limitime'];
  148. $ret['bundling'] = $summaries['bundling'];
  149. $ret['mobile_page'] = array('hasmore' => $has_more,'page_total' => $pages);
  150. return self::outsuccess($ret);
  151. }
  152. public function exgoodsOp()
  153. {
  154. $mod_fcode = Model('goods_fcode');
  155. $mobile = session_helper::cur_mobile();
  156. if(empty($mobile))
  157. {
  158. return self::outsuccess(array('special_list' => null,
  159. 'fcodes' => null,
  160. 'summary' => null,
  161. 'groupbuy' => null,
  162. 'limitime' => null,
  163. 'bundling' => null,
  164. 'mobile_page' => mobile_page(0)));
  165. }
  166. $items = $mod_fcode->getFcodeList(array('mobile' => session_helper::cur_mobile(),
  167. 'usable_time' => array('gt',time()),
  168. 'fc_state' => 0),
  169. '*','fc_state asc,fc_id asc',$this->page_size());
  170. $page_count = $mod_fcode->gettotalpage();
  171. if($this->page_no() == 1)
  172. {
  173. if(isset($_SESSION['fcodes'])) {
  174. unset($_SESSION['fcodes']);
  175. }
  176. }
  177. $fcodes = [];
  178. $gids = [];
  179. foreach ($items as $item) {
  180. $fcoder = new fcode\mfcode($item);
  181. $fcode = $fcoder->format();
  182. $gids[] = intval($fcode['goods_id']);
  183. $fcodes[] = $fcode;
  184. }
  185. if(empty($fcodes))
  186. {
  187. return self::outsuccess(array('special_list' => null,
  188. 'fcodes' => null,
  189. 'summary' => null,
  190. 'groupbuy' => null,
  191. 'limitime' => null,
  192. 'bundling' => null,
  193. 'mobile_page' => mobile_page($page_count)));
  194. }
  195. else
  196. {
  197. if($this->page_no() == 1 && $this->mFcodeBannerID > 0)
  198. {
  199. $blocks = special_manager::instance()->special($this->mFcodeBannerID,$unused_gids);
  200. $items = $this->format($fcodes);
  201. $blocks = array_merge($blocks,$items);
  202. }
  203. else {
  204. $blocks = $this->format($fcodes);
  205. }
  206. $helper = new goods_helper(false);
  207. $ret = $helper->cart_summary($gids,$related_goods);
  208. return self::outsuccess(array('special_list' => $blocks,
  209. 'fcodes' => $fcodes,
  210. 'summary' => $ret['summary'],
  211. 'groupbuy' => $ret['groupbuy'],
  212. 'limitime' => $ret['limitime'],
  213. 'bundling' => $ret['bundling'],
  214. 'mobile_page' => mobile_page($page_count)));
  215. }
  216. }
  217. private function format($fcodes)
  218. {
  219. $blocks = [];
  220. if(!empty($fcodes)) {
  221. $blocks[] = special_formater::def_divider();
  222. }
  223. foreach ($fcodes as $fcode)
  224. {
  225. $block = [];
  226. $block['item_title'] = '';
  227. $block['item_type'] = 'home1';
  228. $block['scale'] = 3.224299;
  229. $item['image'] = '';
  230. $item['show_type'] = "fcode";
  231. $item['show_data'] = strval($fcode['fcode_id']);
  232. $item['type'] = "goods";
  233. $item['data'] = strval($fcode['goods_id']);;
  234. $item['title'] = '';
  235. $block['items'][] = $item;
  236. $blocks[] = $block;
  237. $blocks[] = special_formater::def_divider();
  238. }
  239. return $blocks;
  240. }
  241. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  242. private function remove_err($cart_infos,$err_goods)
  243. {
  244. if(empty($err_goods)) return $cart_infos;
  245. $result = [];
  246. foreach ($cart_infos as $cart)
  247. {
  248. if($cart['bl_id'] > 0) {
  249. $result[] = $cart;
  250. }
  251. else
  252. {
  253. if(algorithm::binary_search($err_goods,$cart['goods_id']) == false) {
  254. $result[] = $cart;
  255. }
  256. else
  257. {
  258. $cart_id = intval($cart['cart_id']);
  259. if($cart_id <= 0) continue;
  260. $model_cart = Model('cart');
  261. $model_cart->where(['cart_id' => $cart_id])->delete();
  262. }
  263. }
  264. }
  265. return $result;
  266. }
  267. private function full_send()
  268. {
  269. $result = [];
  270. $rules = activity_helper::fullsent_rules();
  271. foreach ($rules as $rule) {
  272. $item['title'] = '内买优惠';
  273. $item['value'] = $rule;
  274. $result[] = $item;
  275. }
  276. $free_ship = activity_helper::free_ship();
  277. if($free_ship != false) {
  278. $item['title'] = '全场包邮';
  279. $item['value'] = $free_ship;
  280. $result[] = $item;
  281. }
  282. $item['title'] = '红包抵扣';
  283. $item['value'] = "请参考红包抵扣规则,不与其它活动共享,不含运费";
  284. $result[] = $item;
  285. return $result;
  286. }
  287. public function addexOp()
  288. {
  289. $ret = $this->do_add($err,$ext_info);
  290. if($ret === false) {
  291. $msg = isset($err['msg']) ? $err['msg'] : '';
  292. return self::outerr($err['code'],$msg);
  293. }
  294. else
  295. {
  296. $bl_id = intval($ext_info['bl_id']);
  297. $goods_id = intval($ext_info['goods_id']);
  298. $cart_id = intval($ext_info['cart_id']);
  299. $model_cart = Model('cart');
  300. $save_type = $this->save_type();
  301. $cart_num = $model_cart->getCartNum($save_type,array('buyer_id'=>$_SESSION['member_id']));
  302. $goods_num = $model_cart->getCartItemNum($save_type,$cart_id);
  303. $item = new cart_item($cart_id,$bl_id,$goods_id,$goods_num);
  304. $result['cart_count'] = $cart_num;
  305. $result['cart_list'][] = $item->format();
  306. $gids = $item->goods_ids();
  307. if(empty($gids)) {
  308. $result['summary'] = array();
  309. $result['groupbuy'] = array();
  310. $result['limitime'] = array();
  311. $result['bundling'] = array();
  312. }
  313. else
  314. {
  315. $helper = new goods_helper(false);
  316. $summaries = $helper->cart_summary($gids,$related_goods);
  317. $summary_list = $summaries['summary'];
  318. if(!empty($related_goods)) {
  319. $related_summary = $helper->cart_summary($related_goods,$x);
  320. $summary_list = array_merge($summary_list,$related_summary['summary']);
  321. }
  322. $result['summary'] = $summary_list;
  323. $result['groupbuy'] = $summaries['groupbuy'];
  324. $result['limitime'] = $summaries['limitime'];
  325. $result['bundling'] = $summaries['bundling'];
  326. }
  327. return self::outsuccess($result);
  328. }
  329. }
  330. public function cart_listOp()
  331. {
  332. if($_SESSION['is_login'] != 1) {
  333. return self::outerr(errcode::ErrUnLogin);
  334. }
  335. $page = trim($_GET['page']);
  336. $curpage = trim($_GET['curpage']);
  337. if (!isset($_GET['page'])) {
  338. $page = "100";
  339. $curpage = "1";
  340. $this->page_size = 100;
  341. }
  342. $this->initpage($page, $curpage);
  343. $model_cart = Model('cart');
  344. $model_goods = Model('goods');
  345. $condition = array('buyer_id' => $_SESSION['member_id']);
  346. $cart_list = $model_cart->getCartList($condition, $this->page_size);
  347. $page_count = $model_cart->gettotalpage();
  348. $model_cart->cls();
  349. foreach ($cart_list as $key => $value) {
  350. $goods_id = $value['goods_id'];
  351. $goods_promotion = $model_goods->getGoodsInfoAndPromotionById($goods_id);
  352. $goods_storage = $model_goods->getGoodsStorageById($goods_id);
  353. $promotion_type = '';
  354. $promotion_price = '0.00';
  355. if (!empty($goods_promotion['groupbuy_info'])) {
  356. $promotion_type = '抢购';
  357. $promotion_price = $goods_promotion['groupbuy_info']['groupbuy_price'];
  358. }
  359. if (!empty($goods_promotion['xianshi_info'])) {
  360. $promotion_type = '限时折扣';
  361. $promotion_price = $goods_promotion['xianshi_info']['xianshi_price'];
  362. }
  363. $goods_spec = unserialize($goods_promotion['goods_spec']);
  364. $goods_spec_array = array();
  365. if(!empty($goods_spec))
  366. {
  367. foreach ($goods_spec as $val) {
  368. array_push($goods_spec_array, $val);
  369. }
  370. }
  371. $cart_list[$key]['goods_storage'] = $goods_storage;
  372. $cart_list[$key]['goods_spec'] = implode(',', $goods_spec_array);
  373. $cart_list[$key]['promotion_type'] = $promotion_type;
  374. $cart_list[$key]['promotion_price'] = $promotion_price;
  375. $cart_list[$key]['goods_image_url'] = cthumb($value['goods_image'], $value['store_id']);
  376. $cart_list[$key]['goods_sum'] = ncPriceFormat($value['goods_price'] * $value['goods_num']);
  377. }
  378. self::outsuccess(array('cart_list' => $cart_list, 'mobile_page' => mobile_page($page_count)));
  379. }
  380. public function addOp()
  381. {
  382. $ret = $this->do_add($err,$ext_info);
  383. if($ret === false) {
  384. $msg = isset($err['msg']) ? $err['msg'] : '';
  385. return self::outerr($err['code'],$msg);
  386. } else {
  387. return self::outsuccess($ret);
  388. }
  389. }
  390. public function do_add(&$err,&$ext_info)
  391. {
  392. if (is_numeric($_GET['goods_id']) && is_numeric($_POST['quantity']))
  393. {
  394. $goods_id = intval($_POST['goods_id']);
  395. $quantity = intval($_POST['quantity']);
  396. if ($goods_id <= 0 || $quantity <= 0) {
  397. $err = array('code' => errcode::ErrInputParam);
  398. return false;
  399. }
  400. $model_goods = Model('goods');
  401. $logic_buy_1 = Logic('buy_1');
  402. $goods_info = $model_goods->getGoodsOnlineInfoAndPromotionById($goods_id);
  403. $logic_buy_1->getGroupbuyInfo($goods_info);
  404. $logic_buy_1->getXianshiInfo($goods_info, $quantity);
  405. if(array_key_exists('ifgroupbuy',$goods_info) && $goods_info['ifgroupbuy'] == true)
  406. {
  407. if ($_SESSION['is_login'] != 1)
  408. {
  409. $err = array('code' => errcode::ErrAddCart,'msg' => "只能登录后,才能向购物车添加抢购商品.");;
  410. return false;
  411. }
  412. }
  413. if(array_key_exists('ifxianshi',$goods_info) && $goods_info['ifxianshi'] == true)
  414. {
  415. if ($_SESSION['is_login'] != 1)
  416. {
  417. $err = array('code' => errcode::ErrAddCart,'msg' => "只能登录后,才能向购物车添加限时购商品.");;
  418. return false;
  419. }
  420. }
  421. $ret = $this->check_goods($goods_info, $quantity);
  422. if(is_array($ret)) {
  423. $err = $ret;
  424. return false;
  425. }
  426. $bl_id = 0;
  427. }
  428. elseif (is_numeric($_GET['bl_id']))
  429. {
  430. if ($_SESSION['is_login'] != 1) {
  431. $err = array('code' => errcode::ErrUnLogin);
  432. return false;
  433. }
  434. $bl_id = intval($_GET['bl_id']);
  435. if ($bl_id <= 0) {
  436. $err = array('code' => errcode::ErrInputParam);
  437. return false;
  438. }
  439. $model_bl = Model('p_bundling');
  440. $bl_info = $model_bl->getBundlingInfo(array('bl_id'=>$bl_id));
  441. if (empty($bl_info) || $bl_info['bl_state'] == '0') {
  442. $err = array('code' => errcode::ErrBLUnExist);
  443. return false;
  444. }
  445. $bl_goods_list = $model_bl->getBundlingGoodsList(array('bl_id'=>$bl_id));
  446. $goods_id_array = array();
  447. $bl_amount = 0;
  448. foreach ($bl_goods_list as $goods) {
  449. $goods_id_array[] = $goods['goods_id'];
  450. $bl_amount += $goods['bl_goods_price'];
  451. }
  452. $model_goods = Model('goods');
  453. $goods_list = $model_goods->getGoodsOnlineListAndPromotionByIdArray($goods_id_array);
  454. foreach ($goods_list as $goods)
  455. {
  456. $err = $this->check_goods($goods,1);
  457. if($err === true) {
  458. continue;
  459. } else {
  460. return false;
  461. }
  462. }
  463. //优惠套装作为一条记录插入购物车,图片取套装内的第一个商品图
  464. $goods_info = array();
  465. $goods_info['store_id'] = $bl_info['store_id'];
  466. $goods_info['goods_id'] = $goods_list[0]['goods_id'];
  467. $goods_info['goods_name'] = $bl_info['bl_name'];
  468. $goods_info['goods_price'] = $bl_amount;
  469. $goods_info['goods_num'] = 1;
  470. $goods_info['goods_image'] = $goods_list[0]['goods_image'];
  471. $goods_info['store_name'] = $bl_info['store_name'];
  472. $goods_info['bl_id'] = $bl_id;
  473. $quantity = 1;
  474. $goods_id = intval($goods_info['goods_id']);
  475. }
  476. else
  477. {
  478. $err = array('code' => errcode::ErrInputParam);
  479. return false;
  480. }
  481. $save_type = $this->save_type();
  482. if($_SESSION['member_id']) {
  483. $goods_info['buyer_id'] = $_SESSION['member_id'];
  484. }
  485. $model_cart = Model('cart');
  486. $insert = $model_cart->addCart($goods_info, $save_type , $quantity);
  487. if ($insert) {
  488. $data = array('result' => 1, 'num' => $model_cart->cart_goods_num, 'amount' => ncPriceFormat($model_cart->cart_all_price));
  489. $ext_info = array('bl_id' => $bl_id,'goods_id' => $goods_id,'cart_id' => $insert);
  490. return $data;
  491. } else {
  492. $err = array('code' => errcode::ErrAddCart);
  493. return false;
  494. }
  495. }
  496. private function check_goods($goods_info, $quantity)
  497. {
  498. if(empty($quantity)) {
  499. return array('code' => errcode::ErrInputParam, 'msg' => errcode::msg(errcode::ErrInputParam));
  500. }
  501. if(empty($goods_info)) {
  502. return array('code' => errcode::ErrGoodsOff, 'msg'=> '商品已下架或不存在');
  503. }
  504. if ($goods_info['store_id'] == $_SESSION['store_id']) {
  505. return array('code' => errcode::ErrCanNotBuyOwn, 'msg'=> errcode::msg(errcode::ErrCanNotBuyOwn));
  506. }
  507. if(intval($goods_info['goods_storage']) < 1) {
  508. return array('code' => errcode::ErrGoodsOutofStock, 'msg' => errcode::msg(errcode::ErrGoodsOutofStock));
  509. }
  510. if(intval($goods_info['goods_storage']) < $quantity) {
  511. return array('code' => errcode::ErrStorageShort, 'msg' => errcode::msg(errcode::ErrStorageShort));
  512. }
  513. if ($goods_info['is_virtual'] || $goods_info['is_presell']) {
  514. return array('code' => errcode::ErrGoodsSpecial, 'msg' => errcode::msg(errcode::ErrGoodsSpecial));
  515. }
  516. $is_fcode = intval($goods_info['is_fcode']) == 1 ? true : false;
  517. if($is_fcode)
  518. {
  519. if(!session_helper::logined()) {
  520. return array('code' => errcode::ErrLogin, 'msg' => 'F码商品,只有在登录后才能添加到购物车');
  521. }
  522. else
  523. {
  524. if($this->mUserFcode == null) {
  525. $this->mUserFcode = new user_session\fcode();
  526. $this->mUserFcode->onStatus();
  527. }
  528. $goods_id = intval($goods_info['goods_id']);
  529. $num = $this->mUserFcode->goods_has_code($goods_id,$lock_num);
  530. if($num == false)
  531. {
  532. if($lock_num > 0) {
  533. return array('code' => errcode::ErrLogin, 'msg' => '等确认收货后该商品的F码才可以使用.');
  534. } else {
  535. return array('code' => errcode::ErrLogin, 'msg' => '您没有该商品F码,请领取F码后再购买.');
  536. }
  537. }
  538. elseif($num < $quantity) {
  539. return array('code' => errcode::ErrLogin, 'msg' => "该商品F码,只够购买{$num}支.");
  540. }
  541. }
  542. }
  543. return true;
  544. }
  545. public function cart_editOp()
  546. {
  547. if($_SESSION['is_login'] != 1) {
  548. return self::outerr(errcode::ErrUnLogin);
  549. }
  550. $cart_list = explode(',', urldecode($_POST['cart_list']));
  551. $new_cart_list = array();
  552. if (is_array($cart_list))
  553. {
  554. foreach ($cart_list as $value) {
  555. if (preg_match_all('/^(\d{1,10})\|(\d{1,6})$/', $value, $match)) {
  556. if (intval($match[2][0]) > 0) {
  557. $new_cart_list[$match[1][0]] = $match[2][0];
  558. }
  559. }
  560. }
  561. $model_cart = Model('cart');
  562. $condition = array('buyer_id' => $_SESSION['member_id']);
  563. $original_cart_list = $model_cart->listCart(self::db_type, $condition);
  564. $quantity_error = array();
  565. foreach ($original_cart_list as $key => $value)
  566. {
  567. if (array_key_exists($value['cart_id'], $new_cart_list))
  568. {
  569. $quantity = intval($new_cart_list[$value['cart_id']]);
  570. if (intval($value['goods_num']) !== $quantity)
  571. {
  572. if (!$this->check_goods_storage($value, $quantity)) {
  573. array_push($quantity_error, array('cart_id' => $value['cart_id'], 'quantity' => $quantity, 'err_info' => '库存不足'));
  574. } else {
  575. $data = array();
  576. $data['goods_num'] = $quantity;
  577. $update = $model_cart->editCart($data, array('cart_id' => $value['cart_id']));
  578. if (!$update) {
  579. return self::outerr(errcode::ErrCart, '购物车修改失败');
  580. }
  581. }
  582. }
  583. }
  584. else
  585. {
  586. $delete = $model_cart->delCart(self::db_type, array('cart_id' => $value['cart_id']));
  587. if (!$delete) {
  588. return self::outerr(errcode::ErrCart, '购物车修改失败');
  589. }
  590. }
  591. }
  592. if (count($quantity_error) > 0) {
  593. self::outsuccess(array('result' => '0', 'quantity_error' => $quantity_error));
  594. } else {
  595. self::outsuccess(array('result' => '1','quantity_error' => NULL));
  596. }
  597. }
  598. else {
  599. return self::outerr(errcode::ErrCart, '购物车列表格式错误');
  600. }
  601. }
  602. /**
  603. * 购物车更新商品数量
  604. */
  605. public function editOp()
  606. {
  607. $cart_id = intval($_POST['cart_id']);
  608. $quantity = intval($_POST['quantity']);
  609. if ($cart_id <= 0 || $quantity < 0) {
  610. return self::outerr(errcode::ErrInputParam);
  611. }
  612. if($quantity > 0) {
  613. $ret = $this->do_edit(intval(abs($cart_id)),intval($quantity));
  614. }
  615. else {
  616. $ret = $this->do_del($cart_id);
  617. }
  618. if ($ret === true) {
  619. $save_type = $this->save_type();
  620. $mod_cart = Model('cart');
  621. $cart_num = $mod_cart->getCartNum($save_type,array('buyer_id'=>$_SESSION['member_id']));
  622. $goods_num = $mod_cart->getCartItemNum($save_type,$cart_id);
  623. $result['cart_count'] = $cart_num;
  624. $result['cart_id'] = $cart_id;
  625. $result['goods_num'] = $goods_num;
  626. self::outsuccess($result);
  627. } else {
  628. self::outerr(errcode::ErrAddCart,$ret['err_info']);
  629. }
  630. }
  631. public function do_edit($cart_id,$quantity_in)
  632. {
  633. $model_cart = Model('cart');
  634. $model_goods= Model('goods');
  635. $logic_buy_1 = logic('buy_1');
  636. $quantity = $quantity_in;
  637. //存放返回信息
  638. $cart_info = $model_cart->getCartInfo(array('cart_id'=>$cart_id,'buyer_id'=>$_SESSION['member_id']));
  639. if ($cart_info['bl_id'] == '0')
  640. {
  641. //普通商品
  642. $goods_id = intval($cart_info['goods_id']);
  643. $goods_info = $logic_buy_1->getGoodsOnlineInfo($goods_id,$quantity);
  644. if(empty($goods_info))
  645. {
  646. if($_SESSION['is_login'] == 1) {
  647. QueueClient::push('delCart', array('buyer_id'=>$_SESSION['member_id'],'cart_ids'=>array($cart_id)));
  648. }
  649. return array('cart_id' => $cart_id, 'quantity' => $quantity, 'err_info' => '商品已被下架');
  650. }
  651. $logic_buy_1->getGroupbuyInfo($goods_info);
  652. $logic_buy_1->getXianshiInfo($goods_info,$quantity);
  653. $quantity = $goods_info['goods_num'];
  654. if($quantity == $cart_info['goods_num']) {
  655. return array('cart_id' => $cart_id, 'quantity' => $quantity, 'err_info' => "该商品只允许抢购{$quantity}件~");
  656. }
  657. if(intval($goods_info['goods_storage']) < $quantity) {
  658. $model_cart->editCart(array('goods_num'=>$goods_info['goods_storage']),array('cart_id'=>$cart_id,'buyer_id'=>$_SESSION['member_id']));
  659. return array('cart_id' => $cart_id, 'quantity' => $goods_info['goods_storage'], 'err_info' => '库存不足,已将您购物车更新为库存数量.');
  660. }
  661. }
  662. else
  663. {
  664. //优惠套装商品
  665. $model_bl = Model('p_bundling');
  666. $bl_goods_list = $model_bl->getBundlingGoodsList(array('bl_id'=>$cart_info['bl_id']));
  667. $goods_id_array = array();
  668. foreach ($bl_goods_list as $goods) {
  669. $goods_id_array[] = $goods['goods_id'];
  670. }
  671. $goods_list = $model_goods->getGoodsOnlineListAndPromotionByIdArray($goods_id_array);
  672. //如果其中有商品下架,删除
  673. if (count($goods_list) != count($goods_id_array)) {
  674. QueueClient::push('delCart', array('buyer_id'=>$_SESSION['member_id'],'cart_ids'=>array($cart_id)));
  675. return array('cart_id' => $cart_id, 'quantity' => 0, 'err_info' => '该优惠套装已经无效,建议您购买单个商品.');
  676. }
  677. //如果有商品库存不足,更新购买数量到目前最大库存
  678. foreach ($goods_list as $goods_info)
  679. {
  680. if ($quantity > $goods_info['goods_storage']) {
  681. $model_cart->editCart(array('goods_num'=>$goods_info['goods_storage']),array('cart_id'=>$cart_id,'buyer_id'=>$_SESSION['member_id']));
  682. return array('cart_id' => $cart_id, 'quantity' => $goods_info['goods_storage'], 'err_info' => '该优惠套装部分商品库存不足,建议您降低购买数量或购买库存足够的单个商品.');
  683. }
  684. }
  685. $goods_info['goods_price'] = $cart_info['goods_price'];
  686. }
  687. $data = array();
  688. $data['goods_num'] = $quantity;
  689. $data['goods_price'] = $goods_info['goods_price'];
  690. $update = $model_cart->editCart($data,array('cart_id'=>$cart_id,'buyer_id'=>$_SESSION['member_id']));
  691. if ($update) {
  692. return true;
  693. } else {
  694. return array('cart_id' => $cart_id, 'quantity' => 0, 'err_info' => '更新购物车失败.');
  695. }
  696. }
  697. private function do_del($cart_id)
  698. {
  699. $save_type = $this->save_type();
  700. $model_cart = Model('cart');
  701. if ($_SESSION['member_id']) {
  702. $delete = $model_cart->delCart($save_type,array('cart_id'=>$cart_id,'buyer_id'=>$_SESSION['member_id']));
  703. return $delete;
  704. } else {
  705. $delete = $model_cart->delCart($save_type,array('cart_id'=>$cart_id));
  706. return $delete;
  707. }
  708. }
  709. public function delOp()
  710. {
  711. $cart_id = intval($_POST['cart_id']);
  712. if($cart_id <=0 ) {
  713. return self::outerr(errcode::ErrInputParam);
  714. }
  715. $ret = $this->do_del($cart_id);
  716. if($ret) {
  717. return self::outsuccess(array('result' => '1'));
  718. } else {
  719. return self::outerr(errcode::ErrCartDelError);
  720. }
  721. }
  722. public function cart_delOp()
  723. {
  724. if($_SESSION['is_login'] != 1) {
  725. return self::outerr(errcode::ErrUnLogin);
  726. }
  727. $cart_id = intval($_POST['cart_id']);
  728. $model_cart = Model('cart');
  729. if ($cart_id > 0) {
  730. $condition = array();
  731. $condition['buyer_id'] = $_SESSION['member_id'];
  732. $condition['cart_id'] = $cart_id;
  733. $model_cart->delCart(self::db_type, $condition);
  734. }
  735. self::outsuccess(array('result' => '1'));
  736. }
  737. private function check_goods_storage($cart_info, $quantity)
  738. {
  739. $model_goods = Model('goods');
  740. $model_bl = Model('p_bundling');
  741. $logic_buy_1 = Logic('buy_1');
  742. if ($cart_info['bl_id'] == '0') {
  743. //普通商品
  744. $goods_info = $model_goods->getGoodsOnlineInfoAndPromotionById($cart_info['goods_id']);
  745. $logic_buy_1->getGroupbuyInfo($goods_info);
  746. $logic_buy_1->getXianshiInfo($goods_info, $quantity);
  747. if (intval($goods_info['goods_storage']) < $quantity) {
  748. return false;
  749. }
  750. }
  751. else
  752. {
  753. //优惠套装商品
  754. $bl_goods_list = $model_bl->getBundlingGoodsList(array('bl_id' => $cart_info['bl_id']));
  755. $goods_id_array = array();
  756. foreach ($bl_goods_list as $goods) {
  757. $goods_id_array[] = $goods['goods_id'];
  758. }
  759. $bl_goods_list = $model_goods->getGoodsOnlineListAndPromotionByIdArray($goods_id_array);
  760. //如果有商品库存不足,更新购买数量到目前最大库存
  761. foreach ($bl_goods_list as $goods_info) {
  762. if (intval($goods_info['goods_storage']) < $quantity) {
  763. return false;
  764. }
  765. }
  766. }
  767. return true;
  768. }
  769. private function save_type()
  770. {
  771. if ($_SESSION['is_login'] == 1) {
  772. $save_type = self::db_type;
  773. } else {
  774. $save_type = self::session_type;
  775. }
  776. return $save_type;
  777. }
  778. }