作者 赵彬吉
... ... @@ -256,7 +256,7 @@ class AiBlogTask extends Command
$page = 1;
$saveData = [];
$result = $aiBlogService->getAiBlogList($page,15);
if(!isset($result['status']) && $result['status'] != 200){
if(!isset($result['status']) || $result['status'] != 200){
return true;
}
$total_page = $result['data']['total_page'];
... ...
... ... @@ -109,6 +109,16 @@ class DomainInfo extends Command
$v->save();
}
if (empty($v['domain_end_time']) || $v['domain_end_time'] < date('Y-m-d H:i:s')) {
//获取主站域名有效期并更新
$valid_time = $this->getDomainValidTime($v['domain']);
if ($valid_time['start'] && $valid_time['end']) {
$v->domain_start_time = $valid_time['start'];
$v->domain_end_time = $valid_time['end'];
$v->save();
}
}
if ($v['amp_status'] == 1) {
$domain_array = parse_url($v['domain']);
$host = $domain_array['host'] ?? $domain_array['path'];
... ... @@ -332,4 +342,24 @@ class DomainInfo extends Command
}
return ['from' => $valid_from, 'to' => $valid_to];
}
/**
* 获取域名有效时间
* @param $domain
* @return array
* @author Akun
* @date 2024/08/29 9:43
*/
public function getDomainValidTime($domain)
{
$url = 'http://openai.waimaoq.com/v1/whois_api?domain=' . $domain;
$response = curlGet($url);
$start = '';
$end = '';
if (isset($response['code']) && $response['code'] == 200) {
$start = $response['text']['creation_date'] != 'None' ? $response['text']['creation_date'] : '';
$end = $response['text']['expiration_date'] != 'None' ? $response['text']['expiration_date'] : '';
}
return ['start' => $start, 'end' => $end];
}
}
... ...
... ... @@ -121,6 +121,7 @@ class RemainDay extends Command
if($deploy_build['seo_plan'] == 1){
if($deploy_build['seo_service_duration'] != 0){
if(in_array($item['id'],$this->bm_projectId)){
$compliance_day = (int)$item['bm_finish_remain_day'];
$seo_remain_day = $deploy_build['seo_service_duration'] - (int)$item['bm_finish_remain_day'];
}else{
//按自然日统计
... ... @@ -133,7 +134,7 @@ class RemainDay extends Command
$this->project->edit(['seo_remain_day'=>$seo_remain_day,'bm_finish_remain_day'=>$compliance_day ?? 0],['id'=>$item['id']]);
}else{
//同时包括白帽版本+默认版本的项目
$this->project->edit(['seo_remain_day'=>$seo_remain_day],['id'=>$item['id']]);
$this->project->edit(['seo_remain_day'=>$seo_remain_day,'bm_finish_remain_day'=>$compliance_day ?? 0],['id'=>$item['id']]);
}
}
}
... ...
... ... @@ -99,7 +99,7 @@ class GeoQuestionRes extends Command
$data = $geo_service->getDeepSeekResult($question);
$result = $this->dealDeepSeek($data);
break;
case 'gpt-4o-mini':
case 'openai-not-network':
$data = $geo_service->getDeepSeekResult($question,'gpt-4o-mini');
$result = $this->dealDeepSeek($data,'gpt-4o-mini');
break;
... ...
... ... @@ -21,6 +21,7 @@ use App\Models\Project\ProjectWhiteHatAffix;
use App\Models\Template\BTemplateMain;
use App\Models\Template\TemplateTypeMain;
use App\Services\AiBlogService;
use App\Services\Geo\GeoService;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
... ... @@ -53,22 +54,25 @@ class lyhDemo extends Command
* @time :2025/7/22 15:14
*/
public function _actionRoute(){
$projectModel = new Project();
$lists = $projectModel->list(['delete_status' => 0,'project_type'=>0,'extend_type'=>0,'type'=>['in',[2,3,4,6]]], 'id', ['id']);
$data = [];
foreach ($lists as $item){
echo date('Y-m-d H:i:s') . '开始--项目的id:'. $item['id'] . PHP_EOL;
ProjectServer::useProject($item['id']);
$aiBlogModel = new AiBlog();
$info = $aiBlogModel->read(['route'=>null],['id']);
if($info !== false){
echo '项目id:'.$item['id'].PHP_EOL;
$data[] = $item['id'];
}
dd($data);
echo 'end';
DB::disconnect('custom_mysql');
}
$geo_service = new GeoService();
$data = $geo_service->getDeepSeekResult("创贸总共多少人?",'gpt-4o-mini');
dd($data);
// $projectModel = new Project();
// $lists = $projectModel->list(['delete_status' => 0,'project_type'=>0,'extend_type'=>0,'type'=>['in',[2,3,4,6]]], 'id', ['id']);
// $data = [];
// foreach ($lists as $item){
// echo date('Y-m-d H:i:s') . '开始--项目的id:'. $item['id'] . PHP_EOL;
// ProjectServer::useProject($item['id']);
// $aiBlogModel = new AiBlog();
// $info = $aiBlogModel->read(['route'=>null],['id']);
// if($info !== false){
// echo '项目id:'.$item['id'].PHP_EOL;
// $data[] = $item['id'];
// }
// dd($data);
// echo 'end';
// DB::disconnect('custom_mysql');
// }
}
public function _actionTemplateMain(){
... ...
... ... @@ -151,12 +151,13 @@ class SyncProject extends Command
'contract' => json_encode($param['files']),
'bill' => json_encode($param['images']),
];
if($param['plan_marketing'] == '白帽SEO方案'){
$data['seo_service_duration'] = $param['years'] ?? 0;
$data['seo_plan'] = 1;
}else{
$data['service_duration'] = $param['years'] ?? 0;
$data['plan'] = $this->versionData($param['plan_marketing']);
$seoPlan = Project::seoMap();
if (in_array($param['plan_marketing'], $seoPlan)) {
$data['deploy_build']['seo_service_duration'] = $param['years'] ?? 0;
$data['deploy_build']['seo_plan'] = $this->versionSeoData($param['plan_marketing'],$seoPlan);
} else {
$data['deploy_build']['service_duration'] = $param['years'] ?? 0;
$data['deploy_build']['plan'] = $this->versionData($param['plan_marketing']);
}
$renewModel = new ProjectRenew();
$rs = $renewModel->add($data);
... ... @@ -183,8 +184,7 @@ class SyncProject extends Command
}
}
public function versionSeoData($param){
$data = Project::seoMap();
public function versionSeoData($param,$data){
$data = array_flip($data);
if(isset($data[$param])){
return $data[$param];
... ... @@ -240,10 +240,11 @@ class SyncProject extends Command
'bill'=>$param['images']
],
];
if($param['plan_marketing'] == '白帽SEO方案'){
$seoPlan = Project::seoMap();
if (in_array($param['plan_marketing'], $seoPlan)) {
$data['deploy_build']['seo_service_duration'] = $param['years'] ?? 0;
$data['deploy_build']['seo_plan'] = $this->versionSeoData($param['plan_marketing']);
}else{
$data['deploy_build']['seo_plan'] = $this->versionSeoData($param['plan_marketing'],$seoPlan);
} else {
$data['deploy_build']['service_duration'] = $param['years'] ?? 0;
$data['deploy_build']['plan'] = $this->versionData($param['plan_marketing']);
}
... ...
... ... @@ -82,9 +82,9 @@ class FetchTicketProjects extends Command
elseif ($item['cate'] == "建站中")
$status=1; // 建站中
$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; //优化师
$pm_id = Manage::where('name', $item['pm'])->value('id') ?? Manage::where('name', '李洁玉')->value('id') ?? 0; // 项目经理
$assm_id = ManageHr::where('name', $item['assm'])->where('status', 1)->value('manage_id') ?? ManageHr::where('name', '张鸿飞')->where('status', 1)->value('manage_id') ?? 0; //售后服务经理
$seom_id = ManageHr::where('name', $item['yhs'])->where('status', 1)->value('manage_id') ?? ManageHr::where('name', '陶婵')->where('status', 1)->value('manage_id') ?? 0; //优化师
$pm_id = ManageHr::where('name', $item['pm'])->where('status', 1)->value('manage_id') ?? ManageHr::where('name', '李洁玉')->where('status', 1)->value('manage_id') ?? 0; // 项目经理
/**
* 第一负责人逻即说明:
... ... @@ -100,6 +100,22 @@ class FetchTicketProjects extends Command
elseif ($status == 1)
$engineer_id = $pm_id; // 建站中找项目经理
$team_names = [
$item['pm'],
$item['assm'],
$item['yhs'],
$item['team_leader'],
$item['technology'],
$item['designer'],
$item['yhszl'],
];
// 过滤掉空值,去掉重复
$team_ids = ManageHr::whereIn('name', $team_names)->where('status', 1)->pluck('manage_id')
->unique()
->filter(fn($v) => !is_null($v) && $v !== 0)
->values()
->toArray();
$fields = [
'post_id' => $item['postid'],
'company_name' => $item['company'],
... ... @@ -114,7 +130,8 @@ class FetchTicketProjects extends Command
'project_cate' => 1,
'pm_id' => $pm_id,
'status' => $status, // 项目状态
'wechat_group_id' => $item['wx_id']
'wechat_group_id' => $item['wx_id'],
'team' => $team_ids ? json_encode($team_ids) : null,
];
if (!$project) {
$new = new TicketProject();
... ... @@ -186,22 +203,22 @@ class FetchTicketProjects extends Command
// 售后服务经理
$assm_id = collect([
ManageHr::find($item->deploy_optimize->manager_mid)->manage_id ?? 0,
ManageHr::find($item->deploy_optimize->tech_leader)->manage_id ?? 0,
ManageHr::where('status', 1)->find($item->deploy_optimize->manager_mid)->manage_id ?? 0,
ManageHr::where('status', 1)->find($item->deploy_optimize->tech_leader)->manage_id ?? 0,
8, //张鸿飞
])->first(fn($v) => $v !== null && $v !== 0, 0);
// 优化师
$seom_id = ManageHr::find($item->deploy_optimize->optimist_mid) ? ManageHr::find($item->deploy_optimize->optimist_mid)->manage_id : 0;
$seom_id = ManageHr::where('status', 1)->find($item->deploy_optimize->optimist_mid) ? ManageHr::where('status', 1)->find($item->deploy_optimize->optimist_mid)->manage_id : 0;
// 项目经理
$pm_id = ManageHr::find($item->deploy_build->manager_mid)->manage_id ?? ManageHr::where('name', '李洁玉')->value('manage_id') ?? 0;
$pm_id = ManageHr::where('status', 1)->find($item->deploy_build->manager_mid)->manage_id ?? ManageHr::where('status', 1)->where('name', '李洁玉')->value('manage_id') ?? 0;
// 第一负责人
if ($status == 1)
$engineer_id = $pm_id; // 建站中找项目经理
elseif ($status == 2)
$engineer_id = Manage::where('name', '杨长远')->value('id') ?? 0; // 建站完成找杨长远
$engineer_id = Manage::where('status', 1)->where('name', '杨长远')->value('id') ?? 0; // 建站完成找杨长远
else
$engineer_id = $assm_id; // 推广找售后服务经理
... ... @@ -212,6 +229,30 @@ class FetchTicketProjects extends Command
|| $item->site_status == 1
) ? 1 : 0;
$team_ids_in = [
$item->deploy_build->leader_mid,
$item->deploy_build->manager_mid,
$item->deploy_build->designer_mid,
$item->deploy_build->tech_mid,
$item->deploy_optimize->manager_mid,
$item->deploy_optimize->optimist_mid,
$item->deploy_optimize->assist_mid,
$item->deploy_optimize->tech_mid,
$item->deploy_optimize->tech_leader,
];
// $team_ids 去重复
$team_ids_in = array_unique($team_ids_in);
$team_ids_in = array_filter($team_ids_in);
// $team_ids 去掉下标
$team_ids_in = array_values($team_ids_in);
$team_ids = ManageHr::whereIn('manage_id', $team_ids_in)->where('status', 1)->pluck('manage_id')
->unique()
->filter(fn($v) => !is_null($v) && $v !== 0)
->values()
->toArray();
$fields = [
'company_name' => $item->company,
'title' => $item->title . " - V6",
... ... @@ -230,6 +271,7 @@ class FetchTicketProjects extends Command
->value('friend_id'),
'pm_id' => $pm_id,
'status' => $status, // 项目状态
'team' => $team_ids ? json_encode($team_ids) : null,
];
if (!$project) {
$project = new TicketProject();
... ... @@ -289,14 +331,14 @@ class FetchTicketProjects extends Command
{
// 售后服务经理
$assm_id = collect([
ManageHr::where('name', $item['cj_assm']['real_name'] ?? '')->first()->manage_id ?? 0,
ManageHr::where('status', 1)->where('name', $item['cj_assm']['real_name'] ?? '')->first()->manage_id ?? 0,
20, //徐莹
])->first(fn($v) => $v !== null && $v !== 0, 0);
}else
{
// 域途
$assm_id = collect([
ManageHr::where('name', $item['yutu_assm']['real_name'] ?? '')->first()->manage_id ?? 0,
ManageHr::where('status', 1)->where('name', $item['yutu_assm']['real_name'] ?? '')->first()->manage_id ?? 0,
85, //黄小玉
])->first(fn($v) => $v !== null && $v !== 0, 0);
}
... ...
... ... @@ -822,7 +822,7 @@ if(!function_exists('curlGet')){
*/
function curlGet($url){
$ch1 = curl_init();
$timeout = 0;
$timeout = 60;
curl_setopt($ch1, CURLOPT_URL, $url);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch1, CURLOPT_ENCODING, '');
... ... @@ -1077,17 +1077,37 @@ if (!function_exists('check_domain_record')) {
function check_domain_record($domain, $server_info)
{
try {
$is_record = false;
//获取域名解析记录
$records = dns_get_record($domain,DNS_A);
if(count($records) != 1){
return false;
if(count($records) == 1 && ($records[0]['host'] == $server_info['domain'] || $records[0]['ip'] == $server_info['ip'])){
$is_record = true;
}
$record = $records[0];
if($record['host'] == $server_info['domain'] || $record['ip'] == $server_info['ip']){
return $domain;
}else{
return false;
if(!$is_record){
//解析不正确,再判断是否开启cnd
$top_domain = getTopDomain($domain);
$cnd = curlGet('http://sitebak.globalso.com/get_records?domain=' . $top_domain);
if (isset($cnd['data']) && $cnd['data']) {
if($domain == $top_domain || substr($domain,0,4) == 'www.'){
$check_domain = $domain;
}else{
$check_domain = '*.'.$top_domain;
}
foreach ($cnd['data'] as $vc) {
if ($vc['name'] == $check_domain && $vc['type'] == 'A' && $vc['content'] == $server_info['ip']) {
$is_record = true;
break;
}elseif ($vc['name'] == $check_domain && $vc['type'] == 'CNAME' && $vc['content'] == $server_info['domain']){
$is_record = true;
break;
}
}
}
}
return $is_record;
}catch (\Exception $e){
errorLog('dns_get_record',['domain'=>$domain],$e);
return false;
... ... @@ -1373,3 +1393,31 @@ function analysisRoute($pathInfo)
}
return $router;
}
function getTopDomain ($url) {
$url = strtolower($url); //首先转成小写
$url = mb_ereg_replace('^( | )+', '', trim($url));
$url = mb_ereg_replace('( | )+$', '', $url);
if (!preg_match('/^(http:\/\/|https)/', $url)) {
$url = "https://".$url;
}
$hosts = parse_url($url);
$host = $hosts['host'] ?? '';
//查看是几级域名
$data = explode('.', $host);
$n = count($data);
if ($n < 2) {
return $host;
}
//判断是否是双后缀
$preg = '/[\w].+\.(com|net|org|gov|edu|co|ne)\.[\w]/';
if (($n > 2) && preg_match($preg, $host)) {
//双后缀取后3位
$host = $data[$n - 3].'.'.$data[$n - 2].'.'.$data[$n - 1];
} else {
//非双后缀取后两位
$host = $data[$n - 2].'.'.$data[$n - 1];
}
return $host;
}
... ...
... ... @@ -78,8 +78,7 @@ class AsideTicketController extends BaseController
*/
public function getProjects($search)
{
$projects = TicketProject::where('is_del', 0)
->where(function ($query) use ($search) {
$projects = TicketProject::where(function ($query) use ($search) {
// 查找项目名称或公司名称
$query->where('title', 'like', '%' . $search . '%')
->orWhere('company_name', 'like', '%' . $search . '%');
... ... @@ -99,8 +98,7 @@ class AsideTicketController extends BaseController
$dept_id = ManageHr::where('manage_id', $this->manage['id'])
->value('dept_id');
$lists = TicketProject::where('is_del', 0)
->when(($this->manage['role'] != 1 && $dept_id != 5), function ($query) use ($dept_id) {
$lists = TicketProject::when(($this->manage['role'] != 1 && $dept_id != 5), function ($query) use ($dept_id) {
/**
* 超管看所有项目 $this->manage['role']=1
* 全球搜: 技术部ID 1、售后部ID 2
... ... @@ -171,12 +169,13 @@ class AsideTicketController extends BaseController
$ticket->submit_username = $this->manage['name'];
$ticket->star = $request->input('star', 3);
$ticket->plan_end_at = $request->input('plan_end_at', null);
$ticket->close_wechat = $request->input('close_wechat', false);
$ticket->save();
// 分配工单参与人
$ticket->saveEngineers($request->input('engineer_ids', []));
$nickname = ManageHr::where('manage_id', $this->manage['id'])->value('nickname') ?? mb_substr($ticket->submit_username, 0, 1) . '**';
if ($project->wechat_switch)
if ($project->wechat_switch && !$ticket->close_wechat)
$project->pushWechatGroupMsg("创贸({$nickname})新增了工单(ID:{$ticket->id}),请及时处理!");
return $ticket;
});
... ... @@ -237,7 +236,7 @@ class AsideTicketController extends BaseController
->update(['status' => TicketLog::STATUS_COMPLETED, 'end_at' => now()]);
// 推动微信通知
$project = $ticket->project;
if ($project->wechat_switch)
if ($project->wechat_switch && !$ticket->close_wechat)
$project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");
$ticket->pushDing('finish');
... ...
... ... @@ -92,7 +92,7 @@ class AsideTicketLogController extends BaseController
$ticket->status = Tickets::STATUS_COMPLETED;
$ticket->end_at = now();
$project = $ticket->project;
if ($project->wechat_switch)
if ($project->wechat_switch && !$ticket->close_wechat)
$project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");
$ticket->pushDing('finish');
}
... ...
... ... @@ -66,7 +66,8 @@ class TicketChatController extends BaseController
$chat->save();
$project = $ticket->project;
$nickname = ManageHr::where('manage_id', $this->manage['id'])->value('nickname') ?? mb_substr($ticket->submit_username, 0, 1) . '**';
$project->pushWechatGroupMsg("创贸({$nickname})对工单(ID:{$ticket->id})进行了补充,请及时查看处理!");
if ($project->wechat_switch && !$ticket->close_wechat)
$project->pushWechatGroupMsg("创贸({$nickname})对工单(ID:{$ticket->id})进行了补充,请及时查看处理!");
$this->response('success', Code::SUCCESS, $chat);
}
... ...
... ... @@ -93,4 +93,24 @@ class TicketProjectController extends BaseController
{
//
}
/**
* 获取项目团队信息
*
* @param string $id 项目UUID
* @return mixed 返回项目团队信息或错误响应
*/
public function team($id)
{
// 根据UUID查找项目
$project = TicketProject::where('uuid', $id)->first();
// 如果项目不存在,返回错误响应
if (!$project) $this->response('Project not found', Code::USER_MODEL_NOTFOUND_ERROE);
// 返回项目团队信息
// 修改: 使用 getTeam() 方法而不是 getTeam 属性
return $this->response('Project team', Code::SUCCESS, $project->getTeam());
}
}
... ...
... ... @@ -210,7 +210,7 @@ class CNoticeController extends BaseController
* 更新通知C端
* @param Request $request
* @return \Illuminate\Http\JsonResponse
* @param : type : 1->主站更新 4->聚合页更新 7->ai博客
* @param : route : 1->主站更新 4->聚合页更新 7->ai博客
*/
public function sendNotify(Request $request)
{
... ... @@ -223,7 +223,7 @@ class CNoticeController extends BaseController
$url = $request->input('url', []);
$language = $request->input('language', []);
$is_sitemap = intval($request->input('is_sitemap', 0));
if($type == 4){//代表聚合页更新
if($route == 4){//代表聚合页更新
$keywordModel = new Keyword();
$keywordInfo = $keywordModel->whereNull('seo_title')->orWhereNull('seo_keywords')->orWhereNull('seo_description')->first();
if(!empty($keywordInfo)){
... ... @@ -302,7 +302,7 @@ class CNoticeController extends BaseController
'is_sitemap' => $is_sitemap
];
try {
http_post($c_url, json_encode($c_param));
http_post($c_url, json_encode($c_param,true));
}catch (\Exception $e){
NoticeLog::createLog(NoticeLog::GENERATE_PAGE, ['c_url'=>$c_url,'c_params'=>$c_param]);
}
... ...
... ... @@ -117,21 +117,4 @@ class GeoQuestionResController extends BaseController
$data = $this->logic->getSearchDate();
$this->response('success',Code::SUCCESS,$data);
}
/**
* @remark :获取搜索列表
* @name :getSearchList
* @author :lyh
* @method :post
* @time :2025/7/21 16:47
*/
public function getSearchList(){
$this->request->validate([
'created_at'=>'required',
],[
'created_at.required' => 'created_at不能为空',
]);
$data = $this->logic->getSearchList($this->map,$this->page,$this->row);
$this->response('success',Code::SUCCESS,$data);
}
}
... ...
... ... @@ -652,7 +652,10 @@ class ProductController extends BaseController
}
if(isset($this->map['title']) && !empty($this->map['title'])){
$this->map['title'] = str_replace('+',' ',$this->map['title']);
$query = $query->where('title','like','%'.$this->map['title'].'%');
$query->where(function ($subQuery) {
$subQuery->where('title','like','%'.$this->map['title'].'%')
->orwhere('route','like','%'.$this->map['title'].'%');
});
}
if(isset($this->map['keyword_title']) && !empty($this->map['keyword_title'])){
$keywordModel = new Keyword();
... ...
... ... @@ -37,6 +37,9 @@ class GeoLinkLogic extends BaseLogic
*/
public function getLinkList($map = [],$page = 1,$row = 20,$order = 'id'){
$filed = ['*'];
if(isset($map['url']) && !empty($map['url'])){
$map['url'] = ['like','%'.$map['url'].'%'];
}
$lists = $this->model->lists($map,$page,$row,$order,$filed);
return $this->success($lists);
}
... ... @@ -64,13 +67,6 @@ class GeoLinkLogic extends BaseLogic
* @time :2025/7/14 16:50
*/
public function saveLink(){
$data = [
'project_id' => 1,
'data' => [
['da'=>'ce_shi1', 'url'=>'www.baidu.com', 'send_time'=>'2021-07-09 11:12:12'],
['da'=>'ce_shi2', 'url'=>'www.baidu1.com', 'send_time'=>'2021-07-10 11:13:12'],
],
];
try {
if(!empty($this->param['data'])){
$data = [];
... ...
... ... @@ -47,12 +47,15 @@ class GeoQuestionResLogic extends BaseLogic
* @time :2025/7/4 9:48
*/
public function getResultList($map = [],$page = 1,$row = 20){
$map['project_id'] = $this->user['project_id'];
$filed = ['id','project_id','question_id','platform','question','en_question','keywords','url','created_at','updated_at'];
if(!empty($map['created_at'])){
$map['project_id'] = $this->user['project_id'];
$map['created_at'] = ['between',[$map['created_at'].' 00:00:00',$map['created_at'].' 23:59:59']];
$this->model = new GeoQuestionLog();
}
if(!empty($map['keywords'])){
$map['keywords'] = ['like','%'.$map['keywords'].'%'];
}
$query = $this->model->formatQuery($map);
$query = $query->where(function ($q) {
$q->whereRaw('JSON_LENGTH(keywords) > 0')
... ... @@ -85,20 +88,17 @@ class GeoQuestionResLogic extends BaseLogic
$questionModel = new GeoQuestion();
$list = $questionModel->list(['project_id'=>$this->user['project_id']],['question','keywords','url']);
$questionTotalCount = $urlTotalCount = $keywordsTotalCount = $keywordUrlCount = 0;
$keywordArr = [];
$questionLogModel = new GeoQuestionLog();
$keywordUrlCount = $questionLogModel->counts(['project_id'=>$this->user['project_id'],'hit'=>['!=',0]]);
foreach ($list as $item){
$questionTotalCount += count($item['question'] ?? []);
$keywordsTotalCount += count($item['keywords'] ?? []);
$urlTotalCount += count($item['url'] ?? []);
}
$keywordUrlCount = 0;
$keywordArr = [];
$questionResModel = new GeoQuestionLog();
$resList = $questionResModel->list(['project_id'=>$this->user['project_id']],['keywords','url','keywords_num','url_num']);
foreach ($resList as $resItem){
$keywordUrlCount += count($resItem['keywords']);
$keywordUrlCount += count($resItem['url']);
foreach ($resItem['keywords_num'] as $key => $value) {
$keywordArr[$key] = ($keywordArr[$key] ?? 0) + (($value != 0) ? 1 : 0);
foreach ($item['keywords'] as $keyWordItem){
if (!array_key_exists($keyWordItem, $keywordArr)) {
$keywordArr[$keyWordItem] = $questionLogModel->counts(['project_id'=>$this->user['project_id'],'keywords'=>['like','%"'.$keyWordItem.'"%']]);
}
}
}
$data = [
... ... @@ -122,7 +122,7 @@ class GeoQuestionResLogic extends BaseLogic
$data = [];
$platformModel = new GeoPlatform();
$list = $platformModel->list(['status'=>1],'id',['name','en_name']);
$questionResModel = new GeoQuestionResult();
$questionResModel = new GeoQuestionLog();
foreach ($list as $item){
$data[$item['name']] = $questionResModel->counts(['project_id'=>$this->user['project_id'],'hit'=>['!=',0],'platform'=>$item['en_name']]);
}
... ... @@ -137,7 +137,7 @@ class GeoQuestionResLogic extends BaseLogic
* @time :2025/7/21 16:36
*/
public function getSearchDate(){
$dates = $this->model->select(DB::raw('DATE(created_at) as date_only'))->distinct()->pluck('date_only');
$dates = $this->model->where('project_id',$this->user['project_id'])->select(DB::raw('DATE(created_at) as date_only'))->distinct()->pluck('date_only');
return $this->success($dates);
}
... ...
... ... @@ -31,6 +31,7 @@ class AsideTicketStoreRequest extends FormRequest
'engineer_ids' => 'array',
'star' => 'nullable|in:1,2,3|integer',
'plan_end_at' => 'nullable|date',
'close_wechat' => 'nullable|boolean',
];
}
}
... ...
... ... @@ -35,7 +35,7 @@ class GeoPlatform extends Base
public function getList(){
// $data = Cache::get('geo_platform');
// if(empty($data)){
$data = $this->list(['status'=>$this::STATUS_ON],'id',['name','en_name','icon','sort'],'desc');
$data = $this->list(['status'=>$this::STATUS_ON],'id',['name','en_name','icon','sort'],'asc');
Cache::put('geo_platform',$data,'12 * 3600');
// }
return $data;
... ...
... ... @@ -93,4 +93,11 @@ class TicketProject extends Base
$message_push->save();
}
}
public function getTeam()
{
return ManageHr::whereIn('manage_id', json_decode($this->team, true))
->where('manage_id', '>', 0)
->select(['manage_id', 'name', 'nickname', 'mobile'])->get()->toArray();
}
}
... ...
... ... @@ -53,7 +53,25 @@ class Tickets extends Base
elseif ($this->project->project_cate == 4)
$canyu[] = 85; // 黄小玉
else{
// todo 待完善
// todo V5V6 的项目, 组长能够给看到组员的工单
$leaders = [];
foreach (array_merge($engineer_ids, $canyu) as $engineer_id)
{
$engineer = ManageHr::where('manage_id', $engineer_id)->first();
if ($engineer)
{
$leader = ManageHr::where('is_leader', 1)
->where('status', ManageHr::STATUS_ONE)
->where('dept_id', $engineer->dept_id)
->where('belong_group', $engineer->belong_group)
->value('manage_id');
if ($leader)
$leaders[] = $leader;
}
}
// 合并组长 id 到 $canyu
$canyu = array_merge($canyu, $leaders);
}
$all_engineer_ids = array_unique(array_merge($canyu, $engineer_ids));
... ...
... ... @@ -62,7 +62,7 @@ class MessagePush extends Base
}
//特殊处理, 要求任何时候收到询盘都要及时推送到群里面
$special_project_ids = [650, 2045];
$special_project_ids = [650, 2045, 916];
//9-21 点,每条消息及时通知
//21-第二天 9 点,整合一起通知
$hour = date('H', strtotime($submit_at));
... ...
... ... @@ -78,6 +78,17 @@ class GeoService
*/
public function getDeepSeekResult($content,$model = 'deepseek-r1'){
$url = $this->api_url . 'v1/chat';
switch ($model){
case 'deepseek-r1':
$supplier = 'bailian';
break;
case 'gpt-4o-mini':
$supplier = 'azure';
break;
default:
$supplier = '';
break;
}
$header = [
'accept: application/json',
'X-CmerApi-Host: llm-chat.p.cmer.com',
... ... @@ -92,7 +103,7 @@ class GeoService
],
],
'model' => $model,
"supplier"=> "bailian",
"supplier"=> $supplier,
'security_check' => true
];
$data = http_post($url,json_encode($message,true),$header);
... ...
... ... @@ -258,6 +258,7 @@ Route::middleware(['aloginauth'])->group(function () {
Route::get('/pushNotify/{id}', [Aside\WorkOrder\AsideTicketController::class, 'pushNotify'])->name('admin.tickets.pushNotify')->summary('A端工单推送企微群');
Route::get('/projects/{search}', [Aside\WorkOrder\AsideTicketController::class, 'getProjects'])->name('admin.tickets.projects')->summary('A端V5V6项目列表');
Route::patch('/projects/{id}', [Aside\WorkOrder\TicketProjectController::class, 'update'])->name('admin.tickets.projects.update')->summary('A端修改工单项目');
Route::get('/projects_team/{id}', [Aside\WorkOrder\TicketProjectController::class, 'team'])->name('admin.tickets.projects_team')->summary('A端工单项目团队');
Route::get('/v56_projects/list', [Aside\WorkOrder\AsideTicketController::class, 'projectList'])->name('admin.tickets.projectList')->summary('A端V5V6项目列表')
->description("project_cate[项目分类1]: 1 V5, 2 V6, 3 超迹, 4 域途");
Route::post('/log/{id}', [Aside\WorkOrder\AsideTicketLogController::class, 'update'])->name('admin.tickets.log.update')->summary('A端工单操作日志更新,完成工单');
... ...