'int', 'product_id' => 'int', 'ticket_type_id' => 'int', 'blocked_words' => 'string', 'create_time' => 'int', 'update_time' => 'int', ]; public $isAdmin = false; /** * 时间 2024-06-13 * @title 工单传递规则列表 * @desc 工单传递规则列表 * @author wyh * @version v1 * @return array list - 工单传递规则列表 * @return int list[].id - 规则ID * @return int list[].product_name - 商品名称 * @return int list[].type_name - 类型名称 * @return int list[].blocked_words - 屏蔽词,逗号分隔 */ public function ticketDeliveryList($param) { $list = $this->alias('td') ->field('td.id,p.name product_name,tt.name type_name,td.blocked_words,td.product_id,td.ticket_type_id') ->leftJoin('product p','td.product_id=p.id') ->leftJoin('addon_idcsmart_ticket_type tt','td.ticket_type_id=tt.id') ->select() ->toArray(); return [ 'status' => 200, 'msg' => lang_plugins('success_message'), 'data' => [ 'list' => $list ], ]; } /** * 时间 2024-06-13 * @title 工单传递规则详情 * @desc 工单传递规则详情 * @author wyh * @version v1 * @param int id - 工单传递规则ID required * @return object ticket_delivery - 工单传递规则详情 * @return int ticket_delivery.product_id - 商品ID * @return string ticket_delivery.ticket_type_id - 类型ID * @return string ticket_delivery.blocked_words - 屏蔽词,逗号分隔 */ public function indexTicketDelivery($id) { $ticketDelivery = $this->field('id,product_id,ticket_type_id,blocked_words')->find($id); $data = [ 'ticket_delivery' => $ticketDelivery ]; return ['status'=>200,'msg'=>lang_plugins('success_message'),'data'=>$data]; } /** * 时间 2024-06-13 * @title 创建工单传递规则 * @desc 创建工单传递规则 * @author wyh * @version v1 * @param int ticket_type_id - 工单类型ID required * @param array product_ids - 商品ID数组 required * @param string blocked_words - 屏蔽词 */ public function createTicketDelivery($param) { $this->startTrans(); try{ $insertAll = []; foreach ($param['product_ids'] as $productId){ $insertAll[] = [ 'product_id' => $productId, 'ticket_type_id' => $param['ticket_type_id'], 'blocked_words' => $param['blocked_words'], 'create_time' => time(), ]; } $this->insertAll($insertAll); $this->commit(); }catch (\Exception $e){ $this->rollback(); return ['status'=>400,'msg'=>lang_plugins('error_message')]; } return ['status'=>200,'msg'=>lang_plugins('success_message')]; } /** * 时间 2024-06-13 * @title 编辑工单传递规则 * @desc 编辑工单传递规则 * @author wyh * @version v1 * @param int id - 工单传递规则ID required * @param int product_id - 商品ID required * @param string blocked_words - 屏蔽词 */ public function updateTicketDelivery($param) { $this->startTrans(); try{ $this->update([ 'product_id' => $param['product_id'], 'ticket_type_id' => $param['ticket_type_id'], 'blocked_words' => $param['blocked_words'], 'update_time' => time(), ],['id' => $param['id']]); $this->commit(); }catch (\Exception $e){ $this->rollback(); return ['status'=>400,'msg'=>lang_plugins('error_message')]; } return ['status'=>200,'msg'=>lang_plugins('success_message')]; } /** * 时间 2024-06-13 * @title 删除工单传递规则 * @desc 删除工单传递规则 * @author wyh * @version v1 * @param int id - 工单传递规则ID required */ public function deleteTicketDelivery($id) { $this->startTrans(); try{ $this->where('id',$id)->delete(); $this->commit(); }catch (\Exception $e){ $this->rollback(); return ['status'=>400,'msg'=>lang_plugins('error_message')]; } return ['status'=>200,'msg'=>lang_plugins('success_message')]; } /** * 时间 2024-06-13 * @title 工单传递 * @desc 工单传递 * @author wyh * @version v1 * @param int host_id - 产品ID required * @param int ticket_id - 工单ID required */ public function delivery($param) { if (!isset($param['host_id']) || empty($param['host_id'])){ return ['status'=>400,'msg'=>lang_plugins('param_error')]; } if (!isset($param['ticket_id']) || empty($param['ticket_id'])){ return ['status'=>400,'msg'=>lang_plugins('param_error')]; } $HostModel = new HostModel(); $host = $HostModel->find($param['host_id']); if (empty($host)){ return ['status'=>400,'msg'=>lang_plugins('ticket_host_is_not_exist')]; } $IdcsmartTicketModel = new IdcsmartTicketModel(); $ticket = $IdcsmartTicketModel->find($param['ticket_id']); if (empty($ticket)){ return ['status'=>400,'msg'=>lang_plugins('ticket_is_not_exist')]; } $UpstreamHostModel = new UpstreamHostModel(); $upstreamHost = $UpstreamHostModel->where('host_id',$param['host_id'])->find(); if (empty($upstreamHost)){ return ['status'=>400,'msg'=>lang_plugins('ticket_upstream_host_is_not_exist')]; } $IdcsmartTicketUpstreamModel = new IdcsmartTicketUpstreamModel(); $ticketUpstream = $IdcsmartTicketUpstreamModel->where('ticket_id',$param['ticket_id'])->find(); if (!empty($ticketUpstream)){ return ['status'=>400,'msg'=>lang_plugins('ticket_has_deliveried')]; } // 规则只验证前台 if (!$this->isAdmin){ $delivery = $this->where('product_id',$host['product_id']) ->where('ticket_type_id',$ticket['ticket_type_id']) ->find(); if (empty($delivery)){ return ['status'=>400,'msg'=>lang_plugins('ticket_delivery_rule_error')]; } if (!empty($delivery['blocked_words'])){ $blockedWords = explode(',',$delivery['blocked_words']); foreach ($blockedWords as $blockedWord){ if (strpos($ticket['title'],$blockedWord)!==false){ return ['status'=>400,'msg'=>lang_plugins('ticket_delivery_rule_blocked_words_error')]; } } } } $config = IdcsmartTicketLogic::getDefaultConfig(); // 1、有文件,先传文件 $SupplierModel = new SupplierModel(); $supplier = $SupplierModel->find($upstreamHost['supplier_id']); $attachmentsUpstream = []; if (!empty($ticket['attachment'])){ $attachments = explode(',',$ticket['attachment']); foreach ($attachments as $attachment){ $result = IdcsmartTicketLogic::idcsmartApiCurlUploadFile($upstreamHost['supplier_id'],$config['ticket_upload'],$attachment); if ($result['status']!=200){ if ($this->isAdmin){ active_log(lang_plugins('log_ticket_delivery_upload_fail_admin',['{admin}'=>request()->admin_name,'{host_id}'=>$param['host_id'],'{ticket_id}'=>$param['ticket_id'],'{upstream}'=>$supplier['name'],'{reason}'=>$result['msg']]), 'addon_idcsmart_ticket', $param['ticket_id']); }else{ active_log(lang_plugins('log_ticket_delivery_upload_fail',['{host_id}'=>$param['host_id'],'{ticket_id}'=>$param['ticket_id'],'{upstream}'=>$supplier['name'],'{reason}'=>$result['msg']]), 'addon_idcsmart_ticket', $param['ticket_id']); } return $result; } if (isset($result['data']['save_name']) && !empty($result['data']['save_name'])){ $attachmentsUpstream[] = $result['data']['save_name']; } } } // 2、取附件,传递工单 $token = generate_signature(['title'=>$ticket['title'],'content'=>$ticket['content'],'downstream_ticket_id'=>$ticket['id']],AUTHCODE,'idcsmart_ticket')['signature']; $result = idcsmart_api_curl($upstreamHost['supplier_id'],'console/v1/ticket',[ 'is_downstream' => 1, 'downstream_delivery' => $config['downstream_delivery']??0, 'downstream_source' => 'IdcsmartTicket', 'downstream_url' => request()->domain(), 'downstream_token' => $token, 'downstream_ticket_id' => $ticket['id'], 'title' => $ticket['title'], 'content' => htmlspecialchars_decode($ticket['content']), 'host_ids' => [$upstreamHost['upstream_host_id']], // 传递上游产品ID 'ticket_type_id' => 0, 'attachment' => $attachmentsUpstream, ],30,'POST','json'); // 3、记录日志 if ($result['status']==200){ // 更新本地token,与传递给上游的一致 $ticket->save([ 'token' => $token ]); if ($this->isAdmin){ active_log(lang_plugins('log_ticket_delivery_success_admin',['{admin}'=>request()->admin_name,'{host_id}'=>$param['host_id'],'{ticket_id}'=>$param['ticket_id'],'{upstream}'=>$supplier['name']]), 'addon_idcsmart_ticket', $param['ticket_id']); }else{ active_log(lang_plugins('log_ticket_delivery_success',['{host_id}'=>$param['host_id'],'{ticket_id}'=>$param['ticket_id'],'{upstream}'=>$supplier['name']]), 'addon_idcsmart_ticket', $param['ticket_id']); } }else{ if ($this->isAdmin){ active_log(lang_plugins('log_ticket_delivery_fail_admin',['{admin}'=>request()->admin_name,'{host_id}'=>$param['host_id'],'{ticket_id}'=>$param['ticket_id'],'{upstream}'=>$supplier['name'],'{reason}'=>$result['msg']]), 'addon_idcsmart_ticket', $param['ticket_id']); }else{ active_log(lang_plugins('log_ticket_delivery_fail',['{host_id}'=>$param['host_id'],'{ticket_id}'=>$param['ticket_id'],'{upstream}'=>$supplier['name'],'{reason}'=>$result['msg']]), 'addon_idcsmart_ticket', $param['ticket_id']); } } return $result; } /** * 时间 2024-06-18 * @title 工单回复传递 * @desc 工单回复传递 * @author wyh * @version v1 * @param int ticket_id - 工单ID required * @param int ticket_reply_id - 工单回复ID required */ public function deliveryReply($param) { $IdcsmartTicketUpstreamModel = new IdcsmartTicketUpstreamModel(); $ticketUpstream = $IdcsmartTicketUpstreamModel->where('ticket_id',$param['ticket_id'])->find(); if (empty($ticketUpstream)){ return ['status'=>400,'msg'=>lang_plugins('ticket_has_not_deliveried_not_reply')]; } if ($ticketUpstream['delivery_status']==0){ if ($this->isAdmin){ active_log(lang_plugins('log_ticket_reply_delivery_status_is_terminate_admin',['{admin}'=>request()->admin_name,'{ticket_reply_id}'=>$param['ticket_reply_id'],'{host_id}'=>$ticketUpstream['host_id'],'{reason}'=>lang_plugins('ticket_delivery_status_is_terminate')]),'addon_idcsmart_ticket',$param['ticket_id']); }else{ active_log(lang_plugins('log_ticket_reply_delivery_status_is_terminate',['{ticket_reply_id}'=>$param['ticket_reply_id'],'{host_id}'=>$ticketUpstream['host_id'],'{reason}'=>lang_plugins('ticket_delivery_status_is_terminate')]),'addon_idcsmart_ticket',$param['ticket_id']); } return ['status'=>400,'msg'=>lang_plugins('ticket_delivery_status_is_terminate')]; } $UpstreamHostModel = new UpstreamHostModel(); $upstreamHost = $UpstreamHostModel->where('host_id',$ticketUpstream['host_id'])->find(); if (empty($upstreamHost)){ return ['status'=>400,'msg'=>lang_plugins('ticket_upstream_host_is_not_exist')]; } $IdcsmartTicketReplyModel = new IdcsmartTicketReplyModel(); $ticketReply = $IdcsmartTicketReplyModel->find($param['ticket_reply_id']??0); // 1、有文件,先传文件 $config = IdcsmartTicketLogic::getDefaultConfig(); $SupplierModel = new SupplierModel(); $supplier = $SupplierModel->find($upstreamHost['supplier_id']); $attachmentsUpstream = []; if (!empty($ticketReply['attachment'])){ $attachments = explode(',',$ticketReply['attachment']); foreach ($attachments as $attachment){ $result = IdcsmartTicketLogic::idcsmartApiCurlUploadFile($upstreamHost['supplier_id'],$config['ticket_upload'],$attachment); if ($result['status']!=200){ if ($this->isAdmin){ active_log(lang_plugins('log_ticket_reply_delivery_upload_fail_admin',['{admin}'=>request()->admin_name,'{host_id}'=>$ticketUpstream['host_id'],'{ticket_id}'=>$param['ticket_id'],'{ticket_reply_id}'=>$param['ticket_reply_id'],'{upstream}'=>$supplier['name'],'{reason}'=>$result['msg']]), 'addon_idcsmart_ticket', $param['ticket_id']); }else{ active_log(lang_plugins('log_ticket_reply_delivery_upload_fail',['{host_id}'=>$ticketUpstream['host_id'],'{ticket_id}'=>$param['ticket_id'],'{ticket_reply_id}'=>$param['ticket_reply_id'],'{upstream}'=>$supplier['name'],'{reason}'=>$result['msg']]), 'addon_idcsmart_ticket', $param['ticket_id']); } return $result; } if (isset($result['data']['save_name']) && !empty($result['data']['save_name'])){ $attachmentsUpstream[] = $result['data']['save_name']; } } } // 2、取附件,传递工单回复 $result = idcsmart_api_curl($upstreamHost['supplier_id'],"console/v1/ticket/{$ticketUpstream['upstream_ticket_id']}/reply",[ 'is_downstream' => 1, // 'downstream_delivery' => $config['downstream_delivery'], // 是否显示【下游传递】 // 'downstream_source' => 'IdcsmartTicket', // 'downstream_url' => request()->domain(), // 'downstream_token' => generate_signature(['content'=>$ticketReply['content']],AUTHCODE,'idcsmart_ticket')['signature'], 'downstream_ticket_reply_id' => $ticketReply['id'], 'content' => htmlspecialchars_decode($ticketReply['content']), 'attachment' => $attachmentsUpstream, ],30,'POST','json'); // 3、记录日志 if ($result['status']==200){ if ($this->isAdmin){ active_log(lang_plugins('log_ticket_reply_delivery_success_admin',['{admin}'=>request()->admin_name,'{host_id}'=>$ticketUpstream['host_id'],'{ticket_id}'=>$param['ticket_id'],'{ticket_reply_id}'=>$param['ticket_reply_id'],'{upstream}'=>$supplier['name']]), 'addon_idcsmart_ticket', $param['ticket_id']); }else{ active_log(lang_plugins('log_ticket_reply_delivery_success',['{host_id}'=>$ticketUpstream['host_id'],'{ticket_id}'=>$param['ticket_id'],'{ticket_reply_id}'=>$param['ticket_reply_id'],'{upstream}'=>$supplier['name']]), 'addon_idcsmart_ticket', $param['ticket_id']); } }else{ if ($this->isAdmin){ active_log(lang_plugins('log_ticket_reply_delivery_fail_admin',['{admin}'=>request()->admin_name,'{host_id}'=>$ticketUpstream['host_id'],'{ticket_id}'=>$param['ticket_id'],'{ticket_reply_id}'=>$param['ticket_reply_id'],'{upstream}'=>$supplier['name'],'{reason}'=>$result['msg']]), 'addon_idcsmart_ticket', $param['ticket_id']); }else{ active_log(lang_plugins('log_ticket_reply_delivery_fail',['{host_id}'=>$ticketUpstream['host_id'],'{ticket_id}'=>$param['ticket_id'],'{ticket_reply_id}'=>$param['ticket_reply_id'],'{upstream}'=>$supplier['name'],'{reason}'=>$result['msg']]), 'addon_idcsmart_ticket', $param['ticket_id']); } } return $result; } /** * 时间 2024-06-18 * @title 催单传递 * @desc 催单传递 * @author wyh * @version v1 * @param int ticket_id - 工单ID required */ public function deliveryUrge($param) { $IdcsmartTicketUpstreamModel = new IdcsmartTicketUpstreamModel(); $ticketUpstream = $IdcsmartTicketUpstreamModel->where('ticket_id',$param['ticket_id'])->find(); if (empty($ticketUpstream)){ return ['status'=>400,'msg'=>lang_plugins('ticket_has_not_deliveried_not_reply')]; } if ($ticketUpstream['delivery_status']==0){ return ['status'=>400,'msg'=>lang_plugins('ticket_delivery_status_is_terminate')]; } $UpstreamHostModel = new UpstreamHostModel(); $upstreamHost = $UpstreamHostModel->where('host_id',$ticketUpstream['host_id'])->find(); if (empty($upstreamHost)){ return ['status'=>400,'msg'=>lang_plugins('ticket_upstream_host_is_not_exist')]; } $SupplierModel = new SupplierModel(); $supplier = $SupplierModel->find($upstreamHost['supplier_id']); $result = idcsmart_api_curl($upstreamHost['supplier_id'],"console/v1/ticket/{$ticketUpstream['upstream_ticket_id']}/urge",[ 'is_downstream' => 1, ],30,'PUT','json'); // 记录日志 if ($result['status']==200){ active_log(lang_plugins('log_ticket_urge_delivery_success',['{host_id}'=>$ticketUpstream['host_id'],'{ticket_id}'=>$param['ticket_id'],'{upstream}'=>$supplier['name']]), 'addon_idcsmart_ticket', $param['ticket_id']); }else{ active_log(lang_plugins('log_ticket_urge_delivery_fail',['{host_id}'=>$ticketUpstream['host_id'],'{ticket_id}'=>$param['ticket_id'],'{upstream}'=>$supplier['name'],'{reason}'=>$result['msg']]), 'addon_idcsmart_ticket', $param['ticket_id']); } return $result; } /** * 时间 2024-06-18 * @title 关闭工单传递 * @desc 关闭工单传递 * @author wyh * @version v1 * @param int ticket_id - 工单ID required */ public function deliveryClose($param) { $IdcsmartTicketUpstreamModel = new IdcsmartTicketUpstreamModel(); $ticketUpstream = $IdcsmartTicketUpstreamModel->where('ticket_id',$param['ticket_id'])->find(); if (empty($ticketUpstream)){ return ['status'=>400,'msg'=>lang_plugins('ticket_has_not_deliveried_not_reply')]; } if ($ticketUpstream['delivery_status']==0){ return ['status'=>400,'msg'=>lang_plugins('ticket_delivery_status_is_terminate')]; } $UpstreamHostModel = new UpstreamHostModel(); $upstreamHost = $UpstreamHostModel->where('host_id',$ticketUpstream['host_id'])->find(); if (empty($upstreamHost)){ return ['status'=>400,'msg'=>lang_plugins('ticket_upstream_host_is_not_exist')]; } $SupplierModel = new SupplierModel(); $supplier = $SupplierModel->find($upstreamHost['supplier_id']); $result = idcsmart_api_curl($upstreamHost['supplier_id'],"console/v1/ticket/{$ticketUpstream['upstream_ticket_id']}/close",[ 'is_downstream' => 1, ],30,'PUT','json'); // 记录日志 if ($result['status']==200){ active_log(lang_plugins('log_ticket_close_delivery_success',['{host_id}'=>$ticketUpstream['host_id'],'{ticket_id}'=>$param['ticket_id'],'{upstream}'=>$supplier['name']]), 'addon_idcsmart_ticket', $param['ticket_id']); }else{ active_log(lang_plugins('log_ticket_close_delivery_fail',['{host_id}'=>$ticketUpstream['host_id'],'{ticket_id}'=>$param['ticket_id'],'{upstream}'=>$supplier['name'],'{reason}'=>$result['msg']]), 'addon_idcsmart_ticket', $param['ticket_id']); } return $result; } }