CardOperation.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\giftcard\model\card;
  11. use addon\giftcard\model\giftcard\CardStat;
  12. use addon\giftcard\model\membercard\MemberCard;
  13. use app\model\BaseModel;
  14. use app\model\member\MemberAccount;
  15. use think\facade\Db;
  16. /**
  17. * 礼品卡工具类
  18. *
  19. * @author Administrator
  20. *
  21. */
  22. class CardOperation extends BaseModel
  23. {
  24. /**
  25. * 礼品卡使用吧公共函数
  26. * @param $params
  27. * @return array
  28. * @throws \think\db\exception\DbException
  29. */
  30. public function cardUseOperation($params)
  31. {
  32. $card_id = $params['card_id'];
  33. $card_goods_list = $params['goods_list'];
  34. $condition = array(
  35. ['card_id', '=', $card_id]
  36. );
  37. $card_right_type = $params['card_right_type'];
  38. $card_right_goods_type = $params['card_right_goods_type'];
  39. $card_right_goods_count = $params['card_right_goods_count'];
  40. $card_use_count = $params['use_count'];
  41. $card_right_goods_count -= $card_use_count;
  42. foreach ($card_goods_list as $k => $v) {
  43. $use_num = $v['use_num'];
  44. $total_num = $v['total_num'];
  45. $temp_use_num = $v['temp_use_num'];
  46. if ($card_right_goods_type != 'all') {
  47. if (($use_num + $temp_use_num) > $total_num) {
  48. return $this->error([], '使用次数超出可使用次数');
  49. }
  50. } else {
  51. if ($temp_use_num > $card_right_goods_count) {
  52. return $this->error([], '使用次数超出可使用次数');
  53. }
  54. }
  55. $item_condition = array(
  56. ['id', '=', $v['id']]
  57. );
  58. model('giftcard_card_goods')->setInc($item_condition, 'use_num', $temp_use_num);
  59. model('giftcard_card')->setInc($condition, 'use_count', $temp_use_num);//卡整体使用次数
  60. $card_right_goods_count -= $temp_use_num;
  61. }
  62. //写入使用记录
  63. $card_use_records_model = new CardUse();
  64. $result = $card_use_records_model->addCardUseRecords($params);
  65. $records_id = $result['data'];
  66. //核验礼品卡还是否存在可使用次数
  67. if ($card_right_goods_type != 'all') {
  68. $surplus_num = model('giftcard_card_goods')->getSum($condition, Db::raw('(total_num - use_num)'));
  69. } else {
  70. $card_model = new Card();
  71. $card_info = $card_model->getCardInfo($condition)['data'] ?? [];
  72. $surplus_num = $card_info['card_right_goods_count'] - $card_info['use_count'];
  73. }
  74. (new CardLog())->add([
  75. 'card_id' => $card_id,
  76. 'type_id' => $records_id,
  77. 'type' => 'use',
  78. 'operator_type' => 'member',//todo 暂时是确定的
  79. 'operator' => $params['member_id'],
  80. ]);
  81. if ($surplus_num == 0) {
  82. //使用
  83. $this->used($params);
  84. }
  85. return $this->success();
  86. }
  87. /**
  88. * 储值礼品卡使用
  89. * @param $params
  90. */
  91. public function cardUse($params)
  92. {
  93. $member_id = $params['member_id'] ?? 0;
  94. $site_id = $params['site_id'] ?? 0;
  95. $member_card_id = $params['member_card_id'];
  96. $order_id = $params['order_id'] ?? 0;
  97. $member_card_model = new MemberCard();
  98. $member_card_condition = array(
  99. ['member_card_id', '=', $member_card_id],
  100. ['member_id', '=', $member_id],
  101. ['is_transfer', '=', 0]
  102. );
  103. if ($site_id > 0) {
  104. $member_card_condition[] = ['site_id', '=', $site_id];
  105. }
  106. $member_card_info = $member_card_model->getMemberCardInfo($member_card_condition)['data'] ?? [];
  107. if (empty($member_card_info))
  108. return $this->error([], '礼品卡不存在或已转赠');
  109. $member_id = $member_card_info['member_id'];
  110. $card_id = $member_card_info['card_id'];
  111. $card_model = new Card();
  112. $card_condition = array(
  113. ['card_id', '=', $card_id],
  114. );
  115. $card_info = $card_model->getCardInfo($card_condition)['data'] ?? [];
  116. if (empty($card_info))
  117. return $this->error([], '礼品卡不存在或已转赠');
  118. $card_info['use_order_id'] = $order_id;
  119. $status = $card_info['status'];
  120. //todo 加入队列概念,队列
  121. if ($status != 'to_use')
  122. return $this->error([], '当前礼品卡不可以使用');
  123. $site_id = $member_card_info['site_id'];
  124. $card_right_type = $card_info['card_right_type'];
  125. if($card_right_type == 'balance'){
  126. $card_goods_list = $card_model->getCardGoodsList($card_condition)['data'] ?? [];
  127. foreach ($card_goods_list as $k => $v) {
  128. $card_goods_list[$k]['temp_use_num'] = $v['total_num'];
  129. }
  130. }else{
  131. $card_goods_array = $params['card_goods_json'];//[{'card_goods_id':15,'order_goods_id':1, 'num': 2}]
  132. if(empty($card_goods_array))
  133. return $this->error([], '礼品卡使用参数有误');
  134. $card_goods_ids = array_column($card_goods_array, 'card_goods_id');
  135. $card_goods_column = array_column($card_goods_array, null, 'card_goods_id');
  136. $temp_card_condition = $card_condition;
  137. $temp_card_condition[] = ['id', 'in', $card_goods_ids];
  138. $card_goods_list = $card_model->getCardGoodsList($temp_card_condition)['data'] ?? [];
  139. foreach ($card_goods_list as $k => $v) {
  140. $item_column = $card_goods_column[$v['id']];
  141. $card_goods_list[$k]['temp_use_num'] = $item_column['num'];
  142. $card_goods_list[$k]['use_order_goods_id'] = $item_column['order_goods_id'];
  143. }
  144. }
  145. model('giftcard_card')->startTrans();
  146. try {
  147. $user_params = array_merge($member_card_info, $card_info);
  148. $user_params['goods_list'] = $card_goods_list;
  149. $result = $this->cardUseOperation($user_params);
  150. if($result['code'] < 0){
  151. model('giftcard_card')->rollback();
  152. return $result;
  153. }
  154. $result = $this->balanceCardUse($user_params);
  155. if($result['code'] < 0){
  156. model('giftcard_card')->rollback();
  157. return $result;
  158. }
  159. model('giftcard_card')->commit();
  160. return $this->success();
  161. } catch ( \Exception $e ) {
  162. model('giftcard_card')->rollback();
  163. return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine());
  164. }
  165. }
  166. /**
  167. * 礼品卡兑换
  168. * @param $params
  169. * @return array
  170. */
  171. public function balanceCardUse($params){
  172. $card_goods_list = $params['goods_list'];
  173. //将余额给会员
  174. $member_account_model = new MemberAccount();
  175. foreach ($card_goods_list as $k => $v) {
  176. $item_balance = $v['total_balance'];//总的余额
  177. if ($item_balance > 0) {
  178. $member_account_model->addMemberAccount($params['site_id'], $params['member_id'], 'balance', $item_balance, 'giftcard', '会员升级得红包' . $item_balance, '储值礼品卡兑换');
  179. }
  180. $card_goods_list[$k]['temp_use_num'] = $v['total_num'];
  181. }
  182. return $this->success();
  183. }
  184. public function cardExpire($params){
  185. $site_id = $params['site_id'] ?? 0;
  186. $card_ids = $params['card_ids'];
  187. $condition = array(
  188. ['card_id', 'in', $card_ids],
  189. ['status', 'in', ['to_activate', 'to_use']]//暂时认为只有待使用和待激活的卡项会过期
  190. );
  191. if($site_id > 0){
  192. $condition[] = ['site_id', '=', $site_id];
  193. }
  194. $card_model = new Card();
  195. $list = $card_model->getCardList($condition)['data'] ?? [];
  196. if(empty($list))
  197. return $this->error();
  198. $data = array(
  199. 'status' => 'expire'
  200. );
  201. model('giftcard_card')->update($data, $condition);
  202. $this->cardExpireOperation($list);
  203. return $this->success();
  204. }
  205. /**
  206. * 卡过期后续任务
  207. * @param $list
  208. * @return array
  209. */
  210. public function cardExpireOperation($list){
  211. $card_log_model = new CardLog();
  212. foreach($list as $k => $v){
  213. //将贺卡全部作废
  214. $card_blessing_condition = array(
  215. ['card_id', '=', $v['card_id']],
  216. ['status', '=', 0]
  217. );
  218. model('giftcard_card_blessing')->update(['status' => 1], $card_blessing_condition);
  219. $card_log_model->add([
  220. 'card_id' => $v['card_id'],
  221. 'type' => 'expire',
  222. 'operator_type' => 'system',//todo 暂时是确定的
  223. ]);
  224. }
  225. return $this->success();
  226. }
  227. /**
  228. * 卡使用
  229. * @param $params
  230. */
  231. public function used($params){
  232. $condition = array(
  233. ['card_id', '=', $params['card_id']]
  234. );
  235. $data = array(
  236. 'status' => 'used',
  237. 'use_time' => time(),
  238. );
  239. model('giftcard_card')->update($data, $condition);
  240. //数据统计
  241. (new CardStat())->stat(array_merge($params, ['stat_type' => 'use']));
  242. (new CardLog())->add([
  243. 'card_id' => $params['card_id'],
  244. 'type' => 'used',
  245. 'operator_type' => 'member',//todo 暂时是确定的
  246. 'operator' => $params['member_id'],
  247. ]);
  248. return $this->success();
  249. }
  250. /**
  251. * 批量作废
  252. * @param $params
  253. * @return array
  254. */
  255. public function cardInvalid($params){
  256. $site_id = $params['site_id'] ?? 0;
  257. $card_import_id = $params['card_import_id'] ?? 0;
  258. $card_id = $params['card_id'] ?? 0;
  259. $condition = [
  260. ['status', '=', 'to_activate']
  261. ];
  262. if($site_id > 0){
  263. $condition[] = ['site_id', '=', $site_id];
  264. }
  265. if($card_import_id > 0){
  266. $condition[] = ['card_import_id', '=', $card_import_id];
  267. }
  268. if($card_id > 0){
  269. $condition[] = ['card_id', '=', $card_id];
  270. }
  271. $data = array(
  272. 'status' => 'invalid',
  273. 'invalid_time' => time(),
  274. );
  275. $card_model = new Card();
  276. $list = $card_model->getCardList($condition)['data'] ?? [];
  277. if(empty($list))
  278. return $this->error();
  279. model('giftcard_card')->update($data, $condition);
  280. $params['list'] = $list;
  281. //作废后的操作
  282. $this->cardInvalidOperation($params);
  283. return $this->success();
  284. }
  285. /**
  286. * 作废后操作
  287. * @param $params
  288. * @return array
  289. */
  290. public function cardInvalidOperation($params){
  291. $list = $params['list'];
  292. $card_log_model = new CardLog();
  293. foreach($list as $k => $v){
  294. //添加日志
  295. $card_log_model->add([
  296. 'card_id' => $v['card_id'],
  297. 'type' => 'used',
  298. 'operator_type' => 'member',//todo 暂时是确定的
  299. 'operator_data' => $params['operator_data'],
  300. ]);
  301. }
  302. (new CardStat())->stat(array_merge($params, ['stat_type' => 'invalid','num' => count($list)]));
  303. return $this->success();
  304. }
  305. }