migrate to new git
This commit is contained in:
257
web/admin/transfer/draft-utils.js
Normal file
257
web/admin/transfer/draft-utils.js
Normal file
@@ -0,0 +1,257 @@
|
||||
/**
|
||||
* 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
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user