MemberCard.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
  9. * 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
  10. * =========================================================
  11. */
  12. namespace addon\cardservice\model;
  13. use app\model\BaseModel;
  14. use app\model\system\Cron;
  15. use app\model\verify\Verify;
  16. use think\facade\Db;
  17. use think\facade\Log;
  18. class MemberCard extends BaseModel
  19. {
  20. /**
  21. * 创建会员卡项
  22. * @param $param
  23. * @return array
  24. */
  25. public function create($param)
  26. {
  27. $store_id = $param[ 'store_id' ] ?? 0;
  28. $goods_info = model('goods')->getInfo([
  29. [ 'goods_id', '=', $param[ 'goods_id' ] ],
  30. [ 'goods_state', '=', 1 ],
  31. [ 'is_delete', '=', 0 ],
  32. ], 'goods_name,goods_class,sku_id');
  33. if (empty($goods_info)) {
  34. return $this->error('', '未获取到商品信息');
  35. }
  36. $verify_model = new Verify();
  37. $end_time = 0;
  38. $card_info = model('goods_card')->getInfo([ [ 'goods_id', '=', $param[ 'goods_id' ] ] ],
  39. 'site_id, goods_id, card_id, card_type, card_type_name, renew_price, recharge_money, common_num, discount_goods_type, discount, validity_type, validity_day, validity_time');
  40. if (empty($card_info)) {
  41. return $this->error('', '未获取到卡项信息');
  42. }
  43. $card_item = model('goods_card_item')->getList([ [ 'ngci.card_goods_id', '=', $param[ 'goods_id' ] ] ], 'ngci.goods_id, ngci.sku_id, ngci.num, ngci.discount, ngci.card_goods_id, ngci.id, ngs.goods_class, ngs.sku_name, ngs.sku_image, ngs.price, ngs.is_virtual', '', 'ngci', [ [ 'goods_sku ngs', 'ngci.sku_id = ngs.sku_id', 'inner' ] ]);
  44. switch ( $card_info[ 'validity_type' ] ) {
  45. case 1:
  46. $end_time = strtotime('+' . $card_info[ 'validity_day' ] . ' day');
  47. break;
  48. case 2:
  49. $end_time = $card_info[ 'validity_time' ];
  50. if ($end_time < time()) {
  51. return $this->error('', '卡项已超出有效期');
  52. }
  53. break;
  54. }
  55. model('member_goods_card')->startTrans();
  56. try {
  57. $delivery_method = 'verify';
  58. $create_num = $param[ 'num' ] ?? 1;
  59. for ($i = 1; $i <= $create_num; $i++) {
  60. $card_id = model('member_goods_card')->add([
  61. 'site_id' => $param[ 'site_id' ] ?? 0,
  62. 'card_code' => $this->createNo(),
  63. 'member_id' => $param[ 'member_id' ],
  64. 'goods_id' => $param[ 'goods_id' ],
  65. 'create_time' => time(),
  66. 'end_time' => $end_time,
  67. 'order_id' => $param[ 'order_id' ] ?? 0,
  68. 'card_type' => $card_info[ 'card_type' ],
  69. 'total_num' => $card_info[ 'common_num' ],
  70. 'delivery_method' => $delivery_method,
  71. 'store_id' => $store_id,
  72. 'goods_name' => $goods_info[ 'goods_name' ]
  73. ]);
  74. $total_num = 0;
  75. foreach ($card_item as $item) {
  76. if (isset($card_info) && $card_info[ 'card_type' ] == 'commoncard') {
  77. $item[ 'num' ] = $card_info[ 'common_num' ];
  78. $total_num = $item[ 'num' ];
  79. } else {
  80. $total_num += $item[ 'num' ];
  81. }
  82. $item_data = [
  83. 'site_id' => $param[ 'site_id' ] ?? 0,
  84. 'card_id' => $card_id,
  85. 'member_id' => $param[ 'member_id' ],
  86. 'goods_id' => $item[ 'goods_id' ],
  87. 'sku_id' => $item[ 'sku_id' ],
  88. 'num' => $item[ 'num' ],
  89. 'end_time' => $end_time,
  90. 'card_type' => isset($card_info) ? $card_info[ 'card_type' ] : '',
  91. 'goods_class' => $item[ 'goods_class' ],
  92. 'member_verify_id' => 0,
  93. 'store_id' => $store_id
  94. ];
  95. $item_array = [
  96. [
  97. 'img' => $item[ 'sku_image' ],
  98. 'name' => $item[ 'sku_name' ],
  99. 'price' => $item[ 'price' ],
  100. 'num' => $item[ 'num' ],
  101. 'remark_array' => []
  102. ]
  103. ];
  104. $verify_content_json = $verify_model->getVerifyJson($item_array, []);
  105. //创建核销码
  106. $verify_res = $verify_model->addVerify("cardgoods", $item_data[ 'site_id' ], "", $verify_content_json, $end_time, $item_data[ 'num' ], 0, $param[ 'member_id' ]);
  107. if ($verify_res[ 'code' ] != 0) {
  108. model('member_goods_card')->rollback();
  109. return $this->error([], '核销码创建失败');
  110. }
  111. $item_data[ 'member_verify_id' ] = $verify_res[ 'data' ][ 'verify_id' ];
  112. model('member_goods_card_item')->add($item_data);
  113. }
  114. model('member_goods_card')->update([ 'total_num' => $total_num, 'delivery_method' => $delivery_method ], [ [ 'card_id', '=', $card_id ] ]);
  115. if ($end_time > 0) ( new Cron() )->addCron(1, 0, "会员卡项过期失效", "CronMemberCardExpire", $end_time, $card_id);
  116. }
  117. model('member_goods_card')->commit();
  118. return $this->success($card_id);
  119. } catch (\Exception $e) {
  120. model('member_goods_card')->rollback();
  121. return $this->error([], '会员卡项创建失败' . $e->getMessage());
  122. }
  123. }
  124. /**
  125. * 生成订单编号
  126. * @param array $site_id
  127. */
  128. public function createNo()
  129. {
  130. $time_str = date('YmdHi');
  131. $card_no = $time_str . (string) rand(11111, 99999);
  132. return $card_no;
  133. }
  134. /**
  135. * 获取会员卡项信息
  136. * @param array $condition
  137. * @param string $field
  138. * @param string $alias
  139. * @param array $join
  140. * @return array
  141. */
  142. public function getCardInfo($condition = [], $field = '*', $alias = '', $join = [])
  143. {
  144. $data = model('member_goods_card')->getInfo($condition, $field, $alias, $join);
  145. return $this->success($data);
  146. }
  147. /**
  148. * 获取会员卡项数量
  149. * @param array $condition
  150. * @param string $field
  151. * @param string $alias
  152. * @param array $join
  153. * @return array
  154. */
  155. public function getCardCount($condition = [], $field = '*', $alias = 'a', $join = null)
  156. {
  157. $data = model('member_goods_card')->getCount($condition, $field, $alias, $join);
  158. return $this->success($data);
  159. }
  160. /**
  161. * 获取会员卡项分页列表
  162. * @param array $condition
  163. * @param bool $field
  164. * @param string $order
  165. * @param int $page
  166. * @param int $list_rows
  167. * @param string $alias
  168. * @param array $join
  169. * @return array
  170. */
  171. public function getCardPageList($condition = [], $field = true, $order = '', $page = 1, $list_rows = PAGE_LIST_ROWS, $alias = 'a', $join = [])
  172. {
  173. $data = model('member_goods_card')->pageList($condition, $field, $order, $page, $list_rows, $alias, $join);
  174. return $this->success($data);
  175. }
  176. /**
  177. * 获取会员卡项项列表
  178. * @param array $condition
  179. * @param bool $field
  180. * @param string $order
  181. * @param string $alias
  182. * @param array $join
  183. * @return array
  184. */
  185. public function getCartItemList($condition = [], $field = true, $order = '', $alias = 'a', $join = [])
  186. {
  187. $data = model('member_goods_card_item')->getList($condition, $field, $order, $alias, $join);
  188. return $this->success($data);
  189. }
  190. /**
  191. * 获取会员卡项项分页列表
  192. * @param array $condition
  193. * @param bool $field
  194. * @param string $order
  195. * @param int $page
  196. * @param int $list_rows
  197. * @param string $alias
  198. * @param array $join
  199. * @return array
  200. */
  201. public function getCartItemPageList($condition = [], $field = true, $order = '', $page = 1, $list_rows = PAGE_LIST_ROWS, $alias = 'a', $join = [])
  202. {
  203. $data = model('member_goods_card_item')->pageList($condition, $field, $order, $page, $list_rows, $alias, $join);
  204. return $this->success($data);
  205. }
  206. /**
  207. * 获取会员卡项项详情
  208. */
  209. public function getCartItemInfo($condition = [], $field = '*', $alias = '', $join = [])
  210. {
  211. $data = model('member_goods_card_item')->getInfo($condition, $field, $alias, $join);
  212. return $this->success($data);
  213. }
  214. /**
  215. * 卡项核销
  216. * @param $param
  217. */
  218. public function verify($param)
  219. {
  220. $card_item_info = model('member_goods_card_item')->getInfo([ [ 'member_verify_id', '=', $param[ 'verify_id' ] ] ], 'item_id');
  221. if (empty($card_item_info)) return $this->error('', '未获取到卡项信息');
  222. return $this->cardUse([
  223. 'item_id' => $card_item_info[ 'item_id' ],
  224. 'num' => 1,
  225. 'type' => 'verify',
  226. 'relation_id' => $param[ 'verify_id' ],
  227. 'store_id' => $param[ 'store_id' ] ?? 0
  228. ]);
  229. }
  230. /**
  231. * 卡项使用
  232. * @param 两种参数形式
  233. * array('item_id' => $card_item_id,'num' => $num,'type' => $type,'relation_id' => $order_goods_id);
  234. * array(('item_id' => $card_item_id,'num' => $num,'type' => $type,'relation_id' => $order_goods_id));
  235. */
  236. public function cardUse($param)
  237. {
  238. $temp_item_id = $param[ 'item_id' ] ?? 0;
  239. if ($temp_item_id > 0) {
  240. $item_list = [ $param ];
  241. } else {
  242. $item_list = $param;
  243. }
  244. model('member_goods_card_item')->startTrans();
  245. try {
  246. $out_relation_ids = [];
  247. foreach ($item_list as $item_k => $item_v) {
  248. $item_id = $item_v[ 'item_id' ];
  249. $item_num = $item_v[ 'num' ] ?? 1;
  250. $item_type = $item_v[ 'type' ];
  251. $item_relation_id = $item_v[ 'relation_id' ];
  252. $item_store_id = $item_v[ 'store_id' ] ?? 0;
  253. $card_item_info = model('member_goods_card_item')->getInfo([ [ 'mci.item_id', '=', $item_id ] ],
  254. 'mci.site_id,mci.card_id,mci.num,mci.use_num,mci.item_id,mci.goods_id,mci.sku_id,mci.end_time,mci.member_verify_id,mc.card_type,mc.total_num,mc.total_use_num,mc.delivery_method', 'mci',
  255. [
  256. [ 'member_goods_card mc', 'mc.card_id = mci.card_id', 'left' ]
  257. ]);
  258. if (empty($card_item_info)) {
  259. model('member_goods_card_item')->rollback();
  260. return $this->error('', '未获取到卡项信息');
  261. }
  262. if ($card_item_info[ 'end_time' ] > 0 && $card_item_info[ 'end_time' ] < time()) {
  263. model('member_goods_card_item')->rollback();
  264. return $this->error('', '已超出有效期');
  265. }
  266. if ($card_item_info[ 'card_type' ] != 'timecard' && ( $card_item_info[ 'num' ] - $card_item_info[ 'use_num' ] - $item_num ) < 0) {
  267. model('member_goods_card_item')->rollback();
  268. return $this->error('', '卡项可用次数不足');
  269. }
  270. // 如果是通用卡项
  271. if ($card_item_info[ 'card_type' ] == 'commoncard') {
  272. model('member_goods_card_item')->setInc([ [ 'card_id', '=', $card_item_info[ 'card_id' ] ] ], 'use_num', $item_num);
  273. // 同步核销码使用次数
  274. if ($item_type == 'order') {
  275. $verify_ids = model('member_goods_card_item')->getColumn([ [ 'card_id', '=', $card_item_info[ 'card_id' ] ] ], 'member_verify_id');
  276. } else {
  277. $verify_ids = model('member_goods_card_item')->getColumn([ [ 'card_id', '=', $card_item_info[ 'card_id' ] ], [ 'item_id', '<>', $card_item_info[ 'item_id' ] ] ], 'member_verify_id');
  278. }
  279. if (!empty($verify_ids)) {
  280. model('verify')->setInc([ [ 'id', 'in', $verify_ids ] ], 'verify_use_num', $item_num);
  281. model('verify')->update([ 'is_verify' => 1, 'verify_time' => time() ], [
  282. [ 'id', 'in', $verify_ids ],
  283. [ 'verify_total_count', '>', 0 ],
  284. [ '', 'exp', Db::raw('verify_use_num >= verify_total_count') ]
  285. ]);
  286. }
  287. } else {
  288. model('member_goods_card_item')->setInc([ [ 'item_id', '=', $card_item_info[ 'item_id' ] ] ], 'use_num', $item_num);
  289. // 同步核销码使用次数
  290. if ($item_type == 'order') {
  291. model('verify')->setInc([ [ 'id', '=', $card_item_info[ 'member_verify_id' ] ] ], 'verify_use_num', $item_num);
  292. model('verify')->update([ 'is_verify' => 1, 'verify_time' => time() ], [
  293. [ 'id', '=', $card_item_info[ 'member_verify_id' ] ],
  294. [ 'verify_total_count', '>', 0 ],
  295. [ '', 'exp', Db::raw('verify_use_num >= verify_total_count') ]
  296. ]);
  297. }
  298. }
  299. model('member_goods_card')->setInc([ [ 'card_id', '=', $card_item_info[ 'card_id' ] ] ], 'total_use_num', $item_num);
  300. // 如果卡项次数已使用完
  301. if ($card_item_info[ 'card_type' ] != 'timecard' && ( $card_item_info[ 'total_num' ] - $card_item_info[ 'total_use_num' ] - $item_num ) == 0) {
  302. model('member_goods_card')->update([ 'status' => 0 ], [ [ 'card_id', '=', $card_item_info[ 'card_id' ] ] ]);
  303. ( new Cron() )->deleteCron([ [ 'event', '=', 'CronMemberCardExpire' ], [ 'relate_id', '=', $card_item_info[ 'card_id' ] ] ]);
  304. }
  305. // 添加使用记录
  306. model('member_goods_card_records')->add([
  307. 'card_id' => $card_item_info[ 'card_id' ],
  308. 'site_id' => $card_item_info[ 'site_id' ],
  309. 'card_item_id' => $card_item_info[ 'item_id' ],
  310. 'type' => $item_type,
  311. 'relation_id' => $item_relation_id,
  312. 'create_time' => time(),
  313. 'store_id' => $item_store_id,
  314. 'num' => $item_num
  315. ]);
  316. }
  317. model('member_goods_card_item')->commit();
  318. return $this->success([ 'out_relation_ids' => $out_relation_ids ]);
  319. } catch (\Exception $e) {
  320. model('member_goods_card_item')->rollback();
  321. Log::write('卡项使用错误,错误原因:' . $e->getMessage() . $e->getFile() . $e->getLine() . '请求参数:' . json_encode($param));
  322. return $this->error('', '卡项使用失败');
  323. }
  324. }
  325. /**
  326. * 获取会员卡项使用记录列表
  327. * @param array $condition
  328. * @param bool $field
  329. * @param string $order
  330. * @param string $alias
  331. * @param array $join
  332. * @return array
  333. */
  334. public function getMemberCardRecordsList($condition = [], $field = true, $order = '', $alias = 'a', $join = [])
  335. {
  336. $data = model('member_goods_card_records')->getList($condition, $field, $order, $alias, $join);
  337. return $this->success($data);
  338. }
  339. public function getMemberCardRecordsPageList($condition = [], $field = true, $order = '', $page = 1, $list_rows = PAGE_LIST_ROWS, $alias = 'a', $join = [])
  340. {
  341. $data = model('member_goods_card_records')->pageList($condition, $field, $order, $page, $list_rows, $alias, $join);
  342. return $this->success($data);
  343. }
  344. /**
  345. * 查询当前会员是否可以使用卡项
  346. * @param $params
  347. * @param bool $is_buy
  348. * @return array
  349. */
  350. public function getMemberCardUse($params)
  351. {
  352. if (!empty($params[ 'card_item_id' ])) {
  353. $card_condition = [
  354. [ 'moi.site_id', '=', $params[ 'site_id' ] ],
  355. [ 'moi.member_id', '=', $params[ 'member_id' ] ],
  356. [ '', 'exp', Db::raw('(mo.end_time = 0 or mo.end_time > ' . time() . ') and mo.status = 1') ],
  357. [ 'moi.item_id', '=', $params[ 'card_item_id' ] ]
  358. ];
  359. $card_field = 'moi.end_time, moi.card_id, moi.item_id';
  360. $card_join = [
  361. [ 'member_goods_card mo', 'mo.card_id = moi.card_id', 'left' ],
  362. [ 'goods_card gc', 'gc.goods_id = mo.goods_id', 'left' ]
  363. ];
  364. $card_item_info = $this->getCartItemInfo($card_condition, $card_field, 'moi', $card_join)[ 'data' ];
  365. return $this->success($card_item_info);
  366. }
  367. return $this->error();
  368. }
  369. /**
  370. * 查询会员可用的卡项(关联商品查询)
  371. * @param $params
  372. */
  373. public function getMemberUseCardList($params)
  374. {
  375. $site_id = $params[ 'site_id' ] ?? 0;
  376. $member_id = $params[ 'member_id' ] ?? 0;
  377. $goods_id = $params[ 'goods_id' ] ?? 0;
  378. $sku_id = $params[ 'sku_id' ];
  379. $alias = 'moi';
  380. $condition = array (
  381. [ $alias . '.member_id', '=', $member_id ],
  382. [ 'mo.status', '=', 1 ],
  383. );
  384. if ($goods_id > 0) {
  385. $condition[] = [ $alias . '.goods_id', '=', $goods_id ];
  386. }
  387. if ($sku_id > 0) {
  388. $condition[] = [ $alias . '.sku_id', '=', $sku_id ];
  389. }
  390. $field = 'moi.*,mo.status';
  391. $join = [
  392. [ 'member_goods_card mo', 'mo.card_id = moi.card_id', 'left' ],
  393. [ 'goods_card gc', 'gc.goods_id = mo.goods_id', 'left' ]
  394. ];
  395. $list = model('member_goods_card_item')->getList($condition, $field, '', $alias, $join);
  396. return $this->success($list);
  397. }
  398. /**
  399. * 检验商品是否可被卡项抵扣
  400. * @param $params
  401. */
  402. public function getUseCardNum($params)
  403. {
  404. $member_id = $params[ 'member_id' ];
  405. $sku_id = $params[ 'sku_id' ];
  406. $item_id = $params[ 'item_id' ];
  407. $card_item_condition = array (
  408. [ 'member_id', '=', $member_id ],
  409. [ 'sku_id', '=', $sku_id ],
  410. [ 'item_id', '=', $item_id ]
  411. );
  412. $card_item_info = model('member_goods_card_item')->getInfo($card_item_condition);
  413. if (empty($card_item_info))
  414. return $this->error([], '没有可用的卡项');
  415. $card_type = $card_item_info[ 'card_type' ];
  416. $card_id = $card_item_info[ 'card_id' ];
  417. $card_condition = array (
  418. [ 'card_id', '=', $card_id ]
  419. );
  420. $card_info = model('member_goods_card')->getInfo($card_condition);
  421. if (empty($card_item_info))
  422. return $this->error([], '没有可用的卡项');
  423. $return_params = array (
  424. 'card_item_info' => $card_item_info,
  425. 'card_info' => $card_info
  426. );
  427. $status = $card_info[ 'status' ];
  428. if ($status != 1)
  429. return $this->error($return_params, '没有可用的卡项');
  430. $total_num = $card_info[ 'total_num' ];
  431. $total_use_num = $card_info[ 'total_use_num' ];
  432. switch ( $card_type ) {
  433. case 'oncecard'://限次
  434. $item_num = $card_item_info[ 'num' ];
  435. $item_use_num = $card_item_info[ 'use_num' ];
  436. $surplus_num = $item_num - $item_use_num;
  437. break;
  438. case 'timecard'://限时
  439. $surplus_num = 0;
  440. break;
  441. case 'commoncard'://通用共享次数
  442. $surplus_num = $total_num - $total_use_num;
  443. break;
  444. case ''://通用共享次数
  445. $item_num = $card_item_info[ 'num' ];
  446. $item_use_num = $card_item_info[ 'use_num' ];
  447. $surplus_num = $item_num - $item_use_num;
  448. break;
  449. };
  450. $return_params[ 'card_num' ] = $surplus_num;
  451. return $this->success($return_params);
  452. }
  453. /**
  454. * 会员卡项过期失效
  455. * @param $card_id
  456. */
  457. public function memberOncecardExpire($card_id)
  458. {
  459. model('member_goods_card')->update([ 'status' => 0 ], [ [ 'card_id', '=', $card_id ] ]);
  460. }
  461. /**
  462. * 关闭会员卡项
  463. * @param $card_id
  464. */
  465. public function memberOncecardClose($card_ids)
  466. {
  467. model('member_goods_card')->startTrans();
  468. try {
  469. // 关闭会员卡项
  470. model('member_goods_card')->update([ 'status' => 0 ], [ [ 'card_id', 'in', $card_ids ] ]);
  471. ( new Cron() )->deleteCron([ [ 'event', '=', 'CronMemberCardExpire' ], [ 'relate_id', 'in', $card_ids ] ]);
  472. // 关闭核销码
  473. $verify_ids = model('member_goods_card_item')->getColumn([ [ 'card_id', 'in', $card_ids ] ], 'member_verify_id');
  474. model('member_verify')->update([ 'state' => -1 ], [ [ 'id', 'in', $verify_ids ] ]);
  475. ( new Cron() )->deleteCron([ [ 'event', 'in', [ 'CronMemberVerifyClose', 'CronVerifyClosePreRemind' ] ], [ 'relate_id', '=', $verify_ids ] ]);
  476. model('member_goods_card')->commit();
  477. return $this->success();
  478. } catch (\Exception $e) {
  479. model('member_goods_card')->rollback();
  480. return $this->error();
  481. }
  482. }
  483. /**
  484. * 卡项退还
  485. * @param $item_list [ ['type' => '', 'relation_id' => ''] ]
  486. */
  487. public function refund($item_list)
  488. {
  489. model('member_goods_card_item')->startTrans();
  490. try {
  491. $records_ids = [];
  492. foreach ($item_list as $item) {
  493. $item_info = model('member_goods_card_records')->getInfo([
  494. [ 'mgcr.type', '=', $item[ 'type' ] ],
  495. [ 'mgcr.relation_id', '=', $item[ 'relation_id' ] ],
  496. ], 'mgcr.id,mgcr.card_id,mgcr.num,mgci.item_id,mgci.card_type,mgci.member_verify_id,mgc.status,mgc.end_time', 'mgcr', [
  497. [ 'member_goods_card_item mgci', 'mgci.item_id = mgcr.card_item_id', 'inner' ],
  498. [ 'member_goods_card mgc', 'mgci.card_id = mgc.card_id', 'inner' ]
  499. ]);
  500. if (!empty($item_info)) {
  501. if ($item_info[ 'card_type' ] == 'commoncard') {
  502. model('member_goods_card_item')->setDec([ [ 'card_id', '=', $item_info[ 'card_id' ] ] ], 'use_num', $item_info[ 'num' ]);
  503. $verify_ids = model('member_goods_card_item')->getColumn([ [ 'card_id', '=', $item_info[ 'card_id' ] ] ], 'member_verify_id');
  504. if (!empty($verify_ids)) {
  505. model('verify')->setDec([ [ 'id', 'in', $verify_ids ] ], 'verify_use_num', $item_info[ 'num' ]);
  506. if ($item_info[ 'status' ] == 0 && ( $item_info[ 'end_time' ] == 0 || $item_info[ 'end_time' ] > time() )) {
  507. model('verify')->update([ 'is_verify' => 0, 'verify_time' => 0 ], [ [ 'id', 'in', $verify_ids ] ]);
  508. }
  509. }
  510. } else {
  511. model('member_goods_card_item')->setDec([ [ 'item_id', '=', $item_info[ 'item_id' ] ] ], 'use_num', $item_info[ 'num' ]);
  512. model('verify')->setDec([ [ 'id', '=', $item_info[ 'member_verify_id' ] ] ], 'verify_use_num', $item_info[ 'num' ]);
  513. // 恢复核销码状态
  514. if ($item_info[ 'status' ] == 0 && ( $item_info[ 'end_time' ] == 0 || $item_info[ 'end_time' ] > time() )) {
  515. model('verify')->update([ 'is_verify' => 0, 'verify_time' => 0 ], [ [ 'id', '=', $item_info[ 'member_verify_id' ] ] ]);
  516. }
  517. }
  518. model('member_goods_card')->setDec([ [ 'card_id', '=', $item_info[ 'card_id' ] ] ], 'total_use_num', $item_info[ 'num' ]);
  519. $records_ids[] = $item_info[ 'id' ];
  520. // 判断卡是否为不可用状态
  521. if ($item_info[ 'status' ] == 0 && ( $item_info[ 'end_time' ] == 0 || $item_info[ 'end_time' ] > time() )) {
  522. model('member_goods_card')->update([
  523. 'status' => 1
  524. ], [ [ 'card_id', '=', $item_info[ 'card_id' ] ] ]);
  525. }
  526. }
  527. }
  528. // 删除使用记录
  529. if (!empty($records_ids)) model('member_goods_card_records')->delete([ [ 'id', 'in', $records_ids ] ]);
  530. model('member_goods_card_item')->commit();
  531. return $this->success();
  532. } catch (\Exception $e) {
  533. model('member_goods_card_item')->rollback();
  534. Log::write('卡项退还错误,错误原因:' . $e->getMessage() . $e->getFile() . $e->getLine());
  535. return $this->error('', '卡项退还失败');
  536. }
  537. }
  538. /**
  539. * 查询卡项活动信息
  540. * @param $condition
  541. */
  542. public function getCardSelect($condition)
  543. {
  544. $info = model('goods_card')->getInfo($condition);
  545. return $this->success($info);
  546. }
  547. }