2026-06-04 16:18:19 +08:00

70 lines
1.9 KiB
JavaScript

const DATE_ONLY_RE = /^(\d{4})-(\d{1,2})-(\d{1,2})$/;
export function resolveAutoFillValue(item, form = {}) {
const rule = item && item.autoFill;
if (!rule || !rule.sourceField || !rule.type) return undefined;
const sourceValue = form ? form[rule.sourceField] : '';
if (!sourceValue) return '';
if (rule.type === 'addDays') {
const days = Number(rule.days);
if (!Number.isFinite(days)) return '';
return addDays(sourceValue, days);
}
return undefined;
}
export function collectAutoFillChanges(items = [], form = {}) {
if (!Array.isArray(items)) return [];
return items.reduce((changes, item) => {
if (!item || !item.title) return changes;
const nextValue = resolveAutoFillValue(item, form);
if (nextValue === undefined) return changes;
const currentValue = form && form[item.title] !== undefined && form[item.title] !== null
? String(form[item.title])
: '';
if (currentValue !== nextValue) {
changes.push({ title: item.title, value: nextValue });
}
return changes;
}, []);
}
function addDays(value, days) {
const date = parseDateOnly(value);
if (!date) return '';
date.setUTCDate(date.getUTCDate() + days);
return formatDateOnly(date);
}
function parseDateOnly(value) {
const match = String(value || '').trim().match(DATE_ONLY_RE);
if (!match) return null;
const year = Number(match[1]);
const month = Number(match[2]);
const day = Number(match[3]);
const date = new Date(Date.UTC(year, month - 1, day));
if (
date.getUTCFullYear() !== year ||
date.getUTCMonth() !== month - 1 ||
date.getUTCDate() !== day
) {
return null;
}
return date;
}
function formatDateOnly(date) {
const year = date.getUTCFullYear();
const month = String(date.getUTCMonth() + 1).padStart(2, '0');
const day = String(date.getUTCDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}