Commit 1ed821ba authored by 罗林杰's avatar 罗林杰

Merge remote-tracking branch 'origin/develop' into develop

parents 56ab86db 1a23b014
......@@ -16,6 +16,8 @@ enum Api {
selectCount = '/pro/tenderManager/selectCount',
Itemdelete = '/pro/tenderManager/details/del',
audit = '/pro/tenderManager/examine',
GetListAll = '/pro/tenderManager/selectAll',
ExportCount = '/pro/export/tendMangeStatistic'
}
export const getListByPage = (params?: ProjectPageParams) =>
defHttp.post<ListGetResultModel>({ url: Api.GetList, data: params });
......@@ -59,3 +61,16 @@ export const selectCount = (params?: any) =>
url: Api.selectCount,
data: params,
});
export const getListAll = (params?: any) =>
defHttp.post<ProjectModel>({ url: Api.GetListAll, data: params });
export const exportStatisticList = (params?: any) =>
defHttp.post<any>(
{
url: Api.ExportCount,
data: params,
responseType: 'blob',
},
{ errorMessageMode: 'none', isTransformResponse: false },
);
......@@ -35,6 +35,16 @@ const biddingPlan: AppRouteModule = {
orderNo: 3,
},
},
{
path: 'statisticsBidding',
name: 'statisticsBidding',
component: () => import('@/views/biddingManagement/statisticsBidding.vue'),
meta: {
auth: '/www/dist/index.html#/biddingManagement/index',
title: '招标情况统计',
orderNo: 3,
},
},
{
path: 'situationEdit',
name: 'situationEdit',
......
......@@ -81,34 +81,6 @@ export const searchFormSchema: FormSchema[] = [
},
colProps: { span: 4 },
},
{
field: 'companyName',
label: '',
component: 'Select',
componentProps: {
placeholder: '公司名称',
options: [
{
label: '公司名称',
value: '公司名称',
key: '公司名称',
},
],
},
colProps: { span: 4 },
},
// {
// field: 'status',
// label: '状态',
// component: 'Select',
// componentProps: {
// options: [
// { label: '启用', value: '1' },
// { label: '停用', value: '0' },
// ],
// },
// colProps: { span: 8 },
// },
];
export const formSchema: FormSchema[] = [
......@@ -119,6 +91,7 @@ export const formSchema: FormSchema[] = [
component: 'Input',
componentProps: {
readonly: true,
disabled: true,
},
colProps: { span: 7, offset: 1 },
},
......@@ -130,6 +103,7 @@ export const formSchema: FormSchema[] = [
component: 'Input',
componentProps: {
readonly: true,
disabled: true,
},
colProps: { span: 7, offset: 1 },
},
......@@ -211,6 +185,7 @@ export const formSchema: FormSchema[] = [
colProps: { span: 7, offset: 1 },
componentProps: {
readonly: true,
disabled: true,
},
},
{
......
......@@ -8,26 +8,51 @@
>
<template #extra>
<!-- <a-button type="primary" danger> 删除 </a-button>-->
<a-button type="primary" v-if="!disabled" @click="handleSubmit"> 提交 </a-button>
<a-button type="primary" v-if="!disabled" :disabled="loadingRef" @click="handleSubmit('0')"> 暂存 </a-button>
<a-button type="primary" v-if="!disabled" @click="handleSubmit('1')"> 提交 </a-button>
<a-button type="primary" @click="history" v-if="historyData">历史记录 </a-button>
<a-button type="default" @click="router.back()"> 返回 </a-button>
</template>
<template v-for="(item, index) in tabsFormSchema">
<PageCard v-if="item.show" :key="index" :title="item.name">
<template #right>
<CollapseContainer v-for="(item, index) in tabsFormSchema" :key="index">
<template #title>
<span class="projectName">{{ item.name }}</span>
</template>
<template #action>
<a-button
v-if="!disabled"
type="text"
preIcon="ant-design:delete-outlined"
danger
@click="deleteItem(index)"
/>
@click="deleteItemPro(index)"
>删除项目</a-button
>
</template>
<BasicForm :loading="loading" @register="item.Form[0]" />
</PageCard>
<!-- 左上角为项目名 -->
<CollapseContainer
v-for="(content, key) in item.list"
:key="key"
class="subCard"
:title="content.name"
>
<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">
从项目库导入
</a-button>
......@@ -59,6 +84,8 @@
//历史记录
import Operations from '@/components/Operations/Operations.vue';
import { addItem, updateItem, getItem } from '@/api/project/biddingManagement';
import CollapseContainer from '@/components/Container/src/collapse/CollapseContainer.vue';
//历史记录是否可查
const historyData = ref(true);
//页面传递过来了的id
......@@ -90,7 +117,7 @@
} else {
isUpdate.value = true;
tenderId.value = id;
formData.value.tenderld = id;
formData.value.tenderId = id;
disabled.value = route.query.disabled == '0' ? false : true;
if (disabled.value) {
getTitle.value = '查看招标管理';
......@@ -102,7 +129,7 @@
for (let i = 0; i < res.length; i++) {
const source = res[i];
const item = {
name: '序号' + (i + 1),
name: '项目:' + source.projectName,
show: true,
forceRender: true,
Form: useForm(
......@@ -153,12 +180,21 @@
});
}
}
/*删除项目表单*/
async function deleteItemPro(index: any) {
console.log(formData.value);
formData.value.tenderPlanPro.splice(index, 1);
tabsFormSchema.splice(index, 1);
loadingRef.value = false;
console.log(formData.value);
// }
}
/***
*
*/
async function handleNew(info: any) {
const item = {
name: '序号' + (tabsFormSchema.length + 1),
name: '项目:'+info.projectName,
forceRender: true,
show: true,
Form: useForm(Object.assign({ schemas: formSchema }, baseFormConfig) as FormProps),
......@@ -179,20 +215,7 @@
}
async function deleteItem(index: any) {
formData.value.tenderPlanPro.splice(index, 1);
// loadingRef.value = true;
// const id = formData.value.tenderPlanPro[index].id;
// if (id) {
// await Itemdelete({
// id,
// });
// formData.value.tenderPlanPro.splice(index, 1);
// tabsFormSchema.splice(index, 1);
// loadingRef.value = false;
// tabsFormSchema[index].show = false;
tabsFormSchema.splice(index, 1);
// loadingRef.value = false;
// }
}
async function handleAdd() {
......@@ -204,32 +227,108 @@
console.log(params);
handleNew(params);
}
async function handleSubmit() {
async function handleSubmit(isSubmit) {
for(let i = 0; i < tabsFormSchema.length; i++){
let formSchema = tabsFormSchema[i].Form[1]
const { updateSchema } = formSchema
await nextTick(() => {
if (isSubmit == '0') {
updateSchema([
{field: 'projectName', required: false},
{field: 'fundingSource', required: false},
{field: 'investmentAmount', required: false},
{field: 'field11', required: false},
{field: 'biddingType', required: false},
{field: 'tenderContent', required: false},
{field: 'controlPrice', required: false},
{field: 'constructionMode', required: false},
{field: 'procurementMethod', required: false},
{field: 'evaluationMethod', required: false},
{field: 'field11', required: false},
{field: 'completionStatus', required: false},
{field: 'openingTime', required: false},
{field: 'winningBidder', required: false},
{field: 'winningAmount', required: false},
{field: 'winningPeriod', required: false},
{field: 'signingDate', required: false},
{field: 'meetingMinute', required: false},
{field: 'releaseChannels', required: false},
{field: 'detailedInformation', required: false},
{field: 'publishWebsite', required: false},
{field: 'publicityWebsite', required: false},
{field: 'isReportingSituation', required: false},
{field: 'handSituation', required: false},
{
field: 'remark', dynamicRules: ({values}) => {
return [{required: false,}]
},
},
])
} else {
updateSchema([
{field: 'projectName', required: true},
{field: 'fundingSource', required: true},
{field: 'investmentAmount', required: true},
{field: 'field11', required: true},
{field: 'biddingType', required: true},
{field: 'tenderContent', required: true},
{field: 'controlPrice', required: true},
{field: 'constructionMode', required: true},
{field: 'procurementMethod', required: true},
{field: 'evaluationMethod', required: true},
{field: 'field11', required: true},
{field: 'completionStatus', required: true},
{field: 'openingTime', required: true},
{field: 'winningBidder', required: true},
{field: 'winningAmount', required: true},
{field: 'winningPeriod', required: true},
{field: 'signingDate', required: true},
{field: 'meetingMinute', required: true},
{field: 'releaseChannels', required: true},
{field: 'detailedInformation', required: true},
{field: 'publishWebsite', required: true},
{field: 'publicityWebsite', required: true},
{field: 'isReportingSituation', required: true},
{field: 'handSituation', required: true},
{
field: 'remark', dynamicRules: ({values}) => {
return values.fundGap ? [{required: true, message: '说明必填'}] : [];
},
}
])
}
})
}
loadingRef.value = true;
console.log('333333')
try {
for (let i = 0; i < tabsFormSchema.length; i++) {
console.log('4444')
let item = tabsFormSchema[i];
if (item.show) {
const { validate, getFieldsValue } = item.Form[1];
await validate();
let res = getFieldsValue();
formData.value.tenderPlanPro[i] = deepMerge(formData.value.tenderPlanPro[i], res);
console.log(formData.value.tenderPlanPro);
}
}
formData.value.proNumber = formData.value.tenderPlanPro.Length;
formData.value.proNumber = formData.value.tenderPlanPro.Length;
formData.value.isSubmit = isSubmit;
console.log('formData.value:',formData.value)
let res = isUpdate.value ? await updateItem(unref(formData)) : await addItem(unref(formData));
loadingRef.value = true;
addItemData.operateType = operateType.update;
addItemData.businessId = routeId.value;
addItemData.businessType = '招标管理';
const showDatem = await addItemApi(addItemData);
console.log(showDatem, '记录添加成功');
console.log(res);
if (isSubmit === '0'){
createMessage.success('暂存成功!');
}else{
createMessage.success('提交成功!');
router.back();
}
// router.back();
} catch (e) {
// 验证失败或出错,切换到对应标签页
console.log(e);
......@@ -245,3 +344,18 @@
console.log('历史记录');
}
</script>
<style scoped>
.subCard {
border: 1px solid #e8eaec;
}
.projectName {
border-left: blue solid 6px;
padding-left: 10px;
font-weight: bold;
}
.contractName {
border-left: red solid 6px;
padding-left: 10px;
font-weight: bold;
}
</style>
......@@ -49,7 +49,7 @@
confirm: examine.bind(null, record, true),
},
ifShow: (_action) => {
return record.reviewStatus == '0'||record.reviewStatus == null;
return (record.reviewStatus == '0'||record.reviewStatus == null) && record.isSubmit == '1' && deptId !== '100';
},
},
]"
......@@ -76,9 +76,11 @@
import yearModal from '@/components/yearModal.vue';
import { useRouter } from 'vue-router';
import { useMessage } from '@/hooks/web/useMessage';
import {onMounted} from "vue";
import {onMounted, ref} from "vue";
import {getDepartmentList} from "@/api/project/settlementManage";
import { useUserStore } from '@/store/modules/user';
const deptId = ref('');
const { push } = useRouter();
const { createMessage } = useMessage();
const { error } = createMessage;
......@@ -106,6 +108,8 @@
const [register, { openModal: openModal, closeModal: closeModal }] = useModal();
onMounted(async () => {
deptId.value = useUserStore().userInfo.deptId;
// console.log('deptId.value:',deptId.value)
const data = await getDepartmentList();
searchFormSchema[2].componentProps.options = data;
});
......
<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 }"
>
</Table>
</PageCard>
<StatisticWindow @register="register" />
</div>
</template>
<script lang="ts" setup>
import { onMounted, ref } from 'vue';
import { Table } from 'ant-design-vue';
import { getListAll,exportStatisticList } from '@/api/project/biddingManagement.js';
import {BasicForm, FormActionType, FormSchema, 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";
const seach = ref([
{
field: 'tenderYear',
label: '',
component: 'DatePicker',
componentProps: {
placeholder: '年份',
picker: 'year',
valueFormat: 'YYYY',
format: 'YYYY',
style: {
width: '100%',
},
},
colProps: { span: 4 },
},
{
field: 'biddingQuarter',
label: '',
component: 'Select',
componentProps: {
placeholder: '季度',
options: [
{
label: '第一季度',
value: '第一季度',
},
{
label: '第二季度',
value: '第二季度',
},
{
label: '第三季度',
value: '第三季度',
},
{
label: '第四季度',
value: '第四季度',
},
],
},
colProps: { span: 4 },
},
])
const deptId = ref('');
onMounted(async () => {
deptId.value = useUserStore().userInfo.deptId;
getStatisticList();
});
// defineOptions({ name: 'MonthlyPlan' });
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 params = getFieldsValue();
const data = await exportStatisticList(params);
downloadByData(data, '招标管理统计报表' + '.xlsx');
}
const loadingRef = ref(false);
function handleSubmit() {
getStatisticList();
}
function setRowClassName(record) {
if (record.projectName === '总计(万元)') {
return 'rowcolor';
}
if (record.companyName === '合计(万元)'){
return 'rowcolor';
} else {
return;
}
}
function getCurrentDateFormatted() {
const now = new Date();
const year = now.getFullYear();
const month = (now.getMonth() + 1).toString().padStart(2, '0'); // 月份从0开始,所以要加1,并且格式化为两位数
return `${year}-${month}`;
}
async function getStatisticList() {
const params = getFieldsValue();
if (params.tenderYear === undefined || params.tenderYear === null){
// 创建一个表示当前日期和时间的 Date 对象
var currentDate = new Date();
// 使用 getFullYear() 方法获取当前年份
var currentYear = currentDate.getFullYear();
columns[0].title = currentYear+'年招标管理'
}else {
columns[0].title = params.tenderYear + '年招标管理';
}
loadingRef.value = true;
let data = await getListAll(params);
// dataSource.value = data;
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) {
var 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 == 'projectName'){
let count = 0; //重复项的第一项
let indexCount = 1; //下一项
while (indexCount < data.length) {
var 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 columns1 = [
{
title: '',
dataIndex: '',
fixed: 'left',
children: [
{
title: '公司名称',
dataIndex: 'companyName',
fixed: 'left',
width: 180,
customCell: (_, any) => ({
rowSpan: _.companyNamerowSpan,
}),
},
{
title: '项目名称',
fixed: 'left',
dataIndex: 'sourceType',
width: 180,
slots: { customRender: 'sourceType' },
},
{
title: '合同额(万元)',
fixed: 'left',
dataIndex: 'contractAmount',
width: 180,
},
],
},
{
title: '202X年招标管理',
dataIndex: '',
children: [
{
title: '上月实际完成值(万元)',
dataIndex: 'completionValueActual',
width: 180,
},
{
title: '累计完成值(万元)',
dataIndex: 'accumulateCompletionValue',
width: 180,
},
{
title: '本月计划完成值(万元)',
dataIndex: 'planCompletionValue',
width: 180,
},
{
title: '上月计划数(万元)',
dataIndex: 'lastMonthPlan',
width: 180,
},
],
},
{
title: '资金支付情况',
dataIndex: '',
children: [
{
title: '上月实付数(万元)',
dataIndex: 'lastMonthActual',
width: 180,
},
{
title: '累计支付数(万元)',
dataIndex: 'accumulatePayment',
width: 180,
},
{
title: '本月计划数(万元)',
dataIndex: 'thisPlanNumber',
width: 180,
},
],
},
{
title: '资金来源',
dataIndex: '',
children: [
{
title: '专项债拨款(万元)',
dataIndex: 'specialFund',
width: 180,
},
{
title: '政府拨款(万元)',
dataIndex: 'governmentFund',
width: 180,
},
{
title: '银行融资(万元)',
dataIndex: 'banFinancing',
width: 180,
},
{
title: '自有资金(万元)',
dataIndex: 'ownFund',
width: 180,
},
{
title: '资金缺口',
dataIndex: 'fundGap',
width: 180,
},
],
},
];
const columns = [
{
title: '202X年招标管理',
dataIndex: '',
children: [
{
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>
......@@ -348,67 +348,72 @@
}
/*提交表单*/
async function handleSubmit(isSubmit) {
for(let i = 0; i < tabsFormSchema.length; i++){
let formProjectSchema = tabsFormSchema[i].Form[1]
const { updateSchema } = formProjectSchema
if(isSubmit == '0'){
for (let i = 0; i < tabsFormSchema.length; i++) {
let formProjectSchema = tabsFormSchema[i].Form[1];
const { updateSchema } = formProjectSchema;
if (isSubmit == '0') {
updateSchema([
{field: 'projectName' ,required: false},
{field: 'sourceType' ,required: false},
])
{ field: 'projectName', required: false },
{ field: 'sourceType', required: false },
]);
}
for(let j = 0; j < tabsFormSchema[i].list.length; j++){
let formSchema = tabsFormSchema[i].list[j].form[1]
for (let j = 0; j < tabsFormSchema[i].list.length; j++) {
let formSchema = tabsFormSchema[i].list[j].form[1];
const { updateSchema } = formSchema
console.log(subFormSchema)
nextTick(()=>{
if(isSubmit == '0'){
const { updateSchema } = formSchema;
console.log(subFormSchema);
nextTick(() => {
if (isSubmit == '0') {
updateSchema([
{field: 'contrcatName' ,required: false},
{field: 'collectingUnit' ,required: false},
{field: 'contractAmount' ,required: false},
{field: 'paymentLevel' ,required: false},
{field: 'completionValueActual' ,required: false},
{field: 'accumulateCompletionValue' ,required: false},
{field: 'planCompletionValue' ,required: false},
{field: 'lastMonthPlan' ,required: false},
{field: 'lastMonthActual' ,required: false},
{field: 'accumulatePayment' ,required: false},
{field: 'thisPlanNumber' ,required: false},
{field: 'specialFund' ,required: false},
{field: 'governmentFund' ,required: false},
{field: 'banFinancing' ,required: false},
{field: 'ownFund' ,required: false},
{field: 'fundGap' ,required: false},
{field: 'remark' , dynamicRules: ({ values }) => {
return [{ required: false, }]
},},
])
}else{
{ field: 'contrcatName', required: false },
{ field: 'collectingUnit', required: false },
{ field: 'contractAmount', required: false },
{ field: 'paymentLevel', required: false },
{ field: 'completionValueActual', required: false },
{ field: 'accumulateCompletionValue', required: false },
{ field: 'planCompletionValue', required: false },
{ field: 'lastMonthPlan', required: false },
{ field: 'lastMonthActual', required: false },
{ field: 'accumulatePayment', required: false },
{ field: 'thisPlanNumber', required: false },
{ field: 'specialFund', required: false },
{ field: 'governmentFund', required: false },
{ field: 'banFinancing', required: false },
{ field: 'ownFund', required: false },
{ field: 'fundGap', required: false },
{
field: 'remark',
dynamicRules: ({ values }) => {
return [{ required: false }];
},
},
]);
} else {
updateSchema([
{field: 'contrcatName' ,required: true},
{field: 'collectingUnit' ,required: true},
{field: 'contractAmount' ,required: true},
{field: 'paymentLevel' ,required: true},
{field: 'completionValueActual' ,required: true},
{field: 'accumulateCompletionValue' ,required: true},
{field: 'planCompletionValue' ,required: true},
{field: 'lastMonthPlan' ,required: true},
{field: 'lastMonthActual' ,required: true},
{field: 'accumulatePayment' ,required: true},
{field: 'thisPlanNumber' ,required: true},
{field: 'specialFund' ,required: true},
{field: 'governmentFund' ,required: true},
{field: 'banFinancing' ,required: true},
{field: 'ownFund' ,required: true},
{field: 'remark' , dynamicRules: ({ values }) => {
{ field: 'contrcatName', required: true },
{ field: 'collectingUnit', required: true },
{ field: 'contractAmount', required: true },
{ field: 'paymentLevel', required: true },
{ field: 'completionValueActual', required: true },
{ field: 'accumulateCompletionValue', required: true },
{ field: 'planCompletionValue', required: true },
{ field: 'lastMonthPlan', required: true },
{ field: 'lastMonthActual', required: true },
{ field: 'accumulatePayment', required: true },
{ field: 'thisPlanNumber', required: true },
{ field: 'specialFund', required: true },
{ field: 'governmentFund', required: true },
{ field: 'banFinancing', required: true },
{ field: 'ownFund', required: true },
{
field: 'remark',
dynamicRules: ({ values }) => {
return values.fundGap ? [{ required: true, message: '说明必填' }] : [];
},}
])
},
},
]);
}
})
});
}
}
console.log('moth的值', moth.value);
......
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