migrate to new git

This commit is contained in:
2025-08-29 01:27:25 +08:00
parent 946eb9961e
commit af2c152ef6
8623 changed files with 1000453 additions and 1 deletions

View 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
};
}