工单分类

This commit is contained in:
2025-07-04 13:45:50 +08:00
parent 2be25889ea
commit 3be2ae983c
28 changed files with 900 additions and 8 deletions
@@ -0,0 +1,52 @@
<?php
namespace app\ticket\controller;
use app\ticket\service\CategorieService;
use support\Request;
class CategorieController extends BaseController
{
public function index(Request $request)
{
try {
$result = (new CategorieService())->list($request->all());
return $this->success($this->page($result));
} catch (\Throwable $e) {
return $this->error($e->getMessage());
}
}
public function getAll(Request $request)
{
try {
$result = (new CategorieService())->getAll($request->all());
return $this->success($result);
} catch (\Throwable $e) {
return $this->error($e->getMessage());
}
}
public function add(Request $request)
{
try {
return (new CategorieService())->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 {
$result = (new CategorieService())->edit($request->all());
return $result
? $this->success($result)
: $this->error();
} catch (\Throwable $th) {
return $this->error($th->getMessage().' '.$th->getLine().' '.$th->getFile());
}
}
}
+52
View File
@@ -0,0 +1,52 @@
<?php
namespace app\ticket\logic;
use app\ticket\model\TicketCategorie;
use support\Log;
use support\exception\BusinessException;
class CategorieLogic
{
public function list($params)
{
$where = [];
$size = $params['size'] ?? 10;
$current = $params['current'] ?? 1;
return TicketCategorie::with('translation')->where($where)->paginate($size, ['*'], 'page', $current);
}
public function getAll($params)
{
$where = [];
$where[] = ['status', '=', 1];
return TicketCategorie::with('translation')->where($where)->get();
}
public function add(array $data)
{
try {
return TicketCategorie::create($data);
} catch (\Throwable $e) {
Log::error('分类创建失败', [
'data' => $data,
'error' => $e->getMessage()
]);
throw new BusinessException($e->getMessage().'分类创建失败,请稍后重试', 500);
}
}
public function edit(array $data)
{
try {
$categorie = TicketCategorie::updateOrCreate(['id' => $data['id']], $data);
return $categorie;
} catch (\Throwable $e) {
Log::error('分类编辑失败', [
'data' => $data,
'error' => $e->getMessage()
]);
throw new BusinessException($e->getMessage().'分类编辑失败,请稍后重试', 500);
}
}
}
+7 -1
View File
@@ -17,9 +17,15 @@ class TicketLogic
public function list($params)
{
$where = [];
if(!empty($params['categorie_id'])){
$where[] = ['categorie_id', '=', $params['categorie_id']];
}
if(!empty($params['status'])){
$where[] = ['status', '=', $params['status']];
}
$size = $params['size'];
$current = $params['current'];
return Ticket::with('attachments')->where($where)->paginate($size, ['*'], 'page', $current);
return Ticket::with('attachments')->where($where)->orderBy('id','desc')->paginate($size, ['*'], 'page', $current);
}
public function add(array $data)
{
+47
View File
@@ -0,0 +1,47 @@
<?php
namespace app\ticket\model;
use support\Model;
/**
* ticket_categorie 工单分类表
* @property integer $id 主键
* @property string $name 分类名称
* @property string $description 分类描述
* @property string $created_at 创建时间
* @property string $updated_at 更新时间
*/
class TicketCategorie extends Model
{
protected $connection = 'mysql';
protected $table = 'ticket_categorie';
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 = [
'name',
'description',
];
/**
* 单条翻译
*/
public function translation()
{
return $this->hasOne(TicketCategorieTranslation::class, 'categorie_id')->where('locale', locale());
}
/**
* 多条翻译
*/
public function translations()
{
return $this->hasMany(TicketCategorieTranslation::class, 'categorie_id');
}
}
@@ -0,0 +1,35 @@
<?php
namespace app\ticket\model;
use support\Model;
/**
* ticket_categorie_translation 工单分类多语言表
* @property integer $id 主键
* @property integer $categorie_id 分类ID
* @property string $locale 语言
* @property string $name 分类名称
* @property string $description 分类描述
* @property string $created_at 创建时间
* @property string $updated_at 更新时间
*/
class TicketCategorieTranslation extends Model
{
protected $connection = 'mysql';
protected $table = 'ticket_categorie_translation';
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 = [
'categorie_id',
'locale',
'name',
'description',
];
}
+85
View File
@@ -0,0 +1,85 @@
<?php
namespace app\ticket\service;
use app\queue\translation\service\TranslationService;
use app\queue\utils\Translat;
use app\ticket\logic\CategorieLogic;
use support\Db;
use support\exception\BusinessException;
class CategorieService
{
public function list($params)
{
$result = (new CategorieLogic())->list($params);
foreach ($result as $key => &$value) {
$value['name'] = isset($item['translation']) ? $item['translation']['name'] : '';
unset($value['translation']);
}
unset($value);
return $result;
}
public function getAll($params)
{
$result = (new CategorieLogic())->getAll($params);
foreach ($result as $key => &$value) {
$value['name'] =isset($item['translation']) ? $item['translation']['name'] : '';
unset($value['translation']);
}
unset($value);
return $result;
}
public $translatFields = ['name'];
public function add(array $data)
{
try {
Db::beginTransaction();
$sourceLocale = locale();
$traitsourceFields = Translat::extractSourceFields($data, $this->translatFields);
$result = (new CategorieLogic())->add($data);
(new TranslationService())->queueTranslations(
'ticket_categorie',
$result->id,
$sourceLocale,
$traitsourceFields
);
Db::commit();
return $result;
} catch (\Throwable $e) {
Db::rollback();
throw $e;
}
}
public function edit(array $data)
{
try {
Db::beginTransaction();
$sourceLocale = locale();
$traitsourceFields = Translat::extractSourceFields($data, $this->translatFields);
$result = (new CategorieLogic())->edit($data);
(new TranslationService())->queueTranslations(
'ticket_categorie',
$data['id'],
$sourceLocale,
$traitsourceFields
);
Db::commit();
return $result;
} catch (\Throwable $e) {
Db::rollback();
throw $e;
}
}
}
+2 -3
View File
@@ -11,8 +11,8 @@ class ConversationService
{
public function list($params)
{
// $locale = locale();
$locale = 'zh';
$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();
@@ -30,7 +30,6 @@ class ConversationService
try {
return (new ConversationLogic())->add($data);
} catch (\Throwable $e) {
Db::rollback();
throw $e;
}
}
+1 -1
View File
@@ -65,7 +65,7 @@ class TicketService
throw new BusinessException('工单不存在');
}
if($data['status'] == $ticket->status){
throw new BusinessException('状态未修改');
throw new BusinessException(trans('status_not_modified'));
}
// if(!in_array($ticket->status, [Constants::TICKET_STATUS['PENDING'], Constants::TICKET_STATUS['CONFIRM']])