feat: add solgitReqList and get_mcp_tool_team_members tools
All checks were successful
Deploy to OCIWP / deploy (push) Successful in 6m31s

This commit is contained in:
jade
2026-07-29 10:26:32 +09:00
parent 4133b63595
commit 06b724459e
17 changed files with 510 additions and 4 deletions

View File

@@ -190,11 +190,13 @@ public class BusinessToolController {
} }
} }
// 4. 메서드 실행
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
Object methodResult = null; Object methodResult = null;
methodResult = targetMethod.invoke(targetBean, invokeArgument); if (targetMethod.getParameterCount() == 0) {
methodResult = targetMethod.invoke(targetBean);
} else {
methodResult = targetMethod.invoke(targetBean, invokeArgument);
}
long elapsed = System.currentTimeMillis() - startTime; long elapsed = System.currentTimeMillis() - startTime;

View File

@@ -4,6 +4,8 @@ import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.lib.annotation.McpFunction; import io.shinhanlife.dap.lib.annotation.McpFunction;
import io.shinhanlife.dap.mcc.biz.cmm.dto.*; import io.shinhanlife.dap.mcc.biz.cmm.dto.*;
import java.util.Map;
@McpTool( @McpTool(
routingType = "HTTP", routingType = "HTTP",
categoryKey = "cmm" categoryKey = "cmm"
@@ -15,5 +17,5 @@ public interface TemplateUtilityUseCase {
description = "요청한 템플릿(엑셀, 워드 등) 파일(양식)을 다운로드 받을 수 있는 시스템 URL을 반환합니다. AI는 이 URL을 사용자에게 마크다운 링크 형태로 제공해야 합니다.", description = "요청한 템플릿(엑셀, 워드 등) 파일(양식)을 다운로드 받을 수 있는 시스템 URL을 반환합니다. AI는 이 URL을 사용자에게 마크다운 링크 형태로 제공해야 합니다.",
prompt = "요청하신 템플릿 양식 파일 다운로드 URL은 다음과 같습니다. 클릭하여 다운로드하세요:" prompt = "요청하신 템플릿 양식 파일 다운로드 URL은 다음과 같습니다. 클릭하여 다운로드하세요:"
) )
java.util.Map<String, Object> getTemplateFileUrl(TemplateDownloadRequest req); Map<String, Object> getTemplateFileUrl(TemplateDownloadRequest req);
} }

View File

@@ -0,0 +1,33 @@
package io.shinhanlife.dap.mcc.biz.solgit.converter;
import io.shinhanlife.dap.mcc.biz.solgit.dto.SolgitReqListRequest;
import io.shinhanlife.dap.mcc.biz.solgit.dto.SolgitReqListResponse;
import io.shinhanlife.dap.mcc.infra.itrf.mci.ncl.g.io.SOLG00000001_I;
import io.shinhanlife.dap.mcc.infra.itrf.mci.ncl.g.io.SOLG00000001_O;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
/**
* @package io.shinhanlife.dap.mcc.biz.solgit.converter
* @className SolgitReqListConverter
* @description AX HUB 시스템 처리 클래스
* @author jade
* @create 2026.07.29
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.07.29 jade 최초생성
*
* </pre>
*/
@Mapper(componentModel = "spring")
public interface SolgitReqListConverter {
@Mapping(source = "status", target = "reqStatus", defaultValue = "진행중")
@Mapping(source = "period", target = "reqPeriod", defaultValue = "최근 3개월")
@Mapping(source = "target", target = "reqTarget", defaultValue = "나의 업무")
SOLG00000001_I toLegacyRequest(SolgitReqListRequest req);
SolgitReqListResponse toResponse(SOLG00000001_O mciRes);
}

View File

