forked from kimhyungsik/ax_hub_mcp_tool
This commit is contained in:
@@ -3,6 +3,5 @@ WORKDIR /app
|
||||
RUN apk add --no-cache tzdata
|
||||
ENV TZ=Asia/Seoul
|
||||
COPY dat-was-sal/build/libs/*-SNAPSHOT.jar app.jar
|
||||
EXPOSE 8082
|
||||
EXPOSE 8083
|
||||
ENTRYPOINT ["java", "-jar", "app.jar"]
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
plugins {
|
||||
// SMS Tool Pod를 독립 실행 가능한 Spring Boot JAR로 생성합니다.
|
||||
// Spring Boot 3.5.11 version is managed by the root build.gradle.
|
||||
id 'org.springframework.boot'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// MCP Server, Tool 공통 처리, MCI/EAI 연동 기반은 dat-was-lib에서 상속합니다.
|
||||
// Shared MCP, Glow integration, validation, logging, Lombok and MapStruct configuration.
|
||||
implementation project(':dat-was-lib')
|
||||
}
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.cmm.converter;
|
||||
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.dto.ClaimSearchRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.dto.ClaimSearchResponse;
|
||||
import io.shinhanlife.dat.mcc.infra.itrf.mci.ncla.io.CLCNNB00001_I;
|
||||
import io.shinhanlife.dat.mcc.infra.itrf.mci.ncla.io.CLCNNB00001_O;
|
||||
import org.mapstruct.Mapper;
|
||||
|
||||
@Mapper(componentModel = "spring")
|
||||
public interface ClaimSearchConverter {
|
||||
CLCNNB00001_I toLegacyRequest(ClaimSearchRequest request);
|
||||
ClaimSearchRequest toRequest(CLCNNB00001_I mciRequest);
|
||||
ClaimSearchResponse toResponse(CLCNNB00001_O mciRes);
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.cmm.converter;
|
||||
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.dto.MemoListRetrieverRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.dto.MemoListRetrieverResponse;
|
||||
import io.shinhanlife.dat.mcc.infra.itrf.http.memo.io.MemoListRetrieverHttpRequest;
|
||||
import io.shinhanlife.dat.mcc.infra.itrf.http.memo.io.MemoListRetrieverHttpResponse;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mapping;
|
||||
import org.mapstruct.ReportingPolicy;
|
||||
|
||||
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
|
||||
public interface MemoListRetrieverConverter {
|
||||
// Field names differ? Add mappings like this before the method.
|
||||
// @Mapping(source = "sourceField", target = "targetField")
|
||||
MemoListRetrieverHttpRequest toHttpRequest(MemoListRetrieverRequest request);
|
||||
MemoListRetrieverResponse toResponse(MemoListRetrieverHttpResponse httpResponse);
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.cmm.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class ClaimSearchRequest {
|
||||
@Schema(description = "보험금 청구번호", example = "CLM202608100001", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String claimNo;
|
||||
|
||||
@Schema(description = "보험 계약번호", example = "10023456789")
|
||||
private String contractNo;
|
||||
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.cmm.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class ClaimSearchResponse {
|
||||
private String resultCode;
|
||||
|
||||
private String resultMessage;
|
||||
@Schema(description = "청구 처리 상태 코드", example = "RECEIVED", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String status;
|
||||
|
||||
@Schema(description = "청구 처리 상태명", example = "접수", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String statusLabel;
|
||||
|
||||
@Schema(description = "승인 금액", example = "150000")
|
||||
private Long approvedAmount;
|
||||
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.cmm.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class MemoListRetrieverRequest {
|
||||
@Schema(description = "조회할 의뢰서 상태", example = "OPEN", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String memoStatus;
|
||||
|
||||
@Schema(description = "검색 키워드", example = "프로젝트", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String searchKeyword;
|
||||
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.cmm.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class MemoListRetrieverResponse {
|
||||
private String resultCode;
|
||||
|
||||
private String resultMessage;
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.cmm.usecase;
|
||||
|
||||
import org.springaicommunity.mcp.annotation.McpTool;
|
||||
import io.shinhanlife.dat.lib.annotation.GrowToolHint;
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.dto.ClaimSearchRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.dto.ClaimSearchResponse;
|
||||
|
||||
/**
|
||||
* @package io.shinhanlife.dat.mcc.biz.cmm.usecase
|
||||
* @className ClaimSearchUseCase
|
||||
* @description AX HUB 시스템 처리 클래스
|
||||
* @author jade
|
||||
* @create 2026.08.10
|
||||
* <pre>
|
||||
* ---------- 개정이력 ----------
|
||||
* 수정일 수정자 수정내용
|
||||
* ---------- -------- ---------------------------
|
||||
* 2026.08.10 jade 최초생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public interface ClaimSearchUseCase {
|
||||
|
||||
@McpTool(name = "cmm_claim_search", title = "청구번호 또는 계약번호로 보험금 청구 상태를 조회한다.", description = "청구번호 또는 계약번호로 보험금 청구 상태를 조회한다.")
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "cmm",
|
||||
mappingId = "DIRECT_CMM_CLAIM_SEARCH",
|
||||
functionDescription = "청구번호 또는 계약번호로 보험금 청구 상태와 심사 결과를 조회한다.",
|
||||
whenToUse = "사용자가 기존 보험금 청구의 진행 상태나 지급 결과를 확인하려는 경우 사용한다.",
|
||||
whenNotToUse = "보험금 청구를 새로 접수하거나 기존 청구 내용을 변경하려는 경우에는 사용하지 않는다.",
|
||||
ioLimits = "청구번호 또는 계약번호 중 하나 이상이 필요하며 조회 결과만 반환한다.",
|
||||
displayDescription = "보험금 청구 상태와 심사 결과를 조회합니다.",
|
||||
exampleQueries = {"내 보험금 청구가 어디까지 진행됐는지 알려줘", "계약번호로 최근 청구 상태를 확인해줘", "청구 심사 결과가 나왔는지 조회해줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"보험금", "청구조회"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
ClaimSearchResponse searchClaim(ClaimSearchRequest req);
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.cmm.usecase;
|
||||
|
||||
import org.springaicommunity.mcp.annotation.McpTool;
|
||||
import io.shinhanlife.dat.lib.annotation.GrowToolHint;
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.dto.MemoListRetrieverRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.dto.MemoListRetrieverResponse;
|
||||
|
||||
/**
|
||||
* @package io.shinhanlife.dat.mcc.biz.cmm.usecase
|
||||
* @className MemoListRetrieverUseCase
|
||||
* @description AX HUB 시스템 처리 클래스
|
||||
* @author Admin
|
||||
* @create 2026.08.11
|
||||
* <pre>
|
||||
* ---------- 개정이력 ----------
|
||||
* 수정일 수정자 수정내용
|
||||
* ---------- -------- ---------------------------
|
||||
* 2026.08.11 Admin 최초생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
public interface MemoListRetrieverUseCase {
|
||||
|
||||
@McpTool(name = "cmm_memo_retriever", title = "의뢰서 목록 조회", description = "의뢰서 목록을 조회하여 의뢰 정보를 반환합니다.")
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "cmm",
|
||||
mappingId = "DIRECT_CMM_MEMO_RETRIEVER",
|
||||
functionDescription = "상태와 검색어 조건으로 의뢰서 목록을 조회한다.",
|
||||
whenToUse = "사용자가 등록된 의뢰서의 목록이나 처리 현황을 찾으려는 경우 사용한다.",
|
||||
whenNotToUse = "의뢰서를 신규 등록하거나 내용을 변경하려는 경우에는 사용하지 않는다.",
|
||||
ioLimits = "선택 조건에 해당하는 의뢰서 요약 목록만 반환한다.",
|
||||
displayDescription = "조건에 맞는 의뢰서 목록을 조회합니다.",
|
||||
exampleQueries = {"처리 중인 의뢰서를 보여줘", "지난번 계약 관련 의뢰서를 찾아줘", "완료된 의뢰서 목록을 조회해줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"의뢰서", "목록조회"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
MemoListRetrieverResponse retrieveMemoList(MemoListRetrieverRequest req);
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.cmm.usecase.impl;
|
||||
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.dto.ClaimSearchRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.dto.ClaimSearchResponse;
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.usecase.ClaimSearchUseCase;
|
||||
import io.shinhanlife.glow.communication.dto.Transfer;
|
||||
import io.shinhanlife.glow.BizException;
|
||||
import org.springframework.stereotype.Service;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.converter.ClaimSearchConverter;
|
||||
import io.shinhanlife.dat.mcc.infra.itrf.mci.ncla.io.CLCNNB00001_I;
|
||||
import io.shinhanlife.dat.mcc.infra.itrf.mci.ncla.io.CLCNNB00001_O;
|
||||
import io.shinhanlife.dat.mcc.infra.itrf.mci.ncla.MciNclaClient;
|
||||
|
||||
|
||||
/**
|
||||
* @package io.shinhanlife.dat.mcc.biz.cmm.usecase.impl
|
||||
* @className ClaimSearchUseCaseImpl
|
||||
* @description AX HUB 시스템 처리 클래스
|
||||
* @author jade
|
||||
* @create 2026.08.10
|
||||
* <pre>
|
||||
* ---------- 개정이력 ----------
|
||||
* 수정일 수정자 수정내용
|
||||
* ---------- -------- ---------------------------
|
||||
* 2026.08.10 jade 최초생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class ClaimSearchUseCaseImpl implements ClaimSearchUseCase {
|
||||
|
||||
private final MciNclaClient mci;
|
||||
private final ClaimSearchConverter converter;
|
||||
|
||||
@Override
|
||||
public ClaimSearchResponse searchClaim(ClaimSearchRequest req) {
|
||||
log.info("[MCI Tool] {} 요청 수신.", "cmm_claim_search");
|
||||
try {
|
||||
// MapStruct를 이용한 자동 매핑 (AI DTO -> MCI DTO)
|
||||
CLCNNB00001_I mciReq = converter.toLegacyRequest(req);
|
||||
|
||||
Transfer<CLCNNB00001_O> resTransfer = mci.callTo(
|
||||
"CLCNNB00001",
|
||||
null,
|
||||
mciReq,
|
||||
CLCNNB00001_O.class
|
||||
);
|
||||
ClaimSearchResponse response = new ClaimSearchResponse();
|
||||
if (resTransfer.getBody() != null) {
|
||||
response = converter.toResponse(resTransfer.getBody());
|
||||
}
|
||||
response.setResultCode("SUCCESS");
|
||||
response.setResultMessage(resTransfer.getBody() != null
|
||||
? "MCI call completed."
|
||||
: "MCI call completed without a response body.");
|
||||
return response;
|
||||
} catch (BizException e) {
|
||||
log.error("[MCI Tool] 연동 중 오류 발생: {}", e.getMessage(), e);
|
||||
ClaimSearchResponse response = new ClaimSearchResponse();
|
||||
response.setResultCode("ERROR");
|
||||
response.setResultMessage(e.getMessage() != null ? e.getMessage() : "Unknown error");
|
||||
return response;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.cmm.usecase.impl;
|
||||
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.converter.MemoListRetrieverConverter;
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.dto.MemoListRetrieverRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.dto.MemoListRetrieverResponse;
|
||||
import io.shinhanlife.dat.mcc.infra.itrf.http.memo.MemoClient;
|
||||
import io.shinhanlife.dat.mcc.infra.itrf.http.memo.io.MemoListRetrieverHttpRequest;
|
||||
import io.shinhanlife.dat.mcc.infra.itrf.http.memo.io.MemoListRetrieverHttpResponse;
|
||||
import io.shinhanlife.dat.mcc.biz.cmm.usecase.MemoListRetrieverUseCase;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class MemoListRetrieverUseCaseImpl implements MemoListRetrieverUseCase {
|
||||
|
||||
private final MemoListRetrieverConverter converter;
|
||||
private final MemoClient memoClient;
|
||||
|
||||
@Override
|
||||
public MemoListRetrieverResponse retrieveMemoList(MemoListRetrieverRequest req) {
|
||||
MemoListRetrieverHttpRequest httpRequest = converter.toHttpRequest(req);
|
||||
MemoListRetrieverHttpResponse httpResponse = memoClient.call(httpRequest, MemoListRetrieverHttpResponse.class);
|
||||
|
||||
MemoListRetrieverResponse response = converter.toResponse(httpResponse);
|
||||
|
||||
// Sparrow NULL_RETURN (널 역참조) 방어 로직
|
||||
if (response == null) {
|
||||
response = new MemoListRetrieverResponse();
|
||||
response.setResultCode("ERROR");
|
||||
response.setResultMessage("HTTP API 응답이 없거나 변환에 실패했습니다.");
|
||||
return response;
|
||||
}
|
||||
|
||||
response.setResultCode("SUCCESS");
|
||||
response.setResultMessage("HTTP API call completed.");
|
||||
return response;
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.lic.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import org.springaicommunity.mcp.annotation.McpToolParam;
|
||||
|
||||
@Data
|
||||
public class LicToolRequest {
|
||||
@McpToolParam(description = "상품코드", required = false)
|
||||
@Schema(pattern = "^[A-Za-z0-9_-]{3,30}$")
|
||||
private String productCode;
|
||||
|
||||
@McpToolParam(description = "계약심사번호", required = false)
|
||||
@Schema(pattern = "^[A-Za-z0-9_-]{3,30}$")
|
||||
private String contractId;
|
||||
|
||||
@McpToolParam(description = "조회 기준일(YYYY-MM-DD)", required = false)
|
||||
@Schema(pattern = "^\\d{4}-\\d{2}-\\d{2}$")
|
||||
private String queryDate;
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.lic.dto;
|
||||
|
||||
import java.util.List;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LicToolResponse {
|
||||
private String toolName;
|
||||
private String category;
|
||||
private String referenceId;
|
||||
private String status;
|
||||
private String summary;
|
||||
private String asOfDate;
|
||||
private List<String> details;
|
||||
}
|
||||
@@ -1,198 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.lic.usecase;
|
||||
|
||||
import io.shinhanlife.dat.lib.annotation.GrowToolHint;
|
||||
import io.shinhanlife.dat.mcc.biz.lic.dto.LicToolRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.lic.dto.LicToolResponse;
|
||||
import org.springaicommunity.mcp.annotation.McpTool;
|
||||
|
||||
public interface LicUnderwritingUseCase {
|
||||
@McpTool(name = "lic_product_info", title = "상품 정보 조회", description = "상품 정보 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "lic",
|
||||
mappingId = "DIRECT_LIC_PRODUCT_INFO",
|
||||
functionDescription = "상품 정보 조회 정보를 조회합니다.",
|
||||
whenToUse = "상품·계약심사 업무에서 상품 정보 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "상품 정보 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"상품 정보 조회 정보를 보여줘", "상품 정보 조회 결과를 확인해줘", "현재 상품 정보 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"lic", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
LicToolResponse getProductInfo(LicToolRequest request);
|
||||
|
||||
@McpTool(name = "lic_product_coverage", title = "상품 보장내용 조회", description = "상품 보장내용 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "lic",
|
||||
mappingId = "DIRECT_LIC_PRODUCT_COVERAGE",
|
||||
functionDescription = "상품 보장내용 조회 정보를 조회합니다.",
|
||||
whenToUse = "상품·계약심사 업무에서 상품 보장내용 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "상품 보장내용 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"상품 보장내용 조회 정보를 보여줘", "상품 보장내용 조회 결과를 확인해줘", "현재 상품 보장내용 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"lic", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
LicToolResponse getProductCoverage(LicToolRequest request);
|
||||
|
||||
@McpTool(name = "lic_product_premium_table", title = "상품 보험료 요율표 조회", description = "상품 보험료 요율표 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "lic",
|
||||
mappingId = "DIRECT_LIC_PRODUCT_PREMIUM_TABLE",
|
||||
functionDescription = "상품 보험료 요율표 조회 정보를 조회합니다.",
|
||||
whenToUse = "상품·계약심사 업무에서 상품 보험료 요율표 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "상품 보험료 요율표 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"상품 보험료 요율표 조회 정보를 보여줘", "상품 보험료 요율표 조회 결과를 확인해줘", "현재 상품 보험료 요율표 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"lic", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
LicToolResponse getProductPremiumTable(LicToolRequest request);
|
||||
|
||||
@McpTool(name = "lic_contract_review_status", title = "계약심사 진행상태 조회", description = "계약심사 진행상태 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "lic",
|
||||
mappingId = "DIRECT_LIC_CONTRACT_REVIEW_STATUS",
|
||||
functionDescription = "계약심사 진행상태 조회 정보를 조회합니다.",
|
||||
whenToUse = "상품·계약심사 업무에서 계약심사 진행상태 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "계약심사 진행상태 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"계약심사 진행상태 조회 정보를 보여줘", "계약심사 진행상태 조회 결과를 확인해줘", "현재 계약심사 진행상태 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"lic", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
LicToolResponse getContractReviewStatus(LicToolRequest request);
|
||||
|
||||
@McpTool(name = "lic_contract_review_document", title = "계약심사 제출서류 현황 조회", description = "계약심사 제출서류 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "lic",
|
||||
mappingId = "DIRECT_LIC_CONTRACT_REVIEW_DOCUMENT",
|
||||
functionDescription = "계약심사 제출서류 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "상품·계약심사 업무에서 계약심사 제출서류 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "계약심사 제출서류 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"계약심사 제출서류 현황 조회 정보를 보여줘", "계약심사 제출서류 현황 조회 결과를 확인해줘", "현재 계약심사 제출서류 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"lic", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
LicToolResponse getContractReviewDocument(LicToolRequest request);
|
||||
|
||||
@McpTool(name = "lic_contract_review_result", title = "계약심사 결과 조회", description = "계약심사 결과 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "lic",
|
||||
mappingId = "DIRECT_LIC_CONTRACT_REVIEW_RESULT",
|
||||
functionDescription = "계약심사 결과 조회 정보를 조회합니다.",
|
||||
whenToUse = "상품·계약심사 업무에서 계약심사 결과 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "계약심사 결과 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"계약심사 결과 조회 정보를 보여줘", "계약심사 결과 조회 결과를 확인해줘", "현재 계약심사 결과 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"lic", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
LicToolResponse getContractReviewResult(LicToolRequest request);
|
||||
|
||||
@McpTool(name = "lic_contract_review_history", title = "계약심사 이력 조회", description = "계약심사 이력 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "lic",
|
||||
mappingId = "DIRECT_LIC_CONTRACT_REVIEW_HISTORY",
|
||||
functionDescription = "계약심사 이력 조회 정보를 조회합니다.",
|
||||
whenToUse = "상품·계약심사 업무에서 계약심사 이력 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "계약심사 이력 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"계약심사 이력 조회 정보를 보여줘", "계약심사 이력 조회 결과를 확인해줘", "현재 계약심사 이력 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"lic", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
LicToolResponse getContractReviewHistory(LicToolRequest request);
|
||||
|
||||
@McpTool(name = "lic_underwriting_result", title = "언더라이팅 인수심사 결과 조회", description = "언더라이팅 인수심사 결과 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "lic",
|
||||
mappingId = "DIRECT_LIC_UNDERWRITING_RESULT",
|
||||
functionDescription = "언더라이팅 인수심사 결과 조회 정보를 조회합니다.",
|
||||
whenToUse = "상품·계약심사 업무에서 언더라이팅 인수심사 결과 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "언더라이팅 인수심사 결과 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"언더라이팅 인수심사 결과 조회 정보를 보여줘", "언더라이팅 인수심사 결과 조회 결과를 확인해줘", "현재 언더라이팅 인수심사 결과 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"lic", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
LicToolResponse getUnderwritingResult(LicToolRequest request);
|
||||
|
||||
@McpTool(name = "lic_underwriting_risk_grade", title = "언더라이팅 위험등급 조회", description = "언더라이팅 위험등급 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "lic",
|
||||
mappingId = "DIRECT_LIC_UNDERWRITING_RISK_GRADE",
|
||||
functionDescription = "언더라이팅 위험등급 조회 정보를 조회합니다.",
|
||||
whenToUse = "상품·계약심사 업무에서 언더라이팅 위험등급 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "언더라이팅 위험등급 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"언더라이팅 위험등급 조회 정보를 보여줘", "언더라이팅 위험등급 조회 결과를 확인해줘", "현재 언더라이팅 위험등급 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"lic", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
LicToolResponse getUnderwritingRiskGrade(LicToolRequest request);
|
||||
|
||||
@McpTool(name = "lic_underwriting_additional_request", title = "언더라이팅 추가자료 요청 현황 조회", description = "언더라이팅 추가자료 요청 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "lic",
|
||||
mappingId = "DIRECT_LIC_UNDERWRITING_ADDITIONAL_REQUEST",
|
||||
functionDescription = "언더라이팅 추가자료 요청 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "상품·계약심사 업무에서 언더라이팅 추가자료 요청 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "언더라이팅 추가자료 요청 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"언더라이팅 추가자료 요청 현황 조회 정보를 보여줘", "언더라이팅 추가자료 요청 현황 조회 결과를 확인해줘", "현재 언더라이팅 추가자료 요청 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"lic", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
LicToolResponse getUnderwritingAdditionalRequest(LicToolRequest request);
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.lic.usecase.impl;
|
||||
|
||||
import io.shinhanlife.dat.mcc.biz.lic.dto.LicToolRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.lic.dto.LicToolResponse;
|
||||
import io.shinhanlife.dat.mcc.biz.lic.usecase.LicUnderwritingUseCase;
|
||||
import java.util.List;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class LicUnderwritingUseCaseImpl implements LicUnderwritingUseCase {
|
||||
@Override
|
||||
public LicToolResponse getProductInfo(LicToolRequest request) {
|
||||
return mockResponse(request, "lic_product_info", "상품 정보 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public LicToolResponse getProductCoverage(LicToolRequest request) {
|
||||
return mockResponse(request, "lic_product_coverage", "상품 보장내용 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public LicToolResponse getProductPremiumTable(LicToolRequest request) {
|
||||
return mockResponse(request, "lic_product_premium_table", "상품 보험료 요율표 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public LicToolResponse getContractReviewStatus(LicToolRequest request) {
|
||||
return mockResponse(request, "lic_contract_review_status", "계약심사 진행상태 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public LicToolResponse getContractReviewDocument(LicToolRequest request) {
|
||||
return mockResponse(request, "lic_contract_review_document", "계약심사 제출서류 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public LicToolResponse getContractReviewResult(LicToolRequest request) {
|
||||
return mockResponse(request, "lic_contract_review_result", "계약심사 결과 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public LicToolResponse getContractReviewHistory(LicToolRequest request) {
|
||||
return mockResponse(request, "lic_contract_review_history", "계약심사 이력 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public LicToolResponse getUnderwritingResult(LicToolRequest request) {
|
||||
return mockResponse(request, "lic_underwriting_result", "언더라이팅 인수심사 결과 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public LicToolResponse getUnderwritingRiskGrade(LicToolRequest request) {
|
||||
return mockResponse(request, "lic_underwriting_risk_grade", "언더라이팅 위험등급 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public LicToolResponse getUnderwritingAdditionalRequest(LicToolRequest request) {
|
||||
return mockResponse(request, "lic_underwriting_additional_request", "언더라이팅 추가자료 요청 현황 조회");
|
||||
}
|
||||
|
||||
private LicToolResponse mockResponse(LicToolRequest request, String toolName, String title) {
|
||||
LicToolResponse response = new LicToolResponse();
|
||||
response.setToolName(toolName);
|
||||
response.setCategory("LIC");
|
||||
response.setReferenceId(request != null && hasText(request.getProductCode()) ? request.getProductCode()
|
||||
: request != null && hasText(request.getContractId()) ? request.getContractId() : "LIC-000001");
|
||||
response.setStatus("정상");
|
||||
response.setSummary(title + " 결과");
|
||||
response.setAsOfDate(request != null && hasText(request.getQueryDate()) ? request.getQueryDate() : "2026-08-14");
|
||||
response.setDetails(List.of(title + " 모의 상세정보", "외부 시스템을 변경하지 않는 조회 결과"));
|
||||
return response;
|
||||
}
|
||||
|
||||
private boolean hasText(String value) {
|
||||
return value != null && !value.isBlank();
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.sof.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import org.springaicommunity.mcp.annotation.McpToolParam;
|
||||
|
||||
@Data
|
||||
public class SofToolRequest {
|
||||
@McpToolParam(description = "설계사번호", required = false)
|
||||
@Schema(pattern = "^[A-Za-z0-9_-]{3,30}$")
|
||||
private String agentId;
|
||||
|
||||
@McpToolParam(description = "GA 조직번호", required = false)
|
||||
@Schema(pattern = "^[A-Za-z0-9_-]{3,30}$")
|
||||
private String organizationId;
|
||||
|
||||
@McpToolParam(description = "조회 기준일(YYYY-MM-DD)", required = false)
|
||||
@Schema(pattern = "^\\d{4}-\\d{2}-\\d{2}$")
|
||||
private String queryDate;
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.sof.dto;
|
||||
|
||||
import java.util.List;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class SofToolResponse {
|
||||
private String toolName;
|
||||
private String category;
|
||||
private String referenceId;
|
||||
private String status;
|
||||
private String summary;
|
||||
private String asOfDate;
|
||||
private List<String> details;
|
||||
}
|
||||
@@ -1,198 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.sof.usecase;
|
||||
|
||||
import io.shinhanlife.dat.lib.annotation.GrowToolHint;
|
||||
import io.shinhanlife.dat.mcc.biz.sof.dto.SofToolRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.sof.dto.SofToolResponse;
|
||||
import org.springaicommunity.mcp.annotation.McpTool;
|
||||
|
||||
public interface SofFieldActivityUseCase {
|
||||
@McpTool(name = "sof_activity_daily", title = "GA 일별 활동 현황 조회", description = "GA 일별 활동 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sof",
|
||||
mappingId = "DIRECT_SOF_ACTIVITY_DAILY",
|
||||
functionDescription = "GA 일별 활동 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 활동 업무에서 GA 일별 활동 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "GA 일별 활동 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"GA 일별 활동 현황 조회 정보를 보여줘", "GA 일별 활동 현황 조회 결과를 확인해줘", "현재 GA 일별 활동 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sof", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SofToolResponse getActivityDaily(SofToolRequest request);
|
||||
|
||||
@McpTool(name = "sof_visit_count", title = "고객 방문 건수 조회", description = "고객 방문 건수 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sof",
|
||||
mappingId = "DIRECT_SOF_VISIT_COUNT",
|
||||
functionDescription = "고객 방문 건수 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 활동 업무에서 고객 방문 건수 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "고객 방문 건수 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"고객 방문 건수 조회 정보를 보여줘", "고객 방문 건수 조회 결과를 확인해줘", "현재 고객 방문 건수 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sof", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SofToolResponse getVisitCount(SofToolRequest request);
|
||||
|
||||
@McpTool(name = "sof_call_activity", title = "콜 활동 현황 조회", description = "콜 활동 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sof",
|
||||
mappingId = "DIRECT_SOF_CALL_ACTIVITY",
|
||||
functionDescription = "콜 활동 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 활동 업무에서 콜 활동 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "콜 활동 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"콜 활동 현황 조회 정보를 보여줘", "콜 활동 현황 조회 결과를 확인해줘", "현재 콜 활동 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sof", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SofToolResponse getCallActivity(SofToolRequest request);
|
||||
|
||||
@McpTool(name = "sof_customer_consulting", title = "고객 상담 현황 조회", description = "고객 상담 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sof",
|
||||
mappingId = "DIRECT_SOF_CUSTOMER_CONSULTING",
|
||||
functionDescription = "고객 상담 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 활동 업무에서 고객 상담 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "고객 상담 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"고객 상담 현황 조회 정보를 보여줘", "고객 상담 현황 조회 결과를 확인해줘", "현재 고객 상담 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sof", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SofToolResponse getCustomerConsulting(SofToolRequest request);
|
||||
|
||||
@McpTool(name = "sof_prospect_list", title = "신규 발굴 고객 목록 조회", description = "신규 발굴 고객 목록 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sof",
|
||||
mappingId = "DIRECT_SOF_PROSPECT_LIST",
|
||||
functionDescription = "신규 발굴 고객 목록 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 활동 업무에서 신규 발굴 고객 목록 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "신규 발굴 고객 목록 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"신규 발굴 고객 목록 조회 정보를 보여줘", "신규 발굴 고객 목록 조회 결과를 확인해줘", "현재 신규 발굴 고객 목록 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sof", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SofToolResponse getProspectList(SofToolRequest request);
|
||||
|
||||
@McpTool(name = "sof_activity_calendar", title = "활동 일정 조회", description = "활동 일정 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sof",
|
||||
mappingId = "DIRECT_SOF_ACTIVITY_CALENDAR",
|
||||
functionDescription = "활동 일정 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 활동 업무에서 활동 일정 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "활동 일정 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"활동 일정 조회 정보를 보여줘", "활동 일정 조회 결과를 확인해줘", "현재 활동 일정 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sof", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SofToolResponse getActivityCalendar(SofToolRequest request);
|
||||
|
||||
@McpTool(name = "sof_activity_report_status", title = "활동일지 제출 현황 조회", description = "활동일지 제출 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sof",
|
||||
mappingId = "DIRECT_SOF_ACTIVITY_REPORT_STATUS",
|
||||
functionDescription = "활동일지 제출 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 활동 업무에서 활동일지 제출 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "활동일지 제출 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"활동일지 제출 현황 조회 정보를 보여줘", "활동일지 제출 현황 조회 결과를 확인해줘", "현재 활동일지 제출 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sof", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SofToolResponse getActivityReportStatus(SofToolRequest request);
|
||||
|
||||
@McpTool(name = "sof_training_completion", title = "교육 이수 현황 조회", description = "교육 이수 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sof",
|
||||
mappingId = "DIRECT_SOF_TRAINING_COMPLETION",
|
||||
functionDescription = "교육 이수 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 활동 업무에서 교육 이수 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "교육 이수 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"교육 이수 현황 조회 정보를 보여줘", "교육 이수 현황 조회 결과를 확인해줘", "현재 교육 이수 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sof", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SofToolResponse getTrainingCompletion(SofToolRequest request);
|
||||
|
||||
@McpTool(name = "sof_field_support_request", title = "현장 지원 요청 현황 조회", description = "현장 지원 요청 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sof",
|
||||
mappingId = "DIRECT_SOF_FIELD_SUPPORT_REQUEST",
|
||||
functionDescription = "현장 지원 요청 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 활동 업무에서 현장 지원 요청 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "현장 지원 요청 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"현장 지원 요청 현황 조회 정보를 보여줘", "현장 지원 요청 현황 조회 결과를 확인해줘", "현재 현장 지원 요청 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sof", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SofToolResponse getFieldSupportRequest(SofToolRequest request);
|
||||
|
||||
@McpTool(name = "sof_activity_summary", title = "GA 활동 종합 현황 조회", description = "GA 활동 종합 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sof",
|
||||
mappingId = "DIRECT_SOF_ACTIVITY_SUMMARY",
|
||||
functionDescription = "GA 활동 종합 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 활동 업무에서 GA 활동 종합 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "GA 활동 종합 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"GA 활동 종합 현황 조회 정보를 보여줘", "GA 활동 종합 현황 조회 결과를 확인해줘", "현재 GA 활동 종합 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sof", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SofToolResponse getActivitySummary(SofToolRequest request);
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.sof.usecase.impl;
|
||||
|
||||
import io.shinhanlife.dat.mcc.biz.sof.dto.SofToolRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.sof.dto.SofToolResponse;
|
||||
import io.shinhanlife.dat.mcc.biz.sof.usecase.SofFieldActivityUseCase;
|
||||
import java.util.List;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class SofFieldActivityUseCaseImpl implements SofFieldActivityUseCase {
|
||||
@Override
|
||||
public SofToolResponse getActivityDaily(SofToolRequest request) {
|
||||
return mockResponse(request, "sof_activity_daily", "GA 일별 활동 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SofToolResponse getVisitCount(SofToolRequest request) {
|
||||
return mockResponse(request, "sof_visit_count", "고객 방문 건수 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SofToolResponse getCallActivity(SofToolRequest request) {
|
||||
return mockResponse(request, "sof_call_activity", "콜 활동 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SofToolResponse getCustomerConsulting(SofToolRequest request) {
|
||||
return mockResponse(request, "sof_customer_consulting", "고객 상담 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SofToolResponse getProspectList(SofToolRequest request) {
|
||||
return mockResponse(request, "sof_prospect_list", "신규 발굴 고객 목록 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SofToolResponse getActivityCalendar(SofToolRequest request) {
|
||||
return mockResponse(request, "sof_activity_calendar", "활동 일정 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SofToolResponse getActivityReportStatus(SofToolRequest request) {
|
||||
return mockResponse(request, "sof_activity_report_status", "활동일지 제출 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SofToolResponse getTrainingCompletion(SofToolRequest request) {
|
||||
return mockResponse(request, "sof_training_completion", "교육 이수 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SofToolResponse getFieldSupportRequest(SofToolRequest request) {
|
||||
return mockResponse(request, "sof_field_support_request", "현장 지원 요청 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SofToolResponse getActivitySummary(SofToolRequest request) {
|
||||
return mockResponse(request, "sof_activity_summary", "GA 활동 종합 현황 조회");
|
||||
}
|
||||
|
||||
private SofToolResponse mockResponse(SofToolRequest request, String toolName, String title) {
|
||||
SofToolResponse response = new SofToolResponse();
|
||||
response.setToolName(toolName);
|
||||
response.setCategory("SOF");
|
||||
response.setReferenceId(request != null && hasText(request.getAgentId()) ? request.getAgentId()
|
||||
: request != null && hasText(request.getOrganizationId()) ? request.getOrganizationId() : "SOF-000001");
|
||||
response.setStatus("정상");
|
||||
response.setSummary(title + " 결과");
|
||||
response.setAsOfDate(request != null && hasText(request.getQueryDate()) ? request.getQueryDate() : "2026-08-14");
|
||||
response.setDetails(List.of(title + " 모의 상세정보", "외부 시스템을 변경하지 않는 조회 결과"));
|
||||
return response;
|
||||
}
|
||||
|
||||
private boolean hasText(String value) {
|
||||
return value != null && !value.isBlank();
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.sog.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import org.springaicommunity.mcp.annotation.McpToolParam;
|
||||
|
||||
@Data
|
||||
public class SogToolRequest {
|
||||
@McpToolParam(description = "설계사번호", required = false)
|
||||
@Schema(pattern = "^[A-Za-z0-9_-]{3,30}$")
|
||||
private String agentId;
|
||||
|
||||
@McpToolParam(description = "GA 조직번호", required = false)
|
||||
@Schema(pattern = "^[A-Za-z0-9_-]{3,30}$")
|
||||
private String organizationId;
|
||||
|
||||
@McpToolParam(description = "조회 기준일(YYYY-MM-DD)", required = false)
|
||||
@Schema(pattern = "^\\d{4}-\\d{2}-\\d{2}$")
|
||||
private String queryDate;
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.sog.dto;
|
||||
|
||||
import java.util.List;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class SogToolResponse {
|
||||
private String toolName;
|
||||
private String category;
|
||||
private String referenceId;
|
||||
private String status;
|
||||
private String summary;
|
||||
private String asOfDate;
|
||||
private List<String> details;
|
||||
}
|
||||
@@ -1,198 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.sog.usecase;
|
||||
|
||||
import io.shinhanlife.dat.lib.annotation.GrowToolHint;
|
||||
import io.shinhanlife.dat.mcc.biz.sog.dto.SogToolRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.sog.dto.SogToolResponse;
|
||||
import org.springaicommunity.mcp.annotation.McpTool;
|
||||
|
||||
public interface SogSalesPerformanceUseCase {
|
||||
@McpTool(name = "sog_target_summary", title = "GA 개인별 영업목표 요약 조회", description = "GA 개인별 영업목표 요약 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sog",
|
||||
mappingId = "DIRECT_SOG_TARGET_SUMMARY",
|
||||
functionDescription = "GA 개인별 영업목표 요약 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 영업 업무에서 GA 개인별 영업목표 요약 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "GA 개인별 영업목표 요약 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"GA 개인별 영업목표 요약 조회 정보를 보여줘", "GA 개인별 영업목표 요약 조회 결과를 확인해줘", "현재 GA 개인별 영업목표 요약 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sog", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SogToolResponse getTargetSummary(SogToolRequest request);
|
||||
|
||||
@McpTool(name = "sog_target_progress", title = "영업목표 달성률 조회", description = "영업목표 달성률 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sog",
|
||||
mappingId = "DIRECT_SOG_TARGET_PROGRESS",
|
||||
functionDescription = "영업목표 달성률 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 영업 업무에서 영업목표 달성률 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "영업목표 달성률 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"영업목표 달성률 조회 정보를 보여줘", "영업목표 달성률 조회 결과를 확인해줘", "현재 영업목표 달성률 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sog", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SogToolResponse getTargetProgress(SogToolRequest request);
|
||||
|
||||
@McpTool(name = "sog_monthly_performance", title = "GA 월별 실적 조회", description = "GA 월별 실적 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sog",
|
||||
mappingId = "DIRECT_SOG_MONTHLY_PERFORMANCE",
|
||||
functionDescription = "GA 월별 실적 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 영업 업무에서 GA 월별 실적 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "GA 월별 실적 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"GA 월별 실적 조회 정보를 보여줘", "GA 월별 실적 조회 결과를 확인해줘", "현재 GA 월별 실적 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sog", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SogToolResponse getMonthlyPerformance(SogToolRequest request);
|
||||
|
||||
@McpTool(name = "sog_product_performance", title = "상품별 실적 조회", description = "상품별 실적 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sog",
|
||||
mappingId = "DIRECT_SOG_PRODUCT_PERFORMANCE",
|
||||
functionDescription = "상품별 실적 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 영업 업무에서 상품별 실적 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "상품별 실적 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"상품별 실적 조회 정보를 보여줘", "상품별 실적 조회 결과를 확인해줘", "현재 상품별 실적 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sog", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SogToolResponse getProductPerformance(SogToolRequest request);
|
||||
|
||||
@McpTool(name = "sog_new_contract_count", title = "신계약 건수 실적 조회", description = "신계약 건수 실적 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sog",
|
||||
mappingId = "DIRECT_SOG_NEW_CONTRACT_COUNT",
|
||||
functionDescription = "신계약 건수 실적 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 영업 업무에서 신계약 건수 실적 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "신계약 건수 실적 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"신계약 건수 실적 조회 정보를 보여줘", "신계약 건수 실적 조회 결과를 확인해줘", "현재 신계약 건수 실적 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sog", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SogToolResponse getNewContractCount(SogToolRequest request);
|
||||
|
||||
@McpTool(name = "sog_premium_performance", title = "보험료 실적 조회", description = "보험료 실적 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sog",
|
||||
mappingId = "DIRECT_SOG_PREMIUM_PERFORMANCE",
|
||||
functionDescription = "보험료 실적 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 영업 업무에서 보험료 실적 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "보험료 실적 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"보험료 실적 조회 정보를 보여줘", "보험료 실적 조회 결과를 확인해줘", "현재 보험료 실적 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sog", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SogToolResponse getPremiumPerformance(SogToolRequest request);
|
||||
|
||||
@McpTool(name = "sog_sales_ranking", title = "GA 영업 순위 조회", description = "GA 영업 순위 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sog",
|
||||
mappingId = "DIRECT_SOG_SALES_RANKING",
|
||||
functionDescription = "GA 영업 순위 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 영업 업무에서 GA 영업 순위 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "GA 영업 순위 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"GA 영업 순위 조회 정보를 보여줘", "GA 영업 순위 조회 결과를 확인해줘", "현재 GA 영업 순위 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sog", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SogToolResponse getSalesRanking(SogToolRequest request);
|
||||
|
||||
@McpTool(name = "sog_incentive_summary", title = "영업 인센티브 요약 조회", description = "영업 인센티브 요약 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sog",
|
||||
mappingId = "DIRECT_SOG_INCENTIVE_SUMMARY",
|
||||
functionDescription = "영업 인센티브 요약 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 영업 업무에서 영업 인센티브 요약 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "영업 인센티브 요약 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"영업 인센티브 요약 조회 정보를 보여줘", "영업 인센티브 요약 조회 결과를 확인해줘", "현재 영업 인센티브 요약 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sog", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SogToolResponse getIncentiveSummary(SogToolRequest request);
|
||||
|
||||
@McpTool(name = "sog_target_history", title = "영업목표 변경 이력 조회", description = "영업목표 변경 이력 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sog",
|
||||
mappingId = "DIRECT_SOG_TARGET_HISTORY",
|
||||
functionDescription = "영업목표 변경 이력 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 영업 업무에서 영업목표 변경 이력 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "영업목표 변경 이력 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"영업목표 변경 이력 조회 정보를 보여줘", "영업목표 변경 이력 조회 결과를 확인해줘", "현재 영업목표 변경 이력 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sog", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SogToolResponse getTargetHistory(SogToolRequest request);
|
||||
|
||||
@McpTool(name = "sog_performance_comparison", title = "전년 동기 대비 실적 비교 조회", description = "전년 동기 대비 실적 비교 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sog",
|
||||
mappingId = "DIRECT_SOG_PERFORMANCE_COMPARISON",
|
||||
functionDescription = "전년 동기 대비 실적 비교 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA 영업 업무에서 전년 동기 대비 실적 비교 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "전년 동기 대비 실적 비교 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"전년 동기 대비 실적 비교 조회 정보를 보여줘", "전년 동기 대비 실적 비교 조회 결과를 확인해줘", "현재 전년 동기 대비 실적 비교 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sog", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SogToolResponse getPerformanceComparison(SogToolRequest request);
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.sog.usecase.impl;
|
||||
|
||||
import io.shinhanlife.dat.mcc.biz.sog.dto.SogToolRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.sog.dto.SogToolResponse;
|
||||
import io.shinhanlife.dat.mcc.biz.sog.usecase.SogSalesPerformanceUseCase;
|
||||
import java.util.List;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class SogSalesPerformanceUseCaseImpl implements SogSalesPerformanceUseCase {
|
||||
@Override
|
||||
public SogToolResponse getTargetSummary(SogToolRequest request) {
|
||||
return mockResponse(request, "sog_target_summary", "GA 개인별 영업목표 요약 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SogToolResponse getTargetProgress(SogToolRequest request) {
|
||||
return mockResponse(request, "sog_target_progress", "영업목표 달성률 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SogToolResponse getMonthlyPerformance(SogToolRequest request) {
|
||||
return mockResponse(request, "sog_monthly_performance", "GA 월별 실적 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SogToolResponse getProductPerformance(SogToolRequest request) {
|
||||
return mockResponse(request, "sog_product_performance", "상품별 실적 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SogToolResponse getNewContractCount(SogToolRequest request) {
|
||||
return mockResponse(request, "sog_new_contract_count", "신계약 건수 실적 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SogToolResponse getPremiumPerformance(SogToolRequest request) {
|
||||
return mockResponse(request, "sog_premium_performance", "보험료 실적 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SogToolResponse getSalesRanking(SogToolRequest request) {
|
||||
return mockResponse(request, "sog_sales_ranking", "GA 영업 순위 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SogToolResponse getIncentiveSummary(SogToolRequest request) {
|
||||
return mockResponse(request, "sog_incentive_summary", "영업 인센티브 요약 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SogToolResponse getTargetHistory(SogToolRequest request) {
|
||||
return mockResponse(request, "sog_target_history", "영업목표 변경 이력 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SogToolResponse getPerformanceComparison(SogToolRequest request) {
|
||||
return mockResponse(request, "sog_performance_comparison", "전년 동기 대비 실적 비교 조회");
|
||||
}
|
||||
|
||||
private SogToolResponse mockResponse(SogToolRequest request, String toolName, String title) {
|
||||
SogToolResponse response = new SogToolResponse();
|
||||
response.setToolName(toolName);
|
||||
response.setCategory("SOG");
|
||||
response.setReferenceId(request != null && hasText(request.getAgentId()) ? request.getAgentId()
|
||||
: request != null && hasText(request.getOrganizationId()) ? request.getOrganizationId() : "SOG-000001");
|
||||
response.setStatus("정상");
|
||||
response.setSummary(title + " 결과");
|
||||
response.setAsOfDate(request != null && hasText(request.getQueryDate()) ? request.getQueryDate() : "2026-08-14");
|
||||
response.setDetails(List.of(title + " 모의 상세정보", "외부 시스템을 변경하지 않는 조회 결과"));
|
||||
return response;
|
||||
}
|
||||
|
||||
private boolean hasText(String value) {
|
||||
return value != null && !value.isBlank();
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.sot.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import org.springaicommunity.mcp.annotation.McpToolParam;
|
||||
|
||||
@Data
|
||||
public class SotToolRequest {
|
||||
@McpToolParam(description = "고객번호", required = false)
|
||||
@Schema(pattern = "^[A-Za-z0-9_-]{3,30}$")
|
||||
private String customerId;
|
||||
|
||||
@McpToolParam(description = "가입설계번호", required = false)
|
||||
@Schema(pattern = "^[A-Za-z0-9_-]{3,30}$")
|
||||
private String contractId;
|
||||
|
||||
@McpToolParam(description = "조회 기준일(YYYY-MM-DD)", required = false)
|
||||
@Schema(pattern = "^\\d{4}-\\d{2}-\\d{2}$")
|
||||
private String queryDate;
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.sot.dto;
|
||||
|
||||
import java.util.List;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class SotToolResponse {
|
||||
private String toolName;
|
||||
private String category;
|
||||
private String referenceId;
|
||||
private String status;
|
||||
private String summary;
|
||||
private String asOfDate;
|
||||
private List<String> details;
|
||||
}
|
||||
@@ -1,198 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.sot.usecase;
|
||||
|
||||
import io.shinhanlife.dat.lib.annotation.GrowToolHint;
|
||||
import io.shinhanlife.dat.mcc.biz.sot.dto.SotToolRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.sot.dto.SotToolResponse;
|
||||
import org.springaicommunity.mcp.annotation.McpTool;
|
||||
|
||||
public interface SotConsentUseCase {
|
||||
@McpTool(name = "sot_marketing_consent_status", title = "마케팅 수신동의 현황 조회", description = "마케팅 수신동의 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sot",
|
||||
mappingId = "DIRECT_SOT_MARKETING_CONSENT_STATUS",
|
||||
functionDescription = "마케팅 수신동의 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "텔레마케팅 동의 업무에서 마케팅 수신동의 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "마케팅 수신동의 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"마케팅 수신동의 현황 조회 정보를 보여줘", "마케팅 수신동의 현황 조회 결과를 확인해줘", "현재 마케팅 수신동의 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sot", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SotToolResponse getMarketingConsentStatus(SotToolRequest request);
|
||||
|
||||
@McpTool(name = "sot_marketing_consent_history", title = "마케팅 동의 이력 조회", description = "마케팅 동의 이력 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sot",
|
||||
mappingId = "DIRECT_SOT_MARKETING_CONSENT_HISTORY",
|
||||
functionDescription = "마케팅 동의 이력 조회 정보를 조회합니다.",
|
||||
whenToUse = "텔레마케팅 동의 업무에서 마케팅 동의 이력 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "마케팅 동의 이력 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"마케팅 동의 이력 조회 정보를 보여줘", "마케팅 동의 이력 조회 결과를 확인해줘", "현재 마케팅 동의 이력 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sot", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SotToolResponse getMarketingConsentHistory(SotToolRequest request);
|
||||
|
||||
@McpTool(name = "sot_marketing_consent_channel", title = "채널별 마케팅 동의 현황 조회", description = "채널별 마케팅 동의 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sot",
|
||||
mappingId = "DIRECT_SOT_MARKETING_CONSENT_CHANNEL",
|
||||
functionDescription = "채널별 마케팅 동의 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "텔레마케팅 동의 업무에서 채널별 마케팅 동의 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "채널별 마케팅 동의 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"채널별 마케팅 동의 현황 조회 정보를 보여줘", "채널별 마케팅 동의 현황 조회 결과를 확인해줘", "현재 채널별 마케팅 동의 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sot", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SotToolResponse getMarketingConsentChannel(SotToolRequest request);
|
||||
|
||||
@McpTool(name = "sot_subscription_design_consent", title = "가입설계 동의 현황 조회", description = "가입설계 동의 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sot",
|
||||
mappingId = "DIRECT_SOT_SUBSCRIPTION_DESIGN_CONSENT",
|
||||
functionDescription = "가입설계 동의 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "텔레마케팅 동의 업무에서 가입설계 동의 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "가입설계 동의 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"가입설계 동의 현황 조회 정보를 보여줘", "가입설계 동의 현황 조회 결과를 확인해줘", "현재 가입설계 동의 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sot", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SotToolResponse getSubscriptionDesignConsent(SotToolRequest request);
|
||||
|
||||
@McpTool(name = "sot_subscription_design_detail", title = "가입설계 동의 상세 조회", description = "가입설계 동의 상세 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sot",
|
||||
mappingId = "DIRECT_SOT_SUBSCRIPTION_DESIGN_DETAIL",
|
||||
functionDescription = "가입설계 동의 상세 조회 정보를 조회합니다.",
|
||||
whenToUse = "텔레마케팅 동의 업무에서 가입설계 동의 상세 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "가입설계 동의 상세 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"가입설계 동의 상세 조회 정보를 보여줘", "가입설계 동의 상세 조회 결과를 확인해줘", "현재 가입설계 동의 상세 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sot", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SotToolResponse getSubscriptionDesignDetail(SotToolRequest request);
|
||||
|
||||
@McpTool(name = "sot_customer_info_consent", title = "고객정보 수집·이용 동의 현황 조회", description = "고객정보 수집·이용 동의 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sot",
|
||||
mappingId = "DIRECT_SOT_CUSTOMER_INFO_CONSENT",
|
||||
functionDescription = "고객정보 수집·이용 동의 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "텔레마케팅 동의 업무에서 고객정보 수집·이용 동의 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "고객정보 수집·이용 동의 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"고객정보 수집·이용 동의 현황 조회 정보를 보여줘", "고객정보 수집·이용 동의 현황 조회 결과를 확인해줘", "현재 고객정보 수집·이용 동의 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sot", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SotToolResponse getCustomerInfoConsent(SotToolRequest request);
|
||||
|
||||
@McpTool(name = "sot_customer_info_consent_scope", title = "고객정보 동의 범위 조회", description = "고객정보 동의 범위 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sot",
|
||||
mappingId = "DIRECT_SOT_CUSTOMER_INFO_CONSENT_SCOPE",
|
||||
functionDescription = "고객정보 동의 범위 조회 정보를 조회합니다.",
|
||||
whenToUse = "텔레마케팅 동의 업무에서 고객정보 동의 범위 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "고객정보 동의 범위 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"고객정보 동의 범위 조회 정보를 보여줘", "고객정보 동의 범위 조회 결과를 확인해줘", "현재 고객정보 동의 범위 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sot", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SotToolResponse getCustomerInfoConsentScope(SotToolRequest request);
|
||||
|
||||
@McpTool(name = "sot_consent_expiry", title = "동의 유효기간 만료 현황 조회", description = "동의 유효기간 만료 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sot",
|
||||
mappingId = "DIRECT_SOT_CONSENT_EXPIRY",
|
||||
functionDescription = "동의 유효기간 만료 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "텔레마케팅 동의 업무에서 동의 유효기간 만료 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "동의 유효기간 만료 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"동의 유효기간 만료 현황 조회 정보를 보여줘", "동의 유효기간 만료 현황 조회 결과를 확인해줘", "현재 동의 유효기간 만료 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sot", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SotToolResponse getConsentExpiry(SotToolRequest request);
|
||||
|
||||
@McpTool(name = "sot_consent_withdrawal", title = "동의 철회 이력 조회", description = "동의 철회 이력 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sot",
|
||||
mappingId = "DIRECT_SOT_CONSENT_WITHDRAWAL",
|
||||
functionDescription = "동의 철회 이력 조회 정보를 조회합니다.",
|
||||
whenToUse = "텔레마케팅 동의 업무에서 동의 철회 이력 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "동의 철회 이력 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"동의 철회 이력 조회 정보를 보여줘", "동의 철회 이력 조회 결과를 확인해줘", "현재 동의 철회 이력 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sot", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SotToolResponse getConsentWithdrawal(SotToolRequest request);
|
||||
|
||||
@McpTool(name = "sot_tm_call_eligibility", title = "텔레마케팅 콜 가능여부 종합 조회", description = "텔레마케팅 콜 가능여부 종합 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "sot",
|
||||
mappingId = "DIRECT_SOT_TM_CALL_ELIGIBILITY",
|
||||
functionDescription = "텔레마케팅 콜 가능여부 종합 조회 정보를 조회합니다.",
|
||||
whenToUse = "텔레마케팅 동의 업무에서 텔레마케팅 콜 가능여부 종합 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "텔레마케팅 콜 가능여부 종합 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"텔레마케팅 콜 가능여부 종합 조회 정보를 보여줘", "텔레마케팅 콜 가능여부 종합 조회 결과를 확인해줘", "현재 텔레마케팅 콜 가능여부 종합 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"sot", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SotToolResponse getTmCallEligibility(SotToolRequest request);
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.sot.usecase.impl;
|
||||
|
||||
import io.shinhanlife.dat.mcc.biz.sot.dto.SotToolRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.sot.dto.SotToolResponse;
|
||||
import io.shinhanlife.dat.mcc.biz.sot.usecase.SotConsentUseCase;
|
||||
import java.util.List;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class SotConsentUseCaseImpl implements SotConsentUseCase {
|
||||
@Override
|
||||
public SotToolResponse getMarketingConsentStatus(SotToolRequest request) {
|
||||
return mockResponse(request, "sot_marketing_consent_status", "마케팅 수신동의 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SotToolResponse getMarketingConsentHistory(SotToolRequest request) {
|
||||
return mockResponse(request, "sot_marketing_consent_history", "마케팅 동의 이력 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SotToolResponse getMarketingConsentChannel(SotToolRequest request) {
|
||||
return mockResponse(request, "sot_marketing_consent_channel", "채널별 마케팅 동의 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SotToolResponse getSubscriptionDesignConsent(SotToolRequest request) {
|
||||
return mockResponse(request, "sot_subscription_design_consent", "가입설계 동의 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SotToolResponse getSubscriptionDesignDetail(SotToolRequest request) {
|
||||
return mockResponse(request, "sot_subscription_design_detail", "가입설계 동의 상세 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SotToolResponse getCustomerInfoConsent(SotToolRequest request) {
|
||||
return mockResponse(request, "sot_customer_info_consent", "고객정보 수집·이용 동의 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SotToolResponse getCustomerInfoConsentScope(SotToolRequest request) {
|
||||
return mockResponse(request, "sot_customer_info_consent_scope", "고객정보 동의 범위 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SotToolResponse getConsentExpiry(SotToolRequest request) {
|
||||
return mockResponse(request, "sot_consent_expiry", "동의 유효기간 만료 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SotToolResponse getConsentWithdrawal(SotToolRequest request) {
|
||||
return mockResponse(request, "sot_consent_withdrawal", "동의 철회 이력 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SotToolResponse getTmCallEligibility(SotToolRequest request) {
|
||||
return mockResponse(request, "sot_tm_call_eligibility", "텔레마케팅 콜 가능여부 종합 조회");
|
||||
}
|
||||
|
||||
private SotToolResponse mockResponse(SotToolRequest request, String toolName, String title) {
|
||||
SotToolResponse response = new SotToolResponse();
|
||||
response.setToolName(toolName);
|
||||
response.setCategory("SOT");
|
||||
response.setReferenceId(request != null && hasText(request.getCustomerId()) ? request.getCustomerId()
|
||||
: request != null && hasText(request.getContractId()) ? request.getContractId() : "SOT-000001");
|
||||
response.setStatus("정상");
|
||||
response.setSummary(title + " 결과");
|
||||
response.setAsOfDate(request != null && hasText(request.getQueryDate()) ? request.getQueryDate() : "2026-08-14");
|
||||
response.setDetails(List.of(title + " 모의 상세정보", "외부 시스템을 변경하지 않는 조회 결과"));
|
||||
return response;
|
||||
}
|
||||
|
||||
private boolean hasText(String value) {
|
||||
return value != null && !value.isBlank();
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.spr.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import org.springaicommunity.mcp.annotation.McpToolParam;
|
||||
|
||||
@Data
|
||||
public class SprToolRequest {
|
||||
@McpToolParam(description = "현장문의번호", required = false)
|
||||
@Schema(pattern = "^[A-Za-z0-9_-]{3,30}$")
|
||||
private String inquiryId;
|
||||
|
||||
@McpToolParam(description = "설계사번호", required = false)
|
||||
@Schema(pattern = "^[A-Za-z0-9_-]{3,30}$")
|
||||
private String agentId;
|
||||
|
||||
@McpToolParam(description = "조회 기준일(YYYY-MM-DD)", required = false)
|
||||
@Schema(pattern = "^\\d{4}-\\d{2}-\\d{2}$")
|
||||
private String queryDate;
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.spr.dto;
|
||||
|
||||
import java.util.List;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class SprToolResponse {
|
||||
private String toolName;
|
||||
private String category;
|
||||
private String referenceId;
|
||||
private String status;
|
||||
private String summary;
|
||||
private String asOfDate;
|
||||
private List<String> details;
|
||||
}
|
||||
@@ -1,198 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.spr.usecase;
|
||||
|
||||
import io.shinhanlife.dat.lib.annotation.GrowToolHint;
|
||||
import io.shinhanlife.dat.mcc.biz.spr.dto.SprToolRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.spr.dto.SprToolResponse;
|
||||
import org.springaicommunity.mcp.annotation.McpTool;
|
||||
|
||||
public interface SprFieldInquiryUseCase {
|
||||
@McpTool(name = "spr_field_inquiry_list", title = "GA현장문의 목록 조회", description = "GA현장문의 목록 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "spr",
|
||||
mappingId = "DIRECT_SPR_FIELD_INQUIRY_LIST",
|
||||
functionDescription = "GA현장문의 목록 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA현장지원 업무에서 GA현장문의 목록 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "GA현장문의 목록 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"GA현장문의 목록 조회 정보를 보여줘", "GA현장문의 목록 조회 결과를 확인해줘", "현재 GA현장문의 목록 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"spr", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SprToolResponse getFieldInquiryList(SprToolRequest request);
|
||||
|
||||
@McpTool(name = "spr_field_inquiry_detail", title = "GA현장문의 상세 조회", description = "GA현장문의 상세 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "spr",
|
||||
mappingId = "DIRECT_SPR_FIELD_INQUIRY_DETAIL",
|
||||
functionDescription = "GA현장문의 상세 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA현장지원 업무에서 GA현장문의 상세 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "GA현장문의 상세 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"GA현장문의 상세 조회 정보를 보여줘", "GA현장문의 상세 조회 결과를 확인해줘", "현재 GA현장문의 상세 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"spr", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SprToolResponse getFieldInquiryDetail(SprToolRequest request);
|
||||
|
||||
@McpTool(name = "spr_field_inquiry_status", title = "문의 처리상태 조회", description = "문의 처리상태 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "spr",
|
||||
mappingId = "DIRECT_SPR_FIELD_INQUIRY_STATUS",
|
||||
functionDescription = "문의 처리상태 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA현장지원 업무에서 문의 처리상태 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "문의 처리상태 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"문의 처리상태 조회 정보를 보여줘", "문의 처리상태 조회 결과를 확인해줘", "현재 문의 처리상태 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"spr", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SprToolResponse getFieldInquiryStatus(SprToolRequest request);
|
||||
|
||||
@McpTool(name = "spr_field_inquiry_category", title = "문의 유형별 통계 조회", description = "문의 유형별 통계 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "spr",
|
||||
mappingId = "DIRECT_SPR_FIELD_INQUIRY_CATEGORY",
|
||||
functionDescription = "문의 유형별 통계 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA현장지원 업무에서 문의 유형별 통계 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "문의 유형별 통계 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"문의 유형별 통계 조회 정보를 보여줘", "문의 유형별 통계 조회 결과를 확인해줘", "현재 문의 유형별 통계 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"spr", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SprToolResponse getFieldInquiryCategory(SprToolRequest request);
|
||||
|
||||
@McpTool(name = "spr_field_inquiry_answer", title = "문의 답변 조회", description = "문의 답변 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "spr",
|
||||
mappingId = "DIRECT_SPR_FIELD_INQUIRY_ANSWER",
|
||||
functionDescription = "문의 답변 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA현장지원 업무에서 문의 답변 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "문의 답변 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"문의 답변 조회 정보를 보여줘", "문의 답변 조회 결과를 확인해줘", "현재 문의 답변 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"spr", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SprToolResponse getFieldInquiryAnswer(SprToolRequest request);
|
||||
|
||||
@McpTool(name = "spr_field_inquiry_escalation", title = "에스컬레이션 현황 조회", description = "에스컬레이션 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "spr",
|
||||
mappingId = "DIRECT_SPR_FIELD_INQUIRY_ESCALATION",
|
||||
functionDescription = "에스컬레이션 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA현장지원 업무에서 에스컬레이션 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "에스컬레이션 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"에스컬레이션 현황 조회 정보를 보여줘", "에스컬레이션 현황 조회 결과를 확인해줘", "현재 에스컬레이션 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"spr", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SprToolResponse getFieldInquiryEscalation(SprToolRequest request);
|
||||
|
||||
@McpTool(name = "spr_field_inquiry_faq", title = "자주묻는질문 FAQ 조회", description = "자주묻는질문 FAQ 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "spr",
|
||||
mappingId = "DIRECT_SPR_FIELD_INQUIRY_FAQ",
|
||||
functionDescription = "자주묻는질문 FAQ 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA현장지원 업무에서 자주묻는질문 FAQ 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "자주묻는질문 FAQ 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"자주묻는질문 FAQ 조회 정보를 보여줘", "자주묻는질문 FAQ 조회 결과를 확인해줘", "현재 자주묻는질문 FAQ 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"spr", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SprToolResponse getFieldInquiryFaq(SprToolRequest request);
|
||||
|
||||
@McpTool(name = "spr_field_inquiry_manager", title = "담당자 배정 현황 조회", description = "담당자 배정 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "spr",
|
||||
mappingId = "DIRECT_SPR_FIELD_INQUIRY_MANAGER",
|
||||
functionDescription = "담당자 배정 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA현장지원 업무에서 담당자 배정 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "담당자 배정 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"담당자 배정 현황 조회 정보를 보여줘", "담당자 배정 현황 조회 결과를 확인해줘", "현재 담당자 배정 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"spr", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SprToolResponse getFieldInquiryManager(SprToolRequest request);
|
||||
|
||||
@McpTool(name = "spr_field_inquiry_sla", title = "처리기한 SLA 현황 조회", description = "처리기한 SLA 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "spr",
|
||||
mappingId = "DIRECT_SPR_FIELD_INQUIRY_SLA",
|
||||
functionDescription = "처리기한 SLA 현황 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA현장지원 업무에서 처리기한 SLA 현황 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "처리기한 SLA 현황 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"처리기한 SLA 현황 조회 정보를 보여줘", "처리기한 SLA 현황 조회 결과를 확인해줘", "현재 처리기한 SLA 현황 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"spr", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SprToolResponse getFieldInquirySla(SprToolRequest request);
|
||||
|
||||
@McpTool(name = "spr_field_inquiry_satisfaction", title = "문의 만족도 조사 결과 조회", description = "문의 만족도 조사 결과 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
annotations = @McpTool.McpAnnotations(openWorldHint = false))
|
||||
@GrowToolHint(
|
||||
requiresApproval = false,
|
||||
categoryKey = "spr",
|
||||
mappingId = "DIRECT_SPR_FIELD_INQUIRY_SATISFACTION",
|
||||
functionDescription = "문의 만족도 조사 결과 조회 정보를 조회합니다.",
|
||||
whenToUse = "GA현장지원 업무에서 문의 만족도 조사 결과 조회 정보가 필요할 때 사용합니다.",
|
||||
whenNotToUse = "정보 변경, 승인 또는 실제 업무처리에는 사용하지 않습니다.",
|
||||
ioLimits = "입력 식별자에 대한 모의 조회 데이터만 반환하며 외부 시스템을 변경하지 않습니다.",
|
||||
displayDescription = "문의 만족도 조사 결과 조회 정보를 안전한 모의 데이터로 제공합니다.",
|
||||
exampleQueries = {"문의 만족도 조사 결과 조회 정보를 보여줘", "문의 만족도 조사 결과 조회 결과를 확인해줘", "현재 문의 만족도 조사 결과 조회 내용을 알려줘"},
|
||||
destructive = false,
|
||||
idempotent = true,
|
||||
tags = {"spr", "조회", "mock"},
|
||||
ownerOrg = "MCP_TOOL"
|
||||
)
|
||||
SprToolResponse getFieldInquirySatisfaction(SprToolRequest request);
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.biz.spr.usecase.impl;
|
||||
|
||||
import io.shinhanlife.dat.mcc.biz.spr.dto.SprToolRequest;
|
||||
import io.shinhanlife.dat.mcc.biz.spr.dto.SprToolResponse;
|
||||
import io.shinhanlife.dat.mcc.biz.spr.usecase.SprFieldInquiryUseCase;
|
||||
import java.util.List;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class SprFieldInquiryUseCaseImpl implements SprFieldInquiryUseCase {
|
||||
@Override
|
||||
public SprToolResponse getFieldInquiryList(SprToolRequest request) {
|
||||
return mockResponse(request, "spr_field_inquiry_list", "GA현장문의 목록 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SprToolResponse getFieldInquiryDetail(SprToolRequest request) {
|
||||
return mockResponse(request, "spr_field_inquiry_detail", "GA현장문의 상세 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SprToolResponse getFieldInquiryStatus(SprToolRequest request) {
|
||||
return mockResponse(request, "spr_field_inquiry_status", "문의 처리상태 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SprToolResponse getFieldInquiryCategory(SprToolRequest request) {
|
||||
return mockResponse(request, "spr_field_inquiry_category", "문의 유형별 통계 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SprToolResponse getFieldInquiryAnswer(SprToolRequest request) {
|
||||
return mockResponse(request, "spr_field_inquiry_answer", "문의 답변 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SprToolResponse getFieldInquiryEscalation(SprToolRequest request) {
|
||||
return mockResponse(request, "spr_field_inquiry_escalation", "에스컬레이션 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SprToolResponse getFieldInquiryFaq(SprToolRequest request) {
|
||||
return mockResponse(request, "spr_field_inquiry_faq", "자주묻는질문 FAQ 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SprToolResponse getFieldInquiryManager(SprToolRequest request) {
|
||||
return mockResponse(request, "spr_field_inquiry_manager", "담당자 배정 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SprToolResponse getFieldInquirySla(SprToolRequest request) {
|
||||
return mockResponse(request, "spr_field_inquiry_sla", "처리기한 SLA 현황 조회");
|
||||
}
|
||||
|
||||
@Override
|
||||
public SprToolResponse getFieldInquirySatisfaction(SprToolRequest request) {
|
||||
return mockResponse(request, "spr_field_inquiry_satisfaction", "문의 만족도 조사 결과 조회");
|
||||
}
|
||||
|
||||
private SprToolResponse mockResponse(SprToolRequest request, String toolName, String title) {
|
||||
SprToolResponse response = new SprToolResponse();
|
||||
response.setToolName(toolName);
|
||||
response.setCategory("SPR");
|
||||
response.setReferenceId(request != null && hasText(request.getInquiryId()) ? request.getInquiryId()
|
||||
: request != null && hasText(request.getAgentId()) ? request.getAgentId() : "SPR-000001");
|
||||
response.setStatus("정상");
|
||||
response.setSummary(title + " 결과");
|
||||
response.setAsOfDate(request != null && hasText(request.getQueryDate()) ? request.getQueryDate() : "2026-08-14");
|
||||
response.setDetails(List.of(title + " 모의 상세정보", "외부 시스템을 변경하지 않는 조회 결과"));
|
||||
return response;
|
||||
}
|
||||
|
||||
private boolean hasText(String value) {
|
||||
return value != null && !value.isBlank();
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.infra.itrf.http.memo;
|
||||
|
||||
import io.shinhanlife.dat.lib.integration.http.component.AxhubHttpComponent;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class MemoClient {
|
||||
private static final String API_NAME = "memo";
|
||||
|
||||
private final AxhubHttpComponent http;
|
||||
|
||||
public <I, O> O call(I request, Class<O> responseType) {
|
||||
return http.call(API_NAME, request, responseType);
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.infra.itrf.http.memo.io;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class MemoListRetrieverHttpRequest {
|
||||
@Schema(description = "조회할 의뢰서 상태", example = "OPEN", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String memoStatus;
|
||||
|
||||
@Schema(description = "검색 키워드", example = "프로젝트", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String searchKeyword;
|
||||
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.infra.itrf.http.memo.io;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class MemoListRetrieverHttpResponse {
|
||||
private String resultCode;
|
||||
|
||||
private String resultMessage;
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.infra.itrf.mci.ncla;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import io.shinhanlife.dat.lib.integration.mci.component.AxhubMciComponent;
|
||||
import io.shinhanlife.glow.communication.dto.Transfer;
|
||||
|
||||
/**
|
||||
* @package io.shinhanlife.dat.mcc.infra.itrf.mci.ncla
|
||||
* @className MciNclaClient
|
||||
* @description AX HUB 시스템 처리 클래스
|
||||
* @author jade
|
||||
* @create 2026.08.10
|
||||
* <pre>
|
||||
* ---------- 개정이력 ----------
|
||||
* 수정일 수정자 수정내용
|
||||
* ---------- -------- ---------------------------
|
||||
* 2026.08.10 jade 최초생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class MciNclaClient {
|
||||
private final AxhubMciComponent mci;
|
||||
|
||||
public <O> Transfer<O> callTo(String interfaceId, String dummy, Object mciReq, Class<O> resType) {
|
||||
return mci.callTo(interfaceId, dummy, mciReq, resType);
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.infra.itrf.mci.ncla.io;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class CLCNNB00001_I {
|
||||
@Schema(description = "보험금 청구번호", example = "CLM202608100001", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String claimNo;
|
||||
|
||||
@Schema(description = "보험 계약번호", example = "10023456789")
|
||||
private String contractNo;
|
||||
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package io.shinhanlife.dat.mcc.infra.itrf.mci.ncla.io;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class CLCNNB00001_O {
|
||||
@Schema(description = "청구 처리 상태 코드", example = "RECEIVED", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String status;
|
||||
|
||||
@Schema(description = "청구 처리 상태명", example = "접수", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String statusLabel;
|
||||
|
||||
@Schema(description = "승인 금액", example = "150000")
|
||||
private Long approvedAmount;
|
||||
|
||||
}
|
||||
@@ -1,31 +1,27 @@
|
||||
package io.shinhanlife.dat.mcc.sal;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
|
||||
import org.springframework.cache.annotation.EnableCaching;
|
||||
|
||||
/**
|
||||
* @package io.shinhanlife.dat.mcc.sal
|
||||
* @className DatWasSalApplication
|
||||
* @description AX HUB 시스템 처리 클래스
|
||||
* @author 0986406
|
||||
* @create 2026.09.01
|
||||
* @author jade
|
||||
* @create 2026.09.08
|
||||
* <pre>
|
||||
* ---------- 개정이력 ----------
|
||||
* 수정일 수정자 수정내용
|
||||
* ---------- -------- ---------------------------
|
||||
* 2026.09.01 0986406 최초생성
|
||||
*
|
||||
* 2026.09.08 jade 최초생성
|
||||
*
|
||||
* </pre>
|
||||
*/
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
|
||||
import org.springframework.cache.annotation.EnableCaching;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import io.shinhanlife.dat.lib.mcp.ToolMcpServerConfiguration;
|
||||
|
||||
@SpringBootApplication(scanBasePackages = {"io.shinhanlife.dat.mcc", "io.shinhanlife.dat.lib"})
|
||||
@ConfigurationPropertiesScan(basePackages = {"io.shinhanlife.dat.mcc", "io.shinhanlife.dat.lib"})
|
||||
@EnableCaching
|
||||
@Import(ToolMcpServerConfiguration.class)
|
||||
public class DatWasSalApplication {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(DatWasSalApplication.class, args);
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
# OCI 클라우드 개발 환경 전용 설정
|
||||
server:
|
||||
port: ${PORT:8082}
|
||||
|
||||
axhub:
|
||||
gateway:
|
||||
url: https://axhubmcp.devjun.net
|
||||
port: ${PORT:8083}
|
||||
|
||||
spring:
|
||||
config:
|
||||
activate:
|
||||
on-profile: dev
|
||||
import:
|
||||
- classpath:application-core-dev.yml
|
||||
- classpath:glow/application-glow.yml
|
||||
- classpath:glow/application-glow-dev.yml
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# Local 환경 전용 설정 (H2 메모리 DB 등)
|
||||
spring:
|
||||
config:
|
||||
activate:
|
||||
@@ -6,7 +5,3 @@ spring:
|
||||
import:
|
||||
- classpath:glow/application-glow.yml
|
||||
- classpath:glow/application-glow-local.yml
|
||||
|
||||
axhub:
|
||||
tool:
|
||||
url: ${AXHUB_TOOL_URL:http://localhost:${server.port}}
|
||||
|
||||
@@ -1,16 +1,11 @@
|
||||
server:
|
||||
port: ${PORT:8082}
|
||||
port: ${PORT:8083}
|
||||
|
||||
spring:
|
||||
config:
|
||||
activate:
|
||||
on-profile: prod
|
||||
import:
|
||||
- classpath:application-core-prod.yml
|
||||
- classpath:glow/application-glow.yml
|
||||
- classpath:glow/application-glow-prod.yml
|
||||
|
||||
axhub:
|
||||
gateway:
|
||||
url: ${AXHUB_GATEWAY_URL}
|
||||
tool:
|
||||
url: ${AXHUB_TOOL_URL}
|
||||
@@ -1,16 +1,11 @@
|
||||
server:
|
||||
port: ${PORT:8082}
|
||||
port: ${PORT:8083}
|
||||
|
||||
spring:
|
||||
config:
|
||||
activate:
|
||||
on-profile: test
|
||||
import:
|
||||
- classpath:application-core-test.yml
|
||||
- classpath:glow/application-glow.yml
|
||||
- classpath:glow/application-glow-test.yml
|
||||
|
||||
axhub:
|
||||
gateway:
|
||||
url: ${AXHUB_GATEWAY_URL}
|
||||
tool:
|
||||
url: ${AXHUB_TOOL_URL}
|
||||
@@ -1,5 +1,5 @@
|
||||
server:
|
||||
port: 8082
|
||||
port: 8083
|
||||
spring:
|
||||
application:
|
||||
name: dat-was-sal
|
||||
@@ -13,8 +13,7 @@ logging:
|
||||
mcp:
|
||||
namespace: ""
|
||||
manifest:
|
||||
bundle-id: was-sal
|
||||
# Set the AA-assigned prefix before MCP pull activation (for example: sal.).
|
||||
bundle-id: dat-was-sal
|
||||
name-prefix: ""
|
||||
security:
|
||||
api-key: ${TOOL_SERVER_API_KEY:tool-server-key}
|
||||
|
||||
@@ -1,41 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
|
||||
<!-- 1. 로그 패턴 설정 (MDC traceId 포함) -->
|
||||
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n" />
|
||||
|
||||
<!-- 2. 콘솔(Console) 출력 설정 (로컬 개발용) -->
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>${LOG_PATTERN}</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!-- 3. 파일(File) 출력 설정 (서버 운영용) -->
|
||||
<!-- Logback에서 시스템 Hostname을 가져오기 위한 설정 -->
|
||||
<property name="HOSTNAME" value="${HOSTNAME}" />
|
||||
|
||||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>/swlog/dat-was-sal/A01/${HOSTNAME}_A01.log</file> <!-- 현재 로그가 쌓이는 파일 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||
<!-- 매일 자정에 날짜를 붙여서 지난 로그를 분리 저장 -->
|
||||
<fileNamePattern>/swlog/dat-was-sal/A01/${HOSTNAME}_A01_%d{yyyyMMdd}.%i.log</fileNamePattern>
|
||||
<!-- 개별 로그 파일 크기를 100MB로 제한하고, 전체 보관 일수는 30일, 총 로그 누적 용량은 1GB로 제한 -->
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
<file>logs/dat-was-sal.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>logs/dat-was-sal-%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<maxHistory>30</maxHistory>
|
||||
<totalSizeCap>1GB</totalSizeCap>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>${LOG_PATTERN}</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!-- 4. 기본 로깅 레벨 설정 -->
|
||||
<root level="INFO">
|
||||
<appender-ref ref="CONSOLE" />
|
||||
<appender-ref ref="FILE" />
|
||||
</root>
|
||||
|
||||
<!-- 5. 우리 프로젝트 패키지는 디버그 레벨까지 상세히 보기 -->
|
||||
<logger name="io.shinhanlife" level="DEBUG" />
|
||||
</configuration>
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"lic_contract_review_document\",\"category\":\"LIC\",\"referenceId\":\"LIC-000001\",\"status\":\"정상\",\"summary\":\"계약심사 제출서류 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"계약심사 제출서류 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"lic_contract_review_history\",\"category\":\"LIC\",\"referenceId\":\"LIC-000001\",\"status\":\"정상\",\"summary\":\"계약심사 이력 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"계약심사 이력 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"lic_contract_review_result\",\"category\":\"LIC\",\"referenceId\":\"LIC-000001\",\"status\":\"정상\",\"summary\":\"계약심사 결과 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"계약심사 결과 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"lic_contract_review_status\",\"category\":\"LIC\",\"referenceId\":\"LIC-000001\",\"status\":\"정상\",\"summary\":\"계약심사 진행상태 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"계약심사 진행상태 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"lic_product_coverage\",\"category\":\"LIC\",\"referenceId\":\"LIC-000001\",\"status\":\"정상\",\"summary\":\"상품 보장내용 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"상품 보장내용 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"lic_product_info\",\"category\":\"LIC\",\"referenceId\":\"LIC-000001\",\"status\":\"정상\",\"summary\":\"상품 정보 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"상품 정보 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"lic_product_premium_table\",\"category\":\"LIC\",\"referenceId\":\"LIC-000001\",\"status\":\"정상\",\"summary\":\"상품 보험료 요율표 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"상품 보험료 요율표 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"lic_underwriting_additional_request\",\"category\":\"LIC\",\"referenceId\":\"LIC-000001\",\"status\":\"정상\",\"summary\":\"언더라이팅 추가자료 요청 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"언더라이팅 추가자료 요청 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"lic_underwriting_result\",\"category\":\"LIC\",\"referenceId\":\"LIC-000001\",\"status\":\"정상\",\"summary\":\"언더라이팅 인수심사 결과 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"언더라이팅 인수심사 결과 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"lic_underwriting_risk_grade\",\"category\":\"LIC\",\"referenceId\":\"LIC-000001\",\"status\":\"정상\",\"summary\":\"언더라이팅 위험등급 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"언더라이팅 위험등급 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"status" : "RECEIVED",
|
||||
"statusLabel" : "접수",
|
||||
"approvedAmount" : 150000
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sof_activity_calendar\",\"category\":\"SOF\",\"referenceId\":\"SOF-000001\",\"status\":\"정상\",\"summary\":\"활동 일정 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"활동 일정 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sof_activity_daily\",\"category\":\"SOF\",\"referenceId\":\"SOF-000001\",\"status\":\"정상\",\"summary\":\"GA 일별 활동 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"GA 일별 활동 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sof_activity_report_status\",\"category\":\"SOF\",\"referenceId\":\"SOF-000001\",\"status\":\"정상\",\"summary\":\"활동일지 제출 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"활동일지 제출 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sof_activity_summary\",\"category\":\"SOF\",\"referenceId\":\"SOF-000001\",\"status\":\"정상\",\"summary\":\"GA 활동 종합 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"GA 활동 종합 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sof_call_activity\",\"category\":\"SOF\",\"referenceId\":\"SOF-000001\",\"status\":\"정상\",\"summary\":\"콜 활동 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"콜 활동 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sof_customer_consulting\",\"category\":\"SOF\",\"referenceId\":\"SOF-000001\",\"status\":\"정상\",\"summary\":\"고객 상담 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"고객 상담 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sof_field_support_request\",\"category\":\"SOF\",\"referenceId\":\"SOF-000001\",\"status\":\"정상\",\"summary\":\"현장 지원 요청 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"현장 지원 요청 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sof_prospect_list\",\"category\":\"SOF\",\"referenceId\":\"SOF-000001\",\"status\":\"정상\",\"summary\":\"신규 발굴 고객 목록 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"신규 발굴 고객 목록 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sof_training_completion\",\"category\":\"SOF\",\"referenceId\":\"SOF-000001\",\"status\":\"정상\",\"summary\":\"교육 이수 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"교육 이수 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sof_visit_count\",\"category\":\"SOF\",\"referenceId\":\"SOF-000001\",\"status\":\"정상\",\"summary\":\"고객 방문 건수 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"고객 방문 건수 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sog_incentive_summary\",\"category\":\"SOG\",\"referenceId\":\"SOG-000001\",\"status\":\"정상\",\"summary\":\"영업 인센티브 요약 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"영업 인센티브 요약 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sog_monthly_performance\",\"category\":\"SOG\",\"referenceId\":\"SOG-000001\",\"status\":\"정상\",\"summary\":\"GA 월별 실적 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"GA 월별 실적 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sog_new_contract_count\",\"category\":\"SOG\",\"referenceId\":\"SOG-000001\",\"status\":\"정상\",\"summary\":\"신계약 건수 실적 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"신계약 건수 실적 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sog_performance_comparison\",\"category\":\"SOG\",\"referenceId\":\"SOG-000001\",\"status\":\"정상\",\"summary\":\"전년 동기 대비 실적 비교 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"전년 동기 대비 실적 비교 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sog_premium_performance\",\"category\":\"SOG\",\"referenceId\":\"SOG-000001\",\"status\":\"정상\",\"summary\":\"보험료 실적 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"보험료 실적 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sog_product_performance\",\"category\":\"SOG\",\"referenceId\":\"SOG-000001\",\"status\":\"정상\",\"summary\":\"상품별 실적 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"상품별 실적 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sog_sales_ranking\",\"category\":\"SOG\",\"referenceId\":\"SOG-000001\",\"status\":\"정상\",\"summary\":\"GA 영업 순위 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"GA 영업 순위 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sog_target_history\",\"category\":\"SOG\",\"referenceId\":\"SOG-000001\",\"status\":\"정상\",\"summary\":\"영업목표 변경 이력 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"영업목표 변경 이력 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sog_target_progress\",\"category\":\"SOG\",\"referenceId\":\"SOG-000001\",\"status\":\"정상\",\"summary\":\"영업목표 달성률 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"영업목표 달성률 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sog_target_summary\",\"category\":\"SOG\",\"referenceId\":\"SOG-000001\",\"status\":\"정상\",\"summary\":\"GA 개인별 영업목표 요약 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"GA 개인별 영업목표 요약 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sot_consent_expiry\",\"category\":\"SOT\",\"referenceId\":\"SOT-000001\",\"status\":\"정상\",\"summary\":\"동의 유효기간 만료 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"동의 유효기간 만료 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sot_consent_withdrawal\",\"category\":\"SOT\",\"referenceId\":\"SOT-000001\",\"status\":\"정상\",\"summary\":\"동의 철회 이력 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"동의 철회 이력 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sot_customer_info_consent\",\"category\":\"SOT\",\"referenceId\":\"SOT-000001\",\"status\":\"정상\",\"summary\":\"고객정보 수집·이용 동의 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"고객정보 수집·이용 동의 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sot_customer_info_consent_scope\",\"category\":\"SOT\",\"referenceId\":\"SOT-000001\",\"status\":\"정상\",\"summary\":\"고객정보 동의 범위 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"고객정보 동의 범위 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sot_marketing_consent_channel\",\"category\":\"SOT\",\"referenceId\":\"SOT-000001\",\"status\":\"정상\",\"summary\":\"채널별 마케팅 동의 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"채널별 마케팅 동의 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sot_marketing_consent_history\",\"category\":\"SOT\",\"referenceId\":\"SOT-000001\",\"status\":\"정상\",\"summary\":\"마케팅 동의 이력 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"마케팅 동의 이력 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sot_marketing_consent_status\",\"category\":\"SOT\",\"referenceId\":\"SOT-000001\",\"status\":\"정상\",\"summary\":\"마케팅 수신동의 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"마케팅 수신동의 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sot_subscription_design_consent\",\"category\":\"SOT\",\"referenceId\":\"SOT-000001\",\"status\":\"정상\",\"summary\":\"가입설계 동의 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"가입설계 동의 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sot_subscription_design_detail\",\"category\":\"SOT\",\"referenceId\":\"SOT-000001\",\"status\":\"정상\",\"summary\":\"가입설계 동의 상세 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"가입설계 동의 상세 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"sot_tm_call_eligibility\",\"category\":\"SOT\",\"referenceId\":\"SOT-000001\",\"status\":\"정상\",\"summary\":\"텔레마케팅 콜 가능여부 종합 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"텔레마케팅 콜 가능여부 종합 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"spr_field_inquiry_answer\",\"category\":\"SPR\",\"referenceId\":\"SPR-000001\",\"status\":\"정상\",\"summary\":\"문의 답변 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"문의 답변 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"spr_field_inquiry_category\",\"category\":\"SPR\",\"referenceId\":\"SPR-000001\",\"status\":\"정상\",\"summary\":\"문의 유형별 통계 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"문의 유형별 통계 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"spr_field_inquiry_detail\",\"category\":\"SPR\",\"referenceId\":\"SPR-000001\",\"status\":\"정상\",\"summary\":\"GA현장문의 상세 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"GA현장문의 상세 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"spr_field_inquiry_escalation\",\"category\":\"SPR\",\"referenceId\":\"SPR-000001\",\"status\":\"정상\",\"summary\":\"에스컬레이션 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"에스컬레이션 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"spr_field_inquiry_faq\",\"category\":\"SPR\",\"referenceId\":\"SPR-000001\",\"status\":\"정상\",\"summary\":\"자주묻는질문 FAQ 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"자주묻는질문 FAQ 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"spr_field_inquiry_list\",\"category\":\"SPR\",\"referenceId\":\"SPR-000001\",\"status\":\"정상\",\"summary\":\"GA현장문의 목록 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"GA현장문의 목록 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"spr_field_inquiry_manager\",\"category\":\"SPR\",\"referenceId\":\"SPR-000001\",\"status\":\"정상\",\"summary\":\"담당자 배정 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"담당자 배정 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"spr_field_inquiry_satisfaction\",\"category\":\"SPR\",\"referenceId\":\"SPR-000001\",\"status\":\"정상\",\"summary\":\"문의 만족도 조사 결과 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"문의 만족도 조사 결과 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"spr_field_inquiry_sla\",\"category\":\"SPR\",\"referenceId\":\"SPR-000001\",\"status\":\"정상\",\"summary\":\"처리기한 SLA 현황 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"처리기한 SLA 현황 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"resultCode": "SUCCESS",
|
||||
"data": "{\"toolName\":\"spr_field_inquiry_status\",\"category\":\"SPR\",\"referenceId\":\"SPR-000001\",\"status\":\"정상\",\"summary\":\"문의 처리상태 조회 결과\",\"asOfDate\":\"2026-08-14\",\"details\":[\"문의 처리상태 조회 모의 상세정보\",\"외부 시스템을 변경하지 않는 조회 결과\"]}"
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"TODO_FIELD": {
|
||||
"type": "string",
|
||||
"description": "TODO: 파라미터 설명을 입력하세요."
|
||||
}
|
||||
},
|
||||
"required": []
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"status": {
|
||||
"type": "string",
|
||||
"description": "처리 결과 상태 (SUCCESS / FAILURE)",
|
||||
"enum": ["SUCCESS", "FAILURE"]
|
||||
},
|
||||
"message": {
|
||||
"type": "string",
|
||||
"description": "처리 결과 메시지"
|
||||
}
|
||||
},
|
||||
"required": ["status"]
|
||||
}
|
||||
@@ -1,16 +1,22 @@
|
||||
---
|
||||
mcp:
|
||||
manifest:
|
||||
routing-functions:
|
||||
- name: route_to_dat-was-sal
|
||||
description-serialization: 영업 업무 서버로 요청을 라우팅합니다. 영업 조직과 설계사 업무를 처리합니다. 요청의 주요 엔티티와 업무 영역을 기준으로 영업 서버를 선택합니다.
|
||||
server-id: dat-was-sal
|
||||
category-key: sal
|
||||
product-boundary: insurance
|
||||
business-domain: 영업 관리
|
||||
business-outcome: 영업 조직과 설계사 업무를 처리합니다.
|
||||
primary-entities: [설계사, 영업조직, 실적]
|
||||
capabilities: [설계사 조회, 영업조직 조회, 실적 조회]
|
||||
select-if: 설계사, 영업조직 또는 영업실적 관련 요청인 경우
|
||||
reject-if: 고객, 계약, 상품, 시스템 운영 업무가 주된 요청인 경우
|
||||
confusable-servers: [dat-was-cus, dat-was-pro, dat-was-sys]
|
||||
decision-policy: 요청의 주요 엔티티와 업무 영역을 기준으로 영업 서버를 선택합니다.
|
||||
- name: "route_to_dat-was-sal"
|
||||
server-id: "dat-was-sal"
|
||||
category-key: "sal"
|
||||
product-boundary: "영업 업무 서버를 위한 제품 범위 정의입니다."
|
||||
business-domain: "영업 조직 및 설계사 관리 도메인입니다."
|
||||
business-outcome: "영업 요청의 효율적인 처리와 설계사 업무 지원을 보장합니다."
|
||||
primary-entities: "영업 조직, 설계사, 고객"
|
||||
capabilities: "요청 라우팅, 업무 할당, 상태 조회"
|
||||
select-if: "요청의 주요 엔티티가 영업 조직 또는 설계사일 경우 선택합니다."
|
||||
reject-if: "요청이 다른 도메인에 속하거나 유효하지 않은 엔티티를 포함할 경우 거부합니다."
|
||||
confusable-servers:
|
||||
- "dat-was-cus"
|
||||
- "dat-was-ehr"
|
||||
- "dat-was-pro"
|
||||
- "dat-was-sys"
|
||||
decision-policy: "가장 가까운 영업 서버를 선택하고, 부하를 고려하여 결정합니다."
|
||||
description_serialization: "이 도구는 영업 요청을 처리하며, 영업 조직과 설계사 업무를 효율적으로 라우팅하고, 부\
|
||||
하를 고려한 결정 정책을 적용하여 적절한 서버로 분배합니다."
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user