作者 赵彬吉
@@ -86,7 +86,7 @@ class RemainDay extends Command @@ -86,7 +86,7 @@ class RemainDay extends Command
86 * @time :2025/4/2 10:48 86 * @time :2025/4/2 10:48
87 */ 87 */
88 public function saveRemainDay(){ 88 public function saveRemainDay(){
89 - $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']); 89 + $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']);
90 foreach ($list as $item){ 90 foreach ($list as $item){
91 $deploy_build = $this->deployBuild->read(['project_id'=>$item['id']],['service_duration','seo_service_duration','plan','seo_plan']); 91 $deploy_build = $this->deployBuild->read(['project_id'=>$item['id']],['service_duration','seo_service_duration','plan','seo_plan']);
92 echo 'start->项目id:' . $item['id'] . '执行时间:'. date('Y-m-d H:i:s') . PHP_EOL; 92 echo 'start->项目id:' . $item['id'] . '执行时间:'. date('Y-m-d H:i:s') . PHP_EOL;
@@ -123,19 +123,15 @@ class RemainDay extends Command @@ -123,19 +123,15 @@ class RemainDay extends Command
123 //白帽版本的系统 123 //白帽版本的系统
124 if($deploy_build['seo_plan'] == 1){ 124 if($deploy_build['seo_plan'] == 1){
125 if($deploy_build['seo_service_duration'] != 0){ 125 if($deploy_build['seo_service_duration'] != 0){
126 - if($item['uptime']){  
127 - $diff = time() - strtotime($item['uptime']);  
128 - $compliance_day = floor($diff / (60 * 60 * 24)); 126 + if($item['bm_finish_remain_day']){
  127 + $compliance_day = (int)$item['bm_finish_remain_day'];
129 $seo_remain_day = $deploy_build['seo_service_duration'] - $compliance_day; 128 $seo_remain_day = $deploy_build['seo_service_duration'] - $compliance_day;
130 }else{ 129 }else{
131 $seo_remain_day = $deploy_build['seo_service_duration']; 130 $seo_remain_day = $deploy_build['seo_service_duration'];
132 } 131 }
133 -// if($seo_remain_day < 0){  
134 -// $seo_remain_day = 0;  
135 -// }  
136 if($deploy_build['plan'] == 0 && $seo_remain_day < 0 && $deploy_build['seo_service_duration'] != 0){//只有白帽版本的项目且剩余服务时常为0,放入未续费中 132 if($deploy_build['plan'] == 0 && $seo_remain_day < 0 && $deploy_build['seo_service_duration'] != 0){//只有白帽版本的项目且剩余服务时常为0,放入未续费中
137 // $this->project->edit(['seo_remain_day'=>$seo_remain_day,'finish_remain_day'=>$compliance_day ?? 0,'extend_type'=>Project::TYPE_FIVE],['id'=>$item['id']]); 133 // $this->project->edit(['seo_remain_day'=>$seo_remain_day,'finish_remain_day'=>$compliance_day ?? 0,'extend_type'=>Project::TYPE_FIVE],['id'=>$item['id']]);
138 - $this->project->edit(['seo_remain_day'=>$seo_remain_day,'finish_remain_day'=>$compliance_day ?? 0],['id'=>$item['id']]); 134 + $this->project->edit(['seo_remain_day'=>$seo_remain_day,'bm_finish_remain_day'=>$compliance_day ?? 0],['id'=>$item['id']]);
139 }else{ 135 }else{
140 //同时包括白帽版本+默认版本的项目 136 //同时包括白帽版本+默认版本的项目
141 $this->project->edit(['seo_remain_day'=>$seo_remain_day],['id'=>$item['id']]); 137 $this->project->edit(['seo_remain_day'=>$seo_remain_day],['id'=>$item['id']]);
@@ -58,7 +58,7 @@ class WorkOrderDing extends Command @@ -58,7 +58,7 @@ class WorkOrderDing extends Command
58 sleep(3); 58 sleep(3);
59 continue; 59 continue;
60 } 60 }
61 - $mobile = $log->engineer->mobile; 61 + $mobile = ManageHr::where('manage_id', $log->engineer_id)->value('mobile');
62 $response = Http::withBasicAuth( 62 $response = Http::withBasicAuth(
63 env('DINGDING_BASIC_USER'), 63 env('DINGDING_BASIC_USER'),
64 env('DINGDING_BASIC_PASS') 64 env('DINGDING_BASIC_PASS')
@@ -66,8 +66,10 @@ class WorkOrderDing extends Command @@ -66,8 +66,10 @@ class WorkOrderDing extends Command
66 if ($response->status() == 200) { 66 if ($response->status() == 200) {
67 $userid = $response->json()['data']['userid']; 67 $userid = $response->json()['data']['userid'];
68 $ding = new DingTalkService(); 68 $ding = new DingTalkService();
  69 + $created_at = date('m-d H', strtotime($log->ticket->created_at));
  70 + $plan_end_at = date('m-d H', strtotime($log->ticket->plan_end_at));
69 $resp = $ding->danliao(json_encode([ 71 $resp = $ding->danliao(json_encode([
70 - 'text' => "您有新的工单(ID: {$log->ticket_id}),请及时处理!", 72 + 'text' => "您有新工单{$log->ticket_id}{$created_at}{$plan_end_at} 截止!",
71 'title' => 'AI协同工单 - ' . $log->ticket->project->title, 73 'title' => 'AI协同工单 - ' . $log->ticket->project->title,
72 'picUrl' => 'https://hub.globalso.com/logocm.png', 74 'picUrl' => 'https://hub.globalso.com/logocm.png',
73 'messageUrl' => 'https://oa.quanqiusou.cn/afterorder?project_id=' . $log->ticket->project->uuid, 75 'messageUrl' => 'https://oa.quanqiusou.cn/afterorder?project_id=' . $log->ticket->project->uuid,
@@ -176,7 +176,8 @@ class AsideTicketController extends BaseController @@ -176,7 +176,8 @@ class AsideTicketController extends BaseController
176 // 分配工单参与人 176 // 分配工单参与人
177 $ticket->saveEngineers($request->input('engineer_ids', [])); 177 $ticket->saveEngineers($request->input('engineer_ids', []));
178 $nickname = ManageHr::where('manage_id', $this->manage['id'])->value('nickname') ?? mb_substr($ticket->submit_username, 0, 1) . '**'; 178 $nickname = ManageHr::where('manage_id', $this->manage['id'])->value('nickname') ?? mb_substr($ticket->submit_username, 0, 1) . '**';
179 - $project->pushWechatGroupMsg("创贸({$nickname})新增了工单(ID:{$ticket->id}),请及时处理!"); 179 + if ($project->wechat_switch)
  180 + $project->pushWechatGroupMsg("创贸({$nickname})新增了工单(ID:{$ticket->id}),请及时处理!");
180 return $ticket; 181 return $ticket;
181 }); 182 });
182 $this->response('success', Code::SUCCESS, $result->toArray()); 183 $this->response('success', Code::SUCCESS, $result->toArray());
@@ -217,16 +218,23 @@ class AsideTicketController extends BaseController @@ -217,16 +218,23 @@ class AsideTicketController extends BaseController
217 $ticket->saveEngineers($request->input('engineer_ids')); 218 $ticket->saveEngineers($request->input('engineer_ids'));
218 219
219 // 其他字段有提交数据才修改,比如star plan_end_at 220 // 其他字段有提交数据才修改,比如star plan_end_at
  221 + $ticket->title = $request->input('title', $ticket->title);
  222 + $ticket->content = $request->input('content', $ticket->content);
220 $ticket->star = $request->input('star', $ticket->star); 223 $ticket->star = $request->input('star', $ticket->star);
221 $ticket->plan_end_at = $request->input('plan_end_at', $ticket->plan_end_at); 224 $ticket->plan_end_at = $request->input('plan_end_at', $ticket->plan_end_at);
222 - $ticket->reply = $request->input('reply', null);  
223 $ticket->status = $request->input('status', $ticket->status); 225 $ticket->status = $request->input('status', $ticket->status);
224 if ($ticket->status == Tickets::STATUS_COMPLETED) 226 if ($ticket->status == Tickets::STATUS_COMPLETED)
225 { 227 {
226 // 完成工单,把子任务里面未完成的工单改为完成 228 // 完成工单,把子任务里面未完成的工单改为完成
227 $ticket->end_at = now(); 229 $ticket->end_at = now();
228 - $ticket->logs()->where('status', '<', TicketLog::STATUS_COMPLETED) 230 + $ticket->logs()->where('status', '<', TicketLog::STATUS_COMPLETED)->where('is_engineer', 1)
229 ->update(['status' => TicketLog::STATUS_COMPLETED, 'end_at' => now()]); 231 ->update(['status' => TicketLog::STATUS_COMPLETED, 'end_at' => now()]);
  232 + // 推动微信通知
  233 + $project = $ticket->project;
  234 + if ($project->wechat_switch)
  235 + $project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");
  236 + $ticket->pushDing('finish');
  237 +
230 } 238 }
231 $ticket->save(); 239 $ticket->save();
232 return $ticket; 240 return $ticket;
@@ -261,7 +269,8 @@ class AsideTicketController extends BaseController @@ -261,7 +269,8 @@ class AsideTicketController extends BaseController
261 if (empty($project->wechat_group_id)) { 269 if (empty($project->wechat_group_id)) {
262 $this->response('该工单没有绑定的企微群', Code::USER_MODEL_NOTFOUND_ERROE); 270 $this->response('该工单没有绑定的企微群', Code::USER_MODEL_NOTFOUND_ERROE);
263 } 271 }
264 - $project->pushWechatGroupMsg(); 272 + if ($project->wechat_switch)
  273 + $project->pushWechatGroupMsg();
265 $this->response('success', Code::SUCCESS); 274 $this->response('success', Code::SUCCESS);
266 } 275 }
267 276
@@ -85,12 +85,17 @@ class AsideTicketLogController extends BaseController @@ -85,12 +85,17 @@ class AsideTicketLogController extends BaseController
85 $ticket->status = Tickets::STATUS_PROCESSING; 85 $ticket->status = Tickets::STATUS_PROCESSING;
86 }else 86 }else
87 { 87 {
88 - $ticket->status = Tickets::STATUS_COMPLETED;  
89 // 如果所有子任务都完成了,则将工单状态改为已完成 88 // 如果所有子任务都完成了,则将工单状态改为已完成
90 - $ticket->end_at = now();  
91 - $project = $ticket->project;  
92 - $project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");  
93 - $ticket->pushDing('finish'); 89 + // todo 注意:建站期间的工单,所有人都完成后,不自动完成工单,需要项目经理验收修改工单状态
  90 + if (!($ticket->project->status == 1 && in_array($ticket->project->project_cate, [1, 2])))
  91 + {
  92 + $ticket->status = Tickets::STATUS_COMPLETED;
  93 + $ticket->end_at = now();
  94 + $project = $ticket->project;
  95 + if ($project->wechat_switch)
  96 + $project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");
  97 + $ticket->pushDing('finish');
  98 + }
94 } 99 }
95 $ticket->save(); 100 $ticket->save();
96 return $log; 101 return $log;
@@ -24,11 +24,14 @@ class AsideTicketUpdateRequest extends FormRequest @@ -24,11 +24,14 @@ class AsideTicketUpdateRequest extends FormRequest
24 public function rules() 24 public function rules()
25 { 25 {
26 return [ 26 return [
  27 + 'title' => 'required|string',
  28 + 'content' => 'required|string',
  29 + 'files' => 'nullable|array',
27 'status' => 'nullable|in:0,1,2,3|integer', 30 'status' => 'nullable|in:0,1,2,3|integer',
28 - 'reply' => 'nullable|string',  
29 'engineer_ids' => 'nullable|array', 31 'engineer_ids' => 'nullable|array',
30 'star' => 'nullable|in:1,2,3|integer', 32 'star' => 'nullable|in:1,2,3|integer',
31 'plan_end_at' => 'nullable|date', 33 'plan_end_at' => 'nullable|date',
  34 + 'reply' => 'nullable|string', // 弃用
32 ]; 35 ];
33 } 36 }
34 } 37 }
@@ -16,7 +16,7 @@ class Tickets extends Base @@ -16,7 +16,7 @@ class Tickets extends Base
16 const STATUS_PEDDING = 0; // 待处理 16 const STATUS_PEDDING = 0; // 待处理
17 const STATUS_PROCESSING = 1; // 处理中 17 const STATUS_PROCESSING = 1; // 处理中
18 const STATUS_COMPLETED = 2; // 已完成 18 const STATUS_COMPLETED = 2; // 已完成
19 - const STATUS_CLOSED = 3; // 已关闭 19 + const STATUS_CLOSED = 3; // 已关闭,已失效
20 20
21 /** 21 /**
22 * @return void 22 * @return void