Commit 1f7440e7 authored by jiaxu.yan's avatar jiaxu.yan

feat: 项目库模块

parent a368382b
......@@ -8,7 +8,7 @@ VITE_PUBLIC_PATH = /
VITE_GLOB_API_URL = /api
# File upload address, optional
VITE_GLOB_UPLOAD_URL = /upload
VITE_GLOB_UPLOAD_URL = '/api/system/file/add'
# Interface prefix
VITE_GLOB_API_URL_PREFIX =
{
"i18n-ally.localesPaths": [
"src/locales",
"src/locales/lang",
"public/resource/tinymce/langs"
]
}
\ No newline at end of file
import { ProjectParams, ProjectListGetResultModel, ProjectModel } from './model/biddingPlanModel';
import {
ProjectPageParams,
ProjectListGetResultModel,
ProjectModel,
} from './model/biddingPlanModel';
import { defHttp } from '@/utils/http/axios';
enum Api {
......@@ -6,7 +10,7 @@ enum Api {
AddProject = '/mgapi/project/projectManage/add',
UpdateProject = '/mgapi/project/projectManage/update',
}
export const getListByPage = (params?: ProjectParams) =>
export const getListByPage = (params?: ProjectPageParams) =>
defHttp.post<ProjectListGetResultModel>({ url: Api.GetList, data: params });
export const addItem = (params?: any) =>
......
import { BasicPageParams } from '@/api/model/baseModel';
import { BasicPageParams, BasicFetchResult } from '@/api/model/baseModel';
export type ProjectParams = {
projectName?: string;
......@@ -34,4 +34,4 @@ export interface ProjectModel {
constructionPurpose: string;
}
export type ProjectListGetResultModel = ProjectListItem[];
export type ProjectListGetResultModel = BasicFetchResult<ProjectListItem>;
......@@ -17,7 +17,7 @@ const biddingManagement: AppRouteModule = {
{
path: 'index',
name: 'biddingManagement',
component: () => import('@/views/dashboard/analysis/index.vue'),
component: () => import('@/views/biddingManagement/index.vue'),
meta: {
// affix: true,
title: '招标管理',
......
......@@ -24,6 +24,16 @@ const biddingPlan: AppRouteModule = {
orderNo: 2,
},
},
{
path: 'edit',
name: 'planEdit',
component: () => import('@/views/biddingPlan/biddingPlanEdit.vue'),
meta: {
// affix: true,
title: '招标计划',
orderNo: 2,
},
},
],
};
......
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: BasicColumn[] = [
{
title: '项目名称',
dataIndex: 'project_name',
width: 200,
},
{
title: '实施主体',
dataIndex: 'implementing_entity',
width: 180,
},
{
title: '建设模式',
dataIndex: 'construction_mode',
width: 180,
},
{
title: '项目类型',
dataIndex: 'project_type',
width: 180,
},
{
title: '资金来源',
dataIndex: 'funding_source',
width: 180,
},
{
title: '建设目的及项目功能',
dataIndex: 'construction_purpose',
width: 180,
},
{
title: '建设规模',
dataIndex: '国construction_scale',
width: 180,
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'ProjecName',
label: '',
component: 'Input',
componentProps: {
placeholder: '点击选择图标',
},
colProps: { span: 4 },
},
{
field: 'ProjecName',
label: '',
component: 'Input',
componentProps: {
placeholder: '点击选择图标',
},
colProps: { span: 4 },
},
// {
// field: 'status',
// label: '状态',
// component: 'Select',
// componentProps: {
// options: [
// { label: '启用', value: '1' },
// { label: '停用', value: '0' },
// ],
// },
// colProps: { span: 8 },
// },
];
export const formSchema: FormSchema[] = [
{
field: 'projectName',
label: '项目名称',
required: true,
component: 'Input',
},
{
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' },
// ],
// },
// },
{
label: '建设模式',
field: 'constructionMode',
component: 'InputTextArea',
},
{
label: '项目类型',
field: 'projectType',
required: true,
component: 'Input',
},
{
label: '项目概况',
field: 'projectOverview',
required: true,
component: 'InputTextArea',
},
{
label: '建设目的及项目功能',
field: 'constructionPurpose',
required: true,
component: 'InputTextArea',
},
];
<template>
<PageWrapper title="单号:234231029431" contentBackground headerSticky>
<template #extra>
<a-button> 操作一 </a-button>
<a-button> 操作二 </a-button>
<a-button type="primary"> 主操作 </a-button>
</template>
<template #footer>
<Tabs default-active-key="1">
<Tabs.TabPane key="1" tab="详情" />
<Tabs.TabPane key="2" tab="规则" />
</Tabs>
</template>
<div class="pt-4 m-4 desc-wrap">
<Descriptions size="small" :column="2">
<Descriptions.Item label="创建人"> 曲丽丽 </Descriptions.Item>
<Descriptions.Item label="订购产品"> XX 服务 </Descriptions.Item>
<Descriptions.Item label="创建时间"> 2017-01-10 </Descriptions.Item>
<Descriptions.Item label="关联单据">
<a>12421</a>
</Descriptions.Item>
<Descriptions.Item label="生效日期"> 2017-07-07 ~ 2017-08-08 </Descriptions.Item>
<Descriptions.Item label="备注"> 请于两个工作日内确认 </Descriptions.Item>
</Descriptions>
<Card title="流程进度" :bordered="false">
<Steps :current="1" progress-dot size="small">
<Steps.Step title="创建项目">
<template #description>
<div>Vben</div>
<p>2016-12-12 12:32</p>
</template>
</Steps.Step>
<Steps.Step title="部门初审">
<template #description>
<p>Chad</p>
</template>
</Steps.Step>
<Steps.Step title="财务复核" />
<Steps.Step title="完成" />
</Steps>
</Card>
<Card title="用户信息" :bordered="false" class="mt-5">
<Descriptions :column="3">
<Descriptions.Item label="用户姓名"> 付小小 </Descriptions.Item>
<Descriptions.Item label="会员卡号"> XX 32943898021309809423 </Descriptions.Item>
<Descriptions.Item label="身份证"> 3321944288191034921 </Descriptions.Item>
<Descriptions.Item label="联系方式"> 18112345678 </Descriptions.Item>
<Descriptions.Item label="联系地址" :span="2">
曲丽丽 18100000000 浙江省杭州市西湖区黄姑山路工专路交叉路口
</Descriptions.Item>
</Descriptions>
<Descriptions title="信息组" :column="3">
<Descriptions.Item label="某某数据"> 111 </Descriptions.Item>
<Descriptions.Item label="该数据更新时间"> 2017-08-08 </Descriptions.Item>
<Descriptions.Item label="某某数据"> 725 </Descriptions.Item>
<Descriptions.Item label="该数据更新时间"> 2017-08-08 </Descriptions.Item>
</Descriptions>
<h4>信息组</h4>
<Card title="多层级信息组">
<Descriptions title="组名称" :column="3">
<Descriptions.Item label="负责人"> 林东东 </Descriptions.Item>
<Descriptions.Item label="角色码"> 1234567 </Descriptions.Item>
<Descriptions.Item label="所属部门"> XX公司 - YY部 </Descriptions.Item>
<Descriptions.Item label="过期时间"> 2017-08-08 </Descriptions.Item>
<Descriptions.Item label="描述" :span="2">
这段描述很长很长很长很长很长很长很长很长很长很长很长很长很长很长...
</Descriptions.Item>
</Descriptions>
<Divider />
<Descriptions title="组名称" :column="1">
<Descriptions.Item label="学名">
Citrullus lanatus (Thunb.) Matsum. et
Nakai一年生蔓生藤本;茎、枝粗壮,具明显的棱。卷须较粗..
</Descriptions.Item>
</Descriptions>
<Divider />
<Descriptions title="组名称" :column="1">
<Descriptions.Item label="负责人"> 付小小 </Descriptions.Item>
<Descriptions.Item label="角色码"> 1234568 </Descriptions.Item>
</Descriptions>
</Card>
</Card>
<Card title="用户近半年来电记录" class="my-5">
<Empty />
</Card>
<BasicTable @register="registerTimeTable" />
</div>
</PageWrapper>
</template>
<script lang="ts" setup>
import { BasicTable, useTable } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import { Divider, Card, Empty, Descriptions, Steps, Tabs } from 'ant-design-vue';
import { refundTimeTableSchema, refundTimeTableData } from './data';
const [registerTimeTable] = useTable({
title: '退货进度',
columns: refundTimeTableSchema,
pagination: false,
dataSource: refundTimeTableData,
showIndexColumn: false,
scroll: { y: 300 },
});
</script>
<template>
<div>
<BasicTable @register="registerTable" :title="'招标管理'">
<template #toolbar>
<a-button type="primary" icon="" @click="handleCreate"> 新增招标计划 </a-button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
icon: 'clarity:note-edit-line',
onClick: handleEdit.bind(null, record),
},
{
icon: 'ant-design:delete-outlined',
color: 'error',
popConfirm: {
title: '是否确认删除',
placement: 'left',
confirm: handleDelete.bind(null, record),
},
},
]"
/>
</template>
</template>
</BasicTable>
<!-- <biddingPlanDrawer @register="registerDrawer" @success="handleSuccess" /> -->
</div>
</template>
<script lang="ts" setup>
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getListByPage } from '@/api/project/biddingPlan';
// import biddingPlanDrawer from './biddingPlanDrawer.vue';
import { columns, searchFormSchema } from './biddingPlan.data';
defineOptions({ name: 'RoleManagement' });
import { useDrawer } from '@/components/Drawer';
const [registerDrawer, { openDrawer }] = useDrawer();
const [registerTable, { reload }] = useTable({
api: getListByPage,
columns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
useSearchForm: true,
showTableSetting: false,
bordered: true,
showIndexColumn: false,
actionColumn: {
width: 80,
title: '操作',
dataIndex: 'action',
// slots: { customRender: 'action' },
fixed: undefined,
},
});
function handleCreate() {
openDrawer(true, {
isUpdate: false,
});
}
function handleEdit(record: Recordable) {
openDrawer(true, {
record,
isUpdate: true,
});
}
function handleDelete(record: Recordable) {
console.log(record);
}
function handleSuccess() {
reload();
}
</script>
<template>
<PageWrapper title="单号:234231029431" contentBackground headerSticky>
<template #extra>
<a-button> 操作一 </a-button>
<a-button> 操作二 </a-button>
<a-button type="primary"> 主操作 </a-button>
</template>
<template #footer>
<Tabs default-active-key="1">
<Tabs.TabPane key="1" tab="详情" />
<Tabs.TabPane key="2" tab="规则" />
</Tabs>
</template>
<div class="pt-4 m-4 desc-wrap">
<Descriptions size="small" :column="2">
<Descriptions.Item label="创建人"> 曲丽丽 </Descriptions.Item>
<Descriptions.Item label="订购产品"> XX 服务 </Descriptions.Item>
<Descriptions.Item label="创建时间"> 2017-01-10 </Descriptions.Item>
<Descriptions.Item label="关联单据">
<a>12421</a>
</Descriptions.Item>
<Descriptions.Item label="生效日期"> 2017-07-07 ~ 2017-08-08 </Descriptions.Item>
<Descriptions.Item label="备注"> 请于两个工作日内确认 </Descriptions.Item>
</Descriptions>
<Card title="流程进度" :bordered="false">
<Steps :current="1" progress-dot size="small">
<Steps.Step title="创建项目">
<template #description>
<div>Vben</div>
<p>2016-12-12 12:32</p>
</template>
</Steps.Step>
<Steps.Step title="部门初审">
<template #description>
<p>Chad</p>
</template>
</Steps.Step>
<Steps.Step title="财务复核" />
<Steps.Step title="完成" />
</Steps>
</Card>
<Card title="用户信息" :bordered="false" class="mt-5">
<Descriptions :column="3">
<Descriptions.Item label="用户姓名"> 付小小 </Descriptions.Item>
<Descriptions.Item label="会员卡号"> XX 32943898021309809423 </Descriptions.Item>
<Descriptions.Item label="身份证"> 3321944288191034921 </Descriptions.Item>
<Descriptions.Item label="联系方式"> 18112345678 </Descriptions.Item>
<Descriptions.Item label="联系地址" :span="2">
曲丽丽 18100000000 浙江省杭州市西湖区黄姑山路工专路交叉路口
</Descriptions.Item>
</Descriptions>
<Descriptions title="信息组" :column="3">
<Descriptions.Item label="某某数据"> 111 </Descriptions.Item>
<Descriptions.Item label="该数据更新时间"> 2017-08-08 </Descriptions.Item>
<Descriptions.Item label="某某数据"> 725 </Descriptions.Item>
<Descriptions.Item label="该数据更新时间"> 2017-08-08 </Descriptions.Item>
</Descriptions>
<h4>信息组</h4>
<Card title="多层级信息组">
<Descriptions title="组名称" :column="3">
<Descriptions.Item label="负责人"> 林东东 </Descriptions.Item>
<Descriptions.Item label="角色码"> 1234567 </Descriptions.Item>
<Descriptions.Item label="所属部门"> XX公司 - YY部 </Descriptions.Item>
<Descriptions.Item label="过期时间"> 2017-08-08 </Descriptions.Item>
<Descriptions.Item label="描述" :span="2">
这段描述很长很长很长很长很长很长很长很长很长很长很长很长很长很长...
</Descriptions.Item>
</Descriptions>
<Divider />
<Descriptions title="组名称" :column="1">
<Descriptions.Item label="学名">
Citrullus lanatus (Thunb.) Matsum. et
Nakai一年生蔓生藤本;茎、枝粗壮,具明显的棱。卷须较粗..
</Descriptions.Item>
</Descriptions>
<Divider />
<Descriptions title="组名称" :column="1">
<Descriptions.Item label="负责人"> 付小小 </Descriptions.Item>
<Descriptions.Item label="角色码"> 1234568 </Descriptions.Item>
</Descriptions>
</Card>
</Card>
<Card title="用户近半年来电记录" class="my-5">
<Empty />
</Card>
<BasicTable @register="registerTimeTable" />
</div>
</PageWrapper>
</template>
<script lang="ts" setup>
import { BasicTable, useTable } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import { Divider, Card, Empty, Descriptions, Steps, Tabs } from 'ant-design-vue';
import { refundTimeTableSchema, refundTimeTableData } from './data';
const [registerTimeTable] = useTable({
title: '退货进度',
columns: refundTimeTableSchema,
pagination: false,
dataSource: refundTimeTableData,
showIndexColumn: false,
scroll: { y: 300 },
});
</script>
......@@ -26,20 +26,20 @@
</template>
</template>
</BasicTable>
<biddingPlanDrawer @register="registerDrawer" @success="handleSuccess" />
<!-- <biddingPlanDrawer @register="registerDrawer" @success="handleSuccess" /> -->
</div>
</template>
<script lang="ts" setup>
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getListByPage } from '@/api/project/biddingPlan';
import { useDrawer } from '@/components/Drawer';
import biddingPlanDrawer from './biddingPlanDrawer.vue';
// import biddingPlanDrawer from './biddingPlanDrawer.vue';
import { columns, searchFormSchema } from './biddingPlan.data';
defineOptions({ name: 'RoleManagement' });
import { useDrawer } from '@/components/Drawer';
const [registerDrawer, { openDrawer }] = useDrawer();
const [registerTable, { reload }] = useTable({
api: getListByPage,
......
export const cardList = (() => {
const result: any[] = [];
for (let i = 0; i < 6; i++) {
result.push({
id: i,
title: 'Vben Admin',
description: '基于Vue Next, TypeScript, Ant Design Vue实现的一套完整的企业级后台管理系统',
datetime: '2020-11-26 17:39',
extra: '编辑',
icon: 'logos:vue',
color: '#1890ff',
author: 'Vben',
percent: 20 * (i + 1),
});
}
return result;
})();
......@@ -3,17 +3,29 @@
<PageCard title="数据简报">
<div :class="`${prefixCls}__top`">
<Row :gutter="12">
<Col :span="8" :class="`${prefixCls}__top-col`">
<div>我的待办</div>
<p>8个任务</p>
<Col :span="4" :class="`${prefixCls}__top-col`">
<div>项目总数</div>
<p>100</p>
</Col>
<Col :span="8" :class="`${prefixCls}__top-col`">
<div>本周任务平均处理时间</div>
<p>32分钟</p>
<Col :span="4" :class="`${prefixCls}__top-col`">
<div>自建</div>
<p>100</p>
</Col>
<Col :span="8" :class="`${prefixCls}__top-col`">
<div>本周完成任务数</div>
<p>24个任务</p>
<Col :span="4" :class="`${prefixCls}__top-col`">
<div>委托建设</div>
<p>100</p>
</Col>
<Col :span="4" :class="`${prefixCls}__top-col`">
<div>代建</div>
<p>100</p>
</Col>
<Col :span="4" :class="`${prefixCls}__top-col`">
<div>承建</div>
<p>100</p>
</Col>
<Col :span="4" :class="`${prefixCls}__top-col`">
<div>储备</div>
<p>100</p>
</Col>
</Row>
</div>
......@@ -21,91 +33,137 @@
<PageCard title="项目列表">
<div :class="`${prefixCls}__content`">
<BasicForm submitOnReset @register="register" @submit="handleSearchInfoChange" />
<List :pagination="pagination">
<template v-for="item in cardList" :key="item.id">
<List.Item class="list">
<List.Item.Meta>
<template #avatar>
<Icon class="icon" v-if="item.icon" :icon="item.icon" :color="item.color" />
</template>
<template #title>
<span>{{ item.title }}</span>
<div class="extra" v-if="item.extra">
{{ item.extra }}
</div>
</template>
<template #description>
<div class="description">
{{ item.description }}
</div>
<div class="info">
<div><span>Owner</span>{{ item.author }}</div>
<div><span>开始时间</span>{{ item.datetime }}</div>
</div>
<div class="progress">
<Progress :percent="item.percent" status="active" />
<div>
<a-button type="primary" icon="" @click="handleCreate"> 创建项目 </a-button>
</div>
<List :loading="loading" :pagination="paginationProp" :data-source="data">
<template #header>
<Row :gutter="12">
<Col :span="4" :class="`${prefixCls}__list-header`">基本信息</Col>
<Col :span="2" :class="`${prefixCls}__list-header`">实施主体</Col>
<Col :span="2" :class="`${prefixCls}__list-header`">建设模式</Col>
<Col :span="2" :class="`${prefixCls}__list-header`">建设地点</Col>
<Col :span="2" :class="`${prefixCls}__list-header`">项目类型</Col>
<Col :span="2" :class="`${prefixCls}__list-header`">资金来源</Col>
<Col :span="4" :class="`${prefixCls}__list-header`">建设目的及项目功能</Col>
<Col :span="3" :class="`${prefixCls}__list-header`">建设规模</Col>
<Col :span="3">操作</Col>
</Row>
</template>
</List.Item.Meta>
</List.Item>
<template #renderItem="{ item }">
<Row :gutter="12">
<Col :span="4">基本信息</Col>
<Col :span="2">{{ item.implementing_entity }}</Col>
<Col :span="2">{{ item.construction_mode }}</Col>
<Col :span="2">{{ item.construction_site }}</Col>
<Col :span="2">{{ item.project_type }}</Col>
<Col :span="2">{{ item.funding_source }}</Col>
<Col :span="4">{{ item.construction_purpose }}</Col>
<Col :span="3">{{ item.construction_scale }}</Col>
<Col :span="3">操作</Col>
</Row>
</template>
</List>
</div>
</PageCard>
<projectDrawer @register="registerDrawer" @success="handleSuccess" />
</PageWrapper>
</template>
<script lang="ts" setup>
import { Progress, Row, Col, List } from 'ant-design-vue';
import Icon from '@/components/Icon/Icon.vue';
import { cardList } from './data';
import { Row, Col, List, Pagination } from 'ant-design-vue';
import { PageWrapper } from '@/components/Page';
import PageCard from '@/components/Page/src/PageCard.vue';
import { BasicForm, FormSchema, useForm } from '@/components/Form';
import { unref, computed } from 'vue';
import type { FormProps } from '@/components/Form';
const schemas: FormSchema[] = [
{
field: 'ProjecName',
label: '',
component: 'Input',
componentProps: {
placeholder: '点击选择图标',
},
colProps: { span: 4 },
},
{
field: 'ProjecName',
label: '',
component: 'Input',
componentProps: {
placeholder: '点击选择图标',
},
colProps: { span: 4 },
},
];
import { BasicForm, useForm } from '@/components/Form';
import { ref, onMounted } from 'vue';
import { getListByPage } from '@/api/project/biddingPlan';
import { merge } from 'lodash-es';
import projectDrawer from './projectDrawer.vue';
import { searchFormSchema } from './project.data';
import { useDrawer } from '@/components/Drawer';
const [registerDrawer, { openDrawer }] = useDrawer();
const data = ref([]);
const prefixCls = 'list-basic';
//分页相关
const page = ref(1);
const pageSize = ref(10);
const total = ref(0);
let params = ref({});
const loading = ref(false);
const [register] = useForm({
schemas,
schemas: searchFormSchema,
compact: true,
actionColOptions: { span: 6 },
showActionButtonGroup: true,
});
const prefixCls = 'list-basic';
const pagination = {
show: true,
pageSize: 3,
};
function handleSearchInfoChange(info: Recordable) {
// 自动请求并暴露内部方法
onMounted(() => {
fetch();
});
async function handleSearchInfoChange(info: any) {
params.value = info;
console.log(info);
page.value = 1;
await fetch();
}
async function fetch(p = {}) {
loading.value = true;
const res = await getListByPage(
merge({
...params.value,
pageNum: page.value,
pageSize: pageSize.value,
...p,
}),
);
data.value = res.items;
total.value = res.total;
loading.value = false;
}
const getFormProps = computed((): Partial<FormProps> => {
const { formConfig } = unref(propsRef);
const { submitButtonOptions } = formConfig || {};
return {
showAdvancedButton: true,
...formConfig,
submitButtonOptions: { loading: unref(getLoading), ...submitButtonOptions },
compact: true,
};
const paginationProp = ref({
showSizeChanger: false,
showQuickJumper: true,
pageSize,
current: page,
total,
showTotal: (total: number) => `总 ${total} 条`,
onChange: pageChange,
onShowSizeChange: pageSizeChange,
});
function pageChange(p: number, pz: number) {
page.value = p;
pageSize.value = pz;
fetch();
}
function pageSizeChange(_current, size: number) {
pageSize.value = size;
fetch();
}
function handleCreate() {
openDrawer(true, {
isUpdate: false,
});
}
function handleEdit(record: Recordable) {
openDrawer(true, {
record,
isUpdate: true,
});
}
function handleDelete(record: Recordable) {
console.log(record);
}
function handleSuccess() {
fetch();
}
</script>
<style lang="less" scoped>
.list-basic {
......@@ -115,14 +173,15 @@
text-align: center;
&-col {
&:not(:last-child) {
border-right: 1px dashed @border-color-base;
}
// &:not(:last-child) {
// border-right: 1px dashed @border-color-base;
// }
div {
margin-bottom: 12px;
color: @text-color-base;
font-size: 14px;
text-align: left;
line-height: 22px;
}
......@@ -131,10 +190,17 @@
color: @text-color-base;
font-size: 24px;
line-height: 32px;
text-align: left;
font-weight: bold;
}
}
}
&__list {
&-header {
color: #333;
font-weight: bold;
}
}
&__content {
background-color: @component-background;
......
import { FormSchema } from '@/components/Table';
import { uploadApi } from '@/api/sys/upload';
export const formSchema: FormSchema[] = [
{
field: 'logo',
label: '项目logo',
labelWidth: '140px',
// required: true,
component: 'ImageUpload',
required: true,
componentProps: {
api: uploadApi,
accept: ['png', 'jpeg', 'jpg'],
maxSize: 1,
maxNumber: 1,
},
},
{
field: 'projectName',
labelWidth: '140px',
label: '项目名称',
required: true,
component: 'Input',
},
{
label: '储备项目',
labelWidth: '140px',
field: 'isReserveProject',
component: 'Checkbox',
// renderComponentContent: '储备项目',
},
{
label: '建设模式',
labelWidth: '140px',
field: 'constructionMode',
required: true,
component: 'Select',
componentProps: {
options: [
{
label: '委托建设',
value: '委托建设',
},
{
label: '代建',
value: '代建',
},
{
label: '自建',
value: '自建',
},
{
label: '储备',
value: '储备',
},
],
},
},
{
label: '项目类型',
labelWidth: '140px',
field: 'projectType',
required: true,
component: 'Select',
componentProps: {
options: [
{
label: '公共设施配套类',
value: '公共设施配套类',
key: '公共设施配套类',
},
{
label: '基础设施类',
value: '基础设施类',
key: '基础设施类',
},
{
label: '产业载体类',
value: '产业载体类',
key: '产业载体类',
},
{
label: '房地产类',
value: '房地产类',
key: '房地产类',
},
{
label: '存量盘活类',
value: '存量盘活类',
key: '存量盘活类',
},
{
label: '其他类(零星工程)',
value: '其他类(零星工程)',
key: '其他类(零星工程)',
},
],
},
},
{
label: '建设规模',
labelWidth: '140px',
field: 'constructionScale',
required: true,
component: 'Input',
},
{
label: '项目概况',
field: 'projectOverview',
labelWidth: '140px',
required: true,
component: 'InputTextArea',
componentProps: {
maxlength: 100,
showCount: true,
},
},
{
label: '建设目的及项目功能',
labelWidth: '140px',
field: 'constructionPurpose',
required: true,
component: 'InputTextArea',
componentProps: {
maxlength: 100,
showCount: true,
},
},
{
field: 'fundingSource',
label: '资金来源',
labelWidth: '140px',
required: true,
component: 'Select',
componentProps: {
options: [
{
label: '自筹',
value: '自筹',
key: '自筹',
},
{
label: '财政资金',
value: '财政资金',
key: '财政资金',
},
{
label: '专项债',
value: '专项债',
key: '专项债',
},
],
},
},
{
field: 'ImplementingEntity',
label: '实施主体',
required: true,
labelWidth: '140px',
component: 'Select',
componentProps: {
options: [
{
label: '了解产品',
value: '了解产品',
key: '了解产品',
},
{
label: '正在跟进',
value: '正在跟进',
key: '正在跟进',
},
{
label: '正在试用',
value: '正在试用',
key: '正在试用',
},
{
label: '准备购买',
value: '准备购买',
key: '准备购买',
},
{
label: '准备付款',
value: '准备付款',
key: '准备付款',
},
{
label: '已经购买',
value: '已经购买',
key: '已经购买',
},
{
label: '暂时闲置',
value: '暂时闲置',
key: '暂时闲置',
},
],
},
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'ProjecName',
label: '',
component: 'Input',
componentProps: {
placeholder: '输入搜索关键词',
},
colProps: { span: 4 },
},
{
field: 'ConstructionMode',
component: 'RadioButtonGroup',
colProps: {
span: 6,
},
componentProps: {
options: [
{
label: '全部项目',
value: undefined,
},
{
label: '自建',
value: '1',
},
{
label: '委托建设',
value: '2',
},
{
label: '代理',
value: '3',
},
{
label: '承建',
value: '4',
},
],
},
},
{
field: 'isReserveProject',
component: 'Checkbox',
colProps: {
span: 2,
},
renderComponentContent: '储备项目',
},
{
field: 'ImplementingEntity',
label: '',
component: 'Select',
componentProps: {
placeholder: '实施主体',
options: [
{
label: '了解产品',
value: '了解产品',
key: '了解产品',
},
{
label: '正在跟进',
value: '正在跟进',
key: '正在跟进',
},
{
label: '正在试用',
value: '正在试用',
key: '正在试用',
},
{
label: '准备购买',
value: '准备购买',
key: '准备购买',
},
{
label: '准备付款',
value: '准备付款',
key: '准备付款',
},
{
label: '已经购买',
value: '已经购买',
key: '已经购买',
},
{
label: '暂时闲置',
value: '暂时闲置',
key: '暂时闲置',
},
],
},
colProps: { span: 3 },
},
{
field: 'ProjecName',
label: '',
component: 'Select',
componentProps: {
placeholder: '项目类型',
options: [
{
label: '公共设施配套类',
value: '公共设施配套类',
key: '公共设施配套类',
},
{
label: '基础设施类',
value: '基础设施类',
key: '基础设施类',
},
{
label: '产业载体类',
value: '产业载体类',
key: '产业载体类',
},
{
label: '房地产类',
value: '房地产类',
key: '房地产类',
},
{
label: '存量盘活类',
value: '存量盘活类',
key: '存量盘活类',
},
{
label: '其他类(零星工程)',
value: '其他类(零星工程)',
key: '其他类(零星工程)',
},
],
},
colProps: { span: 3 },
},
];
......@@ -4,7 +4,7 @@
@register="registerDrawer"
showFooter
:title="getTitle"
width="500px"
width="700px"
@ok="handleSubmit"
>
<BasicForm @register="registerForm">
......@@ -15,9 +15,9 @@
<script lang="ts" setup>
import { ref, computed, unref } from 'vue';
import { BasicForm, useForm } from '@/components/Form';
import { formSchema } from './biddingPlan.data';
import { formSchema } from './project.data';
import { BasicDrawer, useDrawerInner } from '@/components/Drawer';
import { addItem, updateItem } from '@/api/project/biddingPlan';
import { addItem, updateItem } from '@/api/project/project';
import { is } from '@/utils/is';
const emit = defineEmits(['success', 'register']);
const isUpdate = ref(true);
......@@ -41,7 +41,7 @@
}
});
const getTitle = computed(() => (!unref(isUpdate) ? '新增项目' : '编辑项目'));
const getTitle = computed(() => (!unref(isUpdate) ? '创建项目' : '编辑项目'));
async function handleSubmit() {
try {
......
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