CashierOrderPay.php 28 KB

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