187 lines
4.9 KiB
PHP
187 lines
4.9 KiB
PHP
<?php
|
||
|
||
namespace app\common\service;
|
||
|
||
use app\common\model\Tickets;
|
||
use app\common\model\CompanyOperators;
|
||
use app\common\model\User;
|
||
|
||
use think\facade\Cache;
|
||
|
||
class TicketService
|
||
{
|
||
/**
|
||
* 获取工单列表业务逻辑
|
||
* @param array $params 外部传入的过滤参数
|
||
*/
|
||
|
||
public function getTicketList(array $params)
|
||
{
|
||
|
||
$query = Tickets::with(['ticketStaff', 'ticketCompany', 'ticketOperator']); // 查询构造器
|
||
|
||
// 状态筛选
|
||
if ($params['status'] !== null) {
|
||
$query->where('status', $params['status']);
|
||
}
|
||
|
||
// 运营人员筛选
|
||
if (!empty($params['operator_name'])) {
|
||
$query->where('operator_name', $params['operator_name']);
|
||
}
|
||
|
||
// 负责人筛选
|
||
if (!empty($params['username'])) {
|
||
$query->where('username', $params['username']);
|
||
}
|
||
|
||
// 关键词搜索
|
||
if (!empty($params['searchKeyword'])) {
|
||
$query->where(function ($q) use ($params) {
|
||
$q->where('website', 'like', '%' . $params['searchKeyword'] . '%')
|
||
->whereOr('operator_name', 'like', '%' . $params['searchKeyword'] . '%');
|
||
});
|
||
}
|
||
|
||
$order = strtolower($params['sortOrder']) === 'asc' ? 'asc' : 'desc';
|
||
|
||
|
||
// order -- 排序 , paginate -- 分页(查询当前页的数据,还会自动计算总记录数)
|
||
$list = $query->order('create_time', $order)->paginate(
|
||
$params['limit'],
|
||
false,
|
||
[
|
||
'page' => $params['page'],
|
||
'query' => $params // 保持分页链接的查询参数
|
||
]
|
||
);
|
||
|
||
$list->each(function ($item) {
|
||
$item->hidden(['ticketStaff', 'ticketCompany', 'ticketOperator', 'company_id', 'operator_id', 'user_id']);
|
||
$item->append(['username', 'company_name', 'operator_name']);
|
||
|
||
return $item;
|
||
});
|
||
|
||
return $list;
|
||
}
|
||
|
||
|
||
/**
|
||
* 新增工单
|
||
*
|
||
*/
|
||
public function createTicket($data)
|
||
{
|
||
if (empty($data['website'])) {
|
||
throw new \Exception('网站不能为空');
|
||
}
|
||
|
||
$website = trim($data['website']);
|
||
|
||
// 并发锁
|
||
$lockKey = 'create_ticket_lock_' . md5($website);
|
||
|
||
if (Cache::has($lockKey)) {
|
||
throw new \Exception('当前该网址正在被创建工单中,请稍后重试');
|
||
}
|
||
|
||
Cache::set($lockKey, 1, 5); // 锁定5秒
|
||
|
||
try {
|
||
// 查找是否有未完成的同网站工单
|
||
$unfinishedTicket = Tickets::where('website', $website)
|
||
->whereIn('status', [0, 1])
|
||
->find();
|
||
|
||
if ($unfinishedTicket) {
|
||
Cache::delete($lockKey);
|
||
throw new \Exception('已存在未完成的同网站工单,无法创建');
|
||
}
|
||
|
||
// 当前无相同网站
|
||
$ticketResult = Tickets::create($data);
|
||
return $ticketResult;
|
||
} catch (\Exception $e) {
|
||
Cache::delete($lockKey);
|
||
throw $e;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* 更新工单
|
||
* @param $id 工单id
|
||
* @param $data 外部传入的更新数据
|
||
* @param $uid 当前登录用户id
|
||
* @param $role 当前登录用户角色
|
||
* @return array
|
||
*/
|
||
public function updateTicket($id, $data, $allowFields, $uid, $isSuper = false)
|
||
{
|
||
$ticket = Tickets::where('id', $id)->find();
|
||
|
||
if (!$ticket) {
|
||
throw new \Exception('工单不存在');
|
||
}
|
||
|
||
// 当不是管理员,进入判断
|
||
if (!$isSuper) {
|
||
if (!is_null($ticket->user_id) && $ticket->user_id != $uid) {
|
||
throw new \Exception('没有权限修改该工单');
|
||
}
|
||
}
|
||
|
||
|
||
// 提取 $allowFields 允许修改的字段
|
||
$updateData = [];
|
||
foreach ($allowFields as $field) {
|
||
if (array_key_exists($field, $data)) {
|
||
$updateData[$field] = $data[$field];
|
||
}
|
||
}
|
||
|
||
// 如果没有有效数据需要更新
|
||
if (empty($updateData)) {
|
||
throw new \Exception('没有合法的更新字段');
|
||
}
|
||
|
||
|
||
return $ticket->save($updateData);
|
||
}
|
||
|
||
/**
|
||
* 获取所有运营人员名称 (下拉筛选用)-仅限后台使用
|
||
*
|
||
*/
|
||
public function getAllOperators()
|
||
{
|
||
$operators = CompanyOperators::with('company')->select();
|
||
|
||
$operators->each(function ($item) {
|
||
$item->hidden(['company_id', 'company', 'create_time', 'status']);
|
||
|
||
$item->append(['company_name']);
|
||
return $item;
|
||
});
|
||
|
||
return $operators;
|
||
}
|
||
|
||
|
||
/**
|
||
* 获取员工列表(下拉筛选用)
|
||
*/
|
||
public function getStaffList()
|
||
{
|
||
$map = [
|
||
'role' => 'user',
|
||
'status' => 1
|
||
];
|
||
|
||
$staffs = User::where($map)->field('id, username', 'real_name')->select();
|
||
return $staffs;
|
||
}
|
||
}
|