123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- <?php
- namespace app\common\logic;
- use think\facade\Db;
- use think\facade\Log;
- class Storeorder
- {
- /**
- * 支付订单
- * @param array $order_info
- * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
- * @param string $post
- * @return array
- */
- public function changeOrderStatePay($order_info, $role, $post)
- {
- try {
- $StoreOrder = model('StoreOrder');
- Db::startTrans();
- $predeposit_model = model('predeposit');
- //下单,支付被冻结的充值卡
- $rcb_amount = floatval($order_info['rcb_amount']);
- if ($rcb_amount > 0) {
- $data_pd = [];
- $data_pd['member_id'] = $order_info['buyer_id'];
- $data_pd['member_name'] = $order_info['buyer_name'];
- $data_pd['amount'] = $rcb_amount;
- $data_pd['order_sn'] = $order_info['order_sn'];
- $predeposit_model->changeRcb('order_comb_pay', $data_pd);
- }
- //下单,支付被冻结的预存款
- $pd_amount = floatval($order_info['pd_amount']);
- if ($pd_amount > 0) {
- $data_pd = [];
- $data_pd['member_id'] = $order_info['buyer_id'];
- $data_pd['member_name'] = $order_info['buyer_name'];
- $data_pd['amount'] = $pd_amount;
- $data_pd['order_sn'] = $order_info['order_sn'];
- $predeposit_model->changePd('order_comb_pay', $data_pd);
- }
- //更新订单状态
- $update_order = [];
- $update_order['order_state'] = ORDER_STATE_SUCCESS;
- $update_order['payment_time'] = isset($post['payment_time']) ? strtotime($post['payment_time']) : TIMESTAMP;
- $update_order['payment_code'] = $post['payment_code'];
- $update_order['trade_no'] = $post['trade_no'];
- $update_order['finished_time'] = TIMESTAMP;
- $update = $StoreOrder->edit($update_order, ['id' => $order_info['id']]);
- if (!$update) {
- throw new \think\Exception(lang('ds_common_save_fail'), 10006);
- }
- Db::commit();
- return ds_callback(true, '更新成功');
- } catch (Exception $e) {
- Db::rollback();
- return ds_callback(false, $e->getMessage());
- }
- }
- /**
- * 积分支付
- */
- public function pointPay($order_info, $input, $buyer_info)
- {
- $point_ratio = config('app.point_ratio');
- $point_amount = floatval($buyer_info['point'] / $point_ratio);
- if ($point_amount <= 0)
- return $order_info;
- $order_model = model('StoreOrder');
- $predeposit_model = model('predeposit');
- $order_amount = round($order_info['order_amount'] - $order_info['rcb_amount'] - $order_info['pd_amount'], 2);
- $data_point = [];
- $data_point['member_id'] = $buyer_info['member_id'];
- $data_point['union_id'] = $buyer_info['member_wxunionid'];
- $data_point['member_name'] = $buyer_info['member_name'];
- $data_point['amount'] = $order_amount;
- $data_point['order_sn'] = $order_info['order_sn'];
- if ($point_amount >= $order_amount) {
- //积分立即支付,订单支付完成
- $predeposit_model->changePoint('order_pay', $data_point);
- // 订单状态 置为已支付
- $data_order = [];
- $order_info['order_state'] = $data_order['order_state'] = 40;
- $data_order['payment_time'] = TIMESTAMP;
- $data_order['finished_time'] = TIMESTAMP;
- $data_order['payment_code'] = 'predeposit';
- $order_info['point_amount'] = $data_order['point_amount'] = round($order_info['point_amount'] + ($order_amount * $point_ratio), 2);
- $result = $order_model->edit($data_order, ['id' => $order_info['id']]);
- if (!$result) {
- throw new \think\Exception('订单更新失败', 10006);
- }
- } else {
- //暂冻结预存款,后面还需要 API彻底完成支付
- $data_point['amount'] = $point_amount;
- $predeposit_model->changeRcb('order_freeze', $data_point);
- //预存款支付金额保存到订单
- $data_order = [];
- $order_info['point_amount'] = $data_order['point_amount'] = $order_info['point_amount'] + $point_amount * $point_ratio;
- $result = $order_model->editorder($data_order, ['id' => $order_info['id']]);
- if (!$result) {
- throw new \think\Exception('订单更新失败', 10006);
- }
- }
- return $order_info;
- }
- /**
- * 取消订单
- */
- public function changeOrderStateCancel($order_info)
- {
- $expense = Db::name('sub_card_expense')->where('is_vir', 3)->where('order_id', $order_info['id'])->find();
- if (!empty($expense)) {
- //1.回滚卡片余额
- $cardInfo = Db::name('sub_card')->where('id', $expense['card_id'])->find();
- if (($cardInfo['balance'] + $order_info['deduction_amount']) == $cardInfo['worth']) {
- $cardStatus = 1;
- } else {
- $cardStatus = 2;
- }
- $cardUpdate = [
- 'card_status' => $cardStatus,
- 'balance' => $cardInfo['balance'] + $order_info['deduction_amount'],
- 'freeze' => $cardInfo['freeze'] - $order_info['deduction_amount'],
- 'update_time' => time(),
- 'used_count' => $cardInfo['used_count'] - 1,
- ];
- $cardRes = Db::name('sub_card')->where('id', $expense['card_id'])->update($cardUpdate);
- if ($cardRes) {
- //如果卡的数据恢复成功了 删除卡的消费记录
- Db::name('sub_card_expense')->where('id', $expense['id'])->update(['expense_status' => 2]);
- }
- }
- //更改订单状态
- $TicketOrder = model('StoreOrder');
- $TicketOrder->where('id', $order_info['id'])->update(['order_state' => 0]);
- Log::info('到店付款订单取消,id:' . $order_info['id'] . ',时间:' . date('Y-m-d H:i:s'));
- }
- }
|