AdsController.php 13.9 KB
<?php
/**
 * Created by PhpStorm.
 * User: zhl
 * Date: 2024/10/8
 * Time: 15:32
 */
namespace App\Http\Controllers\Aside\Task;

use App\Enums\Common\Code;
use App\Helper\Arr;
use App\Helper\QuanqiusouApi;
use App\Http\Controllers\Aside\BaseController;
use App\Models\Channel\Channel;
use App\Models\Domain\DomainInfo;
use App\Models\Inquiry\ReInquiryCost;
use App\Models\Inquiry\ReInquiryCount;
use App\Models\Inquiry\ReInquiryDetail;
use App\Models\Inquiry\ReInquiryForm;
use App\Models\Inquiry\ReInquiryTask;
use App\Models\Project\Project;
use App\Utils\HttpUtils;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;

/**
 * Class AdsController
 * @package App\Http\Controllers\Aside\Special
 */
class AdsController extends BaseController
{

    /**
     * 广告列表
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function fbAdsList(Request $request)
    {
        $title = trim($request->input('title'));
        $industry = trim($request->input('industry'));
        $ad_id = trim($request->input('ad_id'));
        $status = $request->input('status', '');
        $page_size = intval($request->input('row', '20'));
        $result = ReInquiryTask::when($ad_id, function ($query, $ads_id) {
                return $query->where('ad_id', 'like', '%' . $ads_id . '%');
            })
            ->when($title, function ($query, $title) {
                return $query->where('title', 'like', '%' . $title . '%');
            })
            ->when($industry, function ($query, $industry) {
                return $query->where('industry', 'like', '%' . $industry . '%');
            })
            ->where(function ($query)use($status) {
                if(is_numeric($status)){
                    return $query->where('status', $status);
                }
            })
            ->orderBy('id', 'desc')
            ->paginate($page_size)
            ->toArray();

        $relay_site_total = 0;
        foreach ($result['list'] as &$item){
            $relay_site_total += count($item['target']);
            $item['requiry_num'] = ReInquiryDetail::where('task_id', $item['id'])->where('status', ReInquiryDetail::STATUS_SUCCESS)->count();
            $item['form_num'] = ReInquiryForm::whereIn('ad_id', explode(',', $item['ad_id']))->count();
            //关联网站是否有重复的
            foreach ($item['target'] as $k=>$target){
                $repeat = ReInquiryTask::where('target', 'like', '%'.$target['url'].'%')->where('id', '<>', $item['id'])->first();
                $item['target'][$k]['is_repeat'] = $repeat ? 1 : 0;
            }
            $item['cost'] = ReInquiryCost::getCostByAdIds($item['ad_id']);
        }
        $result['relay_site_total'] = $relay_site_total;
        $result['default_ai_param'] = ReInquiryTask::DEFAULT_AI_PARAM;

        return $this->response('success', Code::SUCCESS, $result);
    }

    /**
     * 新增或修改广告
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function setFbAds(Request $request)
    {
        $id = intval($request->input('id'));
        $title = trim($request->input('title'));
        $industry = trim($request->input('industry'));
        $ad_id = trim($request->input('ad_id'));
        $ad_url = trim($request->input('ad_url'));
        $ad_img = trim($request->input('ad_img'));
        $num = intval($request->input('num'));
        $status = intval($request->input('status'));
        $is_replace_text = intval($request->input('is_replace_text'));
        $ai_param = $request->input('ai_param');
        if (empty($title) || empty($ad_id))
            return $this->response('请填写完整信息!', Code::USER_ERROR, []);

        //AI生成
        if($is_replace_text == 2){
            if(empty($ai_param['mkeywords'])){
                return $this->response('工厂关键词不能为空!', Code::USER_ERROR, []);
            }
            if(empty($ai_param['characters'])){
                return $this->response('随机字符数不能为空!', Code::USER_ERROR, []);
            }
            if(empty($ai_param['inkeywords'])){
                return $this->response('询盘内容关键词不能为空!', Code::USER_ERROR, []);
            }
            if(empty($ai_param['suoxie'])){
                return $this->response('英文缩写参考不能为空!', Code::USER_ERROR, []);
            }
        }
        ReInquiryTask::createTask($id, $title, $industry, $ad_id, $ad_url, $ad_img, $num, $status, $is_replace_text, $ai_param);
        return $this->response('success', Code::SUCCESS, []);
    }

    /**
     * 设置转发站点
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function setRelaySite(Request $request)
    {
        $id = intval($request->input('id', 0));
        $target = $request->input('target', []);
        $shop_site = $request->input('shop_site', []);
        $fob_pro = $request->input('fob_pro', []);
        $task = ReInquiryTask::find($id);
        if(!$task){
            return $this->response('广告不存在!', Code::USER_ERROR, []);
        }
        if(empty($target)){
            return $this->response('请添加关联网站!', Code::USER_ERROR, []);
        }
        $is_require_num = 0;
        foreach ($target as &$item){
            if(empty($item['url'])){
                return $this->response('网站域名不能为空!', Code::USER_ERROR, []);
            }
            if(empty($item['agent'])){
                return $this->response('代理不能为空!', Code::USER_ERROR, []);
            }
            if(empty($item['agent_group'])){
                return $this->response('代理商分组不能为空!', Code::USER_ERROR, []);
            }
            $item['url'] = trim(str_replace(['http://', 'https://'], '', $item['url']), '/');
            if(!empty($item['is_require'])){
                $is_require_num++;
            }
        }
        if($is_require_num > $task->num){
            return $this->response('必选渠道不能大于转发数量!', Code::USER_ERROR, []);
        }
        foreach ($target as $v){
            ReInquiryCount::addInquiryNum($id, $v['url'], 0);
        }

        //商城
        foreach ($shop_site as &$url) {
            if (empty($url)) {
                return $this->response('商城网站域名不能为空!', Code::USER_ERROR, []);
            }
            $url = trim(str_replace(['http://', 'https://'], '', $url), '/');
            $res = Http::get($url . '/index.php?route=api/ai_inquiry/add')->json();
            if (!$res) {
                return $this->response($url . '不是商城网站!', Code::USER_ERROR, []);
            }
            ReInquiryCount::addInquiryNum($id, $url, 0,  2);
        }
        //超级项目
        foreach ($fob_pro as &$postid) {
            if (empty($postid)) {
                return $this->response('项目ID不能为空!', Code::USER_ERROR, []);
            }
            ReInquiryCount::addInquiryNum($id, $postid, 0,  3);
        }

        $task->target = json_encode($target);
        $task->shop_site = json_encode($shop_site);
        $task->fob_pro = json_encode($fob_pro);
        $task->save();
        return $this->response('success', Code::SUCCESS, []);
    }

    public function fob_projects(){
        $res = ReInquiryCount::getFobProjects();
        return $this->response('success', Code::SUCCESS, $res);
    }

    /**
     * 验证站点5.0还是6.0, 代理商信息
     * @param Request $request
     */
    public function checkDomain(Request $request)
    {
        $domain = $request->input('domain');
        $domain = trim(str_replace(['http://', 'https://'], '', $domain), '/');
        //是否v6
        $domain_info = DomainInfo::where('domain', $domain)->first();
        if($domain_info){
            $channel = Project::where('id', $domain_info['project_id'])->where('delete_status', 0)->value('channel');
            if($channel){
                $data = [
                    'is_v6' => 1,
                    'agent' => Channel::getChannelText($channel['user_id']??0),
                    'agent_group' => trim(explode('-', Channel::getChannelText($channel['user_id']??0))[0]),
                    'domain' => $domain,
                ];
                return $this->response('success', Code::SUCCESS, $data);
            }
        }
        $res = (new QuanqiusouApi())->getV5Agent($domain);
        if(empty($res['status']) || $res['status'] != 200){
            return $this->response($res['msg'] ?? '验证失败,请稍后再试!', Code::USER_ERROR, []);
        }

        $data = [
            'is_v6' => 0,
            'agent' => $res['data'],
            'agent_group' => trim(explode('-', explode(',', $res['data'] ?? '')[0])[0]),
            'domain' => $domain,
        ];
        return $this->response('success', Code::SUCCESS, $data);
    }

