'申请审核中', self::REFUND_PASS=>'申请通过', self::REFUND_JI=>'用户寄回', self::REFUND_RUNNING=>'售后中', self::REFUND_REFUNDING=>'退款中', self::REFUND_REJECT=>'申请驳回', self::REFUND_CANCEL=>'已取消', self::REFUND_OVER=>'处理完成', ]; /** * @return string[] */ public static function getRefundStatus(): array { return self::$refundStatus; } const REFUND_TYPE_MONEY=1; const REFUND_TYPE_ALL=2; const REFUND_TYPE_HHBX=5; public static $refundTypes=[ self::REFUND_TYPE_MONEY=>'仅退款', self::REFUND_TYPE_ALL=>'退款退货', self::REFUND_TYPE_HHBX=>'换货/维修', ]; public static $refundTypeGoods=[self::REFUND_TYPE_ALL,]; public static $refundTypeMoney=[self::REFUND_TYPE_MONEY,self::REFUND_TYPE_ALL]; const REASON_QU=1; public static $reasons=[ self::REASON_QU=>'质量问题', 2=>'7天无理由退货(退回运费需客户承担)', 3=>'协商一致退款', 4=>'快递运输破损', 5=>'其他', ]; const TH_TYPE_NONE=0; const TH_TYPE_SELF_SEND=1; const TH_TYPE_SELF_FEE=2; const TH_TYPE_FREE=3; public static $goodsTypes=[ self::TH_TYPE_NONE=>'无需退货', self::TH_TYPE_SELF_SEND=>'自行邮寄', self::TH_TYPE_SELF_FEE=>'拍维修费', self::TH_TYPE_FREE=>'一年以内免费保修', ]; protected $autoWriteTimestamp=true; public function orderInfo(){ return $this->belongsTo(OrderInfo::class); } public function orders(){ return $this->belongsTo(Orders::class,'order_id'); } public function user(){ return $this->belongsTo(User::class); } public function allowCancel(){ return in_array($this['refund_status'],[ self::REFUND_ING, ]); } public function allowApply(){ return in_array($this->refund_status,[ self::REFUND_REJECT, self::REFUND_CANCEL, ]); } public function allowEdit(){ return in_array($this->refund_status,[ self::REFUND_ING, ]); } public function makeCancel(){ $this['refund_status']=self::REFUND_CANCEL; $this->save(); } #根据订单状态选择售后 public static function makeRefundConfig(OrderInfo $orderInfo,$inject=true){ $order=$orderInfo->orders; $refundConfig=[]; if($orderInfo->refund && $orderInfo->refund->allowApply()) { #未发货 if (in_array($order['status'], [$order::S_WAIT_SEND, $order::S_WAIT_REC])) { $refundConfig['refund_type'] = Arr::only(self::getRefundTypes(), [ self::REFUND_TYPE_MONEY, self::REFUND_TYPE_ALL, ]); $refundConfig['type'] = [ self::REFUND_TYPE_MONEY => null, self::REFUND_TYPE_ALL => Arr::only(self::getGoodsTypes(), [ self::TH_TYPE_SELF_SEND, ]) ]; $refundConfig['req_order'] = [ self::REFUND_TYPE_MONEY=>false, self::REFUND_TYPE_ALL=>false, ]; $refundConfig['reason'] = array_values(Refund::getReasons()); list($amount_single, $amount_install_single) = RefundService::setOrderInfo($orderInfo, $orderInfo['num'], $orderInfo['num_install'])->amount(); $refundConfig['amount_single'] = $amount_single; $refundConfig['amount_install_single'] = $amount_install_single; $refundConfig['num'] = $orderInfo['num']; $refundConfig['num_install'] = $orderInfo['num_install']; } #已发货 /*elseif(in_array($order['status'],[$order::S_WAIT_REC,$order::S_OVER])){ #七天内可以退货退款 if(time()<$order['send_time']+7*86400){ $refundConfig['refund_type']=[ self::REFUND_TYPE_ALL=>'退款退货', ]; $refundConfig['type']=[ self::TH_TYPE_FREE=>'自行邮寄', ]; $refundConfig['reason']=array_values(Refund::getReasons()); $refundConfig['req_amount']=1; $refundConfig['amount']=RefundService::setOrderInfo($orderInfo,$orderInfo['num'],$orderInfo['num_install'])->amount(true); $refundConfig['req_order']=0; $refundConfig['num']=$orderInfo['num']; $refundConfig['num_install']=$orderInfo['num_install']; } #只能换货保修 else{ $refundConfig['refund_type']=[ self::REFUND_TYPE_HHBX=>'换货保修', ]; $refundConfig['req_order']=0; #一年内 if(time()'一年以内免费保修', ]; }else{ $refundConfig['type']=[ self::TH_TYPE_SELF_FEE=>'拍维修费', ]; $refundConfig['req_order']=1; $refundConfig['req_order_goods']=Goods::getFixGoods(); } $refundConfig['reason']=array_values(Refund::getReasons()); $refundConfig['req_amount']=0; } }*/ elseif ($order['status'] == $order::S_OVER) { $gtYear=Carbon::now()->gt(Carbon::createFromTimestamp($order->send_time)->addYear()); $refundConfig['refund_type'] = Arr::only(self::getRefundTypes(), [ self::REFUND_TYPE_ALL, self::REFUND_TYPE_HHBX, ]); $refundConfig['type'] = [ self::REFUND_TYPE_ALL => Arr::only(self::getGoodsTypes(), [ self::TH_TYPE_SELF_SEND, ]), self::REFUND_TYPE_HHBX => Arr::only(self::getGoodsTypes(), [ self::TH_TYPE_SELF_SEND, ]), ]; $refundConfig['req_order'] = [ self::REFUND_TYPE_ALL=>false, self::REFUND_TYPE_HHBX=>$gtYear, ]; $refundConfig['reason'] = array_values(Refund::getReasons()); list($amount_single, $amount_install_single) = RefundService::setOrderInfo($orderInfo, $orderInfo['num'], $orderInfo['num_install'])->amount(); $refundConfig['amount_single'] = $amount_single; $refundConfig['amount_install_single'] = $amount_install_single; $refundConfig['num'] = $orderInfo['num']; $refundConfig['num_install'] = $orderInfo['num_install']; $refundConfig['req_order_goods']=Goods::getFixGoods(); } } if(empty($refundConfig)){ $refundConfig=null; } if($inject){ $orderInfo['refund_config']=$refundConfig; } return $refundConfig; } public function allowAudit(){ return $this['refund_status']==self::REFUND_ING; } /** * @return string[] */ public static function getGoodsTypes(): array { return self::$goodsTypes; } #退款相关 /** * 退款金额 */ public function getRefundAmount(){ return $this['amount']; } public function refundResult($succ,$remark=''){ if(is_bool($succ)){ $this['pay_status']=$succ?1:2; }else{ $this['pay_status']=$succ; } $this['pay_remark']=$remark; $this->save(); } public function isRefundMoney(){ return in_array($this['refund_type'],self::getRefundTypeMoney()); } #end public function makeAudit($pass){ $this['refund_status']=$pass?self::REFUND_PASS:self::REFUND_REJECT; $refundMoney=false; if($pass){ #如果退货 if(in_array($this['refund_type'],self::getRefundTypeGoods())){ $this->orderInfo()->update(['is_return_goods'=>1]); } #如果退款,执行退款 if(in_array($this['refund_type'],self::getRefundTypeMoney())){ $this['order_no']=order_no('TK'); $refundMoney=true; } } if(!$this->save()){ throw_user('保存失败'); } if($refundMoney){ $payment=$this->orders->payment??null; if($payment){ $refund=new OrderRefundService(); $refund->setPayment($payment); $refund->setRefund($this); $refund->setBody("订单[{$this->orders->order_no}]退款"); $refund->pay(); } } SiteMsg::sendMsg( $pass?SiteMsg::TYPE_ORDER_REFUND_PASS:SiteMsg::TYPE_ORDER_REFUND_REJECT, $this->user ); #总订单 $order=$this->orders; if($order && $order->statusfilterHasUnRefund() ->find(); if(!$has){ $order->makeCancel(); } } } /** * @return string[] */ public static function getReasons(): array { $reasons=self::$reasons; $arr=[]; foreach ($reasons as $key=>$value){ $arr[$key]=compact('key','value'); } return $arr; } /** * @return string[] */ public static function getRefundBys(): array { $obj=self::$goodsTypes; $arr=[]; foreach ($obj as $key=>$value){ $arr[$key]=compact('key','value'); } return $arr; } /** * @return string[] */ public static function getRefundTypes(): array { return self::$refundTypes; } /** * @return int[] */ public static function getRefundTypeGoods(): array { return self::$refundTypeGoods; } /** * @return int[] */ public static function getRefundTypeMoney(): array { return self::$refundTypeMoney; } /** * 售后中及已售后的 * @param Query $query * @param null $status 1进行中2已完成 */ public function scopeFilterRefund(Query $query,$status=null){ if(is_null($status)) { $query->whereBetween("{$this->getTable()}.refund_status", [self::REFUND_ING, self::REFUND_PASS]); }elseif ($status==1){ $query->where("{$this->getTable()}.refund_status", self::REFUND_ING); }elseif ($status==2){ $query->where("{$this->getTable()}.refund_status", self::REFUND_PASS); } } /** * 投诉类型的售后 * @param Query $query */ public function scopeFilterTs(Query $query){ $query->where("{$this->getTable()}.reason1",self::REASON_QU); } public function getTimelineAttr(){ $arr=[ [ 'title'=>'提交申请', 'time' =>Carbon::createFromTimestamp($this->create_time)->toDateTimeString(), ], ]; if($this->refund_status==self::REFUND_REJECT){ $arr[]=[ 'title'=>'审核不通过', 'time' =>Carbon::createFromTimestamp($this->audit_time)->toDateTimeString(), ]; $arr[]=[ 'title'=>'完成', 'time' =>Carbon::createFromTimestamp($this->audit_time)->toDateTimeString(), ]; }else{ $arr[]=[ 'title'=>'申请审核', 'time' =>Carbon::createFromTimestamp($this->audit_time)->toDateTimeString(), ]; switch ($this->refund_type){ case self::REFUND_TYPE_MONEY: $arr[]=[ 'title'=>'提交申请', 'time' =>Carbon::createFromTimestamp($this->create_time)->toDateTimeString(), ]; break; } } return $arr; } protected static function init() { self::beforeInsert(function (self $refund){ $refund['refund_status']=self::REFUND_ING; }); self::afterUpdate(function (self $refund){ if($refund->refund_status==self::REFUND_PASS && $refund->isRefundMoney()){ Transaction::addTransaction($refund); } }); } }