@@ -0,0 +1,32 @@
package io.shinhanlife.dap.mcc.biz.solgit.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import lombok.Data;
/**
* @package io.shinhanlife.dap.mcc.biz.solgit.dto
* @className SolgitReqListRequest
* @description AX HUB 시스템 처리 클래스
* @author jade
* @create 2026.07.29
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.07.29 jade 최초생성
*
* </pre>
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SolgitReqListRequest {
@McpParameter(description = "진행상태 (예: 진행중, 완료 등)", required = false)
private String status;
@McpParameter(description = "조회기간 (예: 1개월, 3개월 등)", required = false)
private String period;
@McpParameter(description = "조회대상 (예: 나의 업무, 전체 등)", required = false)
private String target;
}

View File

@@ -0,0 +1,37 @@
package io.shinhanlife.dap.mcc.biz.solgit.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import java.util.List;
/**
* @package io.shinhanlife.dap.mcc.biz.solgit.dto
* @className SolgitReqListResponse
* @description AX HUB 시스템 처리 클래스
* @author jade
* @create 2026.07.29
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.07.29 jade 최초생성
*
* </pre>
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SolgitReqListResponse {
private List<SolgitReqListItem> reqList;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class SolgitReqListItem {
private String srId;
private String srName;
private String process;
private String devStage;
private String appName;
private String requester;
}
}

View File

@@ -0,0 +1,23 @@
package io.shinhanlife.dap.mcc.biz.solgit.usecase;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.mcc.biz.solgit.dto.SolgitReqListRequest;
@McpTool(
routingType = "MCI",
categoryKey = "solgit"
)
public interface SolgitReqListUseCase {
@McpFunction(
displayName = "SolgitReqList 툴",
name = "solgitReqList",
description = "SOLGIT 의뢰서 목록 조회해줘",
prompt = "SOLGIT 의뢰서 목록 조회해줘",
mappingId = "SOLG00000001",
register = false,
requiresApproval = false,
openWorldHint = true
)
Object execute(SolgitReqListRequest req);
}

View File

@@ -0,0 +1,75 @@
package io.shinhanlife.dap.mcc.biz.solgit.usecase.impl;
import io.shinhanlife.dap.mcc.biz.solgit.dto.SolgitReqListRequest;
import io.shinhanlife.dap.mcc.biz.solgit.dto.SolgitReqListResponse;
import io.shinhanlife.dap.mcc.biz.solgit.usecase.SolgitReqListUseCase;
import io.shinhanlife.dap.lib.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 java.util.List;
import java.util.ArrayList;
import io.shinhanlife.dap.mcc.biz.solgit.converter.SolgitReqListConverter;
import io.shinhanlife.dap.mcc.infra.itrf.mci.ncl.g.io.SOLG00000001_I;
import io.shinhanlife.dap.mcc.infra.itrf.mci.ncl.g.MciNclgClient;
import io.shinhanlife.dap.mcc.biz.solgit.dto.SolgitReqListResponse.SolgitReqListItem;
/**
* @package io.shinhanlife.dap.mcc.biz.solgit.usecase.impl
* @className SolgitReqListUseCaseImpl
* @description AX HUB 시스템 처리 클래스
* @author jade
* @create 2026.07.29
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.07.29 jade 최초생성
*
* </pre>
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class SolgitReqListUseCaseImpl implements SolgitReqListUseCase {
private final MciNclgClient mci;
private final SolgitReqListConverter converter;
@Override
public Object execute(SolgitReqListRequest req) {
log.info("[MCI Tool] {} 요청 수신. 파라미터: {}", "solgitReqList", req);
try {
// 현업 테스트용으로 MCI 통신을 바이패스하고 하드코딩된 결과를 반환합니다.
SolgitReqListResponse res = new SolgitReqListResponse();
List<SolgitReqListItem> list = new ArrayList<>();
SolgitReqListItem item1 = new SolgitReqListItem();
item1.setSrId("SR-2026-001");
item1.setSrName("AX HUB 메인 화면 UI 개편");
item1.setProcess("진행중");
item1.setDevStage("개발(단위테스트)");
item1.setAppName("AX HUB");
item1.setRequester("윤희준");
list.add(item1);
SolgitReqListItem item2 = new SolgitReqListItem();
item2.setSrId("SR-2026-002");
item2.setSrName("툴 연동 모듈 추가 개발");
item2.setProcess("진행중");
item2.setDevStage("분석/설계");
item2.setAppName("MCP Gateway");
item2.setRequester("고석민");
list.add(item2);
res.setReqList(list);
return res;
} catch (Exception e) {
log.error("[MCI Tool] 연동 중 오류 발생: {}", e.getMessage(), e);
return Map.of("status", "ERROR", "message", e.getMessage() != null ? e.getMessage() : "Unknown error");
}
}
}

View File

@@ -0,0 +1,32 @@
package io.shinhanlife.dap.mcc.biz.team.converter;
import io.shinhanlife.dap.mcc.biz.team.dto.TeamMemberRequest;
import io.shinhanlife.dap.mcc.biz.team.dto.TeamMemberResponse;
import io.shinhanlife.dap.mcc.biz.team.legacy.TeamMemberLegacyRequest;
import io.shinhanlife.dap.mcc.biz.team.legacy.TeamMemberLegacyResponse;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
/**
* @package io.shinhanlife.dap.mcc.biz.team.converter
* @className TeamMemberConverter
* @description AX HUB 시스템 처리 클래스
* @author jade
* @create 2026.07.29
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.07.29 jade 최초생성
*
* </pre>
*/
@Mapper(componentModel = "spring")
public interface TeamMemberConverter {
TeamMemberLegacyRequest toLegacyRequest(TeamMemberRequest req);
TeamMemberRequest toRequest(TeamMemberLegacyRequest legacyRequest);
// TeamMemberResponse toResponse(TeamMemberLegacyResponse legacyResponse);
}

