wip
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user