diff --git a/internal/controllers/dashboard/ticket_controller.go b/internal/controllers/dashboard/ticket_controller.go index 0d244ee..5b34945 100644 --- a/internal/controllers/dashboard/ticket_controller.go +++ b/internal/controllers/dashboard/ticket_controller.go @@ -183,21 +183,6 @@ func (c *TicketController) PostAssign() *web.JsonResult { return web.JsonSuccess() } -func (c *TicketController) PostBatch_assign() *web.JsonResult { - operator, err := services.AuthService.RequirePermission(c.Ctx, constants.PermissionTicketAssign) - if err != nil { - return web.JsonError(err) - } - req := request.BatchAssignTicketRequest{} - if err := params.ReadJSON(c.Ctx, &req); err != nil { - return web.JsonError(err) - } - if err := services.TicketService.BatchAssignTickets(req, operator); err != nil { - return web.JsonError(err) - } - return web.JsonSuccess() -} - func (c *TicketController) PostChange_status() *web.JsonResult { operator, err := services.AuthService.RequirePermission(c.Ctx, constants.PermissionTicketChangeStatus) if err != nil { diff --git a/internal/pkg/dto/request/ticket_request.go b/internal/pkg/dto/request/ticket_request.go index f622eeb..10c75ce 100644 --- a/internal/pkg/dto/request/ticket_request.go +++ b/internal/pkg/dto/request/ticket_request.go @@ -43,12 +43,6 @@ type CreateTicketProgressRequest struct { Content string `json:"content"` } -type BatchAssignTicketRequest struct { - TicketIDs []int64 `json:"ticketIds"` - ToUserID int64 `json:"toUserId"` - Reason string `json:"reason"` -} - type SaveTicketViewRequest struct { ID int64 `json:"id"` Name string `json:"name"` diff --git a/internal/services/ticket_service.go b/internal/services/ticket_service.go index 0572afa..325a722 100644 --- a/internal/services/ticket_service.go +++ b/internal/services/ticket_service.go @@ -330,39 +330,6 @@ func (s *ticketService) AssignTicket(req request.AssignTicketRequest, operator * return nil } -func (s *ticketService) BatchAssignTickets(req request.BatchAssignTicketRequest, operator *dto.AuthPrincipal) error { - if operator == nil { - return errorsx.Unauthorized("未登录或登录已过期") - } - ticketIDs := normalizeInt64IDs(req.TicketIDs) - if len(ticketIDs) == 0 { - return errorsx.InvalidParam("请选择工单") - } - assignedEvents := make([]events.TicketAssignedEvent, 0, len(ticketIDs)) - if err := sqls.WithTransaction(func(ctx *sqls.TxContext) error { - for _, ticketID := range ticketIDs { - event, err := s.assignTicketTx(ctx.Tx, request.AssignTicketRequest{ - TicketID: ticketID, - ToUserID: req.ToUserID, - Reason: req.Reason, - }, operator) - if err != nil { - return err - } - if event != nil { - assignedEvents = append(assignedEvents, *event) - } - } - return nil - }); err != nil { - return err - } - for i := range assignedEvents { - eventbus.PublishAsync(context.Background(), assignedEvents[i]) - } - return nil -} - func (s *ticketService) ChangeStatus(req request.ChangeTicketStatusRequest, operator *dto.AuthPrincipal) error { if operator == nil { return errorsx.Unauthorized("未登录或登录已过期") diff --git a/web/app/dashboard/tickets/_components/ticket-assign-dialog.tsx b/web/app/dashboard/tickets/_components/ticket-assign-dialog.tsx index b85b22c..7bf154e 100644 --- a/web/app/dashboard/tickets/_components/ticket-assign-dialog.tsx +++ b/web/app/dashboard/tickets/_components/ticket-assign-dialog.tsx @@ -21,7 +21,7 @@ import { fetchAgentProfilesAll, type AdminAgentProfile, } from "@/lib/api/admin" -import { assignTicket, batchAssignTickets } from "@/lib/api/ticket" +import { assignTicket } from "@/lib/api/ticket" const schema = z.object({ toUserId: z.string().trim().min(1, "请选择处理人"), @@ -44,7 +44,6 @@ const emptyForm: FormValues = { type TicketAssignDialogProps = { open: boolean ticketId: number | null - ticketIds?: number[] currentAssigneeId?: number onOpenChange: (open: boolean) => void onSuccess?: () => Promise | void @@ -53,7 +52,6 @@ type TicketAssignDialogProps = { export function TicketAssignDialog({ open, ticketId, - ticketIds, currentAssigneeId, onOpenChange, onSuccess, @@ -62,9 +60,8 @@ export function TicketAssignDialog({ {open ? ( item > 0) - if (!ticketId && validTicketIds.length === 0) { + if (!ticketId) { toast.error("请选择工单") return } setSaving(true) try { - if (validTicketIds.length > 0) { - await batchAssignTickets({ - ticketIds: validTicketIds, - toUserId: Number(values.toUserId), - reason: values.reason.trim() || undefined, - }) - if (!activeRef.current) { - return - } - toast.success(`已批量指派 ${validTicketIds.length} 张工单`) - } else { - await assignTicket({ - ticketId: ticketId!, - toUserId: Number(values.toUserId), - reason: values.reason.trim() || undefined, - }) - if (!activeRef.current) { - return - } - toast.success("处理人已更新") + await assignTicket({ + ticketId, + toUserId: Number(values.toUserId), + reason: values.reason.trim() || undefined, + }) + if (!activeRef.current) { + return } + toast.success("处理人已更新") if (!activeRef.current) { return } @@ -188,7 +171,7 @@ function TicketAssignDialogBody({ return ( - {ticketIds?.length ? `批量指派工单(${ticketIds.length})` : "指派工单"} + 指派工单
diff --git a/web/app/dashboard/tickets/_components/ticket-detail-dialog.tsx b/web/app/dashboard/tickets/_components/ticket-detail-dialog.tsx index 77657ea..a57113d 100644 --- a/web/app/dashboard/tickets/_components/ticket-detail-dialog.tsx +++ b/web/app/dashboard/tickets/_components/ticket-detail-dialog.tsx @@ -4,15 +4,9 @@ import { useCallback, useEffect, useRef, useState } from "react" import { MessageSquareTextIcon, RefreshCcwIcon, SendIcon, UserRoundIcon } from "lucide-react" import { toast } from "sonner" +import { ProjectDialog } from "@/components/project-dialog" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" -import { - Dialog, - DialogContent, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog" -import { ScrollArea } from "@/components/ui/scroll-area" import { Separator } from "@/components/ui/separator" import { Textarea } from "@/components/ui/textarea" import { @@ -247,156 +241,163 @@ export function TicketDetailDialog({ return ( <> - - - - - {ticket?.title ?? "工单详情"} - {ticket ? : null} - - {ticket ? ( -
- {ticket.ticketNo} - {sourceLabel(ticket.source)} - 创建人:{metadataValue(ticket.createdByName || ticket.createdBy)} -
- ) : null} -
+ + {ticket?.title ?? "工单详情"} + {ticket ? : null} +
+ } + description={ + ticket ? ( +
+ {ticket.ticketNo} + {sourceLabel(ticket.source)} + 创建人:{metadataValue(ticket.createdByName || ticket.createdBy)} +
+ ) : undefined + } + size="xl" + allowFullscreen + bodyScrollable={false} + contentClassName="sm:max-w-5xl" + bodyClassName="overflow-hidden" + > + {loading && !ticket ? ( +
+ + 加载中... +
+ ) : ticket ? ( +
+
+
+
描述
+
+ {ticket.description || "暂无描述"} +
+
- - {loading && !ticket ? ( -
- - 加载中... -
- ) : ticket ? ( -
-
-
描述
-
- {ticket.description || "暂无描述"} -
-
- -
-
-
状态
-
- {statusOptions.map((option) => ( - - ))} -
-
-
-
负责人
-
-
- - {ticket.currentAssigneeName || "未分配"} -
- -
+ ))}
-
- -
-
-
标签
-
+
+
负责人
+
+
+ + {ticket.currentAssigneeName || "未分配"} +
+
- {ticket.tags && ticket.tags.length > 0 ? ( -
- {ticket.tags.map((tag) => ( - - {tag.name} - - ))} -
- ) : ( -
暂无标签
- )} -
+
+ -
- - - - - - -
- - - -
-
- - 处理进展 -
-
-