SyncProject.php 12.2 KB
<?php

namespace App\Console\Commands;

use App\Helper\Arr;
use App\Helper\Common;
use App\Helper\OaGlobalsoApi;
use App\Models\Channel\Channel;
use App\Models\Com\NoticeLog;
use App\Models\Project\After;
use App\Models\Project\DeployBuild;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Payment;
use App\Models\Project\Project;
use App\Models\Project\ProjectRenew;
use App\Utils\LogUtils;
use Hashids\Hashids;
use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;

/**
 * 同步项目信息
 * Class ChannelInfo
 * @package App\Console\Commands
 * @author zbj
 * @date 2023/6/27
 */
class SyncProject extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'sync_project';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '同步项目信息';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * @return bool
     */
    public function handle()
    {
        while (true){
            $list = NoticeLog::where('type', NoticeLog::TYPE_PROJECT)->where('status', NoticeLog::STATUS_PENDING)->get();
            foreach ($list as $item){
                try {
                    $api = new OaGlobalsoApi();
                    $data = $api->order_info($item['data']['order_id']);
                    if(!$data || empty($data['data'])){
                        LogUtils::error('OaGlobalsoApi order_info error', $data);
                        $this->retry($item);
                    }
                    if($data['data']['order_type'] == '首次'){
                        $this->sync($data['data']);

                        //同步aicc
                        if($data['data']['exclusive_aicc']){
                            $this->toAicc($data['data']);
                        }
                        //同步hagro
                        if($data['data']['exclusive_hagro']){
                            $this->toHagro($data['data']);
                        }
                    }
                    if($data['data']['order_type'] == '续费'){
                        $this->renewSync($data['data']);
                    }
                    $item->status = NoticeLog::STATUS_SUCCESS;
                    $item->save();
                }catch (\Exception $e){
                    errorLog('项目同步失败', $item, $e);
                    $this->retry($item);
                }
            }
            sleep(2);
        }

    }

    /**
     * @param NoticeLog $log
     */
    public function retry($log){
        if($log->retry >= 3){
            $log->status = NoticeLog::STATUS_FAIL;
        }else{
            $log->retry = $log->retry + 1;
        }
        $log->save();
    }

    /**
     * @remark :同步续费记录单
     * @name   :renewSync
     * @author :lyh
     * @method :post
     * @time   :2023/8/11 15:33
     */
    public function renewSync($param){
        $title = date('Ymd') . '-' . $param['company_name'];;
        $data = [
            'title' => '【续费单】'.$title,
            'company' => $param['company_name'],
            'lead_name' => $param['principal_name'],
            'mobile' => $param['principal_mobile'],
            'qq' => $param['customer_qq'],
            'channel' => json_encode(Channel::getProjectChannel($param['company_id'], $param['username_sales'])),
            'requirement' => $param['remark'],
            'cooperate_date' => date('Y-m-d', $param['create_time']),
            'service_duration' => $param['years'],
            'plan' => $this->versionData($param['plan_marketing']),
//            'api_no' => $param['id'],  //改手动填
            'amount' => $param['plan_price'],
            'contract' => json_encode($param['files']),
            'bill' => json_encode($param['images']),
        ];
        $renewModel = new ProjectRenew();
        $rs = $renewModel->add($data);
        if($rs === false){
            errorLog('项目续费单同步失败');
        }
        return true;
    }

    /**
     * @remark :获取版本
     * @name   :versionData
     * @author :lyh
     * @method :post
     * @time   :2023/8/9 14:46
     */
    public function versionData($param){
        $data = Project::planMap();
        $data = array_flip($data);
        if(isset($data[$param])){
            return $data[$param];
        }else{
            return 1;
        }
    }

    /**
     * @remark :导入数据
     * @name   :sync
     * @author :lyh
     * @method :post
     * @time   :2023/8/9 15:04
     */
    public function sync($param){
        $title = date('Ymd') . '-' . $param['company_name'];
        $data = [
            'project'=>[
                'title' => $title,
                'company' => $param['company_name'],
                'lead_name' => $param['principal_name'],
                'mobile' => $param['principal_mobile'],
                'mysql_id'=>Project::MYSQL_ID,
                'qq' => $param['customer_qq'],
                'channel' => Channel::getProjectChannel($param['company_id'], $param['username_sales']),
                'requirement' => $param['remark'],
                'cooperate_date' => date('Y-m-d', $param['create_time']),
                'from_order_id' => $param['from_order_id'],
                'aicc' => $param['exclusive_aicc'],
                "exclusive_aicc_day" => $param['exclusive_aicc_day'],
                'hagro' => $param['exclusive_hagro'],
                "exclusive_hagro_day" => $param['exclusive_hagro_day'],
                'notice_order_id' => $param['id'],
            ],
            'deploy_build' => [
                'service_duration' => $param['years'],
                'plan' => $this->versionData($param['plan_marketing']),
                'login_mobile'=>$param['principal_mobile']
            ],
            'deploy_optimize' => [
                'api_no' => $param['id']
            ],
            'project_after' => [],
            'payment' => [
                'amount' => $param['plan_price'],
                'contract'=>$param['files'],
                'bill'=>$param['images']
            ],
        ];
        DB::beginTransaction();
        try {
            $id = $this->saveProject($data['project']);
            $this->setPostId($data['deploy_build']['plan'],$id);;
            $this->savePayment($data['payment'],$id);
            $this->saveDeployBuild($data['deploy_build'],$id);
            $this->saveDeployOptimize($data['deploy_optimize'],$id);
            $this->saveAfter($data['project_after'],$id);
            DB::commit();
        }catch (\Exception $e){
            DB::rollBack();
            throw new \Exception($e->getMessage());
        }
    }

    /**
     * @remark :设置post_id
     * @name   :setPostId
     * @author :lyh
     * @method :post
     * @time   :2023/8/9 14:47
     */
    public function setPostId($plan,$id){
        $length = strlen((string)$id); // 获取变量的位数
        $paddingLength = Project::TYPE_FIVE - $length; // 计算填充前面的 0 的位数
        $zeros = str_repeat("0", $paddingLength);
        $number = Project::TYPE_SIX.$plan.$zeros.$id;
        $projectModel = new Project();
        $projectModel->edit(['post_id'=>$number],['id'=>$id]);
        return true;
    }

    /**
     * @remark :保存项目
     * @name   :saveProject
     * @author :lyh
     * @method :post
     * @time   :2023/8/30 15:53
     */
    public function saveProject($param){
        if(isset($param['channel']) && !empty($param['channel'])){
            $param['channel'] = Arr::a2s($param['channel']);
        }
        $projectModel = new Project();
        $info = $projectModel->read(['from_order_id'=>$param['from_order_id']]);
        if($info !== false){
            $projectModel->edit($param, ['id' => $info['id']]);
            return $info['id'];
        }else{
            return $projectModel->addReturnId($param);
        }
    }

    /**
     * 保存优化部署
     * @author zbj
     * @date 2023/4/26
     */
    protected function saveAfter($param,$id){
        $param['project_id'] = $id;
        //查询数据是否存在
        $afterModel = new After();
        $info = $afterModel->read(['project_id'=>$id]);
        if($info !== false){
            $afterModel->edit($param,['id'=>$info['id']]);
        }else{
            $afterModel->add($param);
        }
    }

    /**
     * @remark :保存付款续费
     * @name   :savePayment
     * @author :lyh
     * @method :post
     * @time   :2023/8/29 16:19
     */
    protected function savePayment($param,$id){
        $param['project_id'] = $id;
        $paymentModel= new Payment();
//        if(isset($param['contract']) && !empty($param['contract'])){
            $param['contract'] = Arr::a2s($param['contract']);
//        }
//        if(isset($param['bill']) && !empty($param['bill'])){
            $param['bill'] = Arr::a2s($param['bill']);
//        }
        $info = $paymentModel->read(['project_id'=>$id]);
        if($info !== false){
            $paymentModel->edit($param,['id'=>$info['id']]);
        }else{
            $paymentModel->add($param);
        }
    }

    /**
     * @remark :保存建站部署
     * @name   :saveDeployBuild
     * @author :lyh
     * @method :post
     * @time   :2023/8/29 16:19
     */
    protected function saveDeployBuild($param,$id){
        $param['project_id'] = $id;
        $hashids = new Hashids('test_domain', 5, 'abcdefghjkmnpqrstuvwxyz1234567890');
        $code = $hashids->encode($id);
        $param['test_domain'] = 'https://v6-' . $code . '.globalso.site/';
        $deployBuildModel = new DeployBuild();
        $info = $deployBuildModel->read(['project_id'=>$id]);
        if($info !== false){
            $deployBuildModel->edit($param,['id'=>$info['id']]);
        }else{
            $deployBuildModel->add($param);
        }
    }

    /**
     * @remark :保存优化信息
     * @name   :saveDeployOptimize
     * @author :lyh
     * @method :post
     * @time   :2023/8/30 16:11
     */
    protected function saveDeployOptimize($param,$id){
        $param['project_id'] = $id;
        $deployOptimizeModel = new DeployOptimize();
        $info = $deployOptimizeModel->read(['project_id'=>$id]);
        if($info !== false){
            $deployOptimizeModel->edit($param,['id'=>$info['id']]);
        }else{
            $deployOptimizeModel->add($param);
        }
    }

    /**
     * 同步到AICC
     * @param $data
     * @author zbj
     * @date 2023/9/1
     */
    protected function toAicc($data){
        $url = 'https://biz.ai.cc/api/sync_company_for_order';
        $param = [
            'company_name' => $data['company_name'],
            'company_address' => '',
            'company_tel' => $data['principal_mobile'],
            'company_email' => '',
            'remark' => $data['remark'],
            'level_id' => 6,
            'level_day' => $data['exclusive_aicc_day'] ?: 1,
            'from_order_id' => $data['from_order_id'],
        ];

        //sign
        ksort($param);
        $tem = [];
        foreach ($param as $key => $val) {
            $tem[] = $key . '=' . urlencode($val);
        }
        $string = implode('&', $tem);
        $key = md5('quanqiusou.com');
        $param['sign'] = md5($string . $key);
        $res = Http::withoutVerifying()->post($url, $param)->json();
        if(empty($res['status']) || $res['status'] != 200){
            LogUtils::error('ProjectToAicc error', $res);
        }
    }

    /**
     * 同步到Hagro
     * @param $data
     * @author zbj
     * @date 2023/9/1
     */
    protected function toHagro($data){
        $url = 'https://admin.hagro.cn/globalso/create_project';
        $param = [
            'company' => $data['company_name'],
            'phone' => $data['principal_mobile'],
            'planday' => $data['exclusive_aicc_day'] ?: 1,
            'from_order_id' => $data['from_order_id'],
        ];
        $common = new Common();
        $token = $common->encrypt($param);
        $res = Http::withoutVerifying()->get($url, ['token' => $token])->json();
        if(empty($res['code']) || $res['code'] != 200){
            LogUtils::error('ProjectToHagro error', $res);
        }
    }
}