/** * Draft 欄位操作工具函數 * 確保 transfer_draft 和 pro_order_detail_items 的操作互不影響 */ // 解析 draft 欄位,返回標準化的物件格式 function getDraftObject(draft) { if (!draft || !draft.trim()) return {}; try { const draftObj = JSON.parse(draft); // 確保是物件格式 if (typeof draftObj === 'object' && !Array.isArray(draftObj)) { return draftObj; } else if (Array.isArray(draftObj)) { // 舊格式:轉換為新格式 return { transfer_draft: draftObj }; } return {}; } catch (e) { console.error('解析 draft JSON 失敗:', e); return {}; } } // 安全地取得 draft 物件中的特定欄位 function getDraftField(draft, fieldName) { const draftObj = getDraftObject(draft); return draftObj[fieldName] || null; } // 安全地更新 draft 物件中的特定欄位,保持其他欄位不變 function updateDraftField(draft, fieldName, newValue) { const draftObj = getDraftObject(draft); return { ...draftObj, [fieldName]: newValue }; } // 檢查是否有 transfer_draft 資料 function hasTransferDraft(draft) { const transferDraft = getDraftField(draft, 'transfer_draft'); return transferDraft && Array.isArray(transferDraft) && transferDraft.length > 0; } // 檢查是否有 pro_order_detail_items 資料 function hasProOrderDetailItems(draft) { const detailItems = getDraftField(draft, 'pro_order_detail_items'); return detailItems && Array.isArray(detailItems) && detailItems.length > 0; } // 清除特定的 draft 欄位 function clearDraftField(draft, fieldName) { const draftObj = getDraftObject(draft); const newDraftObj = { ...draftObj }; delete newDraftObj[fieldName]; return newDraftObj; } // 合併兩個 draft 物件 function mergeDraftObjects(draft1, draft2) { const obj1 = getDraftObject(draft1); const obj2 = getDraftObject(draft2); return { ...obj1, ...obj2 }; } // 驗證 draft 物件格式 function validateDraftFormat(draft) { if (!draft || !draft.trim()) return { valid: true, format: 'empty' }; try { const draftObj = JSON.parse(draft); if (Array.isArray(draftObj)) { return { valid: true, format: 'legacy_array' }; } else if (typeof draftObj === 'object') { const hasTransferDraft = draftObj.transfer_draft && Array.isArray(draftObj.transfer_draft); const hasDetailItems = draftObj.pro_order_detail_items && Array.isArray(draftObj.pro_order_detail_items); if (hasTransferDraft || hasDetailItems) { return { valid: true, format: 'new_object', hasTransferDraft, hasDetailItems }; } else { return { valid: false, error: '無效的物件格式' }; } } else { return { valid: false, error: '不是有效的 JSON 物件或陣列' }; } } catch (e) { return { valid: false, error: 'JSON 解析失敗' }; } } // 取得 draft 的摘要資訊 function getDraftSummary(draft) { if (!draft || !draft.trim()) return { hasData: false }; const draftObj = getDraftObject(draft); const transferDraft = draftObj.transfer_draft || []; const detailItems = draftObj.pro_order_detail_items || []; return { hasData: transferDraft.length > 0 || detailItems.length > 0, transferDraftCount: transferDraft.length, detailItemsCount: detailItems.length, totalReconcileAmount: detailItems.reduce((sum, item) => sum + (Number(item.reconcile) || 0), 0), format: validateDraftFormat(draft).format }; } // 將舊格式轉換為新格式 function migrateLegacyFormat(draft) { if (!draft || !draft.trim()) return ''; try { const draftObj = JSON.parse(draft); if (Array.isArray(draftObj)) { // 舊格式:轉換為新格式 const newDraftObj = { transfer_draft: draftObj }; return JSON.stringify(newDraftObj); } // 已經是物件格式,直接返回 return draft; } catch (e) { console.error('遷移舊格式失敗:', e); return draft; } } // 清理空的 draft 欄位 function cleanEmptyDraft(draft) { if (!draft || !draft.trim()) return ''; try { const draftObj = JSON.parse(draft); const cleaned = {}; if (draftObj.transfer_draft && Array.isArray(draftObj.transfer_draft) && draftObj.transfer_draft.length > 0) { cleaned.transfer_draft = draftObj.transfer_draft; } if (draftObj.pro_order_detail_items && Array.isArray(draftObj.pro_order_detail_items) && draftObj.pro_order_detail_items.length > 0) { cleaned.pro_order_detail_items = draftObj.pro_order_detail_items; } return Object.keys(cleaned).length > 0 ? JSON.stringify(cleaned) : ''; } catch (e) { console.error('清理 draft 失敗:', e); return draft; } } // 格式化 draft JSON 為可讀字串 function formatDraftJson(draft) { if (!draft) return '無記錄'; try { return JSON.stringify(JSON.parse(draft), null, 2); } catch(e) { return draft; } } // 使用範例: /* // 1. 更新 transfer_draft const currentDraft = item.draft || ''; const newTransferDraft = [ { pro_order_detail_num: "123", reconcile: 5000 } ]; const updatedDraft = updateDraftField(currentDraft, 'transfer_draft', newTransferDraft); // 2. 更新 pro_order_detail_items const newDetailItems = [ { pro_order_detail_num: "123", reconcile: 5000, activity_name: "法會", actitem_name: "護持金" } ]; const updatedDraft = updateDraftField(currentDraft, 'pro_order_detail_items', newDetailItems); // 3. 檢查是否有暫存資料 if (hasTransferDraft(item.draft)) { console.log('有暫存資料'); } // 4. 取得特定欄位 const transferDraft = getDraftField(item.draft, 'transfer_draft'); const detailItems = getDraftField(item.draft, 'pro_order_detail_items'); */ // 檢查是否有 follower_list(共同支付人清單) function hasFollowerList(draft) { const followerList = getDraftField(draft, 'follower_list'); return followerList && Array.isArray(followerList) && followerList.length > 0; } // 取得 follower_list function getFollowerList(draft) { const followerList = getDraftField(draft, 'follower_list'); return followerList && Array.isArray(followerList) ? followerList : []; } // 更新 follower_list function updateFollowerList(draft, followerList) { return updateDraftField(draft, 'follower_list', followerList); } // 如果是在瀏覽器環境中,將函數掛載到全域 if (typeof window !== 'undefined') { window.DraftUtils = { getDraftObject, getDraftField, updateDraftField, hasTransferDraft, hasProOrderDetailItems, hasFollowerList, getFollowerList, updateFollowerList, clearDraftField, mergeDraftObjects, validateDraftFormat, getDraftSummary, migrateLegacyFormat, cleanEmptyDraft, formatDraftJson }; } // 如果是在 Node.js 環境中,匯出函數 if (typeof module !== 'undefined' && module.exports) { module.exports = { getDraftObject, getDraftField, updateDraftField, hasTransferDraft, hasProOrderDetailItems, hasFollowerList, getFollowerList, updateFollowerList, clearDraftField, mergeDraftObjects, validateDraftFormat, getDraftSummary, migrateLegacyFormat, cleanEmptyDraft, formatDraftJson }; }