Order.php 6.8 KB
<?php

namespace app\admin\model\groupon\order;

use addons\groupon\library\traits\model\order\OrderOper;
use addons\groupon\library\traits\model\order\OrderScope;
use addons\groupon\library\traits\model\order\OrderStatus;
use app\admin\model\groupon\activity\Activity;
use think\Model;
use traits\model\SoftDelete;
use think\Log;

class Order extends Model
{

    use OrderOper, OrderScope, OrderStatus, SoftDelete;

    

    // 表名
    protected $name = 'groupon_order';
    
    // 自动写入时间戳字段
    protected $autoWriteTimestamp = 'int';

    // 定义时间戳字段名
    protected $createTime = 'createtime';
    protected $updateTime = 'updatetime';
    protected $deleteTime = 'deletetime';

    // 追加属性
    protected $append = [
        'status_text',
        'pay_type_text',
        'paytime_text',
        'platform_text',
        'ext_arr',
        'status_code',
        'status_name',
        'status_desc',
        'btns',
    ];

    // 订单状态
    const STATUS_INVALID = -2;      // 已失效|交易关闭
    const STATUS_CANCEL = -1;       // 已取消
    const STATUS_NOPAY = 0;         // 未付款
    const STATUS_PAYED = 1;         // 买家已付款
    const STATUS_FINISH = 2;        // 已完成
    
    public function getStatusList()
    {
        return ['-2' => __('Status -2'), '-1' => __('Status -1'), '0' => __('Status 0'), '1' => __('Status 1'), '2' => __('Status 2')];
    }

    public function getPayTypeList()
    {
        return ['wechat' => __('Pay_type wechat'), 'wallet' => __('Pay_type wallet')];
    }

    public function getPlatformList()
    {
        return ['H5' => __('Platform h5'), 'wxOfficialAccount' => __('Platform wxofficialaccount'), 'wxMiniProgram' => __('Platform wxminiprogram')];
    }


    public function getStatusTextAttr($value, $data)
    {
        return $this->getStatus($data, 'status_name');
    }


    public function getPayTypeTextAttr($value, $data)
    {
        $value = $value ? $value : (isset($data['pay_type']) ? $data['pay_type'] : '');
        $list = $this->getPayTypeList();
        return isset($list[$value]) ? $list[$value] : '';
    }


    public function getPaytimeTextAttr($value, $data)
    {
        $value = $value ? $value : (isset($data['paytime']) ? $data['paytime'] : '');
        return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
    }


    public function getPlatformTextAttr($value, $data)
    {
        $value = $value ? $value : (isset($data['platform']) ? $data['platform'] : '');
        $list = $this->getPlatformList();
        return isset($list[$value]) ? $list[$value] : '';
    }

    protected function setPaytimeAttr($value)
    {
        return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
    }

    public function getExtArrAttr($value, $data)
    {
        $ext = (isset($data['ext']) && $data['ext']) ? json_decode($data['ext'], true) : [];

        if ($ext && isset($ext['activity_discount_infos']) && $ext['activity_discount_infos']) {

            foreach ($ext['activity_discount_infos'] as $key => $info) {
                $ext['activity_discount_infos'][$key]['activity_type_text'] = Activity::getTypeList()[$info['activity_type']];

                $ruleData = [
                    'type' => $info['rule_type'],
                    'full' => $info['discount_rule']['full'],
                    'discount' => $info['activity_type'] == 'full_gift' ? $info['discount_rule']['total'] : $info['discount_rule']['discount']
                ];

                $ext['activity_discount_infos'][$key]['format_text'] = \addons\groupon\model\Activity::formatDiscountTags($info['activity_type'], $ruleData);
            }
        }
        return $ext;
    }


    protected function getStatus($data, $type)
    {
        $btns = [];
        $status_name = '';
        $status_desc = '';

        switch ($this->status_code) {
            case 'cancel':
                $status_name = '已取消';
                $status_desc = '买家已取消';
                break;
            case 'invalid':
                $status_name = '交易关闭';
                $status_desc = '买家未在规定时间内付款,订单将按照预定时间逾期自动关闭';
                break;
            case 'nopay':
                $status_name = '待付款';
                $status_desc = '买家已下单,等待付款';
                break;

                // 已支付的
            case 'commented':
                $status_name = '已评价';
                $status_desc = '买家已评价';
                $btns[] = 'refund';        // 全部退款  直接不申请退款
                break;
            case 'nocomment':
                $status_name = '未评价';
                $status_desc = '等待买家评价';
                $btns[] = 'refund';        // 全部退款  直接不申请退款
                break;
            case 'noget':
                $status_name = '待取货';
                $status_desc = '商品已到达指定自提点,等待用户取货';
                $btns[] = 'refund';        // 全部退款  直接不申请退款
                break;
            case 'noarrive':
                $status_name = '已备货';
                $status_desc = '平台已备货,等待自提点签收';
                $btns[] = 'refund';        // 全部退款  直接不申请退款
                break;
            case 'nosend':
                $status_name = '买家已付款';
                $status_desc = '请尽快安排给相应自提点备货';

                $btns[] = 'refund';        // 全部退款  直接不申请退款
                break;
            case 'refund_finish':
                $status_name = '退款完成';
                $status_desc = '订单退款完成';
                break;
            case 'refund_ing':
                $status_name = '退款处理中';
                $status_desc = '请尽快处理退款';
                $btns[] = 'refund';        // 全部退款  直接不申请退款
                break;
                // 已支付的结束

            case 'finish':
                $status_name = '交易完成';
                $status_desc = '交易已完成';
                break;
        }

        return $type == 'status_name' ? $status_name : ($type == 'btns' ? $btns : $status_desc);
    }



    public function user () 
    {
        return $this->belongsTo(\app\admin\model\User::class, 'user_id');
    }

    public function store () 
    {
        return $this->belongsTo(\app\admin\model\groupon\store\Store::class, 'store_id');
    }

    public function item()
    {
        return $this->hasMany(\app\admin\model\groupon\order\OrderItem::class, 'order_id');
    }

    public function express()
    {
        return $this->hasMany(\app\admin\model\groupon\order\OrderExpress::class, 'order_id');
    }

}