    /**
     * FB广告产生询盘列表
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function fbInquiryList(Request $request)
    {
        $status = intval($request->input('status'));
        $ad_name = $request->input('ad_name');
        $ad_id = $request->input('ad_id');
        $country = $request->input('country');
        $page_size = intval($request->input('row', '20'));
        $result = ReInquiryForm::when($status, function ($query, $status) {
                return $query->where('status', $status);
            })
            ->when($ad_name, function ($query, $ad_name) {
                return $query->where('ad_name', 'like', '%' . $ad_name . '%');
            })
            ->when($ad_id, function ($query, $ad_id) {
                return $query->where('ad_id', 'like', '%' . $ad_id . '%');
            })
            ->when($country, function ($query, $country) {
                return $query->where('country', 'like', '%' . $country . '%');
            })
            ->orderBy('inquiry_date', 'desc')
            ->paginate($page_size);
        return $this->response('success', Code::SUCCESS, $result);
    }

    /**
     * FB询盘统计
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @author zbj
     * @date 2024/11/25
     */
    public function fbInquiryChart(Request $request)
    {
        $start_date = $request->input('start_date', date('Y-m-d', strtotime('-1 month')));
        $end_date = $request->input('end_date', date('Y-m-d'));
        $result = ReInquiryForm::select(DB::raw('DATE(inquiry_date) as date'), DB::raw('COUNT(*) as count'))
            ->whereBetween('inquiry_date', [$start_date, date('Y-m-d', strtotime($end_date . ' +1 day'))])
            ->groupBy(DB::raw('DATE(inquiry_date)'))
            ->pluck('count', 'date')->toArray();
        $data = [];
        while ($start_date <= $end_date) {
            $data[$start_date] = $result[$start_date]??0;
            $start_date = date('Y-m-d', strtotime($start_date . ' + 1 day'));
        }

        return $this->response('success', Code::SUCCESS, $data);
    }

