diff --git a/modules/service/src/main/java/com/bytedesk/service/workgroup_settings/WorkgroupSettingsEntity.java b/modules/service/src/main/java/com/bytedesk/service/workgroup_settings/WorkgroupSettingsEntity.java index 25331b682c..e857948520 100644 --- a/modules/service/src/main/java/com/bytedesk/service/workgroup_settings/WorkgroupSettingsEntity.java +++ b/modules/service/src/main/java/com/bytedesk/service/workgroup_settings/WorkgroupSettingsEntity.java @@ -12,6 +12,7 @@ import com.bytedesk.service.queue_settings.QueueSettingsEntity; import jakarta.persistence.FetchType; import jakarta.persistence.ManyToOne; +import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; import jakarta.persistence.Index; import jakarta.persistence.Table; @@ -72,43 +73,37 @@ public class WorkgroupSettingsEntity extends BaseSettingsEntity { /** * Message leave settings */ - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) - // @NotFound(action = NotFoundAction.IGNORE) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private MessageLeaveSettingsEntity messageLeaveSettings; /** * Draft Message leave settings */ - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) - // @NotFound(action = NotFoundAction.IGNORE) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private MessageLeaveSettingsEntity draftMessageLeaveSettings; /** * Robot routing settings */ - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) - // @NotFound(action = NotFoundAction.IGNORE) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private RobotRoutingSettingsEntity robotSettings; /** * Draft Robot routing settings * Note: Override columns and association to avoid conflicts with published embedded fields */ - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) - // @NotFound(action = NotFoundAction.IGNORE) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private RobotRoutingSettingsEntity draftRobotSettings; /** * Queue settings */ - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) - // @NotFound(action = NotFoundAction.IGNORE) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private QueueSettingsEntity queueSettings; /** * Draft Queue settings */ - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) - // @NotFound(action = NotFoundAction.IGNORE) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private QueueSettingsEntity draftQueueSettings; } diff --git a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/TicketSettingsEntity.java b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/TicketSettingsEntity.java index 5cc70dc9bc..61fbfd6ed6 100644 --- a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/TicketSettingsEntity.java +++ b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/TicketSettingsEntity.java @@ -21,6 +21,8 @@ import com.bytedesk.ticket.ticket_settings.sub.TicketCustomFieldSettingsEntity; import com.bytedesk.ticket.ticket_settings.sub.TicketNotificationSettingsEntity; import com.bytedesk.ticket.ticket_settings.sub.TicketPrioritySettingsEntity; import com.bytedesk.ticket.ticket_settings.sub.TicketStatusFlowSettingsEntity; + +import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -73,41 +75,41 @@ public class TicketSettingsEntity extends BaseEntity { private String workgroupUid; // ====== 发布版本 ====== - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private TicketBasicSettingsEntity basicSettings; - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private TicketStatusFlowSettingsEntity statusFlowSettings; - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private TicketPrioritySettingsEntity prioritySettings; - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private TicketAssignmentSettingsEntity assignmentSettings; - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private TicketNotificationSettingsEntity notificationSettings; - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private TicketCustomFieldSettingsEntity customFieldSettings; // ====== 草稿版本 ====== - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private TicketBasicSettingsEntity draftBasicSettings; - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private TicketStatusFlowSettingsEntity draftStatusFlowSettings; - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private TicketPrioritySettingsEntity draftPrioritySettings; - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private TicketAssignmentSettingsEntity draftAssignmentSettings; - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private TicketNotificationSettingsEntity draftNotificationSettings; - @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { jakarta.persistence.CascadeType.PERSIST, jakarta.persistence.CascadeType.MERGE, jakarta.persistence.CascadeType.REMOVE }) + @ManyToOne(fetch = FetchType.LAZY, optional = true, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }) private TicketCustomFieldSettingsEntity draftCustomFieldSettings; diff --git a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/TicketSettingsRepository.java b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/TicketSettingsRepository.java index 1771fc6370..6d3693d876 100644 --- a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/TicketSettingsRepository.java +++ b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/TicketSettingsRepository.java @@ -24,7 +24,7 @@ public interface TicketSettingsRepository extends JpaRepository findByNameAndOrgUidAndTypeAndDeletedFalse(String name, String orgUid, String type); + Optional findByNameAndOrgUidAndDeletedFalse(String name, String orgUid); Optional findByOrgUidAndWorkgroupUidAndDeletedFalse(String orgUid, String workgroupUid); diff --git a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/TicketSettingsRestService.java b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/TicketSettingsRestService.java index 6db76fd319..a7d5fc01ef 100644 --- a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/TicketSettingsRestService.java +++ b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/TicketSettingsRestService.java @@ -61,8 +61,8 @@ public class TicketSettingsRestService extends BaseRestServiceWithExport findByNameAndOrgUidAndType(String name, String orgUid, String type) { - return ticketSettingsRepository.findByNameAndOrgUidAndTypeAndDeletedFalse(name, orgUid, type); + public Optional findByNameAndOrgUid(String name, String orgUid) { + return ticketSettingsRepository.findByNameAndOrgUidAndDeletedFalse(name, orgUid); } public Boolean existsByUid(String uid) { @@ -77,8 +77,8 @@ public class TicketSettingsRestService extends BaseRestServiceWithExport ticketSettings = findByNameAndOrgUidAndType(request.getName(), request.getOrgUid(), request.getType()); + if (StringUtils.hasText(request.getName()) && StringUtils.hasText(request.getOrgUid())) { + Optional ticketSettings = findByNameAndOrgUid(request.getName(), request.getOrgUid()); if (ticketSettings.isPresent()) { return convertToResponse(ticketSettings.get()); } @@ -138,7 +138,7 @@ public class TicketSettingsRestService extends BaseRestServiceWithExport workingDays; // 1-7 private Integer maxConcurrentTickets; } diff --git a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketCustomFieldSettingsResponse.java b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketCustomFieldSettingsResponse.java index 31ad307beb..96f9fe66b3 100644 --- a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketCustomFieldSettingsResponse.java +++ b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketCustomFieldSettingsResponse.java @@ -1,5 +1,6 @@ package com.bytedesk.ticket.ticket_settings.sub.dto; +import com.bytedesk.ticket.ticket_settings.sub.model.CustomFieldSettingsData; import java.io.Serializable; import lombok.AllArgsConstructor; @@ -9,7 +10,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.Accessors; /** - * 自定义字段设置响应 DTO。 + * 自定义字段设置响应 DTO(结构化)。 */ @Data @Builder @@ -18,5 +19,5 @@ import lombok.experimental.Accessors; @NoArgsConstructor public class TicketCustomFieldSettingsResponse implements Serializable { private static final long serialVersionUID = 1L; - private String content; // JSON blob + private CustomFieldSettingsData content; } diff --git a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketNotificationSettingsResponse.java b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketNotificationSettingsResponse.java index 6262e00a97..ebdaeb6d9d 100644 --- a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketNotificationSettingsResponse.java +++ b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketNotificationSettingsResponse.java @@ -1,6 +1,8 @@ package com.bytedesk.ticket.ticket_settings.sub.dto; +import com.bytedesk.ticket.ticket_settings.sub.model.EmailTemplateDef; import java.io.Serializable; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; @@ -9,7 +11,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.Accessors; /** - * 通知设置响应 DTO。 + * 通知设置响应 DTO(结构化)。 */ @Data @Builder @@ -19,11 +21,11 @@ import lombok.experimental.Accessors; public class TicketNotificationSettingsResponse implements Serializable { private static final long serialVersionUID = 1L; private Boolean emailEnabled; - private String emailEvents; - private String emailTemplates; + private List emailEvents; + private List emailTemplates; private Boolean internalEnabled; - private String internalEvents; + private List internalEvents; private Boolean webhookEnabled; private String webhookUrl; - private String webhookEvents; + private List webhookEvents; } diff --git a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketPrioritySettingsResponse.java b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketPrioritySettingsResponse.java index 5fc07082d3..a45411114e 100644 --- a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketPrioritySettingsResponse.java +++ b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketPrioritySettingsResponse.java @@ -1,5 +1,6 @@ package com.bytedesk.ticket.ticket_settings.sub.dto; +import com.bytedesk.ticket.ticket_settings.sub.model.PrioritySettingsData; import java.io.Serializable; import lombok.AllArgsConstructor; @@ -9,7 +10,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.Accessors; /** - * 优先级设置响应 DTO。 + * 优先级设置响应 DTO(结构化)。 */ @Data @Builder @@ -18,5 +19,5 @@ import lombok.experimental.Accessors; @NoArgsConstructor public class TicketPrioritySettingsResponse implements Serializable { private static final long serialVersionUID = 1L; - private String content; // JSON blob + private PrioritySettingsData content; } diff --git a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketStatusFlowSettingsResponse.java b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketStatusFlowSettingsResponse.java index e2050136b4..210e9bc4ce 100644 --- a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketStatusFlowSettingsResponse.java +++ b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket_settings/sub/dto/TicketStatusFlowSettingsResponse.java @@ -1,5 +1,6 @@ package com.bytedesk.ticket.ticket_settings.sub.dto; +import com.bytedesk.ticket.ticket_settings.sub.model.StatusFlowSettingsData; import java.io.Serializable; import lombok.AllArgsConstructor; @@ -9,7 +10,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.Accessors; /** - * 状态流转设置响应 DTO。 + * 状态流转设置响应 DTO(结构化)。 */ @Data @Builder @@ -18,5 +19,5 @@ import lombok.experimental.Accessors; @NoArgsConstructor public class TicketStatusFlowSettingsResponse implements Serializable { private static final long serialVersionUID = 1L; - private String content; // JSON blob + private StatusFlowSettingsData content; }