fix(msg): 消息 jump_app 换源 apply 调用方 app_code 快照,替代 bizType 冒充
build / build-push (push) Successful in 49s
build / build-push (push) Successful in 49s
P1/P2 联合修复(消息归属 + jump_app 值域污染): - FlwInstance 新增 apply_app_key/apply_app_code 双列快照(自动 DDL) - apply 从验签上下文(yh.app.auth)取调用方身份,by-key 一次换得 app_code (域间边界只在 apply 转换一次;查无/不可达降级 null,不阻断 apply) - UserMsgNotifier 两处 jumpApp 改源 applyAppCode——bizType 是消息分类 不是路由键;降级空时接收方按发送方回落(现状行为) - FlowDefAdminService.save appKey 必填化(2026-10-12 拍板):新建必须 显式传;升版本/直改可继承源行,源行为空必须补填(存量 19 条 NULL 随编辑收敛) - 单测:SaveTest 新增必填拦截 3 用例、BizUrlTest 换源断言+降级用例(19 绿) - E2E(8085+UserBase):100617->apply_app_code=notice 正向落库、 100018(app_code NULL)->降级成功、错签名 401,三断言全过
This commit is contained in:
@@ -79,6 +79,7 @@ public class OapiFlowService {
|
||||
private final FlowEngine flowEngine;
|
||||
private final ObjectMapper objectMapper;
|
||||
private final OpenApiUserClient userClient;
|
||||
private final com.yunhai.platform.openapi.base.OpenApiAppClient appClient;
|
||||
private final DiagramTokenService tokenService;
|
||||
|
||||
/** 本应用身份(回调探活补应用签名头;未装配时裸发,接收方 /oapi/* 会 401) */
|
||||
@@ -101,9 +102,10 @@ public class OapiFlowService {
|
||||
.map(this::toSummary).orElse(null);
|
||||
}
|
||||
|
||||
/** 代发起(biz uk 幂等 + R4 重启重提,见 FlowInstanceService) */
|
||||
/** 代发起(biz uk 幂等 + R4 重启重提,见 FlowInstanceService):appKey=验签上下文调用方身份,
|
||||
* 与 app_code 一起快照进办件(消息 jump_app 的权威来源,2026-10-12 起替代 bizType 冒充) */
|
||||
@Transactional
|
||||
public OapiModels.ApplyResultVo apply(Long schId, OapiModels.ApplyBody body) {
|
||||
public OapiModels.ApplyResultVo apply(Long schId, String appKey, OapiModels.ApplyBody body) {
|
||||
if (schId == null || body.getFlowGuid() == null || body.getBizType() == null
|
||||
|| body.getBizId() == null || body.getSubmitterId() == null) {
|
||||
throw new BizException(ErrorCode.PARAM_ERROR,
|
||||
@@ -114,12 +116,14 @@ public class OapiFlowService {
|
||||
schId, body.getFlowGuid(), FlwEnums.DefStatus.PUBLISHED.getCode())
|
||||
.orElseThrow(() -> new BizException(ErrorCode.PARAM_ERROR,
|
||||
"流程不存在或未发布:" + body.getFlowGuid()));
|
||||
String cleanAppKey = appKey == null || appKey.trim().isEmpty() ? null : appKey.trim();
|
||||
FlowInstanceService.ApplyCommand cmd = new FlowInstanceService.ApplyCommand(
|
||||
schId, def,
|
||||
body.getBizType(), body.getBizId(), body.getBizTitle(),
|
||||
body.getBizUrl(), asSnapshotString(body.getBizSnapshot()),
|
||||
body.getSubmitterId(), body.getSubmitterName(),
|
||||
asFormDataString(body.getFormData()));
|
||||
asFormDataString(body.getFormData()),
|
||||
cleanAppKey, resolveApplyAppCode(cleanAppKey));
|
||||
FlowInstanceService.ApplyOutcome outcome = instanceService.apply(cmd);
|
||||
OapiModels.ApplyResultVo vo = new OapiModels.ApplyResultVo();
|
||||
vo.setInstanceId(outcome.getInstanceId());
|
||||
@@ -127,6 +131,30 @@ public class OapiFlowService {
|
||||
return vo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 调用方 app_key → app_code 一次转换(域间边界:验签域→路由域,只在 apply 做这一次)。
|
||||
* 查无/不可达降级 null——消息 jumpApp 空、归属回落发送方(现状行为),不阻断 apply;
|
||||
* jump_app 值域契约(=app_code)由本方法单点保证,替代历史上用 bizType 冒充的写法。
|
||||
*/
|
||||
private String resolveApplyAppCode(String appKey) {
|
||||
if (appKey == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
com.fasterxml.jackson.databind.JsonNode app = appClient.getAppByKey(appKey);
|
||||
String code = app == null ? null : app.path("appCode").asText(null);
|
||||
if (code == null || code.trim().isEmpty()) {
|
||||
log.warn("[flow-center] apply 调用方 app_code 解析为空(by-key 查无):appKey={},消息归属将回落发送方", appKey);
|
||||
return null;
|
||||
}
|
||||
return code.trim();
|
||||
} catch (Exception e) {
|
||||
log.warn("[flow-center] apply 调用方 app_code 解析失败(UserBase 不可达?):appKey={}:{}",
|
||||
appKey, e.toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/** 按业务键查办件(对账兜底;不存在返回 null——对账方按"漂移待清理"处理) */
|
||||
public OapiModels.InstanceVo instanceByBiz(Long schId, String bizType, String bizId) {
|
||||
FlwInstance instance = instanceRepository.findBySchIdAndBizTypeAndBizId(schId, bizType, bizId)
|
||||
|
||||
Reference in New Issue
Block a user