Commit a51ef495 authored by 高滢's avatar 高滢

feat(年度招标管理): 导入

parent 7b431b87
......@@ -14,7 +14,6 @@ enum Api {
DeleteProject = '/pro/tenderManager/del',
ProjectDetail = '/pro/tenderManager/details',
selectCount = '/pro/tenderManager/selectCount',
Itemdelete = '/pro/tenderManager/details/del',
audit = '/pro/tenderManager/examine',
GetListAll = '/pro/tenderManager/selectAll',
ExportCount = '/pro/export/tendMangeStatistic',
......@@ -73,8 +72,6 @@ export const updateItem = (params?: any) =>
export const deleteItem = (params?: any) =>
defHttp.delete<ProjectModel>({ url: Api.DeleteProject, params });
export const Itemdelete = (params?: any) =>
defHttp.delete<ProjectModel>({ url: Api.Itemdelete, params });
export const getItem = (params?: any) =>
defHttp.get<ListItem[]>({ url: Api.ProjectDetail, params });
......
......@@ -8,7 +8,6 @@ enum Api {
UpdateProject = '/pro/tenderPlan/update',
DeleteProject = '/pro/tenderPlan/del',
ProjectDetail = '/pro/tenderPlan/details',
Itemdelete = '/pro/tenderPlan/details/del',
audit = '/pro/tenderPlan/examine',
selectCount = '/pro/tenderPlan/selectCount',
GetListAll = '/pro/tenderPlan/listAll',
......@@ -96,7 +95,4 @@ export const auditItem = (params?: any) =>
export const deleteItem = (params?: any) =>
defHttp.delete<ProjectModel>({ url: Api.DeleteProject, params });
export const Itemdelete = (params?: any) =>
defHttp.delete<ProjectModel>({ url: Api.Itemdelete, params });
export const getItem = (params?: any) => defHttp.get<planModel>({ url: Api.ProjectDetail, params });
import { defHttp } from '@/utils/http/axios';
enum Api {
GetPageList = '/pro/tenderYearManage/page',
AddProject = '/pro/tenderYearManage/add',
UpdateProject = '/pro/tenderYearManage/edit',
DeleteProject = '/pro/tenderYearManage/del',
ProjectDetail = '/pro/tenderYearManage/details',
Audit = '/pro/tenderYearManage/examine',
SelectCount = '/pro/tenderYearManage/selectCount',
GetListAll = '/pro/tenderYearManage/statistics',
Export = '/pro/tenderYearManage/export',
Import = '/pro/tenderYearManage/import',
}
export const selectPageList = (params?: any) =>
defHttp.post({ url: Api.GetPageList, data: params });
export const addProject = (params?: any) => defHttp.post({ url: Api.AddProject, data: params });
export const updateProject = (params?: any) =>
defHttp.post({ url: Api.UpdateProject, data: params });
export const deleteProject = (params?: any) =>
defHttp.get({ url: Api.DeleteProject, data: params });
export const selectDetail = (params?: any) => defHttp.get({ url: Api.ProjectDetail, data: params });
export const handelExamine = (params?: any) => defHttp.get({ url: Api.Audit, data: params });
export const getCount = (params?: any) => defHttp.post({ url: Api.SelectCount, data: params });
export const selectListAll = (params?: any) => defHttp.post({ url: Api.GetListAll, data: params });
export const exportTender = (params?: any) => defHttp.post({ url: Api.Export, data: params });
......@@ -21,7 +21,7 @@ const biddingPlan: AppRouteModule = {
component: () => import('@/views/biddingPlan/index.vue'),
meta: {
auth: '/www/dist/index.html#/biddingPlan/index',
title: '招标计划填报',
title: '季度招标计划填报',
orderNo: 1,
},
},
......@@ -31,7 +31,7 @@ const biddingPlan: AppRouteModule = {
component: () => import('@/views/biddingPlan/biddingPlanData.vue'),
meta: {
auth: '/www/dist/index.html#/biddingPlan/index',
title: '招标计划统计',
title: '季度招标计划统计',
orderNo: 2,
},
},
......@@ -41,7 +41,7 @@ const biddingPlan: AppRouteModule = {
component: () => import('@/views/biddingManagement/index.vue'),
meta: {
auth: '/www/dist/index.html#/biddingManagement/index',
title: '招标管理填报',
title: '季度招标管理填报',
orderNo: 5,
},
},
......@@ -51,7 +51,7 @@ const biddingPlan: AppRouteModule = {
component: () => import('@/views/biddingManagement/statisticsBidding.vue'),
meta: {
auth: '/www/dist/index.html#/biddingManagement/index',
title: '招标管理统计',
title: '季度招标管理统计',
orderNo: 6,
},
},
......@@ -64,7 +64,7 @@ const biddingPlan: AppRouteModule = {
hideMenu: true,
hideBreadcrumb: true,
auth: '/www/dist/index.html#/biddingManagement/index',
title: '招标情况',
title: '季度招标管理编辑',
orderNo: 4,
},
},
......@@ -77,10 +77,43 @@ const biddingPlan: AppRouteModule = {
hideMenu: true,
hideBreadcrumb: true,
auth: '/www/dist/index.html#/biddingPlan/index',
title: '招标计划',
title: '季度招标计划编辑',
orderNo: 3,
},
},
{
path: 'tendeYearManageEdit',
name: 'TendeYearManageEdit',
component: () => import('@/views/tendeYearManage/edit.vue'),
meta: {
hideTab: true,
hideMenu: true,
hideBreadcrumb: true,
auth: '/www/dist/index.html#/biddingManagement/index',
title: '年度招标管理填报',
orderNo: 5,
},
},
{
path: 'tendeYearManageSta',
name: 'TendeYearManageSta',
component: () => import('@/views/tendeYearManage/statistics.vue'),
meta: {
auth: '/www/dist/index.html#/biddingManagement/index',
title: '年度招标管理统计',
orderNo: 6,
},
},
{
path: 'tendeYearManage',
name: 'TendeYearManage',
component: () => import('@/views/tendeYearManage/index.vue'),
meta: {
auth: '/www/dist/index.html#/biddingManagement/index',
title: '年度招标管理填报',
orderNo: 5,
},
},
],
};
......
......@@ -64,10 +64,9 @@
</template>
<script lang="ts" setup>
import { useRouter } from 'vue-router';
const { push } = useRouter();
import { Tag } from 'ant-design-vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getAnnualPlanList } from '@/api/project/annualPlan';
import { getAnnualPlanList, auditItem, deleteItem } from '@/api/project/annualPlan';
import annualPlanModel from './annualPlanModel/annualPlanModel.vue';
import { getListByPage } from '@/api/project/biddingPlan';
......@@ -79,10 +78,11 @@
import { router } from '@/router';
import { BasicForm, useForm, FormProps, UseFormReturnType } from '@/components/Form';
import { formSchema } from '@/views/annualPlan/annualPlanEdit/tableData';
import { auditItem, deleteItem } from '@/api/project/annualPlan';
import { onMounted } from 'vue';
import { getDepartmentList } from '@/api/project/settlementManage';
const { push } = useRouter();
const [register, { openModal: openModal }] = useModal();
defineOptions({ name: 'Performance' });
......
......@@ -31,30 +31,6 @@
>
</template>
<BasicForm :loading="loading" @register="item.Form[0]" />
<!-- 左上角为项目名 -->
<CollapseContainer
v-for="(content, key) in item.list"
:key="key"
class="subCard"
:title="content.name"
v-show="content.show"
>
<template #title>
<span class="contractName">{{ content.name }}</span>
</template>
<!-- 右上角的删除按钮 -->
<template #action>
<a-button
v-if="!disabled"
type="text"
preIcon="ant-design:delete-outlined"
danger
@click="deleteItemCon(index, key)"
>删除合同</a-button
>
</template>
<BasicForm :loading="loading" @register="content.form" />
</CollapseContainer>
</CollapseContainer>
<a-button v-if="!disabled" type="dashed" @click="add" preIcon="ei:plus">
从项目库导入
......
......@@ -24,22 +24,6 @@
const [registerForm, { getFieldsValue, validate }] = useForm({
labelWidth: 100,
schemas: [
// {
// field: 'fillCycle',
// label: '填报周期',
// component: 'DatePicker',
// defaultValue: '',
// required: true,
// componentProps: {
// placeholder: '请选择填报周期',
// picker: 'month',
// valueFormat: 'YYYY-MM',
// format: 'YYYY-MM',
// style: {
// width: '100%',
// },
// },
// },
{
field: 'tenderYear',
label: '选择填报周期',
......@@ -54,35 +38,6 @@
},
colProps: { span: 12 },
},
{
field: 'biddingQuarter',
label: '季度',
component: 'Select',
required: true,
componentProps: {
style: { width: '100%' },
options: [
{
label: '第一季度',
value: '第一季度',
},
{
label: '第二季度',
value: '第二季度',
},
{
label: '第三季度',
value: '第三季度',
},
{
label: '第四季度',
value: '第四季度',
},
],
placeholder: '季度',
},
colProps: { span: 12 },
},
],
showActionButtonGroup: false,
actionColOptions: {
......
......@@ -184,7 +184,7 @@
async function exportCount() {
if (groupByField.value === 'company') {
const data = await exportStatisticEngine(params.value);
downloadByData(data, '投资计划按公司分类' + '.xls');
downloadByData(data, planType.value + '投资计划按公司分类' + '.xls');
} else {
let fileName =
groupByField.value === 'attribute'
......@@ -193,7 +193,7 @@
? '按年底形象进度分类'
: '按项目类型分类';
const data = await exportStatisticEngineerOther(params.value);
downloadByData(data, '投资计划' + fileName + '.xls');
downloadByData(data, planType.value + '投资计划' + fileName + '.xls');
}
}
</script>
......
import { BasicColumn, FormSchema } from '@/components/Table';
import moment from 'moment';
import { getDepartmentList } from '@/api/project/settlementManage';
import { useUserStore } from '@/store/modules/user';
const deptId = '' + useUserStore().userInfo.deptParentId;
//主模块-投资管理列表页
export const columns: BasicColumn[] = [
{
title: '序号',
dataIndex: 'serialNumber',
width: 100,
},
{
title: '填报周期',
dataIndex: 'tenderYear',
width: 200,
},
{
title: '项目数量',
dataIndex: 'proNumber',
width: 180,
},
{
title: '公司名称',
dataIndex: 'companyName',
width: 180,
},
{
title: '最新更新人',
dataIndex: 'updateBy',
width: 180,
},
{
title: '审核人',
dataIndex: 'revieweUser',
width: 180,
},
{
title: '审核时间',
dataIndex: 'reviewTime',
width: 180,
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'tenderYear',
label: '',
component: 'DatePicker',
componentProps: {
placeholder: '年份',
picker: 'year',
valueFormat: 'YYYY',
format: 'YYYY',
style: {
width: '100%',
},
},
colProps: { span: 4 },
},
{
field: 'companyId',
label: '',
component: 'Select',
ifShow: deptId === '100',
componentProps: {
options: [
{ label: '公司名称1', value: '1' },
{ label: '公司名称2', value: '0' },
],
placeholder: '公司名称',
},
colProps: { span: 4 },
},
];
export const formSchema: FormSchema[] = [
{
field: 'proName',
label: '项目名称',
required: true,
component: 'Input',
componentProps: {
readonly: true,
disabled: true,
},
colProps: { span: 7, offset: 1 },
},
{
field: 'fundingSource',
label: '资金来源',
required: true,
component: 'Input',
componentProps: {
readonly: true,
disabled: true,
},
colProps: { span: 7, offset: 1 },
},
{
field: 'investmentAmount',
label: '立项投资额',
required: true,
component: 'InputNumber',
componentProps: {
addonAfter: '万元',
},
colProps: { span: 7, offset: 1 },
},
{
field: 'field11',
component: 'BasicTitle',
label: '招标方案',
componentProps: {
// line: true,
span: true,
},
colProps: {
span: 24,
},
},
{
field: 'biddingType',
label: '招标类型(施工、监理、设计、图审等)',
required: true,
component: 'Input',
colProps: { span: 7, offset: 1 },
labelWidth: 400,
},
{
field: 'tenderContent',
label: '招标内容',
required: true,
component: 'InputTextArea',
componentProps: {
maxlength: 100,
showCount: true,
},
colProps: { span: 7, offset: 1 },
},
{
field: 'controlPrice',
label: '招标控制价',
required: true,
component: 'InputNumber',
componentProps: {
addonAfter: '万元',
},
colProps: { span: 7, offset: 1 },
},
{
field: 'constructionMode',
label: '建设模式',
required: true,
component: 'Input',
colProps: { span: 7, offset: 1 },
componentProps: {
readonly: true,
disabled: true,
},
},
{
field: 'biddingAgency',
label: '招标代理',
required: false,
component: 'Input',
colProps: { span: 7, offset: 1 },
},
{
field: 'procurementMethod',
label: '招标采购方式',
required: true,
component: 'Select',
componentProps: {
options: [
{
label: '建委招标',
value: '建委招标',
},
{
label: '平台招标',
value: '平台招标',
},
{
label: '邀标比选',
value: '邀标比选',
},
{
label: '直接委托',
value: '直接委托',
},
{
label: '评定分离',
value: '评定分离',
},
],
},
colProps: { span: 7, offset: 1 },
},
{
label: '评标办法',
field: 'evaluationMethod',
required: false,
component: 'Input',
colProps: { span: 7, offset: 1 },
},
{
field: 'field11',
component: 'BasicTitle',
label: '招标结果及完成情况汇总',
componentProps: {
// line: true,
span: true,
},
colProps: {
span: 24,
},
},
{
label: '招标完成情况',
field: 'completionStatus',
required: true,
component: 'InputTextArea',
componentProps: {
maxlength: 100,
showCount: true,
},
colProps: { span: 7, offset: 1 },
},
{
label: '开标时间',
field: 'openingTime',
required: true,
component: 'InputTextArea',
componentProps: {
maxlength: 100,
showCount: true,
},
colProps: { span: 7, offset: 1 },
},
{
field: 'winningBidder',
label: '中标单位',
required: true,
component: 'Input',
colProps: { span: 7, offset: 1 },
},
{
field: 'winningAmount',
label: '中标金额',
required: true,
component: 'InputNumber',
componentProps: {
addonAfter: '元',
},
colProps: { span: 7, offset: 1 },
},
{
field: 'winningPeriod',
label: '中标工期',
required: true,
component: 'Input',
colProps: { span: 7, offset: 1 },
},
{
field: 'signingDate',
label: '合同签订日期',
required: true,
component: 'Input',
colProps: { span: 7, offset: 1 },
},
{
label: '会议纪要',
field: 'meetingMinute',
required: true,
component: 'InputTextArea',
componentProps: {
maxlength: 100,
showCount: true,
},
colProps: { span: 7, offset: 1 },
},
{
field: 'releaseChannels',
label: '招标信息发布渠道',
required: true,
component: 'Select',
componentProps: {
options: [
{
label: '中国招标投标公共服务平台',
value: '中国招标投标公共服务平台',
},
{
label: '公司OA和公众号',
value: '公司OA和公众号',
},
{
label: '天津市公共资源交易中心',
value: '天津市公共资源交易中心',
},
{
label: '邮箱',
value: '邮箱',
},
{
label: '其他',
value: '其他',
},
],
},
colProps: { span: 7, offset: 1 },
},
{
field: 'detailedInformation',
label: '招标信息发布渠道-其他(详细填写)',
required: false,
component: 'Input',
colProps: { span: 7, offset: 1 },
},
{
field: 'publishWebsite',
label: '招标公告发布网址(仅限公开招标项目)',
required: false,
component: 'Input',
colProps: { span: 7, offset: 1 },
},
{
field: 'publicityWebsite',
label: '中标结果公示网址(仅限公开招标项目)',
required: false,
component: 'Input',
colProps: { span: 7, offset: 1 },
},
{
field: 'isReportingSituation',
label: '是否存在投诉举报情况',
required: true,
component: 'Select',
componentProps: {
style: {
width: '100%',
},
options: [
{
label: '是',
value: '是',
},
{
label: '否',
value: '否',
},
],
},
colProps: { span: 7, offset: 1 },
},
{
label: '投诉举报解决处理情况',
field: 'handSituation',
required: false,
component: 'InputTextArea',
componentProps: {
maxlength: 100,
showCount: true,
},
colProps: { span: 7, offset: 1 },
},
{
label: '备注',
field: 'remark',
// required: true,
component: 'InputTextArea',
componentProps: {
maxlength: 100,
showCount: true,
},
colProps: { span: 7, offset: 1 },
},
];
This diff is collapsed.
This diff is collapsed.
<template>
<div style="margin: 16px">
<PageCard title="统计招标管理">
<BasicForm ref="formElRef" @register="registerForm">
<template #formFooter>
<a-button type="primary" @click="handleSubmit"> 查询</a-button>
<a-button type="primary" @click="exportCount" style="margin-left: 10px"> 导出</a-button>
</template>
</BasicForm>
<Table
:pagination="false"
:dataSource="dataSource"
:columns="columns"
bordered
:loading="loadingRef"
:rowClassName="setRowClassName"
:scroll="{ x: 1300, y: 350 }"
/>
</PageCard>
<StatisticWindow @register="register" />
</div>
</template>
<script lang="ts" setup>
import { onMounted, ref } from 'vue';
import { Table } from 'ant-design-vue';
import { BasicForm, FormActionType, useForm } from '@/components/Form';
import StatisticWindow from '@/views/monthlyPlan/statisticWindow/statisticWindow.vue';
import { useModal } from '@/components/Modal';
import { useRouter } from 'vue-router';
import PageCard from '@/components/Page/src/PageCard.vue';
import { downloadByData } from '@/utils/file/download';
import { useUserStore } from '@/store/modules/user';
import moment from 'moment';
import { getDepartmentList } from '@/api/project/settlementManage';
import { exportTender, selectListAll } from '@/api/project/yearTenderMan';
const params = ref({ tenderYear: '', companyName: '' });
const deptId = '' + useUserStore().userInfo.deptParentId;
const seach = ref([
{
field: 'tenderYear',
label: '',
component: 'DatePicker',
componentProps: {
placeholder: '年份',
picker: 'year',
defaultValue: moment().format('YYYY'),
valueFormat: 'YYYY',
format: 'YYYY',
style: {
width: '100%',
},
},
colProps: { span: 4 },
},
{
field: 'companyId',
label: '',
component: 'Select',
ifShow: deptId === '100',
componentProps: {
options: [],
placeholder: '公司名称',
},
colProps: { span: 4 },
},
]);
onMounted(async () => {
const data = await getDepartmentList();
seach.value[1].componentProps.options = data;
params.value.tenderYear = moment().format('YYYY');
getStatisticList();
});
const [register, { openModal: openModal }] = useModal();
const formElRef = ref<Nullable<FormActionType>>(null);
const [registerForm, { getFieldsValue }] = useForm({
labelWidth: 90,
baseColProps: { span: 24 },
schemas: seach,
showActionButtonGroup: false,
});
async function exportCount() {
const data = await exportTender(params.value);
downloadByData(data, '年度招标管理统计报表' + '.xls');
}
const loadingRef = ref(false);
function handleSubmit() {
let data = getFieldsValue();
params.value = data;
getStatisticList();
}
function setRowClassName(record) {
if (record.projectName === '总计(万元)') {
return 'rowcolor';
}
if (record.companyName === '合计(万元)') {
return 'rowcolor';
} else {
return;
}
}
async function getStatisticList() {
loadingRef.value = true;
let data = await selectListAll(params.value);
let propsList = ['companyName', 'projectName'];
propsList.map((item) => {
changeData(data, item);
});
loadingRef.value = false;
}
function changeData(data, field) {
if (field == 'companyName') {
let count = 0; //重复项的第一项
let indexCount = 1; //下一项
while (indexCount < data.length) {
let item = data.slice(count, count + 1)[0]; //获取没有比较的第一个对象
if (!item[`${field}rowSpan`]) {
item[`${field}rowSpan`] = 1; //初始化为1
}
if (item[field] === data[indexCount][field]) {
//第一个对象与后面的对象相比,有相同项就累加,并且后面相同项设置为0
item[`${field}rowSpan`]++;
data[indexCount][`${field}rowSpan`] = 0;
} else {
count = indexCount;
}
indexCount++;
}
}
if (field == 'proName') {
let count = 0; //重复项的第一项
let indexCount = 1; //下一项
while (indexCount < data.length) {
let item = data.slice(count, count + 1)[0]; //获取没有比较的第一个对象
if (!item[`${field}rowSpan`]) {
item[`${field}rowSpan`] = 1; //初始化为1
}
if (
item[field] === data[indexCount][field] &&
item['companyName'] === data[indexCount]['companyName']
) {
//第一个对象与后面的对象相比,有相同项就累加,并且后面相同项设置为0
item[`${field}rowSpan`]++;
data[indexCount][`${field}rowSpan`] = 0;
} else {
count = indexCount;
}
indexCount++;
}
}
dataSource.value = data;
}
// 列表
const dataSource = ref([]);
// 表头
const columns = [
{
title: '公司名称',
dataIndex: 'companyName',
fixed: 'left',
width: 180,
customCell: (_, any) => ({
rowSpan: _.companyNamerowSpan,
}),
},
{
title: '项目名称',
dataIndex: 'projectName',
width: 180,
fixed: 'left',
customCell: (_, any) => ({
rowSpan: _.projectNamerowSpan,
}),
},
{
title: '招标方案',
dataIndex: '',
children: [
{
title: '招标类型',
dataIndex: 'biddingType',
width: 180,
},
{
title: '招标控制价(万元)',
dataIndex: 'controlPrice',
width: 180,
},
],
},
{
title: '招标情况',
dataIndex: '',
children: [
{
title: '中标单位',
dataIndex: 'winningBidder',
width: 180,
},
{
title: '中标金额(万元)',
dataIndex: 'winningAmount',
width: 180,
},
],
},
];
const { push } = useRouter();
</script>
<style lang="less" scoped>
::v-deep .ant-table-tbody .ant-table-row {
&.rowcolor .ant-table-cell-fix-left {
background-color: #f5f5f5;
}
}
</style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment