123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014 |
- <?php
- // +----------------------------------------------------------------------
- // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
- // +----------------------------------------------------------------------
- // | Author: 萤火科技 <admin@yiovo.com>
- // +----------------------------------------------------------------------
- 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;
- }
- }
|