(function authorizeRevisionAttachments(args, modelId) { const { formData, setFormData, onlineUtils } = args; const marker = Symbol.for('dms.revision.source.authorization'); const token = Symbol(); Object.defineProperty(formData, marker, { value: token, configurable: true }); const sourceItemId = String(args.data?.xiuding_shenqing_zixiang_id || ''); if (!sourceItemId || formData.id || formData.f_id) return; const parse = value => { if (Array.isArray(value)) return value; if (!value) return []; const result = JSON.parse(value); if (!Array.isArray(result)) throw new Error('附件来源格式无效,请重新选择文件'); return result; }; // 原生子表会补行标识和显示字段;只比较授权绑定的来源、版本及附件。 const filesIdentity = value => parse(value).map(file => [file.fileId, file.revisionEditReceipt || '', file.uploadReceipt || '']); const snapshot = () => JSON.stringify([ formData.xiuding_shenqing_zixiang_id, formData.yuan_wenjian_banben_id, filesIdentity(formData.wenjian), parse(formData.jilu_mingxi).map(row => [row.yuan_wenjian_banben_id, filesIdentity(row.jilu_wenjian)]), formData.id, formData.f_id, ]); const before = snapshot(); const current = () => formData[marker] === token && snapshot() === before; const request = new Promise(resolve => resolve(onlineUtils.request('/api/dms/revision-edit/prepare', 'post', { modelId, sourceItemId }))); return request.then(response => { if (!current()) return; if (!Array.isArray(response?.data)) throw new Error('附件编辑授权失败,请重新选择文件'); const groups = response.data; const authorize = (files, versionId, parentField, field) => { const group = groups.find(item => item.versionId === versionId && item.parentField === parentField && item.field === field); if (!group || !Array.isArray(group.files)) throw new Error('附件来源已变化,请重新选择文件'); return parse(files).map(file => { const source = group.files.find(item => item.fileId === file.fileId); if (!source) throw new Error('附件来源已变化,请重新选择文件'); return source.revisionEditReceipt ? { ...file, revisionEditReceipt: source.revisionEditReceipt } : file; }); }; // 先完整核验主文件和每个历史记录,再执行回填,避免部分授权。 const main = authorize(formData.wenjian, formData.yuan_wenjian_banben_id, '', 'wenjian'); const rows = parse(formData.jilu_mingxi); const authorized = rows.map(row => ({ ...row, jilu_wenjian: authorize(row.jilu_wenjian, row.yuan_wenjian_banben_id, 'jilu_mingxi', 'jilu_wenjian'), })); setFormData('wenjian', main); authorized.forEach((row, index) => setFormData('jilu_mingxi.jilu_wenjian', row.jilu_wenjian, index)); }).catch(error => { if (current()) onlineUtils.toast(error.message || '附件编辑授权失败,请重新选择文件', 'warning'); }); })