Storeorder.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. namespace app\common\logic;
  3. use think\facade\Db;
  4. use think\facade\Log;
  5. class Storeorder
  6. {
  7. /**
  8. * 支付订单
  9. * @param array $order_info
  10. * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
  11. * @param string $post
  12. * @return array
  13. */
  14. public function changeOrderStatePay($order_info, $role, $post)
  15. {
  16. try {
  17. $StoreOrder = model('StoreOrder');
  18. Db::startTrans();
  19. $predeposit_model = model('predeposit');
  20. //下单,支付被冻结的充值卡
  21. $rcb_amount = floatval($order_info['rcb_amount']);
  22. if ($rcb_amount > 0) {
  23. $data_pd = [];
  24. $data_pd['member_id'] = $order_info['buyer_id'];
  25. $data_pd['member_name'] = $order_info['buyer_name'];
  26. $data_pd['amount'] = $rcb_amount;
  27. $data_pd['order_sn'] = $order_info['order_sn'];
  28. $predeposit_model->changeRcb('order_comb_pay', $data_pd);
  29. }
  30. //下单,支付被冻结的预存款
  31. $pd_amount = floatval($order_info['pd_amount']);
  32. if ($pd_amount > 0) {
  33. $data_pd = [];
  34. $data_pd['member_id'] = $order_info['buyer_id'];
  35. $data_pd['member_name'] = $order_info['buyer_name'];
  36. $data_pd['amount'] = $pd_amount;
  37. $data_pd['order_sn'] = $order_info['order_sn'];
  38. $predeposit_model->changePd('order_comb_pay', $data_pd);
  39. }
  40. //更新订单状态
  41. $update_order = [];
  42. $update_order['order_state'] = ORDER_STATE_SUCCESS;
  43. $update_order['payment_time'] = isset($post['payment_time']) ? strtotime($post['payment_time']) : TIMESTAMP;
  44. $update_order['payment_code'] = $post['payment_code'];
  45. $update_order['trade_no'] = $post['trade_no'];
  46. $update_order['finished_time'] = TIMESTAMP;
  47. $update = $StoreOrder->edit($update_order, ['id' => $order_info['id']]);
  48. if (!$update) {
  49. throw new \think\Exception(lang('ds_common_save_fail'), 10006);
  50. }
  51. Db::commit();
  52. return ds_callback(true, '更新成功');
  53. } catch (Exception $e) {
  54. Db::rollback();
  55. return ds_callback(false, $e->getMessage());
  56. }
  57. }
  58. /**
  59. * 积分支付
  60. */
  61. public function pointPay($order_info, $input, $buyer_info)
  62. {
  63. $point_ratio = config('app.point_ratio');
  64. $point_amount = floatval($buyer_info['point'] / $point_ratio);
  65. if ($point_amount <= 0)
  66. return $order_info;
  67. $order_model = model('StoreOrder');
  68. $predeposit_model = model('predeposit');
  69. $order_amount = round($order_info['order_amount'] - $order_info['rcb_amount'] - $order_info['pd_amount'], 2);
  70. $data_point = [];
  71. $data_point['member_id'] = $buyer_info['member_id'];
  72. $data_point['union_id'] = $buyer_info['member_wxunionid'];
  73. $data_point['member_name'] = $buyer_info['member_name'];
  74. $data_point['amount'] = $order_amount;
  75. $data_point['order_sn'] = $order_info['order_sn'];
  76. if ($point_amount >= $order_amount) {
  77. //积分立即支付,订单支付完成
  78. $predeposit_model->changePoint('order_pay', $data_point);
  79. // 订单状态 置为已支付
  80. $data_order = [];
  81. $order_info['order_state'] = $data_order['order_state'] = 40;
  82. $data_order['payment_time'] = TIMESTAMP;
  83. $data_order['finished_time'] = TIMESTAMP;
  84. $data_order['payment_code'] = 'predeposit';
  85. $order_info['point_amount'] = $data_order['point_amount'] = round($order_info['point_amount'] + ($order_amount * $point_ratio), 2);
  86. $result = $order_model->edit($data_order, ['id' => $order_info['id']]);
  87. if (!$result) {
  88. throw new \think\Exception('订单更新失败', 10006);
  89. }
  90. } else {
  91. //暂冻结预存款,后面还需要 API彻底完成支付
  92. $data_point['amount'] = $point_amount;
  93. $predeposit_model->changeRcb('order_freeze', $data_point);
  94. //预存款支付金额保存到订单
  95. $data_order = [];
  96. $order_info['point_amount'] = $data_order['point_amount'] = $order_info['point_amount'] + $point_amount * $point_ratio;
  97. $result = $order_model->editorder($data_order, ['id' => $order_info['id']]);
  98. if (!$result) {
  99. throw new \think\Exception('订单更新失败', 10006);
  100. }
  101. }
  102. return $order_info;
  103. }
  104. /**
  105. * 取消订单
  106. */
  107. public function changeOrderStateCancel($order_info)
  108. {
  109. $expense = Db::name('sub_card_expense')->where('is_vir', 3)->where('order_id', $order_info['id'])->find();
  110. if (!empty($expense)) {
  111. //1.回滚卡片余额
  112. $cardInfo = Db::name('sub_card')->where('id', $expense['card_id'])->find();
  113. if (($cardInfo['balance'] + $order_info['deduction_amount']) == $cardInfo['worth']) {
  114. $cardStatus = 1;
  115. } else {
  116. $cardStatus = 2;
  117. }
  118. $cardUpdate = [
  119. 'card_status' => $cardStatus,
  120. 'balance' => $cardInfo['balance'] + $order_info['deduction_amount'],
  121. 'freeze' => $cardInfo['freeze'] - $order_info['deduction_amount'],
  122. 'update_time' => time(),
  123. 'used_count' => $cardInfo['used_count'] - 1,
  124. ];
  125. $cardRes = Db::name('sub_card')->where('id', $expense['card_id'])->update($cardUpdate);
  126. if ($cardRes) {
  127. //如果卡的数据恢复成功了 删除卡的消费记录
  128. Db::name('sub_card_expense')->where('id', $expense['id'])->update(['expense_status' => 2]);
  129. }
  130. }
  131. //更改订单状态
  132. $TicketOrder = model('StoreOrder');
  133. $TicketOrder->where('id', $order_info['id'])->update(['order_state' => 0]);
  134. Log::info('到店付款订单取消,id:' . $order_info['id'] . ',时间:' . date('Y-m-d H:i:s'));
  135. }
  136. }