View File

@@ -0,0 +1,26 @@
package io.shinhanlife.dap.mcc.biz.team.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.shinhanlife.dap.lib.annotation.McpParameter;
import lombok.Data;
/**
* @package io.shinhanlife.dap.mcc.biz.team.dto
* @className TeamMemberRequest
* @description AX HUB 시스템 처리 클래스
* @author jade
* @create 2026.07.29
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.07.29 jade 최초생성
*
* </pre>
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class TeamMemberRequest {
@McpParameter(description = "조회할 팀 이름 (예: AX, MCP, TOOL, 전체 등)", required = false)
private String teamName;
}

View File

@@ -0,0 +1,24 @@
package io.shinhanlife.dap.mcc.biz.team.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
/**
* @package io.shinhanlife.dap.mcc.biz.team.dto
* @className TeamMemberResponse
* @description AX HUB 시스템 처리 클래스
* @author jade
* @create 2026.07.29
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.07.29 jade 최초생성
*
* </pre>
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class TeamMemberResponse {
private String result;
}

View File

@@ -0,0 +1,30 @@
package io.shinhanlife.dap.mcc.biz.team.legacy;
import lombok.Data;
/**
* @package io.shinhanlife.dap.mcc.biz.team.legacy
* @className TeamMemberLegacyRequest
* @description AX HUB 시스템 처리 클래스
* @author jade
* @create 2026.07.29
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.07.29 jade 최초생성
*
* </pre>
*/
@Data
public class TeamMemberLegacyRequest {
/**
* EAI 시스템이 요구하는 수신자 번호 파라미터명
*/
private String phone;
/**
* EAI 시스템이 요구하는 메시지 내용 파라미터명
*/
private String content;
}

View File

@@ -0,0 +1,22 @@
package io.shinhanlife.dap.mcc.biz.team.legacy;
import lombok.Data;
/**
* @package io.shinhanlife.dap.mcc.biz.team.legacy
* @className TeamMemberLegacyResponse
* @description AX HUB 시스템 처리 클래스
* @author jade
* @create 2026.07.29
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.07.29 jade 최초생성
*
* </pre>
*/
@Data
public class TeamMemberLegacyResponse {
// TODO: Add legacy response fields here
}

View File

@@ -0,0 +1,23 @@
package io.shinhanlife.dap.mcc.biz.team.usecase;
import io.shinhanlife.dap.lib.annotation.McpFunction;
import io.shinhanlife.dap.lib.annotation.McpTool;
import io.shinhanlife.dap.mcc.biz.team.dto.TeamMemberRequest;
@McpTool(
routingType = "DIRECT",
categoryKey = "team"
)
public interface TeamMemberUseCase {
@McpFunction(
displayName = "신한라이프 MCP, TOOL 파트 구성원 조회",
name = "get_mcp_tool_team_members",
description = "신한라이프 MCP, TOOL 파트 구성원을 조회합니다.",
prompt = "신한라이프 MCP, TOOL 파트 구성원을 조회해 줘. (주의: 응답 시 ** 등 마크다운 기호를 절대 사용하지 말고 평문으로만 출력해 줘)",
mappingId = "DIRECT0001",
register = false,
requiresApproval = false,
openWorldHint = true
)
Object execute(TeamMemberRequest req);
}

View File

