Commit 50c111d7 authored by jiaxu.yan's avatar jiaxu.yan

feat: 完成月度

parent 0cf9d504
import { BasicPageParams, BasicFetchResult } from '@/api/model/baseModel';
export type ProjectParams = {
projectName?: string;
};
export type ProjectPageParams = BasicPageParams & ProjectParams;
export interface ProjectListItem {
id: string;
projectName: string;
isReserveProject: string;
constructionSite: string;
constructionMode: string;
projectType: string;
projectOverview: string;
constructionPurpose: string;
delFlag: string;
constructionScale: string;
fundingSource: string;
implementingEntity: string;
logo: string;
createTime: null;
createBy: string;
updateTime: null;
updateBy: string;
}
export interface ProjectModel {
id?: string | number;
constructionMode: string;
isReserveProject: string;
projectType: string;
projectOverview: string;
constructionPurpose: string;
}
export interface ProjectCountModel {
counttotal: number;
countbuildbyoneself: number;
countbuildbyentrust: number;
countbuildbyreplace: number;
countbuildbyhold: number;
countreserve: number;
}
export type ProjectListGetResultModel = BasicFetchResult<ProjectListItem>;
...@@ -33,5 +33,12 @@ export interface ProjectModel { ...@@ -33,5 +33,12 @@ export interface ProjectModel {
projectOverview: string; projectOverview: string;
constructionPurpose: string; constructionPurpose: string;
} }
export interface ProjectCountModel {
counttotal: number;
countbuildbyoneself: number;
countbuildbyentrust: number;
countbuildbyreplace: number;
countbuildbyhold: number;
countreserve: number;
}
export type ProjectListGetResultModel = BasicFetchResult<ProjectListItem>; export type ProjectListGetResultModel = BasicFetchResult<ProjectListItem>;
import { ProjectParams, ProjectListGetResultModel, ProjectModel } from './model/projectModel'; import {
ProjectParams,
ProjectListGetResultModel,
ProjectModel,
} from './model/projectModel';
import { defHttp } from '@/utils/http/axios'; import { defHttp } from '@/utils/http/axios';
enum Api { enum Api {
GetList = '/pro/monthEngineer/page', GetList = '/pro/monthEngineer/page',
GetMonthlyPlanProjectList = '/pro/fundPlanYear/selectplan', AddProject = '/pro/monthEngineer/add',
UpdateProject = '/pro/monthEngineer/update',
DeleteProject = '/pro/monthEngineer/delInTable',
ProjectDetail = '/pro/monthEngineer/details',
Itemdelete = '/pro/monthEngineer/delByDetail',
audit = '/pro/monthEngineer/audit',
} }
export const getMonthlyPlanList = (params?: ProjectParams) => export const getMonthlyPlanList = (params?: ProjectParams) =>
defHttp.post<ProjectModel>({ url: Api.GetList, data: params }); defHttp.post<ProjectModel>({ url: Api.GetList, data: params });
export const getMonthlyPlanProjectList = (params?: ProjectParams) => export const addItem = (params?: any) =>
defHttp.post<ProjectModel>({ url: Api.GetMonthlyPlanProjectList, data: params }); defHttp.post<ProjectModel>({
url: Api.AddProject,
data: params,
headers: {
'Content-Type': 'application/json;charset=UTF-8',
},
});
export const updateItem = (params?: any) =>
defHttp.post<ProjectModel>({
url: Api.UpdateProject,
data: params,
headers: {
'Content-Type': 'application/json;charset=UTF-8',
},
});
export const auditItem = (params?: any) =>
defHttp.get<ProjectModel>({
url: Api.audit,
params,
});
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<ProjectModel>({ url: Api.ProjectDetail, params });
...@@ -3,6 +3,7 @@ import { ...@@ -3,6 +3,7 @@ import {
ProjectListGetResultModel, ProjectListGetResultModel,
ProjectModel, ProjectModel,
ProjectListItem, ProjectListItem,
ProjectCountModel
} from './model/projectModel'; } from './model/projectModel';
import { defHttp } from '@/utils/http/axios'; import { defHttp } from '@/utils/http/axios';
...@@ -12,6 +13,7 @@ enum Api { ...@@ -12,6 +13,7 @@ enum Api {
UpdateProject = '/pro/project/update', UpdateProject = '/pro/project/update',
DeleteProject = '/pro/project/del', DeleteProject = '/pro/project/del',
ProjectDetail = '/pro/project/details', ProjectDetail = '/pro/project/details',
ProjectCount = '/pro/project/count',
} }
export const getListByPage = (params?: ProjectParams) => export const getListByPage = (params?: ProjectParams) =>
defHttp.post<ProjectListGetResultModel>({ url: Api.GetList, data: params }); defHttp.post<ProjectListGetResultModel>({ url: Api.GetList, data: params });
...@@ -27,3 +29,6 @@ export const deleteItem = (params?: any) => ...@@ -27,3 +29,6 @@ export const deleteItem = (params?: any) =>
export const getItem = (params?: any) => export const getItem = (params?: any) =>
defHttp.get<ProjectListItem>({ url: Api.ProjectDetail, params }); defHttp.get<ProjectListItem>({ url: Api.ProjectDetail, params });
export const getProjectCount = (params?: any) =>
defHttp.post<ProjectCountModel>({ url: Api.ProjectCount, params });
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
width="70%" width="70%"
v-bind="$attrs" v-bind="$attrs"
@register="register" @register="register"
title="选择项目导入" title="选择合同导入"
:minHeight="30" :minHeight="30"
okText="导入" okText="导入"
@ok="handleSubmit" @ok="handleSubmit"
......
...@@ -64,6 +64,24 @@ ...@@ -64,6 +64,24 @@
colProps: { span: 11, offset: 1 }, colProps: { span: 11, offset: 1 },
}); });
} }
if (i == 'month') {
schemas.push({
field: 'month',
label: '',
component: 'DatePicker',
required: true,
componentProps: {
placeholder: '月份',
picker: 'month',
valueFormat: 'YYYY-MM',
format: 'YYYY-MM',
style: {
width: '100%',
},
},
colProps: { span: 11, offset: 1 },
});
}
if (i == 'quarter') { if (i == 'quarter') {
schemas.push({ schemas.push({
field: 'quarter', field: 'quarter',
......
...@@ -42,7 +42,7 @@ const monthlyPlan: { ...@@ -42,7 +42,7 @@ const monthlyPlan: {
component: () => import('@/views/monthlyPlan/monthlyPlanEdit/monthlyPlanEdit.vue'), component: () => import('@/views/monthlyPlan/monthlyPlanEdit/monthlyPlanEdit.vue'),
meta: { meta: {
// affix: true, // affix: true,
title: '新建计划(工程)', title: '月度工程资金计划',
orderNo: 8, orderNo: 8,
}, },
}, },
......
...@@ -2,31 +2,56 @@ ...@@ -2,31 +2,56 @@
<div> <div>
<BasicTable @register="registerTable" :title="'月度工程资金计划'"> <BasicTable @register="registerTable" :title="'月度工程资金计划'">
<template #toolbar> <template #toolbar>
<a-button class="btn" type="primary" @click="addMonthlyPlan"> 新建月度工程资金计划 </a-button> <a-button class="btn" type="primary" @click="addMonthlyPlan">
新建月度工程资金计划
</a-button>
</template> </template>
<template #bodyCell="{ column, text, record, index }"> <template #bodyCell="{ column, text, record, index }">
<!-- 当前列是序号列时,显示序号 --> <!-- 当前列是序号列时,显示序号 -->
<span v-if="column.dataIndex === 'serialNumber'">{{ index + 1 }}</span> <span v-if="column.dataIndex === 'serialNumber'">{{ index + 1 }}</span>
<!-- 其他列正常显示 --> <!-- 其他列正常显示 -->
<span v-else>{{ text }}</span> <span v-else>{{ text }}</span>
<template v-if="column.key === 'action'"> <template v-if="column.key === 'action'">
<TableAction <TableAction
:actions="[ :actions="[
{
label: '详情',
onClick: handleEdit.bind(null, record, 1),
ifShow: (_action) => {
return record.reviewStatus == '1';
},
},
{ {
icon: 'clarity:note-edit-line', label: '修改',
onClick: handleEdit.bind(null, record), onClick: handleEdit.bind(null, record, 0),
ifShow: (_action) => {
return record.reviewStatus == 0;
},
}, },
{ {
icon: 'ant-design:delete-outlined', label: '删除',
color: 'error', color: 'error',
popConfirm: { popConfirm: {
title: '是否确认删除', title: '是否确认删除',
placement: 'left', placement: 'left',
confirm: handleDelete.bind(null, record), confirm: handleDelete.bind(null, record),
}, },
ifShow: (_action) => {
return record.reviewStatus == 0;
},
},
{
label: '审核',
color: 'success',
popConfirm: {
title: '是否确认审核',
placement: 'left',
confirm: examine.bind(null, record, true),
},
ifShow: (_action) => {
return record.reviewStatus == 0;
},
}, },
]" ]"
/> />
...@@ -37,82 +62,85 @@ ...@@ -37,82 +62,85 @@
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { BasicTable, useTable, TableAction } from '@/components/Table'; import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getMonthlyPlanList } from '@/api/project/monthlyPlan'; import { getMonthlyPlanList, deleteItem, auditItem } from '@/api/project/monthlyPlan';
import { getListByPage } from '@/api/project/biddingPlan'; import { useDrawer } from '@/components/Drawer';
import { useDrawer } from '@/components/Drawer'; import { columns, searchFormSchema } from './data';
import { columns, searchFormSchema } from './data'; defineOptions({ name: 'MonthlyPlan' });
defineOptions({ name: 'MonthlyPlan' }); import yearModal from '@/components/yearModal.vue';
import yearModal from '@/components/yearModal.vue'; import { useModal } from '@/components/Modal';
import { useModal } from '@/components/Modal'; import { useRouter } from 'vue-router';
const { push } = useRouter();
import {router} from "@/router";
const [register, { openModal: openModal }] = useModal();
const [register, { openModal: openModal }] = useModal();
const [registerTable, { reload }] = useTable({
const [registerTable, { reload }] = useTable({ api: getMonthlyPlanList,
api: getMonthlyPlanList, title: '123',
title: '123', columns,
columns, formConfig: {
formConfig: { labelWidth: 120,
labelWidth: 120, schemas: searchFormSchema,
schemas: searchFormSchema, },
}, useSearchForm: true,
useSearchForm: true, showTableSetting: false,
showTableSetting: false, bordered: true,
bordered: true, showIndexColumn: false,
showIndexColumn: false, actionColumn: {
actionColumn: { width: 220,
width: 80, title: '操作',
title: '操作', dataIndex: 'action',
dataIndex: 'action', // slots: { customRender: 'action' },
// slots: { customRender: 'action' }, fixed: undefined,
fixed: undefined, },
},
});
function handleEdit(record: Recordable) {
openDrawer(true, {
record,
isUpdate: true,
}); });
}
function handleDelete(record: Recordable) {
console.log(record);
}
function handleSuccess() {
reload();
}
const change = (key: string) => {
reload();
};
const addMonthlyPlan = () => { function handleEdit(record: Recordable, disabled: number) {
openModal(true, { push({
data: ['year'], path: '/monthlyPlan/monthlyPlanEdit',
}); query: {
}; id: record.id,
disabled: String(disabled),
const handleNew = (e) => { },
console.log('eeee', e); });
router.push({ }
path: '/monthlyPlan/monthlyPlanEdit',
query: e, function handleDelete(record: Recordable) {
}); deleteItem({ id: record.id });
}; reload();
}
function handleSuccess() {
reload();
}
async function examine(record: Recordable, disabled: boolean) {
const id = record.id;
const res = await auditItem({ id });
console.log(res);
reload();
}
const addMonthlyPlan = () => {
openModal(true, {
data: ['month'],
});
};
const handleNew = (e) => {
push({
path: '/monthlyPlan/monthlyPlanEdit',
query: e,
});
};
</script> </script>
<style scoped> <style scoped>
.btn { .btn {
margin-right: 10px; margin-right: 10px;
} }
</style> </style>
<template> <template>
<PageWrapper :title="getTitle" :contentBackground="false" headerSticky> <PageWrapper
:title="getTitle"
v-loading="loadingRef"
loading-tip="加载中..."
:contentBackground="false"
headerSticky
>
<template #extra> <template #extra>
<a-button type="primary" v-if="!disabled" danger> 删除 </a-button> <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" @click="handleSubmit"> 提交 </a-button>
<a-button type="default" @click="router.back()"> 返回 </a-button>
</template> </template>
<PageCard v-for="(item, index) in tabsFormSchema" :key="index" :title="item.name"> <PageCard v-for="(item, index) in tabsFormSchema" :key="index" :title="item.name">
<template #right> <template #right>
<a-button <a-button
v-if="!disabled"
type="text" type="text"
preIcon="ant-design:delete-outlined" preIcon="ant-design:delete-outlined"
danger danger
v-if="!disabled"
@click="deleteItem(index)" @click="deleteItem(index)"
/> >
</a-button>
</template> </template>
<BasicForm :loading="loading" @register="item.Form[0]" /> <BasicForm :loading="loading" @register="item.Form[0]"> </BasicForm>
<div style="width: 500px"> <PageCard
<BasicTable v-for="(content, key) in item.list"
:ref="(el) => setSwipeCellRef(item, index)" :key="key"
@register="item.table" class="subCard"
:beforeEditSubmit="beforeEditSubmit(item, index)" :title="content.name"
/> >
</div> <BasicForm :loading="loading" @register="content.form" />
</PageCard>
</PageCard> </PageCard>
<a-button v-if="!disabled" type="dashed" @click="add" preIcon="ei:plus">
从项目库导入 <a-button type="dashed" @click="add" preIcon="ei:plus" v-if="!disabled">
从合同中导入
</a-button> </a-button>
<a-button v-if="!disabled" type="dashed" @click="handleAdd" class="ml-2" preIcon="ei:plus"> <a-button type="dashed" @click="handleAdd" class="ml-2" preIcon="ei:plus" v-if="!disabled">
新建项目 新建合同
</a-button> </a-button>
<projectDrawer @register="registerDrawer" @success="handleSuccess" /> <contractDrawer @register="registerDrawer" @success="handleSuccess" />
<!-- <engineeringprojectModel @register="register" @close="handleNewData" />--> <projectlibraryModel @register="register" @close="handleNewData" />
</PageWrapper> </PageWrapper>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { BasicTable, useTable } from '@/components/Table'; import { unref, computed, onMounted, ref, reactive, nextTick } from 'vue';
import { getBasicColumns } from './tableData'; import projectlibraryModel from '@/components/ContractModel/Contract.vue';
import { ref, nextTick, onMounted, unref, computed, reactive } from 'vue'; import { useDrawer } from '@/components/Drawer';
import { demoListApi } from '@/api/demo/table';
// import engineeringprojectModel from '../engineeringProjectModel/engineeringprojectModel.vue';
import { useRoute } from 'vue-router';
import { PageWrapper } from '@/components/Page'; import { PageWrapper } from '@/components/Page';
import PageCard from '@/components/Page/src/PageCard.vue'; import PageCard from '@/components/Page/src/PageCard.vue';
import projectDrawer from '@/views/project/projectDrawer.vue'; import contractDrawer from '@/views/contract/contractDrawer.vue';
import { BasicForm, useForm, FormProps, UseFormReturnType } from '@/components/Form'; import { BasicForm, useForm, FormProps, UseFormReturnType } from '@/components/Form';
import { formSchema } from '../monthlyPlanEdit/tableData'; import { formSchema, subFormSchema } from './tableData';
import { deepMerge } from '@/utils'; import { deepMerge } from '@/utils';
import { useMessage } from '@/hooks/web/useMessage'; import { useMessage } from '@/hooks/web/useMessage';
import { useDrawer } from '@/components/Drawer'; import { addItem, updateItem, getItem, Itemdelete } from '@/api/project/monthlyPlan';
// import { addItem, updateItem, getItem } from '@/api/project/biddingPlan'; import { editModel } from '@/api/project/model/monthlyPlanModel';
import { addItem, updateItem, getItem } from '@/api/project/engineeringProject';
// import { editModel } from '@/api/project/model/engineeringprojectModel';
import { useModal } from '@/components/Modal'; import { useModal } from '@/components/Modal';
import { router } from '@/router';
const getTitle = ref(''); import { useRoute } from 'vue-router';
const engineerId = ref('');
let show = ref<Recordable[]>([]);
// function handleSummary(tableData: Recordable[]) {
// const totalNo = tableData.reduce((prev, next) => {
// prev += next.no;
// return prev;
// }, 0);
// return [
// {
// _row: '合计',
// _index: '平均值',
// no: totalNo,
// },
// {
// _row: '合计',
// _index: '平均值',
// no: totalNo,
// },
// ];
// }
// ref数组
const swipeCellRefList = ref<HTMLElement[]>([]);
// 动态设置ref
function setSwipeCellRef(item, index) {
if (item) {
swipeCellRefList.value[index] = item;
}
}
function beforeEditSubmit(item, index) {
// setSwipeCellRef(item, index);
// console.log('swipeCellRefList', swipeCellRefList.value[index]);
swipeCellRefList.value?.forEach((data: any) => {
// console.log('data.table' + index, data.table);
let { getDataSource } = data.table[1];
const res = getDataSource();
// console.log('res', res);
const totalNo = res.reduce((prev, next) => {
prev += Number(next.amount);
return prev;
}, 0);
// console.log('totalNo', totalNo);
show.value = [
{
year: '合计',
// _row: '合计',
// _index: '合计',
amount: totalNo,
},
];
return true;
});
}
// const [registerTable, { getDataSource, setTableData }] = useTable({
// title: '表尾行合计示例',
// // api: demoListApi,
// // rowSelection: { type: 'checkbox' },
// columns: getBasicColumns(),
// showSummary: true,
// summaryData: show,
// maxHeight: 180,
// maxWidth: 200,
// showIndexColumn: false,
// pagination: false,
// // scroll: { x: 2000 },
// // canResize: false,
// // showSelectionBar: true, // 显示多选状态栏
// });
onMounted(async () => {
show.value = [
{
year: '合计',
// _row: '合计',
// _index: '合计',
amount: '-',
},
];
// setTableData([
// {
// year: '2022',
// no: '',
// },
// {
// year: '2023',
// no: '',
// },
// {
// year: '2024',
// no: '',
// },
// ]);
});
const [registerDrawer, { openDrawer }] = useDrawer(); const [registerDrawer, { openDrawer }] = useDrawer();
const loadingRef = ref(false);
const [register, { openModal: openModal }] = useModal(); const [register, { openModal: openModal }] = useModal();
const { createMessage } = useMessage(); const { createMessage } = useMessage();
// const getTitle = computed(() =>
// !unref(isUpdate) ? '新增工程项目投资计划(工程)' : '编辑工程项目投资计划(工程)',
// );
getTitle.value = '新增月度工程资金计划';
const isUpdate = ref(false); const isUpdate = ref(false);
const loading = ref(false); const loading = ref(false);
const formData = ref<editModel>({}); const formData = ref<editModel>({});
const tenderId = ref<any>('');
const disabled = ref(false); const disabled = ref(false);
const getTitle = ref('');
onMounted(async () => { onMounted(async () => {
loadingRef.value = true;
const route = useRoute(); const route = useRoute();
const id = route.query.id; // 获取名为id的参数 const id = route.query.id; // 获取名为id的参数
if (!id) { if (!id) {
formData.value.biddingQuarter = route.query.quarter; formData.value.moth = route.query.month;
formData.value.tenderYear = route.query.year; formData.value.engineerConList = [];
formData.value.investmentPlan = [];
// formData.value.data = [];
isUpdate.value = false; isUpdate.value = false;
getTitle.value = '创建月度资金计划';
console.log(formData); console.log(formData);
} else { } else {
isUpdate.value = true;
tenderId.value = id;
disabled.value = route.query.disabled == '0' ? false : true; disabled.value = route.query.disabled == '0' ? false : true;
if (disabled.value) { if (disabled.value) {
getTitle.value = '查看月度工程资金计划'; getTitle.value = '查看月度资金计划';
} else { } else {
getTitle.value = '编辑月度工程资金计划'; getTitle.value = '编辑月度资金计划';
} }
engineerId.value = id; let res = await getItem({ fundId: id });
isUpdate.value = true; formData.value.engineerConList = [];
let res = await getItem({ id });
console.log('getItem', res);
for (let i = 0; i < res.length; i++) { for (let i = 0; i < res.length; i++) {
const source = res[i];
const item = { const item = {
name: '序号' + (i + 1), name: '项目:' + source.projectName,
projectId: source.projectId,
forceRender: true, forceRender: true,
Form: useForm( Form: useForm(Object.assign({ schemas: formSchema }, baseFormConfig) as FormProps),
Object.assign({ schemas: formSchema, disabled }, baseFormConfig) as FormProps, list: [],
),
table: useTable({
title: '表尾行合计示例',
// api: demoListApi,
// rowSelection: { type: 'checkbox' },
columns: getBasicColumns(),
showSummary: true,
summaryData: show,
maxHeight: 180,
maxWidth: 200,
showIndexColumn: false,
pagination: false,
// scroll: { x: 2000 },
// canResize: false,
// showSelectionBar: true, // 显示多选状态栏
}),
}; };
const { setFieldsValue } = item.Form[1];
tabsFormSchema.push(item); tabsFormSchema.push(item);
const info = res[i]; setFormData(item.Form[1], source);
info.time = [info.beginTime, info.endTime]; for (let t = 0; t < source.engineerConList.length; t++) {
const data = { const content = source.engineerConList[t];
id: info.id, let from = useForm(
investmentId: info.investmentId, Object.assign({ schemas: subFormSchema }, baseFormConfig) as FormProps,
}; );
formData.value.investmentPlan = []; item.list.push({
formData.value.investmentPlan.push(data); name: '合同:' + content.contrcatName,
console.log('info', info); form: from,
const { setTableData } = item.table[1]; });
nextTick(() => { console.log(content);
setTableData(info.planYear); // console.log(from);
setFieldsValue( setFormData(from[1], content);
info, let res = formData.value.engineerConList.filter(
// projectName: info.projectName, (item) => item.projectId == source.projectId,
// constructionSite: info.constructionSite,
// constructionMode: info.constructionMode,
// projectType: info.projectType,
// constructionScale: info.constructionScale,
// projectOverview: info.projectOverview,
// fundingSource: info.fundingSource,
// implementingEntity: info.implementingEntity,
// filingCycle: info.filingCycle,
// competentDepartment: info.competentDepartment,
// matchingFunds: info.matchingFunds,
// specialBondFunds: info.specialBondFunds,
// planFunds: info.planFunds,
// attribute: info.attribute,
// beginTime: info.time[0],
// endTime: info.time[1],
// schedule: info.schedule,
// completionRemarks: info.completionRemarks,
); );
});
if (res.length) {
let index = formData.value.engineerConList.findIndex(
(item) => item.projectId == source.projectId,
);
formData.value.engineerConList[index].conList.push({
id: content.id,
proId: source.proId,
contractId: content.contractId,
});
} else {
formData.value.engineerConList.push({
proId: source.proId,
conList: [
{
id: content.id,
proId: source.proId,
contractId: content.contractId,
},
],
});
}
console.log(formData.value.engineerConList, 'engineerConList');
}
} }
console.log(res);
} }
loadingRef.value = false;
}); });
type TabsFormType = { type TabsFormType = {
name: string; name: string;
forceRender?: boolean; forceRender?: boolean;
Form: UseFormReturnType; Form: UseFormReturnType;
table: any; list: UseFormReturnType[];
}; };
const baseFormConfig: Partial<FormProps> = { const baseFormConfig: Partial<FormProps> = {
showActionButtonGroup: false, showActionButtonGroup: false,
labelWidth: 100, labelWidth: 260,
layout: 'vertical', layout: 'vertical',
}; };
...@@ -264,6 +162,9 @@ ...@@ -264,6 +162,9 @@
async function add() { async function add() {
openModal(); openModal();
} }
async function handleSuccess(params: any) {
handleNew(params);
}
async function handleNewData(info: any) { async function handleNewData(info: any) {
if (info) { if (info) {
...@@ -276,127 +177,125 @@ ...@@ -276,127 +177,125 @@
* *
*/ */
async function handleNew(info: any) { async function handleNew(info: any) {
const item = { let item = {};
name: '序号' + (tabsFormSchema.length + 1), let res = tabsFormSchema.filter((item) => item.projectId == info.projectId);
forceRender: true, if (res.length) {
Form: useForm(Object.assign({ schemas: formSchema }, baseFormConfig) as FormProps), item = res[0];
table: useTable({ let from = useForm(Object.assign({ schemas: subFormSchema }, baseFormConfig) as FormProps);
title: '表尾行合计示例', item.list.push({
// api: demoListApi, name: '合同:' + info.contrcatName,
// rowSelection: { type: 'checkbox' }, form: from,
columns: getBasicColumns(), });
showSummary: true, let index = tabsFormSchema.findIndex((item) => item.projectId == info.projectId);
summaryData: show, formData.value.engineerConList[index].conList.push({
maxHeight: 180, contractId: info.id,
maxWidth: 200, });
showIndexColumn: false, setFormData(from[1], {
pagination: false, contrcatName: info.contrcatName,
// scroll: { x: 2000 }, collectingUnit: info.collectingUnit,
// canResize: false, contractAmount: info.contractAmount,
// showSelectionBar: true, // 显示多选状态栏 });
}), console.log(formData.value.engineerConList);
}; } else {
const { setTableData } = item.table[1]; item = {
// console.log('item.table',setTableData) name: '项目:' + info.projectName,
projectId: info.projectId,
forceRender: true,
Form: useForm(Object.assign({ schemas: formSchema }, baseFormConfig) as FormProps),
list: [],
};
item.list.push({
name: '合同:' + info.contrcatName,
form: useForm(Object.assign({ schemas: subFormSchema }, baseFormConfig) as FormProps),
});
tabsFormSchema.push(item);
const { setFieldsValue } = item.Form[1]; formData.value.engineerConList.push({
tabsFormSchema.push(item); proId: info.projectId,
formData.value.investmentPlan.push({ conList: [
proId: info.id, {
}); contractId: info.id,
nextTick(() => { },
setTableData([ ],
{ });
year: '2022', setFormData(item.Form[1], {
amount: '',
},
{
year: '2023',
amount: '',
},
{
year: '2024',
amount: '',
},
]);
setFieldsValue({
projectName: info.projectName, projectName: info.projectName,
constructionSite: info.constructionSite,
constructionMode: info.constructionMode,
projectType: info.projectType,
constructionScale: info.constructionScale,
projectOverview: info.projectOverview,
fundingSource: info.fundingSource,
implementingEntity: info.implementingEntity,
// filingCycle: info.filingCycle,
// competentDepartment: info.competentDepartment,
// matchingFunds: info.matchingFunds,
// specialBondFunds: info.specialBondFunds,
// planFunds: info.planFunds,
// attribute: info.attribute,
// beginTime: info.time[0],
// endTime: info.time[1],
// schedule: info.schedule,
// completionRemarks: info.completionRemarks,
}); });
}); setFormData(item.list[0].form[1], {
contrcatName: info.contrcatName,
collectingUnit: info.collectingUnit,
contractAmount: info.contractAmount,
});
}
} }
async function deleteItem(index: any) { function setFormData(form: any, record: any) {
tabsFormSchema.splice(index, 1); const { setFieldsValue } = form;
formData.value.investmentPlan.splice(index, 1); nextTick(() => {
setFieldsValue(record);
});
} }
async function handleAdd() { async function handleAdd() {
openDrawer(true, { openDrawer(true, {
isUpdate: false, isUpdate: false,
}); });
} }
async function handleSuccess(params: any) { async function deleteItem(index: any) {
console.log(params); loadingRef.value = true;
handleNew(params); const id = formData.value.engineerConList[index].id;
if (id) {
await Itemdelete({
id,
});
formData.value.engineerConList.splice(index, 1);
tabsFormSchema.splice(index, 1);
loadingRef.value = false;
} else {
formData.value.engineerConList.splice(index, 1);
tabsFormSchema.splice(index, 1);
loadingRef.value = false;
}
}
async function getFormData(form: any) {
const { validate, getFieldsValue } = form;
await validate();
let res = getFieldsValue();
return res;
} }
async function handleSubmit() { async function handleSubmit() {
console.log('tabsFormSchema', tabsFormSchema); loadingRef.value = true;
loading.value = true;
try { try {
for (let i = 0; i < tabsFormSchema.length; i++) { for (let i = 0; i < tabsFormSchema.length; i++) {
let item = tabsFormSchema[i]; let item = tabsFormSchema[i];
const { validate, getFieldsValue } = item.Form[1]; let res = await getFormData(item.Form[1]);
const { getDataSource } = item.table[1]; formData.value.engineerConList[i] = deepMerge(formData.value.engineerConList[i], res);
await validate(); for (let t = 0; t < item.list.length; t++) {
let res = getFieldsValue(); let content = tabsFormSchema[i].list[t];
let data = getDataSource(); let contentRes = await getFormData(content.form[1]);
console.log(' getFieldsValue()', getFieldsValue()); formData.value.engineerConList[i].conList[t] = deepMerge(
console.log(' getDataSource()', getDataSource()); formData.value.engineerConList[i].conList[t],
console.log(' data111', data); contentRes,
data[0].amount = Number(data[0].amount); );
data[1].amount = Number(data[1].amount); }
data[2].amount = Number(data[2].amount);
// res.biddingPeriod = res.biddingPeriod.join(',');
// res.plannedPeriod = res.plannedPeriod.join(',');
formData.value.investmentPlan[i] = deepMerge(formData.value.investmentPlan[i], res);
formData.value.investmentPlan[i].planYear = data;
formData.value.investmentPlan[i].beginTime = res.time[0];
formData.value.investmentPlan[i].endTime = res.time[1];
formData.value.planType = '工程';
formData.value.filingCycle = '2024';
formData.value.investmentPlan[i].totalInvestment = Number(
formData.value.investmentPlan[i].totalInvestment,
);
formData.value.id = engineerId.value;
} }
formData.value.proNumber = formData.value.investmentPlan.Length; formData.value.proNumber = formData.value.engineerConList.length;
console.log(' formData()', unref(formData)); formData.value.fundId = tenderId.value;
// console.log(' setTableData()', setTableData);
let res = isUpdate.value ? await updateItem(unref(formData)) : await addItem(unref(formData)); let res = isUpdate.value ? await updateItem(unref(formData)) : await addItem(unref(formData));
loading.value = false; loadingRef.value = true;
console.log(formData.value);
console.log(res); console.log(res);
createMessage.success('提交成功!'); createMessage.success('提交成功!');
router.back();
} catch (e) { } catch (e) {
// 验证失败或出错,切换到对应标签页 // 验证失败或出错,切换到对应标签页
console.log(e); console.log(e);
} finally { } finally {
loading.value = false; loadingRef.value = false;
} }
} }
</script> </script>
<style scoped>
.subCard {
border: 1px solid #e8eaec;
}
</style>
...@@ -21,7 +21,7 @@ export function getBasicColumns(): BasicColumn[] { ...@@ -21,7 +21,7 @@ export function getBasicColumns(): BasicColumn[] {
}, },
]; ];
} }
export const formSchema: ({ colProps: { offset: number; span: number }; component: string; field: string; componentProps: { readonly: boolean; style: { border: string } }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { readonly: boolean; style: { border: string } }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { readonly: boolean; style: { border: string } }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { readonly: boolean; style: { border: string } }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { readonly: boolean; style: { border: string } }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { readonly: boolean; style: { border: string } }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { readonly: boolean; style: { border: string } }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { readonly: boolean; style: { border: string } }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { readonly: boolean; style: { border: string } }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { valueFormat: string; format: string; style: { width: string }; placeholder: string }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { addonAfter: string }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { addonAfter: string }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { addonAfter: string }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { addonAfter: string }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { options: ({ label: string; value: string } | { label: string; value: string } | { label: string; value: string })[] }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; icon: string; componentProps: { style: { width: string }; placeholder: string[] }; label: string; required: boolean } | { colProps: { offset: number; span: number }; component: string; field: string; componentProps: { options: ({ label: string; value: string } | { label: string; value: string } | { label: string; value: string })[] }; label: string; required: boolean })[] = [ export const formSchema: FormSchema[] = [
{ {
field: 'projectName', field: 'projectName',
label: '项目名称', label: '项目名称',
...@@ -34,41 +34,47 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen ...@@ -34,41 +34,47 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'constructionSite', field: 'sourceType',
label: '建设地点', label: '资金来源类型',
required: true, required: true,
component: 'Input', component: 'Select',
componentProps: { componentProps: {
readonly: true, options: [
style: { border: 'none' }, { label: '政府投资项目(不含专项债)', value: '政府投资项目(不含专项债)' },
{ label: '公司投资项目(不含专项债)', value: '公司投资项目(不含专项债)' },
{ label: '专项债项目', value: '专项债项目' },
],
}, },
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'constructionMode', field: 'fundGap',
label: '建设模式', label: '资金缺口',
required: true, required: true,
component: 'Input', component: 'Input',
componentProps: { componentProps: {
readonly: true, addonAfter: '万元',
style: { border: 'none' },
}, },
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'projectType', field: 'remark',
label: '项目类型', label: '备注',
required: true, required: true,
component: 'Input', component: 'InputTextArea',
componentProps: { componentProps: {
readonly: true, maxlength: 100,
style: { border: 'none' }, showCount: true,
}, },
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
];
export const subFormSchema: FormSchema[] = [
{ {
field: 'constructionScale', field: 'contrcatName',
label: '建设规模', label: '合同名称',
required: true, required: true,
component: 'Input', component: 'Input',
componentProps: { componentProps: {
...@@ -78,8 +84,8 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen ...@@ -78,8 +84,8 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'projectOverview', field: 'collectingUnit',
label: '项目概况:', label: '收款单位',
required: true, required: true,
component: 'Input', component: 'Input',
componentProps: { componentProps: {
...@@ -89,8 +95,8 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen ...@@ -89,8 +95,8 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'fundingSource', field: 'contractAmount',
label: '资金来源:', label: '合同金额',
required: true, required: true,
component: 'Input', component: 'Input',
componentProps: { componentProps: {
...@@ -100,44 +106,42 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen ...@@ -100,44 +106,42 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'implementingEntity', field: 'paymentLevel',
label: '实施主体:', label: '支付等级',
required: true, required: true,
component: 'Input', component: 'Select',
componentProps: { componentProps: {
readonly: true, options: [
style: { border: 'none' }, { label: 'A(必须支付)', value: 'A(必须支付)' },
{ label: 'B(可暂缓支付但有维稳风险)', value: 'B(可暂缓支付但有维稳风险)' },
{ label: 'C(随财政拨款支付,无维稳风险)', value: 'C(随财政拨款支付,无维稳风险)' },
],
}, },
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'projectOverview', field: 'completionValueActual',
label: '项目概况:', label: '上月实际完成值',
required: true, required: true,
component: 'Input', component: 'Input',
componentProps: { componentProps: {
readonly: true, addonAfter: '万元',
style: { border: 'none' },
}, },
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'filingCycle', field: 'accumulateCompletionValue',
label: '填报年度:', label: '累计完成值',
required: true, required: true,
component: 'DatePicker', component: 'Input',
componentProps: { componentProps: {
placeholder: '选择填报周期', addonAfter: '万元',
picker: 'year',
style: { width: '100%' },
valueFormat: 'YYYY',
format: 'YYYY',
}, },
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'totalInvestment', field: 'planCompletionValue',
label: '总投资', label: '本月计划完成值',
required: true, required: true,
component: 'Input', component: 'Input',
componentProps: { componentProps: {
...@@ -146,16 +150,18 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen ...@@ -146,16 +150,18 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'competentDepartment', field: 'lastMonthPlan',
label: '项目主管部门', label: '上月计划数',
required: true, required: true,
component: 'Input', component: 'Input',
componentProps: {
addonAfter: '万元',
},
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'matchingFunds', field: 'lastMonthActual',
label: '2024年财政预算匹配资金', label: '上月实付数',
required: true, required: true,
component: 'Input', component: 'Input',
componentProps: { componentProps: {
...@@ -164,8 +170,8 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen ...@@ -164,8 +170,8 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'specialBondFunds', field: 'accumulatePayment',
label: '其中专项债项目2024年预计使用专项债资金', label: '累计支付数',
required: true, required: true,
component: 'Input', component: 'Input',
componentProps: { componentProps: {
...@@ -174,8 +180,8 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen ...@@ -174,8 +180,8 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'planFunds', field: 'thisPlanNumber',
label: '2024年计划资金', label: '本月计划数',
required: true, required: true,
component: 'Input', component: 'Input',
componentProps: { componentProps: {
...@@ -183,81 +189,45 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen ...@@ -183,81 +189,45 @@ export const formSchema: ({ colProps: { offset: number; span: number }; componen
}, },
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'attribute', field: 'specialFund',
label: '建设性质', label: '专项债拨款',
required: true, required: true,
component: 'Select', component: 'Input',
componentProps: { componentProps: {
options: [ addonAfter: '万元',
{ label: '新建', value: '0' },
{ label: '结转', value: '1' },
{ label: '缓建', value: '2' },
],
}, },
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'time', field: 'governmentFund',
component: 'RangePicker', label: '政府拨款',
label: '开竣工时间',
required: true, required: true,
icon: 'healthicons:i-schedule-school-date-time-outline', component: 'Input',
colProps: { span: 7, offset: 1 },
componentProps: { componentProps: {
placeholder: ['开始日期', '结束日期'], addonAfter: '万元',
style: { width: '100%' },
valueFormat: 'YYYY-MM-DD',
format: 'YYYY-MM-DD',
}, },
colProps: { span: 7, offset: 1 },
}, },
{ {
field: 'schedule', field: 'banFinancing',
label: '2024年底预计形象进度', label: '银行融资',
required: true, required: true,
component: 'Select', component: 'Input',
componentProps: { componentProps: {
options: [ addonAfter: '万元',
{ label: 'A(已经立项实施的跨年工程)', value: '0' },
{ label: 'B(该年度必须建设的项目)', value: '1' },
{ label: 'C(该年度必须建设的项目)', value: '2' },
],
}, },
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
{ {
label: '备注', field: 'ownFund',
field: 'remarks', label: '自有资金',
required: true, required: true,
component: 'InputTextArea', component: 'Input',
componentProps: { componentProps: {
maxlength: 100, addonAfter: '万元',
showCount: true,
}, },
colProps: { span: 7, offset: 1 }, colProps: { span: 7, offset: 1 },
}, },
// {
// field: 'isReserveProject',
// label: '是否为储备项目',
// component: 'RadioButtonGroup',
// defaultValue: '0',
// componentProps: {
// options: [
// { label: '是', value: '1' },
// { label: '否', value: '0' },
// ],
// },
// },
// {
// field: 'status',
// label: '状态',
// component: 'RadioButtonGroup',
// defaultValue: '0',
// componentProps: {
// options: [
// { label: '启用', value: '1' },
// { label: '停用', value: '0' },
// ],
// },
// },
]; ];
...@@ -7,28 +7,46 @@ ...@@ -7,28 +7,46 @@
<div class="title">项目总数</div> <div class="title">项目总数</div>
<div class="content"> <div class="content">
<img :class="`${prefixCls}__top-img`" src="../../assets/images/group.png" /> <img :class="`${prefixCls}__top-img`" src="../../assets/images/group.png" />
<span><p>100</p></span> <span
><p>{{ countData.counttotal }}</p
></span
>
</div> </div>
</Col> </Col>
<Col :span="4" :class="`${prefixCls}__top-col`"> <Col :span="4" :class="`${prefixCls}__top-col`">
<div class="title">自建</div> <div class="title">自建</div>
<span><p>100</p></span> <span
><p>{{ countData.countbuildbyoneself }}</p
></span
>
</Col> </Col>
<Col :span="4" :class="`${prefixCls}__top-col`"> <Col :span="4" :class="`${prefixCls}__top-col`">
<div class="title">委托建设</div> <div class="title">委托建设</div>
<span><p>100</p></span> <span
><p>{{ countData.countbuildbyentrust }}</p
></span
>
</Col> </Col>
<Col :span="4" :class="`${prefixCls}__top-col`"> <Col :span="4" :class="`${prefixCls}__top-col`">
<div class="title">代建</div> <div class="title">代建</div>
<span><p>100</p></span> <span
><p>{{ countData.countbuildbyreplace }}</p
></span
>
</Col> </Col>
<Col :span="4" :class="`${prefixCls}__top-col`"> <Col :span="4" :class="`${prefixCls}__top-col`">
<div class="title">承建</div> <div class="title">承建</div>
<span><p>100</p></span> <span
><p>{{ countData.countbuildbyhold }}</p
></span
>
</Col> </Col>
<Col :span="4" :class="`${prefixCls}__top-col`"> <Col :span="4" :class="`${prefixCls}__top-col`">
<div class="title">储备</div> <div class="title">储备</div>
<span><p>100</p></span> <span
><p>{{ countData.countreserve }}</p
></span
>
</Col> </Col>
</Row> </Row>
</div> </div>
...@@ -78,12 +96,14 @@ ...@@ -78,12 +96,14 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Tag } from 'ant-design-vue'; import { Tag } from 'ant-design-vue';
import { BasicTable, useTable, TableAction } from '@/components/Table'; import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getListByPage, deleteItem, getItem } from '@/api/project/project'; import { getListByPage, deleteItem, getProjectCount } from '@/api/project/project';
import { columns, searchFormSchema } from './project.data'; import { columns, searchFormSchema } from './project.data';
import { Row, Col } from 'ant-design-vue'; import { Row, Col } from 'ant-design-vue';
import projectDrawer from './projectDrawer.vue'; import projectDrawer from './projectDrawer.vue';
import { useDrawer } from '@/components/Drawer'; import { useDrawer } from '@/components/Drawer';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { onMounted, ref } from 'vue';
const countData = ref({});
const { push } = useRouter(); const { push } = useRouter();
const [registerDrawer, { openDrawer }] = useDrawer(); const [registerDrawer, { openDrawer }] = useDrawer();
const prefixCls = 'list-basic'; const prefixCls = 'list-basic';
...@@ -139,6 +159,11 @@ ...@@ -139,6 +159,11 @@
function handleSuccess() { function handleSuccess() {
reload(); reload();
} }
onMounted(async () => {
let res = await getProjectCount();
console.log(res);
countData.value = res;
});
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.list-basic { .list-basic {
......
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