工单沟通记录
This commit is contained in:
@@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\ticket\controller;
|
||||||
|
|
||||||
|
use app\ticket\service\ConversationService;
|
||||||
|
use support\Request;
|
||||||
|
|
||||||
|
class ConversationController extends BaseController
|
||||||
|
{
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$ticket_id = $request->input('ticket_id');
|
||||||
|
if(empty($ticket_id)){
|
||||||
|
return $this->error('ticket_id不能为空');
|
||||||
|
}
|
||||||
|
$result = (new ConversationService())->list($request->all());
|
||||||
|
return $this->success($this->page($result));
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
return $this->error($e->getMessage().$e->getLine().$e->getFile());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function add(Request $request)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$request->setPost('user_id', 1);
|
||||||
|
return (new ConversationService())->add($request->all())
|
||||||
|
? $this->success()
|
||||||
|
: $this->error();
|
||||||
|
} catch (\Throwable $th) {
|
||||||
|
return $this->error($th->getMessage().' '.$th->getLine().' '.$th->getFile());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function edit(Request $request)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$request->setPost('user_id', 1);
|
||||||
|
$result = (new ConversationService())->edit($request->all());
|
||||||
|
return $result
|
||||||
|
? $this->success($result)
|
||||||
|
: $this->error();
|
||||||
|
} catch (\Throwable $th) {
|
||||||
|
return $this->error($th->getMessage().' '.$th->getLine().' '.$th->getFile());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -39,7 +39,30 @@ class TicketController extends BaseController
|
|||||||
? $this->success($result)
|
? $this->success($result)
|
||||||
: $this->error();
|
: $this->error();
|
||||||
} catch (\Throwable $th) {
|
} catch (\Throwable $th) {
|
||||||
return $this->error($th->getMessage().' '.$th->getLine().' '.$th->getFile());
|
return $this->error($th->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function status(Request $request)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$request->setPost('user_id', 1);
|
||||||
|
$result = (new TicketService())->status($request->all());
|
||||||
|
return $result
|
||||||
|
? $this->success($result)
|
||||||
|
: $this->error();
|
||||||
|
} catch (\Throwable $th) {
|
||||||
|
return $this->error($th->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function getStatus(Request $request)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$result = (new TicketService())->getStatus($request->all());
|
||||||
|
return $result
|
||||||
|
? $this->success($result)
|
||||||
|
: $this->error();
|
||||||
|
} catch (\Throwable $th) {
|
||||||
|
return $this->error($th->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\ticket\logic;
|
||||||
|
|
||||||
|
use app\ticket\model\Conversation;
|
||||||
|
use support\Log;
|
||||||
|
use support\exception\BusinessException;
|
||||||
|
|
||||||
|
class ConversationLogic
|
||||||
|
{
|
||||||
|
public function list($params)
|
||||||
|
{
|
||||||
|
$where = [];
|
||||||
|
if (!empty($params['ticket_id'])) {
|
||||||
|
$where['ticket_id'] = $params['ticket_id'];
|
||||||
|
}
|
||||||
|
$size = $params['size'] ?? 10;
|
||||||
|
$current = $params['current'] ?? 1;
|
||||||
|
return Conversation::where($where)->paginate($size, ['*'], 'page', $current);
|
||||||
|
}
|
||||||
|
public function add(array $data)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return Conversation::create($data);
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
Log::error('会话创建失败', [
|
||||||
|
'data' => $data,
|
||||||
|
'error' => $e->getMessage()
|
||||||
|
]);
|
||||||
|
throw new BusinessException('会话创建失败,请稍后重试', 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function edit(array $data)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$conversation = Conversation::updateOrCreate(['id' => $data['id']], $data);
|
||||||
|
return $conversation;
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
Log::error('会话编辑失败', [
|
||||||
|
'data' => $data,
|
||||||
|
'error' => $e->getMessage()
|
||||||
|
]);
|
||||||
|
throw new BusinessException($e->getMessage().'会话编辑失败,请稍后重试', 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -50,6 +50,12 @@ class TicketLogic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function find(int $id)
|
||||||
|
{
|
||||||
|
$ticket = Ticket::find($id);
|
||||||
|
return $ticket;
|
||||||
|
}
|
||||||
|
|
||||||
public static function generateSimpleTicketNo(): string
|
public static function generateSimpleTicketNo(): string
|
||||||
{
|
{
|
||||||
$date = date('Ymd'); // 日期
|
$date = date('Ymd'); // 日期
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\ticket\model;
|
||||||
|
|
||||||
|
use support\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ticket_conversation 工单会话表
|
||||||
|
* @property integer $id 主键
|
||||||
|
* @property integer $ticket_id 工单ID
|
||||||
|
* @property integer $user_id 用户ID
|
||||||
|
* @property string $content 会话内容
|
||||||
|
* @property string $created_at 创建时间
|
||||||
|
* @property string $updated_at 更新时间
|
||||||
|
*/
|
||||||
|
class Conversation extends Model
|
||||||
|
{
|
||||||
|
protected $connection = 'mysql';
|
||||||
|
protected $table = 'ticket_conversation';
|
||||||
|
protected $primaryKey = 'id';
|
||||||
|
public $timestamps = true;
|
||||||
|
protected $dateFormat = 'U';
|
||||||
|
protected $dates = ['created_at', 'updated_at'];
|
||||||
|
protected $casts = [
|
||||||
|
'updated_at' => 'datetime:Y-m-d H:i:s',
|
||||||
|
'created_at' => 'datetime:Y-m-d H:i:s',
|
||||||
|
];
|
||||||
|
protected $fillable = [
|
||||||
|
'ticket_id',
|
||||||
|
'user_id',
|
||||||
|
'content',
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\ticket\service;
|
||||||
|
|
||||||
|
use app\ticket\logic\ConversationLogic;
|
||||||
|
use config\constants\Constants;
|
||||||
|
use support\Db;
|
||||||
|
use support\exception\BusinessException;
|
||||||
|
|
||||||
|
class ConversationService
|
||||||
|
{
|
||||||
|
public function list($params)
|
||||||
|
{
|
||||||
|
// $locale = locale();
|
||||||
|
$locale = 'zh';
|
||||||
|
$ticket_status = $locale == 'zh'? Constants::TICKET_STATUS_ZH:Constants::TICKET_STATUS_EN;
|
||||||
|
// $ticket_status = Constants::TICKET_STATUS_ZH;
|
||||||
|
// $params['locale'] = locale();
|
||||||
|
$result = (new ConversationLogic())->list($params);
|
||||||
|
|
||||||
|
$status_fanyi = array_map(fn($v) => "{{{$v}}}", array_flip(Constants::TICKET_STATUS));
|
||||||
|
foreach ($result as $key => $value) {
|
||||||
|
$result[$key]['content'] = str_replace($status_fanyi,$ticket_status,$value['content']);
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function add(array $data)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return (new ConversationLogic())->add($data);
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
Db::rollback();
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function edit(array $data)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Db::beginTransaction();
|
||||||
|
$result = (new ConversationLogic())->edit($data);
|
||||||
|
Db::commit();
|
||||||
|
return $result;
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
Db::rollback();
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,14 +3,17 @@
|
|||||||
namespace app\ticket\service;
|
namespace app\ticket\service;
|
||||||
|
|
||||||
use app\ticket\logic\AttachmentLogic;
|
use app\ticket\logic\AttachmentLogic;
|
||||||
|
use app\ticket\logic\ConversationLogic;
|
||||||
use app\ticket\logic\TicketLogic;
|
use app\ticket\logic\TicketLogic;
|
||||||
use app\ticket\model\Ticket;
|
use app\ticket\model\Ticket;
|
||||||
|
use config\constants\Constants;
|
||||||
use support\Db;
|
use support\Db;
|
||||||
use support\exception\BusinessException;
|
use support\exception\BusinessException;
|
||||||
use support\Log;
|
use support\Log;
|
||||||
|
|
||||||
class TicketService
|
class TicketService
|
||||||
{
|
{
|
||||||
|
|
||||||
public function list($params)
|
public function list($params)
|
||||||
{
|
{
|
||||||
$res = (new TicketLogic())->list($params);
|
$res = (new TicketLogic())->list($params);
|
||||||
@@ -51,4 +54,49 @@ class TicketService
|
|||||||
throw $e;
|
throw $e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function status(array $data)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Db::beginTransaction();
|
||||||
|
$msg = $data['msg']??[];
|
||||||
|
$ticket = (new TicketLogic())->find($data['id']);
|
||||||
|
if(empty($ticket)){
|
||||||
|
throw new BusinessException('工单不存在');
|
||||||
|
}
|
||||||
|
if($data['status'] == $ticket->status){
|
||||||
|
throw new BusinessException('状态未修改');
|
||||||
|
}
|
||||||
|
|
||||||
|
// if(!in_array($ticket->status, [Constants::TICKET_STATUS['PENDING'], Constants::TICKET_STATUS['CONFIRM']])
|
||||||
|
// && empty($msg)){
|
||||||
|
// throw new BusinessException('提交失败');
|
||||||
|
// }
|
||||||
|
|
||||||
|
$ticket->status = $data['status'];
|
||||||
|
$result = $ticket->save();
|
||||||
|
|
||||||
|
if(!empty($msg)){
|
||||||
|
$conversation = [
|
||||||
|
'ticket_id' => $ticket->id,
|
||||||
|
'user_id' => $data['user_id'],
|
||||||
|
'content' => '状态更新为{{'.array_search($data['status'],Constants::TICKET_STATUS).'}}:'.$msg
|
||||||
|
];
|
||||||
|
$res = (new ConversationLogic())->add($conversation);
|
||||||
|
}
|
||||||
|
|
||||||
|
Db::commit();
|
||||||
|
return $result;
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
Db::rollback();
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getStatus(array $data)
|
||||||
|
{
|
||||||
|
$locale = locale();
|
||||||
|
$ticket_status = $locale == 'zh'? Constants::TICKET_STATUS_ZH:Constants::TICKET_STATUS_EN;
|
||||||
|
return $ticket_status;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
namespace config\constants;
|
||||||
|
|
||||||
|
class Constants
|
||||||
|
{
|
||||||
|
//工单状态
|
||||||
|
public const TICKET_STATUS = [
|
||||||
|
'PENDING' => 1, // 待受理
|
||||||
|
'PROCESS' => 2, //处理中
|
||||||
|
'CONFIRM' => 3, // 待确认
|
||||||
|
'FINISH' => 4, // 已完成
|
||||||
|
'REJECTED' => 5, // 已驳回
|
||||||
|
];
|
||||||
|
|
||||||
|
public const TICKET_STATUS_ZH = [
|
||||||
|
self::TICKET_STATUS['PENDING'] => '待受理',
|
||||||
|
self::TICKET_STATUS['PROCESS'] => '处理中',
|
||||||
|
self::TICKET_STATUS['CONFIRM'] => '待确认',
|
||||||
|
self::TICKET_STATUS['FINISH'] => '已完成',
|
||||||
|
self::TICKET_STATUS['REJECTED'] => '已驳回',
|
||||||
|
];
|
||||||
|
public const TICKET_STATUS_EN = [
|
||||||
|
self::TICKET_STATUS['PENDING'] => 'Pending acceptance',
|
||||||
|
self::TICKET_STATUS['PROCESS'] => 'Processing',
|
||||||
|
self::TICKET_STATUS['CONFIRM'] => 'To be confirmed',
|
||||||
|
self::TICKET_STATUS['FINISH'] => 'Completed',
|
||||||
|
self::TICKET_STATUS['REJECTED'] => 'Rejected',
|
||||||
|
];
|
||||||
|
public const TICKET_STATUS_RU = [
|
||||||
|
self::TICKET_STATUS['PENDING'] => 'Подлежит рассмотрению',
|
||||||
|
self::TICKET_STATUS['PROCESS'] => 'В процессе обработки',
|
||||||
|
self::TICKET_STATUS['CONFIRM'] => 'Подлежит подтверждению',
|
||||||
|
self::TICKET_STATUS['FINISH'] => 'Завершено',
|
||||||
|
self::TICKET_STATUS['REJECTED'] => 'Отклонено',
|
||||||
|
];
|
||||||
|
|
||||||
|
}
|
||||||
@@ -35,9 +35,19 @@ Route::group('/common', function () {
|
|||||||
|
|
||||||
|
|
||||||
Route::group('/ticket', function () {
|
Route::group('/ticket', function () {
|
||||||
|
//工单
|
||||||
Route::any('/ticket/add', [app\ticket\controller\TicketController::class, 'add']);
|
Route::any('/ticket/add', [app\ticket\controller\TicketController::class, 'add']);
|
||||||
Route::any('/ticket/edit', [app\ticket\controller\TicketController::class, 'edit']);
|
Route::any('/ticket/edit', [app\ticket\controller\TicketController::class, 'edit']);
|
||||||
Route::any('/ticket/list', [app\ticket\controller\TicketController::class, 'index']);
|
Route::any('/ticket/list', [app\ticket\controller\TicketController::class, 'index']);
|
||||||
|
Route::any('/ticket/status', [app\ticket\controller\TicketController::class, 'status']);
|
||||||
|
Route::any('/ticket/getStatus', [app\ticket\controller\TicketController::class, 'getStatus']);
|
||||||
|
|
||||||
Route::any('/upload', [app\common\controller\UploadController::class, 'uploadFile']);
|
Route::any('/upload', [app\common\controller\UploadController::class, 'uploadFile']);
|
||||||
|
|
||||||
|
//工单沟通记录
|
||||||
|
Route::any('/conversation/add', [app\ticket\controller\ConversationController::class, 'add']);
|
||||||
|
Route::any('/conversation/edit', [app\ticket\controller\ConversationController::class, 'edit']);
|
||||||
|
Route::any('/conversation/list', [app\ticket\controller\ConversationController::class, 'index']);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user