Files
BlackFruit-UI/plugins/addon/example/model/IdcsmartTicketDeliveryModel.php
yiqiu cbd6250967
All checks were successful
continuous-integration/drone/push Build is passing
修改插件
2025-11-21 00:01:45 +08:00

467 lines
21 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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;
}
}