刘光辉
5 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
(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');
  });
})