作者 赵彬吉
... ... @@ -86,7 +86,7 @@ class RemainDay extends Command
* @time :2025/4/2 10:48
*/
public function saveRemainDay(){
$list = $this->project->list(['extend_type'=>Project::TYPE_ZERO,'type'=>['in',[Project::TYPE_TWO,Project::TYPE_THREE,Project::TYPE_FOUR]]],'id',['id','type','uptime','remain_day','is_remain_today','pause_days','finish_remain_day']);
$list = $this->project->list(['extend_type'=>Project::TYPE_ZERO,'type'=>['in',[Project::TYPE_TWO,Project::TYPE_THREE,Project::TYPE_FOUR,Project::TYPE_SIX]]],'id',['id','type','uptime','remain_day','is_remain_today','pause_days','finish_remain_day','bm_finish_remain_day']);
foreach ($list as $item){
$deploy_build = $this->deployBuild->read(['project_id'=>$item['id']],['service_duration','seo_service_duration','plan','seo_plan']);
echo 'start->项目id:' . $item['id'] . '执行时间:'. date('Y-m-d H:i:s') . PHP_EOL;
... ... @@ -123,19 +123,15 @@ class RemainDay extends Command
//白帽版本的系统
if($deploy_build['seo_plan'] == 1){
if($deploy_build['seo_service_duration'] != 0){
if($item['uptime']){
$diff = time() - strtotime($item['uptime']);
$compliance_day = floor($diff / (60 * 60 * 24));
if($item['bm_finish_remain_day']){
$compliance_day = (int)$item['bm_finish_remain_day'];
$seo_remain_day = $deploy_build['seo_service_duration'] - $compliance_day;
}else{
$seo_remain_day = $deploy_build['seo_service_duration'];
}
// if($seo_remain_day < 0){
// $seo_remain_day = 0;
// }
if($deploy_build['plan'] == 0 && $seo_remain_day < 0 && $deploy_build['seo_service_duration'] != 0){//只有白帽版本的项目且剩余服务时常为0,放入未续费中
// $this->project->edit(['seo_remain_day'=>$seo_remain_day,'finish_remain_day'=>$compliance_day ?? 0,'extend_type'=>Project::TYPE_FIVE],['id'=>$item['id']]);
$this->project->edit(['seo_remain_day'=>$seo_remain_day,'finish_remain_day'=>$compliance_day ?? 0],['id'=>$item['id']]);
$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']]);
... ...
... ... @@ -58,7 +58,7 @@ class WorkOrderDing extends Command
sleep(3);
continue;
}
$mobile = $log->engineer->mobile;
$mobile = ManageHr::where('manage_id', $log->engineer_id)->value('mobile');
$response = Http::withBasicAuth(
env('DINGDING_BASIC_USER'),
env('DINGDING_BASIC_PASS')
... ... @@ -66,8 +66,10 @@ class WorkOrderDing extends Command
if ($response->status() == 200) {
$userid = $response->json()['data']['userid'];
$ding = new DingTalkService();
$created_at = date('m-d H', strtotime($log->ticket->created_at));
$plan_end_at = date('m-d H', strtotime($log->ticket->plan_end_at));
$resp = $ding->danliao(json_encode([
'text' => "您有新的工单(ID: {$log->ticket_id}),请及时处理!",
'text' => "您有新工单{$log->ticket_id}{$created_at}{$plan_end_at} 截止!",
'title' => 'AI协同工单 - ' . $log->ticket->project->title,
'picUrl' => 'https://hub.globalso.com/logocm.png',
'messageUrl' => 'https://oa.quanqiusou.cn/afterorder?project_id=' . $log->ticket->project->uuid,
... ...
... ... @@ -176,6 +176,7 @@ class AsideTicketController extends BaseController
// 分配工单参与人
$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)
$project->pushWechatGroupMsg("创贸({$nickname})新增了工单(ID:{$ticket->id}),请及时处理!");
return $ticket;
});
... ... @@ -217,16 +218,23 @@ class AsideTicketController extends BaseController
$ticket->saveEngineers($request->input('engineer_ids'));
// 其他字段有提交数据才修改,比如star plan_end_at
$ticket->title = $request->input('title', $ticket->title);
$ticket->content = $request->input('content', $ticket->content);
$ticket->star = $request->input('star', $ticket->star);
$ticket->plan_end_at = $request->input('plan_end_at', $ticket->plan_end_at);
$ticket->reply = $request->input('reply', null);
$ticket->status = $request->input('status', $ticket->status);
if ($ticket->status == Tickets::STATUS_COMPLETED)
{
// 完成工单,把子任务里面未完成的工单改为完成
$ticket->end_at = now();
$ticket->logs()->where('status', '<', TicketLog::STATUS_COMPLETED)
$ticket->logs()->where('status', '<', TicketLog::STATUS_COMPLETED)->where('is_engineer', 1)
->update(['status' => TicketLog::STATUS_COMPLETED, 'end_at' => now()]);
// 推动微信通知
$project = $ticket->project;
if ($project->wechat_switch)
$project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");
$ticket->pushDing('finish');
}
$ticket->save();
return $ticket;
... ... @@ -261,6 +269,7 @@ class AsideTicketController extends BaseController
if (empty($project->wechat_group_id)) {
$this->response('该工单没有绑定的企微群', Code::USER_MODEL_NOTFOUND_ERROE);
}
if ($project->wechat_switch)
$project->pushWechatGroupMsg();
$this->response('success', Code::SUCCESS);
}
... ...
... ... @@ -85,13 +85,18 @@ class AsideTicketLogController extends BaseController
$ticket->status = Tickets::STATUS_PROCESSING;
}else
{
$ticket->status = Tickets::STATUS_COMPLETED;
// 如果所有子任务都完成了,则将工单状态改为已完成
// todo 注意:建站期间的工单,所有人都完成后,不自动完成工单,需要项目经理验收修改工单状态
if (!($ticket->project->status == 1 && in_array($ticket->project->project_cate, [1, 2])))
{
$ticket->status = Tickets::STATUS_COMPLETED;
$ticket->end_at = now();
$project = $ticket->project;
if ($project->wechat_switch)
$project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");
$ticket->pushDing('finish');
}
}
$ticket->save();
return $log;
});
... ...
... ... @@ -24,11 +24,14 @@ class AsideTicketUpdateRequest extends FormRequest
public function rules()
{
return [
'title' => 'required|string',
'content' => 'required|string',
'files' => 'nullable|array',
'status' => 'nullable|in:0,1,2,3|integer',
'reply' => 'nullable|string',
'engineer_ids' => 'nullable|array',
'star' => 'nullable|in:1,2,3|integer',
'plan_end_at' => 'nullable|date',
'reply' => 'nullable|string', // 弃用
];
}
}
... ...
... ... @@ -16,7 +16,7 @@ class Tickets extends Base
const STATUS_PEDDING = 0; // 待处理
const STATUS_PROCESSING = 1; // 处理中
const STATUS_COMPLETED = 2; // 已完成
const STATUS_CLOSED = 3; // 已关闭
const STATUS_CLOSED = 3; // 已关闭,已失效
/**
* @return void
... ...