From ce96137948c98381e8d3e458940e834f77ef3d19 Mon Sep 17 00:00:00 2001 From: jade Date: Wed, 22 Jul 2026 11:31:39 +0900 Subject: [PATCH] fix: resolve Format specifier '%s' error in ToolScaffolder and generate SearchHr tool --- .../dap/common/util/ToolScaffolder.java | 3 +- .../converter/SearchHrLegacyConverter.java | 37 ++++++++++ .../shinhanlife/dap/mcc/dto/SearchHrReq.java | 29 ++++++++ .../shinhanlife/dap/mcc/dto/SearchHrRes.java | 26 +++++++ .../dap/mcc/legacy/SearchHrLegacyReq.java | 30 ++++++++ .../dap/mcc/legacy/SearchHrLegacyRes.java | 22 ++++++ .../dap/mcc/service/SearchHrService.java | 71 +++++++++++++++++++ 7 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/converter/SearchHrLegacyConverter.java create mode 100644 dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/dto/SearchHrReq.java create mode 100644 dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/dto/SearchHrRes.java create mode 100644 dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/legacy/SearchHrLegacyReq.java create mode 100644 dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/legacy/SearchHrLegacyRes.java create mode 100644 dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/service/SearchHrService.java diff --git a/dap-tool-core/src/main/java/io/shinhanlife/dap/common/util/ToolScaffolder.java b/dap-tool-core/src/main/java/io/shinhanlife/dap/common/util/ToolScaffolder.java index 28d1fd8..f5537ef 100644 --- a/dap-tool-core/src/main/java/io/shinhanlife/dap/common/util/ToolScaffolder.java +++ b/dap-tool-core/src/main/java/io/shinhanlife/dap/common/util/ToolScaffolder.java @@ -324,6 +324,7 @@ public class ToolScaffolder { createDate, author, routingType, group.toLowerCase(), baseName, + baseName, baseName, baseName, toolName, description, description + " 해줘.", interfaceId, register, baseName, baseName, @@ -438,7 +439,7 @@ public class ToolScaffolder { BASE_PACKAGE, baseName, BASE_PACKAGE, baseName, BASE_PACKAGE, baseName, author, createDate, createDate, author, - baseName, baseName, baseName, baseName, baseName, baseName + baseName, baseName, baseName, baseName, baseName, baseName, baseName ); Files.writeString(converterDir.resolve(baseName + "LegacyConverter.java"), converterContent); diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/converter/SearchHrLegacyConverter.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/converter/SearchHrLegacyConverter.java new file mode 100644 index 0000000..942736d --- /dev/null +++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/converter/SearchHrLegacyConverter.java @@ -0,0 +1,37 @@ +package io.shinhanlife.dap.mcc.converter; + +import io.shinhanlife.dap.mcc.dto.SearchHrReq; +import io.shinhanlife.dap.mcc.dto.SearchHrRes; +import io.shinhanlife.dap.mcc.legacy.SearchHrLegacyReq; +import io.shinhanlife.dap.mcc.legacy.SearchHrLegacyRes; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +/** + * @package io.shinhanlife.dap.mcc.converter + * @className SearchHrLegacyConverter + * @description AX HUB 시스템 처리 클래스 + * @author user + * @create 2026.07.22 + *
+ * ---------- 개정이력 ----------
+ * 수정일      수정자    수정내용
+ * ---------- -------- ---------------------------
+ * 2026.07.22  user    최초생성
+ *
+ * 
+ */ +@Mapper(componentModel = "spring") +public interface SearchHrLegacyConverter { + + @Mapping(source = "phoneNumber", target = "phone") + @Mapping(source = "message", target = "content") + SearchHrLegacyReq toLegacyReq(SearchHrReq req); + + @Mapping(source = "phone", target = "phoneNumber") + @Mapping(source = "content", target = "message") + SearchHrReq toReq(SearchHrLegacyReq legacyReq); + + // SearchHrRes toRes(SearchHrLegacyRes legacyRes); +} diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/dto/SearchHrReq.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/dto/SearchHrReq.java new file mode 100644 index 0000000..7cfd69d --- /dev/null +++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/dto/SearchHrReq.java @@ -0,0 +1,29 @@ +package io.shinhanlife.dap.mcc.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.shinhanlife.dap.mcc.annotation.McpParameter; +import lombok.Data; + +/** + * @package io.shinhanlife.dap.mcc.dto + * @className SearchHrReq + * @description AX HUB 시스템 처리 클래스 + * @author user + * @create 2026.07.22 + *
+ * ---------- 개정이력 ----------
+ * 수정일      수정자    수정내용
+ * ---------- -------- ---------------------------
+ * 2026.07.22  user    최초생성
+ *
+ * 
+ */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class SearchHrReq { + @McpParameter(description = "수신자 전화번호", required = true) + private String phoneNumber; + + @McpParameter(description = "전송할 메시지 내용", required = true) + private String message; +} diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/dto/SearchHrRes.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/dto/SearchHrRes.java new file mode 100644 index 0000000..d7e8294 --- /dev/null +++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/dto/SearchHrRes.java @@ -0,0 +1,26 @@ +package io.shinhanlife.dap.mcc.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +/** + * @package io.shinhanlife.dap.mcc.dto + * @className SearchHrRes + * @description AX HUB 시스템 처리 클래스 + * @author user + * @create 2026.07.22 + *
+ * ---------- 개정이력 ----------
+ * 수정일      수정자    수정내용
+ * ---------- -------- ---------------------------
+ * 2026.07.22  user    최초생성
+ *
+ * 
+ */ +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class SearchHrRes { + private String status; + private String message; + // TODO: Add response fields here +} diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/legacy/SearchHrLegacyReq.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/legacy/SearchHrLegacyReq.java new file mode 100644 index 0000000..7ed78be --- /dev/null +++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/legacy/SearchHrLegacyReq.java @@ -0,0 +1,30 @@ +package io.shinhanlife.dap.mcc.legacy; + +import lombok.Data; + +/** + * @package io.shinhanlife.dap.mcc.legacy + * @className SearchHrLegacyReq + * @description AX HUB 시스템 처리 클래스 + * @author user + * @create 2026.07.22 + *
+ * ---------- 개정이력 ----------
+ * 수정일      수정자    수정내용
+ * ---------- -------- ---------------------------
+ * 2026.07.22  user    최초생성
+ *
+ * 
+ */ +@Data +public class SearchHrLegacyReq { + /** + * EAI 시스템이 요구하는 수신자 번호 파라미터명 + */ + private String phone; + + /** + * EAI 시스템이 요구하는 메시지 내용 파라미터명 + */ + private String content; +} diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/legacy/SearchHrLegacyRes.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/legacy/SearchHrLegacyRes.java new file mode 100644 index 0000000..92374c5 --- /dev/null +++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/legacy/SearchHrLegacyRes.java @@ -0,0 +1,22 @@ +package io.shinhanlife.dap.mcc.legacy; + +import lombok.Data; + +/** + * @package io.shinhanlife.dap.mcc.legacy + * @className SearchHrLegacyRes + * @description AX HUB 시스템 처리 클래스 + * @author user + * @create 2026.07.22 + *
+ * ---------- 개정이력 ----------
+ * 수정일      수정자    수정내용
+ * ---------- -------- ---------------------------
+ * 2026.07.22  user    최초생성
+ *
+ * 
+ */ +@Data +public class SearchHrLegacyRes { + // TODO: Add legacy response fields here +} diff --git a/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/service/SearchHrService.java b/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/service/SearchHrService.java new file mode 100644 index 0000000..6198316 --- /dev/null +++ b/dap-tool-other/src/main/java/io/shinhanlife/dap/mcc/service/SearchHrService.java @@ -0,0 +1,71 @@ +package io.shinhanlife.dap.mcc.service; + +import io.shinhanlife.dap.mcc.annotation.McpFunction; +import io.shinhanlife.dap.mcc.annotation.McpTool; +import io.shinhanlife.dap.mcc.dto.SearchHrReq; +import io.shinhanlife.dap.mcc.dto.SearchHrRes; +import io.shinhanlife.dap.common.integration.mci.component.AxhubMciComponent; +import io.shinhanlife.glow.communication.dto.Transfer; +import org.springframework.stereotype.Service; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import java.util.Map; +import org.mapstruct.factory.Mappers; +import io.shinhanlife.dap.mcc.converter.SearchHrLegacyConverter; +import io.shinhanlife.dap.mcc.legacy.SearchHrLegacyReq; + +/** + * @package io.shinhanlife.dap.mcc.service + * @className SearchHrService + * @description AX HUB 시스템 처리 클래스 + * @author user + * @create 2026.07.22 + *
+ * ---------- 개정이력 ----------
+ * 수정일      수정자    수정내용
+ * ---------- -------- ---------------------------
+ * 2026.07.22  user    최초생성
+ *
+ * 
+ */ +@Slf4j +@Service +@RequiredArgsConstructor +@McpTool( + routingType = "MCI", + categoryKey = "hr" +) +public class SearchHrService { + + private final AxhubMciComponent mci; + private final SearchHrLegacyConverter converter = Mappers.getMapper(SearchHrLegacyConverter.class); + + @McpFunction( + displayName = "SearchHr 툴", + name = "searchHr", + description = "hr 조회", + prompt = "hr 조회 해줘.", + mappingId = "HR_001", + register = true, + requiresApproval = false, + openWorldHint = true + ) + public Object execute(SearchHrReq req) { + log.info("[MCI Tool] {} 요청 수신.", "SearchHr"); + try { + // MapStruct를 이용한 자동 매핑 (AI DTO -> MCI DTO) + SearchHrLegacyReq legacyReq = converter.toLegacyReq(req); + + Transfer resTransfer = mci.callTo( + "HR_001", + null, + legacyReq, + Object.class + ); + return resTransfer.getBody() != null ? resTransfer.getBody() : Map.of("status", "SUCCESS"); + } catch (Exception e) { + log.error("[MCI Tool] 연동 중 오류 발생: {}", e.getMessage(), e); + return Map.of("status", "ERROR", "message", e.getMessage() != null ? e.getMessage() : "Unknown error"); + } + } +}