123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- <?php namespace Porder\Lib\Source;
- use Dever;
- class Refund
- {
- # 前台审核
- public function audit($id, $type, $info, $address_id, $utype, $uid)
- {
- $refund = Dever::db('porder/source_refund')->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;
- }
- }
|