pointcart.model.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. <?php
  2. /**
  3. * 积分礼品购物车
  4. *
  5. */
  6. defined('InShopNC') or exit('Access Invalid!');
  7. class pointcartModel extends Model {
  8. /**
  9. * 礼品购物车保存
  10. *
  11. * @param array $param 资料
  12. */
  13. public function addPointCart($param) {
  14. if(empty($param)) {
  15. return false;
  16. }
  17. $result = $this->table('points_cart')->insert($param);
  18. if($result) {
  19. //清除相关缓存
  20. wcache($param['pmember_id'], array('pointcart_count' => null), 'm_pointcart');
  21. return $result;
  22. } else {
  23. return false;
  24. }
  25. }
  26. /**
  27. * 兑换礼品购物车列表
  28. */
  29. public function getPointCartList($where, $field = '*', $page = 0, $limit = 0, $order = '', $group = ''){
  30. if (is_array($page)){
  31. if ($page[1] > 0){
  32. $cartgoods_list = $this->table('points_cart')->field($field)->where($where)->page($page[0],$page[1])->limit($limit)->group($group)->order($order)->select();
  33. } else {
  34. $cartgoods_list = $this->table('points_cart')->field($field)->where($where)->page($page[0])->limit($limit)->group($group)->order($order)->select();
  35. }
  36. } else {
  37. $cartgoods_list = $this->table('points_cart')->field($field)->where($where)->page($page)->limit($limit)->group($group)->order($order)->select();
  38. }
  39. if ($cartgoods_list){
  40. foreach ($cartgoods_list as $k=>$v){
  41. $v['pgoods_image_old'] = $v['pgoods_image'];
  42. $v['pgoods_image_max'] = pointprodThumb($v['pgoods_image']);
  43. $v['pgoods_image_small'] = pointprodThumb($v['pgoods_image'], 'small');
  44. $v['pgoods_image'] = pointprodThumb($v['pgoods_image'], 'mid');
  45. $cartgoods_list[$k] = $v;
  46. }
  47. }
  48. return $cartgoods_list;
  49. }
  50. /**
  51. * 查询兑换礼品购物车列表并计算总积分
  52. */
  53. public function getPCartListAndAmount($where, $field = '*', $page = 0, $limit = 0, $order = '', $group = ''){
  54. $cartgoods_list = $this->getPointCartList($where);
  55. //兑换礼品总积分
  56. $cartgoods_pointall = 0;
  57. if(!empty($cartgoods_list) && is_array($cartgoods_list)) {
  58. foreach ($cartgoods_list as $k=>$v) {
  59. $v['pgoods_pointone'] = intval($v['pgoods_points']) * intval($v['pgoods_choosenum']);
  60. $cartgoods_list[$k] = $v;
  61. $cartgoods_pointall = $cartgoods_pointall + $v['pgoods_pointone'];
  62. }
  63. }
  64. return array('state'=>true,'data'=>array('cartgoods_list'=>$cartgoods_list,'cartgoods_pointall'=>$cartgoods_pointall));
  65. }
  66. /**
  67. * 礼品购物车信息单条
  68. *
  69. * @param array $condition 条件数组
  70. * @param array $field 查询字段
  71. */
  72. public function getPointCartInfo($where, $field = '*', $order = '', $group = ''){
  73. return $this->table('points_cart')->field($field)->where($where)->group($group)->order($order)->find();
  74. }
  75. /**
  76. * 礼品购物车礼品数量
  77. *
  78. * @param array $member_id 会员ID
  79. */
  80. public function countPointCart($member_id) {
  81. $info = rcache($member_id, 'm_pointcart', 'pointcart_count');
  82. if (empty($info['pointcart_count']) && $info['pointcart_count'] !== 0) {
  83. $pointcart_count = $this->table('points_cart')->where(array('pmember_id'=>$member_id))->count();
  84. $pointcart_count = intval($pointcart_count);
  85. wcache($member_id, array('pointcart_count' => $pointcart_count), 'm_pointcart');
  86. } else {
  87. $pointcart_count = intval($info['pointcart_count']);
  88. }
  89. return $pointcart_count;
  90. }
  91. /**
  92. * 删除礼品购物车信息按照购物车编号
  93. * @param mixed $pc_id 删除记录编号
  94. */
  95. public function delPointCartById($pc_id,$member_id = 0){
  96. if(empty($pc_id)) {
  97. return false;
  98. }
  99. $where = array();
  100. if (is_array($pc_id)){
  101. $where['pcart_id'] = array('in',$pc_id);
  102. }else {
  103. $where['pcart_id'] = $pc_id;
  104. }
  105. $result = $this->table('points_cart')->where($where)->delete();
  106. //清除相关缓存
  107. if ($result && $member_id > 0){
  108. wcache($member_id, array('pointcart_count' => null), 'm_pointcart');
  109. }
  110. return $result;
  111. }
  112. /**
  113. * 删除特定条件礼品购物车信息
  114. * @param mixed $pc_id 删除记录编号
  115. */
  116. public function delPointCart($where, $member_id = 0){
  117. $result = $this->table('points_cart')->where($where)->delete();
  118. //清除相关缓存
  119. if ($result && $member_id > 0){
  120. wcache($member_id, array('pointcart_count' => null), 'm_pointcart');
  121. }
  122. return $result;
  123. }
  124. /**
  125. * 积分礼品购物车信息修改
  126. *
  127. * @param array $param 修改信息数组
  128. * @param array $where 条件数组
  129. */
  130. public function editPointCart($where, $param) {
  131. if(empty($param)) {
  132. return false;
  133. }
  134. $result = $this->table('points_cart')->where($where)->update($param);
  135. return $result;
  136. }
  137. /**
  138. * 验证是否能兑换
  139. */
  140. public function checkExchange($pgoods_id, $quantity, $member_id){
  141. $pgoods_id = intval($pgoods_id);
  142. $quantity = intval($quantity);
  143. if($pgoods_id <= 0 || $quantity <= 0) {
  144. return array('state'=>false, 'error'=>'ParameterError', 'msg'=>'参数错误');
  145. }
  146. $model_pointprod = Model('pointprod');
  147. //获取兑换商品的展示状态
  148. $pgoodsshowstate_arr = $model_pointprod->getPgoodsShowState();
  149. //获取兑换商品的开启状态
  150. $pgoodsopenstate_arr = $model_pointprod->getPgoodsOpenState();
  151. //验证积分礼品是否存在
  152. $prod_info = $model_pointprod->getPointProdInfo(array('pgoods_id'=>$pgoods_id,'pgoods_show'=>$pgoodsshowstate_arr['show'][0],'pgoods_state'=>$pgoodsopenstate_arr['open'][0]));
  153. if (!$prod_info){
  154. return array('state'=>false, 'error'=>'ParameterError', 'msg'=>'兑换礼品信息不存在');
  155. }
  156. //验证积分礼品兑换状态
  157. $ex_state = $model_pointprod->getPointProdExstate($prod_info);
  158. switch ($ex_state){
  159. case 'willbe':
  160. return array('state'=>false, 'error'=>'StateError', 'msg'=>'该兑换礼品的兑换活动即将开始');
  161. break;
  162. case 'end':
  163. return array('state'=>false, 'error'=>'StateError', 'msg'=>'该兑换礼品的兑换活动已经结束');
  164. break;
  165. }
  166. //查询会员信息
  167. $model_member = Model('member');
  168. $member_info = $model_member->getMemberInfoByID($member_id,'member_points,member_exppoints');
  169. //验证是否满足会员级别
  170. $member_info['member_grade'] = $model_member->getOneMemberGrade($member_info['member_exppoints']);
  171. if ($prod_info['pgoods_limitmgrade'] > 0 && $member_info['member_grade']['level'] < $prod_info['pgoods_limitmgrade']){
  172. return array('state'=>false, 'error'=>'MemberGradeError', 'msg'=>'您还未达到兑换所需的会员级别,不能进行兑换');
  173. }
  174. //验证兑换数量是否合法
  175. $data = $this->checkPointProdExnum($prod_info,$quantity,$member_id);
  176. if (!$data['state']){
  177. return array('state'=>false, 'error'=>'StateError', 'msg'=>$data['msg']);
  178. }
  179. $prod_info['quantity'] = $quantity;
  180. //计算消耗积分总数
  181. $prod_info['pointsamount'] = intval($prod_info['pgoods_points'])*intval($quantity);
  182. //验证积分数是否足够
  183. $data = $this->checkPointEnough($prod_info['pointsamount'], $member_id, $member_info);
  184. if (!$data['state']){
  185. return array('state'=>false, 'error'=>'PointsShortof', 'msg'=>$data['msg']);
  186. }
  187. return array('state'=>true, 'data'=>array('prod_info'=>$prod_info));
  188. }
  189. /**
  190. * 验证礼品兑换数量是否合法
  191. * @param array $prodinfo 礼品数组
  192. * @param array $quantity 兑换数量
  193. * @param array $member_id 会员编号
  194. * return array 兑换数量是否合法及其错误数组
  195. */
  196. public function checkPointProdExnum($prodinfo,$quantity,$member_id){
  197. $data = $this->getPointProdExnum($prodinfo, $quantity, $member_id);
  198. if (!$data['state']){
  199. return array('state'=>false,'msg'=>$data['msg']);
  200. }
  201. //如果兑换数量大于可兑换数量则提示错误
  202. if ($data['data']['quantity'] < $quantity){
  203. return array('state'=>false,'msg'=>"兑换礼品数量不能大于{$data['data']['quantity']}");
  204. }
  205. return array('state'=>true);
  206. }
  207. /**
  208. * 获得礼品可兑换数量
  209. * @param array $prodinfo 礼品数组
  210. * @param array $quantity 兑换数量
  211. * @param array $member_id 会员编号
  212. * return array 兑换数量及其错误数组
  213. */
  214. public function getPointProdExnum($prodinfo,$quantity,$member_id){
  215. if ($quantity <= 0){
  216. return array('state'=>false,'msg'=>'兑换数量错误');
  217. }
  218. if ($prodinfo['pgoods_storage'] <= 0){
  219. return array('state'=>false,'msg'=>'该礼品已兑换完');
  220. }
  221. if ($prodinfo['pgoods_storage'] < $quantity){
  222. //如果兑换数量大于库存,则兑换数量为库存数量
  223. $quantity = $prodinfo['pgoods_storage'];
  224. }
  225. if ($prodinfo['pgoods_islimit'] == 1 && $prodinfo['pgoods_limitnum'] < $quantity ){
  226. //如果兑换数量大于限兑数量,则兑换数量为限兑数量
  227. $quantity = $prodinfo['pgoods_limitnum'];
  228. }
  229. //查询已兑换数量,并获得剩余可兑换数量
  230. if ($prodinfo['pgoods_islimit'] == 1){
  231. $model_pointorder = Model('pointorder');
  232. //获取兑换订单状态
  233. $pointorderstate_arr = $model_pointorder->getPointOrderStateBySign();
  234. $where = array();
  235. $where['point_goodsid'] = $prodinfo['pgoods_id'];
  236. $where['point_buyerid'] = $member_id;
  237. $where['point_orderstate'] = array('neq',$pointorderstate_arr['canceled'][0]);//未取消
  238. $pordergoodsinfo = $model_pointorder->getPointOrderAndGoodsInfo($where, "SUM(point_goodsnum) as exnum", '', 'point_goodsid');
  239. if ($pordergoodsinfo){
  240. $ablenum = $prodinfo['pgoods_limitnum'] - intval($pordergoodsinfo['exnum']);
  241. if ($ablenum <= 0){
  242. return array('state'=>false,'msg'=>'您已达到该礼品的最大兑换数,不能再兑换,请兑换其他礼品');
  243. }
  244. if ($ablenum < $quantity){
  245. $quantity = $ablenum;
  246. }
  247. }
  248. }
  249. return array('state'=>true,'data'=>array('quantity'=>$quantity));
  250. }
  251. /**
  252. * 获得某会员购物车礼品总积分
  253. */
  254. public function getPointCartAmount($member_id){
  255. if ($member_id <= 0){
  256. return array('state'=>false,'msg'=>'参数错误');
  257. }
  258. $info = $this->getPointCartInfo(array('pmember_id'=>$member_id),'SUM(pgoods_points*pgoods_choosenum) as amount','','pmember_id');
  259. $amount = intval($info['amount']);
  260. return $amount;
  261. }
  262. /**
  263. * 获得符合条件的购物车商品列表同时计算运费、总积分数等信息,用于下单过程
  264. */
  265. public function getCartGoodsList($member_id){
  266. $return_array = array();
  267. //获取礼品购物车内信息
  268. $cartgoodslist_tmp = $this->getPointCartList(array('pmember_id'=>$member_id));
  269. if(!$cartgoodslist_tmp) {
  270. return array('state'=>false,'msg'=>'购物车信息错误');
  271. }
  272. $cartgoodslist = array();
  273. foreach ($cartgoodslist_tmp as $v) {
  274. $cartgoodslist[$v['pgoods_id']] = $v;
  275. }
  276. //购物车礼品ID数组
  277. $cartgoodsid_arr = array_keys($cartgoodslist);
  278. //查询积分礼品信息
  279. $model_pointprod = Model('pointprod');
  280. $pointprod_list = $model_pointprod->getOnlinePointProdList(array('pgoods_id'=>array('in',$cartgoodsid_arr)));
  281. if (!$pointprod_list){
  282. return array('state'=>false,'msg'=>'购物车信息错误');
  283. }
  284. unset($cartgoodsid_arr);
  285. unset($cartgoodslist_tmp);
  286. $cart_delid_arr = array();//应删除的购物车信息
  287. $pgoods_pointall = 0;//积分总数
  288. //查询会员信息
  289. $model_member = Model('member');
  290. $member_info = $model_member->getMemberInfoByID($_SESSION['member_id']);
  291. $member_info['member_grade'] = $model_member->getOneMemberGrade($member_info['member_exppoints']);
  292. //处理购物车礼品信息
  293. foreach ($pointprod_list as $k=>$v){
  294. //验证是否满足会员级别
  295. if ($v['pgoods_limitmgrade'] > 0 && $member_info['member_grade']['level'] < $v['pgoods_limitmgrade']){
  296. $cart_delid_arr[] = $cartgoodslist[$v['pgoods_id']]['pcart_id'];
  297. unset($pointprod_list[$k]);
  298. break;
  299. }
  300. //验证积分礼品兑换状态
  301. $ex_state = $model_pointprod->getPointProdExstate($v);
  302. switch ($ex_state){
  303. case 'going':
  304. //验证兑换数量是否合法
  305. $data = $this->getPointProdExnum($v, $cartgoodslist[$v['pgoods_id']]['pgoods_choosenum'], $member_id);
  306. if (!$data['state']){
  307. //删除积分礼品兑换信息
  308. $cart_delid_arr[] = $cartgoodslist[$v['pgoods_id']]['pcart_id'];
  309. unset($pointprod_list[$k]);
  310. } else {
  311. $quantity = $data['data']['quantity'];
  312. $pointprod_list[$k]['quantity'] = $quantity;
  313. //计算单件礼品积分数
  314. $pointprod_list[$k]['onepoints'] = $quantity*intval($v['pgoods_points']);
  315. //计算所有礼品积分数
  316. $pgoods_pointall = $pgoods_pointall + $pointprod_list[$k]['onepoints'];
  317. }
  318. break;
  319. default:
  320. //删除积分礼品兑换信息
  321. $cart_delid_arr[] = $cartgoodslist[$v['pgoods_id']]['pcart_id'];
  322. unset($pointprod_list[$k]);
  323. break;
  324. }
  325. }
  326. //删除不符合条件的礼品购物车信息
  327. if (is_array($cart_delid_arr) && count($cart_delid_arr)>0){
  328. $this->delPointCartById($cart_delid_arr, $member_id);
  329. }
  330. if (!$pointprod_list) {
  331. return array('state'=>false,'msg'=>'购物车信息错误');
  332. }
  333. return array('state'=>true,'data'=>array('pointprod_list'=>$pointprod_list,'pgoods_pointall'=>$pgoods_pointall));
  334. }
  335. /**
  336. * 验证积分是否足够
  337. * @param $points int 所需积分
  338. * @param $member_id int 会员ID
  339. * @param $member_info array 会员详细信息,不必须
  340. * @return 积分是否足够
  341. */
  342. public function checkPointEnough($points, $member_id, $member_info = array()){
  343. $points = intval($points);
  344. if ($member_id <= 0){
  345. return array('state'=>false,'msg'=>'会员信息错误');
  346. }
  347. if (!$member_info){
  348. $member_info = Model('member')->getMemberInfoByID($member_id, 'member_points');
  349. }
  350. if (intval($member_info['member_points']) < $points){
  351. return array('state'=>false,'msg'=>'积分不足,暂时不能兑换');
  352. }
  353. return array('state'=>true);
  354. }
  355. }