592 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			592 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | likeshop开源商城系统
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
 | |||
|  | // | gitee下载:https://gitee.com/likeshop_gitee
 | |||
|  | // | github下载:https://github.com/likeshop-github
 | |||
|  | // | 访问官网:https://www.likeshop.cn
 | |||
|  | // | 访问社区:https://home.likeshop.cn
 | |||
|  | // | 访问手册:http://doc.likeshop.cn
 | |||
|  | // | 微信公众号:likeshop技术社区
 | |||
|  | // | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
 | |||
|  | // |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
 | |||
|  | // | 禁止对系统程序代码以任何目的,任何形式的再发布
 | |||
|  | // | likeshop团队版权所有并拥有最终解释权
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | author: likeshop.cn.team
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | 
 | |||
|  | 
 | |||
|  | namespace app\shop\logic\after_sale; | |||
|  | 
 | |||
|  | 
 | |||
|  | use app\common\basics\Logic; | |||
|  | use app\common\enum\NoticeEnum; | |||
|  | use app\common\enum\OrderGoodsEnum; | |||
|  | use app\common\enum\PayEnum; | |||
|  | use app\common\model\after_sale\{AfterSale, AfterSaleLog}; | |||
|  | use app\common\logic\AfterSaleLogLogic; | |||
|  | use app\common\logic\OrderRefundLogic; | |||
|  | use app\common\model\order\Order as OrderModel; | |||
|  | use app\common\model\order\Order; | |||
|  | use app\common\model\order\OrderGoods; | |||
|  | use app\common\model\shop\Shop; | |||
|  | use app\common\server\AreaServer; | |||
|  | use app\common\server\ExportExcelServer; | |||
|  | use app\common\server\UrlServer; | |||
|  | use think\facade\Db; | |||
|  | 
 | |||
|  | 
 | |||
