CashierOrderPay.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\cashier\model\order;
  11. use addon\cardservice\model\MemberCard;
  12. use addon\coupon\model\MemberCoupon;
  13. use addon\memberconsume\model\Consume;
  14. use addon\memberrecharge\model\MemberrechargeOrder;
  15. use addon\memberrecharge\model\MemberrechargeOrderCreate;
  16. use app\model\BaseModel;
  17. use app\model\member\Member;
  18. use app\model\member\MemberAccount;
  19. use app\model\order\OrderCommon;
  20. use app\model\order\OrderLog;
  21. use app\model\order\OrderRefund;
  22. use app\model\order\OrderStock;
  23. use app\model\store\Stat;
  24. use app\model\system\Pay;
  25. use think\facade\Log;
  26. /**
  27. * 收银订单
  28. *
  29. * @author Administrator
  30. *
  31. */
  32. class CashierOrderPay extends BaseModel
  33. {
  34. public function setCache($out_trade_no, $json)
  35. {
  36. $pay_model = new Pay();
  37. $data = array (
  38. 'pay_json' => json_encode($json)
  39. );
  40. $condition = array (
  41. [ 'out_trade_no', '=', $out_trade_no ]
  42. );
  43. $pay_model->edit($data, $condition);
  44. //写入单据表
  45. // Cache::set('cashier_cache_' . $out_trade_no, $json);
  46. return $this->success();
  47. }
  48. public function getCache($out_trade_no)
  49. {
  50. $pay_model = new Pay();
  51. $pay_info = $pay_model->getPayInfo($out_trade_no)[ 'data' ] ?? [];
  52. $cache = !empty($pay_info[ 'pay_json' ]) ? json_decode($pay_info[ 'pay_json' ], true) : [];
  53. // $cache = Cache::get('cashier_cache_' . $out_trade_no);
  54. return $this->success($cache);
  55. }
  56. /**
  57. * 创建支付单据
  58. * @param $params
  59. * @return array
  60. */
  61. public function createPay($params)
  62. {
  63. $out_trade_no = $params[ 'out_trade_no' ];
  64. $cache = $this->getCache($out_trade_no)[ 'data' ] ?? [];
  65. $promotion = $cache[ 'promotion' ] ?? [];
  66. $member_id = $cache[ 'member_id' ] ?? 0;
  67. $site_id = $params[ 'site_id' ];
  68. $params[ 'member_id' ] = $member_id;
  69. $params[ 'promotion' ] = $promotion;
  70. $calculate_model = new CashierOrderCalculate();
  71. $calculate_result = $calculate_model->calculate($params);
  72. if ($calculate_result[ 'code' ] < 0) {
  73. return $calculate_result;
  74. }
  75. $calculate = $calculate_result[ 'data' ];
  76. $pay_model = new Pay();
  77. $pay_info = $pay_model->getPayInfo($out_trade_no)[ 'data' ] ?? [];
  78. $pay_money = $pay_info[ 'pay_money' ];
  79. $surplus_money = $calculate[ 'surplus_money' ];
  80. if ($pay_money != $surplus_money) {
  81. $pay_model->deletePay($out_trade_no);
  82. //如果金额与上次一样的话就不需要生成新的支付
  83. // 生成整体付费支付单据
  84. $pay_model->addPay($site_id, $out_trade_no, 'ONLINE_PAY', $calculate[ 'order_name' ], $calculate[ 'order_name' ], $surplus_money, '', 'CashierOrderPayNotify', '');
  85. $this->setCache($out_trade_no, [ 'promotion' => $promotion, 'member_id' => $this->params[ 'member_id' ] ?? 0 ]);
  86. }
  87. return $this->success();
  88. }
  89. /**
  90. * 去支付
  91. * @param $params
  92. * @return array
  93. */
  94. public function doPay($params)
  95. {
  96. $out_trade_no = $params[ 'out_trade_no' ];
  97. $cache = $this->getCache($out_trade_no)[ 'data' ] ?? [];
  98. $promotion = $cache[ 'promotion' ] ?? [];
  99. $member_id = $cache[ 'member_id' ] ?? 0;
  100. $condition = array (
  101. [ 'out_trade_no', '=', $out_trade_no ]
  102. );
  103. $info = model('order')->getInfo($condition);
  104. $pay_type = $params[ 'pay_type' ];
  105. $calculate_params = array (
  106. 'site_id' => $info[ 'site_id' ],//站点id
  107. 'out_trade_no' => $out_trade_no,
  108. 'store_id' => $info[ 'store_id' ],
  109. 'online_type' => $params[ 'online_type' ] ?? $pay_type,
  110. 'pay_type' => $pay_type,
  111. 'member_id' => $member_id,
  112. );
  113. if (!empty($promotion)) {
  114. $calculate_params[ 'promotion' ] = $promotion;
  115. }
  116. $result = $this->confirm($calculate_params);
  117. return $result;
  118. }
  119. /**
  120. * 确认支付,生成订单
  121. * @param $params
  122. * @return array
  123. */
  124. public function confirm($params)
  125. {
  126. try {
  127. $calculate_model = new CashierOrderCalculate();
  128. $result = $calculate_model->calculate($params);
  129. if ($result[ 'code' ] < 0)
  130. return $result;
  131. $calculate = $result[ 'data' ];
  132. $surplus_money = $calculate[ 'surplus_money' ];
  133. if ($surplus_money <= 0) {
  134. $result = $this->orderPay($calculate);
  135. if ($result[ 'code' ] < 0)
  136. return $result;
  137. } else {
  138. return $this->error([], '当前收银订单未支付');
  139. }
  140. return $this->success();
  141. } catch (\Exception $e) {
  142. return $this->error('', $e->getMessage() . $e->getLine() . $e->getFile());
  143. }
  144. }
  145. /**
  146. * 订单线上支付
  147. * @param unknown $out_trade_no
  148. */
  149. public function orderPay($calculate)
  150. {
  151. model('order')->startTrans();
  152. try {
  153. $out_trade_no = $calculate[ 'out_trade_no' ];
  154. $cashier_condition = array (
  155. [ 'out_trade_no', '=', $out_trade_no ],
  156. );
  157. $cashier_order_info = model('order')->getInfo($cashier_condition, '*');
  158. if ($cashier_order_info[ 'order_status' ] != 0) {
  159. model('order')->rollback();
  160. return $this->error([], '订单未处于待支付状态!');
  161. }
  162. $cashier_order_info[ 'goods_num' ] = numberFormat($cashier_order_info[ 'goods_num' ]);
  163. $pay_type = empty($calculate[ 'pay_type' ]) ? 'ONLINE_PAY' : $calculate[ 'pay_type' ];
  164. $cashier_order_model = new CashierOrder();
  165. $order_common_model = new OrderCommon();
  166. $pat_type_list = $order_common_model->getPayType([ 'order_type' => $cashier_order_info[ 'order_type' ] ]);
  167. $pay_model = new Pay();
  168. $pay_model->edit([ 'pay_type' => $pay_type, 'pay_time' => time(), 'pay_status' => 2 ], [ [ 'out_trade_no', '=', $out_trade_no ] ]);
  169. $cashier_order_type = $cashier_order_info[ 'cashier_order_type' ];
  170. switch ( $cashier_order_type ) {
  171. case 'goods':
  172. $is_enable_refund = 1;
  173. break;
  174. case 'recharge':
  175. $is_enable_refund = 0;
  176. break;
  177. case 'card':
  178. $is_enable_refund = 1;
  179. break;
  180. }
  181. $data = array (
  182. 'pay_money' => $calculate[ 'pay_money' ],
  183. 'pay_type' => $pay_type,
  184. 'pay_type_name' => $pat_type_list[ $pay_type ] ?? '',
  185. 'pay_status' => 1,
  186. 'pay_time' => time(),
  187. 'reduction' => $calculate[ 'reduction' ] ?? 0,
  188. 'round_money' => $calculate[ 'round_money' ],
  189. 'order_money' => $calculate[ 'order_money' ],
  190. 'promotion_money' => $calculate[ 'promotion_money' ] ?? 0,
  191. 'balance_money' => $calculate[ 'total_balance' ],//总余额 todo 暂时先不区分可提现和不可提现余额
  192. 'coupon_id' => $calculate[ 'coupon_id' ],
  193. 'coupon_money' => $calculate[ 'coupon_money' ] ?? 0,
  194. 'is_enable_refund' => $is_enable_refund,
  195. 'point_money' => $calculate[ 'point_money' ] ?? 0,
  196. 'point' => $calculate[ 'point' ] ?? 0
  197. );
  198. $member_id = $params[ 'member_id' ] ?? 0;
  199. if ($member_id > 0) {
  200. $data[ 'member_id' ] = $member_id;
  201. }
  202. $out_trade_no = $calculate[ 'out_trade_no' ];
  203. $condition = array (
  204. [ 'out_trade_no', '=', $out_trade_no ],
  205. );
  206. model('order')->update($data, $condition);
  207. //扣除抵扣项
  208. $offset_result = $this->deductOffset($calculate);
  209. if ($offset_result[ 'code' ] < 0) {
  210. model('order')->rollback();
  211. return $offset_result;
  212. }
  213. // 用户线上支付
  214. if (in_array($pay_type, [ 'wechatpay', 'alipay' ])) {
  215. $log_data = array (
  216. 'order_id' => $cashier_order_info[ 'order_id' ],
  217. 'action' => 'pay',
  218. 'site_id' => $cashier_order_info[ 'site_id' ],
  219. 'member_id' => $cashier_order_info[ 'member_id' ],
  220. );
  221. ( new OrderLog() )->addLog($log_data);
  222. } else {
  223. // 收银员收款
  224. $log_data = array (
  225. 'order_id' => $cashier_order_info[ 'order_id' ],
  226. 'action' => 'pay',
  227. 'site_id' => $cashier_order_info[ 'site_id' ],
  228. 'member_id' => $cashier_order_info[ 'member_id' ],
  229. 'operater' => [
  230. 'uid' => $cashier_order_info[ 'cashier_operator_id' ]
  231. ]
  232. );
  233. ( new OrderLog() )->addLog($log_data);
  234. }
  235. //模拟订单支付后操作钩子
  236. if (addon_is_exit('memberconsume')) {
  237. $consume_model = new Consume();
  238. $consume_model->memberConsume([ 'out_trade_no' => $calculate[ 'out_trade_no' ], 'status' => 'pay' ]);
  239. }
  240. $complete_result = $cashier_order_model->complete($cashier_order_info);
  241. if ($complete_result[ 'code' ] < 0) {
  242. model('order')->rollback();
  243. return $complete_result;
  244. }
  245. $create_result = $this->create($cashier_order_info);
  246. if ($create_result[ 'code' ] < 0) {
  247. model('order')->rollback();
  248. return $create_result;
  249. }
  250. model('order')->commit();
  251. return $this->success();
  252. } catch (\Exception $e) {
  253. model('order')->rollback();
  254. return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine());
  255. }
  256. }
  257. /**
  258. * 订的创建
  259. * @param $params
  260. * @return array
  261. */
  262. public function create($params)
  263. {
  264. Log::write('收银订单创建' . json_encode($params));
  265. $out_trade_no = $params[ 'out_trade_no' ];
  266. $cashier_condition = array (
  267. [ 'out_trade_no', '=', $out_trade_no ],
  268. );
  269. $cashier_order_info = model('order')->getInfo($cashier_condition, '*');
  270. model('order')->startTrans();
  271. try {
  272. $cashier_order_info[ 'goods_num' ] = numberFormat($cashier_order_info[ 'goods_num' ]);
  273. $cashier_order_id = $cashier_order_info[ 'order_id' ];
  274. $store_id = $cashier_order_info[ 'store_id' ];
  275. //拆分订单
  276. $order_goods_condition = array (
  277. [ 'order_id', '=', $cashier_order_id ],
  278. );
  279. $order_goods_list = model('order_goods')->getList($order_goods_condition);
  280. foreach ($order_goods_list as $k => $v) {
  281. $order_goods_list[ $k ][ 'num' ] = numberFormat($order_goods_list[ $k ][ 'num' ]);
  282. }
  283. $site_id = $cashier_order_info[ 'site_id' ];
  284. $cashier_order_data = $cashier_order_info;
  285. $cashier_order_data[ 'goods_list' ] = $order_goods_list;
  286. $member_id = $cashier_order_info[ 'member_id' ];
  287. $cashier_order_type = $cashier_order_info[ 'cashier_order_type' ];
  288. //根据商品类型合并订单组
  289. $cashier_order_refund_model = new CashierOrderRefund();
  290. $order_refund_model = new OrderRefund();
  291. $store_stat = new Stat();
  292. $stat_data = [];
  293. switch ( $cashier_order_type ) {
  294. case 'goods':
  295. $cashier_trade_model = new CashierTrade();
  296. $member_card_model = new MemberCard();
  297. $item_list = [];
  298. foreach ($order_goods_list as $k => $v) {
  299. $card_item_id = $v[ 'card_item_id' ];
  300. if ($card_item_id > 0) {
  301. $num = $v[ 'num' ];
  302. $order_goods_id = $v[ 'order_goods_id' ];
  303. $type = 'order';
  304. //订单使用此卡
  305. $item_params = array (
  306. 'item_id' => $card_item_id,
  307. 'num' => $num,
  308. 'type' => $type,
  309. 'relation_id' => $order_goods_id,
  310. 'store_id' => $store_id
  311. );
  312. $item_list[] = $item_params;
  313. }
  314. }
  315. if (!empty($item_list)) {
  316. $user_card_result = $member_card_model->cardUse($item_list);
  317. Log::write('使用此卡错误' . json_encode($user_card_result));
  318. if ($user_card_result[ 'code' ] < 0) {
  319. $cashier_order_data[ 'refund_reason' ] = $user_card_result[ 'message' ];
  320. $refund_result = $order_refund_model->activeRefund($cashier_order_id, '', '订单退款');
  321. //todo 理论上退款转账不会导致退失败
  322. if ($refund_result[ 'code' ] < 0) {
  323. model('order')->rollback();
  324. return $refund_result;
  325. }
  326. model('order')->commit();
  327. return $user_card_result;
  328. }
  329. }
  330. foreach ($order_goods_list as $k => $v) {
  331. $cashier_result = $cashier_trade_model->toSend($v, $cashier_order_info);
  332. if ($cashier_result[ 'code' ] < 0) {
  333. $cashier_order_data[ 'refund_reason' ] = $cashier_result[ 'message' ];
  334. $refund_result = $order_refund_model->activeRefund($cashier_order_id, '', '订单退款');
  335. //todo 理论上退款转账不会导致退失败
  336. if ($refund_result[ 'code' ] < 0) {
  337. model('order')->rollback();
  338. return $refund_result;
  339. }
  340. model('order')->commit();
  341. return $cashier_result;
  342. }
  343. }
  344. // 统计数据
  345. $stat_data[ 'billing_count' ] = 1;
  346. $stat_data[ 'billing_money' ] = $cashier_order_info[ 'pay_money' ];
  347. break;
  348. case 'recharge':
  349. Log::write('收银订单创建');
  350. $recharge_order_create_model = new MemberrechargeOrderCreate();
  351. $recharge_order_model = new MemberrechargeOrder();
  352. foreach ($order_goods_list as $k => $v) {
  353. $item_sku_id = $v[ 'sku_id' ];
  354. $goods_money = $v[ 'goods_money' ];
  355. $data = [
  356. 'recharge_id' => $item_sku_id,//套餐id
  357. 'face_value' => $goods_money,//自定义充值面额
  358. 'member_id' => $member_id,
  359. 'order_from' => $cashier_order_info[ 'order_from' ],
  360. 'order_from_name' => $cashier_order_info[ 'order_from_name' ],
  361. 'site_id' => $site_id,
  362. 'relate_id' => $cashier_order_id,
  363. 'relate_type' => 'order'
  364. ];
  365. $recharge_order_result = $recharge_order_create_model->create($data);
  366. //todo 这儿也应该退款的
  367. if ($recharge_order_result[ 'code' ] < 0) {
  368. model('order')->rollback();
  369. Log::write('充值订单错误' . json_encode($recharge_order_result));
  370. return $recharge_order_result;
  371. }
  372. $recharge_order_out_trade_no = $recharge_order_result[ 'data' ];
  373. //todo 支付方式兼容(因为充值订单不一定有)
  374. $result = $recharge_order_model->orderPay([
  375. 'out_trade_no' => $recharge_order_out_trade_no,
  376. 'pay_type' => $cashier_order_info[ 'pay_type' ]
  377. ]);
  378. if ($result[ 'code' ] < 0) {
  379. model('order')->rollback();
  380. return $result;
  381. }
  382. }
  383. // 统计数据
  384. $stat_data[ 'recharge_count' ] = 1;
  385. $stat_data[ 'recharge_money' ] = $cashier_order_info[ 'pay_money' ];
  386. break;
  387. case 'card':
  388. $cashier_trade_model = new CashierTrade();
  389. foreach ($order_goods_list as $k => $v) {
  390. $cashier_result = $cashier_trade_model->toSend($v, $cashier_order_info);
  391. if ($cashier_result[ 'code' ] < 0) {
  392. // $refund_res = $cashier_order_refund_model->orderRefund(['order_id' => $order_id]);
  393. // model('order')->commit();
  394. // return $refund_res;
  395. $refund_result = $order_refund_model->activeRefund($cashier_order_id, '', '订单退款');
  396. //todo 理论上退款转账不会导致退失败
  397. if ($refund_result[ 'code' ] < 0) {
  398. model('order')->rollback();
  399. return $refund_result;
  400. }
  401. model('order')->commit();
  402. return $cashier_result;
  403. }
  404. }
  405. // 统计数据
  406. $stat_data[ 'buycard_count' ] = 1;
  407. $stat_data[ 'buycard_money' ] = $cashier_order_info[ 'pay_money' ];
  408. break;
  409. }
  410. $order_stock_model = new OrderStock();
  411. $stock_params = array (
  412. 'store_id' => $store_id,
  413. 'goods_sku_list' => $order_goods_list,
  414. 'site_id' => $cashier_order_info[ 'site_id' ],
  415. 'user_info' => [
  416. 'uid' => $cashier_order_info[ 'cashier_operator_id' ],
  417. 'username' => $cashier_order_info[ 'cashier_operator_name' ],
  418. ]
  419. );
  420. $result = $order_stock_model->decOrderStock($stock_params);
  421. if ($result[ 'code' ] < 0) {
  422. $refund_result = $order_refund_model->activeRefund($cashier_order_id, '', '订单退款');
  423. //todo 理论上退款转账不会导致退失败
  424. if ($refund_result[ 'code' ] < 0) {
  425. model('order')->rollback();
  426. return $refund_result;
  427. }
  428. model('order')->commit();
  429. return $result;
  430. }
  431. // 统计下单人数
  432. if ($member_id) {
  433. $count = model('order')->getCount([ [ 'member_id', '=', $member_id ], [ 'pay_status', '=', 1 ], [ 'store_id', '=', $store_id ] ]);
  434. if ($count == 1) $stat_data[ 'order_member_count' ] = 1;
  435. if ($cashier_order_info[ 'balance_money' ]) $stat_data[ 'balance_money' ] = $cashier_order_info[ 'balance_money' ];
  436. }
  437. // 添加统计数据
  438. if (!empty($stat_data)) {
  439. $stat_data[ 'site_id' ] = $site_id;
  440. $stat_data[ 'store_id' ] = $store_id;
  441. $store_stat->addStoreStat($stat_data);
  442. }
  443. model('order')->commit();
  444. return $this->success();
  445. } catch (\Exception $e) {
  446. model('order')->rollback();
  447. Log::write('收银单支付完成错误' . $e->getMessage() . $e->getFile() . $e->getLine());
  448. return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine());
  449. }
  450. }
  451. /**
  452. * 抵扣扣除
  453. * @param $calculate_data
  454. */
  455. public function deductOffset($calculate_data)
  456. {
  457. //使用优惠券
  458. $coupon_result = $this->useCoupon($calculate_data);
  459. if ($coupon_result[ 'code' ] < 0) {
  460. return $coupon_result;
  461. }
  462. //扣除积分
  463. $point_result = $this->deductPoint($calculate_data);
  464. if ($point_result[ 'code' ] < 0) {
  465. return $point_result;
  466. }
  467. //抵扣余额
  468. $balance_result = $this->deductBalance($calculate_data);
  469. if ($balance_result[ 'code' ] < 0) {
  470. return $balance_result;
  471. }
  472. return $this->success();
  473. }
  474. /**
  475. * 扣除余额
  476. * @param $calacalc_data
  477. */
  478. public function deductBalance($calculate_data)
  479. {
  480. $member_id = $calculate_data[ 'member_id' ];
  481. $site_id = $calculate_data[ 'site_id' ];
  482. $cashier_order_type = $calculate_data[ 'cashier_order_type' ];
  483. $order_id = $calculate_data[ 'order_id' ] ?? 0;
  484. $is_use_balance = $calculate_data[ 'is_use_balance' ] ?? 0;
  485. if (in_array($cashier_order_type, [ 'goods', 'card' ])) {
  486. //判断是否已经扣除过余额
  487. if ($is_use_balance > 0) {
  488. $balance_money = $calculate_data[ 'total_balance' ] ?? 0;
  489. if ($balance_money > 0) {
  490. $member_model = new Member();
  491. $member_account_model = new MemberAccount();
  492. $member_condition = array (
  493. [ 'member_id', '=', $member_id ],
  494. [ 'site_id', '=', $site_id ]
  495. );
  496. $member_info = $member_model->getMemberInfo($member_condition)[ 'data' ] ?? [];
  497. $member_balance = $member_info[ 'balance' ];//储值余额
  498. $member_balance_money = $member_info[ 'balance_money' ];//现金余额
  499. if ($balance_money > 0) {
  500. $order_data = array ();
  501. //优先扣除可不提现余额
  502. $surplus = $balance_money;
  503. $temp_balance = $member_balance;
  504. if ($member_balance > $surplus) {
  505. $temp_balance = $surplus;
  506. }
  507. $surplus -= $temp_balance;
  508. $from_type = 'order';
  509. $relate_tag = '余额抵扣';
  510. $remark = '订单名称:' . $calculate_data[ 'order_name' ] . ',订单编号:' . $calculate_data[ 'out_trade_no' ] ?? '' . ',订单金额:' . $calculate_data[ 'order_money' ] . ',订单余额抵扣,扣除储值余额:' . $temp_balance;
  511. $remark = '收银订单余额抵扣';
  512. if ($temp_balance > 0) {
  513. $result = $member_account_model->addMemberAccount($site_id, $member_id, 'balance', -$temp_balance, $from_type, $relate_tag, $remark, $order_id);
  514. if ($result[ 'code' ] < 0) {
  515. return $result;
  516. }
  517. $order_data[ 'balance' ] = $temp_balance;
  518. }
  519. //扣除现金余额
  520. $temp_balance = $member_balance_money;
  521. if ($member_balance_money > $surplus) {
  522. $temp_balance = $surplus;
  523. }
  524. $from_type = 'order';
  525. $relate_tag = '余额抵扣';
  526. $remark = '订单名称:' . $calculate_data[ 'order_name' ] . ',订单编号:' . $calculate_data[ 'out_trade_no' ] . ',订单金额:' . $calculate_data[ 'order_money' ] . ',订单余额抵扣,扣除储值余额:' . $temp_balance;
  527. $remark = '收银订单余额抵扣';
  528. if ($temp_balance > 0) {
  529. $result = $member_account_model->addMemberAccount($site_id, $member_id, 'balance_money', -$temp_balance, $from_type, $relate_tag, $remark, $order_id);
  530. if ($result[ 'code' ] < 0) {
  531. return $result;
  532. }
  533. $order_data[ 'balance_money' ] = $temp_balance;
  534. }
  535. if (!empty($order_data)) {
  536. $order_condition = array (
  537. [ 'order_id', '=', $order_id ]
  538. );
  539. model('order')->update($order_data, $order_condition);
  540. }
  541. }
  542. }
  543. }
  544. }
  545. return $this->success();
  546. }
  547. public function useCoupon($calculate_data)
  548. {
  549. $coupon_id = $calculate_data[ 'coupon_id' ] ?? 0;
  550. //只有开单和卡项可以用优惠券
  551. $cashier_order_type = $calculate_data[ 'cashier_order_type' ];
  552. if (in_array($cashier_order_type, [ 'goods', 'card' ])) {
  553. if (!empty($coupon_id)) {
  554. $order_id = $calculate_data[ 'order_id' ];
  555. $member_coupon_model = new MemberCoupon();
  556. //扣除优惠券
  557. $result = $member_coupon_model->useMemberCoupon($coupon_id, $calculate_data[ 'member_id' ], $order_id);
  558. if ($result[ 'code' ] < 0) {
  559. return $result;
  560. }
  561. }
  562. }
  563. return $this->success();
  564. }
  565. /**
  566. * 扣除积分
  567. * @param $calacalc_data
  568. */
  569. public function deductPoint($calculate_data)
  570. {
  571. $member_account_model = new MemberAccount();
  572. $member_id = $calculate_data[ 'member_id' ];
  573. $site_id = $calculate_data[ 'site_id' ];
  574. $point = $calculate_data[ 'point' ] ?? 0;
  575. $order_id = $calculate_data[ 'order_id' ] ?? 0;
  576. $point_money = $calculate_data[ 'point_money' ] ?? 0;
  577. $order_type = $calculate_data[ 'cashier_order_type' ];
  578. if (in_array($order_type, [ 'goods', 'card' ])) {
  579. if ($point > 0) {
  580. $is_use_point = $calculate_data[ 'is_use_point' ] ?? 0;
  581. if ($is_use_point > 0) {
  582. $member_account_model = new MemberAccount();
  583. $from_type = 'order';
  584. $relate_tag = '积分抵扣';
  585. $remark = '收银订单积分抵扣,扣除积分:' . $point;
  586. $remark = '收银订单积分抵扣';
  587. $result = $member_account_model->addMemberAccount($site_id, $member_id, 'point', -$point, $from_type, $relate_tag, $remark, $order_id);
  588. if ($result[ 'code' ] < 0) {
  589. return $result;
  590. }
  591. }
  592. }
  593. }
  594. return $this->success();
  595. }
  596. }