import axios from '@/common/services/axios-instance'
import download from '@/common/services/download'
import { sdLocalStorage } from '@/common/services/storage-service'
import crossWindowWatcher from '@/common/services/cross-window-watcher'
const DOCSUFFIX = ['wps', 'wpt', 'doc', 'docx', 'dot', 'dotx', 'docm', 'dotm']
const EXCELSUFFIX = ['xls', 'xlsx', 'xlsm', 'xlt', 'xltx', 'et', 'xltm']
const PPTSUFFIX = ['ppt', 'pptx', 'pptm', 'ppsx', 'ppsm', 'pps', 'potx', 'potm', 'dpt', 'dps']
// WPS中台:正文附件编辑、清稿、套打、转版等
let wpsDocX = {
version: '2023.0424.01',
createInstance() {
let wpsdocxObj = {
slCtl: {
$$idx: {}, //对象属性
SupportFormat: {
// wps 在线编辑支持的格式
edit: [...DOCSUFFIX, ...EXCELSUFFIX, ...PPTSUFFIX, 'pdf'],
// wps 在线预览支持的格式
view: [...DOCSUFFIX, 'rtf', 'txt', ...EXCELSUFFIX, 'csv', ...PPTSUFFIX, 'pdf', 'ofd'],
},
ErrorMessage: { NotSupport: 'FormatNotSupport' },
checkInstall: function(argsobj) {
wpsdocxObj.slCtl.$$idx = wpsdocxObj.slCtl.formatParams(argsobj)
return Promise.resolve(true)
},
getEnv: function() {
var platform = window.navigator.platform.toLocaleLowerCase()
return platform.includes('win32') || platform.includes('win64') ? 'x86' : 'xc'
},
getRef: function(str, start, substr, seperator) {
let pos, endpos
pos = str.indexOf(substr, start)
if (pos == -1) return ''
endpos = str.indexOf(seperator, pos + 1)
if (endpos == -1) return str.substring(pos + substr.length, str.length)
else return str.substring(pos + substr.length, endpos)
},
setFileList: function(data) {
let strlist = new Array()
for (let i = 0; i < data.length; i++) {
strlist.push(
data[i].properties +
'' +
fnGetFileLink(data[i].code) +
'' +
'' +
JSON.stringify(data[i].attr || {}) +
''
)
}
if (strlist != null && strlist != undefined) {
wpsdocxObj.slCtl.Content.Files._FileInfoString = strlist
wpsdocxObj.slCtl.Content.Files.FileList = wpsdocxObj.slCtl.analyzeFileList(strlist) // 解析filelist
}
},
analyzeFileList: function(FileInfoString) {
let arrFileMap = FileInfoString.map(function(onefile, index) {
let filelink = ''
if (typeof fnGetFileLink === 'function') {
filelink = fnGetFileLink(
wpsdocxObj.slCtl.getRef(onefile, 0, '', '')
)
}
let attr = JSON.parse(wpsdocxObj.slCtl.getRef(onefile, 0, '', '') || '{}')
return {
FileName: wpsdocxObj.slCtl.getRef(onefile, 0, '', ''),
Unid: wpsdocxObj.slCtl.getRef(onefile, 0, '', ''),
CatNum: wpsdocxObj.slCtl.getRef(onefile, 0, '', ''),
Size: wpsdocxObj.slCtl.getRef(onefile, 0, '', ''),
FileType: wpsdocxObj.slCtl.getRef(onefile, 0, '', ''),
Completed: parseInt(
wpsdocxObj.slCtl.getRef(onefile, 0, '', '')
),
doAdd:
wpsdocxObj.slCtl.getRef(onefile, 0, '', '') == 'True' ? true : false,
Type: wpsdocxObj.slCtl.getFileType(
wpsdocxObj.slCtl.getRef(onefile, 0, '', '')
),
CreateInfo: wpsdocxObj.slCtl.getRef(onefile, 0, '', ''),
UpdateInfo: wpsdocxObj.slCtl.getRef(onefile, 0, '', ''),
TaodaInfo: wpsdocxObj.slCtl.getRef(onefile, 0, '', ''),
NeedUpdate: wpsdocxObj.slCtl.getRef(onefile, 0, '', ''),
AllowPrint: false,
Editable: attr.editable ?? false,
DocUnid: wpsdocxObj.slCtl.getRef(onefile, 0, '', ''),
Uploading:
parseInt(wpsdocxObj.slCtl.getRef(onefile, 0, '', '')) == 0 &&
wpsdocxObj.slCtl.getRef(onefile, 0, '', '') == 'False'
? true
: false,
Link: filelink,
}
})
return arrFileMap
},
formatParams: function(argsobj) {
let $$idxtemp = {}
let options = {}
let UploadParam = argsobj.UploadParam || ''
UploadParam.split('|').forEach((item) => {
let tmpArr = item.split('=')
options[tmpArr[0]] = tmpArr[1]
})
$$idxtemp.options = options
return $$idxtemp
},
getFileType: function(strFileName) {
let arrtmp = strFileName.split('.')
return '.' + arrtmp.pop().toLowerCase()
},
isSupport(fname) {
let ext = fname.match(/\.(?\w*)$/i).groups.ext
return this.SupportFormat.edit.some((x) => ext == x)
},
Content: {
Files: {
FileList: [],
_FileInfoString: [],
},
Control: {
getFileByName: function(fname) {
let userfile = null
wpsdocxObj.slCtl.Content.Files.FileList.map(function(onefile, index) {
if (onefile.Unid == fname || onefile.FileName == fname) {
userfile = onefile
}
})
return userfile
},
getNewFileName(fname, suffix, index = 1) {
const fileName = fname + (index > 1 ? `(${index})` : '') + '.' + suffix
if (
wpsdocxObj.slCtl.Content.Files.FileList.find((item) => item.FileName === fileName)
) {
// 存在同名附件,重命名
return wpsdocxObj.slCtl.Content.Control.getNewFileName(fname, suffix, index + 1)
} else {
// 附件名不重复,可使用
return fileName.substring(0, fileName.length - suffix.length - 1)
}
},
// 创建文件
createFile: function(groupId, params) {
return new Promise((resolve, reject) => {
// 默认文件名
if (!params.fileName) {
params.fileName = wpsdocxObj.slCtl.Content.Control.getNewFileName(
'新建文档',
params.type
)
}
// 文字(word/wps)
if (params.type === 'docx') {
axios
.get(`api/framework/v1/wps-doc-middle-end/create-docx/${groupId}`, { params })
.then((res) => resolve(res.data))
.catch((e) => reject(e))
} else {
reject('无法创建文档')
}
})
},
// 编辑
EditFile: function(fname, fileparam, argsobj) {
return new Promise((resolve, reject) => {
if (!wpsdocxObj.slCtl.isSupport(fname)) {
reject(wpsdocxObj.slCtl.ErrorMessage.NotSupport)
} else {
let { activeStepId, mode } = wpsdocxObj.slCtl.$$idx.options
let file = wpsdocxObj.slCtl.Content.Control.getFileByName(fname)
crossWindowWatcher
.waitForChanged(
`/sd-wps-editor?code=${file.Unid}&editable=${file.Editable}&mode=${mode}&activeStepId=${activeStepId}&filename=${fname}&fileStatus=${fileparam.Status}&openAuthType=${fileparam.openAuthType}&openAuthParameter=${fileparam.openAuthParameter}`
)
.then(() => {
resolve(true)
})
}
})
},
// 编辑:按URL
EditFileByUrl: function(fname, url) {
return new Promise((resolve, reject) => {
crossWindowWatcher
.waitForChanged(
`/sd-wps-editor?url=${encodeURIComponent(url)}&filename=${encodeURIComponent(
fname
)}`
)
.then(() => {
resolve(true)
})
})
},
getLockId: function(instId) {
return JSON.parse(sdLocalStorage.getItem(`Lock${instId}`) || '{}').sessionId || 0
},
// 清稿
QingGao: function(fname, fileparam, argsobj) {
return new Promise((resolve, reject) => {
if (!wpsdocxObj.slCtl.isSupport(fname)) {
reject(wpsdocxObj.slCtl.ErrorMessage.NotSupport)
} else {
let { instId, activeStepId, groupId } = wpsdocxObj.slCtl.$$idx.options
let lockId = wpsdocxObj.slCtl.Content.Control.getLockId(instId)
let file = wpsdocxObj.slCtl.Content.Control.getFileByName(fname)
let environment = wpsdocxObj.slCtl.getEnv()
axios
.get(`api/framework/v1/wps-doc-middle-end/clear-draft/${groupId}`, {
params: {
fileCode: file.Unid,
lockId,
instId,
activeStepId,
environment,
},
})
.then(() => {
resolve(true)
})
.catch((e) => {
reject(e)
})
}
})
},
// 套打
TaoDa: function(
ModelUrl,
ContentFieldName,
fname,
fileparam,
OldDocName,
values,
taodainfo,
argsobj
) {
return new Promise((resolve, reject) => {
if (!wpsdocxObj.slCtl.isSupport(fname)) {
reject(wpsdocxObj.slCtl.ErrorMessage.NotSupport)
} else {
let { instId, activeStepId, groupId } = wpsdocxObj.slCtl.$$idx.options
let lockId = wpsdocxObj.slCtl.Content.Control.getLockId(instId)
let file = wpsdocxObj.slCtl.Content.Control.getFileByName(fname)
let environment = wpsdocxObj.slCtl.getEnv()
axios
.post(`api/framework/v1/wps-doc-middle-end/wrap-header/${groupId}`, values, {
params: {
fileCode: file.Unid,
lockId,
instId,
activeStepId,
readHeadFileCode:
ModelUrl.match(/\/download-attachments\/(?.*)\?/)?.groups?.code ||
'',
environment,
},
})
.then(() => {
resolve(true)
})
.catch((e) => {
reject(e)
})
}
})
},
// 更新正文
UpdateRegion: function(fname, values, picvalues, fileparam, argsobj) {
return wpsdocxObj.slCtl.Content.Control.TaoDa(
'',
'',
fname,
fileparam,
'',
values,
'',
argsobj
)
},
// 盖章
GaiZhang: function(
ModelUrl,
ContentFieldName,
fname,
fileparam,
OldDocName,
values,
argsobj
) {
return Promise.reject('请自行定制盖章功能')
},
// 转版:PDF
DOCConvertToPDF: function(fname, fileparam, argsobj) {
return new Promise((resolve, reject) => {
if (!wpsdocxObj.slCtl.isSupport(fname)) {
reject(wpsdocxObj.slCtl.ErrorMessage.NotSupport)
} else {
let { instId, activeStepId, groupId } = wpsdocxObj.slCtl.$$idx.options
let lockId = wpsdocxObj.slCtl.Content.Control.getLockId(instId)
let file = wpsdocxObj.slCtl.Content.Control.getFileByName(fname)
let environment = wpsdocxObj.slCtl.getEnv()
// 接口中会自动判断当前环境,信创环境转ofd,x86环境转pdf
axios
.get(`api/framework/v1/wps-doc-middle-end/convert/${groupId}`, {
params: {
fileCode: file.Unid,
lockId,
instId,
activeStepId,
environment,
},
})
.then(() => {
resolve(true)
})
.catch((e) => {
reject(e)
})
}
})
},
// 转版:OFD
DOCConvertToOFD: function(fname, fileparam, argsobj) {
return wpsdocxObj.slCtl.Content.Control.DOCConvertToPDF(fname, fileparam, argsobj)
},
SaveFileToLocal: function(fname, fileparam, argsobj) {
return new Promise(function(resolve, reject) {
var userfile = wpsdocxObj.slCtl.Content.Control.getFileByName(fname)
download(userfile.Link, fname)
.then(function() {
resolve()
})
.catch(reject)
})
},
SaveMultiFiles: function(strFiles, fileparam, argsobj) {
let { groupId } = wpsdocxObj.slCtl.$$idx.options
return new Promise((resolve, reject) => {
var arrFileNames = strFiles.split('|')
var fileName = arrFileNames[0]
var codes = arrFileNames
.map((v) => wpsdocxObj.slCtl.Content.Control.getFileByName(v))
.filter(Boolean)
download(
`api/framework/v1/attachment-extend/attachments-download/multi?groupId=${groupId}&codes=${codes.map(
(x) => x.Unid
)}`,
`${fileName}等${codes.length}个附件.zip`
)
.then((_) => resolve())
.catch(reject)
})
},
},
},
},
}
return wpsdocxObj
},
}
export default wpsDocX