diff --git a/src/main/java/com/yunhai/notice/model/flow/FlowModels.java b/src/main/java/com/yunhai/notice/model/flow/FlowModels.java index 75c4e2a..e45bc90 100644 --- a/src/main/java/com/yunhai/notice/model/flow/FlowModels.java +++ b/src/main/java/com/yunhai/notice/model/flow/FlowModels.java @@ -1,7 +1,12 @@ package com.yunhai.notice.model.flow; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.yunhai.platform.openapi.dto.FlowDto; +import com.yunhai.platform.openapi.flow.model.FlowSummary; +import com.yunhai.platform.openapi.flow.model.FlowApplyBody; +import com.yunhai.platform.openapi.flow.model.FlowApplyResult; +import com.yunhai.platform.openapi.flow.model.FlowInstance; +import com.yunhai.platform.openapi.flow.model.FlowCallbackRegBody; +import com.yunhai.platform.openapi.flow.model.FlowCallbackRegResult; import lombok.Data; import lombok.EqualsAndHashCode; @@ -21,39 +26,39 @@ public final class FlowModels { @Data @EqualsAndHashCode(callSuper = true) @JsonIgnoreProperties(ignoreUnknown = true) - public static class FlowSummaryVo extends FlowDto.FlowSummary { + public static class FlowSummaryVo extends FlowSummary { } /** 代发起请求体(POST /oapi/flow/apply) */ @Data @EqualsAndHashCode(callSuper = true) - public static class ApplyBody extends FlowDto.ApplyBody { + public static class ApplyBody extends FlowApplyBody { } /** 代发起响应(biz uk 幂等:重复 apply 返回既有办件 duplicated=true;30/40 态 R4 重启推进) */ @Data @EqualsAndHashCode(callSuper = true) @JsonIgnoreProperties(ignoreUnknown = true) - public static class ApplyResultVo extends FlowDto.ApplyResult { + public static class ApplyResultVo extends FlowApplyResult { } /** 按业务键查办件响应(GET /oapi/flow/instance;不存在为 null) */ @Data @EqualsAndHashCode(callSuper = true) @JsonIgnoreProperties(ignoreUnknown = true) - public static class InstanceVo extends FlowDto.Instance { + public static class InstanceVo extends FlowInstance { } /** 回调注册请求体(POST /oapi/flow/callback/reg) */ @Data @EqualsAndHashCode(callSuper = true) - public static class CallbackRegBody extends FlowDto.CallbackRegBody { + public static class CallbackRegBody extends FlowCallbackRegBody { } /** 回调注册响应(secret 注册时生成下发;重复注册会轮换 secret,绝不重复调用) */ @Data @EqualsAndHashCode(callSuper = true) @JsonIgnoreProperties(ignoreUnknown = true) - public static class CallbackRegResultVo extends FlowDto.CallbackRegResult { + public static class CallbackRegResultVo extends FlowCallbackRegResult { } } diff --git a/src/main/java/com/yunhai/notice/service/IClassService.java b/src/main/java/com/yunhai/notice/service/IClassService.java index b34b73b..8837a40 100644 --- a/src/main/java/com/yunhai/notice/service/IClassService.java +++ b/src/main/java/com/yunhai/notice/service/IClassService.java @@ -6,7 +6,7 @@ import java.util.List; /** * 班级管理(userclass)开放接口客户端。 - * 基址取配置 {@code yh.open.userclass},当前仅提供教师查询,后续班级/年级等接口按需追加。 + * 2026-09-16 起委托 SDK 类型化门面 {@code YschClassOpenApi}(服务目录 userclass),当前仅提供教师查询。 */ public interface IClassService { diff --git a/src/main/java/com/yunhai/notice/service/flow/FlowCenterClient.java b/src/main/java/com/yunhai/notice/service/flow/FlowCenterClient.java index b533b0a..fa05251 100644 --- a/src/main/java/com/yunhai/notice/service/flow/FlowCenterClient.java +++ b/src/main/java/com/yunhai/notice/service/flow/FlowCenterClient.java @@ -4,8 +4,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.yunhai.notice.model.flow.FlowModels; import com.yunhai.platform.appauth.AppSignInterceptor; import com.yunhai.platform.appauth.LocalAppIdentityProvider; -import com.yunhai.platform.openapi.TargetSpec; -import com.yunhai.platform.openapi.YschOpenCall; +import com.yunhai.platform.openapi.core.TargetSpec; +import com.yunhai.platform.openapi.core.YschOpenCall; import com.yunhai.platform.apistd.BizException; import com.yunhai.platform.utils.exception.ErrorCode; import lombok.extern.slf4j.Slf4j; @@ -47,14 +47,16 @@ public class FlowCenterClient implements FlowClient { if (call == null) { // 兜底自建(正常路径由 yh-openapi-starter 装配 YschOpenCall bean);identity 缺失时 // AppSignInterceptor 自动跳过签名(请求裸发,enforce 端会 401——配置问题尽早暴露) - call = new YschOpenCall(new com.yunhai.platform.openapi.YschCallProperties(), objectMapper, - (host, basePath) -> new AppSignInterceptor(identityProvider.getIfAvailable(), host, basePath)); + call = new YschOpenCall(new com.yunhai.platform.openapi.core.YschCallProperties(), objectMapper, + (host, basePath) -> java.util.Collections.singletonList( + (org.springframework.http.client.ClientHttpRequestInterceptor) + new AppSignInterceptor(identityProvider.getIfAvailable(), host, basePath))); } this.openCall = call; // 服务目录显式配置(targets/services)则走门面命名目标;否则回落 legacy base-url ad-hoc - this.directoryResolved = call.hasTarget(com.yunhai.platform.openapi.PlatformService.FLOWCENTER.key()); + this.directoryResolved = call.hasTarget(com.yunhai.platform.openapi.core.PlatformService.FLOWCENTER.key()); if (directoryResolved) { - com.yunhai.platform.openapi.client.YschFlowOpenApi.setCall(call); + com.yunhai.platform.openapi.flow.YschFlowOpenApi.setCall(call); } } @@ -62,7 +64,7 @@ public class FlowCenterClient implements FlowClient { public List listFlows(Integer schId) { requireEnabled(); if (directoryResolved) { - return com.yunhai.platform.openapi.client.YschFlowOpenApi.listFlows( + return com.yunhai.platform.openapi.flow.YschFlowOpenApi.listFlows( schId, FlowModels.FlowSummaryVo.class); } return openCall.getList(target(), "/oapi/flow/list", params("schId", schId), @@ -73,7 +75,7 @@ public class FlowCenterClient implements FlowClient { public FlowModels.ApplyResultVo apply(Integer schId, FlowModels.ApplyBody body) { requireEnabled(); if (directoryResolved) { - return com.yunhai.platform.openapi.client.YschFlowOpenApi.apply( + return com.yunhai.platform.openapi.flow.YschFlowOpenApi.apply( schId, body, FlowModels.ApplyResultVo.class); } return openCall.post(target(), "/oapi/flow/apply", params("schId", schId), body, @@ -84,7 +86,7 @@ public class FlowCenterClient implements FlowClient { public FlowModels.InstanceVo getInstanceByBiz(Integer schId, String bizType, String bizId) { requireEnabled(); if (directoryResolved) { - return com.yunhai.platform.openapi.client.YschFlowOpenApi.instance( + return com.yunhai.platform.openapi.flow.YschFlowOpenApi.instance( bizType, bizId, schId, FlowModels.InstanceVo.class); } Map query = new HashMap<>(); @@ -98,7 +100,7 @@ public class FlowCenterClient implements FlowClient { public FlowModels.CallbackRegResultVo registerCallback(Integer schId, FlowModels.CallbackRegBody body) { requireEnabled(); if (directoryResolved) { - return com.yunhai.platform.openapi.client.YschFlowOpenApi.registerCallback( + return com.yunhai.platform.openapi.flow.YschFlowOpenApi.registerCallback( schId, body, FlowModels.CallbackRegResultVo.class); } return openCall.post(target(), "/oapi/flow/callback/reg", params("schId", schId), body, diff --git a/src/main/java/com/yunhai/notice/service/impl/ClassService.java b/src/main/java/com/yunhai/notice/service/impl/ClassService.java index 6780e3c..a284495 100644 --- a/src/main/java/com/yunhai/notice/service/impl/ClassService.java +++ b/src/main/java/com/yunhai/notice/service/impl/ClassService.java @@ -2,63 +2,52 @@ package com.yunhai.notice.service.impl; import com.yunhai.notice.model.SchTeaList; import com.yunhai.notice.service.IClassService; -import com.yunhai.platform.apistd.BizException; -import com.yunhai.platform.utils.exception.ErrorCode; +import com.yunhai.platform.openapi.clazz.YschClassOpenApi; +import com.yunhai.platform.openapi.clazz.model.SchTea; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; +import java.util.ArrayList; import java.util.Collections; import java.util.List; /** - * 班级管理(userclass)开放接口实现。 - * userclass 为开放接口(无需应用签名),使用独立 RestTemplate 直连。 + * 班级管理(userclass)开放接口实现。
+ * 2026-09-16 SDK 重构起改为委托类型化门面 {@link YschClassOpenApi}(服务目录 key=userclass: + * services/枚举兜底统一解析,签名/信封/错误语义由 SDK 承载),替代原手搓 RestTemplate + + * legacy 键 {@code yh.open.userclass} 直连(无签名旁路)。Notice 侧模型 {@link SchTeaList} + * 保留(消费方签名零改动),此处仅做字段映射。 */ @Service public class ClassService implements IClassService { private static final Logger log = LoggerFactory.getLogger(ClassService.class); - /** 班级管理服务基址,如 http://base.yunhaixingtong.com/userclass */ - @Value("${yh.open.userclass:}") - private String userClassHost; - - private final RestTemplate restTemplate; - - public ClassService() { - SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); - factory.setConnectTimeout(5000); - factory.setReadTimeout(10000); - this.restTemplate = new RestTemplate(factory); - } - @Override public List getSchTeaList(int schId) { - if (!StringUtils.hasText(userClassHost)) { - throw new BizException(ErrorCode.INTERNAL_SERVER_ERROR, "班级管理接口未配置(yh.open.userclass)"); + List teachers = YschClassOpenApi.getSchTeaList(schId); + log.info("[getSchTeaList] schId={}, 获取教师 {} 人", schId, teachers == null ? 0 : teachers.size()); + if (teachers == null || teachers.isEmpty()) { + return Collections.emptyList(); } + List result = new ArrayList<>(teachers.size()); + for (SchTea tea : teachers) { + result.add(map(tea)); + } + return result; + } - String url = userClassHost + "/oapi/DbClass/GetSchteaList?Group=" + schId; - try { - ResponseEntity> resp = restTemplate.exchange( - url, HttpMethod.GET, null, - new ParameterizedTypeReference>() { - }); - List list = resp.getBody(); - log.info("[getSchTeaList] schId={}, 获取教师 {} 人", schId, list == null ? 0 : list.size()); - return list != null ? list : Collections.emptyList(); - } catch (RestClientException e) { - log.error("[getSchTeaList] 请求班级管理接口失败, schId={}, url={}", schId, url, e); - throw new BizException(ErrorCode.INTERNAL_SERVER_ERROR, "获取教师数据失败"); - } + private static SchTeaList map(SchTea tea) { + SchTeaList t = new SchTeaList(); + t.setSchSerID(tea.getSchSerId()); + t.setTeaTel(tea.getTeaTel()); + t.setTeaName(tea.getTeaName()); + t.setUserTeaSerID(tea.getUserTeaSerId()); + t.setTeaIDCard(tea.getTeaIdCard()); + t.setTeaNo(tea.getTeaNo()); + t.setGroupIds(tea.getGroupIds()); + t.setGroupId(tea.getGroupId()); + return t; } } diff --git a/src/main/java/com/yunhai/notice/service/impl/ContactsService.java b/src/main/java/com/yunhai/notice/service/impl/ContactsService.java index 06d342f..41d4ee1 100644 --- a/src/main/java/com/yunhai/notice/service/impl/ContactsService.java +++ b/src/main/java/com/yunhai/notice/service/impl/ContactsService.java @@ -8,7 +8,7 @@ import com.yunhai.notice.service.IContactsService; import com.yunhai.platform.auth.LoginUser; import com.yunhai.platform.auth.UserContextHolder; import com.yunhai.platform.apistd.BizException; -import com.yunhai.platform.openapi.client.YschBaseOpenApi; +import com.yunhai.platform.openapi.base.YschBaseOpenApi; import com.yunhai.platform.utils.exception.ErrorCode; import com.yunhai.platform.utils.model.BoaUser; import org.slf4j.Logger; diff --git a/src/main/java/com/yunhai/notice/service/impl/NoticeService.java b/src/main/java/com/yunhai/notice/service/impl/NoticeService.java index d793c2c..bafcf76 100644 --- a/src/main/java/com/yunhai/notice/service/impl/NoticeService.java +++ b/src/main/java/com/yunhai/notice/service/impl/NoticeService.java @@ -21,7 +21,7 @@ import com.yunhai.platform.auth.LoginUser; import com.yunhai.platform.auth.UserContextHolder; import com.yunhai.platform.auth.spring.CurrentBoaUser; import com.yunhai.platform.apistd.BizException; -import com.yunhai.platform.openapi.client.YschBaseOpenApi; +import com.yunhai.platform.openapi.base.YschBaseOpenApi; import com.yunhai.platform.utils.exception.ErrorCode; import com.yunhai.platform.utils.model.BoaGroup; import com.yunhai.platform.utils.model.BoaUser; diff --git a/src/main/java/com/yunhai/notice/service/impl/UserCenterService.java b/src/main/java/com/yunhai/notice/service/impl/UserCenterService.java index c56a1c9..cf2bf36 100644 --- a/src/main/java/com/yunhai/notice/service/impl/UserCenterService.java +++ b/src/main/java/com/yunhai/notice/service/impl/UserCenterService.java @@ -3,7 +3,7 @@ package com.yunhai.notice.service.impl; import com.yunhai.notice.model.SchTeaList; import com.yunhai.notice.service.IClassService; import com.yunhai.notice.service.IUserCenterService; -import com.yunhai.platform.openapi.client.YschBaseOpenApi; +import com.yunhai.platform.openapi.base.YschBaseOpenApi; import com.yunhai.platform.apistd.BizException; import com.yunhai.platform.utils.exception.ErrorCode; import com.yunhai.platform.utils.model.BoaGroup; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index fd2417c..79485f8 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -93,11 +93,8 @@ yh: # "100009": "dcc36c98299a4d36bb0ec39d42008e8c" trust-registry: true open: - enabled: true + # 四域服务目录零配置:userbase/userclass/usermsg/flowcenter 枚举兜底 = base-host + 默认 ctx base-host: http://base.yunhaixingtong.com - user-center-url: http://base.yunhaixingtong.com/userbase - # 班级管理(userclass)服务基址(原 bschclass 路由已下线) - userclass: http://base.yunhaixingtong.com/userclass # env-config 前端运行时配置(免登录 GET /api/env-config?target=front,数据源见 # config/PropertyEnvConfigSource:聚合 starter 自动装配,有 bean 即注册端点)。 # 本地无需配值(前端 dev 走 .env.dev);线上值经环境变量 YH_ENV_CONFIG_SOURCE_FRONT diff --git a/src/test/java/com/yunhai/notice/service/flow/FlowCenterClientTest.java b/src/test/java/com/yunhai/notice/service/flow/FlowCenterClientTest.java index 19f1f81..4f877bf 100644 --- a/src/test/java/com/yunhai/notice/service/flow/FlowCenterClientTest.java +++ b/src/test/java/com/yunhai/notice/service/flow/FlowCenterClientTest.java @@ -3,9 +3,9 @@ package com.yunhai.notice.service.flow; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.yunhai.notice.model.flow.FlowModels; -import com.yunhai.platform.openapi.TargetSpec; -import com.yunhai.platform.openapi.YschOpenCall; -import com.yunhai.platform.openapi.YschCallProperties; +import com.yunhai.platform.openapi.core.TargetSpec; +import com.yunhai.platform.openapi.core.YschOpenCall; +import com.yunhai.platform.openapi.core.YschCallProperties; import com.yunhai.platform.apistd.BizException; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpServer; @@ -135,7 +135,9 @@ class FlowCenterClientTest { props.setEnabled(enabled); props.setBaseUrl("http://localhost:" + port); YschOpenCall openCall = new YschOpenCall(new YschCallProperties(), objectMapper, - (host, basePath) -> (request, body, execution) -> execution.execute(request, body)); + (host, basePath) -> java.util.Collections.singletonList( + (org.springframework.http.client.ClientHttpRequestInterceptor) + (request, body, execution) -> execution.execute(request, body))); return new FlowCenterClient(props, new FixedProvider<>(openCall), null, objectMapper); }