auto commit: 2025-02-05 12:25:44

This commit is contained in:
jack ning
2025-02-05 12:25:45 +08:00
parent 6254b6b6de
commit baadb46c2d
6 changed files with 154 additions and 57 deletions

View File

@@ -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<TicketEntity> 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);
}
}

View File

@@ -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<String, Object> 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<TicketEntity> ticketOptional = ticketRestService.findByUid(ticket.getUid());
if (ticketOptional.isPresent()) {
TicketEntity ticketEntity = ticketOptional.get();
ticketEntity.setProcessInstanceId(processInstance.getId());
ticketRestService.save(ticketEntity);
}
}
@EventListener

View File

@@ -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<TicketEntity, TicketReque
return ticketPage.map(this::convertToResponse);
}
@Cacheable(value = "ticket", key = "#uid", unless = "#result == null")
@Override
public Optional<TicketEntity> findByUid(String uid) {
return ticketRepository.findByUid(uid);
}
@Transactional
@Override
public TicketResponse create(TicketRequest request) {
@@ -251,11 +259,7 @@ public class TicketRestService extends BaseRestService<TicketEntity, TicketReque
save(ticket);
}
@Override
public Optional<TicketEntity> findByUid(String uid) {
return ticketRepository.findByUid(uid);
}
@Override
public void handleOptimisticLockingFailureException(ObjectOptimisticLockingFailureException e,
TicketEntity entity) {

View File

@@ -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
# 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

View File

@@ -21,7 +21,7 @@
flowable:decisionRefBinding="latest"
flowable:resultVariable="priorityResult"></businessRuleTask> -->
<serviceTask id="evaluatePriority" name="Evaluate Priority"
flowable:class="com.bytedesk.ticket.delegate.TicketEvaluatePriorityDelegate"/>
flowable:delegateExpression="${ticketEvaluatePriorityDelegate}"/>
<sequenceFlow id="sequenceFlow-a275b096-0da9-42a2-b28a-df7147204665"
sourceRef="evaluatePriority" targetRef="assignToAgent"></sequenceFlow>
<userTask id="assignToAgent" name="Agent Handle" flowable:assignee="${agentUid}"

View File

@@ -21,7 +21,7 @@
flowable:decisionRefBinding="latest"
flowable:resultVariable="priorityResult"></businessRuleTask> -->
<serviceTask id="evaluatePriority" name="Evaluate Priority"
flowable:class="com.bytedesk.ticket.delegate.TicketEvaluatePriorityDelegate"/>
flowable:delegateExpression="${ticketEvaluatePriorityDelegate}"/>
<sequenceFlow id="sequenceFlow-d42ed887-6f67-4060-8889-8fabec33506b"
sourceRef="evaluatePriority" targetRef="assignToGroup"></sequenceFlow>
<userTask id="assignToGroup" name="Group Handle" flowable:candidateGroups="${workgroupUid}"