@@ -0,0 +1,57 @@
package io.shinhanlife.dap.mcc.biz.team.usecase.impl;
import io.shinhanlife.dap.mcc.biz.team.dto.TeamMemberRequest;
import io.shinhanlife.dap.mcc.biz.team.dto.TeamMemberResponse;
import io.shinhanlife.dap.mcc.biz.team.usecase.TeamMemberUseCase;
import io.shinhanlife.dap.mcc.usecase.AbstractMcpToolUseCase;
import io.shinhanlife.dap.mcc.biz.team.converter.TeamMemberConverter;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* @package io.shinhanlife.dap.mcc.biz.team.usecase.impl
* @className TeamMemberUseCaseImpl
* @description AX HUB 시스템 처리 클래스
* @author jade
* @create 2026.07.29
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.07.29 jade 최초생성
*
* </pre>
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class TeamMemberUseCaseImpl extends AbstractMcpToolUseCase implements TeamMemberUseCase {
private final TeamMemberConverter converter;
@Override
public Object execute(TeamMemberRequest req) {
log.info("[A01] 신한라이프 MCP, TOOL 파트 구성원 조회 요청: {}", req);
String filter = req != null && req.getTeamName() != null ? req.getTeamName().toUpperCase() : "전체";
String resultString = "";
if (filter.contains("AX")) {
resultString += "ax 추진팀 박세진 프로\n";
} else if (filter.contains("MCP") && !filter.contains("TOOL")) {
resultString += "MCP 팀은 고석민 수석 , 장효원 책임\n";
} else if (filter.contains("TOOL") && !filter.contains("MCP")) {
resultString += "TOOL 팀은 김형식 수석 ,김영진 책임 , 김도겸 대리 , 이주희 선임 , 문주현 선임 , 이보람 대리 , 박수빈 대리\n";
} else {
resultString += "ax 추진팀 박세진 프로\n" +
"MCP & TOOL 팀 담당자는 윤희준 이사\n" +
"MCP 팀은 고석민 수석 , 장효원 책임\n" +
"TOOL 팀은 김형식 수석 ,김영진 책임 , 김도겸 대리 , 이주희 선임 , 문주현 선임 , 이보람 대리 , 박수빈 대리";
}
TeamMemberResponse res = new TeamMemberResponse();
res.setResult(resultString.trim());
return res;
}
}

View File

@@ -0,0 +1,30 @@
package io.shinhanlife.dap.mcc.infra.itrf.mci.ncl.g;
import org.springframework.stereotype.Component;
import lombok.RequiredArgsConstructor;
import io.shinhanlife.dap.lib.integration.mci.component.AxhubMciComponent;
import io.shinhanlife.glow.communication.dto.Transfer;
/**
* @package io.shinhanlife.dap.mcc.infra.itrf.mci.ncl.g
* @className MciNclgClient
* @description AX HUB 시스템 처리 클래스
* @author jade
* @create 2026.07.29
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.07.29 jade 최초생성
*
* </pre>
*/
@Component
@RequiredArgsConstructor
public class MciNclgClient {
private final AxhubMciComponent mci;
public <T> Transfer<T> callTo(String interfaceId, String dummy, Object mciReq, Class<T> resType) throws Exception {
return mci.callTo(interfaceId, dummy, mciReq, resType);
}
}

View File

@@ -0,0 +1,24 @@
package io.shinhanlife.dap.mcc.infra.itrf.mci.ncl.g.io;
import lombok.Data;
/**
* @package io.shinhanlife.dap.mcc.infra.itrf.mci.ncl.g.io
* @className SOLG00000001_I
* @description AX HUB 시스템 처리 클래스
* @author jade
* @create 2026.07.29
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.07.29 jade 최초생성
*
* </pre>
*/
@Data
public class SOLG00000001_I {
private String reqStatus;
private String reqPeriod;
private String reqTarget;
}

View File

@@ -0,0 +1,34 @@
package io.shinhanlife.dap.mcc.infra.itrf.mci.ncl.g.io;
import lombok.Data;
import java.util.List;
/**
* @package io.shinhanlife.dap.mcc.infra.itrf.mci.ncl.g.io
* @className SOLG00000001_O
* @description AX HUB 시스템 처리 클래스
* @author jade
* @create 2026.07.29
* <pre>
* ---------- 개정이력 ----------
* 수정일 수정자 수정내용
* ---------- -------- ---------------------------
* 2026.07.29 jade 최초생성
*
* </pre>
*/
@Data
public class SOLG00000001_O {
private List<SOLG00000001_O_Item> reqList;
@Data
public static class SOLG00000001_O_Item {
private String srId;
private String srName;
private String process;
private String devStage;
private String appName;
private String requester;
}
}