257 lines
7.2 KiB
JavaScript
257 lines
7.2 KiB
JavaScript
/**
|
||
* 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
|
||
};
|
||
}
|