30 lines
1.5 KiB
JavaScript
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 };
|