fix: ticket update based on review meeting
This commit is contained in:
@@ -16,6 +16,15 @@ type CallbackTicketService struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
func contains(slice []string, item string) bool {
|
||||
for _, s := range slice {
|
||||
if s == item {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// 构造函数改为私有初始化方法
|
||||
func NewCallbackTicketService() *CallbackTicketService {
|
||||
return &CallbackTicketService{db: nil} // 先不初始化数据库连接
|
||||
@@ -154,6 +163,48 @@ func (s *CallbackTicketService) UpdateCallbackTicket(ticket CallbackTicket) erro
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *CallbackTicketService) UpdateCallbackTicketStatus(ticketId int64, status string, updatedBy string) error {
|
||||
if status == "" {
|
||||
return fmt.Errorf("status cannot be empty")
|
||||
}
|
||||
|
||||
// 检查状态是否合法
|
||||
validStatuses := []string{"IN_PROGRESS", "PENDING", "CLOSED"}
|
||||
if !contains(validStatuses, status) {
|
||||
return fmt.Errorf("invalid status: %s", status)
|
||||
}
|
||||
|
||||
// 获取工单当前状态
|
||||
var currentTicket CallbackTicket
|
||||
if err := s.getDB().Table("mf_callback_ticket").
|
||||
Where("ticket_id = ?", ticketId).
|
||||
First(¤tTicket).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
return fmt.Errorf("callback ticket with ID %d not found", ticketId)
|
||||
}
|
||||
return fmt.Errorf("failed to find callback ticket: %w", err)
|
||||
}
|
||||
|
||||
// 如果状态没有变化,则不更新
|
||||
if currentTicket.Status == status || currentTicket.Status == "CLOSED" {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 更新工单状态
|
||||
now := time.Now().UnixMicro()
|
||||
if err := s.getDB().Table("mf_callback_ticket").
|
||||
Where("ticket_id = ?", ticketId).
|
||||
Updates(map[string]interface{}{
|
||||
"status": status,
|
||||
"comment": fmt.Sprintf("工单状态从 %s 更新为 %s", currentTicket.Status, status),
|
||||
"updated_at": &now,
|
||||
"updated_by": updatedBy,
|
||||
}).Error; err != nil {
|
||||
return fmt.Errorf("failed to update callback ticket status: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteCallbackTicket 删除回调工单
|
||||
// @Description 删除回调工单
|
||||
// @param ticketId 工单ID
|
||||
@@ -369,7 +420,6 @@ func (s *CallbackTicketService) UpdateTicketToTimeout(ticket *CallbackTicket, or
|
||||
AgentEmail: newAgent.Email,
|
||||
AgentMobile: newAgent.Mobile,
|
||||
Comment: fmt.Sprintf("由超时工单 %d 自动重建", ticket.TicketId),
|
||||
MsdData: ticket.MsdData,
|
||||
RmUid: ticket.RmUid,
|
||||
CreatedAt: now,
|
||||
UpdatedAt: nil,
|
||||
@@ -458,7 +508,6 @@ func (s *CallbackTicketService) BatchUpdateTimeoutTickets(tickets []CallbackTick
|
||||
AgentEmail: newAgent.Email,
|
||||
AgentMobile: newAgent.Mobile,
|
||||
Comment: fmt.Sprintf("由超时工单 %d 自动重建", ticket.TicketId),
|
||||
MsdData: ticket.MsdData,
|
||||
RmUid: ticket.RmUid,
|
||||
CreatedAt: now + int64(i), // 确保每个工单的创建时间不同,
|
||||
UpdatedAt: nil,
|
||||
@@ -527,15 +576,34 @@ func (s *CallbackTicketService) FindNearlyTimeoutTickets(status string, timeoutM
|
||||
return tickets, nil
|
||||
}
|
||||
|
||||
// 新增方法:坐席开始处理工单
|
||||
func (s *CallbackTicketService) StartProcessingTicket(ticketId int64) error {
|
||||
// 新增方法:座席开始处理工单
|
||||
// StartProcessingTicket 将工单状态更新为正在处理,并记录开始处理的时间和座席信息
|
||||
// @Description 座席开始处理工单
|
||||
// @param ticketId 工单ID
|
||||
// @param updatedBy 更新人
|
||||
// @return error 错误信息
|
||||
// @example
|
||||
// mfCallbackTicketService.StartProcessingTicket(12345, "agent1")
|
||||
// @note 该方法会将工单状态从 NEW 更新为 IN_PROGRESS,并记录处理开始时间和座席信息
|
||||
// @note 如果工单状态不是 NEW,则返回错误
|
||||
// @note 该方法通常在座席开始处理工单时调用
|
||||
// @note 该方法会更新工单的 updated_at 和 updated_by 字段
|
||||
// @note 如果更新失败,则返回错误信息
|
||||
// @note 该方法会记录处理开始的时间戳,单位为微秒
|
||||
// @note 如果工单不存在或状态不正确,则返回错误信息
|
||||
// @note 该方法会在更新成功后返回 nil,表示操作成功
|
||||
// @note 该方法适用于座席开始处理工单的场景
|
||||
// @note 该方法会在更新成功后返回 nil,表示操作成功
|
||||
// @note 该方法会在更新失败时返回错误信息,便于调用方处理异常情况
|
||||
func (s *CallbackTicketService) StartProcessingTicket(ticketId int64, updatedBy string) error {
|
||||
now := time.Now().UnixMicro()
|
||||
if err := s.getDB().Table("mf_callback_ticket").
|
||||
Where("ticket_id = ? AND status = ?", ticketId, TicketStatusNew.Enum()).
|
||||
Updates(map[string]interface{}{
|
||||
"status": TicketStatusInProgress.Enum(),
|
||||
"comment": "座席开始处理工单",
|
||||
"updated_at": now,
|
||||
"comment": "坐席开始处理工单",
|
||||
"updated_by": updatedBy,
|
||||
}).Error; err != nil {
|
||||
return fmt.Errorf("failed to update ticket to IN_PROGRESS: %w", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user