-
-
- {{ contractDrawerDetail.contract_no || '-' }}
-
-
- {{ contractDrawerDetail.title || '-' }}
-
-
- {{ contractDrawerDetail.party_a || '-' }}
-
-
- {{ contractDrawerDetail.party_b || '-' }}
-
-
- ¥{{ formatAmount(contractDrawerDetail.amount_total) }}
-
-
- {{ contractDrawerDetail.amount_type === 'open' ? '开口' : (contractDrawerDetail.amount_type === 'fixed' ? '闭口' : '-') }}
-
-
- {{ contractDrawerDetail.main_content || '-' }}
-
-
- {{ contractDrawerDetail.sign_date || '-' }}
-
-
- {{ contractDrawerDetail.apply_date || '-' }}
-
-
- {{ contractDrawerDetail.perform_period || '-' }}
-
-
- {{ contractDrawerDetail.pay_method || '-' }}
-
-
- {{ contractDrawerDetail.fund_source || '-' }}
-
-
- {{ contractDrawerDetail.purchase_method || '-' }}
-
-
-
-
- {{ contractDrawerDetail.attachment.original_name || contractDrawerDetail.attachment.name || '查看附件' }}
-
-
- -
-
-
+
+
+
+ {{ contractDrawerDetail.contract_no || '-' }}
+
+
+ {{ contractDrawerDetail.title || '-' }}
+
+
+ {{ contractDrawerDetail.main_content || '-' }}
+
+
+ {{ contractDrawerDetail.party_a || '-' }}
+
+
+ {{ contractDrawerDetail.party_b || '-' }}
+
+
+ {{ formatAmount(contractDrawerDetail.amount_total) }}
+
+
+ {{ formatAmount(contractDrawerDetail.budget_amount) }}
+
+
+ 闭口合同
+ 开口合同
+ -
+
+
+ {{ contractDrawerDetail.amount_description || '-' }}
+
+
+ {{ formatDate(contractDrawerDetail.sign_date) || '-' }}
+
+
+ {{ formatDate(contractDrawerDetail.apply_date) || '-' }}
+
+
+ {{ contractDrawerDetail.perform_period || '-' }}
+
+
+ {{ contractDrawerDetail.pay_method || '-' }}
+
+
+ {{ getContractBudgetYear(contractDrawerDetail) }}
+
+
+ {{ getContractPlanFundSource(contractDrawerDetail) }}
+
+
+ {{ formatArrayText(contractDrawerDetail.actual_fund_sources) }}
+
+
+ {{ (contractDrawerDetail.contractType && contractDrawerDetail.contractType.name) || '-' }}
+
+
+ {{ (contractDrawerDetail.purchaseCategory && contractDrawerDetail.purchaseCategory.name) || '-' }}
+
+
+ {{ getContractPurchaseMethod(contractDrawerDetail) }}
+
+
+ 是
+ 否
+
+
+ {{ contractDrawerDetail.tender_agent || '-' }}
+
+
+ {{ contractDrawerDetail.perform_status || '-' }}
+
+
+ 是
+ 否
+
+
+ {{ formatDepartmentNames(contractDrawerDetail.owner_department_ids || contractDrawerDetail.owner_department_id) }}
+
+
+ {{ formatUserNames(contractDrawerDetail.handler_admin_ids) }}
+
+
+ {{ formatUserNames(contractDrawerDetail.apply_handler_id) }}
+
+
+ {{ formatUserNames(contractDrawerDetail.purchase_handler_id) }}
+
+
+
+ {{ (contractDrawerDetail.payment_stats && contractDrawerDetail.payment_stats.payment_count) || 0 }} 次
+ {{ formatAmount((contractDrawerDetail.payment_stats && contractDrawerDetail.payment_stats.paid_amount) || 0) }}
+
+
+
+ {{ contractDrawerDetail.remark || '-' }}
+
+
+
+
+ {{ (contractDrawerDetail.attachment && contractDrawerDetail.attachment.original_name) || (contractDrawerDetail.attachment && contractDrawerDetail.attachment.name) || '查看附件' }}
+
+
+ -
+
+
-
-
付款计划
-
+ 付款计划
+
-
+
+
+ {{ formatDate(scope.row.due_date) || '-' }}
+
+
¥{{ formatAmount(scope.row.amount_plan) }}
+
+
+ 暂无付款计划
+
未获取到合同详情
@@ -1615,6 +1679,80 @@ export default {
if (!date) return '';
return this.$moment(date).format('YYYY-MM-DD');
},
+ formatArrayText(val) {
+ if (!val) return '-';
+ if (Array.isArray(val)) {
+ const arr = val.map(item => (item === null || item === undefined ? '' : String(item).trim())).filter(Boolean);
+ return arr.length ? arr.join(' | ') : '-';
+ }
+ if (typeof val === 'string') {
+ const s = val.trim();
+ return s || '-';
+ }
+ return String(val);
+ },
+ parseIdList(val) {
+ if (val === null || val === undefined || val === '') return [];
+ if (Array.isArray(val)) {
+ return val
+ .map(item => {
+ if (item && typeof item === 'object') return item.id || item.value || item.user_id || item.department_id || null;
+ return item;
+ })
+ .filter(item => item !== null && item !== undefined && item !== '');
+ }
+ if (typeof val === 'number') return [val];
+ if (typeof val === 'string') {
+ return val
+ .split(',')
+ .map(item => item.trim())
+ .filter(Boolean);
+ }
+ if (typeof val === 'object') {
+ const id = val.id || val.value || val.user_id || val.department_id;
+ return id ? [id] : [];
+ }
+ return [];
+ },
+ formatDepartmentNames(val) {
+ const ids = this.parseIdList(val);
+ if (!ids.length) return '-';
+ return ids
+ .map(id => this.simpleDepartmentMap?.[id] || this.simpleDepartmentMap?.[Number(id)] || `部门ID: ${id}`)
+ .join('、');
+ },
+ formatUserNames(val) {
+ const ids = this.parseIdList(val);
+ if (!ids.length) return '-';
+ return ids
+ .map(id => this.simpleUserMap?.[id] || this.simpleUserMap?.[Number(id)] || `用户ID: ${id}`)
+ .join('、');
+ },
+ getContractBudgetYear(detail) {
+ const year = detail?.fund_source_year?.year || detail?.fundSourceYear?.year || detail?.fund_source_budget_data?.budget_year?.year || detail?.fundSourceBudgetData?.budget_year?.year;
+ return year ? `${year}年` : '-';
+ },
+ getContractPlanFundSource(detail) {
+ return detail?.fund_source_budget_data?.name || detail?.fundSourceBudgetData?.name || detail?.fund_source || '-';
+ },
+ getContractPurchaseMethod(detail) {
+ const relationValue = detail && detail.purchaseMethod;
+ if (relationValue && typeof relationValue === 'object') {
+ return relationValue.name || relationValue.label || relationValue.title || '-';
+ }
+
+ const rawValue = detail && detail.purchase_method;
+ if (!rawValue) return '-';
+ if (typeof rawValue === 'string') return rawValue;
+ if (typeof rawValue === 'object') {
+ return rawValue.name || rawValue.label || rawValue.title || rawValue.text || '-';
+ }
+ return String(rawValue);
+ },
+ getContractAttachmentUrl(detail) {
+ const att = detail?.attachment;
+ return att?.url || att?.path || att?.file_url || att?.download_url || att?.preview_url || '';
+ },
// 格式化日期时间
formatDateTime(dateTime) {
if (!dateTime) return '';
@@ -2113,7 +2251,11 @@ export default {
this.rightDrawerVisible = true;
this.loadingContractDrawer = true;
try {
- const detail = await getBudgetContractDetail(cid);
+ const [detail] = await Promise.all([
+ getBudgetContractDetail(cid),
+ this.loadSimpleDepartmentMap(),
+ this.loadSimpleUserMap(),
+ ]);
this.contractDrawerDetail = detail || null;
this.rightDrawerTitle = detail?.title || detail?.contract_no || title || '查看合同详情';
} catch (e) {
@@ -2929,6 +3071,38 @@ export default {
word-break: break-word;
}
}
+
+.contract-drawer {
+ padding: 20px 24px 28px;
+}
+.contract-drawer-descriptions {
+ ::v-deep .el-descriptions__table {
+ width: 100%;
+ table-layout: fixed;
+ }
+ ::v-deep .el-descriptions-item__label {
+ width: 160px;
+ white-space: nowrap;
+ }
+ ::v-deep .el-descriptions-item__content {
+ word-break: break-word;
+ line-height: 1.7;
+ }
+}
+.contract-empty-tip {
+ padding: 18px 4px 8px;
+ color: #909399;
+}
+
+::v-deep .flow-detail-drawer > .el-drawer__header {
+ margin-bottom: 0;
+ padding: 20px 24px 16px;
+ border-bottom: 1px solid #ebeef5;
+}
+
+::v-deep .flow-detail-drawer > .el-drawer__body {
+ overflow-y: auto;
+}