InquiryFormData.php 4.6 KB
<?php

namespace App\Models\Inquiry;

use App\Helper\FormGlobalsoApi;
use App\Models\Base;
use App\Utils\LogUtils;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

/**
 * Class InquiryFormData
 * @package App\Models\Inquiry
 * @author zbj
 * @date 2023/12/4
 */
class InquiryFormData extends Base
{
    use SoftDeletes;

    //设置关联表名
    /**
     * @var mixed
     */
    protected $connection = "custom_mysql";
    protected $table = 'gl_inquiry_form_data';


    /**
     * 根据提交数据的key获取表单id
     * @param $form_id
     * @param $domain
     * @param $ip
     * @param $country
     * @param $referer
     * @param $user_agent
     * @param $submit_at
     * @param $data
     * @return mixed
     * @author zbj
     * @date 2023/12/4
     */
    public static function saveData($form_id, $domain, $ip, $country, $referer, $user_agent, $submit_at, $data, $traffic = 0){
        if(!empty($data['email'])){
            $data['email'] = str_replace(' ', '', $data['email']);
        }
        if(!empty($data['phone'])){
            $data['phone'] = str_replace(' ', '', $data['phone']);
        }

        //数据标识
        $sign_data = $data;
        ksort($sign_data);
        if(!empty($sign_data['globalso-date'])){
            unset($sign_data['globalso-date']);
        }
        if(!empty($sign_data['__amp_source_origin'])){
            unset($sign_data['__amp_source_origin']);
            unset($data['__amp_source_origin']);
        }
        $sign = md5(json_encode($sign_data));
        //30分钟内是否有重复数据
        $is_exist = self::where('sign', $sign)->where('created_at', '>', date('Y-m-d H:i:s', strtotime('-30 minute')))->first();
        if($is_exist){
            return 0;
        }

        if(!empty($data['name']) && !empty($data['email']) && !empty($data['message'])){
            Log::channel('inquiry')->info('开始发邮件' . PHP_EOL);

            unset($data['globalso-domain_host_url']);
            unset($data['globalso-domain']);
            unset($data['globalso-edition']);
            unset($data['globalso-date']);

            //推送邮件发送
            foreach ($data as $k => $v){
                if(is_array($v) && !empty($v['path'])){
                    $v = getImageUrl($v['path']);
                    $data[$k] = $v;
                }
                //其他字段补充到message里
                if(!in_array($k, ['name', 'email', 'message', 'phone', 'ip', 'date', 'cname', 'domain', 'edition', 'domain_host_url'])){
                    $data['message'].=  "<br/>" . $k .': ' . $v;
                }
            }
            $res = (new FormGlobalsoApi())->submitInquiry($ip, $referer, $submit_at, $data, $traffic);
            Log::channel('inquiry')->info('询盘发送邮件', [$data, $res]);
            if(!$res){
                throw new \Exception('询盘发送邮件失败');
            }
        }

        $model = new self();
        $model->form_id = $form_id;
        $model->domain = $domain;
        $model->ip = $ip;
        $model->country =  $country;
        $model->referer = $referer;
        $model->user_agent = $user_agent;
        $model->submit_at =  $submit_at;
        $model->data = $data;
        $model->sign = $sign;
        $model->save();

        return $model->id;
    }

    public function setDataAttribute($value)
    {
        $this->attributes['data'] = json_encode($value);
    }

    public function getDataAttribute($value)
    {
        return json_decode($value, true);
    }

    /**
     * 非默认表单的数量统计
     * @author zbj
     * @date 2023/12/12
     */
    public static function getCount($submit_at = []){
        return self::leftjoin('gl_inquiry_form', 'gl_inquiry_form.id', '=', 'gl_inquiry_form_data.form_id')
            ->where('gl_inquiry_form.is_default', 0)
            ->when($submit_at, function ($query, $submit_at) {
                $query->whereBetween('submit_at',[$submit_at[0], $submit_at[1]]);
            })
            ->count();
    }

    /**
     * 非默认表单的国家统计
     * @author zbj
     * @date 2023/12/12
     */
    public static function getCountryCount($submit_at = []){
        return self::leftjoin('gl_inquiry_form', 'gl_inquiry_form.id', '=', 'gl_inquiry_form_data.form_id')
            ->where('gl_inquiry_form.is_default', 0)
            ->when($submit_at, function ($query, $submit_at) {
                $query->whereBetween('submit_at',[$submit_at[0], $submit_at[1]]);
            })
            ->select("country",DB::raw('COUNT(*) as count'))->groupBy('country')->get()->toArray();
    }
}