diff --git a/src/components/BudgetSourcePickerField.vue b/src/components/BudgetSourcePickerField.vue index 6f52f7a..0c8440d 100644 --- a/src/components/BudgetSourcePickerField.vue +++ b/src/components/BudgetSourcePickerField.vue @@ -260,8 +260,49 @@ +
+
工会
+ + + {{ node.label }} + + + 预算: + {{ formatAmount(data.budget_amount) }} + + + 已用: + {{ formatAmount(data.used_amount || 0) }} + + + 执行率: + + {{ formatExecutionRate(data.execution_rate || 0) }} + + + + + +
+
暂无数据 @@ -506,6 +547,9 @@ export default { offsetPrepaidTree() { return (this.treeData || []).filter((n) => n?.budget_type === "offset_prepaid"); }, + tradeUnionTree() { + return (this.treeData || []).filter((n) => n?.budget_type === "trade_union"); + }, budgetTypeMap() { return { department: "部门预算", @@ -513,6 +557,7 @@ export default { special_fund: "专项资金", last_year_carryover: "上一年结转资金", offset_prepaid: "抵消预付账款", + trade_union: "工会", }; }, // 分配总额 @@ -670,6 +715,7 @@ export default { this.$refs.specialFundTreeRef, this.$refs.lastYearCarryoverTreeRef, this.$refs.offsetPrepaidTreeRef, + this.$refs.tradeUnionTreeRef, ].filter(Boolean); const nodes = []; refs.forEach((tree) => { @@ -693,6 +739,7 @@ export default { this.$refs.specialFundTreeRef, this.$refs.lastYearCarryoverTreeRef, this.$refs.offsetPrepaidTreeRef, + this.$refs.tradeUnionTreeRef, ].filter(Boolean); refs.forEach((tree) => { if (typeof tree.setCheckedKeys === "function") { diff --git a/src/views/MeetingMinutes/components/AddMeetingMinutes.vue b/src/views/MeetingMinutes/components/AddMeetingMinutes.vue index d139101..bae94a7 100644 --- a/src/views/MeetingMinutes/components/AddMeetingMinutes.vue +++ b/src/views/MeetingMinutes/components/AddMeetingMinutes.vue @@ -99,15 +99,18 @@ - {{ flow.title || flow.no || ('流程' + flow.id) }} + + {{ flow.title || flow.no || ('流程' + flow.id) }} + 【已关联 {{ flow.meeting_minutes_count }} 次】 + {{ flow.no || '' }}
- 提示:可以关联多个上会审议审批流程 + 提示:可以关联多个上会审议审批流程,同一条流程可被多个会议纪要关联
@@ -140,7 +143,7 @@ placeholder="请选择类型" style="width: 100%;" > - + @@ -315,12 +318,7 @@ export default { return // 已经加载过了 } try { - const params = {} - // 如果是编辑模式,传递当前会议纪要ID,允许显示已关联的流程 - if (this.type === 'edit' && this.form.id) { - params.meeting_minute_id = this.form.id - } - const res = await getFlows(params) + const res = await getFlows({}) this.availableFlows = res || [] } catch (err) { console.error('加载流程列表失败:', err) diff --git a/src/views/flow/components/RelatedFlows.vue b/src/views/flow/components/RelatedFlows.vue index 4fafa56..36425c1 100644 --- a/src/views/flow/components/RelatedFlows.vue +++ b/src/views/flow/components/RelatedFlows.vue @@ -63,19 +63,26 @@
已关联的流程({{ selectedFlows.length }})
- - {{ flow.title }} - ({{ flow.no }}) - +
+ + {{ flow.title }} + ({{ flow.no }}) + +
+ 会议纪要: + + {{ mm.title }} + + +
+
@@ -104,6 +111,13 @@ 发起人:{{ flow.creator_name }} {{ formatDate(flow.created_at) }}
+
+ 会议纪要: + + {{ mm.title }} + + +
关联的流程({{ relatedFlows.length }})
- +
- - {{ (getPaymentTemplateElementValue(el, payment) && getPaymentTemplateElementValue(el, payment).title) ? getPaymentTemplateElementValue(el, payment).title : '查看会议纪要' }} - + -
@@ -305,16 +310,20 @@ - - + @@ -782,28 +791,54 @@ /> - +
- - {{ meetingMinutesDetail.title || '-' }} + + {{ meetingMinutesDetail.title || '-' }} - -
-
- {{ it.type || '类型' }}: - {{ it.content || '-' }} + +
+ + {{ flow.title || flow.no || ('流程' + flow.id) }} + ({{ flow.no }}) + +
+ 未关联 +
+ +
+
+ + {{ f.original_name || f.name || '附件' }} + + + 下载 +
- + 无附件
- -
- - {{ f.original_name || f.name || '附件' }} - + +
+
+
+ {{ it.type || '未分类' }} +
+
{{ it.content || '-' }}
+
+ 无内容清单
@@ -962,12 +997,9 @@ export default { return this.getOaCustomModelBindings(expenditureId, field).length > 0; } - // meeting_minutes 类型:仅当有会议纪要ID时才显示 + // meeting_minutes 类型:有至少一条会议纪要时显示(一对多) if (field.element_type === 'meeting_minutes') { - const meetingMinuteId = this.extractMeetingMinuteId( - this.getIndirectFieldValue(expenditureId, this.getTplFieldKey(field)) - ); - return meetingMinuteId !== null && meetingMinuteId !== undefined; + return this.getIndirectMeetingMinutesList(expenditureId, this.getTplFieldKey(field)).length > 0; } // attachment/file 类型:仅当有文件项时才显示 @@ -1049,6 +1081,9 @@ export default { if (el.type === 'form_element' && el.field_type === 'attachment') { return Array.isArray(val) && val.length > 0; } + if (el.type === 'meeting_minutes') { + return this.normalizeMeetingMinutesValue(val).length > 0; + } return !this.isEmptyValue(val); }); }, @@ -1894,6 +1929,33 @@ export default { return null; }, + /** 将会议纪要值归一化为 [{ id, title }, ...],兼容单条与多条 */ + 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 }; + }) + .filter(Boolean); + } + const id = this.extractMeetingMinuteId(val); + if (!id) return []; + const title = (val && typeof val === 'object' && val.title) ? val.title : ''; + return [{ id, title }]; + }, + + getPaymentMeetingMinutesList(el, payment) { + return this.normalizeMeetingMinutesValue(this.getPaymentTemplateElementValue(el, payment)); + }, + + getIndirectMeetingMinutesList(expenditureId, fieldKey) { + return this.normalizeMeetingMinutesValue(this.getIndirectFieldValue(expenditureId, fieldKey)); + }, + async openFlowDrawer({ flowId, customModelId, title }) { const fid = Number(flowId); if (!fid || Number.isNaN(fid)) return; @@ -1934,7 +1996,7 @@ export default { this.loadingMeetingMinutes = true; try { // meetingMinutesShow 成功时返回 res.data - const detail = await meetingMinutesShow({ id: meetingMinuteId }); + const detail = await meetingMinutesShow({ id: meetingMinuteId, show_relation: ['flows', 'items'] }); this.meetingMinutesDetail = detail || null; this.rightDrawerTitle = detail?.title || '查看会议纪要'; } catch (e) { diff --git a/src/views/flow/list.vue b/src/views/flow/list.vue index 9669e74..bea00e3 100644 --- a/src/views/flow/list.vue +++ b/src/views/flow/list.vue @@ -573,18 +573,6 @@ @click="destroy(row)" >删除 - 支付