|  | /** | |||
|  |  * 售后管理-逻辑 | |||
|  |  * Class GoodsLogic | |||
|  |  * @package app\shop\logic\goods | |||
|  |  */ | |||
|  | class AfterSaleLogic extends Logic | |||
|  | { | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 售后列表 | |||
|  |      * @param array $get | |||
|  |      * @param $shop_id | |||
|  |      * @return array | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @throws \think\exception\DbException | |||
|  |      * @author suny | |||
|  |      * @date 2021/7/14 10:19 上午 | |||
|  |      */ | |||
|  |     public static function list($get = [], $shop_id, $is_export = false) | |||
|  |     { | |||
|  | 
 | |||
|  |         $after_sale = new AfterSale(); | |||
|  |         $where = []; | |||
|  |         $page = '1'; | |||
|  |         $limit = '10'; | |||
|  |         $where[] = ['o.delete', '=', 0]; | |||
|  |         $where[] = ['a.del', '=', 0]; | |||
|  |         $where[] = ['o.shop_id', '=', $shop_id]; | |||
|  |         //订单类型
 | |||
|  |         if (isset($get['type']) && $get['type'] != '') { | |||
|  |             $where[] = ['a.status', '=', $get['type']]; | |||
|  |         } | |||
|  | 
 | |||
|  |         //订单搜素
 | |||
|  |         if (!empty($get['search_key']) && !empty($get['keyword'])) { | |||
|  |             $keyword = $get['keyword']; | |||
|  |             switch ($get['search_key']) { | |||
|  |                 case 'sn': | |||
|  |                     $where[] = ['a.sn', 'like', '%' . $keyword . '%']; | |||
|  |                     break; | |||
|  |                 case 'order_sn': | |||
|  |                     $where[] = ['o.order_sn', 'like', '%' . $keyword . '%']; | |||
|  |                     break; | |||
|  |                 case 'goods_name': | |||
|  |                     $where[] = ['g.goods_name', 'like', '%' . $keyword . '%']; | |||
|  |                     break; | |||
|  |                 case 'user_sn': | |||
|  |                     $where[] = ['u.sn', 'like', '%' . $keyword . '%']; | |||
|  |                     break; | |||
|  |                 case 'nickname': | |||
|  |                     $where[] = ['u.nickname', 'like', '%' . $keyword . '%']; | |||
|  |                     break; | |||
|  |                 case 'user_mobile': | |||
|  |                     $where[] = ['u.mobile', 'like', '%' . $keyword . '%']; | |||
|  |                     break; | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         if (isset($get['status']) && $get['status'] != '') { | |||
|  |             $where[] = ['a.status', '=', $get['status']]; | |||
|  |         } | |||
|  | 
 | |||
|  |         //下单时间
 | |||
|  |         if (isset($get['start_time']) && $get['start_time'] != '') { | |||
|  |             $where[] = ['a.create_time', '>=', strtotime($get['start_time'])]; | |||
|  |         } | |||
|  |         if (isset($get['end_time']) && $get['end_time'] != '') { | |||
|  |             $where[] = ['a.create_time', '<=', strtotime($get['end_time'])]; | |||
|  |         } | |||
|  | 
 | |||
|  |         if (isset($get['page']) && $get['page'] != '') { | |||
|  |             $page = $get['page']; | |||
|  |         } | |||
|  | 
 | |||
|  |         if (isset($get['limit']) && $get['limit'] != '') { | |||
|  |             $limit = $get['limit']; | |||
|  |         } | |||
|  | 
 | |||
|  |         // 导出excel
 | |||
|  |         if (true === $is_export) { | |||
|  |             return self::export($where); | |||
|  |         } | |||
|  | 
 | |||
|  |         $field = 'a.id,a.sn,a.status,a.order_id,a.order_goods_id, | |||
|  |         a.user_id,a.refund_type,a.create_time,a.refund_price, | |||
|  |         o.order_status,o.shop_id,o.pay_way'; | |||
|  | 
 | |||
|  |         $count = $after_sale | |||
|  |             ->alias('a') | |||
|  |             ->join('order o', 'o.id = a.order_id') | |||
|  |             ->join('user u', 'u.id = a.user_id') | |||
|  |             ->join('order_goods g', 'g.id = a.order_goods_id') | |||
|  |             ->with(['order_goods', 'user', 'order']) | |||
|  |             ->where($where) | |||
|  |             ->group('a.id') | |||
|  |             ->count(); | |||
|  | 
 | |||
|  |         $lists = $after_sale | |||
|  |             ->alias('a') | |||
|  |             ->field($field) | |||
|  |             ->join('order o', 'o.id = a.order_id') | |||
|  |             ->join('user u', 'u.id = a.user_id') | |||
|  |             ->join('order_goods g', 'g.id = a.order_goods_id') | |||
|  |             ->with(['order_goods', 'user', 'order']) | |||
|  |             ->where($where) | |||
|  |             ->page($page, $limit) | |||
|  |             ->order('a.id desc') | |||
|  |             ->append(['user.base_avatar', 'order_goods.base_image']) | |||
|  |             ->group('a.id') | |||
|  |             ->select()->toArray(); | |||
|  |         foreach ($lists as &$list) { | |||
|  |             $list['order']['pay_way'] = PayEnum::getPayWay($list['order']['pay_way']); | |||
|  |             $list['order']['order_status'] = OrderModel::getOrderStatus($list['order']['order_status']); | |||
|  |             $list['refund_type'] = AfterSale::getRefundTypeDesc($list['refund_type']); | |||
|  |             $list['status'] = AfterSale::getStatusDesc($list['status']); | |||
|  |             $list['user']['avatar'] = UrlServer::getFileUrl($list['user']['avatar']); | |||
|  |             foreach ($list['order_goods'] as &$good) { | |||
|  |                 $good['image'] = empty($good['spec_image']) ? | |||
|  |                     UrlServer::getFileUrl($good['image']) : UrlServer::getFileUrl($good['spec_image']); | |||
|  |             } | |||
|  |         } | |||
|  |         return ['count' => $count, 'lists' => $lists]; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 售后详情 | |||
|  |      * @param $id | |||
|  |      * @return array | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author suny | |||
|  |      * @date 2021/7/14 10:19 上午 | |||
|  |      */ | |||
|  |     public static function getDetail($id,$shop_id) | |||
|  |     { | |||
|  | 
 | |||
|  |         $after_sale = new AfterSale(); | |||
|  |         $result = $after_sale | |||
|  |             ->with(['order_goods', 'user', 'order', 'logs']) | |||
|  |             ->where('id', $id) | |||
|  |             ->find()->toArray(); | |||
|  |         $result['refund_type_text'] = AfterSale::getRefundTypeDesc($result['refund_type']); | |||
|  |         $result['status_text'] = AfterSale::getStatusDesc($result['status']); | |||
|  |         $result['order']['pay_way'] = PayEnum::getPayWay($result['order']['pay_way']); | |||
|  |         $result['order']['order_status'] = OrderModel::getOrderStatus($result['order']['order_status']); | |||
|  | 
 | |||
|  |         foreach ($result['order_goods'] as &$good) { | |||
|  |             $good['image'] = empty($good['spec_image']) ? | |||
|  |                 UrlServer::getFileUrl($good['image']) : UrlServer::getFileUrl($good['spec_image']); | |||
|  |         } | |||
|  | 
 | |||
|  |         foreach ($result['logs'] as &$log) { | |||
|  | 
 | |||
|  |             $log['log_img'] = ''; | |||
|  |             $log['log_remark'] = ''; | |||
|  |             switch ($log['channel']) { | |||
|  |                 //会员申请售后
 | |||
|  |                 case AfterSaleLog::USER_APPLY_REFUND: | |||
|  |                     $log['log_img'] = empty($result['refund_image']) ? '' : UrlServer::getFileUrl($result['refund_image']); | |||
|  |                     $refund_reason = empty($result['refund_reason']) ? '未知' : $result['refund_reason']; | |||
|  |                     $refund_remark = empty($result['refund_remark']) ? '暂无' : $result['refund_remark']; | |||
|  |                     $log['log_remark'] = '退款原因(' . $refund_reason . ')' . '退款说明(' . $refund_remark . ')'; | |||
|  |                     break; | |||
|  |                 //会员发快递
 | |||
|  |                 case AfterSaleLog::USER_SEND_EXPRESS: | |||
|  |                     $log['log_img'] = empty($result['express_image']) ? '' : UrlServer::getFileUrl($result['express_image']); | |||
|  |                     $express_name = $result['express_name']; | |||
|  |                     $invoice_no = $result['invoice_no']; | |||
|  |                     $express_remark = empty($result['express_remark']) ? '暂无' : $result['express_remark']; | |||
|  |                     $log['log_remark'] = '快递公司(' . $express_name . ')' . '单号(' . $invoice_no . ')' . '备注说明(' . $express_remark . ')'; | |||
|  |                     break; | |||
|  |                 //商家拒绝退款 //商家拒绝收货
 | |||
|  |                 case AfterSaleLog::SHOP_REFUSE_REFUND: | |||
|  |                 case AfterSaleLog::SHOP_REFUSE_TAKE_GOODS: | |||
|  |                     $admin_remark = empty($result['admin_remark']) ? '暂无' : $result['admin_remark']; | |||
|  |                     $log['log_remark'] = '备注:' . $admin_remark; | |||
|  |                     break; | |||
|  |             } | |||
|  | 
 | |||
|  |         } | |||
|  | 
 | |||
|  |         $result['shop_address'] = self::getShopAddress($shop_id); | |||
|  |         return $result; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 获取商家地址 | |||
|  |      * @return string | |||
|  |      * @author suny | |||
|  |      * @date 2021/7/14 10:19 上午 | |||
|  |      */ | |||
|  |     public static function getShopAddress($shop_id) | |||
|  |     { | |||
|  | 
 | |||
|  |         $shop_info = Shop::where('id', $shop_id)->find(); | |||
|  | 
 | |||
|  |         $refund_address = $shop_info['refund_address']; | |||
|  |         $shop_province = $refund_address['province_id'] ?? ''; //省份
 | |||
|  |         $shop_city = $refund_address['city_id'] ?? ''; //城市
 | |||
|  |         $shop_district = $refund_address['district_id'] ?? ''; //县区
 | |||
|  |         $shop_address = $refund_address['address'] ?? ''; //详细地址
 | |||
|  |         $shop_contact = $refund_address['nickname'] ?? ''; //联系人
 | |||
|  |         $shop_mobile = $refund_address['mobile'] ?? ''; //联系电话
 | |||
|  | 
 | |||
|  |         //组装退货地址
 | |||
|  |         if (empty($shop_province) || empty($shop_city) || empty($shop_district)) { | |||
|  |             $arr = []; | |||
|  |         } else { | |||
|  |             $arr = [$shop_province, $shop_city, $shop_district]; | |||
|  |         } | |||
|  |         $shop_address = AreaServer::getAddress($arr, $shop_address); | |||
|  | 
 | |||
|  |         return $shop_address . '(' . $shop_contact . ',' . $shop_mobile . ')'; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 商家同意售后 | |||
|  |      * @param $id | |||
|  |      * @param $shop_id | |||
|  |      * @return false | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author suny | |||
|  |      * @date 2021/7/14 10:19 上午 | |||
|  |      */ | |||
|  |     public static function agree($id, $shop_id) | |||
|  |     { | |||
|  | 
 | |||
|  |         $after_sale = AfterSale::find($id); | |||
|  |         if ($after_sale['del'] == 1) { | |||
|  |             return false; | |||
|  |         } | |||
|  |         $after_sale->update_time = time(); | |||
|  |         //仅退款
 | |||
|  |         if ($after_sale['refund_type'] == AfterSale::TYPE_ONLY_REFUND) { | |||
|  |             $after_sale->status = AfterSale::STATUS_WAIT_REFUND;//更新为等待退款状态
 | |||
|  |         } | |||
|  | 
 | |||
|  |         //退款退货
 | |||
|  |         if ($after_sale['refund_type'] == AfterSale::TYPE_REFUND_RETURN) { | |||
|  |             $after_sale->status = AfterSale::STATUS_WAIT_RETURN_GOODS;//更新为商品待退货状态
 | |||
|  |         } | |||
|  | 
 | |||
|  |         $after_sale->save(); | |||
|  |         //记录日志
 | |||
|  |         AfterSaleLogLogic::record( | |||
|  |             AfterSaleLog::TYPE_SHOP, | |||
|  |             AfterSaleLog::SHOP_AGREE_REFUND, | |||
|  |             $after_sale['order_id'], | |||
|  |             $after_sale['id'], | |||
|  |             $shop_id, | |||
|  |             AfterSaleLog::SHOP_AGREE_REFUND | |||
|  |         ); | |||
|  | 
 | |||
|  |         // 仅退款;更新订单商品为等待退款
 | |||
|  |         if ($after_sale['refund_type'] == AfterSale::TYPE_ONLY_REFUND) { | |||
|  |             $order_goods = OrderGoods::find(['id' => $after_sale['order_goods_id']]); | |||
|  |             $order_goods->refund_status = OrderGoodsEnum::REFUND_STATUS_WAIT;//等待退款
 | |||
|  |             $order_goods->save(); | |||
|  |         } | |||
|  | 
 | |||
|  |         $mobile = Order::where(['id' => $after_sale['order_id']])->value('mobile'); | |||
|  | 
 | |||
|  |         //通知用户
 | |||
|  |         event('Notice', [ | |||
|  |             'scene' => NoticeEnum::AFTER_SALE_NOTICE, | |||
|  |             'mobile' => $mobile, | |||
|  |             'params' => [ | |||
|  |                 'after_sale_sn' => $after_sale['sn'], | |||
|  |                 'user_id' => $after_sale['user_id'], | |||
|  |                 'after_sale_result' => AfterSaleLog::getLogDesc(AfterSaleLog::SHOP_AGREE_REFUND), | |||
|  |                 'after_sale_remark' => AfterSaleLog::getLogDesc(AfterSaleLog::SHOP_AGREE_REFUND), | |||
|  |                 'time' => date('Y-m-d H:i:s', time()) | |||
|  |             ] | |||
|  |         ]); | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 商家拒绝 | |||
|  |      * @param $post | |||
|  |      * @param $shop_id | |||
|  |      * @return false | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author suny | |||
|  |      * @date 2021/7/14 10:19 上午 | |||
|  |      */ | |||
|  |     public static function refuse($post, $shop_id) | |||
|  |     { | |||
|  | 
 | |||
|  |         $id = $post['id']; | |||
|  |         $after_sale = AfterSale::find($id); | |||
|  |         if ($after_sale['del'] == 1) { | |||
|  |             return false; | |||
|  |         } | |||
|  |         $after_sale->update_time = time(); | |||
|  |         $after_sale->status = AfterSale::STATUS_REFUSE_REFUND;//更新为拒绝退款状态
 | |||
|  |         $after_sale->admin_remark = isset($post['remark']) ? $post['remark'] : ''; | |||
|  |         $after_sale->save(); | |||
|  |         //记录日志
 | |||
|  |         AfterSaleLogLogic::record( | |||
|  |             AfterSaleLog::TYPE_SHOP, | |||
|  |             AfterSaleLog::SHOP_REFUSE_REFUND, | |||
|  |             $after_sale['order_id'], | |||
|  |             $after_sale['id'], | |||
|  |             $shop_id, | |||
|  |             AfterSaleLog::SHOP_REFUSE_REFUND | |||
|  |         ); | |||
|  | 
 | |||
|  |         $mobile = Order::where(['id' => $after_sale['order_id']])->value('mobile'); | |||
|  | 
 | |||
|  |         //通知用户
 | |||
|  |         event('Notice', [ | |||
|  |             'scene' => NoticeEnum::AFTER_SALE_NOTICE, | |||
|  |             'mobile' => $mobile, | |||
|  |             'params' => [ | |||
|  |                 'after_sale_sn' => $after_sale['sn'], | |||
|  |                 'user_id' => $after_sale['user_id'], | |||
|  |                 'after_sale_result' => AfterSaleLog::getLogDesc(AfterSaleLog::SHOP_REFUSE_REFUND), | |||
|  |                 'after_sale_remark' => AfterSaleLog::getLogDesc(AfterSaleLog::SHOP_REFUSE_REFUND), | |||
|  |                 'time' => date('Y-m-d H:i:s', time()) | |||
|  |             ] | |||
|  |         ]); | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 商家收货 | |||
|  |      * @param $post | |||
|  |      * @param $admin_id | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author suny | |||
|  |      * @date 2021/7/14 10:20 上午 | |||
|  |      */ | |||
|  |     public static function takeGoods($post, $admin_id) | |||
|  |     { | |||
|  | 
 | |||
|  |         $id = $post['id']; | |||
|  |         $after_sale = AfterSale::find($id); | |||
|  |         $after_sale->update_time = time(); | |||
|  |         $after_sale->status = AfterSale::STATUS_WAIT_REFUND;//更新为等待退款状态
 | |||
|  |         $after_sale->save(); | |||
|  |         //记录日志
 | |||
|  |         AfterSaleLogLogic::record( | |||
|  |             AfterSaleLog::TYPE_SHOP, | |||
|  |             AfterSaleLog::SHOP_TAKE_GOODS, | |||
|  |             $after_sale['order_id'], | |||
|  |             $after_sale['id'], | |||
|  |             $admin_id, | |||
|  |             AfterSaleLog::SHOP_TAKE_GOODS | |||
|  |         ); | |||
|  |         //更新订单商品为等待退款状态
 | |||
|  |         $order_goods = OrderGoods::find(['id' => $after_sale['order_goods_id']]); | |||
|  |         $order_goods->refund_status = OrderGoodsEnum::REFUND_STATUS_WAIT;//等待退款
 | |||
|  |         $order_goods->save(); | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 商家拒绝收货 | |||
|  |      * @param $post | |||
|  |      * @param $admin_id | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author suny | |||
|  |      * @date 2021/7/14 10:20 上午 | |||
|  |      */ | |||
|  |     public static function refuseGoods($post, $admin_id) | |||
|  |     { | |||
|  | 
 | |||
|  |         $id = $post['id']; | |||
|  |         $after_sale = AfterSale::find($id); | |||
|  |         $after_sale->update_time = time(); | |||
|  |         $after_sale->status = AfterSale::STATUS_REFUSE_RECEIVE_GOODS;//更新为拒绝收货状态
 | |||
|  |         $after_sale->admin_remark = isset($post['remark']) ? $post['remark'] : ''; | |||
|  |         $after_sale->save(); | |||
|  |         //记录日志
 | |||
|  |         AfterSaleLogLogic::record( | |||
|  |             AfterSaleLog::TYPE_SHOP, | |||
|  |             AfterSaleLog::SHOP_REFUSE_TAKE_GOODS, | |||
|  |             $after_sale['order_id'], | |||
|  |             $after_sale['id'], | |||
|  |             $admin_id, | |||
|  |             AfterSaleLog::SHOP_REFUSE_TAKE_GOODS | |||
|  |         ); | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 确认退款 ===> 退款 | |||
|  |      * @param $id | |||
|  |      * @param $admin_id | |||
|  |      * @return bool|string | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @throws \think\exception\DbException | |||
|  |      * @throws \think\exception\PDOException | |||
|  |      * @author suny | |||
|  |      * @date 2021/7/14 10:20 上午 | |||
|  |      */ | |||
|  |     public static function confirm($id, $admin_id) | |||
|  |     { | |||
|  | 
 | |||
|  |         //售后记录状态
 | |||
|  |         $after_sale = AfterSale::find($id); | |||
|  | 
 | |||
|  |         if($after_sale['del'] == 1){ | |||
|  |             return '该售后已经撤销'; | |||
|  |         } | |||
|  |         $order = OrderModel::find(['id' => $after_sale['order_id']]); | |||
|  |         $order_goods = OrderGoods::find(['id' => $after_sale['order_goods_id']]); | |||
|  | 
 | |||
|  |         Db::startTrans(); | |||
|  |         try { | |||
|  |             //更新售后为退款成功状态
 | |||
|  |             $after_sale->update_time = time(); | |||
|  |             $after_sale->status = AfterSale::STATUS_SUCCESS_REFUND; | |||
|  |             $after_sale->save(); | |||
|  |             //售后日志
 | |||
|  |             AfterSaleLogLogic::record( | |||
|  |                 AfterSaleLog::TYPE_SHOP, | |||
|  |                 AfterSaleLog::REFUND_SUCCESS, | |||
|  |                 $after_sale['order_id'], | |||
|  |                 $after_sale['id'], | |||
|  |                 $admin_id, | |||
|  |                 AfterSaleLog::REFUND_SUCCESS | |||
|  |             ); | |||
|  |             //更新订单和订单商品状态
 | |||
|  |             OrderRefundLogic::afterSaleRefundUpdate($order, $order_goods['id'], $admin_id); | |||
|  |             //订单退款
 | |||
|  |             OrderRefundLogic::refund($order, $order['order_amount'], $after_sale['refund_price']); | |||
|  | 
 | |||
|  |             Db::commit(); | |||
|  |             return true; | |||
|  |         } catch (\Exception $e) { | |||
|  |             Db::rollback(); | |||
|  |             //增加退款失败记录
 | |||
|  |             OrderRefundLogic::addErrorRefund($order, $e->getMessage()); | |||
|  |             //记录日志
 | |||
|  |             AfterSaleLogLogic::record( | |||
|  |                 AfterSaleLog::TYPE_SHOP, | |||
|  |                 AfterSaleLog::REFUND_ERROR,//退款失败
 | |||
|  |                 $after_sale['order_id'], | |||
|  |                 $after_sale['id'], | |||
|  |                 $admin_id, | |||
|  |                 AfterSaleLog::REFUND_ERROR,//退款失败
 | |||
|  |                 $e->getMessage() | |||
|  |             ); | |||
|  |             return $e->getMessage(); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 全部数量 | |||
|  |      * @return int | |||
|  |      * @author suny | |||
|  |      * @date 2021/7/13 3:53 下午 | |||
|  |      */ | |||
|  |     public static function getAll($shop_id) | |||
|  |     { | |||
|  | 
 | |||
|  |         return AfterSale::alias('a') | |||
|  |             ->where(['a.del' => 0, 'shop_id' => $shop_id]) | |||
|  |             ->join('order o', 'a.order_id = o.id') | |||
|  |             ->count('a.id'); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 获取统计数量 | |||
|  |      * @param $status | |||
|  |      * @return array | |||
|  |      * @author suny | |||
|  |      * @date 2021/7/13 4:07 下午 | |||
|  |      */ | |||
|  |     public static function getStatus($status, $shop_id) | |||
|  |     { | |||
|  | 
 | |||
|  |         foreach ($status as $key => $value) { | |||
|  |             $count = AfterSale::alias('a') | |||
|  |                 ->join('order o', 'a.order_id = o.id') | |||
|  |                 ->where(['status' => $key, 'a.del' => 0, 'shop_id' => $shop_id]) | |||
|  |                 ->count('a.id'); | |||
|  |             $data[] = $value . "(" . $count . ")"; | |||
|  |         } | |||
|  |         return $data; | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 导出Excel | |||
|  |      * @param array $condition | |||
|  |      * @return array|false | |||
|  |      * @author 段誉 | |||
|  |      * @date 2022/4/24 10:10 | |||
|  |      */ | |||
|  |     public static function export($condition = []) | |||
|  |     { | |||
|  |         try { | |||
|  |             $field = 'a.sn,a.refund_type,a.refund_price,a.status,a.create_time, | |||
|  |             u.nickname,o.order_sn'; | |||
|  | 
 | |||
|  |             $lists = (new AfterSale()) | |||
|  |                 ->alias('a') | |||
|  |                 ->field($field) | |||
|  |                 ->join('order o', 'o.id = a.order_id') | |||
|  |                 ->join('user u', 'u.id = a.user_id') | |||
|  |                 ->join('order_goods g', 'g.id = a.order_goods_id') | |||
|  |                 ->with(['order_goods', 'user', 'order']) | |||
|  |                 ->where($condition) | |||
|  |                 ->order('a.id desc') | |||
|  |                 ->group('a.id') | |||
|  |                 ->select()->toArray(); | |||
|  | 
 | |||
|  |             foreach ($lists as &$list) { | |||
|  |                 $list['refund_type'] = AfterSale::getRefundTypeDesc($list['refund_type']); | |||
|  |                 $list['status'] = AfterSale::getStatusDesc($list['status']); | |||
|  |             } | |||
|  | 
 | |||
|  |             $excelFields = [ | |||
|  |                 'sn' => '售后单号', | |||
|  |                 'nickname' => '用户昵称', | |||
|  |                 'order_sn' => '订单编号', | |||
|  |                 'refund_type' => '售后方式', | |||
|  |                 'refund_price' => '售后金额', | |||
|  |                 'status' => '售后状态', | |||
|  |                 'create_time' => '申请时间', | |||
|  |             ]; | |||
|  | 
 | |||
|  |             $export = new ExportExcelServer(); | |||
|  |             $export->setFileName('售后'); | |||
|  |             $result = $export->createExcel($excelFields, $lists); | |||
|  | 
 | |||
|  |             return ['url' => $result]; | |||
|  | 
 | |||
|  |         } catch (\Exception $e) { | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  | } |