Commit a5cef984 authored by 牛虎林's avatar 牛虎林

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

parents 58c7ac85 e855aaf7
import { BasicPageParams, BasicFetchResult } from '@/api/model/baseModel';
export type ProjectParams = {
//年份
givenYear?: string;
//companyName
companyName?: string;
//季度
quarter: string;
};
export type ProjectPageParams = BasicPageParams & ProjectParams;
export interface ProjectListItem {
id: string;
//合同id
contractId: string;
projectInvestment: string;
biddingMethod: string;
firstPartyName: string;
secondPartyName: string;
formOfContract: string;
contractSigningTime: string;
closingTime: string;
contractAmount: string;
superContractScale: string;
submittedForSettlement: string;
meetingMinutes: string;
remark: string;
fundingSource: string;
projectName: string;
proportionContractAmount: string;
createTime: null;
createBy: string;
updateTime: null;
updateBy: string;
}
export interface ChangModel {
id?: string | number;
constructionMode: string;
isReserveProject: string;
projectType: string;
projectOverview: string;
constructionPurpose: string;
}
export interface ProjectModel<P, C> {
management: P[];
proClosingQuarter: C;
}
export interface ContentModel {
id?: string | number;
quarter: string | number;
companyName: string;
givenYear: string;
yearQuarter: string;
status: string;
}
export interface PlanModel {
id: string | number;
contractId: string | number;
projectId: string | number;
projectInvestment: string | number;
biddingMethod: string | number;
contracYpe: string | number;
contractName: string | number;
firstPartyName: string | number;
secondPartyName: string | number;
formOfContract: string | number;
closingTime: string | number;
closingTimeDatetime: string | number;
contractAmount: string | number;
submittedForSettlement: string | number;
superContractScale: string | number;
sumOfMoney: string | number;
proportionContractAmount: string | number;
meetingMinutes: string | number;
proClosingQuarterId: string | number;
remark: string | number;
}
export type ProjectListGetResultModel = BasicFetchResult<ProjectListItem>;
export type EditModel = ProjectModel<PlanModel[], ContentModel>;
......@@ -5,7 +5,7 @@ export type ProjectParams = {
//companyName
companyName?: string;
//季度
quarter:string
quarter: string;
};
export type ProjectPageParams = BasicPageParams & ProjectParams;
......@@ -80,6 +80,5 @@ export interface PlanModel {
remark: string | number;
}
export type ProjectListGetResultModel = BasicFetchResult<ProjectListItem>;
export type EditModel = ProjectModel<PlanModel[], ContentModel>
export type EditModel = ProjectModel<PlanModel[], ContentModel>;
......@@ -2,7 +2,11 @@ import { ProjectParams, ProjectListGetResultModel, ProjectModel } from './model/
import { defHttp } from '@/utils/http/axios';
enum Api {
GetList = '/statement/list/page',
GetList = '/pro/monthEngineer/page',
GetMonthlyPlanProjectList = '',
}
export const getMonthlyPlanList = (params?: ProjectParams) =>
defHttp.post<ProjectModel>({ url: Api.GetList, data: params });
export const getMonthlyPlanProjectList = (params?: ProjectParams) =>
defHttp.post<ProjectModel>({ url: Api.GetMonthlyPlanProjectList, data: params });
import { ProjectParams, ProjectListGetResultModel, ProjectModel } from './model/projectModel';
import {
ProjectParams,
ProjectListGetResultModel,
ProjectModel,
} from './model/engineeringprojectModel';
import { defHttp } from '@/utils/http/axios';
import { ListItem, ProjectPageParams } from '@/api/project/model/biddingPlanModel';
enum Api {
GetList = '/statement/list/page',
GetList = '/pro/completion/getList',
AddProject = '/pro/completion/add',
UpdateProject = '/pro/completion/edit',
ProjectDetail = '/pro/completion/getById',
DeleteProject = '/pro/completion/delete',
engineeringList = '/pro/completion/getCanCompletion',
GetEngineProjectList = '/pro/completion/getCompletionPro',
audit = '/pro/completion/audit',
Itemdelete = '/pro/completion/delProject',
}
export const getperformanceList = (params?: ProjectParams) =>
export const getListByPage = (params?: ProjectParams) =>
defHttp.post<ProjectModel>({ url: Api.GetList, data: params });
export const addItem = (params?: any) =>
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 deleteItem = (params?: any) =>
defHttp.delete<ProjectModel>({ url: Api.DeleteProject, params });
export const getItem = (params?: any) =>
defHttp.get<ListItem[]>({ url: Api.ProjectDetail, params });
export const getEngineeringList = (params?: any) =>
defHttp.post<ListItem[]>({ url: Api.engineeringList, data: params });
export const GetEngineProjectList = (params?: any) =>
defHttp.post<ListItem[]>({
url: Api.GetEngineProjectList,
data: params,
headers: {
'Content-Type': 'application/json;charset=UTF-8',
},
});
export const auditItem = (params?: any) =>
defHttp.post<ProjectModel>({
url: Api.audit,
data: params,
});
export const Itemdelete = (params?: any) =>
defHttp.delete<ProjectModel>({ url: Api.Itemdelete, params });
......@@ -22,7 +22,6 @@ export const basicProps = {
isTreeTable: Boolean,
tableSetting: propTypes.shape<TableSetting>({}),
inset: Boolean,
title: string,
sortFn: {
type: Function as PropType<(sortInfo: SorterResult) => any>,
default: DEFAULT_SORT_FN,
......
......@@ -24,6 +24,16 @@ const annualPlan: AppRouteModule = {
orderNo: 10,
},
},
{
path: 'annualPlanEdit',
name: 'annualPlanEdit',
component: () => import('@/views/annualPlan/annualPlanEdit/annualPlanEdit.vue'),
meta: {
// affix: true,
title: '新建计划(储备)',
orderNo: 8,
},
},
],
};
......
......@@ -2,7 +2,19 @@ import type { AppRouteModule } from '@/router/types';
import { LAYOUT } from '@/router/constant';
const monthlyPlan: AppRouteModule = {
const monthlyPlan: {
redirect: string;
path: string;
component: () => Promise<{}>;
children: {
path: string;
component: () => Promise<{}>;
meta: { orderNo: number; title: string };
name: string;
}[];
meta: { orderNo: number; icon: string; hideChildrenInMenu: boolean; title: string };
name: string;
} = {
path: '/monthlyPlan',
name: 'monthlyPlan',
component: LAYOUT,
......@@ -24,6 +36,16 @@ const monthlyPlan: AppRouteModule = {
orderNo: 11,
},
},
{
path: 'monthlyPlanEdit',
name: 'monthlyPlanEdit',
component: () => import('@/views/monthlyPlan/monthlyPlanEdit/monthlyPlanEdit.vue'),
meta: {
// affix: true,
title: '新建计划(工程)',
orderNo: 8,
},
},
],
};
......
......@@ -24,6 +24,16 @@ const performance: AppRouteModule = {
orderNo: 9,
},
},
{
path: 'edit',
name: 'performanceEdit',
component: () => import('@/views/performance/performanceEdit.vue'),
meta: {
// affix: true,
title: '工程项目投资计划完成情况',
orderNo: 9,
},
},
],
};
......
This diff is collapsed.
import { optionsListApi } from '@/api/demo/select';
import { FormProps, FormSchema, BasicColumn } from '@/components/Table';
import { VxeFormItemProps, VxeGridPropTypes } from '@/components/VxeTable';
import { ref } from 'vue';
import { Input } from 'ant-design-vue';
export function getBasicColumns(): BasicColumn[] {
return [
{
title: '年份',
dataIndex: 'year',
width: 80,
},
{
title: '金额(万元)',
dataIndex: 'amount',
width: 150,
// sorter: true,
// defaultHidden: true,
edit: true,
},
];
}
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 })[] = [
{
field: 'projectName',
label: '项目名称',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'constructionSite',
label: '建设地点',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'constructionMode',
label: '建设模式',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'projectType',
label: '项目类型',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'constructionScale',
label: '建设规模',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'projectOverview',
label: '项目概况:',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'fundingSource',
label: '资金来源:',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'implementingEntity',
label: '实施主体:',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'projectOverview',
label: '项目概况:',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'filingCycle',
label: '填报年度:',
required: true,
component: 'DatePicker',
componentProps: {
placeholder: '选择填报周期',
picker: 'year',
style: { width: '100%' },
valueFormat: 'YYYY',
format: 'YYYY',
},
colProps: { span: 7, offset: 1 },
},
{
field: 'totalInvestment',
label: '总投资',
required: true,
component: 'Input',
componentProps: {
addonAfter: '万元',
},
colProps: { span: 7, offset: 1 },
},
{
field: 'competentDepartment',
label: '项目主管部门',
required: true,
component: 'Input',
colProps: { span: 7, offset: 1 },
},
{
field: 'matchingFunds',
label: '2024年财政预算匹配资金',
required: true,
component: 'Input',
componentProps: {
addonAfter: '万元',
},
colProps: { span: 7, offset: 1 },
},
{
field: 'specialBondFunds',
label: '其中专项债项目2024年预计使用专项债资金',
required: true,
component: 'Input',
componentProps: {
addonAfter: '万元',
},
colProps: { span: 7, offset: 1 },
},
{
field: 'planFunds',
label: '2024年计划资金',
required: true,
component: 'Input',
componentProps: {
addonAfter: '万元',
},
colProps: { span: 7, offset: 1 },
},
{
field: 'attribute',
label: '建设性质',
required: true,
component: 'Select',
componentProps: {
options: [
{ label: '新建', value: '0' },
{ label: '结转', value: '1' },
{ label: '缓建', value: '2' },
],
},
colProps: { span: 7, offset: 1 },
},
{
field: 'time',
component: 'RangePicker',
label: '开竣工时间',
required: true,
icon: 'healthicons:i-schedule-school-date-time-outline',
colProps: { span: 7, offset: 1 },
componentProps: {
placeholder: ['开始日期', '结束日期'],
style: { width: '100%' },
valueFormat: 'YYYY-MM-DD',
format: 'YYYY-MM-DD',
},
},
{
field: 'schedule',
label: '2024年底预计形象进度',
required: true,
component: 'Select',
componentProps: {
options: [
{ label: 'A(已经立项实施的跨年工程)', value: '0' },
{ label: 'B(该年度必须建设的项目)', value: '1' },
{ label: 'C(该年度必须建设的项目)', value: '2' },
],
},
colProps: { span: 7, offset: 1 },
},
{
label: '备注',
field: 'remarks',
required: true,
component: 'InputTextArea',
componentProps: {
maxlength: 100,
showCount: true,
},
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' },
// ],
// },
// },
];
<template>
<BasicModal
width="70%"
v-bind="$attrs"
@register="register"
title="选择投资计划"
:minHeight="30"
okText="导入"
@ok="handleSubmit"
@visible-change="handleVisibleChange"
>
<BasicTable @register="registerTable">
<template #bodyCell="{ column, text, record, index }">
<!-- 当前列是序号列时,显示序号 -->
<span v-if="column.dataIndex === 'serialNumber'">{{ index + 1 }}</span>
<!-- 其他列正常显示 -->
<span v-else>{{ text }}</span>
</template>
</BasicTable>
<!-- <button @click="getSelectRowList">获取数据</button>-->
</BasicModal>
</template>
<script lang="ts" setup>
import { BasicModal, useModalInner } from '@/components/Modal';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getListByPage } from '@/api/project/project';
import { columns, searchFormSchema } from './data';
import { useMessage } from '@/hooks/web/useMessage';
import { getMonthlyPlanProjectList } from "@/api/project/monthlyPlan";
const [registerTable, { reload, getSelectRows }] = useTable({
api: getMonthlyPlanProjectList,
title: '123',
columns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
searchInfo: { type: 'engineering' },
useSearchForm: true,
showTableSetting: false,
bordered: true,
showIndexColumn: false,
rowSelection: {
type: 'checkbox',
},
// actionColumn: {
// width: 80,
// title: '操作',
// dataIndex: 'action',
// // slots: { customRender: 'action' },
// fixed: undefined,
// },
});
const { createMessage } = useMessage();
function getSelectRowList() {
// createMessage.info('请在控制台查看!');
// console.log(getSelectRows());
emit('close', getSelectRows());
}
const emit = defineEmits(['close']);
function handleVisibleChange(v) {}
const [register, { closeModal }] = useModalInner((data) => {
data;
});
function handleSubmit() {
getSelectRowList();
closeModal();
}
</script>
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Switch } from 'ant-design-vue';
import { setRoleStatus } from '@/api/demo/system';
import { useMessage } from '@/hooks/web/useMessage';
type CheckedType = boolean | string | number;
export const columns: (
| { dataIndex: string; width: number; title: string }
| { dataIndex: string; width: number; title: string }
| { dataIndex: string; width: number; title: string }
| { dataIndex: string; width: number; title: string }
| { dataIndex: string; width: number; title: string }
| { dataIndex: string; width: number; title: string }
| { dataIndex: string; width: number; title: string }
)[] = [
{
title: '年度',
dataIndex: 'projectName',
width: 180,
},
{
title: '类型',
dataIndex: 'implementingEntity',
width: 180,
},
{
title: '项目数量',
dataIndex: 'constructionMode',
width: 200,
},
{
title: '总投资',
dataIndex: 'constructionSite',
width: 180,
},
{
title: '合同总额合计',
dataIndex: 'projectType',
width: 180,
},
{
title: '三年滚动投资计划合计',
dataIndex: 'fundingSource',
width: 180,
},
{
title: '公司名称',
dataIndex: 'constructionPurpose',
width: 180,
},
{
title: '最新更新人',
dataIndex: 'constructionScale',
width: 180,
},
{
title: '最新更新时间',
dataIndex: 'constructionScale',
width: 180,
},
{
title: '审核状态',
dataIndex: 'constructionScale',
width: 180,
},
{
title: '审核人',
dataIndex: 'constructionScale',
width: 180,
},
{
title: '审核时间',
dataIndex: 'constructionScale',
width: 180,
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'projectName',
label: '',
component: 'Input',
componentProps: {
placeholder: '搜索关键字',
},
colProps: { span: 4 },
},
];
export const formSchema: FormSchema[] = [
{
field: 'projectName',
label: '项目名称',
component: 'Input',
required: true,
componentProps: {
placeholder: 'XXXX项目',
disabled: true,
style: {
background: 'none',
border: 'none',
},
},
colProps: { span: 8 },
},
{
field: 'projectName',
label: '建设地点',
component: 'Input',
required: true,
componentProps: {
placeholder: '华苑片区',
disabled: true,
style: {
background: 'none',
border: 'none',
},
},
colProps: { span: 8 },
},
{
field: 'projectName',
label: '建设模式',
component: 'Input',
required: true,
componentProps: {
placeholder: '自建',
disabled: true,
style: {
background: 'none',
border: 'none',
},
},
colProps: { span: 8 },
},
// {
// 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' },
// ],
// },
// },
];
......@@ -2,7 +2,7 @@
<div>
<BasicTable @register="registerTable" :title="'年度工程资金计划'">
<template #toolbar>
<a-button class="btn" type="primary" @click="Import"> 新建年度工程资金计划 </a-button>
<a-button class="btn" type="primary" @click="addAnnualPlan"> 新建年度工程资金计划 </a-button>
</template>
<template #bodyCell="{ column, text, record, index }">
......@@ -33,17 +33,23 @@
</template>
</template>
</BasicTable>
<yearModal @register="register" @close="handleNew" />
</div>
</template>
<script lang="ts" setup>
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getAnnualPlanList } from '@/api/project/annualPlan';
import yearModal from '@/components/yearModal.vue';
import { getListByPage } from '@/api/project/biddingPlan';
import { useDrawer } from '@/components/Drawer';
import { columns, searchFormSchema } from './data';
import {useModal} from "@/components/Modal";
import {router} from "@/router";
const [register, { openModal: openModal }] = useModal();
defineOptions({ name: 'Performance' });
......@@ -85,8 +91,18 @@ function handleSuccess() {
reload();
}
const Import = () => {
console.log('新建年度工程资金计划');
const addAnnualPlan = () => {
openModal(true, {
data: ['year'],
});
};
const handleNew = (e) => {
console.log('eeee', e);
router.push({
path: '/annualPlan/annualPlanEdit',
query: e,
});
};
const change = (key: string) => {
......
......@@ -54,6 +54,7 @@
},
]"
/>
</template>
</template>
</BasicTable>
......
......@@ -38,7 +38,6 @@
import { BasicTable, useTable } from '@/components/Table';
import { getBasicColumns } from './tableData';
import { ref, nextTick, onMounted, unref, computed, reactive } from 'vue';
import { demoListApi } from '@/api/demo/table';
import engineeringprojectModel from '../engineeringProjectModel/engineeringprojectModel.vue';
import { useRoute } from 'vue-router';
......
......@@ -19,11 +19,17 @@
label: '详情',
// icon: 'clarity:note-edit-line',
onClick: handleEdit.bind(null, record, 1),
ifShow: (_action) => {
return record.reviewStatus == '1';
},
},
{
label: '修改',
// icon: 'clarity:note-edit-line',
onClick: handleEdit.bind(null, record, 0),
ifShow: (_action) => {
return record.reviewStatus == null;
},
},
{
label: '审核',
......@@ -51,7 +57,6 @@
import { useModal } from '@/components/Modal';
import { getEngineeringList, auditItem } from '@/api/project/engineeringProject';
import { getListByPage } from '@/api/project/biddingPlan';
import { useDrawer } from '@/components/Drawer';
......
......@@ -23,57 +23,57 @@ export const columns: (
},
{
title: '月份',
dataIndex: 'projectName',
dataIndex: 'monthYear',
width: 200,
},
{
title: '类型',
dataIndex: 'implementingEntity',
width: 180,
},
// {
// title: '类型',
// dataIndex: 'implementingEntity',
// width: 180,
// },
{
title: '合同额总计',
dataIndex: 'constructionMode',
dataIndex: 'totalcontractamount',
width: 180,
},
{
title: '资金缺口总计',
dataIndex: 'projectType',
dataIndex: 'totalfundgap',
width: 180,
},
{
title: '年资金缺口',
dataIndex: 'fundingSource',
dataIndex: 'totalfundgapyear',
width: 180,
},
{
title: '公司名称',
dataIndex: 'constructionPurpose',
dataIndex: 'companyName',
width: 180,
},
{
title: '最新更新人',
dataIndex: '国constructionScale',
dataIndex: 'createBy',
width: 180,
},
{
title: '最新更新时间',
dataIndex: '国constructionScale',
dataIndex: 'createTime',
width: 180,
},
{
title: '审核状态',
dataIndex: '国constructionScale',
dataIndex: 'revieweStatus',
width: 180,
},
{
title: '审核人',
dataIndex: '国constructionScale',
dataIndex: 'revieweUser',
width: 180,
},
{
title: '审核时间',
dataIndex: '国constructionScale',
dataIndex: 'reviewTime',
width: 180,
},
];
......
......@@ -2,7 +2,7 @@
<div>
<BasicTable @register="registerTable" :title="'月度工程资金计划'">
<template #toolbar>
<a-button class="btn" type="primary" @click="Import"> 新建月度工程资金计划 </a-button>
<a-button class="btn" type="primary" @click="addMonthlyPlan"> 新建月度工程资金计划 </a-button>
</template>
<template #bodyCell="{ column, text, record, index }">
......@@ -33,6 +33,7 @@
</template>
</template>
</BasicTable>
<yearModal @register="register" @close="handleNew" />
</div>
</template>
<script lang="ts" setup>
......@@ -47,9 +48,16 @@ import { columns, searchFormSchema } from './data';
defineOptions({ name: 'MonthlyPlan' });
const [registerDrawer, { openDrawer }] = useDrawer();
import yearModal from '@/components/yearModal.vue';
import { useModal } from '@/components/Modal';
import {router} from "@/router";
const [register, { openModal: openModal }] = useModal();
const [registerTable, { reload }] = useTable({
api: getListByPage,
api: getMonthlyPlanList,
title: '123',
columns,
formConfig: {
......@@ -85,13 +93,23 @@ function handleSuccess() {
reload();
}
const Import = () => {
console.log('导入数据');
};
const change = (key: string) => {
reload();
};
const addMonthlyPlan = () => {
openModal(true, {
data: ['year'],
});
};
const handleNew = (e) => {
console.log('eeee', e);
router.push({
path: '/monthlyPlan/monthlyPlanEdit',
query: e,
});
};
</script>
<style scoped>
.btn {
......
This diff is collapsed.
import { optionsListApi } from '@/api/demo/select';
import { FormProps, FormSchema, BasicColumn } from '@/components/Table';
import { VxeFormItemProps, VxeGridPropTypes } from '@/components/VxeTable';
import { ref } from 'vue';
import { Input } from 'ant-design-vue';
export function getBasicColumns(): BasicColumn[] {
return [
{
title: '年份',
dataIndex: 'year',
width: 80,
},
{
title: '金额(万元)',
dataIndex: 'amount',
width: 150,
// sorter: true,
// defaultHidden: true,
edit: true,
},
];
}
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 })[] = [
{
field: 'projectName',
label: '项目名称',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'constructionSite',
label: '建设地点',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'constructionMode',
label: '建设模式',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'projectType',
label: '项目类型',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'constructionScale',
label: '建设规模',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'projectOverview',
label: '项目概况:',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'fundingSource',
label: '资金来源:',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'implementingEntity',
label: '实施主体:',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'projectOverview',
label: '项目概况:',
required: true,
component: 'Input',
componentProps: {
readonly: true,
style: { border: 'none' },
},
colProps: { span: 7, offset: 1 },
},
{
field: 'filingCycle',
label: '填报年度:',
required: true,
component: 'DatePicker',
componentProps: {
placeholder: '选择填报周期',
picker: 'year',
style: { width: '100%' },
valueFormat: 'YYYY',
format: 'YYYY',
},
colProps: { span: 7, offset: 1 },
},
{
field: 'totalInvestment',
label: '总投资',
required: true,
component: 'Input',
componentProps: {
addonAfter: '万元',
},
colProps: { span: 7, offset: 1 },
},
{
field: 'competentDepartment',
label: '项目主管部门',
required: true,
component: 'Input',
colProps: { span: 7, offset: 1 },
},
{
field: 'matchingFunds',
label: '2024年财政预算匹配资金',
required: true,
component: 'Input',
componentProps: {
addonAfter: '万元',
},
colProps: { span: 7, offset: 1 },
},
{
field: 'specialBondFunds',
label: '其中专项债项目2024年预计使用专项债资金',
required: true,
component: 'Input',
componentProps: {
addonAfter: '万元',
},
colProps: { span: 7, offset: 1 },
},
{
field: 'planFunds',
label: '2024年计划资金',
required: true,
component: 'Input',
componentProps: {
addonAfter: '万元',
},
colProps: { span: 7, offset: 1 },
},
{
field: 'attribute',
label: '建设性质',
required: true,
component: 'Select',
componentProps: {
options: [
{ label: '新建', value: '0' },
{ label: '结转', value: '1' },
{ label: '缓建', value: '2' },
],
},
colProps: { span: 7, offset: 1 },
},
{
field: 'time',
component: 'RangePicker',
label: '开竣工时间',
required: true,
icon: 'healthicons:i-schedule-school-date-time-outline',
colProps: { span: 7, offset: 1 },
componentProps: {
placeholder: ['开始日期', '结束日期'],
style: { width: '100%' },
valueFormat: 'YYYY-MM-DD',
format: 'YYYY-MM-DD',
},
},
{
field: 'schedule',
label: '2024年底预计形象进度',
required: true,
component: 'Select',
componentProps: {
options: [
{ label: 'A(已经立项实施的跨年工程)', value: '0' },
{ label: 'B(该年度必须建设的项目)', value: '1' },
{ label: 'C(该年度必须建设的项目)', value: '2' },
],
},
colProps: { span: 7, offset: 1 },
},
{
label: '备注',
field: 'remarks',
required: true,
component: 'InputTextArea',
componentProps: {
maxlength: 100,
showCount: true,
},
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' },
// ],
// },
// },
];
This diff is collapsed.
......@@ -2,55 +2,80 @@
<div>
<BasicTable @register="registerTable" :title="'工程项目投资计划完成情况'">
<template #toolbar>
<a-button class="btn" type="primary" @click="Import"> 新建完成情况 </a-button>
<a-button class="btn" type="primary" @click="handleCreate"> 新建完成情况 </a-button>
</template>
<template #bodyCell="{ column, text, record, index }">
<!-- 当前列是序号列时,显示序号 -->
<span v-if="column.dataIndex === 'serialNumber'">{{ index + 1 }}</span>
<!-- 其他列正常显示 -->
<span v-else>{{ text }}</span>
<template v-if="column.key === 'completionResult'">
<Tag color="processing">
{{ record.completionResult == 1 ? '已审核' : '未审核' }}
</Tag>
</template>
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
icon: 'clarity:note-edit-line',
onClick: handleEdit.bind(null, record),
label: '详情',
onClick: handleEdit.bind(null, record, 1),
ifShow: (_action) => {
return record.completionResult == '1';
},
},
{
label: '修改',
onClick: handleEdit.bind(null, record, 0),
ifShow: (_action) => {
return record.completionResult == 0;
},
},
{
icon: 'ant-design:delete-outlined',
label: '删除',
color: 'error',
popConfirm: {
title: '是否确认删除',
placement: 'left',
confirm: handleDelete.bind(null, record),
},
ifShow: (_action) => {
return record.completionResult == 0;
},
},
{
label: '审核',
color: 'success',
popConfirm: {
title: '是否确认审核',
placement: 'left',
confirm: examine.bind(null, record, true),
},
ifShow: (_action) => {
return record.completionResult == 0;
},
},
]"
/>
</template>
</template>
</BasicTable>
<performanceModel @register="register" @close="handleNew" />
</div>
</template>
<script lang="ts" setup>
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getperformanceList } from '@/api/project/performance';
import { getListByPage } from '@/api/project/biddingPlan';
import { useDrawer } from '@/components/Drawer';
import { columns, searchFormSchema } from './data';
defineOptions({ name: 'Performance' });
const [registerDrawer, { openDrawer }] = useDrawer();
const [registerTable, { reload }] = useTable({
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getListByPage, auditItem, deleteItem } from '@/api/project/performance';
import { columns, searchFormSchema } from './data';
import { useModal } from '@/components/Modal';
import { useRouter } from 'vue-router';
const { push } = useRouter();
import performanceModel from './performanceModel.vue';
import { Tag } from 'ant-design-vue';
const [register, { openModal: openModal }] = useModal();
defineOptions({ name: 'Performance' });
const [registerTable, { reload }] = useTable({
api: getListByPage,
title: '123',
title: '工程项目投资计划完成情况',
columns,
formConfig: {
labelWidth: 120,
......@@ -61,40 +86,56 @@ const [registerTable, { reload }] = useTable({
bordered: true,
showIndexColumn: false,
actionColumn: {
width: 80,
width: 180,
title: '操作',
dataIndex: 'action',
// slots: { customRender: 'action' },
fixed: undefined,
},
});
function handleEdit(record: Recordable) {
openDrawer(true, {
record,
isUpdate: true,
});
}
function handleDelete(record: Recordable) {
console.log(record);
}
function handleEdit(record: Recordable, disabled: number) {
push({
path: '/performance/edit',
query: {
id: record.id,
disabled: String(disabled),
},
});
}
function handleSuccess() {
function handleDelete(record: Recordable) {
deleteItem({ id: record.id });
reload();
}
}
const Import = () => {
console.log('新建完成情况');
};
function handleSuccess() {
reload();
}
const change = (key: string) => {
function handleCreate() {
openModal(true, {
data: '2023',
});
}
function handleNew(e) {
console.log(e);
push({
path: '/performance/edit',
query: {
source: JSON.stringify(e),
},
});
}
async function examine(record: Recordable) {
const id = record.id;
const res = await auditItem({ id });
console.log(res);
reload();
};
}
</script>
<style scoped>
.btn {
.btn {
margin-right: 10px;
}
}
</style>
<template>
<PageWrapper
:title="getTitle"
v-loading="loadingRef"
loading-tip="加载中..."
:contentBackground="false"
headerSticky
>
<template #extra>
<a-button type="primary" danger> 删除 </a-button>
<a-button type="primary" v-if="!disabled" @click="handleSubmit"> 提交 </a-button>
<a-button type="default" @click="router.back()"> 返回 </a-button>
</template>
<PageCard v-for="(item, index) in tabsFormSchema" :key="index" :title="item.name">
<template #right>
<a-button
v-if="!disabled"
type="text"
preIcon="ant-design:delete-outlined"
danger
@click="deleteItem(index)"
>
</a-button>
</template>
<BasicForm :loading="loading" @register="item.Form[0]" />
</PageCard>
<!-- <a-button type="dashed" @click="add" preIcon="ei:plus"> 从项目库导入 </a-button>
<a-button type="dashed" @click="handleAdd" class="ml-2" preIcon="ei:plus"> 新建项目 </a-button> -->
<!-- <projectDrawer v-if="!disabled" @register="registerDrawer" @success="handleSuccess" />
<projectlibraryModel v-if="!disabled" @register="register" @close="handleNewData" /> -->
</PageWrapper>
</template>
<script lang="ts" setup>
import { unref, computed, onMounted, ref, reactive, nextTick } from 'vue';
import { PageWrapper } from '@/components/Page';
import PageCard from '@/components/Page/src/PageCard.vue';
import { BasicForm, useForm, FormProps, UseFormReturnType } from '@/components/Form';
import { formSchema1, formSchema2 } from './data';
import { deepMerge } from '@/utils';
import { useMessage } from '@/hooks/web/useMessage';
import { editModel } from '@/api/project/model/performance';
import { router } from '@/router';
import { useRoute } from 'vue-router';
import {
addItem,
updateItem,
getItem,
GetEngineProjectList,
Itemdelete,
} from '@/api/project/performance';
const loadingRef = ref(false);
const { createMessage } = useMessage();
const isUpdate = ref(false);
const loading = ref(false);
const formData = ref<editModel>({});
const disabled = ref(false);
const getTitle = ref('');
onMounted(async () => {
loadingRef.value = true;
const route = useRoute();
const id = route.query.id; // 获取名为id的参数
if (!id) {
formData.value.planCompletion = [];
isUpdate.value = false;
getTitle.value = '创建完成情况';
let ids = JSON.parse(route.query.source);
let result = await GetEngineProjectList({
ids,
});
formData.value.ids = ids;
result.map((res) => {
let item = res;
item.time = item.beginTime + '/' + item.endTime;
handleNew(item);
});
} else {
isUpdate.value = true;
disabled.value = route.query.disabled == '0' ? false : true;
if (disabled.value) {
getTitle.value = '查看完成情况';
} else {
getTitle.value = '编辑完成情况';
}
let res = await getItem({ id });
formData.value.id = id;
formData.value.planCompletion = [];
for (let i = 0; i < res.length; i++) {
const source = res[i];
const item = {
name: '序号' + (i + 1),
forceRender: true,
Form: useForm(
Object.assign(
{ schemas: source.planType == '承建' ? formSchema1 : formSchema2, disabled },
baseFormConfig,
) as FormProps,
),
};
const { setFieldsValue, clearValidate } = item.Form[1];
source.time = source.beginTime + '/' + source.endTime;
tabsFormSchema.push(item);
formData.value.planCompletion.push({
id: source.id,
investmentld: source.investmentId,
});
nextTick(() => {
setFieldsValue({
...source,
});
clearValidate();
});
}
}
loadingRef.value = false;
});
type TabsFormType = {
name: string;
forceRender?: boolean;
Form: UseFormReturnType;
};
const baseFormConfig: Partial<FormProps> = {
showActionButtonGroup: false,
labelWidth: 260,
layout: 'vertical',
};
const tabsFormSchema = reactive<TabsFormType[]>([]);
/***
*
*/
async function handleNew(info: any) {
console.log(info);
const item = {
name: '序号' + (tabsFormSchema.length + 1),
forceRender: true,
Form: useForm(
Object.assign(
{ schemas: info.planType == '承建' ? formSchema1 : formSchema2, disabled },
baseFormConfig,
) as FormProps,
),
};
const { setFieldsValue, clearValidate } = item.Form[1];
tabsFormSchema.push(item);
formData.value.planCompletion.push({
id: info.id,
investmentId: info.investmentId,
});
nextTick(() => {
setFieldsValue(info);
clearValidate();
});
}
async function deleteItem(index: any) {
loadingRef.value = true;
const id = formData.value.planCompletion[index].id;
if (id) {
await Itemdelete({
id,
});
formData.value.planCompletion.splice(index, 1);
tabsFormSchema.splice(index, 1);
loadingRef.value = false;
} else {
formData.value.planCompletion.splice(index, 1);
tabsFormSchema.splice(index, 1);
loadingRef.value = false;
}
}
async function handleSubmit() {
loadingRef.value = true;
try {
for (let i = 0; i < tabsFormSchema.length; i++) {
let item = tabsFormSchema[i];
const { validate, getFieldsValue } = item.Form[1];
await validate();
let res = getFieldsValue();
formData.value.planCompletion[i] = deepMerge(formData.value.planCompletion[i], res);
formData.value.planCompletion[i].actualOutputValue = Number(
formData.value.planCompletion[i].actualOutputValue,
);
formData.value.planCompletion[i].actualPay = Number(
formData.value.planCompletion[i].actualPay,
);
console.log(formData.value.planCompletion);
}
formData.value.proNumber = formData.value.planCompletion.Length;
let res = isUpdate.value ? await updateItem(unref(formData)) : await addItem(unref(formData));
loadingRef.value = true;
console.log(res);
createMessage.success('提交成功!');
router.back();
} catch (e) {
// 验证失败或出错,切换到对应标签页
console.log(e);
} finally {
loadingRef.value = false;
}
}
</script>
<template>
<BasicModal
width="70%"
v-bind="$attrs"
@register="register"
title="选择投资计划"
:minHeight="30"
okText="新建"
@ok="handleSubmit"
@visible-change="handleVisibleChange"
>
<BasicTable @register="registerTable">
<template #bodyCell="{ column, text, record, index }">
<!-- 当前列是序号列时,显示序号 -->
<span v-if="column.dataIndex === 'serialNumber'">{{ index + 1 }}</span>
<!-- 其他列正常显示 -->
<span v-else>{{ text }}</span>
</template>
</BasicTable>
<!-- <button @click="getSelectRowList">获取数据</button>-->
</BasicModal>
</template>
<script lang="ts" setup>
import { getEngineeringList } from '@/api/project/performance';
import { BasicModal, useModalInner } from '@/components/Modal';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { modelColumns, searchModelFormSchema } from './data';
import { useMessage } from '@/hooks/web/useMessage';
const [registerTable, { reload, getSelectRows }] = useTable({
api: getEngineeringList,
title: '123',
columns: modelColumns,
formConfig: {
labelWidth: 120,
schemas: searchModelFormSchema,
},
useSearchForm: true,
showTableSetting: false,
bordered: true,
showIndexColumn: false,
rowSelection: {
type: 'checkbox',
},
// actionColumn: {
// width: 80,
// title: '操作',
// dataIndex: 'action',
// // slots: { customRender: 'action' },
// fixed: undefined,
// },
});
const { createMessage } = useMessage();
function getSelectRowList() {
// createMessage.info('请在控制台查看!');
// console.log(getSelectRows());
const ids = getSelectRows().map((i) => {
return i.id;
});
emit('close', ids);
}
const emit = defineEmits(['close']);
function handleVisibleChange(v) {}
const [register, { closeModal }] = useModalInner((data) => {
data;
});
function handleSubmit() {
getSelectRowList();
closeModal();
}
</script>
......@@ -8,10 +8,13 @@ export const formSchema: FormSchema[] = [
required: true,
component: 'DatePicker',
componentProps: {
placeholder: '选择填报周期',
style: { width: '100%' },
valueFormat: 'YYYY-MM-DD',
format: 'YYYY-MM-DD',
placeholder: '年份',
picker: 'year',
valueFormat: 'YYYY',
format: 'YYYY',
style: {
width: '100%',
},
},
},
{
......@@ -171,10 +174,13 @@ export const searchFormSchema: FormSchema[] = [
label: '',
component: 'DatePicker',
componentProps: {
placeholder: '选择填报周期',
style: { width: '100%' },
valueFormat: 'YYYY-MM-DD',
format: 'YYYY-MM-DD',
placeholder: '年份',
picker: 'year',
valueFormat: 'YYYY',
format: 'YYYY',
style: {
width: '100%',
},
},
colProps: { span: 4 },
},
......
......@@ -8,10 +8,13 @@ export const formSchema: FormSchema[] = [
required: true,
component: 'DatePicker',
componentProps: {
placeholder: '选择填报周期',
style: { width: '100%' },
valueFormat: 'YYYY-MM-DD',
format: 'YYYY-MM-DD',
placeholder: '年份',
picker: 'year',
valueFormat: 'YYYY',
format: 'YYYY',
style: {
width: '100%',
},
},
},
{
......@@ -167,10 +170,13 @@ export const searchFormSchema: FormSchema[] = [
label: '',
component: 'DatePicker',
componentProps: {
placeholder: '选择填报周期',
style: { width: '100%' },
valueFormat: 'YYYY-MM-DD',
format: 'YYYY-MM-DD',
placeholder: '年份',
picker: 'year',
valueFormat: 'YYYY',
format: 'YYYY',
style: {
width: '100%',
},
},
colProps: { span: 4 },
},
......
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