|
|
|
|
@ -141,8 +141,17 @@
|
|
|
|
|
<!-- 会议纪要:点击抽屉查看(一对多,多条链接) -->
|
|
|
|
|
<div v-else-if="el.type === 'meeting_minutes'">
|
|
|
|
|
<template v-if="getPaymentMeetingMinutesList(el, payment).length">
|
|
|
|
|
<span v-for="(item, idx) in getPaymentMeetingMinutesList(el, payment)" :key="item.id">
|
|
|
|
|
<span v-for="(item, idx) in getPaymentMeetingMinutesList(el, payment)" :key="getMeetingMinutesItemKey(item, idx)">
|
|
|
|
|
<el-link
|
|
|
|
|
v-if="item.mode === 'upload'"
|
|
|
|
|
type="primary"
|
|
|
|
|
:underline="false"
|
|
|
|
|
@click="handlePlannedFileClick(item)"
|
|
|
|
|
>
|
|
|
|
|
{{ item.title || '查看附件' }}
|
|
|
|
|
</el-link>
|
|
|
|
|
<el-link
|
|
|
|
|
v-else
|
|
|
|
|
type="primary"
|
|
|
|
|
:underline="false"
|
|
|
|
|
@click="openMeetingMinutesDrawer(item.id)"
|
|
|
|
|
@ -314,8 +323,17 @@
|
|
|
|
|
<!-- meeting_minutes:点击抽屉查看(一对多,多条链接) -->
|
|
|
|
|
<template v-else-if="f.element_type === 'meeting_minutes'">
|
|
|
|
|
<template v-if="getIndirectMeetingMinutesList(expId, getTplFieldKey(f)).length">
|
|
|
|
|
<span v-for="(item, idx) in getIndirectMeetingMinutesList(expId, getTplFieldKey(f))" :key="item.id">
|
|
|
|
|
<span v-for="(item, idx) in getIndirectMeetingMinutesList(expId, getTplFieldKey(f))" :key="getMeetingMinutesItemKey(item, idx)">
|
|
|
|
|
<el-link
|
|
|
|
|
v-if="item.mode === 'upload'"
|
|
|
|
|
type="primary"
|
|
|
|
|
:underline="false"
|
|
|
|
|
@click="handlePlannedFileClick(item)"
|
|
|
|
|
>
|
|
|
|
|
{{ item.title || '查看附件' }}
|
|
|
|
|
</el-link>
|
|
|
|
|
<el-link
|
|
|
|
|
v-else
|
|
|
|
|
type="primary"
|
|
|
|
|
:underline="false"
|
|
|
|
|
@click="openMeetingMinutesDrawer(item.id)"
|
|
|
|
|
@ -2493,23 +2511,40 @@ export default {
|
|
|
|
|
return null;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/** 将会议纪要值归一化为 [{ id, title }, ...],兼容单条与多条 */
|
|
|
|
|
normalizeMeetingMinutesItem(item) {
|
|
|
|
|
if (item === null || item === undefined) return null;
|
|
|
|
|
if (typeof item === 'object' && item.mode === 'upload') {
|
|
|
|
|
const uploadId = item.upload_id || item.id;
|
|
|
|
|
if (!uploadId && !item.url && !item.file_url) return null;
|
|
|
|
|
return {
|
|
|
|
|
id: uploadId ? `upload_${uploadId}` : `upload_${item.url || item.file_url}`,
|
|
|
|
|
upload_id: uploadId,
|
|
|
|
|
mode: 'upload',
|
|
|
|
|
title: item.title || item.name || item.file_name || '查看附件',
|
|
|
|
|
name: item.name || item.file_name || item.title || '附件',
|
|
|
|
|
url: this.buildFileUrl(item.url || item.file_url),
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
const id = this.extractMeetingMinuteId(item);
|
|
|
|
|
if (!id) return null;
|
|
|
|
|
const title = (item && typeof item === 'object' && item.title) ? item.title : '';
|
|
|
|
|
return { id, mode: 'oa_meeting_minutes', title };
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
getMeetingMinutesItemKey(item, idx) {
|
|
|
|
|
return item?.id || item?.upload_id || idx;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/** 将会议纪要值归一化为展示项,兼容 OA 会议纪要与直接上传附件 */
|
|
|
|
|
normalizeMeetingMinutesValue(val) {
|
|
|
|
|
if (val === null || val === undefined) return [];
|
|
|
|
|
if (Array.isArray(val)) {
|
|
|
|
|
return val
|
|
|
|
|
.map((item) => {
|
|
|
|
|
const id = this.extractMeetingMinuteId(item);
|
|
|
|
|
if (!id) return null;
|
|
|
|
|
const title = (item && typeof item === 'object' && item.title) ? item.title : '';
|
|
|
|
|
return { id, title };
|
|
|
|
|
})
|
|
|
|
|
.map((item) => this.normalizeMeetingMinutesItem(item))
|
|
|
|
|
.filter(Boolean);
|
|
|
|
|
}
|
|
|
|
|
const id = this.extractMeetingMinuteId(val);
|
|
|
|
|
if (!id) return [];
|
|
|
|
|
const title = (val && typeof val === 'object' && val.title) ? val.title : '';
|
|
|
|
|
return [{ id, title }];
|
|
|
|
|
const item = this.normalizeMeetingMinutesItem(val);
|
|
|
|
|
return item ? [item] : [];
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
getPaymentMeetingMinutesList(el, payment) {
|
|
|
|
|
|