Order.php 6.6 KB
<?php

namespace addons\groupon\model;

use think\Model;
use addons\groupon\exception\Exception;
use addons\groupon\library\traits\model\order\OrderScope;
use think\Db;
use think\Queue;
use traits\model\SoftDelete;
use addons\groupon\library\traits\model\order\OrderOper;
use addons\groupon\library\traits\model\order\OrderStatus;

/**
 * 订单模型
 */
class Order extends Model
{
    use SoftDelete, OrderOper, OrderScope, OrderStatus;

    // 表名,不含前缀
    protected $name = 'groupon_order';
    // 自动写入时间戳字段
    protected $autoWriteTimestamp = 'int';
    // 定义时间戳字段名
    protected $createTime = 'createtime';
    protected $updateTime = 'updatetime';
    protected $deleteTime = 'deletetime';

    protected $hidden = ['updatetime', 'deletetime'];
    // //列表动态隐藏字段
    // protected static $list_hidden = ['content', 'params', 'images', 'service_ids'];

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

    // 订单状态
    const STATUS_INVALID = -2;
    const STATUS_CANCEL = -1;
    const STATUS_NOPAY = 0;
    const STATUS_PAYED = 1;
    const STATUS_FINISH = 2;

    // 评价状态
    const COMMENT_STATUS_NO = 0;       // 待评价
    const COMMENT_STATUS_OK = 1;       // 已评价
    

    /* -------------------------- 访问器 ------------------------ */

    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 = '订单已取消';
                $btns[] = 'delete';     // 删除订单
                break;
            case 'invalid':
                $status_name = '交易关闭';
                $status_desc = '交易关闭';
                $btns[] = 'delete';     // 删除订单
                break;
            case 'nopay':
                $status_name = '待付款';
                $status_desc = '等待买家付款';
                $btns[] = 'cancel';     // 取消订单
                $btns[] = 'pay';        // 支付
                break;

            // 已支付的
            case 'commented':
                $status_name = '已评价';
                $status_desc = '订单已评价';

                break;
            case 'nocomment':
                $status_name = '待评价';
                $status_desc = '等待买家评价';
                // if ($data['comment_status'] == self::COMMENT_STATUS_NO) {      // 自提点评价状态
                //     $btns[] = 'comment';
                // }
                break;
            case 'noget':
                $status_name = '待提货';
                $status_desc = '等待买家提货';
                break;
            case 'noarrive':
                $status_name = '待备货';
                $status_desc = '等待平台备货';
                
                break;
            case 'nosend':
                $status_name = '待备货';
                $status_desc = '等待平台备货';
                break;
            
            case 'refund_finish':
                $status_name = '退款完成';
                $status_desc = '订单退款完成';

                break;
            case 'refund_ing':
                $status_name = '退款处理中';
                $status_desc = '退款处理中';

                break;
            case 'finish':
                $status_name = '交易完成';
                $status_desc = '交易完成';
                $btns[] = 'delete';     // 删除订单
                break;
        }

        // 判断,只要有一个 item 没确认收货就显示确认收货按钮
        foreach ($this->item as $key => $item) {
            // 获取 item status
            $item_status_code = (new OrderItem)->getBaseStatusCode($item->toArray(), 'order');

            // 只要有一个未确认收货,就显示确认收货按钮,并且立即停止循环
            if ($item_status_code == 'noget') {
                $btns[] = 'confirm';     // 确认收货
                break;
            }
        }

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

    /* -------------------------- 访问器 ------------------------ */



    /* -------------------------- 模型关联 ------------------------ */

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

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

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

    public function verify() {
        return $this->hasMany(\addons\groupon\model\Verify::class, 'order_id', 'id');
    }

    /**
     * 只保留基本信息
     */
    public function itemSlim()
    {
        return $this->hasMany(\addons\groupon\model\OrderItem::class, 'order_id', 'id')
                    ->field('id,user_id,order_id,goods_id,goods_type,goods_sku_price_id,activity_id,activity_type,item_goods_sku_price_id,goods_sku_text,goods_title,goods_image,goods_original_price,discount_fee,goods_price,goods_num,dispatch_status,dispatch_type,dispatch_id,store_id,comment_status,refund_status,ext');
    }

    // 拼团只有一个商品,可以使用这个
    public function firstItem()
    {
        return $this->hasOne(\addons\groupon\model\OrderItem::class, 'order_id', 'id');
    }
    /* -------------------------- 模型关联 ------------------------ */
}