535 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			535 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace app\api\logic;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use app\api\controller\Shop;
							 | 
						||
| 
								 | 
							
								use app\common\enum\NoticeEnum;
							 | 
						||
| 
								 | 
							
								use app\common\enum\PayEnum;
							 | 
						||
| 
								 | 
							
								use app\common\logic\AfterSaleLogLogic;
							 | 
						||
| 
								 | 
							
								use app\common\basics\Logic;
							 | 
						||
| 
								 | 
							
								use app\common\model\after_sale\{AfterSale, AfterSaleLog};
							 | 
						||
| 
								 | 
							
								use app\common\model\NoticeSetting;
							 | 
						||
| 
								 | 
							
								use app\common\model\order\OrderGoods;
							 | 
						||
| 
								 | 
							
								use app\common\model\order\Order;
							 | 
						||
| 
								 | 
							
								use app\common\enum\OrderGoodsEnum;
							 | 
						||
| 
								 | 
							
								use app\common\model\shop\Shop as ShopModel;
							 | 
						||
| 
								 | 
							
								use app\common\server\AreaServer;
							 | 
						||
| 
								 | 
							
								use app\common\server\ConfigServer;
							 | 
						||
| 
								 | 
							
								use app\common\server\UrlServer;
							 | 
						||
| 
								 | 
							
								use think\facade\Db;
							 | 
						||
| 
								 | 
							
								use think\Exception;
							 | 
						||
| 
								 | 
							
								use app\common\enum\ShopEnum;
							 | 
						||
| 
								 | 
							
								use think\Model;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * 售后
							 | 
						||
| 
								 | 
							
								 * Class AfterSaleLogic
							 | 
						||
| 
								 | 
							
								 * @package app\api\logic
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class AfterSaleLogic extends Logic
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @notes 售后退款列表
							 | 
						||
| 
								 | 
							
								     * @param $user_id
							 | 
						||
| 
								 | 
							
								     * @param $type
							 | 
						||
| 
								 | 
							
								     * @param $page
							 | 
						||
| 
								 | 
							
								     * @param $size
							 | 
						||
| 
								 | 
							
								     * @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/13 6:06 下午
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function lists($user_id, $type, $page, $size)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $where = [];
							 | 
						||
| 
								 | 
							
								        $where[] = ['o.user_id', '=', $user_id];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $data = $result = [];
							 | 
						||
| 
								 | 
							
								        switch ($type) {
							 | 
						||
| 
								 | 
							
								            case 'normal':
							 | 
						||
| 
								 | 
							
								                $where[] = ['g.refund_status', '=', OrderGoodsEnum::REFUND_STATUS_NO];
							 | 
						||
| 
								 | 
							
								                $where[] = ['o.order_status', 'in', [Order::STATUS_WAIT_RECEIVE, Order::STATUS_FINISH]];
							 | 
						||
| 
								 | 
							
								                $order = new Order();
							 | 
						||
| 
								 | 
							
								                $count = $order->alias('o')
							 | 
						||
| 
								 | 
							
								                    ->field('o.id,o.confirm_take_time,o.order_status,o.create_time,s.id as sid,s.name as shop_name,s.type as shop_type')
							 | 
						||
| 
								 | 
							
								                    ->join('order_goods g', 'g.order_id = o.id')
							 | 
						||
| 
								 | 
							
								                    ->join('shop s', 'o.shop_id = s.id')
							 | 
						||
| 
								 | 
							
								                    ->with(['order_goods' => function ($query) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                        $query->where('refund_status', OrderGoodsEnum::REFUND_STATUS_NO);
							 | 
						||
| 
								 | 
							
								                    }])
							 | 
						||
| 
								 | 
							
								                    ->where($where)
							 | 
						||
| 
								 | 
							
								                    ->group('o.id')
							 | 
						||
| 
								 | 
							
								                    ->count();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                $lists = $order
							 | 
						||
| 
								 | 
							
								                    ->alias('o')
							 | 
						||
| 
								 | 
							
								                    ->field('o.id,o.confirm_take_time,o.order_status,o.order_sn,o.create_time,s.id as sid,s.name as shop_name,s.logo as shop_logo,s.type as shop_type')
							 | 
						||
