作者 刘锟

Merge remote-tracking branch 'origin/master' into akun

... ... @@ -9,36 +9,17 @@
namespace App\Console\Commands\LyhTest;
use App\Console\Commands\Domain\DomainInfo;
use App\Helper\OaGlobalsoApi;
use App\Http\Logic\Aside\Project\ProjectLogic;
use App\Models\Ai\AiBlog;
use App\Models\Ai\AiBlogAuthor;
use App\Models\Ai\AiCommand;
use App\Models\Com\NoticeLog;
use App\Models\Com\V6WeeklyReport;
use App\Models\Product\Category;
use App\Models\Project\AggregateKeywordAffix;
use App\Models\Project\AiBlogTask;
use App\Models\Project\DeployBuild;
use App\Models\Project\DeployOptimize;
use App\Models\Project\OnlineCheck;
use App\Models\Project\Project;
use App\Models\Project\ProjectAiSetting;
use App\Models\ProjectAssociation\ProjectAssociation;
use App\Models\RouteMap\RouteMap;
use App\Models\Template\BTemplateMain;
use App\Models\Template\TemplateTypeMain;
use App\Models\Visit\Visit;
use App\Models\WebSetting\TranslateBigProject;
use App\Models\WebSetting\WebLanguage;
use App\Models\WebSetting\WebSetting;
use App\Models\Workchat\MessagePush;
use App\Services\AiBlogService;
use App\Services\AiCommandService;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
class lyhDemo extends Command
... ... @@ -58,7 +39,7 @@ class lyhDemo extends Command
protected $description = '更新路由';
public function handle(){
return true;
}
public function _actionTemplateMain(){
... ...
... ... @@ -6,7 +6,6 @@ use App\Models\Manage\Manage;
use App\Models\Project\Project;
use App\Models\WorkOrder\TicketProject;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
class FetchTicketProjects extends Command
... ... @@ -16,7 +15,7 @@ class FetchTicketProjects extends Command
*
* @var string
*/
protected $signature = 'workorder:fetch-ticket-projects {version}';
protected $signature = 'workorder:fetch-ticket-projects {action}}';
/**
* The console command description.
... ... @@ -42,15 +41,8 @@ class FetchTicketProjects extends Command
*/
public function handle()
{
$version = $this->argument('version');
if ($version == 'v5') {
$this->fetch_v5();
} elseif ($version == 'v6') {
$this->fetch_v6();
} else {
$this->error('Invalid action. Use "v5" or "v6".');
return 1;
}
$action = $this->argument('action');
$this->$action();
return 0;
}
... ... @@ -59,7 +51,7 @@ class FetchTicketProjects extends Command
* @return void
* 请求:https://www.quanqiusou.cn/extend_api/webs/globalso_all.php
*/
public function fetch_v5()
public function fetchV5()
{
# pm 项目经理 assm 售后服务经理
$response = Http::get('https://www.quanqiusou.cn/extend_api/webs/globalso_all.php');
... ... @@ -69,19 +61,25 @@ class FetchTicketProjects extends Command
# V5: 版本号+postid
$uuid = md5("V5{$item['postid']}");
$project = TicketProject::where('uuid', $uuid)->first();
$item['pm'] = $item['pm'] == '未安排' ? '杨长远' : $item['pm'];
$item['assm'] = $item['assm'] == '未安排' ? '杨长远' : $item['assm'];
// 如果 $item['cate'] 包含”推广“字符,则$engineer_name = $item['assm']
$engineer_name = (strpos($item['cate'], '推广') !== false) ? $item['assm'] : $item['pm'];
$assm_id = Manage::where('name', $item['assm'])->value('id') ?? Manage::where('name', '张鸿飞')->value('id') ?? 0; //售后服务经理
$seom_id = Manage::where('name', $item['yhs'])->value('id') ?? Manage::where('name', '陶婵')->value('id') ?? 0; //优化师
// 如果 $item['cate'] 包含”推广“字符,则 $engineer_name = $item['assm']
/**
* 第一负责人逻即说明:
* 优化推广项目:找售后服务经理??鸿飞
* 建站类项目: 找杨长远
*/
$engineer_id = (strpos($item['cate'], '推广') !== false) ? $assm_id : Manage::where('name', '杨长远')->value('id') ?? 0;
$fields = [
'post_id' => $item['postid'],
'company_name' => $item['company'],
'title' => $item['title'],
'engineer_id' => Manage::where('name', $engineer_name)->value('id') ?? 0,
'website' => $item['main_url'] ?? '',
'post_id' => $item['postid'],
'company_name' => $item['company'],
'title' => $item['title'],
'engineer_id' => $engineer_id, // 第一负责人
'assm_id' => $assm_id,
'seom_id' => $seom_id,
'website' => $item['main_url'] ?? '',
'is_del' => 0,
];
if (!$project) {
$new = new TicketProject();
... ... @@ -104,8 +102,13 @@ class FetchTicketProjects extends Command
$project->save();
}
}
echo "V5: {$item['postid']} - {$item['title']} - {$item['company']} - {$item['main_url']}\n";
}
$postids = collect($items)->pluck('postid')->toArray();
// 软删除 gl_ticket_projects 中不存在的项目
TicketProject::where('version', 5)
->whereNotIn('post_id', $postids)
->update(['is_del' => 1]);
echo date("Y-m-d H:i:s") . " V5: fetch completed, total " . count($items) . " items\n";
}
}
... ... @@ -114,12 +117,15 @@ class FetchTicketProjects extends Command
* 1. 按照ID升序查询 gl_project 表 limit 10
* 2。同步到 TicketProject 后,redis 缓存 ID
*/
public function fetch_v6()
public function fetchV6()
{
$lastid = 0;
while (true) {
try {
$lastid = Cache::store('redis')->get('fetch_v6_lastid', 0);
$items = Project::where('id', '>', intval($lastid))
// ->where('delete_status', 0)
// ->where('extend_type', '!=', 5) // 排除归档项目
// ->where('type', '!=', 8) // 排除归档项目
->orderBy('id', 'asc')
->limit(10)
->get();
... ... @@ -128,24 +134,104 @@ class FetchTicketProjects extends Command
break;
}
foreach ($items as $item) {
$uuid = md5("V5{$item->id}");
$uuid = md5("V6{$item->id}");
$project = TicketProject::where('uuid', $uuid)->first();
// 售后服务经理
$assm_id = collect([
$item->deploy_optimize->manager_mid ?? 0,
$item->deploy_optimize->tech_leader ?? 0,
8, //张鸿飞
])->first(fn($v) => $v !== null && $v !== 0, 0);
$seom_id = !empty($item->deploy_optimize->optimist_mid) ? $item->deploy_optimize->optimist_mid : $assm_id;
/**
* 第一负责人逻辑
* 建站类项目:找杨长远
* 推广类:找售后
*/
if (in_array($item->type, [Project::TYPE_TWO, Project::TYPE_FOUR, Project::TYPE_SIX])) {
// 优化推广项目
$engineer_id = $assm_id;
} elseif ($item->type == Project::TYPE_THREE) {
$engineer_id = Manage::where('name', '杨长远')->value('id') ?? 0; // 建站类项目找杨长远
} else {
$engineer_id = collect([
$item->deploy_build->manager_mid ?? 0,
$item->deploy_build->leader_mid ?? 0,
0
])->first(fn($v) => $v !== null && $v !== 0, 0);
}
$is_del = (
$item->extend_type == 5
|| $item->type == 8
|| $item->delete_status == 1
|| $item->site_status == 1
) ? 1 : 0;
$fields = [
'company_name' => $item->company,
'title' => $item->title,
'assm_id' => $assm_id,
'seom_id' => $seom_id,
'engineer_id' => $engineer_id,
'is_del' => $is_del
];
if (!$project) {
$project = new TicketProject();
$project->uuid = $uuid;
$project->post_id = $item->post_id;
$project->version = 6;
$project->table_id = $item->id;
foreach ($fields as $k => $v) {
$project->$k = $v;
}
$project->save();
Cache::store('redis')->put('fetch_v6_lastid', $item->id);
} else {
$changed = false;
foreach ($fields as $k => $v) {
if ($project->$k != $v) {
$project->$k = $v;
$changed = true;
}
}
if ($changed) {
$project->save();
}
}
echo "V6: {$item->company}\n";
$lastid = $item->id;
echo date('Y-m-d H:i:s') . " V6: $item->id {$item->company} fetch ok \n";
}
}catch (\Exception $exception) {
} catch (\Exception $exception) {
echo $exception;
break;
}
}
}
public function fetch_uuid()
{
$lastid = 0;
while (true) {
try {
$items = TicketProject::where('id', '>', $lastid)
->where('version', 6)
->orderBy('id', 'asc')
->limit(10)
->get();
if ($items->isEmpty()) {
echo "not found items \n";
break;
}
foreach ($items as $item) {
$uuid = md5("V6{$item->table_id}");
$item->uuid = $uuid;
$item->save();
$lastid = $item->id;
echo date('Y-m-d H:i:s') . " V6: $item->id fetch ok \n";
}
} catch (\Exception $exception) {
echo $exception;
break;
}
}
}
}
... ...
<?php
namespace App\Console\Commands;
namespace App\Console\Commands\WorkOrder;
use App\Models\WorkOrder\TicketLog;
use App\Models\WorkOrder\WorkOrderLog;
use App\Services\DingTalkService;
use Illuminate\Console\Command;
... ... @@ -42,12 +43,12 @@ class WorkOrderDing extends Command
{
while (true) {
try {
$log = WorkOrderLog::where('ding', 0)->first();
$log = TicketLog::where('ding', 0)->first();
if (!$log) {
sleep(3);
continue;
}
$mobile = $log->manager->mobile;
$mobile = $log->engineer->mobile;
$response = Http::withBasicAuth(
env('DINGDING_BASIC_USER'),
env('DINGDING_BASIC_PASS')
... ...
... ... @@ -836,8 +836,18 @@ function ends_with($string, $suffix)
return substr($string, -strlen($suffix)) === $suffix;
}
function getCustomRouteMap($module_route,$route = '')
/**
* @remark :扩展模块分类路由
* @name :getCustomRouteMap
* @author :lyh
* @method :post
* @time :2025/6/21 9:57
*/
function getCustomRouteMap($module_route,$route = '',$is_upgrade = 0)
{
if($is_upgrade == 0){
return $route;
}
if($module_route == $route){
$resultRoute = $route;
}else{
... ...
... ... @@ -29,6 +29,7 @@ class TicketController extends BaseController
'logs.engineer:id,name',
])
->where('project_id', $project->id)
->where('submit_side', 2)
->orderBy('id', 'desc')
->paginate($size, ['*'], 'page', $page);
return response()->json(['data' => $tickets]);
... ... @@ -45,13 +46,10 @@ class TicketController extends BaseController
{
$request->validated();
$project = TicketProject::where('uuid', $project_id)->first();
if (!$project) return $this->error('未找到项目', 404);
if ($project->version == 6){
if ($project->project->projectV6->delete_status) return $this->error('该项目已被删除', 400);
if ($project->project->projectV6->extend_type == 5) return $this->error('未续费', 400);
if ($project->project->projectV6->type == 8) return $this->error('项目已归档', 400);
if ($project->project->projectV6->site_status == 1) return $this->error('站点已关闭', 400);
}
if (!$project) return response('未找到项目', 404);
if ($project->is_del) return response('项目状态异常', 400);
if (empty($project->first_engineer)) return response('项目未分配工单负责人', 400);
$result = DB::transaction(function () use ($request, $project) {
$ticket = new Tickets();
$ticket->project_id = $project->id;
... ... @@ -68,21 +66,7 @@ class TicketController extends BaseController
$ticket->submit_username = $request->input('submit_username');
$ticket->save();
$log = new TicketLog();
if ($project->version == 5){
# V5
$log->engineer_id = $project->engineer_id;
}else{
# V6 的项目
if ($project->projectV6->type == 3){
// 项目类型是优化推广,项目负责人找优化
$seo = $project->projectV6->deploy_optimize;
$log->engineer_id = $seo->manager_mid ?? $seo->optimist_mid ?? 0;
}else{
// 非优化推广项目,项目负责人找技术组长
$build = $project->projectV6->deploy_build;
$log->engineer_id = $build->leader_mid ?? 0;
}
}
$log->engineer_id = $project->engineer_id; // 默认第一负责人
$ticket->logs()->save($log);
return $ticket;
});
... ... @@ -103,16 +87,12 @@ class TicketController extends BaseController
])
->find($id);
if (!$ticket) return $this->error('工单未找到', 404);
if (!$ticket) return response('工单未找到', 404);
if ($ticket->project->uuid !== $project_id) return response('无权限查看该工单', 403);
if ($ticket->project->uuid !== $project_id) return $this->error('无权限查看该工单', 403);
if ($ticket->project->is_del) return response('项目状态异常', 400);
if ($ticket->project->version == 6){
if ($ticket->project->projectV6->delete_status) return $this->error('该项目已被删除', 400);
if ($ticket->project->projectV6->extend_type == 5) return $this->error('未续费', 400);
if ($ticket->project->projectV6->type == 8) return $this->error('项目已归档', 400);
if ($ticket->project->projectV6->site_status == 1) return $this->error('站点已关闭', 400);
}
return response()->json(['data' => $ticket]);
}
... ... @@ -138,4 +118,17 @@ class TicketController extends BaseController
{
//
}
public function projectInfo($project_id)
{
$project = TicketProject::with([
'projectV6:id,company',
'assm:id,name',
'seom:id,name',
'first_engineer:id,name',
])
->where('uuid', $project_id)->first();
if (!$project) return $this->response('未找到项目', 404);
return response()->json(['data' => $project]);
}
}
... ...
... ... @@ -67,7 +67,7 @@ class OptimizeController extends BaseController
$v['g'] = implode(',', $v['g']);
$v['keyword_num'] = implode(',', $v['keyword_num']);
}else{
$data = $rankDataModel->read(['project_id'=>$v['id'],'lang'=>''],['first_page_num','indexed_pages_num']);
$data = $rankDataModel->read(['project_id'=>$v['id'],'lang'=>'', 'api_no' => $v['api_no']],['first_page_num','indexed_pages_num']);
$v['first_page_num'] = $data['first_page_num'] ?? 0;
$v['indexed_pages_num'] = $data['indexed_pages_num'] ?? 0;
$v['g'] = $this->getGNum($v['id']);
... ...
... ... @@ -6,12 +6,10 @@ use App\Enums\Common\Code;
use App\Http\Controllers\Aside\BaseController;
use App\Http\Requests\Aside\WorkOrder\AsideTicketStoreRequest;
use App\Http\Requests\Aside\WorkOrder\AsideTicketListRequest;
use App\Http\Requests\Aside\WorkOrder\AsideTicketLogUpdateRequest;
use App\Http\Requests\Aside\WorkOrder\AsideTicketUpdateRequest;
use App\Models\WorkOrder\TicketLog;
use App\Models\WorkOrder\TicketProject;
use App\Models\WorkOrder\Tickets;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class AsideTicketController extends BaseController
... ... @@ -27,9 +25,9 @@ class AsideTicketController extends BaseController
* 1. 超管看所有工单
* 2. 其他查看和自己有关的工单
*/
$lists = TicketLog::with([
'ticket.project.projectV6:id,company,title',
'ticket.logs.engineer:id,name',
$lists = Tickets::with([
'logs.engineer:id,name',
'project',
])
->when($this, function ($query) {
$role = $this->manage['role'];
... ... @@ -38,31 +36,34 @@ class AsideTicketController extends BaseController
return $query;
}
// 其他角色查自己参与的工单
return $query->where('engineer_id', $this->manage['id']);
return $query->where(function ($q) {
$q->where('submit_user_id', $this->manage['id'])
->orWhereHas('logs', function ($q1) {
$q1->where('engineer_id', $this->manage['id']);
});
});
})
->when($request->input('project_id') !== null, function ($query) use ($request) {
// project_id 查 gl_ticket_projects.uuid
return $query->whereHas('ticket.project', function ($q) use ($request) {
$q->where('uuid', $request->input('project_id'));
$projectId = $request->input('project_id');
return $query->whereHas('project', function ($q) use ($projectId) {
$q->where('uuid', $projectId);
});
})
->when($request->input('status') !== null, function ($query) use ($request) {
// status 查 gl_tickets.status
return $query->whereHas('ticket', function ($q) use ($request) {
$q->where('status', $request->input('status'));
});
$status = $request->input('status');
return $query->where('status', $status);
})
->when($request->input('search'), function ($query) use ($request) {
// search 查 gl_tickets.title 或 gl_ticket_projects.title 或 gl_ticket_projects.company_name
$search = $request->input('search');
$query->where(function ($q) use ($search) {
$q->whereHas('ticket', function ($q1) use ($search) {
$q1->where('title', 'like', '%' . $search . '%');
})
->orWhereHas('ticket.project', function ($q2) use ($search) {
$q2->where('title', 'like', '%' . $search . '%')
->orWhere('company_name', 'like', '%' . $search . '%');
});
return $query->where(function ($q) use ($search) {
$q->where('title', 'like', '%' . $search . '%')
->orWhereHas('project', function ($q1) use ($search) {
$q1->where('title', 'like', '%' . $search . '%')
->orWhere('company_name', 'like', '%' . $search . '%');
});
});
})
->orderBy('id', 'desc')
... ... @@ -72,16 +73,11 @@ class AsideTicketController extends BaseController
public function getProjects($search)
{
$projects = TicketProject::with([
'projectV6:id,company,title',
])
$projects = TicketProject::where('is_del', 0)
->where(function ($query) use ($search) {
// 查找项目名称或公司名称
$query->where('title', 'like', '%' . $search . '%')
->orWhere('company_name', 'like', '%' . $search . '%')
->orWhereHas('projectV6', function ($q) use ($search) {
$q->where('company', 'like', '%' . $search . '%')
->orWhere('title', 'like', '%' . $search . '%');
});
->orWhere('company_name', 'like', '%' . $search . '%');
})
->get();
$this->response('success', Code::SUCCESS, $projects);
... ... @@ -97,12 +93,7 @@ class AsideTicketController extends BaseController
{
$request->validated();
$project = TicketProject::where('uuid', $request->input('project_id'))->first();
if ($project->version == 6){
if ($project->projectV6->delete_status) $this->response('该项目已被删除', Code::USER_MODEL_NOTFOUND_ERROE);
if ($project->projectV6->extend_type == 5) $this->response('未续费', Code::USER_MODEL_NOTFOUND_ERROE);
if ($project->projectV6->type == 8) $this->response('项目已归档', Code::USER_MODEL_NOTFOUND_ERROE);
if ($project->projectV6->site_status == 1) $this->response('站点已关闭', Code::USER_MODEL_NOTFOUND_ERROE);
}
if ($project->is_del) $this->response('该项目状态异常', Code::USER_MODEL_NOTFOUND_ERROE);
$result = DB::transaction(function () use ($request, $project) {
$ticket = new Tickets();
$ticket->project_id = $project->id;
... ... @@ -195,7 +186,6 @@ class AsideTicketController extends BaseController
$ticket->reply = $request->input('reply', null);
$ticket->status = $request->input('status', $ticket->status);
$ticket->save();
if ($ticket->status == Tickets::STATUS_COMPLETED)
{
// 完成工单,把子任务里面未完成的工单改为完成
... ... @@ -203,6 +193,7 @@ class AsideTicketController extends BaseController
$ticket->logs()->where('status', '<', TicketLog::STATUS_COMPLETED)
->update(['status' => TicketLog::STATUS_COMPLETED, 'end_at' => now()]);
}
$ticket->save();
return $ticket;
});
$this->response('success', Code::SUCCESS, $result->toArray());
... ...
... ... @@ -69,10 +69,11 @@ class AsideTicketLogController extends BaseController
if ($log->status >= TicketLog::STATUS_COMPLETED)
{
// 我的工单标记为已完成
$log->status = $request->input('status');
$log->end_at = now();
}
}
if ($request->input('reply') !== null)
$log->reply = $request->input('reply', '');
$log->save();
// 是否有未完成的子任务
$pending = $ticket->logs()
... ...
... ... @@ -42,7 +42,7 @@ class CustomModuleCategoryController extends BaseController
$template_id = $this->getModuleTemplateId($this->param['module_id']);
foreach ($list as $k => $v){
$v['is_renovation'] = $this->getIsRenovation($v['module_id'],BTemplate::IS_LIST,$template_id,$v['id'],BTemplate::IS_CUSTOM);
$v['url'] = $this->user['domain'].getCustomRouteMap($moduleInfo['route'],$v['route']);
$v['url'] = $this->user['domain'].getCustomRouteMap($moduleInfo['route'],$v['route'],$this->user['is_upgrade']);
$list[$k] = $v;
}
}
... ...
... ... @@ -202,7 +202,7 @@ class BlogCategoryLogic extends BaseLogic
RouteMap::delRoute(RouteMap::SOURCE_BLOG_CATE, $id, $this->user['project_id']);
//生成一条删除路由记录
$info = $this->model->read(['id'=>$id],['id','alias']);
$this->curlDelRoute(['old_route'=>$info['alias']]);
$this->curlDelRoute(['old_route'=>$info['alias'],'source'=>RouteMap::SOURCE_BLOG_CATE]);
return $this->success();
}
... ...
... ... @@ -161,7 +161,7 @@ class BlogLogic extends BaseLogic
public function delRoute($id){
//生成一条删除路由记录
$info = $this->model->read(['id'=>$id],['id','url']);
$this->curlDelRoute(['old_route'=>$info['url']]);
$this->curlDelRoute(['old_route'=>$info['url'],'source'=>RouteMap::SOURCE_BLOG]);
return $this->success();
}
... ...
... ... @@ -11,6 +11,7 @@ namespace App\Http\Logic\Bside\CustomModule;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Com\NoticeLog;
use App\Models\CustomModule\CustomModule;
use App\Models\CustomModule\CustomModuleCategory;
use App\Models\RouteMap\RouteMap;
use App\Models\Template\BTemplate;
... ... @@ -221,7 +222,10 @@ class CustomModuleCategoryLogic extends BaseLogic
}
RouteMap::delRoute(RouteMap::SOURCE_MODULE_CATE, $id, $this->user['project_id']);
//通知
$this->curlDelRoute(['old_route'=>$info['route']]);
//获取模块路由
$customModuleModel = new CustomModule();
$moduleInfo = $customModuleModel->read(['id'=>$info['module_id']]);
$this->curlDelRoute(['old_route'=>$info['route'],'path'=>getCustomRouteMap($moduleInfo['route'],$info['route'],$this->user['is_upgrade'])]);
return $this->success();
}
... ...
... ... @@ -355,8 +355,13 @@ class CustomModuleContentLogic extends BaseLogic
{
RouteMap::delRoute(RouteMap::SOURCE_MODULE, $id, $this->user['project_id']);
//通知
$info = $this->model->read(['id' => $id], ['id', 'route']);
$this->curlDelRoute(['old_route'=>$info['route']]);
$info = $this->model->read(['id' => $id], ['id', 'route','category_id']);
$categoryIdArr = $info['category_id'];
$cate_id = (int)array_shift($categoryIdArr);
$routeMapModel = new RouteMap();
$routeInfo = $routeMapModel->read(['source'=>RouteMap::SOURCE_MODULE_CATE,'source_id'=>$cate_id]);
$path = ($routeInfo['route'] ?? '');
$this->curlDelRoute(['old_route'=>$info['route'],'path'=>$path]);
return $this->success();
}
... ...
... ... @@ -216,7 +216,7 @@ class NewsCategoryLogic extends BaseLogic
//删除路由映射
RouteMap::delRoute(RouteMap::SOURCE_NEWS_CATE, $id, $this->user['project_id']);
$info = $this->model->read(['id'=>$id],['id','alias']);
$this->curlDelRoute(['old_route'=>$info['alias']]);
$this->curlDelRoute(['old_route'=>$info['alias'],'source'=>RouteMap::SOURCE_NEWS_CATE]);
return $this->success();
}
... ...
... ... @@ -357,7 +357,7 @@ class NewsLogic extends BaseLogic
{
//生成一条删除路由记录
$info = $this->model->read(['id' => $id], ['id', 'url']);
$this->curlDelRoute(['old_route'=>$info['url']]);
$this->curlDelRoute(['old_route'=>$info['url'],'source'=>RouteMap::SOURCE_NEWS]);
return $this->success();
}
... ...
... ... @@ -199,7 +199,7 @@ class CategoryLogic extends BaseLogic
//生成一条删除路由记录
$info = $this->model->read(['id'=>$id],['id','route']);
if($info !== false){
$this->curlDelRoute(['old_route'=>$info['route']]);
$this->curlDelRoute(['old_route'=>$info['route'],'source'=>RouteMap::SOURCE_PRODUCT_CATE]);
}
return $this->success();
}
... ...
... ... @@ -188,7 +188,7 @@ class KeywordLogic extends BaseLogic
//生成一条删除路由记录
$info = $this->model->read(['id'=>$id],['id','route']);
if($info !== false){
$this->curlDelRoute(['old_route'=>$info['route']]);
$this->curlDelRoute(['old_route'=>$info['route'],'source'=>RouteMap::SOURCE_PRODUCT_KEYWORD]);
}
return $this->success();
}
... ...
... ... @@ -472,7 +472,7 @@ class ProductLogic extends BaseLogic
public function delRoute($id){
//生成一条删除路由记录
$info = $this->model->read(['id'=>$id],['id','route']);
$this->curlDelRoute(['old_route'=>$info['route']]);
$this->curlDelRoute(['old_route'=>$info['route'],'source'=>RouteMap::SOURCE_PRODUCT]);
return $this->success();
}
... ...
... ... @@ -2,11 +2,11 @@
namespace App\Models\WorkOrder;
use App\Models\Base;
use App\Models\Manage\Manage;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class TicketLog extends Model
class TicketLog extends Base
{
use HasFactory;
... ...
... ... @@ -2,12 +2,12 @@
namespace App\Models\WorkOrder;
use App\Models\Base;
use App\Models\Manage\Manage;
use App\Models\Project\Project;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class TicketProject extends Model
class TicketProject extends Base
{
use HasFactory;
... ... @@ -19,4 +19,26 @@ class TicketProject extends Model
->where('version', 6);
}
//售后服务经理
public function assm()
{
return $this->hasOne(Manage::class, 'id', 'assm_id')
->select(['id', 'name']);
}
// 优化师
public function seom()
{
return $this->hasOne(Manage::class, 'id', 'seom_id')
->select(['id', 'name']);
}
/**
* 第一负责人
*/
public function first_engineer()
{
return $this->hasOne(Manage::class, 'id', 'engineer_id')
->select(['id', 'name']);
}
}
... ...
... ... @@ -2,10 +2,10 @@
namespace App\Models\WorkOrder;
use App\Models\Base;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Tickets extends Model
class Tickets extends Base
{
use HasFactory;
... ...
... ... @@ -80,6 +80,7 @@ Route::any('/get_project_by_mch_id', [\App\Http\Controllers\Api\PrivateControlle
// B端,渠道在企微群操作-售后工单
Route::prefix('tickets')->group(function () {
Route::get('/{project_id}', [\App\Http\Controllers\Api\WorkOrder\TicketController::class, 'index'])->summary('B端,渠道-工单列表')->name('tickets.list');
Route::get('/projectInfo/{project_id}', [\App\Http\Controllers\Api\WorkOrder\TicketController::class, 'projectInfo'])->summary('B端,渠道-项目信息')->name('tickets.projectInfo');
Route::post('/{project_id}', [\App\Http\Controllers\Api\WorkOrder\TicketController::class, 'store'])->summary('B端,渠道-提工单')->name('tickets.store');
Route::get('/{project_id}/{id}', [\App\Http\Controllers\Api\WorkOrder\TicketController::class, 'show'])->summary('B端,渠道-工单详情')->name('tickets.show');
});
... ...
... ... @@ -621,6 +621,8 @@ Route::group([], function () {
Route::any('/collect', [Aside\Collect\CollectController::class, 'index'])->name('admin.collect');
//同步询盘
Route::any('/sync_inquiry', [Aside\Com\IndexController::class, 'sync_inquiry'])->name('admin.sync_inquiry');
Route::post('/images_uploads', [\App\Http\Controllers\File\ImageController::class, 'upload'])->name('admin.images_uploads');//无需登录上传
Route::post('/files_uploads', [\App\Http\Controllers\File\FileController::class, 'upload'])->name('admin.files_uploads');
});
... ...