刘光辉
119 分钟以前 cf11e63b659afcc9792ab3e395f1b45d844431a8
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
import type { NormalizedOfficeDocumentConfig, OfficeDocumentMode, OpenOfficeDocumentConfig } from '../types';
 
const DMS_QIANPIYE_SCENE = 'dms.qianpiye';
 
/** 后端按扩展名决定 documentType,缺扩展名会直接被拒,故前端先给出更易懂的报错 */
export function validateOfficeDocumentConfig(config: OpenOfficeDocumentConfig) {
  if (!config?.file?.fileId) {
    throw new Error('[GlobalOfficeDocumentModal] file.fileId is required');
  }
  if (!resolveFileName(config)) {
    throw new Error('[GlobalOfficeDocumentModal] file.name is required');
  }
}
 
/**
 * 文件名优先取 file.name;没有就退回从 url 里截。
 * 后端靠文件名的扩展名推导 documentType 并判断能否编辑,所以这个值不能丢。
 */
export function resolveFileName(config: OpenOfficeDocumentConfig): string {
  const name = config?.file?.name?.trim();
  if (name) return name;
 
  const url = config?.file?.url;
  if (!url) return '';
  const path = url.split(/[#?]/)[0] || '';
  const lastSegment = path.split('/').pop() || '';
  return lastSegment.includes('.') ? lastSegment : '';
}
 
export function normalizeOfficeDocumentConfig(config: OpenOfficeDocumentConfig): NormalizedOfficeDocumentConfig {
  const fileName = resolveFileName(config);
  const mode = config.mode ?? 'edit';
  if (!['edit', 'qianpiye', 'review', 'view', 'viewComments'].includes(mode)) throw new Error('不支持的文档打开模式');
  return {
    ...config,
    // 签批页标注插件场景固定归属 DMS;调用方的业务页面模块不能覆盖该场景契约。
    bizModule: mode === 'qianpiye' ? 'dms' : config.bizModule?.trim(),
    bizScene: mode === 'qianpiye' ? DMS_QIANPIYE_SCENE : config.bizScene?.trim(),
    fileType: config.fileType?.trim() || 'annex',
    mode,
    title: config.title?.trim() || fileName,
  };
}
 
/** OnlyOffice Document Server 只接受 edit/view,签批页模式当前按 edit 打开。 */
export function resolveOnlyOfficeEditorMode(mode: OfficeDocumentMode): 'edit' | 'view' {
  return mode === 'view' || mode === 'viewComments' ? 'view' : 'edit';
}