Files
17168ERP/web/admin/transfer/draft-utils.js
2025-08-29 01:27:25 +08:00

257 lines
7.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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
};
}