    /**
     * FB询盘转发详情
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function fbRelayDetail(Request $request)
    {
        //广告ID、询盘ID、国家、状态
        $status = intval($request->input('status'));
        $task_id = intval($request->input('task_id'));
        $form_id = intval($request->input('form_id'));
        $country = intval($request->input('country'));
        $page_size = intval($request->input('row', '20'));
        $domain = trim($request->input('domain', ''));
        $result = ReInquiryDetail::with('detailLog')
            ->when($status, function ($query, $status) {
                return $query->where('status', $status);
            })
            ->when($form_id, function ($query, $form_id) {
                return $query->where('form_id', $form_id);
            })
            ->when($task_id, function ($query, $task_id) {
                return $query->where('task_id', $task_id);
            })
            ->when($country, function ($query, $country) {
                return $query->where('country', 'like', '%'.$country.'%');
            })
            ->when($domain, function ($query, $domain) {
                return $query->where('re_website', 'like', '%'.$domain.'%');
            })
            ->orderBy('id', 'desc')
            ->paginate($page_size);
        return $this->response('success', Code::SUCCESS, $result);
    }

    public function fbRelayCount(Request $request){
        $task_id = intval($request->input('task_id'));
        $domain = trim($request->input('domain'));
        $company = trim($request->input('company'));
        $operator = trim($request->input('operator'));
        $num = intval($request->input('num'));
        $row = intval($request->input('row', 20));

        $result = ReInquiryCount::when($task_id, function ($query, $task_id) {
                return $query->WhereRaw("FIND_IN_SET({$task_id}, `task_ids`)");
            })
            ->when($domain, function ($query, $domain) {
                return $query->where('domain', 'like', '%'.$domain.'%');
            })
            ->when($company, function ($query, $company) {
                return $query->where('company', 'like', '%'.$company.'%');
            })
            ->when($num, function ($query) use($num, $operator) {
                return $query->where('num', $operator?:'=', $num);
            })
            ->orderBy('num', 'desc')
            ->paginate($row);

        foreach ($result as &$item){
            $item->tasks = $item->tasks; //调用访问器
            $is_v6 = 0;
            foreach ($item->tasks as $task){
                if($task['is_v6']){
                    $is_v6 = 1;
                }
            }
            if($is_v6){
                $item['project_id'] = DomainInfo::where('domain', $item['domain'])->value('project_id') ?: 0;
            }else{
                $item['project_id'] = 0;
            }

        }

        return $this->response('success', Code::SUCCESS, $result);
    }
}