修改插件
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
yiqiu
2025-11-21 00:01:45 +08:00
parent 7bc68457e9
commit cbd6250967
224 changed files with 61713 additions and 18 deletions

View File

@@ -0,0 +1,466 @@
<?php
namespace addon\idcsmart_ticket\model;
use addon\idcsmart_ticket\logic\IdcsmartTicketLogic;
use app\common\model\HostModel;
use app\common\model\SupplierModel;
use app\common\model\UpstreamHostModel;
use think\Model;
/*
* @author wyh
* @time 2024-06-213
*/
class IdcsmartTicketDeliveryModel extends Model
{
protected $name = 'addon_idcsmart_ticket_delivery';
# 设置字段信息
protected $schema = [
'id' => '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;
}
}