|
@@ -49,8 +49,23 @@ public class WeaverTodoMessageServer {
|
|
|
+ " procInstId=" + procInstId + " billId=" + billId
|
|
+ " procInstId=" + procInstId + " billId=" + billId
|
|
|
+ " targetIsremark=0");
|
|
+ " targetIsremark=0");
|
|
|
try {
|
|
try {
|
|
|
- support.delayForWf();
|
|
|
|
|
- assignId = support.getAssignIdByMsgId(ctx, msgId);
|
|
|
|
|
|
|
+ // 先拿 AssignmentId 再 sleep:sleep 期间若撤回,AssignRead 可能已没,后查会空(对齐 YH)
|
|
|
|
|
+ assignId = waitAssignIdByMsgId(ctx, msgId, tid);
|
|
|
|
|
+ if (StringUtils.isBlank(assignId)) {
|
|
|
|
|
+ logger.error("[WEAVER-TODO][" + tid + "] 业务=新增待办 放弃:AssignmentId 为空 msgId=" + msgId);
|
|
|
|
|
+ support.addCallLog(ctx, msgId, "", billId, WeaverCallOperTypeEnum.TODO_ADD,
|
|
|
|
|
+ support.buildReceiveTodoUrl(),
|
|
|
|
|
+ "", "assignId empty", 0, "traceId=" + tid + " assignId empty");
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (StringUtils.isBlank(procInstId)) {
|
|
|
|
|
+ logger.error("[WEAVER-TODO][" + tid + "] 业务=新增待办 放弃:procInstId 为空 msgId=" + msgId
|
|
|
|
|
+ + " assignId=" + assignId);
|
|
|
|
|
+ support.addCallLog(ctx, msgId, assignId, billId, WeaverCallOperTypeEnum.TODO_ADD,
|
|
|
|
|
+ support.buildReceiveTodoUrl(),
|
|
|
|
|
+ "", "procInstId empty", 0, "traceId=" + tid + " procInstId empty");
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
billId = support.resolveBillId(ctx, billId, assignId);
|
|
billId = support.resolveBillId(ctx, billId, assignId);
|
|
|
String workflowname = support.resolveWorkflowName(ctx, msgId, billId, assignId);
|
|
String workflowname = support.resolveWorkflowName(ctx, msgId, billId, assignId);
|
|
|
|
|
|
|
@@ -77,6 +92,12 @@ public class WeaverTodoMessageServer {
|
|
|
String pcurl = support.buildRelativePcUrl(ctx, billId, assignId);
|
|
String pcurl = support.buildRelativePcUrl(ctx, billId, assignId);
|
|
|
String appurl = support.buildRelativeAppUrl(ctx, billId, assignId);
|
|
String appurl = support.buildRelativeAppUrl(ctx, billId, assignId);
|
|
|
|
|
|
|
|
|
|
+ // 关键落本地关联,避免 sleep 期间撤回后本地也查不到
|
|
|
|
|
+ support.saveAssignRecord(ctx, msgId, assignId, billId, workflowname, procInstId, receiver);
|
|
|
|
|
+
|
|
|
|
|
+ // 再等一会,让「待办转已办」等并发先处理完再推,顺序与 YH 一致
|
|
|
|
|
+ support.delayForWf();
|
|
|
|
|
+
|
|
|
JSONObject payload = support.buildPayload(
|
|
JSONObject payload = support.buildPayload(
|
|
|
procInstId, title, workflowname, nodename, receiver, creator,
|
|
procInstId, title, workflowname, nodename, receiver, creator,
|
|
|
pcurl, appurl, WeaverIsRemarkEnum.TODO, WeaverViewTypeEnum.UNREAD,
|
|
pcurl, appurl, WeaverIsRemarkEnum.TODO, WeaverViewTypeEnum.UNREAD,
|
|
@@ -87,8 +108,8 @@ public class WeaverTodoMessageServer {
|
|
|
+ " pcurl=" + pcurl);
|
|
+ " pcurl=" + pcurl);
|
|
|
|
|
|
|
|
boolean ok = client.push(payload, tid);
|
|
boolean ok = client.push(payload, tid);
|
|
|
- support.saveAssignRecord(ctx, msgId, assignId, billId, workflowname, procInstId, receiver);
|
|
|
|
|
support.addCallLog(ctx, msgId, assignId, billId, WeaverCallOperTypeEnum.TODO_ADD,
|
|
support.addCallLog(ctx, msgId, assignId, billId, WeaverCallOperTypeEnum.TODO_ADD,
|
|
|
|
|
+ support.buildReceiveTodoUrl(),
|
|
|
payload.toJSONString(), String.valueOf(ok), ok ? 1 : 0,
|
|
payload.toJSONString(), String.valueOf(ok), ok ? 1 : 0,
|
|
|
"traceId=" + tid + " isremark=0 " + (ok ? "成功" : "失败"));
|
|
"traceId=" + tid + " isremark=0 " + (ok ? "成功" : "失败"));
|
|
|
logger.info("[WEAVER-TODO][" + tid + "] 业务=新增待办 END ok=" + ok
|
|
logger.info("[WEAVER-TODO][" + tid + "] 业务=新增待办 END ok=" + ok
|
|
@@ -98,6 +119,7 @@ public class WeaverTodoMessageServer {
|
|
|
logger.error("[WEAVER-TODO][" + tid + "] 业务=新增待办 异常 msgId=" + msgId
|
|
logger.error("[WEAVER-TODO][" + tid + "] 业务=新增待办 异常 msgId=" + msgId
|
|
|
+ " assignId=" + assignId, e);
|
|
+ " assignId=" + assignId, e);
|
|
|
support.addCallLog(ctx, msgId, assignId, billId, WeaverCallOperTypeEnum.TODO_ADD,
|
|
support.addCallLog(ctx, msgId, assignId, billId, WeaverCallOperTypeEnum.TODO_ADD,
|
|
|
|
|
+ support.buildReceiveTodoUrl(),
|
|
|
"", e.getMessage(), 0, "traceId=" + tid + " " + e.getMessage());
|
|
"", e.getMessage(), 0, "traceId=" + tid + " " + e.getMessage());
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
@@ -171,6 +193,7 @@ public class WeaverTodoMessageServer {
|
|
|
+ " ※原审批人应离开待办,不应进已办;新人靠 addMessage 推 isremark=0");
|
|
+ " ※原审批人应离开待办,不应进已办;新人靠 addMessage 推 isremark=0");
|
|
|
boolean ok = client.push(del, tid);
|
|
boolean ok = client.push(del, tid);
|
|
|
support.addCallLog(ctx, msgId, assignId, billId, WeaverCallOperTypeEnum.TODO_DELETE,
|
|
support.addCallLog(ctx, msgId, assignId, billId, WeaverCallOperTypeEnum.TODO_DELETE,
|
|
|
|
|
+ support.buildReceiveTodoUrl(),
|
|
|
del.toJSONString(), String.valueOf(ok), ok ? 1 : 0,
|
|
del.toJSONString(), String.valueOf(ok), ok ? 1 : 0,
|
|
|
"traceId=" + tid + " isremark=-1 withdraw state=" + assignState
|
|
"traceId=" + tid + " isremark=-1 withdraw state=" + assignState
|
|
|
+ " " + (ok ? "成功" : "失败"));
|
|
+ " " + (ok ? "成功" : "失败"));
|
|
@@ -190,6 +213,7 @@ public class WeaverTodoMessageServer {
|
|
|
|
|
|
|
|
boolean taskOk = client.push(done, tid);
|
|
boolean taskOk = client.push(done, tid);
|
|
|
support.addCallLog(ctx, msgId, assignId, billId, WeaverCallOperTypeEnum.TODO_DONE,
|
|
support.addCallLog(ctx, msgId, assignId, billId, WeaverCallOperTypeEnum.TODO_DONE,
|
|
|
|
|
+ support.buildReceiveTodoUrl(),
|
|
|
done.toJSONString(), String.valueOf(taskOk), taskOk ? 1 : 0,
|
|
done.toJSONString(), String.valueOf(taskOk), taskOk ? 1 : 0,
|
|
|
"traceId=" + tid + " isremark=2 " + (taskOk ? "成功" : "失败"));
|
|
"traceId=" + tid + " isremark=2 " + (taskOk ? "成功" : "失败"));
|
|
|
logger.info("[WEAVER-TODO][" + tid + "] 业务=已办 END ok=" + taskOk
|
|
logger.info("[WEAVER-TODO][" + tid + "] 业务=已办 END ok=" + taskOk
|
|
@@ -212,6 +236,7 @@ public class WeaverTodoMessageServer {
|
|
|
+ WeaverPushTrace.summarize(end));
|
|
+ WeaverPushTrace.summarize(end));
|
|
|
boolean endOk = client.push(end, tid);
|
|
boolean endOk = client.push(end, tid);
|
|
|
support.addCallLog(ctx, msgId, assignId, billId, WeaverCallOperTypeEnum.FLOW_END,
|
|
support.addCallLog(ctx, msgId, assignId, billId, WeaverCallOperTypeEnum.FLOW_END,
|
|
|
|
|
+ support.buildReceiveTodoUrl(),
|
|
|
end.toJSONString(), String.valueOf(endOk), endOk ? 1 : 0,
|
|
end.toJSONString(), String.valueOf(endOk), endOk ? 1 : 0,
|
|
|
"traceId=" + tid + " isremark=4 " + (endOk ? "成功" : "失败"));
|
|
"traceId=" + tid + " isremark=4 " + (endOk ? "成功" : "失败"));
|
|
|
logger.info("[WEAVER-TODO][" + tid + "] 业务=办结 END ok=" + endOk
|
|
logger.info("[WEAVER-TODO][" + tid + "] 业务=办结 END ok=" + endOk
|
|
@@ -222,6 +247,7 @@ public class WeaverTodoMessageServer {
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
logger.error("[WEAVER-TODO][" + tid + "] 业务=已办/办结 异常 assignId=" + assignId, e);
|
|
logger.error("[WEAVER-TODO][" + tid + "] 业务=已办/办结 异常 assignId=" + assignId, e);
|
|
|
support.addCallLog(ctx, msgId, assignId, "", WeaverCallOperTypeEnum.TODO_DONE,
|
|
support.addCallLog(ctx, msgId, assignId, "", WeaverCallOperTypeEnum.TODO_DONE,
|
|
|
|
|
+ support.buildReceiveTodoUrl(),
|
|
|
"", e.getMessage(), 0, "traceId=" + tid + " " + e.getMessage());
|
|
"", e.getMessage(), 0, "traceId=" + tid + " " + e.getMessage());
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
@@ -260,6 +286,7 @@ public class WeaverTodoMessageServer {
|
|
|
+ WeaverPushTrace.summarize(payload));
|
|
+ WeaverPushTrace.summarize(payload));
|
|
|
boolean ok = client.push(payload, tid);
|
|
boolean ok = client.push(payload, tid);
|
|
|
support.addCallLog(ctx, msgId, assignId, "", WeaverCallOperTypeEnum.TODO_DELETE,
|
|
support.addCallLog(ctx, msgId, assignId, "", WeaverCallOperTypeEnum.TODO_DELETE,
|
|
|
|
|
+ support.buildReceiveTodoUrl(),
|
|
|
payload.toJSONString(), String.valueOf(ok), ok ? 1 : 0,
|
|
payload.toJSONString(), String.valueOf(ok), ok ? 1 : 0,
|
|
|
"traceId=" + tid + " isremark=-1 " + (ok ? "成功" : "失败"));
|
|
"traceId=" + tid + " isremark=-1 " + (ok ? "成功" : "失败"));
|
|
|
logger.info("[WEAVER-TODO][" + tid + "] 业务=删除待办 END ok=" + ok);
|
|
logger.info("[WEAVER-TODO][" + tid + "] 业务=删除待办 END ok=" + ok);
|
|
@@ -267,6 +294,7 @@ public class WeaverTodoMessageServer {
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
logger.error("[WEAVER-TODO][" + tid + "] 业务=删除待办 异常 assignId=" + assignId, e);
|
|
logger.error("[WEAVER-TODO][" + tid + "] 业务=删除待办 异常 assignId=" + assignId, e);
|
|
|
support.addCallLog(ctx, msgId, assignId, "", WeaverCallOperTypeEnum.TODO_DELETE,
|
|
support.addCallLog(ctx, msgId, assignId, "", WeaverCallOperTypeEnum.TODO_DELETE,
|
|
|
|
|
+ support.buildReceiveTodoUrl(),
|
|
|
"", e.getMessage(), 0, "traceId=" + tid + " " + e.getMessage());
|
|
"", e.getMessage(), 0, "traceId=" + tid + " " + e.getMessage());
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
@@ -309,6 +337,41 @@ public class WeaverTodoMessageServer {
|
|
|
return WeaverRequestStatusEnum.ARCHIVED;
|
|
return WeaverRequestStatusEnum.ARCHIVED;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 短轮询拿 AssignmentId:平台刚写 AssignRead 时可能尚未可见;
|
|
|
|
|
+ * 绝不先长 sleep 再查,否则 sleep 中撤回后就查空了。
|
|
|
|
|
+ */
|
|
|
|
|
+ private String waitAssignIdByMsgId(Context ctx, String msgId, String tid) throws Exception {
|
|
|
|
|
+ long budgetMs = Math.max(500L, config.getWfDelayMs());
|
|
|
|
|
+ long stepMs = 500L;
|
|
|
|
|
+ long deadline = System.currentTimeMillis() + budgetMs;
|
|
|
|
|
+ String assignId = "";
|
|
|
|
|
+ int attempt = 0;
|
|
|
|
|
+ while (true) {
|
|
|
|
|
+ attempt++;
|
|
|
|
|
+ assignId = support.getAssignIdByMsgId(ctx, msgId);
|
|
|
|
|
+ if (StringUtils.isNotBlank(assignId)) {
|
|
|
|
|
+ if (attempt > 1) {
|
|
|
|
|
+ logger.info("[WEAVER-TODO][" + tid + "] 业务=新增待办 AssignmentId 第"
|
|
|
|
|
+ + attempt + "次查到 assignId=" + assignId);
|
|
|
|
|
+ }
|
|
|
|
|
+ return assignId;
|
|
|
|
|
+ }
|
|
|
|
|
+ long left = deadline - System.currentTimeMillis();
|
|
|
|
|
+ if (left <= 0) {
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ try {
|
|
|
|
|
+ Thread.sleep(Math.min(stepMs, left));
|
|
|
|
|
+ } catch (InterruptedException e) {
|
|
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return "";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private static String nvlTrace(String traceId) {
|
|
private static String nvlTrace(String traceId) {
|
|
|
return StringUtils.isBlank(traceId) ? "-" : traceId;
|
|
return StringUtils.isBlank(traceId) ? "-" : traceId;
|
|
|
}
|
|
}
|