+109
@@ -0,0 +1,109 @@
|
||||
package org.jeecg.modules.inquiry.domain;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 事件异常纯规则:摘要拼接、哪些六态还盯超时、换等待种类才重置计时。
|
||||
* <p>
|
||||
* 不写库、不发企微。工单六态不因事件异常改变。
|
||||
*/
|
||||
public final class EventExceptionRule {
|
||||
|
||||
private EventExceptionRule() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 多次异常拼在一起;同一类型不重复。
|
||||
*/
|
||||
public static String appendSummary(String existing, String type) {
|
||||
String add = StringUtils.trimToEmpty(type);
|
||||
if (add.isEmpty()) {
|
||||
return StringUtils.trimToEmpty(existing);
|
||||
}
|
||||
String cur = StringUtils.trimToEmpty(existing);
|
||||
if (cur.isEmpty() || "-".equals(cur)) {
|
||||
return add;
|
||||
}
|
||||
Set<String> parts = new LinkedHashSet<String>(Arrays.asList(cur.split(";")));
|
||||
if (parts.contains(add)) {
|
||||
return cur;
|
||||
}
|
||||
parts.add(add);
|
||||
StringBuilder out = new StringBuilder();
|
||||
for (String p : parts) {
|
||||
String one = StringUtils.trimToEmpty(p);
|
||||
if (one.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
if (out.length() > 0) {
|
||||
out.append(';');
|
||||
}
|
||||
out.append(one);
|
||||
}
|
||||
return out.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 已成交 / 已关闭 / 转人工不再盯;未成交仍可能在等原因。
|
||||
*/
|
||||
public static boolean isWatchable(String status) {
|
||||
if (StringUtils.isBlank(status)) {
|
||||
return false;
|
||||
}
|
||||
if (TicketStatuses.DEAL.equals(status)
|
||||
|| TicketStatuses.CLOSED.equals(status)
|
||||
|| TicketStatuses.HANDOFF.equals(status)) {
|
||||
return false;
|
||||
}
|
||||
return TicketStatuses.isKnown(status);
|
||||
}
|
||||
|
||||
/**
|
||||
* 等待种类变了才重置起点;同一种类重复 start 不改已过时间。
|
||||
*/
|
||||
public static boolean shouldResetClock(String currentKind, String newKind) {
|
||||
String cur = StringUtils.trimToEmpty(currentKind);
|
||||
String next = StringUtils.trimToEmpty(newKind);
|
||||
if (next.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
return !cur.equals(next);
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始等待后的三列新值。
|
||||
*/
|
||||
public static EventWaitState applyStart(String currentKind, Date started, Integer alerted,
|
||||
String newKind, Date now) {
|
||||
String next = StringUtils.trimToEmpty(newKind);
|
||||
if (next.isEmpty()) {
|
||||
return new EventWaitState(currentKind, started, alerted);
|
||||
}
|
||||
if (!shouldResetClock(currentKind, next)) {
|
||||
Date keep = started != null ? started : now;
|
||||
int flag = alerted == null ? 0 : alerted.intValue();
|
||||
return new EventWaitState(next, keep, flag);
|
||||
}
|
||||
return new EventWaitState(next, now, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 当前等待三列。
|
||||
*/
|
||||
public static final class EventWaitState {
|
||||
public final String kind;
|
||||
public final Date startedAt;
|
||||
public final int alerted;
|
||||
|
||||
public EventWaitState(String kind, Date startedAt, int alerted) {
|
||||
this.kind = kind;
|
||||
this.startedAt = startedAt;
|
||||
this.alerted = alerted;
|
||||
}
|
||||
}
|
||||
}
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
package org.jeecg.modules.inquiry.domain;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
/**
|
||||
* 事件异常纯规则:摘要拼接、可盯状态、换等待种类才重置计时。
|
||||
*/
|
||||
public class EventExceptionRuleTest {
|
||||
|
||||
@Test
|
||||
public void appendKeepsBothTypes() {
|
||||
assertEquals("航线响应超时", EventExceptionRule.appendSummary("", "航线响应超时"));
|
||||
assertEquals("航线响应超时;销售响应超时",
|
||||
EventExceptionRule.appendSummary("航线响应超时", "销售响应超时"));
|
||||
assertEquals("航线响应超时", EventExceptionRule.appendSummary("航线响应超时", "航线响应超时"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lostIsWatchableHandoffIsNot() {
|
||||
assertTrue(EventExceptionRule.isWatchable("未成交"));
|
||||
assertTrue(EventExceptionRule.isWatchable(TicketStatuses.INQUIRING));
|
||||
assertFalse(EventExceptionRule.isWatchable("已成交"));
|
||||
assertFalse(EventExceptionRule.isWatchable("已关闭"));
|
||||
assertFalse(EventExceptionRule.isWatchable("转人工"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sameKindDoesNotResetClock() {
|
||||
assertFalse(EventExceptionRule.shouldResetClock("air_quote", "air_quote"));
|
||||
assertTrue(EventExceptionRule.shouldResetClock("air_quote", "adopt"));
|
||||
assertTrue(EventExceptionRule.shouldResetClock("", "product_quote"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void applyStartKeepsClockOnSameKind() {
|
||||
java.util.Date first = new java.util.Date(1_000L);
|
||||
java.util.Date now = new java.util.Date(2_000L);
|
||||
EventExceptionRule.EventWaitState keep = EventExceptionRule.applyStart(
|
||||
"air_quote", first, 1, "air_quote", now);
|
||||
assertEquals("air_quote", keep.kind);
|
||||
assertEquals(first, keep.startedAt);
|
||||
assertEquals(1, keep.alerted);
|
||||
EventExceptionRule.EventWaitState reset = EventExceptionRule.applyStart(
|
||||
"air_quote", first, 1, "adopt", now);
|
||||
assertEquals("adopt", reset.kind);
|
||||
assertEquals(now, reset.startedAt);
|
||||
assertEquals(0, reset.alerted);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user