find($id); if ($refund['status'] == 1) { if ($type == 1) { $refund['status'] = $update['status'] = 2; $update['pdate'] = time(); $desc = '退款:审核通过'; } else { $update['status'] = 5; $update['pdate'] = time(); $update['fdate'] = time(); $desc = '退款:审核驳回'; Dever::db('porder/source')->update($refund['order_id'], ['refund_status' => 2]); } $update['audit_desc'] = $info; if ($address_id) { $update['address_id'] = $address_id; } Dever::db('porder/source_refund')->update($refund['id'], $update); if ($update['audit_desc']) { $desc .= '-' . $update['audit_desc']; } Dever::load(\Porder\Lib\Source\Log::class)->up($utype, $uid, $refund['order_id'], $desc); if ($refund['type'] == 2 && $refund['status'] == 2) { # 仅退款 $order = Dever::db('porder/source')->find($refund['order_id']); $this->finish($order, $refund); } } return 'ok'; } # 前台审核退货 public function auditDelivery($id, $type, $info, $utype, $uid) { $refund = Dever::db('porder/source_refund')->find($id); if ($refund['status'] == 3) { if ($type == 1) { $refund['status'] = $update['status'] = 2; $update['delivery_pdate'] = time(); $desc = '退款:审核通过'; } else { $update['status'] = 6; $update['delivery_pdate'] = time(); $update['fdate'] = time(); $desc = '退款:审核驳回'; Dever::db('porder/source')->update($refund['order_id'], ['refund_status' => 2]); } $update['delivery_audit_desc'] = $info; Dever::db('porder/source_refund')->update($refund['id'], $update); if ($update['delivery_audit_desc']) { $desc .= '-' . $update['delivery_audit_desc']; } Dever::load(\Porder\Lib\Source\Log::class)->up($utype, $uid, $refund['order_id'], $desc); if ($refund['status'] == 2) { $order = Dever::db('porder/source')->find($refund['order_id']); $this->finish($order, $refund); } } return 'ok'; } # 买家发货 public function express($order, $refund_id, $delivery_id, $content) { $refund = Dever::db('porder/source_refund')->find($refund_id); if ($refund['status'] == 2) { $update['status'] = 3; $update['ddate'] = time(); $where = ['source_refund_id' => $refund['id']]; $info = Dever::db('porder/source_refund_express')->find($where); if (!$info) { $where['order_id'] = $order['id']; $where['delivery_id'] = $delivery_id; $where['content'] = $content; Dever::db('porder/source_refund_express')->insert($where); Dever::load(\Porder\Lib\Source\Log::class)->up(1, $order['uid'], $order['id'], '退款:买家已发货'); } Dever::db('porder/source_refund')->update($refund['id'], $update); } } # 完成退款 如果是支付订单,原路退回 public function finish($order, $refund) { $refund = Dever::db('porder/source_refund')->find($refund['id']); if ($refund['status'] == 2 || $refund['status'] == 3) { # 查找已退款金额 $history = Dever::db('porder/source_refund')->sum(['order_id' => $order['id'], 'status' => 4], 'cash'); # 更新状态 Dever::db('porder/source_refund')->update($refund['id'], ['status' => 4, 'fdate' => time()]); $score = Dever::load(\Pscore\Lib\Info::class)->get($order['score_id']); # 检测订单是否全都退了 if ($history + $refund['cash'] >= $order['cash']) { Dever::db('porder/source')->update($order['id'], ['status' => 8, 'fdate' => time(), 'refund_status' => 2, 'refund_cash' => $order['cash']]); Dever::load(\Porder\Lib\Source\Log::class)->up(1, $order['uid'], $order['id'], '订单已全额退款'); # 退货 恢复库存 if ($refund['type'] == 1) { Dever::load(\Pstock\Lib\Info::class)->refundAll($order); } } else { # 只退了一部分 $refund_detail = Dever::db('porder/source_refund_detail')->select(['source_refund_id' => $refund['id']]); if ($refund_detail) { foreach ($refund_detail as $k => $v) { Dever::db('porder/source_detail')->update($v['detail_id'], ['refund_cash' => ['+', $v['cash']], 'refund_num' => ['+', $v['num']]]); if ($v['num'] > 0 && $refund['type'] == 1) { # 恢复库存 $detail = Dever::db('porder/source_detail')->find($v['detail_id']); Dever::load(\Pstock\Lib\Info::class)->refund($order, $detail['source_id'], $detail['sku_id'], $v['num']); } } # 重新计算返利 $rebate = Dever::db('porder/rebate')->find(['table' => 'source', 'table_id' => $order['id']]); if ($rebate) { $detail = Dever::db('porder/source_detail')->select(['order_id' => $order['id']]); if ($detail) { $rebate = ['rule' => []]; Dever::db('porder/rebate')->delete(['table' => 'source', 'table_id' => $order['id']]); Dever::db('pscore/user_log')->delete(['relation' => 'source_order_' . $order['id']]); foreach ($detail as $k => $v) { if ($v['pay_cash'] > 0) { $v['pay_cash'] -= $v['refund_cash']; if ($v['pay_cash'] > 0) { $money = Dever::math('mul', $v['pay_cash'], $score['exp']); $rebate = Dever::load(\Pbenefit\Lib\Item::class)->load('rebate')->get($order['uid'], $v['scope'], $money, $rebate['rule']); } } } if ($rebate && $rebate['rule']) { foreach ($rebate['rule'] as $v1) { $v1['table'] = 'source'; $v1['table_id'] = $order['id']; $v1['rebate_rule_id'] = $v1['id']; unset($v1['id']); Dever::db('porder/rebate')->insert($v1); if ($v1['level'] == 0) { # 给自己返利 Dever::load(\Pscore\Lib\Log::class)->action('返利', $v1['score_id'])->add($order['uid'], $v1['name'], $v1['value'], 2, 'source_order_' . $order['id']); } else { # 给上级返利 $parent = Dever::load(\Invite\Lib\Relation::class)->getParent($order['uid'], $v1['level']); if ($parent) { Dever::load(\Pscore\Lib\Log::class)->action('返利', $v1['score_id'])->add($parent['uid'], $v1['name'], $v1['value'], 2, 'source_order_' . $order['id']); } } } } } } } Dever::db('porder/source')->update($order['id'], ['refund_status' => 2, 'refund_cash' => ['+', $refund['cash']]]); Dever::load(\Porder\Lib\Source\Log::class)->up(1, $order['uid'], $order['id'], '订单已部分退款'); } # 开始退款 $cash = $this->getCash($order, $refund['cash'], $history); # 退支付金额 if ($cash['pay_cash'] > 0) { # 走支付退款流程 $sector_id = $place_id = 0; if (class_exists('\\Place')) { $sector_id = Dever::get('Place')->sector['id']; $place_id = Dever::get('Place')->info['id']; } elseif ($muser = Dever::getData('muser')) { $sector_id = $muser['select']['info_id']; $place_id = $muser['select']['data_id']; } $money = Dever::math('mul', $cash['pay_cash'], $score['exp']); $state = Dever::load(\Place\Lib\Account::class)->refund($order['order_num'], $order['pay_money_cash'], $money, $order['order_num'] . '_' . $refund['id'], $sector_id, $place_id, 'source'); print_r($state);die; Dever::db('porder/source_refund')->update($refund['id'], ['pay_status' => 2]); } echo 11;die; # 退余额 if ($cash['wallet_cash'] > 0) { Dever::load(\Pscore\Lib\Log::class)->action('退款', $order['score_id'])->add($order['uid'], '订单号:'.$order['order_num'], $cash['wallet_cash']); } # 退礼品卡 if ($cash['gift_cash'] > 0) { $order['gift_cash'] = $cash['gift_cash']*-1; Dever::load(\Puser\Lib\Gift::class)->use('source', $order, $score); } # 退优惠券 if ($cash['coupon_cash'] > 0) { $order['coupon_cash'] = $cash['coupon_cash']*-1; Dever::load(\Puser\Lib\Coupon::class)->use('source', $order, $score); } } } # 计算退款金额 public function getCash($order, $refund_amount, $history_refunded) { $keys = ['pay_cash', 'wallet_cash', 'gift_cash', 'coupon_cash']; $totals = []; foreach ($keys as $key) { $totals[$key] = $order[$key] ?? 0; } $refund = array_fill_keys($keys, 0); $already = min($history_refunded, array_sum($totals)); $remain = max(0, $refund_amount); if ($remain <= 0) return $refund; foreach ($totals as $type => $amount) { if ($remain <= 0) break; $available = $amount > $already ? $amount - $already : 0; $already = $already > $amount ? $already - $amount : 0; $refund[$type] = min($available, $remain); $remain -= $refund[$type]; } return $refund; } public function up($detail, $order, $utype, $uid, $type, $method, $desc_type, $desc) { $cash = 0; # 计算已退款的金额 $where = ['order_id' => $order['id'], 'status' => 4]; $refund = Dever::db('porder/source_refund')->find($where, ['col' => 'sum(cash) as cash']); if ($refund && $refund['cash']) { $order['cash'] -= $refund['cash']; } if ($method == 2) { if ($detail) { foreach ($detail as $k => $v) { $info = Dever::db('porder/source_detail')->find($v['detail_id']); $info['num'] -= $info['refund_num']; $info['total_cash'] -= $info['refund_cash']; if ($v['cash'] > $info['total_cash']) { Dever::error('退款金额不能大于剩余金额'); } if ($v['num'] > 0 && $v['num'] > $info['num']) { Dever::error('退款数量不能大于剩余数量'); } $cash += $v['cash']; } } else { Dever::error('请选择退款明细'); } } else { $cash = $order['cash']; } $where = ['order_id' => $order['id'], 'refund_status' => 1]; if ($cash > $order['cash']) { Dever::error('退款金额不能大于订单剩余总金额'); } $update = $where; $update['refund_status'] = 2; $update['status'] = ['<', '4']; $refund = Dever::db('porder/source_refund')->find($update); $update['utype'] = $utype; $update['uid'] = $uid; $update['type'] = $type; $update['desc_type'] = $desc_type; $update['cash'] = $cash; $update['desc'] = $desc; $update['status'] = 1; if ($refund) { Dever::error('您有退款进行中,请先处理'); } else { $id = Dever::db('porder/source_refund')->insert($update); if ($id) { Dever::db('porder/source')->update($order['id'], ['refund_status' => 1]); if ($detail) { foreach ($detail as $k => $v) { $v['source_refund_id'] = $id; Dever::db('porder/source_refund_detail')->insert($v); } } $msg = '退款:提交退款申请单'; Dever::load(\Porder\Lib\Source\Log::class)->up($utype, $uid, $order['id'], $msg); } } } # 获取信息 public function getList($order_id) { $refund = Dever::db('porder/source_refund')->select(['order_id' => $order_id]); if ($refund) { foreach ($refund as &$v) { $v = $this->getInfo($v); } } return $refund; } # 获取信息 public function getInfo($info) { print_r($info);die; if ($info['type'] == 1) { $user = Dever::db('puser/info')->find($info['type_id']); } elseif ($info['type'] == 2) { $user = Dever::db('sector/user')->find($info['type_id']); } elseif ($info['type'] == 3) { $user = Dever::db('place/supplier')->find($info['type_id']); } else { $user['name'] = $user['mobile'] = '-'; } $info['type'] = Dever::db('porder/source_log')->value('type', $info); $info['name'] = $user['name']; $info['mobile'] = $user['mobile']; $info['cdate_str'] = date('Y-m-d H:i:s', $info['cdate']); return $info; } }