gongxiangp2/lib/art-workflow-owner.cjs

30 lines
1.5 KiB
JavaScript

'use strict';
/** Keep authoritative contact IDs, not task assignees or contact avatars. */
function normalizeArtPlannerOwner(value, extValue) {
for (const raw of [extValue, value]) {
let parsed = raw;
if (typeof raw === 'string') { try { parsed = JSON.parse(raw); } catch { continue; } }
const items = Array.isArray(parsed) ? parsed : parsed && typeof parsed === 'object' ? [parsed] : [];
if (items.length && items.every(item => item && typeof item === 'object' && String(item.emplId || item.userId || '').trim())) {
return JSON.stringify(items.map(item => ({ emplId: String(item.emplId || item.userId).trim(), name: String(item.name || '').trim() })));
}
}
return typeof value === 'string' && value.trim() ? value.trim() : null;
}
/** Explicitly empty latest fields stay empty; they never revive an older owner. */
function selectArtPlannerOwner(fields) {
const rows = fields.map((field, index) => ({ ...field, index }))
.filter(field => String(field.name || '').trim() === '策划案负责人');
rows.sort((a, b) => {
const id = row => /^\d+$/.test(String(row.sourceRowId)) ? BigInt(row.sourceRowId) : null;
const left = id(a), right = id(b);
return left !== null && right !== null && left !== right ? (left > right ? -1 : 1)
: left !== null && right === null ? -1 : left === null && right !== null ? 1 : a.index - b.index;
});
return rows.length ? normalizeArtPlannerOwner(rows[0].value, rows[0].extValue) : null;
}
module.exports = { normalizeArtPlannerOwner, selectArtPlannerOwner };