diff --git a/backend-node/src/controllers/dynamicFormController.ts b/backend-node/src/controllers/dynamicFormController.ts index 97cd2cc1..98606f51 100644 --- a/backend-node/src/controllers/dynamicFormController.ts +++ b/backend-node/src/controllers/dynamicFormController.ts @@ -427,7 +427,8 @@ export const updateFieldValue = async ( ): Promise => { try { const { companyCode, userId } = req.user as any; - const { tableName, keyField, keyValue, updateField, updateValue } = req.body; + const { tableName, keyField, keyValue, updateField, updateValue } = + req.body; console.log("πŸ”„ [updateFieldValue] μš”μ²­:", { tableName, @@ -440,16 +441,27 @@ export const updateFieldValue = async ( }); // ν•„μˆ˜ ν•„λ“œ 검증 - if (!tableName || !keyField || keyValue === undefined || !updateField || updateValue === undefined) { + if ( + !tableName || + !keyField || + keyValue === undefined || + !updateField || + updateValue === undefined + ) { return res.status(400).json({ success: false, - message: "ν•„μˆ˜ ν•„λ“œκ°€ λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. (tableName, keyField, keyValue, updateField, updateValue)", + message: + "ν•„μˆ˜ ν•„λ“œκ°€ λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. (tableName, keyField, keyValue, updateField, updateValue)", }); } // SQL μΈμ μ…˜ λ°©μ§€λ₯Ό μœ„ν•œ ν…Œμ΄λΈ”λͺ…/컬럼λͺ… 검증 const validNamePattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/; - if (!validNamePattern.test(tableName) || !validNamePattern.test(keyField) || !validNamePattern.test(updateField)) { + if ( + !validNamePattern.test(tableName) || + !validNamePattern.test(keyField) || + !validNamePattern.test(updateField) + ) { return res.status(400).json({ success: false, message: "μœ νš¨ν•˜μ§€ μ•Šμ€ ν…Œμ΄λΈ”λͺ… λ˜λŠ” 컬럼λͺ…μž…λ‹ˆλ‹€.", diff --git a/frontend/lib/utils/buttonActions.ts b/frontend/lib/utils/buttonActions.ts index c5e86849..e0fb66b7 100644 --- a/frontend/lib/utils/buttonActions.ts +++ b/frontend/lib/utils/buttonActions.ts @@ -3818,6 +3818,7 @@ export class ButtonActionExecutor { const keyValue = resolveSpecialKeyword(config.trackingStatusKeySourceField || "__userId__", context); if (keyValue) { + // μƒνƒœ μ—…λ°μ΄νŠΈ await apiClient.put("/dynamic-form/update-field", { tableName: statusTableName, keyField: keyField, @@ -3826,6 +3827,37 @@ export class ButtonActionExecutor { updateValue: config.trackingStatusOnStart, }); console.log("βœ… μƒνƒœ λ³€κ²½ μ™„λ£Œ:", config.trackingStatusOnStart); + + // πŸ†• μΆœλ°œμ§€/도착지도 vehicles ν…Œμ΄λΈ”μ— μ €μž₯ + if (departure) { + try { + await apiClient.put("/dynamic-form/update-field", { + tableName: statusTableName, + keyField: keyField, + keyValue: keyValue, + updateField: "departure", + updateValue: departure, + }); + console.log("βœ… μΆœλ°œμ§€ μ €μž₯ μ™„λ£Œ:", departure); + } catch { + // 컬럼이 μ—†μœΌλ©΄ λ¬΄μ‹œ + } + } + + if (arrival) { + try { + await apiClient.put("/dynamic-form/update-field", { + tableName: statusTableName, + keyField: keyField, + keyValue: keyValue, + updateField: "arrival", + updateValue: arrival, + }); + console.log("βœ… 도착지 μ €μž₯ μ™„λ£Œ:", arrival); + } catch { + // 컬럼이 μ—†μœΌλ©΄ λ¬΄μ‹œ + } + } } } catch (statusError) { console.warn("⚠️ μƒνƒœ λ³€κ²½ μ‹€νŒ¨:", statusError); @@ -4032,6 +4064,23 @@ export class ButtonActionExecutor { updateValue: effectiveConfig.trackingStatusOnStop, }); console.log("βœ… μƒνƒœ λ³€κ²½ μ™„λ£Œ:", effectiveConfig.trackingStatusOnStop); + + // πŸ†• μš΄ν–‰ μ’…λ£Œ μ‹œ vehicles ν…Œμ΄λΈ”μ˜ μΆœλ°œμ§€/도착지/μœ„λ„/경도λ₯Ό null둜 μ΄ˆκΈ°ν™” + const fieldsToReset = ["departure", "arrival", "latitude", "longitude"]; + for (const field of fieldsToReset) { + try { + await apiClient.put("/dynamic-form/update-field", { + tableName: statusTableName, + keyField: keyField, + keyValue: keyValue, + updateField: field, + updateValue: null, + }); + } catch { + // 컬럼이 μ—†μœΌλ©΄ λ¬΄μ‹œ + } + } + console.log("βœ… μΆœλ°œμ§€/도착지/μœ„λ„/경도 μ΄ˆκΈ°ν™” μ™„λ£Œ"); } } catch (statusError) { console.warn("⚠️ μƒνƒœ λ³€κ²½ μ‹€νŒ¨:", statusError);