代理机构汇总

This commit is contained in:
吴红兵
2026-02-25 13:34:26 +08:00
parent 25e0772548
commit e932bd8963
2 changed files with 165 additions and 3 deletions

View File

@@ -39,8 +39,8 @@
icon="Files"
link
type="primary"
>
@click="openSummaryDialog"
>
代理汇总
</el-button>
<el-button
@@ -119,19 +119,165 @@
<!-- 编辑新增表单对话框 -->
<FormDialog ref="formDialogRef" @refresh="getDataList" />
<!-- 代理汇总弹窗 -->
<el-dialog
v-model="summaryDialogVisible"
title="代理数据汇总"
width="85%"
destroy-on-close
class="agent-summary-dialog"
>
<el-form :model="summaryQuery" inline class="summary-query-form">
<el-form-item label="需求部门">
<el-select
v-model="summaryQuery.deptCode"
placeholder="请选择"
clearable
filterable
style="width: 200px"
>
<el-option v-for="d in deptOptions" :key="d.value" :label="d.label" :value="d.value" />
</el-select>
</el-form-item>
<el-form-item label="计划采购开始时间">
<el-date-picker
v-model="summaryQuery.planStartDate"
type="date"
placeholder="请选择"
value-format="YYYY-MM-DD"
style="width: 180px"
clearable
/>
</el-form-item>
<el-form-item label="计划采购结束时间">
<el-date-picker
v-model="summaryQuery.planEndDate"
type="date"
placeholder="请选择"
value-format="YYYY-MM-DD"
style="width: 180px"
clearable
/>
</el-form-item>
<el-form-item label="是否履约评价">
<el-select v-model="summaryQuery.hasAcceptEvaluation" placeholder="请选择" clearable style="width: 140px">
<el-option label="已履约评价" value="1" />
<el-option label="未履约评价" value="0" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="querySummary">查询</el-button>
<el-button @click="clearSummaryQuery">清空</el-button>
</el-form-item>
</el-form>
<el-table
:data="summaryList"
v-loading="summaryLoading"
border
stripe
max-height="400"
class="summary-table"
>
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column prop="agentName" label="代理机构" min-width="200" show-overflow-tooltip />
<el-table-column prop="projectCount" label="代理项目" width="100" align="center" />
<el-table-column prop="budgetAmount" label="预算金额" width="140" align="right">
<template #default="{ row }">
{{ formatMoney(row.budgetAmount) }}
</template>
</el-table-column>
<el-table-column prop="contractAmount" label="合同(成交)金额" width="140" align="right">
<template #default="{ row }">
{{ formatMoney(row.contractAmount) }}
</template>
</el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<script setup lang="ts" name="PurchaseAgent">
import { ref, reactive, defineAsyncComponent } from 'vue'
import { BasicTableProps, useTable } from "/@/hooks/table";
import { getPage, delObj } from "/@/api/finance/purchaseagent";
import { getPage, delObj, getAgentSummary } from "/@/api/finance/purchaseagent";
import { deptTree } from '/@/api/admin/dept';
import { useMessage, useMessageBox } from "/@/hooks/message";
import { List, Document, EditPen, Clock, Search } from '@element-plus/icons-vue'
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
/** 代理汇总弹窗 */
const summaryDialogVisible = ref(false);
const summaryLoading = ref(false);
const summaryList = ref<any[]>([]);
const summaryQuery = reactive({
deptCode: '',
planStartDate: '',
planEndDate: '',
hasAcceptEvaluation: '',
});
const deptOptions = ref<{ label: string; value: string }[]>([]);
const flattenDept = (nodes: any[], list: { label: string; value: string }[]) => {
if (!nodes || !Array.isArray(nodes)) return;
nodes.forEach((n: any) => {
const code = n.deptId ?? n.id ?? n.deptCode;
const name = n.name ?? n.deptName ?? '';
if (code != null && String(code)) list.push({ label: name || String(code), value: String(code) });
if (n.children?.length) flattenDept(n.children, list);
});
};
const openSummaryDialog = async () => {
summaryDialogVisible.value = true;
if (deptOptions.value.length === 0) {
try {
const res = await deptTree();
const tree = res?.data ?? res ?? [];
const list: { label: string; value: string }[] = [];
flattenDept(Array.isArray(tree) ? tree : [], list);
deptOptions.value = list;
} catch (_) {
deptOptions.value = [];
}
}
querySummary();
};
const querySummary = async () => {
summaryLoading.value = true;
try {
const res = await getAgentSummary({
deptCode: summaryQuery.deptCode || undefined,
planStartDate: summaryQuery.planStartDate || undefined,
planEndDate: summaryQuery.planEndDate || undefined,
hasAcceptEvaluation: summaryQuery.hasAcceptEvaluation || undefined,
});
summaryList.value = res?.data && Array.isArray(res.data) ? res.data : [];
} catch (_) {
summaryList.value = [];
} finally {
summaryLoading.value = false;
}
};
const clearSummaryQuery = () => {
summaryQuery.deptCode = '';
summaryQuery.planStartDate = '';
summaryQuery.planEndDate = '';
summaryQuery.hasAcceptEvaluation = '';
querySummary();
};
const formatMoney = (v: any) => {
if (v == null || v === '') return '—';
const n = Number(v);
if (Number.isNaN(n)) return String(v);
return n.toLocaleString('zh-CN', { minimumFractionDigits: 0, maximumFractionDigits: 2 });
};
// 定义变量内容
const tableRef = ref()
const formDialogRef = ref()