| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418 | <?php/** * Created by PhpStorm. * User: Administrator * Date: 2019/4/16 0016 * Time: 9:51 */namespace App\Http\Controllers\Admin;use App\Http\Controllers\Controller;use App\Http\Logics\Admin\ProcessLogic;use App\Http\Models\Process;use App\Http\Models\Site;use App\Http\Models\SiteProcess;use App\Http\Models\SiteRenewHistory;use App\Http\Requests\Process\RenewFormRequest;use App\Http\Traits\HasSites;use App\Libs\Ssh;use Illuminate\Http\Request;use Illuminate\Support\Facades\DB;use Illuminate\Support\Facades\Log;/** *项目流程 * Class ProcessController * @package App\Http\Controllers\Admin */class ProcessController extends Controller{    use  HasSites;    protected $logic;    public function __construct(ProcessLogic $logic)    {        $this->logic = $logic;    }    //客户界面的流程    public function customer()    {        $site = $this->hasUserOneSite();        if (!$site) {            return view('admin/errors/tips');        }        $processes = Process::query()->orderByDesc('order')->get();        $siteProcessList = SiteProcess::query()->where(['site_id' => $site->id])->get()->keyBy('process_id')->toArray();        return view('admin/process/customer', [            'processes' => $processes,            'siteId' => $site->id,            'processIdMapSiteProcessList' => $siteProcessList,            'site' => Site::query()->select(['id', 'domain'])->where(['id' => $site->id])->first()        ]);    }    /**     * 项目详情中的流程     * @param $siteId     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View     */    public function siteProcess($siteId)    {        $processes = Process::query()->orderByDesc('order')->get();        $siteProcessList = SiteProcess::query()->where(['site_id' => $siteId])->get()->keyBy('process_id')->toArray();        return view('admin/process/site_process', [            'processes' => $processes,            'siteId' => $siteId,            'processIdMapSiteProcessList' => $siteProcessList,            'site' => Site::query()->select(['id', 'domain'])->where(['id' => $siteId])->first()        ]);    }    /**     * 确认     * @param $id     * @return \Illuminate\Http\JsonResponse     */    public function confirm($id)    {        $siteProcess = SiteProcess::query()->where(['id' => $id])->first();        if (!$siteProcess) return response()->json(['message' => '具体流程信息不存在'], 400);        if ($siteProcess->active != 2) {            return response()->json(['message' => '此流程已完成请刷新页面查看最新数据'], 400);        }        //判断是否全部完成检查项        if (in_array($siteProcess->process_id, Process::HAS_CHECK_ITEM_IDS)) {            $process = Process::query()->where(['id' => $siteProcess->process_id])->first();            if (!$process) {                return response()->json(['message' => '主流程信息不存在'], 400);            }            if (array_diff(array_column($process->check_item_scopes, 'inx'), $siteProcess->check_items ?? [])) {                return response()->json(['message' => '请先完成全部检查项'], 400);            }        }        $siteProcess->active = 1;        $siteProcess->save();        $logic = new ProcessLogic;        $logic->changeStatus($siteProcess);        $logic->nextProcess($siteProcess);        return response()->json(['message' => '操作成功']);    }    /**     * 流程检查项     * @param Request $request     * @param $siteProcessId     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View     */    public function checkItem(Request $request, $siteProcessId)    {        $siteProcess = SiteProcess::query()->with('process')->where(['id' => $siteProcessId])->first();        if (!$siteProcess) return response()->json(['message' => '流程信息不存在'], 400);        if (!$request->ajax()) {            return view('admin/process/check_item', [                'siteProcess' => $siteProcess            ]);        }        $checkItems = $request->input('checkItems');        if (!is_array($checkItems)) return response()->json(['message' => '检查项参数错误'], 400);        $siteProcess->check_items = $checkItems;        $siteProcess->save();        return response()->json(['message' => '操作成功']);    }    /**     * 续签表单     * @param RenewFormRequest $request     * @param $siteProcessId     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View     */    public function renewForm(RenewFormRequest $request, $siteProcessId)    {        $siteProcess = SiteProcess::query()->where(['id' => $siteProcessId])->first();        if (!$siteProcess) return response()->json(['message' => '续签流程信息不存在'], 400);        if (!$request->ajax()) {            return view('admin/process/renew_form', [                'siteProcessId' => $siteProcessId            ]);        }        $site = Site::query()->where(['id' => $siteProcess->site_id])->first();        if (!$site) return response()->json(['message' => '站点信息不存在'], 400);        $validated = $request->validated();        $validated['site_id'] = $siteProcess->site_id;        $recordBak = [            'keyword_goal' => $site->keyword_goal,            'link_goal' => $site->link_goal,            'article_goal' => $site->article_goal,            'other_demand' => $site->other_demand        ];        $validated['remark'] = json_encode($recordBak);        SiteRenewHistory::query()->create($validated);        $site->update([            'keyword_goal' => $validated['keyword_goal'],            'link_goal' => $validated['link_goal'],            'article_goal' => $validated['article_goal'],            'other_demand' => $validated['other_demand']        ]);        return response()->json(['message' => '操作成功']);    }    //初始化项目流程    public function initProcess($siteId)    {        if (SiteProcess::query()->where(['site_id' => $siteId])->exists()) {            return response()->json(['message' => '流程已经存在不需要初始化'], 400);        }        $this->logic->initProcess($siteId);        return response()->json(['message' => '操作成功']);    }    //续费历史记录    public function renewHistory($siteId)    {        $historyList = SiteRenewHistory::query()->where(['site_id' => $siteId])->orderByDesc('id')->get();        return view('admin/process/renew_history', [            'historyList' => $historyList        ]);    }    //打分和反馈    public function scoreFeedback(Request $request, $id)    {        $siteProcess = SiteProcess::query()->where(['id' => $id])->first();        if (!$siteProcess) return response()->json(['message' => '流程信息不存在'], 400);        if (!$request->ajax()) {            return view('admin/process/score_feedback', [                'siteProcess' => $siteProcess            ]);        }        $inputs = $request->input();        if (empty($inputs['score']) || empty($inputs['feedback'])) {            return response()->json(['message' => '请填写表单内容'], 422);        }        if ($siteProcess->active != 2) {            return response()->json(['message' => '此流程已完成请刷新页面查看最新数据'], 400);        }        $siteProcess->active = 1;        $siteProcess->save();        $logic = new ProcessLogic;        $logic->changeStatus($siteProcess);        $logic->nextProcess($siteProcess);        $siteProcess->evaluate = [            'score' => $inputs['score'],            'feedback' => $inputs['feedback']        ];        $siteProcess->save();        return response()->json(['message' => '操作成功']);    }    //回复    public function reply(Request $request, $siteProcessId)    {        $siteProcess = SiteProcess::query()->where(['id' => $siteProcessId])->first();        if (!$siteProcess) return response()->json(['message' => '流程信息不存在'], 400);        if (!$request->ajax()) {            return view('admin/process/reply', [                'siteProcess' => $siteProcess            ]);        }        $reply = $request->input('reply');        if (!$reply) {            return response()->json(['message' => '回访记录不能为空'], 422);        }        $siteProcess->reply = $reply;        $siteProcess->save();        return response()->json(['message' => '操作成功']);    }    /**     * 流程激活     * @param Request $request     * @return \Illuminate\Http\JsonResponse     */    public function active(Request $request)    {        $siteProcess = SiteProcess::query()->where(['id' => $request->input('siteProcessId')])->first();        if (!$siteProcess) {            return response()->json(['message' => '流程信息不存在'], 400);        }        $siteProcess->active = 1;        $siteProcess->save();        return response()->json(['message' => '操作成功']);    }    /**     * 文件上传     * @param Request $request     * @param $siteProcessId     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View     */    public function fileUpload(Request $request, $siteProcessId)    {        $siteProcess = SiteProcess::query()->where(['id' => $siteProcessId])->first();        if (!$request->ajax()) {            return view('admin/process/file_upload', [                'siteProcess' => $siteProcess            ]);        }        if (!$siteProcess) return response()->json(['message' => '流程信息不存在'], 400);        $siteProcessFileList = $siteProcess->file_list ?? [];        $fileList = $request->input('file_list');        if ($fileList) {            $mergeFileList = array_merge($fileList, $siteProcessFileList);            $siteProcess->file_list = $mergeFileList;            $siteProcess->save();        }        return response()->json(['message' => '操作成功']);    }    /**     * 项目部署     * @param $siteId     * @return \Illuminate\Http\JsonResponse     */    public function deploy($siteId)    {        /*                $siteProcess = SiteProcess::query()->where(['id' => $siteProcessId])->first();                        if (!$siteProcess) return response()->json(['message' => '部署流程信息不存在'], 400);*/        $site = Site::query()->with('server')->where(['id' => $siteId])->first();        if (empty($site->server)) return response()->json(['message' => '站点服务器信息不存在'], 400);        if (empty($site->domain)) return response()->json(['message' => '域名信息不存在'], 400);        if ($site->database || $site->code_dir) {            return response()->json(['message' => '项目数据库信息与代码目录都存在,推测该站点之前已经部署'], 400);        }        if (!empty($site->database)) {            return response()->json(['message' => '项目已部署'], 400);        }        //if ($siteProcess->deploy) return response()->json(['message' => '项目已部署'], 400);        $ph = pathinfo($site->domain);  // pathinfo() 函数以数组的形式返回文件路径的信息        $dbName = 'sdb_' . str_replace(array('-', '.'), '', $ph['filename']);        $srcPath = '/repo/_sitetpl/';        $tarPath = '/repo/' . $site->domain;        try {            Ssh::factory($site->server->server_ip, $site->server->server_user_name, $site->server->server_passwd);        } catch (\Throwable $throwable) {            return response()->json(['message' => $throwable->getMessage()], 400);        }        Log::info(Ssh::exec('cp -rf ' . $srcPath . ' ' . $tarPath));        //新建数据库        $db_config = array(            'connection_name' => 'new_db',            'host' => $site->server->server_ip,            'port' => '3306',            'database' => 'sdb_sucocms',            'username' => $site->server->mysql_user_name,            'password' => $site->server->mysql_passwd        );        $new_db = config_connection($db_config);        try {            DB::connection($new_db)->statement('create database ' . $dbName);        } catch (\Throwable $throwable) {            Log::error(var_export($throwable->getMessage(), 1));            return response()->json(['message' => $throwable->getMessage()], 400);        }        Log::info(Ssh::exec("mysqldump sdb_sucocms -u root -p" . $site->server->mysql_passwd . " --add-drop-table | mysql " . $dbName . " -u root -p" . $site->server->mysql_passwd));        //数据库配置文件        $db_config_data = file_get_contents(public_path() . '/remote/db.conf.php');        $db_config_data = str_replace('{$dbname}', $dbName, $db_config_data);        $db_config_data = str_replace('{$mysql_user_name}', $site->server->mysql_user_name, $db_config_data);        $db_config_data = str_replace('{$mysql_passwd}', $site->server->mysql_passwd, $db_config_data);        file_put_contents(public_path() . '/remote/temp.db.conf.php', $db_config_data);        Ssh::send(public_path() . '/remote/temp.db.conf.php', $tarPath . '/appdata/conf/db.conf.php');        //vhost配置文件        $vhost_config_data = file_get_contents(public_path() . '/remote/vhost.conf');        $vhost_config_data = str_replace('$server_name', $ph['filename'] . '.' . $site->server->server_alias, $vhost_config_data);        $vhost_config_data = str_replace('$server_alias', $ph['filename'] . '.' . $site->server->server_alias, $vhost_config_data);        $vhost_config_data = str_replace('$domain', $tarPath, $vhost_config_data);        file_put_contents(public_path() . '/remote/temp.vhost.conf', $vhost_config_data);        Ssh::send(public_path() . '/remote/temp.vhost.conf', '/etc/httpd/conf/vhosts/' . $site->domain . '.conf');        //setting配置文件        $setting_config_data = file_get_contents(public_path() . '/remote/setting.conf.php');        $setting_config_data = str_replace('{$sitename}', $site->en_title, $setting_config_data);        $setting_config_data = str_replace('{$domain}', $site->domain, $setting_config_data);        file_put_contents(public_path() . '/remote/temp.setting.conf.php', $setting_config_data);        Ssh::send(public_path() . '/remote/temp.setting.conf.php', $tarPath . '/appdata/conf/setting.conf.php');        //设置权限        Ssh::exec('chmod -R 777 ' . $tarPath . '/appdata');        Ssh::exec('chmod -R 777 ' . $tarPath . '/wwwroot/uploads');        Ssh::exec('chmod -R 777 ' . $tarPath . '/wwwroot/sitemap.php');        Ssh::exec('chmod -R 777 ' . $tarPath . '/wwwroot/.htaccess');        Ssh::exec('chmod -R 777 ' . $tarPath . '/wwwroot/tmp.xls');        Ssh::exec('chmod -R 777 ' . $tarPath . '/wwwroot/tag_tpl.xlsx');        Ssh::exec('chmod -R 777 ' . $tarPath . '/wwwroot/robots.txt');        //重启服务        if ($site->server->server_ip == '47.89.219.88') {            Log::info(Ssh::exec('/usr/bin/sudo /etc/init.d/httpd reload'));        } else {            Log::info(Ssh::exec('lnmp restart'));        }        $site->database = $dbName;        $site->code_dir = $tarPath;        $site->save();        $deploy=[            'db' => $dbName,            'dir' => $tarPath,            'domain' => sprintf('%s.yinqingli.net', $ph['filename'] . '.' . $site->server->server_alias)        ];        $data = [            'process_id' => 7,            'active' => 2,            'site_id'=>$siteId,            'deploy'=>\GuzzleHttp\json_encode($deploy)        ];        SiteProcess::query()->insert($data);        return response()->json(['message' => '部署完成']);    }}
 |