CashierOrderPay.php 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\store\model\cashier;
  11. use addon\memberrecharge\model\o2o\O2oRechargeOrder;
  12. use addon\memberrecharge\model\RechargeOrder;
  13. use addon\store\model\member\MemberOnceCard;
  14. use addon\store\model\store\Store;
  15. use app\model\BaseModel;
  16. use app\model\member\Hongbao;
  17. use app\model\member\Member;
  18. use app\model\member\MemberAccount;
  19. use app\model\member\MemberCoupon;
  20. use app\model\member\MemberLevelOrder;
  21. use app\model\order\OrderCommon;
  22. use app\model\order\OrderCreateTool;
  23. use app\model\order\OrderGoods;
  24. use app\model\site\Site;
  25. use app\model\system\Pay;
  26. use think\facade\Cache;
  27. use think\facade\Log;
  28. use think\facade\Queue;
  29. /**
  30. * 收银订单
  31. *
  32. * @author Administrator
  33. *
  34. */
  35. class CashierOrderPay extends BaseModel
  36. {
  37. public function setCache($out_trade_no, $json)
  38. {
  39. Cache::set('cashier_cache_' . $out_trade_no, $json);
  40. return $this->success();
  41. }
  42. public function getCache($out_trade_no)
  43. {
  44. $cache = Cache::get('cashier_cache_' . $out_trade_no);
  45. return $this->success($cache);
  46. }
  47. /**
  48. * 创建支付单据
  49. * @param $params
  50. * @return array
  51. */
  52. public function createPay($params)
  53. {
  54. $out_trade_no = $params['out_trade_no'];
  55. $cache = $this->getCache($out_trade_no)['data'] ?? [];
  56. $promotion = $cache['promotion'] ?? [];
  57. $member_id = $cache['member_id'] ?? 0;
  58. $site_id = $params['site_id'];
  59. $params['member_id'] = $member_id;
  60. $params['promotion'] = $promotion;
  61. $calculate_model = new CashierOrderCalculate();
  62. $calculate_result = $calculate_model->calculate($params);
  63. if ($calculate_result['code'] < 0) {
  64. return $calculate_result;
  65. }
  66. $calculate = $calculate_result['data'];
  67. $pay_model = new Pay();
  68. $pay_info = $pay_model->getPayInfo($out_trade_no)['data'] ?? [];
  69. $pay_money = $pay_info['pay_money'];
  70. $surplus_money = $calculate['surplus_money'];
  71. if ($pay_money != $surplus_money) {
  72. $pay_model->deletePay($out_trade_no);
  73. //如果金额与上次一样的话就不需要生成新的支付
  74. // 生成整体付费支付单据
  75. $pay_model->addPay($site_id, $out_trade_no, 'ONLINE_PAY', $calculate['order_name'], $calculate['order_name'], $surplus_money, '', 'CashierOrderPayNotify', '');
  76. }
  77. return $this->success();
  78. }
  79. /**
  80. * 去支付
  81. * @param $params
  82. * @return array
  83. */
  84. public function doPay($params)
  85. {
  86. $out_trade_no = $params['out_trade_no'];
  87. $cache = $this->getCache($out_trade_no)['data'] ?? [];
  88. $promotion = $cache['promotion'] ?? [];
  89. $member_id = $cache['member_id'] ?? 0;
  90. $condition = array(
  91. ['out_trade_no', '=', $out_trade_no]
  92. );
  93. $info = model('store_cashier_order')->getInfo($condition);
  94. $pay_type = $params['pay_type'];
  95. $calculate_params = array(
  96. 'site_id' => $info['site_id'],//站点id
  97. 'out_trade_no' => $out_trade_no,
  98. 'store_id' => $info['store_id'],
  99. 'online_type' => $params['online_type'] ?? $pay_type,
  100. 'pay_type' => $pay_type,
  101. 'member_id' => $member_id,
  102. );
  103. if(!empty($promotion)){
  104. $calculate_params['promotion'] = $promotion;
  105. }
  106. $result = $this->confirm($calculate_params);
  107. return $result;
  108. }
  109. /**
  110. * 确认支付,生成订单
  111. * @param $params
  112. * @return array
  113. */
  114. public function confirm($params)
  115. {
  116. $calculate_model = new CashierOrderCalculate();
  117. $result = $calculate_model->calculate($params);
  118. if ($result['code'] < 0)
  119. return $result;
  120. $calculate = $result['data'];
  121. $surplus_money = $calculate['surplus_money'];
  122. if ($surplus_money <= 0) {
  123. $result = $this->orderPay($calculate);
  124. if ($result['code'] < 0)
  125. return $result;
  126. } else {
  127. return $this->error([], '当前收银订单未支付');
  128. }
  129. return $this->success();
  130. }
  131. /**
  132. * 订单线上支付
  133. * @param unknown $out_trade_no
  134. */
  135. public function orderPay($calculate)
  136. {
  137. model('store_cashier_order')->startTrans();
  138. try {
  139. $out_trade_no = $calculate['out_trade_no'];
  140. $cashier_condition = array(
  141. ['out_trade_no', '=', $out_trade_no],
  142. );
  143. $cashier_order_info = model('store_cashier_order')->getInfo($cashier_condition, '*');
  144. if ($cashier_order_info['status'] != 'topay') {
  145. model('store_cashier_order')->rollback();
  146. return $this->error([], '订单未处于待支付状态!');
  147. }
  148. $pay_type = empty($calculate['pay_type']) ? 'ONLINE_PAY' : $calculate['pay_type'];
  149. $data = array(
  150. 'pay_money' => $calculate['pay_money'],
  151. 'pay_type' => $pay_type,
  152. 'paid_money' => $calculate['paid_money'],
  153. 'surplus_money' => $calculate['surplus_money'],
  154. 'cash' => $calculate['cash'],
  155. 'cash_change' => $calculate['cash_change'] ?? 0,
  156. 'online_money' => $calculate['online_money'],
  157. 'online_type' => $calculate['online_type'],
  158. 'own_wechatpay' => $calculate['own_wechatpay'] ?? 0,
  159. 'own_alipay' => $calculate['own_alipay'] ?? 0,
  160. 'own_pos' => $calculate['own_pos'] ?? 0,
  161. 'pay_status' => 1,
  162. 'pay_time' => time(),
  163. 'reduction' => $calculate['reduction'] ?? 0,
  164. 'total_balance' => $calculate['total_balance'],//总余额
  165. 'point' => $calculate['point'] ?? 0,
  166. 'point_money' => $calculate['point_money'] ?? 0,
  167. 'coupon_id' => $calculate['coupon_id'],
  168. 'coupon_money' => $calculate['coupon_money'] ?? 0,
  169. 'hongbao_money' => $calculate['hongbao_money'] ?? 0,
  170. 'hongbao_id' => $calculate['hongbao_id'] ?? '',
  171. 'offset_money' => $calculate['offset_money'] ?? 0,
  172. 'discount_money' => $calculate['discount_money'] ?? 0,
  173. );
  174. $member_id = $params['member_id'] ?? 0;
  175. if ($member_id > 0) {
  176. $data['member_id'] = $member_id;
  177. }
  178. $out_trade_no = $calculate['out_trade_no'];
  179. $condition = array(
  180. ['out_trade_no', '=', $out_trade_no],
  181. );
  182. model('store_cashier_order')->update($data, $condition);
  183. //扣除抵扣项
  184. $offset_result = $this->deductOffset($calculate);
  185. if ($offset_result['code'] < 0) {
  186. model('store_cashier_order')->rollback();
  187. return $offset_result;
  188. }
  189. $cashier_data = array(
  190. 'status' => 'complete'
  191. );
  192. model('store_cashier_order')->update($cashier_data, $cashier_condition);
  193. model('store_cashier_order')->commit();
  194. $job_name = 'addon\store\job\CashierOrderCreate';
  195. $job_data = [
  196. 'out_trade_no' => $out_trade_no,
  197. ];
  198. Queue::push($job_name, $job_data);
  199. return $this->success();
  200. } catch ( \Exception $e ) {
  201. model('store_cashier_order')->rollback();
  202. return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine());
  203. }
  204. }
  205. /**
  206. * 获取收银订单的支付方式
  207. * @param $order_info
  208. */
  209. public function checkOrderPayType($order_info)
  210. {
  211. $cash = $order_info['cash'];
  212. $total_balance = $order_info['total_balance'];
  213. $online_money = $order_info['online_money'];
  214. $pay_money = $order_info['pay_money'];
  215. //只要存在线上支付金额,就去用线上的支付方式
  216. if ($online_money > 0 && $online_money == $pay_money) {
  217. $online_type = $order_info['online_type'];
  218. return $online_type;
  219. }
  220. if ($total_balance > 0 && $total_balance == $pay_money) {
  221. return 'BALANCE';
  222. }
  223. if ($cash > 0 && $cash == $pay_money) {
  224. return 'CASH';
  225. }
  226. $own_wechatpay = $order_info['own_wechatpay'] ?? 0;//标记微信支付
  227. $own_alipay = $order_info['own_alipay'] ?? 0;//标记支付宝
  228. $own_pos = $order_info['own_pos'] ?? 0;//标记pos机
  229. $own_money = $own_wechatpay + $own_alipay + $own_pos;
  230. if ($own_money > 0 && $own_money == $pay_money) {
  231. return 'SIGN';
  232. }
  233. return 'MAKEUP';
  234. }
  235. /**
  236. * 订的创建
  237. * @param $params
  238. * @return array
  239. */
  240. public function create($params)
  241. {
  242. Log::write('收银订单创建' . json_encode($params));
  243. $out_trade_no = $params['out_trade_no'];
  244. $cashier_condition = array(
  245. ['out_trade_no', '=', $out_trade_no],
  246. // ['status', '=', 'topay']
  247. );
  248. $cashier_order_info = model('store_cashier_order')->getInfo($cashier_condition, '*');
  249. model('store_cashier_order')->startTrans();
  250. try {
  251. $cashier_order_id = $cashier_order_info['order_id'];
  252. $order_id = $cashier_order_info['order_id'];
  253. $store_id = $cashier_order_info['store_id'];
  254. // $pay_type = $this->checkOrderPayType($cashier_order_info);
  255. // $order_money = $cashier_order_info['order_money'];
  256. // $goods_money = $cashier_order_info['goods_money'];
  257. // $pay_money = $cashier_order_info['pay_money'];
  258. //拆分订单
  259. $order_goods_condition = array(
  260. ['order_id', '=', $cashier_order_id],
  261. ['is_gift', '=', 0],//非赠品
  262. );
  263. $order_goods_list = model('store_cashier_order_goods')->getList($order_goods_condition);
  264. $site_id = $cashier_order_info['site_id'];
  265. $cashier_order_data = $cashier_order_info;
  266. $cashier_order_data['goods_list'] = $order_goods_list;
  267. $member_id = $cashier_order_info['member_id'];
  268. $cashier_order_type = $cashier_order_info['order_type'];
  269. //根据商品类型合并订单组
  270. $member_model = new Member();
  271. $member_condition = array(
  272. ['member_id', '=', $member_id],
  273. );
  274. $member_info = $member_model->getMemberInfo($member_condition)['data'] ?? [];
  275. $cashier_order_refund_model = new CashierOrderRefund();
  276. switch ($cashier_order_type) {
  277. case 'goods':
  278. $cashier_trade_model = new CashierTrade();
  279. $member_card_model = new MemberOnceCard();
  280. $item_list = [];
  281. foreach ($order_goods_list as $k => $v) {
  282. $card_item_id = $v['card_item_id'];
  283. if ($card_item_id > 0) {
  284. $num = $v['num'];
  285. $order_goods_id = $v['order_goods_id'];
  286. $type = 'order';
  287. //订单使用此卡
  288. $item_params = array(
  289. 'item_id' => $card_item_id,
  290. 'num' => $num,
  291. 'type' => $type,
  292. 'relation_id' => $order_goods_id,
  293. 'store_id' => $store_id
  294. );
  295. $item_list[] = $item_params;
  296. }
  297. }
  298. if (!empty($item_list)) {
  299. $user_card_result = $member_card_model->onceCardUse($item_list);
  300. Log::write('使用此卡错误' . json_encode($user_card_result));
  301. if ($user_card_result['code'] < 0) {
  302. $cashier_order_data['refund_reason'] = $user_card_result['message'];
  303. $refund_res = $cashier_order_refund_model->activeOrderRefund($cashier_order_data);
  304. model('store_cashier_order')->commit();
  305. return $refund_res;
  306. } else {
  307. $out_relation_ids = $user_card_result['data']['out_relation_ids'] ?? [];
  308. //设置订单项为已扣除库存
  309. $cashier_order_goods_model = new CashierOrderGoods();
  310. $cashier_order_goods_model->setOrderGoodsIsDecStock([['order_goods_id', 'in', $out_relation_ids]]);
  311. }
  312. }
  313. foreach ($order_goods_list as $k => $v) {
  314. $cashier_result = $cashier_trade_model->toSend($v, $cashier_order_info);
  315. if ($cashier_result['code'] < 0) {
  316. $cashier_order_data['refund_reason'] = $cashier_result['message'];
  317. $refund_res = $cashier_order_refund_model->activeOrderRefund($cashier_order_data);
  318. model('store_cashier_order')->commit();
  319. return $refund_res;
  320. }
  321. }
  322. break;
  323. case 'level':
  324. foreach ($order_goods_list as $k => $v) {
  325. $item_goods_id = $v['goods_id'];
  326. $item_sku_id = $v['sku_id'];
  327. $member_level_order_model = new MemberLevelOrder();
  328. $params = [
  329. 'site_id' => $site_id,
  330. 'level_id' => $item_goods_id,
  331. 'period_unit' => $item_sku_id,
  332. 'member_id' => $member_id,
  333. 'cashier_id' => $cashier_order_id,
  334. 'store_id' => $store_id,
  335. ];
  336. $member_level_order_result = $member_level_order_model->create($params);
  337. if ($member_level_order_result['code'] < 0) {
  338. model('store_cashier_order')->rollback();
  339. return $member_level_order_result;
  340. }
  341. $item_out_trade_no = $member_level_order_result['data']['out_trade_no'];
  342. $member_level_order_result = $member_level_order_model->orderPay(['out_trade_no' => $item_out_trade_no]);
  343. if ($member_level_order_result['code'] < 0) {
  344. model('store_cashier_order')->rollback();
  345. return $member_level_order_result;
  346. }
  347. }
  348. break;
  349. case 'recharge':
  350. Log::write('收银订单创建');
  351. $recharge_order_model = new O2oRechargeOrder();
  352. foreach ($order_goods_list as $k => $v) {
  353. $item_goods_id = $v['goods_id'];
  354. $item_sku_id = $v['sku_id'];
  355. $goods_money = $v['goods_money'];
  356. $data = [
  357. 'site_id' => $site_id,
  358. 'money' => $goods_money,
  359. 'promotion_id' => $item_goods_id,
  360. 'promotion_name' => $v['goods_name'],
  361. 'group_id' => $item_sku_id,
  362. 'member_id' => $member_id,
  363. 'fans_id' => 0,
  364. 'cashier_id' => $cashier_order_id,
  365. 'store_id' => $store_id,
  366. ];
  367. $recharge_order_result = $recharge_order_model->recharge($data);
  368. if ($recharge_order_result['code'] < 0) {
  369. model('store_cashier_order')->rollback();
  370. Log::write('充值订单错误' . json_encode($recharge_order_result));
  371. return $recharge_order_result;
  372. }
  373. }
  374. break;
  375. case 'card':
  376. $cashier_trade_model = new CashierTrade();
  377. foreach ($order_goods_list as $k => $v) {
  378. $cashier_result = $cashier_trade_model->toSend($v, $cashier_order_info);
  379. if ($cashier_result['code'] < 0) {
  380. // $refund_res = $cashier_order_refund_model->orderRefund(['order_id' => $order_id]);
  381. // model('store_cashier_order')->commit();
  382. // return $refund_res;
  383. }
  384. }
  385. break;
  386. }
  387. //赠品发放
  388. $gift_order_goods_condition = array(
  389. ['order_id', '=', $cashier_order_id],
  390. ['is_gift', '=', 1],//非赠品
  391. );
  392. $gift_order_goods_list = model('store_cashier_order_goods')->getList($gift_order_goods_condition);
  393. if(!empty($gift_order_goods_list)){
  394. $cashier_trade_model = new CashierTrade();
  395. foreach ($gift_order_goods_list as $k => $v) {
  396. $cashier_result = $cashier_trade_model->toSend($v, $cashier_order_info);
  397. if ($cashier_result['code'] < 0) {
  398. }
  399. }
  400. }
  401. $job_name = 'addon\store\job\CashierOrderReward';
  402. $reward_params = [
  403. 'order_id' => $order_id,
  404. 'site_id' => $site_id,
  405. 'member_id' => $member_id,
  406. ];
  407. Queue::push($job_name, $reward_params);
  408. event('SiteStat', [
  409. 'site_id' => $cashier_order_info['site_id'],
  410. 'store_id' => $cashier_order_info['store_id'] ?? 0,
  411. 'stat_type' => 'cashier_order',
  412. 'order_info' => $cashier_order_info,
  413. 'order_goods_list' => $order_goods_list,
  414. ]);
  415. model('store_cashier_order')->commit();
  416. return $this->success();
  417. } catch ( \Exception $e ) {
  418. model('store_cashier_order')->rollback();
  419. Log::write('收银单支付完成错误' . $e->getMessage() . $e->getFile() . $e->getLine());
  420. return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine());
  421. }
  422. }
  423. /**
  424. * 抵扣扣除
  425. * @param $calculate_data
  426. */
  427. public function deductOffset($calculate_data)
  428. {
  429. //使用优惠券
  430. $coupon_result = $this->useCoupon($calculate_data);
  431. if ($coupon_result['code'] < 0) {
  432. return $coupon_result;
  433. }
  434. //记录调价
  435. $reduction_result = $this->useReduction($calculate_data);
  436. if ($reduction_result['code'] < 0) {
  437. return $reduction_result;
  438. }
  439. //扣除积分
  440. $point_result = $this->deductPoint($calculate_data);
  441. if ($point_result['code'] < 0) {
  442. return $point_result;
  443. }
  444. // //抵扣红包
  445. $hongbao_result = $this->useHongbao($calculate_data);
  446. if ($hongbao_result['code'] < 0) {
  447. return $hongbao_result;
  448. }
  449. //抵扣余额
  450. $balance_result = $this->deductBalance($calculate_data);
  451. if ($balance_result['code'] < 0) {
  452. return $balance_result;
  453. }
  454. return $this->success();
  455. }
  456. /**
  457. * 扣除余额
  458. * @param $calacalc_data
  459. */
  460. public function deductBalance($calculate_data)
  461. {
  462. $member_id = $calculate_data['member_id'];
  463. $site_id = $calculate_data['site_id'];
  464. $is_deduct_balance = $calculate_data['is_deduct_balance'] ?? 0;
  465. $order_type = $calculate_data['order_type'];
  466. $order_id = $calculate_data['order_id'] ?? 0;
  467. $is_use_balance = $calculate_data['is_use_balance'] ?? 0;
  468. if (in_array($order_type, ['goods', 'card'])) {
  469. //判断是否已经扣除过余额
  470. if (!$is_deduct_balance && $is_use_balance > 0) {
  471. $balance_money = $calculate_data['total_balance'] ?? 0;
  472. if ($balance_money > 0) {
  473. $order_offset_model = new CashierOrderOffset();
  474. $offset_info = $order_offset_model->getOrderOffsetInfo([['order_id', '=',$order_id], ['type', 'in', ['balance','balance_money']]])['data'] ?? [];
  475. if(empty($offset_info)) {
  476. $member_account_model = new MemberAccount();
  477. $member_account_condition = array(
  478. ['member_id', '=', $member_id],
  479. ['site_id', '=', $site_id]
  480. );
  481. $member_account = $member_account_model->getMemberAccount($member_account_condition)['data'] ?? [];
  482. $member_balance = $member_account['balance'];//储值余额
  483. $member_balance_money = $member_account['balance_money'];//现金余额
  484. if ($balance_money > 0) {
  485. $order_data = array();
  486. //优先扣除可不提现余额
  487. $surplus = $balance_money;
  488. $temp_balance = $member_balance;
  489. if ($member_balance > $surplus) {
  490. $temp_balance = $surplus;
  491. }
  492. $surplus -= $temp_balance;
  493. $from_type = 'order';
  494. $relate_tag = '余额抵扣';
  495. $remark = '订单名称:' . $calculate_data['order_name'] . ',订单编号:' . $calculate_data['out_trade_no'] ?? '' . ',订单金额:' . $calculate_data['order_money'] . ',订单余额抵扣,扣除储值余额:' . $temp_balance;
  496. $account_title = '订单余额抵扣';
  497. if ($temp_balance > 0) {
  498. $result = $member_account_model->addMemberAccount($site_id, $member_id, 'balance', -$temp_balance, $from_type, $relate_tag, $remark, $account_title);
  499. if ($result['code'] < 0) {
  500. return $result;
  501. }
  502. $order_data['balance'] = $temp_balance;
  503. $discount_params = array(
  504. 'order_id' => $order_id,
  505. 'type' => 'balance',
  506. 'num' => $temp_balance,
  507. 'offset_money' => $temp_balance,
  508. 'site_id' => $site_id,
  509. 'store_id' => $calculate_data['store_id'],
  510. 'offset_type' => 'offset'
  511. );
  512. $order_offset_model->addOrderOffset($discount_params);
  513. }
  514. //扣除现金余额
  515. $temp_balance = $member_balance_money;
  516. if ($member_balance_money > $surplus) {
  517. $temp_balance = $surplus;
  518. }
  519. // $surplus -= $temp_balance;
  520. $from_type = 'order';
  521. $relate_tag = '余额抵扣';
  522. $remark = '订单名称:' . $calculate_data['order_name'] . ',订单编号:' . $calculate_data['out_trade_no'] . ',订单金额:' . $calculate_data['order_money'] . ',订单余额抵扣,扣除储值余额:' . $temp_balance;
  523. $account_title = '订单余额抵扣';
  524. if ($temp_balance > 0) {
  525. $result = $member_account_model->addMemberAccount($site_id, $member_id, 'balance_money', -$temp_balance, $from_type, $relate_tag, $remark, $account_title);
  526. if ($result['code'] < 0) {
  527. return $result;
  528. }
  529. $order_data['balance_money'] = $temp_balance;
  530. $discount_params = array(
  531. 'order_id' => $order_id,
  532. 'type' => 'balance_money',
  533. 'num' => $temp_balance,
  534. 'offset_money' => $temp_balance,
  535. 'site_id' => $site_id,
  536. 'store_id' => $calculate_data['store_id'],
  537. 'offset_type' => 'offset'
  538. );
  539. $order_offset_model->addOrderOffset($discount_params);
  540. }
  541. if (!empty($order_data)) {
  542. $order_data['is_deduct_balance'] = 1;
  543. $order_condition = array(
  544. ['order_id', '=', $order_id]
  545. );
  546. model('store_cashier_order')->update($order_data, $order_condition);
  547. }
  548. }
  549. }
  550. }
  551. }
  552. }
  553. return $this->success();
  554. }
  555. /**
  556. * 扣除积分
  557. * @param $calacalc_data
  558. */
  559. public function deductPoint($calculate_data)
  560. {
  561. $member_account_model = new MemberAccount();
  562. $member_id = $calculate_data['member_id'];
  563. $site_id = $calculate_data['site_id'];
  564. $point = $calculate_data['point'] ?? 0;
  565. $order_id = $calculate_data['order_id'] ?? 0;
  566. $point_money = $calculate_data['point_money'] ?? 0;
  567. $order_type = $calculate_data['order_type'];
  568. if (in_array($order_type, ['goods', 'card'])) {
  569. if ($point > 0) {
  570. $is_use_point = $calculate_data['is_use_point'] ?? 0;
  571. if($is_use_point > 0){
  572. $order_offset_model = new CashierOrderOffset();
  573. $offset_info = $order_offset_model->getOrderOffsetInfo([['order_id', '=',$order_id], ['type', '=', 'point']])['data'] ?? [];
  574. if(empty($offset_info)) {
  575. $from_type = 'order';
  576. $relate_tag = '积分抵扣';
  577. $remark = '收银订单积分抵扣,扣除积分:' . $point;
  578. $account_title = '收银订单积分抵扣';
  579. $result = $member_account_model->addMemberAccount($site_id, $member_id, 'point', -$point, $from_type, $relate_tag, $remark, $account_title);
  580. if ($result['code'] < 0) {
  581. return $result;
  582. }
  583. //增加订单优惠项
  584. $discount_params = array(
  585. 'order_id' => $order_id,
  586. 'type' => 'point',
  587. 'num' => $point,
  588. 'offset_money' => $point_money,
  589. 'site_id' => $site_id,
  590. 'store_id' => $calculate_data['store_id'],
  591. 'offset_type' => 'offset'
  592. );
  593. $order_offset_model->addOrderOffset($discount_params);
  594. }
  595. }
  596. }
  597. }
  598. return $this->success();
  599. }
  600. public function useCoupon($calculate_data)
  601. {
  602. $coupon_id = $calculate_data['coupon_id'] ?? 0;
  603. $site_id = $calculate_data['site_id'];
  604. $order_type = $calculate_data['order_type'];
  605. $order_id = $calculate_data['order_id'] ?? 0;
  606. //只有开单和卡项可以用优惠券
  607. $order_type = $calculate_data['order_type'];
  608. if (in_array($order_type, ['goods', 'card'])) {
  609. if (!empty($coupon_id)) {
  610. $order_offset_model = new CashierOrderOffset();
  611. $offset_info = $order_offset_model->getOrderOffsetInfo([['order_id', '=',$order_id], ['type', '=', 'coupon']])['data'] ?? [];
  612. if(empty($offset_info)){
  613. $coupon_money = $calculate_data['coupon_money'];
  614. $order_id = $calculate_data['order_id'];
  615. $order_goods_id_map = $calculate_data['order_goods_id_map'];
  616. $coupon_order_goods_id_array = [];
  617. $coupon_order_goods_id = $calculate_data['coupon_order_goods_ids'] ?? [];
  618. foreach($order_goods_id_map as $k => $v){
  619. if(in_array($k, $coupon_order_goods_id)){
  620. $coupon_order_goods_id_array[] = $v;
  621. }
  622. }
  623. $member_coupon_model = new MemberCoupon();
  624. $coupon_data = array(
  625. 'site_id' => $calculate_data['site_id'],
  626. 'member_id' => $calculate_data['member_id'],
  627. 'coupon_id' => $coupon_id,
  628. 'order_id' => $order_id
  629. );
  630. $result = $member_coupon_model->useCoupon($coupon_data);
  631. if ($result['code'] < 0) {
  632. return $result;
  633. }
  634. //增加订单优惠项
  635. $offset_params = array(
  636. 'order_id' => $order_id,
  637. 'type' => 'coupon',
  638. 'num' => 1,
  639. 'relate_id' => $coupon_id,
  640. 'order_goods_id' => implode(',', $coupon_order_goods_id_array),
  641. 'offset_money' => $coupon_money,
  642. 'site_id' => $site_id,
  643. 'store_id' => $calculate_data['store_id'],
  644. 'offset_type' => 'discount'
  645. );
  646. $order_offset_model->addOrderOffset($offset_params);
  647. }
  648. }
  649. }
  650. return $this->success();
  651. }
  652. /**
  653. *批量使用红包
  654. * @param $calculate_data
  655. */
  656. public function useHongbao($calculate_data)
  657. {
  658. $hongbao_id = $calculate_data['hongbao_id'] ?? '';
  659. $site_id = $calculate_data['site_id'];
  660. $order_type = $calculate_data['order_type'];
  661. if(in_array($order_type, ['goods', 'card'])) {
  662. if (!empty($hongbao_id)) {
  663. $order_id = $calculate_data['order_id'] ?? 0;
  664. $order_offset_model = new CashierOrderOffset();
  665. $offset_info = $order_offset_model->getOrderOffsetInfo([['order_id', '=',$order_id], ['type', '=', 'hongbao']])['data'] ?? [];
  666. if(empty($offset_info)) {
  667. $hongbao_model = new Hongbao();
  668. $hongbao_id_array = explode(',', $hongbao_id);
  669. $hongbao_money = $calculate_data['hongbao_money'];
  670. $order_goods_id = $calculate_data['order_goods_id'] ?? '';
  671. $hongbao_data = array(
  672. 'site_id' => $calculate_data['site_id'],
  673. 'member_id' => $calculate_data['member_id'],
  674. 'hongbao_id_array' => $hongbao_id_array,
  675. 'order_id' => $calculate_data['order_id'],
  676. );
  677. $result = $hongbao_model->batchUse($hongbao_data);
  678. if ($result['code'] < 0)
  679. return $result;
  680. //增加订单优惠项
  681. foreach ($hongbao_id_array as $k => $v) {
  682. $offset_params = array(
  683. 'order_id' => $order_id,
  684. 'type' => 'hongbao',
  685. 'num' => 1,
  686. 'relate_id' => $v,
  687. 'order_goods_id' => $order_goods_id,
  688. 'offset_money' => $hongbao_money,
  689. 'site_id' => $site_id,
  690. 'store_id' => $calculate_data['store_id'],
  691. 'offset_type' => 'discount'
  692. );
  693. $order_offset_model->addOrderOffset($offset_params);
  694. }
  695. }
  696. }
  697. }
  698. return $this->success();
  699. }
  700. /**
  701. * 记录调价
  702. * @param $calculate_data
  703. * @return array
  704. */
  705. public function useReduction($calculate_data)
  706. {
  707. $site_id = $calculate_data['site_id'];
  708. $order_type = $calculate_data['order_type'];
  709. $reduction = $calculate_data['reduction'] ?? 0;
  710. if ($reduction > 0) {
  711. $order_id = $calculate_data['order_id'] ?? 0;
  712. $order_offset_model = new CashierOrderOffset();
  713. $offset_info = $order_offset_model->getOrderOffsetInfo([['order_id', '=',$order_id], ['type', '=', 'reduction']])['data'] ?? [];
  714. if(empty($offset_info)) {
  715. $offset_params = array(
  716. 'order_id' => $order_id,
  717. 'type' => 'reduction',
  718. 'num' => $reduction,
  719. 'relate_id' => 0,
  720. 'order_goods_id' => '',
  721. 'offset_money' => $reduction,
  722. 'site_id' => $site_id,
  723. 'store_id' => $calculate_data['store_id'],
  724. 'offset_type' => 'discount'
  725. );
  726. $order_offset_model->addOrderOffset($offset_params);
  727. }
  728. }
  729. return $this->success();
  730. }
  731. /**
  732. * 奖励
  733. * @param $calculate_data
  734. * @return array
  735. */
  736. public function rewardAction($calculate_data){
  737. $reward = $calculate_data['reward'] ?? [];
  738. if(!empty($reward)){
  739. $member_id = $calculate_data['member_id'];
  740. $order_reward_model = new CashierOrderReward();
  741. $order_id = $calculate_data['order_id'] ?? 0;
  742. $site_id = $calculate_data['site_id'];
  743. foreach($reward as $k => $v){
  744. foreach($v as $item_k => $item){
  745. $order_goods_id_map = $calculate_data['order_goods_id_map'];
  746. $item_order_goods_id = [];
  747. $item_sku_ids = $item['keys'] ?? [];
  748. foreach($order_goods_id_map as $map_k => $map_v){
  749. if(in_array($map_k, $item_sku_ids)){
  750. $item_order_goods_id[] = $map_v;
  751. }
  752. }
  753. $reward_array = array(
  754. 'order_id' => $order_id,
  755. 'promotion_type' => $item['promotion_type'],
  756. 'promotion_id' => $item['promotion_id'],
  757. 'type' => $k,
  758. 'order_goods_id' => implode(',', $item_order_goods_id),
  759. 'num' => $item['num'],
  760. 'relate_id' => $item['relate_id'],
  761. 'site_id' => $site_id,
  762. 'member_id' => $member_id,
  763. 'desc' => $item['desc'],
  764. 'status' => $item['status'] ?? 0
  765. );
  766. $order_reward_model->addOrderReward($reward_array);
  767. }
  768. }
  769. }
  770. return $this->success();
  771. }
  772. }