| 
								 | 
							
								                    ->join('order_goods g', 'g.order_id = o.id')
							 | 
						||
| 
								 | 
							
								                    ->join('shop s', 'o.shop_id = s.id')
							 | 
						||
| 
								 | 
							
								                    ->with(['order_goods' => function ($query) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                        $query->where('refund_status', OrderGoodsEnum::REFUND_STATUS_NO);
							 | 
						||
| 
								 | 
							
								                    }])
							 | 
						||
| 
								 | 
							
								                    ->where($where)
							 | 
						||
| 
								 | 
							
								                    ->group('o.id')
							 | 
						||
| 
								 | 
							
								                    ->order('o.id desc')
							 | 
						||
| 
								 | 
							
								                    ->page($page, $size)
							 | 
						||
| 
								 | 
							
								                    ->select()->toArray();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                // 获取所有用户的订单售后的退款编号申请时间
							 | 
						||
| 
								 | 
							
								                $order_ids = array_column($lists, 'id');
							 | 
						||
| 
								 | 
							
								                $after_sale_lists = AfterSale::where(['order_id' => $order_ids])->column('sn, create_time','order_id');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                foreach ($lists as $item) {
							 | 
						||
| 
								 | 
							
								                    $result = [
							 | 
						||
| 
								 | 
							
								                        'order_id' => $item['id'],
							 | 
						||
| 
								 | 
							
								                    ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    $order_goods = [];
							 | 
						||
| 
								 | 
							
								                    foreach ($item['order_goods'] as $k1 => $good) {
							 | 
						||
| 
								 | 
							
								                        $goods = [
							 | 
						||
| 
								 | 
							
								                            'goods_id' => $good['goods_id'],
							 | 
						||
| 
								 | 
							
								                            'item_id' => $good['item_id'],
							 | 
						||
| 
								 | 
							
								                            'goods_name' => '',
							 | 
						||
| 
								 | 
							
								                            'goods_num' => $good['goods_num'],
							 | 
						||
| 
								 | 
							
								                            'goods_price' => $good['goods_price'],
							 | 
						||
| 
								 | 
							
								                            'image' => '',
							 | 
						||
| 
								 | 
							
								                        ];
							 | 
						||
| 
								 | 
							
								                        $goods_data = $good;
							 | 
						||
| 
								 | 
							
								                        $goods['spec_value_str'] = $goods_data['spec_value'];
							 | 
						||
| 
								 | 
							
								                        $goods['goods_name'] = $goods_data['goods_name'];
							 | 
						||
| 
								 | 
							
								                        $goods['image'] = empty($goods_data['spec_image']) ? UrlServer::getFileUrl($goods_data['image']) : UrlServer::getFileUrl($goods_data['spec_image']);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                        $order_goods[] = $goods;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    $result['sid'] = $item['sid'];
							 | 
						||
| 
								 | 
							
								                    $result['shop_name'] = $item['shop_name'];
							 | 
						||
| 
								 | 
							
								                    $result['shop_type'] = ShopEnum::getShopTypeDesc($item['shop_type']);
							 | 
						||
| 
								 | 
							
								                    $result['shop_logo'] = UrlServer::getFileUrl($item['shop_logo']);
							 | 
						||
| 
								 | 
							
								                    $result['order_goods'] = $order_goods;
							 | 
						||
| 
								 | 
							
								                    $result['order_sn'] = $item['order_sn'];
							 | 
						||
| 
								 | 
							
								                    $result['create_time'] = $item['create_time'];
							 | 
						||
| 
								 | 
							
								                    $result['after_sale']['desc'] = '';
							 | 
						||
| 
								 | 
							
								                    $result['after_sale']['able_apply'] = 1;
							 | 
						||
| 
								 | 
							
								                    $result['after_sale']['sn'] = '';
							 | 
						||
| 
								 | 
							
								                    $result['after_sale']['create_time'] = '';
							 | 
						||
| 
								 | 
							
								                    if(isset($after_sale_lists[$item['id']]) && $after_sale_lists[$item['id']]){
							 | 
						||
| 
								 | 
							
								                        $after_sale_info = $after_sale_lists[$item['id']];
							 | 
						||
| 
								 | 
							
								                        $result['after_sale']['sn'] = $after_sale_info['sn'];
							 | 
						||
| 
								 | 
							
								                        $result['after_sale']['create_time'] = date('Y-m-d H:i:s', $after_sale_info['create_time']);
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    if (self::checkAfterSaleDate($item) === false) {
							 | 
						||
| 
								 | 
							
								                        $result['after_sale']['desc'] = '该商品已超过售后期';
							 | 
						||
| 
								 | 
							
								                        $result['after_sale']['able_apply'] = 0;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    $time = $item['confirm_take_time'] ?? $item['create_time'];
							 | 
						||
| 
								 | 
							
								                    $result['time'] = $time;
							 | 
						||
| 
								 | 
							
								                    $data[] = $result;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                $list = ['list' => $data, 'page' => $page, 'size' => $size, 'count' => $count, 'more' => is_more($count, $page, $size)];
							 | 
						||
| 
								 | 
							
								                return $list;
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            case 'apply':
							 | 
						||
| 
								 | 
							
								                $where[] = ['g.refund_status', 'in', [OrderGoodsEnum::REFUND_STATUS_APPLY, OrderGoodsEnum::REFUND_STATUS_WAIT]];
							 | 
						||
| 
								 | 
							
								                $where[] = ['o.order_status', 'in', [Order::STATUS_WAIT_RECEIVE, Order::STATUS_FINISH]];
							 | 
						||
| 
								 | 
							
								                $where[] = ['a.del', '=', 0];
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            case 'finish':
							 | 
						||
| 
								 | 
							
								                $where[] = ['g.refund_status', '=', OrderGoodsEnum::REFUND_STATUS_SUCCESS];
							 | 
						||
| 
								 | 
							
								                $where[] = ['a.del', '=', 0];
							 | 
						||
| 
								 | 
							
								                $where[] = ['o.order_status', 'in', [Order::STATUS_WAIT_RECEIVE, Order::STATUS_FINISH, Order::STATUS_CLOSE]];
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $field = 'g.order_id,g.goods_id,g.item_id,g.goods_num,g.goods_name,g.image,g.spec_value,g.goods_price,a.sn,a.status,a.refund_type,a.id as after_sale_id,a.create_time,s.id as sid,s.name as shop_name,s.logo as shop_logo,s.type as shop_type';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $count = Db::name('order_goods')
							 | 
						||
| 
								 | 
							
								            ->alias("g")
							 | 
						||
| 
								 | 
							
								            ->field($field)
							 | 
						||
| 
								 | 
							
								            ->join('order o', 'g.order_id = o.id')
							 | 
						||
| 
								 | 
							
								            ->join('after_sale a', 'a.order_goods_id = g.id', 'left')
							 | 
						||
| 
								 | 
							
								            ->join('shop s', 'o.shop_id = s.id')
							 | 
						||
| 
								 | 
							
								            ->where($where)
							 | 
						||
| 
								 | 
							
								            ->count();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $lists = Db::name('order_goods')
							 | 
						||
| 
								 | 
							
								            ->alias("g")
							 | 
						||
| 
								 | 
							
								            ->field($field)
							 | 
						||
| 
								 | 
							
								            ->join('order o', 'g.order_id = o.id')
							 | 
						||
| 
								 | 
							
								            ->join('after_sale a', 'a.order_goods_id = g.id', 'left')
							 | 
						||
| 
								 | 
							
								            ->join('shop s', 'o.shop_id = s.id')
							 | 
						||
| 
								 | 
							
								            ->where($where)
							 | 
						||
| 
								 | 
							
								            ->order('a.id desc')
							 | 
						||
| 
								 | 
							
								            ->page($page, $size)
							 | 
						||
| 
								 | 
							
								            ->select();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        foreach ($lists as $k => $item) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $goods_data = $item;
							 | 
						||
| 
								 | 
							
								            $goods_name = $goods_data['goods_name'];
							 | 
						||
| 
								 | 
							
								            $image = empty($goods_data['spec_image']) ? UrlServer::getFileUrl($goods_data['image']) : UrlServer::getFileUrl($goods_data['spec_image']);
							 | 
						||
| 
								 | 
							
								            $result = [
							 | 
						||
| 
								 | 
							
								                'order_id' => $item['order_id'],
							 | 
						||
| 
								 | 
							
								                'order_goods' => [[
							 | 
						||
| 
								 | 
							
								                    'goods_id' => $item['goods_id'],
							 | 
						||
| 
								 | 
							
								                    'item_id' => $item['item_id'],
							 | 
						||
| 
								 | 
							
								                    'goods_name' => $goods_name,
							 | 
						||
| 
								 | 
							
								                    'goods_num' => $item['goods_num'],
							 | 
						||
| 
								 | 
							
								                    'goods_price' => $item['goods_price'],
							 | 
						||
| 
								 | 
							
								                    'image' => $image,
							 | 
						||
| 
								 | 
							
								                    'spec_value_str' => $goods_data['spec_value'],
							 | 
						||
| 
								 | 
							
								                    'create_time' => $goods_data['create_time'],
							 | 
						||
| 
								 | 
							
								                ]],
							 | 
						||
| 
								 | 
							
								                'after_sale' => [
							 | 
						||
| 
								 | 
							
								                    'after_sale_id' => $item['after_sale_id'],
							 | 
						||
| 
								 | 
							
								                    'status' => $item['status'],
							 | 
						||
| 
								 | 
							
								                    'refund_type' => $item['refund_type'],
							 | 
						||
| 
								 | 
							
								                    'status_text' => AfterSale::getStatusDesc($item['status']),
							 | 
						||
| 
								 | 
							
								                    'type_text' => AfterSale::getRefundTypeDesc($item['refund_type']),
							 | 
						||
| 
								 | 
							
								                    'desc' => AfterSale::getStatusDesc($item['status']),
							 | 
						||
| 
								 | 
							
								                    'able_apply' => 1,
							 | 
						||
| 
								 | 
							
								                    'sn' => $item['sn'],
							 | 
						||
| 
								 | 
							
								                    'create_time' => date('Y-m-d H:i:s', $item['create_time']),
							 | 
						||
| 
								 | 
							
								                ],
							 | 
						||
| 
								 | 
							
								                'time' => date('Y-m-d H:i', $item['create_time']),
							 | 
						||
| 
								 | 
							
								            ];
							 | 
						||
| 
								 | 
							
								            $result['sid'] = $item['sid'];
							 | 
						||
| 
								 | 
							
								            $result['shop_name'] = $item['shop_name'];
							 | 
						||
| 
								 | 
							
								            $result['shop_type'] = ShopEnum::getShopTypeDesc($item['shop_type']);
							 | 
						||
| 
								 | 
							
								            $result['shop_logo'] = UrlServer::getFileUrl($item['shop_logo']);
							 | 
						||
| 
								 | 
							
								            $data[] = $result;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $list = [
							 | 
						||
| 
								 | 
							
								            'list' => $data,
							 | 
						||
| 
								 | 
							
								            'page' => $page,
							 | 
						||
| 
								 | 
							
								            'size' => $size,
							 | 
						||
| 
								 | 
							
								            'count' => $count,
							 | 
						||
| 
								 | 
							
								            'more' => is_more($count, $page, $size)
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								        return $list;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @notes 申请售后
							 | 
						||
| 
								 | 
							
								     * @param $post
							 | 
						||
| 
								 | 
							
								     * @param $user_id
							 | 
						||
| 
								 | 
							
								     * @return array
							 | 
						||
| 
								 | 
							
								     * @throws Exception
							 | 
						||
| 
								 | 
							
								     * @throws \think\exception\PDOException
							 | 
						||
| 
								 | 
							
								     * @author suny
							 | 
						||
| 
								 | 
							
								     * @date 2021/7/13 6:07 下午
							 | 
						||
| 
								 | 
							
								     * 验证(收货后多少天内才可申请售后/或已发货,未收货). 售后日志
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function add($post, $user_id)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Db::startTrans();
							 | 
						||
| 
								 | 
							
								        try {
							 | 
						||
| 
								 | 
							
								            //1,增加售后记录
							 | 
						||
| 
								 | 
							
								            $order_goods = Db::name('order_goods')
							 | 
						||
| 
								 | 
							
								                ->alias('g')
							 | 
						||
| 
								 | 
							
								                ->field('g.id,g.goods_num,g.total_pay_price,g.order_id,g.refund_status,g.goods_id')
							 | 
						||
| 
								 | 
							
								                ->join('order o', 'o.id = g.order_id')
							 | 
						||
| 
								 | 
							
								                ->where(['order_id' => $post['order_id'], 'g.item_id' => $post['item_id']])
							 | 
						||
| 
								 | 
							
								                ->find();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $data = [
							 | 
						||
| 
								 | 
							
								                'sn' => createSn('after_sale', 'sn', '', 4),
							 | 
						||
| 
								 | 
							
								                'user_id' => $user_id,
							 | 
						||
| 
								 | 
							
								                'order_id' => $order_goods['order_id'],
							 | 
						||
| 
								 | 
							
								                'order_goods_id' => $order_goods['id'],
							 | 
						||
| 
								 | 
							
								                'item_id' => $post['item_id'],
							 | 
						||
| 
								 | 
							
								                'goods_id' => $order_goods['goods_id'],
							 | 
						||
| 
								 | 
							
								                'goods_num' => $order_goods['goods_num'],
							 | 
						||
| 
								 | 
							
								                'refund_reason' => trim($post['reason']),
							 | 
						||
| 
								 | 
							
								                'refund_remark' => isset($post['remark']) ? trim($post['remark']) : '',
							 | 
						||
| 
								 | 
							
								                'refund_image' => isset($post['img']) ? $post['img'] : '',
							 | 
						||
| 
								 | 
							
								                'refund_type' => $post['refund_type'],
							 | 
						||
| 
								 | 
							
								                'refund_price' => $order_goods['total_pay_price'],
							 | 
						||
| 
								 | 
							
								                'create_time' => time(),
							 | 
						||
| 
								 | 
							
								            ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $after_sale_id = Db::name('after_sale')->insertGetId($data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            //2,更改订单商品,退款状态为申请退款
							 | 
						||
| 
								 | 
							
								            Db::name('order_goods')
							 | 
						||
| 
								 | 
							
								                ->where('id', $order_goods['id'])
							 | 
						||
| 
								 | 
							
								                ->update(['refund_status' => OrderGoodsEnum::REFUND_STATUS_APPLY]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            //记录日志
							 | 
						||
| 
								 | 
							
								            AfterSaleLogLogic::record(
							 | 
						||
| 
								 | 
							
								                AfterSaleLog::TYPE_USER,
							 | 
						||
| 
								 | 
							
								                AfterSaleLog::USER_APPLY_REFUND,
							 | 
						||
| 
								 | 
							
								                $post['order_id'],
							 | 
						||
| 
								 | 
							
								                $after_sale_id,
							 | 
						||
| 
								 | 
							
								                $user_id,
							 | 
						||
| 
								 | 
							
								                AfterSaleLog::USER_APPLY_REFUND
							 | 
						||
| 
								 | 
							
								            );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $order = Order::with('shop')->where(['id' => $post['order_id']])->find();
							 | 
						||
| 
								 | 
							
								            if (!empty($order['shop']['mobile'])) {
							 | 
						||
| 
								 | 
							
								                //通知商家
							 | 
						||
| 
								 | 
							
								                event('Notice', [
							 | 
						||
| 
								 | 
							
								                    'scene' => NoticeEnum::AFTER_SALE_NOTICE_SHOP,
							 | 
						||
| 
								 | 
							
								                    'mobile' => $order['shop']['mobile'],
							 | 
						||
| 
								 | 
							
								                    'params' => [
							 | 
						||
| 
								 | 
							
								                        'user_id' => $user_id,
							 | 
						||
| 
								 | 
							
								                        'after_sale_sn' => $data['sn']
							 | 
						||
| 
								 | 
							
								                    ]
							 | 
						||
| 
								 | 
							
								                ]);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Db::commit();
							 | 
						||
| 
								 | 
							
								            return ['after_sale_id' => $after_sale_id];
							 | 
						||
| 
								 | 
							
								        } catch (Exception $e) {
							 | 
						||
| 
								 | 
							
								            Db::rollback();
							 | 
						||
| 
								 | 
							
								            throw new Exception($e->getMessage());
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @notes 售后商品信息
							 | 
						||
| 
								 | 
							
								     * @param $item_id
							 | 
						||
| 
								 | 
							
								     * @param $order_id
							 | 
						||
| 
								 | 
							
								     * @return array
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\DataNotFoundException
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\DbException
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\ModelNotFoundException
							 | 
						||
| 
								 | 
							
								     * @author suny
							 | 
						||
| 
								 | 
							
								     * @date 2021/7/13 6:08 下午
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function info($item_id, $order_id)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $goods = new OrderGoods();
							 | 
						||
| 
								 | 
							
								        $where = ['order_id' => $order_id, 'item_id' => $item_id];
							 | 
						||
| 
								 | 
							
								        $info = $goods->where($where)->find()->toArray();
							 | 
						||
| 
								 | 
							
								        $goods['image'] = isset($info['image']) ? UrlServer::getFileUrl($info['image']) : '';
							 | 
						||
| 
								 | 
							
								        $data = [
							 | 
						||
| 
								 | 
							
								            'goods' => $info,
							 | 
						||
| 
								 | 
							
								            'reason' => AfterSale::getReasonLists(),
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								        return $data;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @notes 上传退货快递信息
							 | 
						||
| 
								 | 
							
								     * @param $user_id
							 | 
						||
| 
								 | 
							
								     * @param $post
							 | 
						||
| 
								 | 
							
								     * @return bool
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\DataNotFoundException
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\DbException
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\ModelNotFoundException
							 | 
						||
| 
								 | 
							
								     * @author suny
							 | 
						||
| 
								 | 
							
								     * @date 2021/7/13 6:08 下午
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function express($user_id, $post)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $id = $post['id'];
							 | 
						||
| 
								 | 
							
								        $after_sale = AfterSale::find($id);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $after_sale->express_name = $post['express_name'];
							 | 
						||
| 
								 | 
							
								        $after_sale->invoice_no = $post['invoice_no'];
							 | 
						||
| 
								 | 
							
								        $after_sale->express_remark = isset($post['express_remark']) ? trim($post['express_remark']) : null;
							 | 
						||
| 
								 | 
							
								        $after_sale->express_image = isset($post['express_image']) ? $post['express_image'] : null;
							 | 
						||
| 
								 | 
							
								        $after_sale->status = AfterSale::STATUS_WAIT_RECEIVE_GOODS;//售后状态
							 | 
						||
| 
								 | 
							
								        $result = $after_sale->save();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //记录日志
							 | 
						||
| 
								 | 
							
								        AfterSaleLogLogic::record(
							 | 
						||
| 
								 | 
							
								            AfterSaleLog::TYPE_USER,
							 | 
						||
| 
								 | 
							
								            AfterSaleLog::USER_SEND_EXPRESS,
							 | 
						||
| 
								 | 
							
								            $after_sale['order_id'],
							 | 
						||
| 
								 | 
							
								            $id,
							 | 
						||
| 
								 | 
							
								            $user_id,
							 | 
						||
| 
								 | 
							
								            AfterSaleLog::USER_SEND_EXPRESS
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								        return $result;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @notes 撤销申请
							 | 
						||
| 
								 | 
							
								     * @param $user_id
							 | 
						||
| 
								 | 
							
								     * @param $post
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\DataNotFoundException
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\DbException
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\ModelNotFoundException
							 | 
						||
| 
								 | 
							
								     * @author suny
							 | 
						||
| 
								 | 
							
								     * @date 2021/7/13 6:08 下午
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function cancel($user_id, $post)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $id = $post['id'];
							 | 
						||
| 
								 | 
							
								        $after_sale = AfterSale::find($id);
							 | 
						||
| 
								 | 
							
								        $after_sale->del = 1;
							 | 
						||
| 
								 | 
							
								        $after_sale->update_time = time();
							 | 
						||
| 
								 | 
							
								        $after_sale->save();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //2,更改订单商品,退款状态为申请退款
							 | 
						||
| 
								 | 
							
								        $order_goods = OrderGoods::find(['id' => $after_sale['order_goods_id']]);
							 | 
						||
| 
								 | 
							
								        $order_goods->refund_status = OrderGoodsEnum::REFUND_STATUS_NO;
							 | 
						||
| 
								 | 
							
								        $order_goods->save();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //记录日志
							 | 
						||
| 
								 | 
							
								        AfterSaleLogLogic::record(
							 | 
						||
| 
								 | 
							
								            AfterSaleLog::TYPE_USER,
							 | 
						||
| 
								 | 
							
								            AfterSaleLog::USER_CANCEL_REFUND,
							 | 
						||
| 
								 | 
							
								            $after_sale['order_id'],
							 | 
						||
| 
								 | 
							
								            $id,
							 | 
						||
| 
								 | 
							
								            $user_id,
							 | 
						||
| 
								 | 
							
								            AfterSaleLog::USER_CANCEL_REFUND
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @notes 售后详情
							 | 
						||
| 
								 | 
							
								     * @param $get
							 | 
						||
| 
								 | 
							
								     * @return array
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\DataNotFoundException
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\DbException
							 | 
						||
| 
								 | 
							
								     * @throws \think\db\exception\ModelNotFoundException
							 | 
						||
| 
								 | 
							
								     * @author suny
							 | 
						||
| 
								 | 
							
								     * @date 2021/7/13 6:08 下午
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function detail($get)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $after_sale = new AfterSale();
							 | 
						||
| 
								 | 
							
								        $field = 'a.id,a.sn,a.order_goods_id,a.refund_reason,a.refund_image,a.refund_type,a.refund_price,a.refund_remark,a.create_time,a.status,o.shop_id,s.id sid,s.name shop_name,s.type shop_type';
							 | 
						||
| 
								 | 
							
								        $detail = $after_sale
							 | 
						||
| 
								 | 
							
								            ->alias('a')
							 | 
						||
| 
								 | 
							
								            ->field($field)
							 | 
						||
| 
								 | 
							
								            ->join('order o', 'o.id = a.order_id')
							 | 
						||
| 
								 | 
							
								            ->join('shop s', 's.id = o.shop_id')
							 | 
						||
| 
								 | 
							
								            ->with(['order_goods'])
							 | 
						||
| 
								 | 
							
								            ->where(['a.id' => $get['id'], 'a.del' => 0])
							 | 
						||
| 
								 | 
							
								            ->find()
							 | 
						||
| 
								 | 
							
								            ->toArray();
							 | 
						||
| 
								 | 
							
								        $detail['shop_type'] = ShopEnum::getShopTypeDesc($detail['shop_type']);
							 | 
						||
| 
								 | 
							
								        if (!$detail) {
							 | 
						||
| 
								 | 
							
								            return [];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $detail['refund_image'] = empty($detail['refund_image']) ? '' : UrlServer::getFileUrl($detail['refund_image']);
							 | 
						||
| 
								 | 
							
								        $detail['status_text'] = AfterSale::getStatusDesc($detail['status']);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $detail['order_goods'] = $detail['order_goods'][0];
							 | 
						||
| 
								 | 
							
								        $goods = $detail['order_goods'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $image = $goods['image'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $detail['order_goods']['image'] = empty($goods['spec_image']) ? $image : $goods['spec_image'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $detail['order_goods']['goods_name'] = $goods['goods_name'];
							 | 
						||
| 
								 | 
							
								        $detail['order_goods']['spec_value'] = $goods['spec_value'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $detail['refund_type_text'] = AfterSale::getRefundTypeDesc($detail['refund_type']);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $shop_id = $detail['shop_id'];
							 | 
						||
| 
								 | 
							
								        $shop_info = ShopModel::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'] ?? ''; //详细地址
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (empty($shop_province) || empty($shop_city) || empty($shop_district)) {
							 | 
						||
| 
								 | 
							
								            $arr = [];
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            $arr = [$shop_province, $shop_city, $shop_district];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $address = AreaServer::getAddress($arr, $shop_address);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $shop = [
							 | 
						||
| 
								 | 
							
								            'contact' => $refund_address['nickname'] ?? '',
							 | 
						||
| 
								 | 
							
								            'mobile' => $refund_address['mobile'] ?? '',
							 | 
						||
| 
								 | 
							
								            'address' => $address
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $detail['shop'] = $shop;
							 | 
						||
| 
								 | 
							
								        return $detail;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @notes 重新申请
							 | 
						||
| 
								 | 
							
								     * @param $user_id
							 | 
						||
| 
								 | 
							
								     * @param $post
							 | 
						||
| 
								 | 
							
								     * @return array
							 | 
						||
| 
								 | 
							
								     * @throws Exception
							 | 
						||
| 
								 | 
							
								     * @throws \think\exception\PDOException
							 | 
						||
| 
								 | 
							
								     * @author suny
							 | 
						||
| 
								 | 
							
								     * @date 2021/7/13 6:08 下午
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function again($user_id, $post)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Db::startTrans();
							 | 
						||
| 
								 | 
							
								        try {
							 | 
						||
| 
								 | 
							
								            $id = $post['id'];
							 | 
						||
| 
								 | 
							
								            $after_sale = AfterSale::find($id);
							 | 
						||
| 
								 | 
							
								            $after_sale->refund_type = $post['refund_type'];
							 | 
						||
| 
								 | 
							
								            $after_sale->refund_reason = trim($post['reason']);
							 | 
						||
| 
								 | 
							
								            $after_sale->refund_remark = isset($post['remark']) ? trim($post['remark']) : '';
							 | 
						||
| 
								 | 
							
								            $after_sale->refund_image = isset($post['img']) ? $post['img'] : '';
							 | 
						||
| 
								 | 
							
								            $after_sale->status = AfterSale::STATUS_APPLY_REFUND;
							 | 
						||
| 
								 | 
							
								            $after_sale_result = $after_sale->save();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            //2,更改订单商品,退款状态为申请退款
							 | 
						||
| 
								 | 
							
								            $order_goods = OrderGoods::find(['id' => $after_sale['order_goods_id']]);
							 | 
						||
| 
								 | 
							
								            $order_goods->refund_status = OrderGoodsEnum::REFUND_STATUS_APPLY;
							 | 
						||
| 
								 | 
							
								            $order_goods_result = $order_goods->save();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            //记录日志
							 | 
						||
| 
								 | 
							
								            AfterSaleLogLogic::record(
							 | 
						||
| 
								 | 
							
								                AfterSaleLog::TYPE_USER,
							 | 
						||
| 
								 | 
							
								                AfterSaleLog::USER_AGAIN_REFUND,
							 | 
						||
| 
								 | 
							
								                $after_sale['order_id'],
							 | 
						||
| 
								 | 
							
								                $id,
							 | 
						||
| 
								 | 
							
								                $user_id,
							 | 
						||
| 
								 | 
							
								                AfterSaleLog::USER_AGAIN_REFUND
							 | 
						||
| 
								 | 
							
								            );
							 | 
						||
| 
								 | 
							
								            Db::commit();
							 | 
						||
| 
								 | 
							
								            return ['after_sale_id' => $id];
							 | 
						||
| 
								 | 
							
								        } catch (Exception $e) {
							 | 
						||
| 
								 | 
							
								            Db::rollback();
							 | 
						||
| 
								 | 
							
								            throw new Exception($e->getMessage());
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @notes 检查是否在售后时间内
							 | 
						||
| 
								 | 
							
								     * @param $order
							 | 
						||
| 
								 | 
							
								     * @return bool
							 | 
						||
| 
								 | 
							
								     * @author suny
							 | 
						||
| 
								 | 
							
								     * @date 2021/7/13 6:08 下午
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function checkAfterSaleDate($order)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $now = time();
							 | 
						||
| 
								 | 
							
								        $refund_days = ConfigServer::get('transaction', 'order_after_sale_days', 7 * 86400, 0);
							 | 
						||
| 
								 | 
							
								        if ($refund_days == 0) {
							 | 
						||
| 
								 | 
							
								            return true;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($order['order_status'] == Order::STATUS_FINISH) {
							 | 
						||
| 
								 | 
							
								            $check_time = strtotime('+' . $refund_days . 'day', $order['confirm_take_time']);
							 | 
						||
| 
								 | 
							
								            if ($now > $check_time) {
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |