From baadb46c2dff0b0ec8a39b83f429b3a2ce29be47 Mon Sep 17 00:00:00 2001 From: jack ning Date: Wed, 5 Feb 2025 12:25:45 +0800 Subject: [PATCH] auto commit: 2025-02-05 12:25:44 --- .../TicketEvaluatePriorityDelegate.java | 89 +++++++++++++++++-- .../ticket/listener/TicketEventListener.java | 18 ++-- .../ticket/ticket/TicketRestService.java | 14 +-- .../ticket/src/main/resources/application.yml | 86 ++++++++++-------- .../processes/agent-ticket-process.bpmn20.xml | 2 +- .../processes/group-ticket-process.bpmn20.xml | 2 +- 6 files changed, 154 insertions(+), 57 deletions(-) diff --git a/modules/ticket/src/main/java/com/bytedesk/ticket/delegate/TicketEvaluatePriorityDelegate.java b/modules/ticket/src/main/java/com/bytedesk/ticket/delegate/TicketEvaluatePriorityDelegate.java index e47c75c1e5..0cbea29665 100644 --- a/modules/ticket/src/main/java/com/bytedesk/ticket/delegate/TicketEvaluatePriorityDelegate.java +++ b/modules/ticket/src/main/java/com/bytedesk/ticket/delegate/TicketEvaluatePriorityDelegate.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-01-28 13:33:20 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-01-28 13:36:32 + * @LastEditTime: 2025-02-05 12:19:25 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -13,19 +13,98 @@ */ package com.bytedesk.ticket.delegate; +import java.util.Optional; + import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.JavaDelegate; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.bytedesk.ticket.ticket.TicketEntity; +import com.bytedesk.ticket.ticket.TicketRestService; + import lombok.extern.slf4j.Slf4j; @Slf4j -@Component +@Component("ticketEvaluatePriorityDelegate") public class TicketEvaluatePriorityDelegate implements JavaDelegate { - + + @Autowired + private TicketRestService ticketRestService; + + public TicketEvaluatePriorityDelegate() { + // 默认构造函数 + } + @Override public void execute(DelegateExecution execution) { - log.info("Evaluating ticket priority for process: {}", execution.getProcessInstanceId()); - // TODO: 实现优先级评估逻辑 + log.info("Evaluating ticket priority"); + + // 获取工单相关变量 + String ticketUid = (String) execution.getVariable("ticketUid"); + + Optional ticketOptional = ticketRestService.findByUid(ticketUid); + if (!ticketOptional.isPresent()) { + log.error("Ticket not found: {}", ticketUid); + return; + } + TicketEntity ticket = ticketOptional.get(); + + // String customerLevel = (String) execution.getVariable("customerLevel"); + // String issueType = (String) execution.getVariable("issueType"); + // String impactLevel = (String) execution.getVariable("impactLevel"); + + // 根据规则评估优先级 + String priority = ticket.getPriority(); + // String slaTime = ticket.getSlaTime(); + + // if ("VIP".equals(customerLevel) && "SYSTEM_ERROR".equals(issueType) && "HIGH".equals(impactLevel)) { + // priority = TicketPriorityEnum.URGENT.name(); + // slaTime = "PT1H"; + // } else if ("VIP".equals(customerLevel) && "COMPLAINT".equals(issueType)) { + // priority = TicketPriorityEnum.HIGH.name(); + // slaTime = "PT2H"; + // } else if ("REGULAR".equals(customerLevel) && "SYSTEM_ERROR".equals(issueType) && "HIGH".equals(impactLevel)) { + // priority = TicketPriorityEnum.HIGH.name(); + // slaTime = "PT4H"; + // } else if ("FUNCTION".equals(issueType)) { + // priority = TicketPriorityEnum.MEDIUM.name(); + // slaTime = "PT8H"; + // } else { + // priority = TicketPriorityEnum.LOW.name(); + // slaTime = "P1D"; + // } + + // 根据优先级设置SLA时间 + // 根据不同优先级设置不同的SLA时间 + String slaTime = "P1D"; + switch (ticket.getPriority()) { + case "CRITICAL": + slaTime = "PT30M"; // 30分钟 + break; + case "URGENT": + slaTime = "PT1H"; // 1小时 + break; + case "HIGH": + slaTime = "PT2H"; // 2小时 + break; + case "MEDIUM": + slaTime = "PT4H"; // 4小时 + break; + case "LOW": + slaTime = "PT8H"; // 8小时 + break; + case "LOWEST": + slaTime = "P1D"; // 1天 + break; + default: + slaTime = "P1D"; // 1天 + } + + // 设置流程变量 + execution.setVariable("priority", priority); + execution.setVariable("slaTime", slaTime); + + log.info("Priority evaluation completed: priority={}, slaTime={}", priority, slaTime); } } \ No newline at end of file diff --git a/modules/ticket/src/main/java/com/bytedesk/ticket/listener/TicketEventListener.java b/modules/ticket/src/main/java/com/bytedesk/ticket/listener/TicketEventListener.java index 0629889266..effa95a40d 100644 --- a/modules/ticket/src/main/java/com/bytedesk/ticket/listener/TicketEventListener.java +++ b/modules/ticket/src/main/java/com/bytedesk/ticket/listener/TicketEventListener.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-01-23 14:52:45 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-02-05 11:15:26 + * @LastEditTime: 2025-02-05 12:13:48 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -15,6 +15,7 @@ package com.bytedesk.ticket.listener; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import org.flowable.engine.RuntimeService; import org.flowable.engine.runtime.ProcessInstance; @@ -25,7 +26,7 @@ import com.bytedesk.ticket.consts.TicketConsts; import com.bytedesk.ticket.event.TicketCreateEvent; import com.bytedesk.ticket.event.TicketUpdateEvent; import com.bytedesk.ticket.ticket.TicketEntity; -import com.bytedesk.ticket.ticket.TicketRepository; +import com.bytedesk.ticket.ticket.TicketRestService; import com.bytedesk.ticket.ticket.TicketTypeEnum; import lombok.RequiredArgsConstructor; @@ -38,7 +39,7 @@ public class TicketEventListener { private final RuntimeService runtimeService; - private final TicketRepository ticketRepository; + private final TicketRestService ticketRestService; @EventListener public void handleTicketCreateEvent(TicketCreateEvent event) { @@ -47,7 +48,8 @@ public class TicketEventListener { // 启动工单流程 Map variables = new HashMap<>(); - // variables.put("orgUid", ticket.getOrgUid()); + variables.put("ticketUid", ticket.getUid()); + variables.put("orgUid", ticket.getOrgUid()); variables.put("userUid", ticket.getReporter().getUid()); String processKey = null; if (ticket.getType().equals(TicketTypeEnum.AGENT.name())) { @@ -90,8 +92,12 @@ public class TicketEventListener { log.info("TicketEventListener processInstance: {}", processInstance.getId()); // 设置工单的流程实例ID - ticket.setProcessInstanceId(processInstance.getId()); - ticketRepository.save(ticket); + Optional ticketOptional = ticketRestService.findByUid(ticket.getUid()); + if (ticketOptional.isPresent()) { + TicketEntity ticketEntity = ticketOptional.get(); + ticketEntity.setProcessInstanceId(processInstance.getId()); + ticketRestService.save(ticketEntity); + } } @EventListener diff --git a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket/TicketRestService.java b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket/TicketRestService.java index c8f4fca82a..a8ac5eff99 100644 --- a/modules/ticket/src/main/java/com/bytedesk/ticket/ticket/TicketRestService.java +++ b/modules/ticket/src/main/java/com/bytedesk/ticket/ticket/TicketRestService.java @@ -2,6 +2,7 @@ package com.bytedesk.ticket.ticket; import org.flowable.engine.TaskService; import org.modelmapper.ModelMapper; +import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -81,6 +82,13 @@ public class TicketRestService extends BaseRestService findByUid(String uid) { + return ticketRepository.findByUid(uid); + } + + @Transactional @Override public TicketResponse create(TicketRequest request) { @@ -251,11 +259,7 @@ public class TicketRestService extends BaseRestService findByUid(String uid) { - return ticketRepository.findByUid(uid); - } - + @Override public void handleOptimisticLockingFailureException(ObjectOptimisticLockingFailureException e, TicketEntity entity) { diff --git a/modules/ticket/src/main/resources/application.yml b/modules/ticket/src/main/resources/application.yml index 9113f9b6d0..079ddb2fa8 100644 --- a/modules/ticket/src/main/resources/application.yml +++ b/modules/ticket/src/main/resources/application.yml @@ -1,40 +1,48 @@ -spring: - mail: - host: smtp.example.com - port: 587 - username: noreply@bytedesk.com - password: your-password - properties: - mail: - smtp: - auth: true - starttls: - enable: true +# spring: +# mail: +# host: smtp.example.com +# port: 587 +# username: noreply@bytedesk.com +# password: your-password +# properties: +# mail: +# smtp: +# auth: true +# starttls: +# enable: true -flowable: - idm: - ldap: - enabled: true - server: ldap://ldap.bytedesk.com:389 - base-dn: dc=bytedesk,dc=com - user-base-dn: ou=users - group-base-dn: ou=groups - user-search-filter: (uid={0}) - group-search-filter: (member={0}) - user-id-attribute: uid - user-first-name-attribute: givenName - user-last-name-attribute: sn - user-email-attribute: mail - group-id-attribute: cn - group-name-attribute: cn - authentication: simple - security-principal: cn=admin,dc=bytedesk,dc=com - security-credentials: admin_password - dmn: - enabled: true - deploy-resources: true - resource-location: classpath*:/dmn/*.dmn - history-enabled: true - process: - definition-cache-limit: 1 - async-executor-activate: true \ No newline at end of file +# flowable: +# idm: +# ldap: +# enabled: true +# server: ldap://ldap.bytedesk.com:389 +# base-dn: dc=bytedesk,dc=com +# user-base-dn: ou=users +# group-base-dn: ou=groups +# user-search-filter: (uid={0}) +# group-search-filter: (member={0}) +# user-id-attribute: uid +# user-first-name-attribute: givenName +# user-last-name-attribute: sn +# user-email-attribute: mail +# group-id-attribute: cn +# group-name-attribute: cn +# authentication: simple +# security-principal: cn=admin,dc=bytedesk,dc=com +# security-credentials: admin_password +# dmn: +# enabled: true +# deploy-resources: true +# resource-location: classpath*:/dmn/ +# resource-suffixes: **.dmn +# process: +# definition-location-prefix: classpath*:/processes/ +# definition-location-suffixes: **.bpmn20.xml +# database-schema-update: true +# async-executor-activate: true +# common: +# app: +# idm-url: http://localhost:8080/flowable-idm +# idm-admin: +# user: admin +# password: test \ No newline at end of file diff --git a/modules/ticket/src/main/resources/processes/agent-ticket-process.bpmn20.xml b/modules/ticket/src/main/resources/processes/agent-ticket-process.bpmn20.xml index 5941bc249b..803ac3a742 100644 --- a/modules/ticket/src/main/resources/processes/agent-ticket-process.bpmn20.xml +++ b/modules/ticket/src/main/resources/processes/agent-ticket-process.bpmn20.xml @@ -21,7 +21,7 @@ flowable:decisionRefBinding="latest" flowable:resultVariable="priorityResult"> --> + flowable:delegateExpression="${ticketEvaluatePriorityDelegate}"/> --> + flowable:delegateExpression="${ticketEvaluatePriorityDelegate}"/>