This commit is contained in:
2026-08-08 15:06:12 +08:00
parent 98b60c333a
commit d4c08a8cdf
3 changed files with 108 additions and 66 deletions

View File

@@ -28,7 +28,11 @@ class Ticket extends BaseController
"sortOrder" => $this->request->param('sort_order', 'desc'),
];
$result = $ticketService->getTicketList($params);
$page = max(($params['page'] ?? 1), 1);
$limit = min(max(($params['limit'] ?? 20), 1), 100);
$order = strtolower($params['sortOrder'] ?? 'desc') === 'asc' ? 'asc' : 'desc';
$result = $ticketService->queryTickets($params, $page, $limit, $order);
return $this->success('查询成功', $result);
}

View File

@@ -7,51 +7,51 @@ use app\common\model\CompanyOperators;
use app\common\model\Companys;
use app\common\model\User;
use think\facade\Cache;
class TicketService
{
/**
* 获取工单列表业务逻辑
* @param array $params 外部传入的过滤参数
* @param array $params 过滤参数
* @param int $page 页码
* @param int $limit 每页数量
* @param string $order 排序方式
*/
public function getTicketList(array $params)
public function queryTickets(array $params, int $page, int $limit, string $order)
{
$page = max(intval($params['page'] ?? 1), 1);
$limit = min(max(intval($params['limit'] ?? 20), 1), 100);
$order = strtolower($params['sortOrder']) === 'asc' ? 'asc' : 'desc';
try {
// 查询构造器
$query = Tickets::with(['ticketStaff', 'ticketCompany', 'ticketOperator']);
// 查询构造器
$query = Tickets::with(['ticketStaff', 'ticketCompany', 'ticketOperator']);
$equalFilters = ['operator_id', 'user_id', 'status'];
foreach ($equalFilters as $field) {
if (!empty($params[$field])) {
$query->where($field, $params[$field]);
$equalFilters = ['operator_id', 'user_id', 'status'];
foreach ($equalFilters as $field) {
if (isset($params[$field]) && $params[$field] !== '') {
$query->where($field, $params[$field]);
}
}
if (!empty($params['searchKeyword'])) { // 模糊搜索(标题,备注)
$query->where(function ($q) use ($params) {
$q->where('website', 'like', '%' . $params['searchKeyword'] . '%')
->whereOr('remark', 'like', '%' . $params['searchKeyword'] . '%');
});
}
$list = $query->order('create_time', $order)
->hidden(['ticketStaff', 'ticketCompany', 'ticketOperator', 'company_id', 'operator_id', 'user_id'])
->append(['username', 'company_name', 'operator_name'])
->paginate(
$limit,
false,
[
'page' => $page,
'query' => $params
]
);
return $list;
} catch (\Exception $e) { //数据库连接失败,表不存在
throw new \Exception('查询工单列表失败: ' . $e->getMessage());
}
// 关键词(模糊搜索)
if (!empty($params['searchKeyword'])) {
$query->where(function ($q) use ($params) {
$q->where('website', 'like', '%' . $params['searchKeyword'] . '%')
->whereOr('remark', 'like', '%' . $params['searchKeyword'] . '%');
});
}
$list = $query->order('create_time', $order)
->hidden(['ticketStaff', 'ticketCompany', 'ticketOperator', 'company_id', 'operator_id', 'user_id'])
->append(['username', 'company_name', 'operator_name'])
->paginate(
$limit,
false,
[
'page' => $page,
'query' => $params
]
);
return $list;
}
@@ -59,45 +59,29 @@ class TicketService
* 新增工单
*
*/
public function createTicket($data)
public function createTicket(array $data)
{
if (empty($data['website'])) {
if (isset($data['website']) && $data['website'] === '') { // isset检查键存在且不为null
throw new \Exception('网站不能为空');
}
$website = trim($data['website']);
// 并发锁
$lockKey = 'create_ticket_lock_' . md5($website);
$unfinishedTicket = Tickets::where('website', $website) // 查找是否有未完成的同网站工单
->whereIn('status', [0, 1])
->find();
if (Cache::has($lockKey)) {
throw new \Exception('当前该网址正在被创建工单中,请稍后重试');
if ($unfinishedTicket) {
throw new \Exception('已存在未完成的同网站工单,无法创建');
}
Cache::set($lockKey, 1, 5); // 锁定5秒
// 当前无相同网站
$ticketResult = Tickets::create($data);
try {
// 查找是否有未完成的同网站工单
$unfinishedTicket = Tickets::where('website', $website)
->whereIn('status', [0, 1])
->find();
// 通知前端实时刷新(静默,广播服务不可用不影响主流程)
TicketNotifier::notify($ticketResult->id, 'create');
if ($unfinishedTicket) {
Cache::delete($lockKey);
throw new \Exception('已存在未完成的同网站工单,无法创建');
}
// 当前无相同网站
$ticketResult = Tickets::create($data);
// 通知前端实时刷新(静默,广播服务不可用不影响主流程)
TicketNotifier::notify($ticketResult->id, 'create');
return $ticketResult;
} catch (\Exception $e) {
Cache::delete($lockKey);
throw $e;
}
return $ticketResult;
}
@@ -109,7 +93,7 @@ class TicketService
* @param $role 当前登录用户角色
* @return array
*/
public function updateTicket($id, $data, $allowFields, $isRole, $isSuper = false)
public function updateTicket(int $id, array $data, array $allowFields, $isRole, $isSuper = false)
{
$ticket = Tickets::where('id', $id)->find();