// +---------------------------------------------------------------------- declare (strict_types = 1); namespace app\store\model; use app\common\enum\goods\GoodsType; use app\common\enum\order\refund\RefundType; use app\common\model\user\CommissionsDetail; use app\common\service\Order as OrderService; use app\store\model\member\GoldRice; use app\store\model\User as UserModel; use app\common\model\OrderRefund as OrderRefundModel; use app\common\enum\order\refund\RefundType as RefundTypeEnum; use app\common\enum\order\refund\AuditStatus as AuditStatusEnum; use app\common\enum\order\refund\RefundStatus as RefundStatusEnum; use app\common\service\Message as MessageService; use app\common\service\order\Refund as RefundService; use app\common\enum\order\refund\FinanceRefundStatus as FinanceRefundStatusEnum; use app\common\model\OrderGoods as OrderGoodsModel; use app\common\model\Provider as ProviderModel; use app\store\model\OrderRefundAddress; use app\common\model\order\RefundHis; // use app\common\service\order\Refund as RefundService; use app\common\service\store\User as StoreUserService; use app\api\model\card\UserRiceCard as UserRiceCardModel; use app\api\model\card\UserRiceCardConsume; use app\api\model\card\UserRiceCard; use app\common\service\goods\source\Factory as FactoryStock; /** * 售后单模型 * Class OrderRefund * @package app\api\model */ class OrderRefund extends OrderRefundModel { // /** // * 售后单状态文字描述 // * @param $value // * @param $data // * @return string // */ public function getStateTextAttr($value,$data){ if(!isset($data['delivery_type'])){ return ''; } if($data['delivery_type']==10){ if($data['type']== RefundTypeEnum::COMPLETE){ if($data['status']==RefundStatusEnum::COMPLETED){ return '已退款'; } // 已取消 if ($data['status'] == RefundStatusEnum::CANCELLED) { return '用户撤销'; } if($data['status']==RefundStatusEnum::CLOSE){ return '已关闭售后单'; } if (isset($data['audit_status'])&&$data['audit_status'] == AuditStatusEnum::WAIT) { return '待专员审核'; } if(isset($data['audit_status'])&&$data['audit_status'] == AuditStatusEnum::REJECTED) { return '不同意'; } } //退货退款 if($data['type'] == RefundTypeEnum::RETURN){ if($data['status']==RefundStatusEnum::CANCELLED){ return '用户撤销'; } if($data['status']==RefundStatusEnum::CLOSE){ if($data['close_username']!=''){ return '已关闭售后单'; }else{ return '用户超时未退货,系统自动关闭售后单'; } } if($data['status']==RefundStatusEnum::COMPLETED){ return '已退款'; } if($data['status']==RefundStatusEnum::REJECTED){ return '不同意'; } if(isset($data['audit_status'])&&$data['audit_status'] == AuditStatusEnum::WAIT) { return '待专员审核'; } if(isset($data['audit_status'])&&$data['audit_status']==AuditStatusEnum::REVIEWED&&$data['audit_status_zg']==AuditStatusEnum::WAIT){ return '待主管审核'; } if(isset($data['audit_status_zg'])&&$data['audit_status_zg']==AuditStatusEnum::REVIEWED&&$data['is_user_send']==0){ return '待买家退货'; } if(isset($data['is_user_send'])&&$data['is_user_send']==1&&isset($data['is_receipt'])&&$data['is_receipt']==0){ return '待仓库收货'; } if(isset($data['is_receipt'])&&$data['is_receipt']==1&&isset($data['finance_refund'])&&$data['finance_refund']==0){ return '待退款'; } } } //自提售后单 if($data['delivery_type']==20){ if($data['hx_status']==10){ if($data['audit_status']==AuditStatusEnum::REVIEWED&&$data['finance_refund']==10){ return '已退款'; } } if($data['hx_status']==20){ // if($data['status']==RefundStatusEnum::CANCELLED){ // return '用户撤销'; // } if($data['status']==RefundStatusEnum::CLOSE&&$data['audit_status']==AuditStatusEnum::WAIT){ return '用户撤销'; } if($data['audit_status']==AuditStatusEnum::REJECTED&&$data['status']==RefundStatusEnum::CLOSE){ return '已关闭'; } if($data['audit_status']==AuditStatusEnum::WAIT){ return '待门店审核'; } if($data['audit_status']==AuditStatusEnum::REVIEWED&&$data['finance_refund']==0){ return '待退款'; } } if($data['status']==RefundStatusEnum::COMPLETED){ if($data['finance_refund']==10){ return '已退款'; } } } return '-'; } /** * 获取售后单列表 * @param array $param * @return mixed */ public function getList(array $param = []) { // 检索查询条件 $filter = $this->getFilter($param); // 获取列表数据 return $this->alias('refund') ->field('refund.*, order.order_no') ->with(['orderGoods.image', 'orderGoodsAll.image', 'orderData', 'user']) ->join('order', 'order.order_id = refund.order_id') ->join('user', 'user.user_id = order.user_id') ->leftJoin('orderGoods', 'orderGoods.order_goods_id = refund.order_goods_id') ->leftJoin('provider', 'provider.provider_id = orderGoods.provider_id') ->where($filter) ->order(['refund.create_time' => 'desc', 'refund.' . $this->getPk()]) ->paginate(15)->each(function($e){ $e['audit_text'] = $this->getAuditText($e); if (!$e['order_goods_id']) { // 整单退款 $orderGoods = $e['orderGoodsAll']; } else { $e['orderGoods']['total_num'] = $e['goods_num']; $orderGoods = [$e['orderGoods']]; } unset($e['orderGoods'], $e['orderGoodsAll']); $e['orderGoods'] = $orderGoods; }); } //审核状态 public function getAuditText($e){ $audit_text = '--'; if($e['delivery_type']==10){ if($e['audit_status'] == AuditStatusEnum::WAIT){ //待专员审核 $audit_text = '待专员审核'; } elseif($e['audit_status'] == AuditStatusEnum::REJECTED){ //专员已拒绝 $audit_text = '专员已拒绝'; } else{//专员已同意 if($e['audit_status_zg'] == AuditStatusEnum::WAIT){ // 待主管员审核 $audit_text = '专员已同意'; } elseif($e['audit_status_zg'] == AuditStatusEnum::REJECTED){ // 主管已拒绝 $audit_text = '主管已拒绝'; }else{//主管已同意 if($e['is_receipt'] == 1) { //待主管员审核 $audit_text = '确认仓库收货'; }else{ $audit_text = '主管已同意'; } } } if($e['status']==RefundStatusEnum::COMPLETED){ if($e['finance_refund']==10&&$e['type']==RefundTypeEnum::COMPLETE){ $audit_text = '已同意'; }else{ $audit_text = '财务已退款'; } } } //门店自提 if($e['delivery_type']==20){ if($e['hx_status']==10){ if($e['audit_status']==AuditStatusEnum::REVIEWED){ $audit_text = '门店已同意'; } } if($e['hx_status']==20){ // if($e['status']==RefundStatusEnum::CANCELLED){ // $audit_text = '用户撤销'; // } if($e['status']==RefundStatusEnum::CLOSE&&$e['audit_status']==AuditStatusEnum::WAIT){ return '用户撤销'; } if($e['audit_status']==AuditStatusEnum::WAIT){ $audit_text = '待门店审核'; } if($e['audit_status']==AuditStatusEnum::REVIEWED){ $audit_text = '门店已同意'; } if($e['audit_status']==AuditStatusEnum::REJECTED){ $audit_text = '门店已拒绝'; } } if($e['status']==RefundStatusEnum::COMPLETED){ if($e['finance_refund']==10){ $audit_text = '财务已退款'; } } } return $audit_text; } /** * 获取售后单详情 * @param int $orderRefundId * @return OrderRefund|false|null */ public function getDetail(int $orderRefundId) { $detail = static::detail($orderRefundId, [ 'orderData', 'orderGoods.image', 'orderGoodsAll.image', 'express', 'address', 'user' ]); if (empty($detail)) return false; $orderGoodsIds = $zengpinOrderGoods = []; $count = 0; $count2 = 0; if (!$detail['order_goods_id']) { // 整单退款 $orderGoods = $detail['orderGoodsAll']; foreach($orderGoods as &$goods){ $goods['refund_total_num'] = $goods['total_num']; } if($detail['type']!=RefundType::COMPLETE) { //获取整单退款的所以赠品 $orderGoodsIds = OrderGoodsModel::with(['image']) ->where('order_id', $detail['order_id']) ->where('goods_type', GoodsType::GIFT) ->column('order_goods_id'); } } else { $detail['orderGoods']['refund_total_num'] = $detail['goods_num']; $orderGoods = [$detail['orderGoods']]; if($detail['type']!=RefundType::COMPLETE) { if($detail['orderGoods']['full_send_activity_id']>0){//如果参与了满就送活动 $checkRefund = RefundService::checkRefund($detail['order_id'],$detail['order_goods_id'],$detail['refund_money']); if($checkRefund){//获取满就送的所有赠品 $ids = OrderGoodsModel::with(['image']) ->where('goods_type',GoodsType::GIFT) ->where('order_id',$detail['order_id']) ->where('master_order_goods_id',0) ->column('order_goods_id'); $orderGoodsIds = array_merge($orderGoodsIds,$ids); } } if($detail['orderGoods']['mj_send_activity_id']>0){//如果参与了满件送活动 $checkRefund = RefundService::checkMjRefund($detail['order_id'],$detail['order_goods_id'],$detail['goods_num']); if($checkRefund){//获取满件送的赠品 $count = $checkRefund; $ids = OrderGoodsModel::with(['image']) ->where('goods_type',GoodsType::GIFT) ->where('order_id',$detail['order_id']) ->where('master_order_goods_id',$detail['order_goods_id']) ->column('order_goods_id'); $orderGoodsIds = array_merge($orderGoodsIds,$ids); } } if($detail['orderGoods']['qc_send_activity_id']>0){//如果参与了全场满件送活动 $checkRefund = RefundService::checkQcMjRefund($detail['order_id'],$detail['order_goods_id'],$detail['goods_num']); if($checkRefund){//获取全场满件送的赠品 $count2 = $checkRefund; $ids = OrderGoodsModel::with(['image']) ->where('goods_type',GoodsType::GIFT) ->where('order_id',$detail['order_id']) ->where('master_order_goods_id',0) ->column('order_goods_id'); $orderGoodsIds = array_merge($orderGoodsIds,$ids); } } } } unset($detail['orderGoods'], $detail['orderGoodsAll']); $detail['orderGoods'] = $orderGoods; if($detail['type']!=RefundType::COMPLETE) { // $orderGoodsIds = array_column(gettype($orderGoods)=='object'?$orderGoods->toArray():$orderGoods, 'order_goods_id'); $zengpinOrderGoods = OrderGoodsModel::with(['image'])->where('order_goods_id', 'in', $orderGoodsIds)->select()->each(function ($item) use ($count,$count2) { $item['full_send_activity'] = null; //添加满就送活动信息 if ($item->is_full_send == 1) { $item['full_send_activity'] = \app\store\model\fullsend\FullSendActivity::where('id', $item->full_send_activity_id) ->field('name,code,start_time,end_time,status,"满就送" as type')->find(); } //添加满件送活动信息 $item['mj_send_activities'] = null; if ($item->is_mj_send == 1) { $item['total_num'] = $count; $item['mj_send_activities'] = \app\store\model\mj\MjSendActivity::where('id', $item->mj_send_activity_id) ->field('name,code,start_time,end_time,status,"满件送" as type')->find(); } //添加全场满件送活动信息 $item['qc_send_activities'] = null; if ($item->is_qc_send_send == 1) { $item['total_num'] = $count2; $item['qc_send_activities'] = \app\store\model\qc\QcMjSendActivity::where('id', $item->qc_send_activity_id) ->field('name,code,start_time,end_time,status,"全场满件送" as type')->find(); } }); } $detail['zengpinOrderGoods'] = $zengpinOrderGoods; return $detail; } /** * 检索查询条件 * @param array $param * @return array */ private function getFilter(array $param = []): array { // 默认查询条件 $params = $this->setQueryDefaultValue($param, [ 'searchType' => '', // 关键词类型 (10订单号 20会员昵称 30会员ID) 'searchValue' => '', // 关键词内容 'refundType' => -1, // 售后类型 'refundStatus' => -1, // 售后单状态 'betweenTime' => [], // 申请时间 'delivery_type' =>-1 //配送方式(10快递配送 20门店自提) ]); // 检查查询条件 $filter = []; //配送方式 (10快递配送 20门店自提) isset($params['delivery_type'])&&$params['delivery_type']>-1 && $filter[] = ['refund.delivery_type', '=', (int)$params['delivery_type']]; // 售后单编号 !empty($params['refund_number']) && $filter[] = ['refund.refund_number', 'like', '%'.$params['refund_number'].'%']; // 订单编号 !empty($params['order_no']) && $filter[] = ['order.order_no', 'like', '%'.$params['order_no'].'%']; // 供应商名称 !empty($params['provider_name']) && $filter[] = ['provider.provider_name', 'like', '%'.$params['provider_name'].'%']; // 申请人昵称 !empty($params['nick_name']) && $filter[] = ['user.nick_name', 'like', '%'.$params['nick_name'].'%']; // 用户ID !empty($params['user_id']) && $filter[] = ['refund.user_id', '=', (int)$params['user_id']]; //手机号码 !empty($params['mobile']) && $filter[] = ['user.mobile', 'like', "%{$params['mobile']}%"]; // 订单时间 if (!empty($params['betweenTime'])) { $times = between_time($params['betweenTime']); $filter[] = ['refund.create_time', '>=', $times['start_time']]; $filter[] = ['refund.create_time', '<', $times['end_time'] + 86400]; } // 售后类型 isset($params['type']) && $params['type'] > -1 && $filter[] = ['refund.type', '=', (int)$params['type']]; // 售后状态 if(isset($params['refund_status']) && $params['refund_status'] > -1){ $this->statusValue($params['refund_status'],$filter); } // $params['refundStatus'] > -1 && $filter[] = ['refund.status', '=', (int)$params['refundStatus']]; return $filter; } private function statusValue($refundStatus,&$filter){ switch ($refundStatus){ case 0://待专员审核 $filter[] = ['refund.status', '=', RefundStatusEnum::NORMAL]; //进行中 $filter[] = ['refund.audit_status', '=', AuditStatusEnum::WAIT]; //等待专员审核 break; case 1://已退款 $filter[] = ['refund.status', '=', RefundStatusEnum::COMPLETED]; //已完成 break; case 2://用户撤销,用户超时未退货,系统自动关闭售后单 $filter[] = ['refund.status', 'in', [RefundStatusEnum::CANCELLED,RefundStatusEnum::CLOSE]]; //已取消 $filter[] = ['refund.close_username', '=', '']; break; // case 3://用户超时未退货,系统自动关闭售后单 // $filter[] = ['refund.status', '=', RefundStatusEnum::CLOSE]; //已关闭 // $filter[] = ['refund.close_username', '=', '']; //已关闭 // break; case 9://后台人员已关闭售后单 $filter[] = ['refund.status', '=', RefundStatusEnum::CLOSE]; //已关闭 $filter[] = ['refund.close_username', '<>', '']; //已关闭 break; case 4://不同意 $filter[] = ['refund.status', '=', RefundStatusEnum::REJECTED]; //已拒绝 break; case 5://待主管审核 $filter[] = ['refund.status', '=', RefundStatusEnum::NORMAL]; //进行中 $filter[] = ['refund.audit_status', '=', AuditStatusEnum::REVIEWED]; //专员已审核通过 $filter[] = ['refund.audit_status_zg', '=', AuditStatusEnum::WAIT]; //主管待审核 break; case 6://待买家退货 $filter[] = ['refund.status', '=', RefundStatusEnum::NORMAL]; //进行中 $filter[] = ['refund.audit_status', '=', AuditStatusEnum::REVIEWED]; //专员已审核通过 $filter[] = ['refund.audit_status_zg', '=', AuditStatusEnum::REVIEWED]; //主管已审核通过 $filter[] = ['refund.is_user_send', '=', 0]; //用户未发货 break; case 7://待仓库收货 $filter[] = ['refund.status', '=', RefundStatusEnum::NORMAL]; //进行中 $filter[] = ['refund.audit_status', '=', AuditStatusEnum::REVIEWED]; //专员已审核通过 $filter[] = ['refund.audit_status_zg', '=', AuditStatusEnum::REVIEWED]; //主管已审核通过 $filter[] = ['refund.is_user_send', '=', 1]; //用户已发货 $filter[] = ['refund.is_receipt', '=', 0]; //仓库未收货 break; case 8://待退款 $filter[] = ['refund.status', '=', RefundStatusEnum::NORMAL]; //进行中 $filter[] = ['refund.audit_status', '=', AuditStatusEnum::REVIEWED]; //专员已审核通过 $filter[] = ['refund.audit_status_zg', '=', AuditStatusEnum::REVIEWED]; //主管已审核通过 $filter[] = ['refund.is_user_send', '=', 1]; //用户已发货 $filter[] = ['refund.is_receipt', '=', 1]; //仓库已收货 $filter[] = ['refund.finance_refund', '=', 0]; //财务未退款 break; } return $filter; } /** * 专员审核 * @param array $data * @return bool */ public function audit(array $data): bool { if ($data['audit_status'] == AuditStatusEnum::REJECTED && empty($data['refuse_desc'])) { // $this->error = '请输入拒绝原因'; // return false; } if ($data['audit_status'] == AuditStatusEnum::REJECTED){ $data['status'] = RefundStatusEnum::REJECTED; } // if ($data['audit_status'] == AuditStatusEnum::REVIEWED && empty($data['address_id'])) { // $this->error = '请选择退货地址'; // return false; // } $this->transaction(function () use ($data) { $user = StoreUserService::getLoginInfo(); $real_name = $user['user']['real_name']??''; $order_refund_id = (int)$this['order_refund_id']; //退货退款 if($this['type'] == RefundTypeEnum::RETURN){ if ($data['audit_status'] == AuditStatusEnum::REVIEWED) { $data['status'] = 0; $address = OrderRefundAddress::where("order_refund_id",$order_refund_id)->find(); if(empty($address)){ $orderGoods = OrderGoodsModel::where('order_goods_id',$this['order_goods_id'])->find(); $provider_id = (int)$orderGoods['provider_id']; (new OrderRefundAddress())->addProviderAddress($order_refund_id, $provider_id); } } //专员拒绝 写一个协商记录 if($data['audit_status'] == AuditStatusEnum::REJECTED){ $json_str = json_encode(["平台已拒绝","退款类型:退货退款","申请原因:".$this['apply_desc'],"退款说明:".$this['apply_detail_desc']]); $his_type = 3; $name = '公明腊肠官方体验商城'; (new RefundHis())->add($this['order_refund_id'],$name,$his_type,$json_str,$this['images'],$real_name,'专员拒绝'); }else{ $json_str = json_encode([""]); $his_type = 0;//这个类型不在前台显示 $name = ''; (new RefundHis())->add($this['order_refund_id'],$name,$his_type,$json_str,$this['images'],$real_name,'专员同意'); } } //未发货直接退款 if($this['type'] == RefundTypeEnum::COMPLETE){ //看是不是专员同意了, if($data['audit_status'] == AuditStatusEnum::REVIEWED){ $orderGoods = OrderGoodsModel::where('order_goods_id',$this['order_goods_id'])->find(); $express_no = $orderGoods['express_no']??''; //看是不是未发货,没发货的话 if(empty($express_no)){ //看退款了没,没的话给退款 if($this['finance_refund']==0){ $data['out_refund_time'] = time(); //退款时间 $data['refund_succ_time'] = time(); //退款成功时间 $data['finance_refund'] = 10; $data['is_sys_refund'] = 1; $data['status'] =20; // $param['handle_agree'] = 1; //平台同意退款 // $param['handle_time'] = time(); //平台同意退款时间 $refund_res = OrderRefundModel::where('order_refund_id',$this['order_refund_id'])->update($data); $order = Order::where("order_id",$this['order_id'])->find(); //直接退款逻辑处理 不直接退款 $RefundService = new RefundService(); $refund_ret = $RefundService->execute($order,$this['refund_number'],$this['refund_money']); if ($refund_ret['status'] == 200) { $data['transaction_id'] = $refund_ret['data']['transaction_id']; // 微信退款交易号 } $json_str = json_encode(["退款成功"]); $his_type = 2; $name = '公明腊肠官方体验商城'; (new RefundHis())->add($this['order_refund_id'],$name,$his_type,$json_str,$this['images'],$real_name,'专员同意'); //订单商品修改成全额退款状态-2021年11月6日 15:24:19 OrderGoodsModel::updateBase(['has_refund_full' => 1,'frozen_status'=>0], ['order_goods_id'=>$this['order_goods_id']]); //关闭订单状态 $RefundService = new OrderService(); $RefundService->closeOrder($this['order_id']); //写入金米粒记录 GoldRice::refundGoldRiceRoad($order,$this); //售后单完成之后,把库存退回 if($orderGoods['total_num']==$this['goods_num']){ FactoryStock::getFactory($order['order_source'])->backGoodsSkuStock($order,$orderGoods['goods_id'],$orderGoods['goods_sku_id'],$this['goods_num']); //售后单成功退了某商品的全部数量,把库存退回给活动库存 FactoryStock::getFactory($order['order_source'])->backActivityGoodsStock($orderGoods,$this['goods_num']); } } } }else{ $json_str = json_encode(["平台已拒绝","退款类型:仅退款","申请原因:".$this['apply_desc']]); $his_type = 3; $name = '公明腊肠官方体验商城'; (new RefundHis())->add($this['order_refund_id'],$name,$his_type,$json_str,$this['images'],$real_name,'专员拒绝'); } } $this->save($data); }); return true; } //关闭售后单 public function close(array $data=[]): bool { $user = StoreUserService::getLoginInfo(); $real_name = $user['user']['real_name']??''; //未发货退款 if ($this['type'] == RefundTypeEnum::COMPLETE) { if($this['audit_status']!=AuditStatusEnum::REJECTED||$this['status']==RefundStatusEnum::CANCELLED){ $this->error = '未发货退款售后单需要专员拒绝或用户取消'; return false; } } //发货退款 if ($this['type'] == RefundTypeEnum::RETURN) { if(($this['audit_status']!=AuditStatusEnum::REJECTED&&$this['audit_status_zg']!=AuditStatusEnum::REJECTED&&$this['is_receipt']!=2)||$this['status']==RefundStatusEnum::CANCELLED){ $this->error = '退货退款售后单需要专员和主管都拒绝或用户取消'; return false; } } //售后单已关闭 if($this['status']==RefundStatusEnum::COMPLETED){ $this->error = '售后单已完成,不能关闭吧'; return false; } //售后单已完成 if($this['status']==RefundStatusEnum::CLOSE){ $this->error = '售后单已关闭,不要重复操作'; return false; } $param['status'] = RefundStatusEnum::CLOSE; $param['close_username'] = $real_name; $this->save($param); $this->transaction(function () use ($data) { }); return true; } /** * 主管审核 * @param array $data * @return bool */ public function auditzg(array $data): bool { if ($data['audit_status_zg'] == AuditStatusEnum::REJECTED && empty($data['refuse_desc'])) { // $this->error = '请输入拒绝原因'; // return false; } if ($data['audit_status_zg'] == AuditStatusEnum::REJECTED){ $data['status'] = RefundStatusEnum::REJECTED; if($this['audit_status']!=AuditStatusEnum::REVIEWED){ $this->error = '专员同意后 主管才能拒绝'; return false; } } $this->transaction(function () use ($data) { $user = StoreUserService::getLoginInfo(); $real_name = $user['user']['real_name']??''; $order_refund_id = (int)$this['order_refund_id']; //退货退款 if($this['type'] == RefundTypeEnum::RETURN){ $data['status'] = 0; if($data['audit_status_zg'] == AuditStatusEnum::REVIEWED) { $json_str = json_encode(["处理结果:同意","平台同意了本次售后服务申请"]); $his_type = 6; $name = '公明腊肠官方体验商城'; (new RefundHis())->add($this['order_refund_id'],$name,$his_type,$json_str,$this['images'], $real_name,'主管同意'); $data['approved_time'] = time(); } if ($data['audit_status_zg'] == AuditStatusEnum::REJECTED) { $data['status'] = 10; $json_str = json_encode(["平台已拒绝","退款类型:退货退款","申请原因:".$this['apply_desc'],"退款说明:".$this['apply_detail_desc']]); $his_type = 5; $name = '公明腊肠官方体验商城'; (new RefundHis())->add($this['order_refund_id'],$name,$his_type,$json_str,$this['images'],$real_name,'主管已拒绝'); } } $this->save($data); }); return true; } /** * 确认收货 * @return bool */ public function receipt($data): bool { //原来的确认收货 if($data['is_receipt']==1){ // 事务处理 $this->transaction(function () use ($data){ $user = StoreUserService::getLoginInfo(); $real_name = $user['user']['real_name']??''; $data['is_receipt'] = 1; $this->save($data); $json_str = json_encode(["仓库已确认收货"]); $his_type = 8; $name = '公明腊肠官方体验商城'; (new RefundHis())->add($this['order_refund_id'],$name,$his_type,$json_str,'',$real_name,'专员点击确认仓库收货'); //标记是否退货zq 2021/11/5 OrderGoods::where('order_goods_id', $this['order_goods_id'])->update(['has_refund_act' => 1]); }); } //仓库不同意收货,改专员和主管审核状态为拒绝 if($data['is_receipt']==2){ $this->transaction(function () use ($data){ $user = StoreUserService::getLoginInfo(); $real_name = $user['user']['real_name']??''; $data['is_receipt'] = 2; //专员拒绝 主管拒绝 // $data['audit_status'] = 20; // $data['audit_status_zg'] = 20; $refuse_desc = $data['refuse_desc']??''; $this->save($data); $json_str = json_encode(["退货检测不合格,拒绝退货","退款说明:".$refuse_desc]); $his_type = 14; $name = '公明腊肠官方体验商城'; (new RefundHis())->add($this['order_refund_id'],$name,$his_type,$json_str,'',$real_name,'退货检测不合格,拒绝退货'); }); } return true; } /** * 财务退款 * @return bool */ public function refund(): bool { if ($this['refund_money'] <= 0) { $this->error = '退款金额不能小于0'; return false; } // 订单详情 $order = Order::detail($this['order_id']); $thatMoney = min(($order['pay_price']+$order['rice_card_money']), ($this['orderGoods']['total_pay_price']+$this['orderGoods']['rice_card_money'])); if(floatval($this['refund_money'])*100>$thatMoney*100){ $this->error = '退款金额不能大于商品实付款金额'; return false; } // if ($this['refund_money'] > min(($order['pay_price']+$order['rice_card_money']), ($this['orderGoods']['total_pay_price']+$this['orderGoods']['rice_card_money']))) { // $this->error = '退款金额不能大于商品实付款金额'; // return false; // } // 事务处理 $this->transaction(function () use ($order) { $user = StoreUserService::getLoginInfo(); $real_name = $user['user']['real_name']??''; // 更新售后单状态 $this->save([ 'status' => RefundStatusEnum::COMPLETED, 'finance_refund' => 10, 'finance_refund_time' => time(), 'out_refund_time' => time(), 'refund_succ_time' => time(), 'refund_close_time' => time(), ]); $json_str = json_encode(["财务已退款"]); $his_type = 9; $name = '公明腊肠官方体验商城'; (new RefundHis())->add($this['order_refund_id'],$name,$his_type,$json_str,'',$real_name,'财务退款'); $orderGoods = OrderGoods::where('order_goods_id', $this['order_goods_id'])->find(); $orderGoods->frozen_status = 0;// 解冻订单商品 // 消减用户的实际消费金额 // 条件:判断订单是否已结算 // if ($order['is_settled'] == true) { // (new UserModel)->setDecUserExpend($order['user_id'], $this['refund_money']); // } if ($this['pay_money'] > 0) { // 执行原路退款 $refund_ret = (new RefundService)->execute($order, $this['refund_number'], $this['pay_money']); if ($refund_ret['status'] == 200) { $this->save([ 'transaction_id' => $refund_ret['data']['transaction_id'] // 微信退款交易号 ]); } } //如果退货的商品和购买的商品相等 if($this['goods_num']==$orderGoods['total_num']){ $orderGoods->has_refund_full = 1; } $orderGoods->save();//更新 //原路退回商品库存 退货的商品和购买的商品相等 if($this['goods_num']==$orderGoods['total_num']){ FactoryStock::getFactory($order['order_source'])->backGoodsSkuStock($order,$orderGoods['goods_id'],$orderGoods['goods_sku_id'],$this['goods_num']); } //售后单成功退了某商品的全部数量,把库存退回给活动库存 FactoryStock::getFactory($order['order_source'])->backActivityGoodsStock($orderGoods,$this['goods_num']); // 解冻订单商品 //订单商品修改成全额退款状态-2021年11月6日 15:24:19 // OrderGoodsModel::updateBase(['has_refund_full' => 1], ['order_goods_id'=>$this['order_goods_id']]); //关闭订单状态 $RefundService = new OrderService(); $RefundService->closeOrder($this['order_id']); //写入金米粒记录 GoldRice::refundGoldRiceRoad($order,$this); $riceCard = UserRiceCardModel::getValidRiceCardDetail($this['rice_card_id']); if ($this['rice_card_id']) { // 订单商品有使用现金卡 // 验证余额 if ($this['rice_card_money'] + $riceCard['balance'] > $riceCard['face_value']) { $this->error = "现金卡退还金额异常"; return false; } // 写入现金卡流水明细 UserRiceCardConsume::add($riceCard, $order['order_no'], $this['pay_money'], $this['rice_card_money'], 1, '商品退款'); // 退还现金卡金额 UserRiceCard::setIncByField($this['rice_card_id'], 'balance', (float)$this['rice_card_money']); $riceCard->effect_state = 1; // 改为 生效 $riceCard->save(); } // 发送消息通知 // MessageService::send('order.refund', [ // 'refund' => $this, // 退款单信息 // 'order_no' => $order['order_no'], // 订单信息 // ], $this['store_id']); }); return true; } /** * 获取待处理售后单数量 * @return int */ public function getRefundTotal() { return $this->where('status', '=', RefundStatusEnum::NORMAL)->count(); } /** * 获取退款单列表 * @param array $param * @return mixed */ public function getFinanceList(array $param = []) { // 检索查询条件 $filter = $this->getFinanceFilter($param); // 获取列表数据 return $this->alias('refund') ->field('refund.*, order.order_no') ->with(['orderGoods.image', 'orderGoodsAll.image', 'orderData', 'user.avatar']) ->join('order', 'order.order_id = refund.order_id') ->join('user', 'user.user_id = order.user_id') ->leftJoin('orderGoods', 'orderGoods.order_goods_id=refund.order_goods_id') ->leftJoin('provider', 'provider.provider_id = orderGoods.provider_id') ->where($filter) ->where(function ($query) { $query->whereOr(function ($query) { $query->where('type', '=', 10) ->where('is_user_send','=',1) ->where('is_receipt','=',1); })->whereOr(function ($query) { $query->where('type', '=', 30); }); }) ->order(['refund.create_time' => 'desc', 'refund.' . $this->getPk()]) ->paginate(15) ->each(function($item) { $item->can_refund = false; if ($item->type == 10 && $item->finance_refund == 0 && $item->is_user_send == 1 && $item->status == 0 && $item->is_receipt == 1) { // 退款类型为退货退款、财务退款状态为未退款、用户已发货 售后状态为进行中 商家已收货 $item->can_refund = true; } $pay_type_text ='微信'; if($item->pay_money>0&&$item->rice_card_id>0){ $pay_type_text = '微信+现金卡'; } if($item->pay_money==0&&$item->rice_card_id>0){ $pay_type_text = '现金卡'; } $item->pay_type_text = $pay_type_text; if (!$item['order_goods_id']) { // 整单退款 $orderGoods = $item['orderGoodsAll']; } else { $item['orderGoods']['total_num'] = $item['goods_num']; $orderGoods = [$item['orderGoods']]; } unset($item['orderGoods'], $item['orderGoodsAll']); $item['orderGoods'] = $orderGoods[0]; }); } /** * 检索查询条件 * @param array $param * @return array */ private function getFinanceFilter(array $param = []): array { // 默认查询条件 $params = $this->setQueryDefaultValue($param, [ 'refund_number' => '', // 退款单编号 'order_no' => '', // 订单编号 'provider_name' => '', // 供应商名称 'nick_name' => '', // 退款人姓名 'mobile' => '', // 退款人手机号 'betweenTime' => [], // 申请时间 'finance_refund' => -1, // 财务退款状态 'delivery_type' =>-1, //10 快递 20 自提 'supplier' => '', // 供应商品牌 'type' => -1, // 退款类型 10-退货退款 30-仅退款 'transaction_id' => '',// 微信交易流水号 ]); // 检查查询条件 $filter = []; // $filter[] = ['type', '=', 10]; // $filter[] = ['is_user_send', '=', 1]; // $filter[] = ['is_receipt', '=', 1]; $filter[] = ['status', 'in', [0, 20]]; isset($params['delivery_type'])&&$params['delivery_type']>-1 && $filter[] = ['refund.delivery_type', '=', (int)$params['delivery_type']]; !empty($params['refund_number']) && $filter[] = ['refund.refund_number', 'like', "%{$params['refund_number']}%"]; !empty($params['order_no']) && $filter[] = ['order.order_no', 'like', "%{$params['order_no']}%"]; !empty($params['provider_name']) && $filter[] = ['provider.provider_name', 'like', "%{$params['provider_name']}%"]; !empty($params['nick_name']) && $filter[] = ['user.nick_name', 'like', "%{$params['nick_name']}%"]; !empty($params['mobile']) && $filter[] = ['user.mobile', 'like', "%{$params['mobile']}%"]; // 起止时间 if (!empty($params['betweenTime'])) { $times = between_time_format($params['betweenTime']); $filter[] = ['refund.create_time', '>=', $times['start_time']]; $filter[] = ['refund.create_time', '<', $times['end_time']]; } // 财务退款状态 $params['finance_refund'] > -1 && $filter[] = ['refund.finance_refund', '=', (int)$params['finance_refund']]; !empty($params['supplier']) && $filter[] = ['order_goods.supplier', 'like', "%{$params['supplier']}%"]; isset($params['type'])&&$params['type']>-1 && $filter[] = ['refund.type', '=', (int)$params['type']]; !empty($params['transaction_id']) && $filter[] = ['refund.transaction_id', 'like', "%{$params['transaction_id']}%"]; return $filter; } /** * 获取累计退款金额 */ public function getRefundMoneyTotal() { return $this->where('status', '=', RefundStatusEnum::CANCELLED)->where('finance_refund', 10)->sum('refund_money'); } /** * 普通退款订单列表 * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function refundsExport($param){ $filter = $this->getFinanceFilter($param); // 获取列表数据 $list = $this->alias('refund') ->field('refund.*, order.order_no') ->with(['orderGoods.image', 'orderGoodsAll.image', 'orderData', 'user.avatar']) ->join('order', 'order.order_id = refund.order_id') ->join('user', 'user.user_id = order.user_id') ->leftJoin('orderGoods', 'orderGoods.order_goods_id=refund.order_goods_id') ->leftJoin('provider', 'provider.provider_id = orderGoods.provider_id') ->where($filter) ->where(function ($query) { $query->whereOr(function ($query) { $query->where('type', '=', 10) ->where('is_user_send','=',1) ->where('is_receipt','=',1); })->whereOr(function ($query) { $query->where('type', '=', 30); }); }) ->order(['refund.create_time' => 'desc', 'refund.' . $this->getPk()]) ->select() ->each(function($item) { $item->can_refund = false; if ($item->type == 10 && $item->finance_refund == 0 && $item->is_user_send == 1 && $item->status == 0 && $item->is_receipt == 1) { // 退款类型为退货退款、财务退款状态为未退款、用户已发货 售后状态为进行中 商家已收货 $item->can_refund = true; } $pay_type_text ='微信'; if($item->pay_money>0&&$item->rice_card_id>0){ $pay_type_text = '微信+现金卡'; } if($item->pay_money==0&&$item->rice_card_id>0){ $pay_type_text = '现金卡'; } $item->pay_type_text = $pay_type_text; if (!$item['order_goods_id']) { // 整单退款 $orderGoods = $item['orderGoodsAll']; } else { $item['orderGoods']['total_num'] = $item['goods_num']; $orderGoods = [$item['orderGoods']]; } unset($item['orderGoods'], $item['orderGoodsAll']); $item['orderGoods'] = $orderGoods[0]; }); $data['header'] = ['序号', '退款单编号','订单编号','配送方式', '商品名称','规格','品牌','退款金额','申请时间', '退款类型','退款状态', '会员昵称','会员手机号','微信交易流水号']; $data['filename'] = '普通退款单列表导出'; $data['data'] = []; foreach ($list as $key=>$arr){ $new_list['key'] = $key+1; $new_list['refund_number'] = $arr['refund_number']; $new_list['order_no'] = $arr['orderData']['order_no']; $new_list['delivery_type'] = $arr['delivery_type']==10?'普通配送':'门店自提'; $new_list['goods_name'] = $arr['orderGoods']['goods_name']; $new_list['goods_props'] = $arr['orderGoods']['goods_props'][0]['value']['name']??'-'; $new_list['supplier'] = $arr['orderGoods']['supplier'] ?: '-'; $new_list['refund_money'] = $arr['refund_money']; $new_list['create_time'] = $arr['create_time']; $new_list['type'] = str_replace([10, 20, 30], ['退货退款','不退货退款', '仅退款'], $arr['type']); $new_list['finance_refund_text'] = $arr['finance_refund_text']; $new_list['nick_name'] = $arr['user']['nick_name']; $new_list['mobile'] = $arr['user']['mobile']; $new_list['transaction_id'] = $arr['transaction_id'] ?: '-'; $data['data'][] = $new_list; } return $data; } }