summaryrefslogtreecommitdiff
path: root/lib/forms-plant/sedp-actions.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-10-23 10:10:21 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-10-23 10:10:21 +0000
commitf7f5069a2209cfa39b65f492f32270a5f554bed0 (patch)
tree933c731ec2cb7d8bc62219a0aeed45a5e97d5f15 /lib/forms-plant/sedp-actions.ts
parentd49ad5dee1e5a504e1321f6db802b647497ee9ff (diff)
(대표님) EDP 해양 관련 개발 사항들
Diffstat (limited to 'lib/forms-plant/sedp-actions.ts')
-rw-r--r--lib/forms-plant/sedp-actions.ts222
1 files changed, 222 insertions, 0 deletions
diff --git a/lib/forms-plant/sedp-actions.ts b/lib/forms-plant/sedp-actions.ts
new file mode 100644
index 00000000..4883a33f
--- /dev/null
+++ b/lib/forms-plant/sedp-actions.ts
@@ -0,0 +1,222 @@
+"use server";
+
+import { getSEDPToken } from "@/lib/sedp/sedp-token";
+
+interface SEDPTagData {
+ [tableName: string]: Array<{
+ TAG_NO: string;
+ TAG_DESC: string;
+ ATTRIBUTES: Array<{
+ ATT_ID: string;
+ VALUE: string;
+ }>;
+ }>;
+}
+
+interface SEDPTemplateData {
+ templateId: string;
+ content: string;
+ projectNo: string;
+ regTypeId: string;
+ [key: string]: any;
+}
+
+// 🔍 실제 SEDP API 응답 구조 (대문자)
+interface SEDPTemplateResponse {
+ TMPL_ID: string;
+ NAME: string;
+ TMPL_TYPE: string;
+ SPR_LST_SETUP?: {
+ ACT_SHEET: string;
+ HIDN_SHEETS: string[];
+ CONTENT?: string;
+ DATA_SHEETS: Array<{
+ SHEET_NAME: string;
+ REG_TYPE_ID: string;
+ MAP_CELL_ATT: Array<{
+ ATT_ID: string;
+ IN: string;
+ }>;
+ }>;
+ };
+ GRD_LST_SETUP?: {
+ REG_TYPE_ID: string;
+ SPR_ITM_IDS: string[];
+ ATTS: any[];
+ };
+ SPR_ITM_LST_SETUP?: {
+ ACT_SHEET: string;
+ HIDN_SHEETS: string[];
+ CONTENT?: string;
+ DATA_SHEETS: Array<{
+ SHEET_NAME: string;
+ REG_TYPE_ID: string;
+ MAP_CELL_ATT: Array<{
+ ATT_ID: string;
+ IN: string;
+ }>;
+ }>;
+ };
+ [key: string]: any;
+}
+
+/**
+ * SEDP에서 태그 데이터를 가져오는 서버 액션
+ */
+export async function fetchTagDataFromSEDP(
+ projectCode: string,
+ formCode: string
+): Promise<SEDPTagData> {
+ try {
+ // Get the token
+ const apiKey = await getSEDPToken();
+
+ // Define the API base URL
+ const SEDP_API_BASE_URL = process.env.SEDP_API_BASE_URL || 'http://sedpwebapi.ship.samsung.co.kr/api';
+
+ // Make the API call
+ const response = await fetch(
+ `${SEDP_API_BASE_URL}/Data/GetPubData`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'accept': '*/*',
+ 'ApiKey': apiKey,
+ 'ProjectNo': projectCode
+ },
+ body: JSON.stringify({
+ ProjectNo: projectCode,
+ REG_TYPE_ID: formCode,
+ ContainDeleted: false
+ })
+ }
+ );
+
+ if (!response.ok) {
+ const errorText = await response.text();
+ throw new Error(`SEDP API request failed: ${response.status} ${response.statusText} - ${errorText}`);
+ }
+
+ const data = await response.json();
+ return data as SEDPTagData;
+ } catch (error: unknown) {
+ console.error('Error calling SEDP API:', error);
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
+ throw new Error(`Failed to fetch data from SEDP API: ${errorMessage}`);
+ }
+}
+
+/**
+ * SEDP에서 템플릿 데이터를 가져오는 서버 액션
+ */
+export async function fetchTemplateFromSEDP(
+ projectCode: string,
+ formCode: string
+): Promise<SEDPTemplateResponse[]> {
+ try {
+ // Get the token
+ const apiKey = await getSEDPToken();
+
+ // Define the API base URL
+ const SEDP_API_BASE_URL = process.env.SEDP_API_BASE_URL || 'http://sedpwebapi.ship.samsung.co.kr/api';
+
+ const responseAdapter = await fetch(
+ `${SEDP_API_BASE_URL}/AdapterDataMapping/GetByToolID`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'accept': '*/*',
+ 'ApiKey': apiKey,
+ 'ProjectNo': projectCode
+ },
+ body: JSON.stringify({
+ ProjectNo: projectCode,
+ "TOOL_ID": "eVCP"
+ })
+ }
+ );
+
+ if (!responseAdapter.ok) {
+ throw new Error(`새 레지스터 요청 실패: ${responseAdapter.status} ${responseAdapter.statusText}`);
+ }
+
+ const dataAdapter = await responseAdapter.json();
+ const templateList = dataAdapter.find(v => v.REG_TYPE_ID === formCode)?.MAP_TMPLS || [];
+
+ // 각 TMPL_ID에 대해 API 호출
+ const templatePromises = templateList.map(async (tmplId: string) => {
+ const response = await fetch(
+ `${SEDP_API_BASE_URL}/Template/GetByID`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'accept': '*/*',
+ 'ApiKey': apiKey,
+ 'ProjectNo': projectCode
+ },
+ body: JSON.stringify({
+ WithContent: true,
+ ProjectNo: projectCode,
+ TMPL_ID: tmplId
+ })
+ }
+ );
+
+ if (!response.ok) {
+ const errorText = await response.text();
+ throw new Error(`SEDP Template API request failed for TMPL_ID ${tmplId}: ${response.status} ${response.statusText} - ${errorText}`);
+ }
+
+ const data = await response.json();
+
+ // 🔍 API 응답 데이터 구조 확인 및 로깅
+ console.log('🔍 SEDP Template API Response for', tmplId, ':', {
+ hasTMPL_ID: !!data.TMPL_ID,
+ hasTemplateId: !!(data as any).templateId,
+ keys: Object.keys(data),
+ sample: data
+ });
+
+ // 🔍 TMPL_ID 필드 검증
+ if (!data.TMPL_ID) {
+ console.error('❌ Missing TMPL_ID in API response:', data);
+ // templateId가 있다면 변환 시도
+ if ((data as any).templateId) {
+ console.warn('⚠️ Found templateId instead of TMPL_ID, converting...');
+ data.TMPL_ID = (data as any).templateId;
+ }
+ }
+
+ return data as SEDPTemplateResponse;
+ });
+
+ // 모든 API 호출을 병렬로 실행하고 결과를 수집
+ const templates = await Promise.all(templatePromises);
+
+ // 🔍 null이나 undefined가 아닌 값들만 필터링하고 TMPL_ID 검증
+ const validTemplates = templates.filter(template => {
+ if (!template) {
+ console.warn('⚠️ Null or undefined template received');
+ return false;
+ }
+ if (!template.TMPL_ID) {
+ console.error('❌ Template missing TMPL_ID:', template);
+ return false;
+ }
+ return true;
+ });
+
+ console.log(`✅ fetchTemplateFromSEDP completed: ${validTemplates.length} valid templates`);
+ validTemplates.forEach(t => console.log(` - ${t.TMPL_ID}: ${t.NAME} (${t.TMPL_TYPE})`));
+
+ return validTemplates;
+
+ } catch (error: unknown) {
+ console.error('Error calling SEDP Template API:', error);
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
+ throw new Error(`Failed to fetch template from SEDP API: ${errorMessage}`);
+ }
+} \ No newline at end of file