(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');
|
});
|
})
|