221 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			221 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
 | 
						|
namespace addons\xilufitness\model;
 | 
						|
 | 
						|
 | 
						|
use addons\xilufitness\services\CourseService;
 | 
						|
use addons\xilufitness\services\user\PointService;
 | 
						|
use addons\xilufitness\services\user\UserService;
 | 
						|
use addons\xilufitness\traits\BaseModel;
 | 
						|
use think\Db;
 | 
						|
use think\Log;
 | 
						|
use think\Model;
 | 
						|
use traits\model\SoftDelete;
 | 
						|
 | 
						|
class Order extends Model
 | 
						|
{
 | 
						|
 | 
						|
    use SoftDelete;
 | 
						|
    use BaseModel;
 | 
						|
 | 
						|
 | 
						|
    // 表名
 | 
						|
    protected $name = 'xilufitness_order';
 | 
						|
 | 
						|
    // 自动写入时间戳字段
 | 
						|
    protected $autoWriteTimestamp = 'integer';
 | 
						|
 | 
						|
    // 定义时间戳字段名
 | 
						|
    protected $createTime = 'createtime';
 | 
						|
    protected $updateTime = 'updatetime';
 | 
						|
    protected $deleteTime = 'deletetime';
 | 
						|
 | 
						|
    // 追加属性
 | 
						|
    protected $append = [
 | 
						|
        'pay_body',
 | 
						|
        'pay_time',
 | 
						|
        'goods_num',
 | 
						|
        'code_url',
 | 
						|
        'code_total_num',
 | 
						|
        'show_cancel'
 | 
						|
    ];
 | 
						|
 | 
						|
    public function getOrderStatusAttr($value,$data){
 | 
						|
        $value = $value ? $value : $data['order_status'] ?? 0;
 | 
						|
        $end_at = $data['endtime'] ?? 0;
 | 
						|
        return time() > $end_at && in_array($value,[1,2]) ? 5 : $value;
 | 
						|
    }
 | 
						|
 | 
						|
    // 获取支付title信息
 | 
						|
    public function getPayBodyAttr($value,$data){
 | 
						|
        $orderGoods = new \addons\xilufitness\model\OrderGoods;
 | 
						|
        $goodsName = $orderGoods->where(['order_id' => xilufitness_get_id_value($data['id']) ?? 0])->value('goods_name');
 | 
						|
        return $goodsName;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getPayTimeAttr($value,$data){
 | 
						|
        $value = $value ? $value : ($data['pay_time'] ?? '');
 | 
						|
        return !empty($value) && is_numeric($value) ? date('m.d H:i') : $value;
 | 
						|
    }
 | 
						|
 | 
						|
    // 数量
 | 
						|
    public function getGoodsNumAttr($value,$data){
 | 
						|
        $value = $value ? $value : (xilufitness_get_id_value($data['id'] ?? 0));
 | 
						|
        return $this->getNum($value);
 | 
						|
    }
 | 
						|
 | 
						|
    public function getNum($id){
 | 
						|
        $orderGoodsModel = new \addons\xilufitness\model\OrderGoods;
 | 
						|
        $nums = $orderGoodsModel->where(['order_id' => xilufitness_get_id_value($id ?? 0)])->sum('num');
 | 
						|
        return $nums;
 | 
						|
    }
 | 
						|
 | 
						|
    // 核销码数量
 | 
						|
    public function getCodeTotalNumAttr($value,$data){
 | 
						|
        $goods_num = $this->getNum($data['id']) ?? 1;
 | 
						|
        $order_type = $data['order_type'] ?? 1;
 | 
						|
        if($order_type == 0){
 | 
						|
            return 0;
 | 
						|
        } elseif($order_type == 3){
 | 
						|
            $campDetail = CourseService::getInstance()->getCampDetail($data['data_id'] ?? 0);
 | 
						|
            $class_count = $campDetail['info']['class_count'] ?? 1;
 | 
						|
            return  $goods_num * $class_count;
 | 
						|
        } else {
 | 
						|
            $campDetail = CourseService::getInstance()->getDetail($data['data_id'] ?? 0);
 | 
						|
            $class_count = $campDetail['info']['class_count'] ?? 1;
 | 
						|
            return  $goods_num * $class_count;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    //是否显示取消按钮
 | 
						|
    public function getShowCancelAttr($value,$data){
 | 
						|
        $order_type = $data['order_type'] ?? 1;
 | 
						|
        $pay_status = $data['pay_status'] ?? 0;
 | 
						|
        if($order_type == 0 || $pay_status == 0){
 | 
						|
            return 0;
 | 
						|
        } elseif($order_type == 3){
 | 
						|
            $start_at = Db::name('xilufitness_work_camp')->where(['id' => $data['data_id']])->value('start_at');
 | 
						|
            return $start_at > time() ? 1 : 0;
 | 
						|
        } else {
 | 
						|
            $start_at = Db::name('xilufitness_work_course')->where(['id' => $data['data_id']])->value('start_at');
 | 
						|
            return $start_at > time() ? 1 : 0;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    //获取核销码
 | 
						|
    public function getCodeUrlAttr($value,$data){
 | 
						|
        $value = $value ? $value : ($data['id'] ?? 0);
 | 
						|
        $code_url = url('/addons/xilufitness/order/getCodeInfo',['id' => $value],true,true);
 | 
						|
        return $code_url;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    //关联订单明细
 | 
						|
    public function goods(){
 | 
						|
        return $this->belongsTo(OrderGoods::class,'id','order_id',[],'LEFT')->setEagerlyType(0);
 | 
						|
    }
 | 
						|
 | 
						|
    //关联门店
 | 
						|
    public function shop(){
 | 
						|
        return $this->belongsTo(Shop::class,'shop_id','id',[],'LEFT')->setEagerlyType(0);
 | 
						|
    }
 | 
						|
 | 
						|
    //关联用户
 | 
						|
    public function user(){
 | 
						|
        return $this->belongsTo(User::class,'user_id','id',[],'LEFT')->setEagerlyType(0);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 添加订单明细
 | 
						|
     * @param int $order_id 订单id
 | 
						|
     * @param int $order_type 订单类型
 | 
						|
     * @param int $num 数量
 | 
						|
     * @param array|object $goodsInfo
 | 
						|
     */
 | 
						|
    public function addGoods($order_id,$order_type,$num,$goodsInfo){
 | 
						|
        $model = new \addons\xilufitness\model\OrderGoods;
 | 
						|
        $item['order_id'] = xilufitness_get_id_value($order_id);
 | 
						|
        $item['order_type'] = $order_type;
 | 
						|
        $item['goods_id'] = xilufitness_get_id_value($goodsInfo['id'] ?? 0);
 | 
						|
        if($order_type == 0){
 | 
						|
            $item['goods_name'] = '会员充值';
 | 
						|
            $item['sale_price'] = $goodsInfo['recharge_amount'] ?? 0;
 | 
						|
            $item['total_price'] = round(bcmul($goodsInfo['account_amount'],$num,2),2);
 | 
						|
        } elseif($order_type == 3){
 | 
						|
            $item['goods_name'] = $goodsInfo['camp']['title'] ?? '';
 | 
						|
            $item['thumb_image'] = $goodsInfo['camp']['xilufitness_urls']['thumb_image'] ?? '';
 | 
						|
            $item['sale_price'] = $goodsInfo['camp_price'] ?? 0;
 | 
						|
            $item['total_price'] = round(bcmul($goodsInfo['camp_price'],$num,2),2);
 | 
						|
            $item['course_camp_id'] = $goodsInfo['camp_id'] ?? 0;
 | 
						|
        } elseif($order_type == 4){
 | 
						|
            $item['goods_name'] = $goodsInfo['cardname'] ?? '';
 | 
						|
            $item['thumb_image'] = $goodsInfo['card_avatar'] ?? '';
 | 
						|
            $item['sale_price'] = $goodsInfo['cardprice'] ?? 0;
 | 
						|
            $item['total_price'] = round(bcmul($goodsInfo['cardprice'],$num,2),2);
 | 
						|
        } else {
 | 
						|
            $item['goods_name'] = $goodsInfo['course']['title'] ?? '';
 | 
						|
            $item['thumb_image'] = $goodsInfo['course']['xilufitness_urls']['thumb_image'] ?? '';
 | 
						|
            $item['sale_price'] = $goodsInfo['course_price'] ?? 0;
 | 
						|
            $item['total_price'] = round(bcmul($goodsInfo['course_price'],$num,2),2);
 | 
						|
            $item['course_camp_id'] = $goodsInfo['course_id'] ?? 0;
 | 
						|
        }
 | 
						|
        $item['num'] = $num;
 | 
						|
        return $model->allowField(true)->save($item);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 支付成功
 | 
						|
     * @param object $orderInfo
 | 
						|
     * @param string $trade_no
 | 
						|
     * @param int $pay_type 支付方式
 | 
						|
     */
 | 
						|
    public function payAfter(object $orderInfo, string $trade_no,int $pay_type=2){
 | 
						|
        try {
 | 
						|
            Db::startTrans();
 | 
						|
            $pay_time = time();
 | 
						|
            $result = $orderInfo->save(['pay_status' => 1, 'order_status' => $orderInfo['order_status'] == 0 ? 1 : $orderInfo['order_status'],'pay_time' => $pay_time, 'trade_no' => $trade_no, 'pay_type' => $pay_type]);
 | 
						|
            if(false !== $result){
 | 
						|
                //修改支付流水数据
 | 
						|
                (new \addons\xilufitness\model\CashFlow)->payAfter($orderInfo,0,$pay_time,$pay_type);
 | 
						|
                //余额记录变化
 | 
						|
                if($orderInfo['order_type'] == 0){
 | 
						|
                    $this->userAccountChange('会员充值',$orderInfo['total_amount'],1,$orderInfo['order_type'],$orderInfo,$orderInfo['brand_id'] ?? 0);
 | 
						|
                } elseif ($orderInfo['pay_type'] == 1 && $orderInfo['pay_amount'] > 0){
 | 
						|
                    $this->userAccountChange('余额支付',$orderInfo['pay_amount'],2,$orderInfo['order_type'],$orderInfo);
 | 
						|
                }
 | 
						|
                //优惠券状态修改
 | 
						|
                if(!empty($orderInfo['coupon_id']) && $orderInfo['coupon_amount']){
 | 
						|
                    (new \addons\xilufitness\model\UserCoupon)->save(['coupon_status' => 2],['id' => $orderInfo['coupon_id']]);
 | 
						|
                }
 | 
						|
                //积分增加
 | 
						|
                $this->userPointChange('支付送积分',1,1,$orderInfo,$orderInfo['brand_id']);
 | 
						|
 | 
						|
            }
 | 
						|
            Db::commit();
 | 
						|
        } catch (\Exception $e){
 | 
						|
            Db::rollback();
 | 
						|
            Log::record('支付回调出错:'.$e->getMessage());
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 会员充值 余额变化
 | 
						|
     * @param float $accountAmount 余额变化
 | 
						|
     * @param int $amount_type 余额类型
 | 
						|
     * @param int $account_type 账户类型
 | 
						|
     * @param object $orderInfo 订单详情
 | 
						|
     */
 | 
						|
    public function userAccountChange($title,$accountAmount,$amount_type,$account_type,$orderInfo,$brand_id=0){
 | 
						|
        return UserService::getInstance()->userAccountChange($title,$orderInfo->user_id,$orderInfo->id,$accountAmount,$amount_type,$account_type,$brand_id);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 会员积分变化
 | 
						|
     */
 | 
						|
    public function userPointChange($title,$rule_type,$point_type,$orderInfo,$brand_id=0){
 | 
						|
        return PointService::getInstance()->sendPoint($title,$orderInfo->user_id,$rule_type,$orderInfo->id,$point_type,$orderInfo->pay_amount,$brand_id);
 | 
						|
    }
 | 
						|
 | 
						|
} |