Commit 5826ca23 authored by mengzixuan's avatar mengzixuan

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

parents f6ad7344 ca3994e4
...@@ -11,7 +11,7 @@ VITE_BUILD_COMPRESS = 'gzip' ...@@ -11,7 +11,7 @@ VITE_BUILD_COMPRESS = 'gzip'
# Basic interface address SPA # Basic interface address SPA
VITE_GLOB_API_URL = http://58.223.177.48:8088 VITE_GLOB_API_URL = https://dev.unitj.cn
# File upload address, optional # File upload address, optional
# It can be forwarded by nginx or write the actual address directly # It can be forwarded by nginx or write the actual address directly
......
...@@ -7,7 +7,7 @@ import { ...@@ -7,7 +7,7 @@ import {
import { defHttp } from '@/utils/http/axios'; import { defHttp } from '@/utils/http/axios';
enum Api { enum Api {
GetList = '/pro/tenderManager/list/page', GetList = '/pro/tenderManager/page',
AddProject = '/pro/tenderManager/add', AddProject = '/pro/tenderManager/add',
UpdateProject = '/pro/tenderManager/update', UpdateProject = '/pro/tenderManager/update',
DeleteProject = '/pro/tenderManager/del', DeleteProject = '/pro/tenderManager/del',
...@@ -33,5 +33,8 @@ export const updateItem = (params?: any) => ...@@ -33,5 +33,8 @@ export const updateItem = (params?: any) =>
'Content-Type': 'application/json;charset=UTF-8', 'Content-Type': 'application/json;charset=UTF-8',
}, },
}); });
export const deleteItem = (params?: any) =>
defHttp.delete<ProjectModel>({ url: Api.DeleteProject, params });
export const getItem = (params?: any) => export const getItem = (params?: any) =>
defHttp.get<ListItem[]>({ url: Api.ProjectDetail, params }); defHttp.get<ListItem[]>({ url: Api.ProjectDetail, params });
import { ProjectPageParams, ListGetResultModel, ProjectModel,ListItem } from './model/biddingPlanModel'; import {
ProjectPageParams,
ListGetResultModel,
ProjectModel,
ListItem,
} from './model/biddingPlanModel';
import { defHttp } from '@/utils/http/axios'; import { defHttp } from '@/utils/http/axios';
enum Api { enum Api {
GetList = '/pro/tendePlan/page', GetList = '/pro/tenderPlan/page',
AddProject = '/pro/tendePlan/add', AddProject = '/pro/tenderPlan/add',
UpdateProject = '/pro/tendePlan/update', UpdateProject = '/pro/tenderPlan/update',
DeleteProject = '/pro/tenderPlan/del', DeleteProject = '/pro/tenderPlan/del',
ProjectDetail = '/pro/tendePlan/details', ProjectDetail = '/pro/tenderPlan/details',
} }
export const getListByPage = (params?: ProjectPageParams) => export const getListByPage = (params?: ProjectPageParams) =>
defHttp.post<ListGetResultModel>({ url: Api.GetList, data: params }); defHttp.post<ListGetResultModel>({ url: Api.GetList, data: params });
...@@ -28,5 +33,9 @@ export const updateItem = (params?: any) => ...@@ -28,5 +33,9 @@ export const updateItem = (params?: any) =>
'Content-Type': 'application/json;charset=UTF-8', 'Content-Type': 'application/json;charset=UTF-8',
}, },
}); });
export const deleteItem = (params?: any) =>
defHttp.delete<ProjectModel>({ url: Api.DeleteProject, params });
export const getItem = (params?: any) => export const getItem = (params?: any) =>
defHttp.get<ListItem[]>({ url: Api.ProjectDetail, params }); defHttp.get<ListItem[]>({ url: Api.ProjectDetail, params });
...@@ -23,7 +23,7 @@ export interface ListItem { ...@@ -23,7 +23,7 @@ export interface ListItem {
delFlag?: string | number; delFlag?: string | number;
} }
export interface ProjectModel<T> { export interface ProjectModel {
id?: string | number; id?: string | number;
proNumber?: string | number; proNumber?: string | number;
biddingQuarter?: any; biddingQuarter?: any;
......
...@@ -23,7 +23,7 @@ export interface ListItem { ...@@ -23,7 +23,7 @@ export interface ListItem {
delFlag?: string | number; delFlag?: string | number;
} }
export interface ProjectModel<T> { export interface ProjectModel {
id?: string | number; id?: string | number;
proNumber?: string | number; proNumber?: string | number;
biddingQuarter?: any; biddingQuarter?: any;
......
...@@ -24,6 +24,16 @@ const dashboard: AppRouteModule = { ...@@ -24,6 +24,16 @@ const dashboard: AppRouteModule = {
title: '项目库', title: '项目库',
}, },
}, },
{
path: 'detail',
name: 'project-detail',
component: () => import('@/views/project/detail.vue'),
meta: {
orderNo: 1,
// affix: true,
title: '项目库',
},
},
], ],
}; };
......
...@@ -41,8 +41,9 @@ ...@@ -41,8 +41,9 @@
import { getListByPage, deleteItem } from '@/api/project/biddingManagement'; import { getListByPage, deleteItem } from '@/api/project/biddingManagement';
import { columns, searchFormSchema } from './biddingManagement.data'; import { columns, searchFormSchema } from './biddingManagement.data';
import { useModal } from '@/components/Modal'; import { useModal } from '@/components/Modal';
import { router } from '@/router';
import yearModal from '@/components/yearModal.vue'; import yearModal from '@/components/yearModal.vue';
import { useRouter } from 'vue-router';
const { push } = useRouter();
defineOptions({ name: 'RoleManagement' }); defineOptions({ name: 'RoleManagement' });
const [registerTable, { reload }] = useTable({ const [registerTable, { reload }] = useTable({
...@@ -72,7 +73,7 @@ ...@@ -72,7 +73,7 @@
} }
function handleEdit(record: Recordable, disabled: boolean) { function handleEdit(record: Recordable, disabled: boolean) {
router.push({ push({
path: '/biddingManagement/edit', path: '/biddingManagement/edit',
query: { query: {
id: record.id, id: record.id,
...@@ -88,7 +89,7 @@ ...@@ -88,7 +89,7 @@
function handleNew(e) { function handleNew(e) {
console.log(e); console.log(e);
router.push({ push({
path: '/biddingManagement/edit', path: '/biddingManagement/edit',
query: e, query: e,
}); });
......
...@@ -41,9 +41,9 @@ ...@@ -41,9 +41,9 @@
import { getListByPage, deleteItem } from '@/api/project/biddingPlan'; import { getListByPage, deleteItem } from '@/api/project/biddingPlan';
import { useModal } from '@/components/Modal'; import { useModal } from '@/components/Modal';
import yearModal from '@/components/yearModal.vue'; import yearModal from '@/components/yearModal.vue';
import { router } from '@/router';
import { columns, searchFormSchema } from './biddingPlan.data'; import { columns, searchFormSchema } from './biddingPlan.data';
import { useRouter } from 'vue-router';
const { push } = useRouter();
const [register, { openModal: openModal }] = useModal(); const [register, { openModal: openModal }] = useModal();
const [registerTable, { reload }] = useTable({ const [registerTable, { reload }] = useTable({
api: getListByPage, api: getListByPage,
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
bordered: true, bordered: true,
showIndexColumn: false, showIndexColumn: false,
actionColumn: { actionColumn: {
width: 80, width: 150,
title: '操作', title: '操作',
dataIndex: 'action', dataIndex: 'action',
// slots: { customRender: 'action' }, // slots: { customRender: 'action' },
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
} }
function handleEdit(record: Recordable, disabled: boolean) { function handleEdit(record: Recordable, disabled: boolean) {
router.push({ push({
path: '/biddingManagement/edit', path: '/biddingManagement/edit',
query: { query: {
id: record.id, id: record.id,
...@@ -88,7 +88,7 @@ ...@@ -88,7 +88,7 @@
function handleNew(e) { function handleNew(e) {
console.log(e); console.log(e);
router.push({ push({
path: '/biddingPlan/edit', path: '/biddingPlan/edit',
query: e, query: e,
}); });
......
<template>
<PageWrapper :class="prefixCls">
<PageCard>
<div class="header">
<div class="header-tab">
<img class="header-tab-logo" src="../../assets/images/logo.png" alt="" />
<div class="header-tab-right">
<div class="header-tab-right-title">{{ detail.projectName }}</div>
<div class="header-tab-right-desc">{{ detail.projectName }}</div>
</div>
</div>
<div class="header-body">
<div class="header-body-item">
<div class="header-body-item-title">实施主体</div>
<div class="header-body-item-value">{{ detail.implementingEntity }}</div>
</div>
<div class="header-body-item">
<div class="header-body-item-title">建设模式</div>
<div class="header-body-item-value">{{ detail.constructionMode }}</div>
</div>
<div class="header-body-item">
<div class="header-body-item-title">建设地点</div>
<div class="header-body-item-value">{{ detail.constructionSite }}</div>
</div>
<div class="header-body-item">
<div class="header-body-item-title">项目类型</div>
<div class="header-body-item-value">{{ detail.projectType }}</div>
</div>
<div class="header-body-item">
<div class="header-body-item-title">资金来源</div>
<div class="header-body-item-value">{{ detail.fundingSource }}</div>
</div>
<div class="header-body-item">
<div class="header-body-item-title">建设规模</div>
<div class="header-body-item-value">{{ detail.constructionScale }}</div>
</div>
<div class="header-body-item">
<div class="header-body-item-title">建设目的及项目功能</div>
<div class="header-body-item-value">{{ detail.constructionPurpose }}</div>
</div>
<div class="header-body-item">
<div class="header-body-item-title">更新人/更新时间</div>
<div class="header-body-item-value"
>{{ detail.updateBy || '--' }}/{{ detail.updateTime || '--' }}</div
>
</div>
</div>
<!-- <Descriptions></Descriptions> -->
</div>
</PageCard>
<BasicTable @register="registerTable">
<template #tabSlot>
<Tabs v-model:activeKey="activeKey" @change="reload()">
<template v-for="item in tabList" :key="item.key">
<TabPane :tab="item.tab" />
</template>
</Tabs>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'projectName'">
<Tag color="warning" v-if="record.isReserveProject == 'true'"> 储备 </Tag>
{{ record.projectName }}
</template>
<template v-if="column.key === 'constructionMode'">
<Tag color="processing">
{{ record.constructionMode }}
</Tag>
</template>
<template v-if="column.key === 'action'">
<TableAction
:actions="[
// {
// label: '详情',
// onClick: handleDetail.bind(null, record),
// },
// {
// label: '编辑',
// onClick: handleEdit.bind(null, record, false),
// },
// {
// label: '删除',
// color: 'error',
// popConfirm: {
// title: '是否确认删除',
// placement: 'left',
// confirm: handleDelete.bind(null, record),
// },
// },
]"
/>
</template>
</template>
</BasicTable>
</PageWrapper>
</template>
<script lang="ts" setup>
import { Tabs } from 'ant-design-vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getListByPage, getItem } from '@/api/project/project';
import { columns, searchFormSchema, tabList } from './project.data';
import { ref, onMounted } from 'vue';
import { useRoute } from 'vue-router';
let detail = ref<any>({});
const activeKey = ref('1');
const [registerTable, { reload }] = useTable({
api: getListByPage,
columns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
searchInfo: { tabName: activeKey },
useSearchForm: true,
showTableSetting: false,
bordered: true,
showIndexColumn: false,
actionColumn: {
width: 200,
title: '操作',
dataIndex: 'action',
// slots: { customRender: 'action' },
fixed: undefined,
},
});
onMounted(async () => {
const route = useRoute();
const id = route.query.id; // 获取名为id的参数
let res = await getItem({ id });
console.log(res);
detail.value = res;
console.log(detail.value);
});
</script>
<style lang="less" scoped>
.header {
background-color: #ffffff;
margin: 0 16px;
margin-top: 16px;
height: 208px;
&-tab {
padding: 30px;
display: flex;
justify-content: flex-start;
align-items: center;
&-logo {
border-radius: 100%;
width: 72px;
height: 72px;
margin-right: 10px;
}
&-right {
display: flex;
flex-flow: column;
color: #1c1c1c;
&-title {
font-size: 36px;
}
&-desc {
font-size: 14px;
margin-top: 6px;
}
}
}
&-body {
display: flex;
flex-wrap: wrap;
&-item {
flex: 1;
&-title {
text-align: center;
color: #536387;
font-size: 14px;
}
&-value {
text-align: center;
color: #000000;
margin-top: 16px;
font-size: 12px;
}
}
}
}
</style>
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
:actions="[ :actions="[
{ {
label: '详情', label: '详情',
onClick: handleEdit.bind(null, record, true), onClick: handleDetail.bind(null, record),
}, },
{ {
label: '编辑', label: '编辑',
...@@ -83,6 +83,8 @@ ...@@ -83,6 +83,8 @@
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';
const { push } = useRouter();
const [registerDrawer, { openDrawer }] = useDrawer(); const [registerDrawer, { openDrawer }] = useDrawer();
const prefixCls = 'list-basic'; const prefixCls = 'list-basic';
const [registerTable, { reload }] = useTable({ const [registerTable, { reload }] = useTable({
...@@ -110,7 +112,14 @@ ...@@ -110,7 +112,14 @@
isUpdate: false, isUpdate: false,
}); });
} }
function handleDetail(record: any) {
push({
path: '/project/detail',
query: {
id: record.id,
},
});
}
async function handleEdit(record: Recordable, disabled: boolean) { async function handleEdit(record: Recordable, disabled: boolean) {
// let res = await getItem({ id: record.id }); // let res = await getItem({ id: record.id });
// console.log(res); // console.log(res);
......
...@@ -211,186 +211,119 @@ export const formSchema: FormSchema[] = [ ...@@ -211,186 +211,119 @@ export const formSchema: FormSchema[] = [
]; ];
export const searchFormSchema: FormSchema[] = [ export const searchFormSchema: FormSchema[] = [
{ {
field: 'projectName', field: 'year',
label: '', label: '',
component: 'Input', component: 'DatePicker',
componentProps: { required: true,
placeholder: '输入搜索关键词',
},
colProps: { span: 4 },
},
{
field: 'constructionMode',
component: 'RadioButtonGroup',
colProps: {
span: 6,
},
componentProps: { componentProps: {
options: [ placeholder: '选择填报周期',
{ valueFormat: 'YYYY-MM-dd',
label: '全部项目', format: 'YYYY-MM-dd',
value: undefined, style: {
}, width: '100%',
{
label: '自建',
value: '1自建',
},
{
label: '委托建设',
value: '委托建设',
}, },
{
label: '代理',
value: '代理',
},
{
label: '承建',
value: '承建',
},
],
}, },
colProps: { span: 5 },
}, },
];
export const columns: BasicColumn[] = [
{ {
field: 'isReserveProject', title: '基本信息',
component: 'Switch', dataIndex: 'projectName',
colProps: { width: 180,
span: 2,
},
componentProps: {
checkedValue: 'true',
unCheckedValue: 'false',
},
label: '储备项目',
labelWidth: 70,
}, },
{ {
field: 'ImplementingEntity', title: '实施主体',
label: '', dataIndex: 'implementingEntity',
component: 'Select', width: 180,
componentProps: {
placeholder: '实施主体',
options: [
{
label: '了解产品',
value: '了解产品',
key: '了解产品',
}, },
{ {
label: '正在跟进', title: '建设模式',
value: '正在跟进', dataIndex: 'constructionMode',
key: '正在跟进', width: 200,
}, },
{ {
label: '正在试用', title: '建设地点',
value: '正在试用', dataIndex: 'constructionSite',
key: '正在试用', width: 180,
}, },
{ {
label: '准备购买', title: '项目类型',
value: '准备购买', dataIndex: 'projectType',
key: '准备购买', width: 180,
}, },
{ {
label: '准备付款', title: '资金来源',
value: '准备付款', dataIndex: 'fundingSource',
key: '准备付款', width: 180,
}, },
{ {
label: '已经购买', title: '建设目的及项目功能',
value: '已经购买', dataIndex: 'constructionPurpose',
key: '已经购买', width: 180,
}, },
{ {
label: '暂时闲置', title: '建设规模',
value: '暂时闲置', dataIndex: 'constructionScale',
key: '暂时闲置', width: 180,
},
],
},
colProps: { span: 3 },
}, },
];
export const tabList = [
{ {
field: 'projectType', key: '1',
label: '', tab: '投资计划',
component: 'Select',
componentProps: {
placeholder: '项目类型',
options: [
{
label: '公共设施配套类',
value: '公共设施配套类',
key: '公共设施配套类',
}, },
{ {
label: '基础设施类', key: '2',
value: '基础设施类', tab: '计划完成情况',
key: '基础设施类',
}, },
{ {
label: '产业载体类', key: '3',
value: '产业载体类', tab: '年度资金计划',
key: '产业载体类',
}, },
{ {
label: '房地产类', key: '4',
value: '房地产类', tab: '月度资金计划',
key: '房地产类',
}, },
{ {
label: '存量盘活类', key: '5',
value: '存量盘活类', tab: '已竣工验收项目陈欠资金计划',
key: '存量盘活类',
}, },
{ {
label: '其他类(零星工程)', key: '6',
value: '其他类(零星工程)', tab: '招标计划',
key: '其他类(零星工程)',
}, },
],
},
colProps: { span: 3 },
},
];
export const columns: BasicColumn[] = [
{ {
title: '基本信息', key: '7',
dataIndex: 'projectName', tab: '招标管理',
width: 180,
}, },
{ {
title: '实施主体', key: '8',
dataIndex: 'implementingEntity', tab: '结算管理',
width: 180,
}, },
{ {
title: '建设模式', key: '9',
dataIndex: 'constructionMode', tab: '变更签证管理',
width: 200,
}, },
{ {
title: '建设地点', key: '10',
dataIndex: 'constructionSite', tab: '安全隐患管理',
width: 180,
}, },
{ {
title: '项目类型', key: '11',
dataIndex: 'projectType', tab: '安全教育培训',
width: 180,
}, },
{ {
title: '资金来源', key: '12',
dataIndex: 'fundingSource', tab: '合同管理',
width: 180,
}, },
{ {
title: '建设目的及项目功能', key: '13',
dataIndex: 'constructionPurpose', tab: '附件记录',
width: 180,
}, },
{ {
title: '建设规模', key: '14',
dataIndex: 'constructionScale', tab: '更新记录',
width: 180,
}, },
]; ];
...@@ -18,8 +18,8 @@ export default defineApplicationConfig({ ...@@ -18,8 +18,8 @@ export default defineApplicationConfig({
server: { server: {
proxy: { proxy: {
'/api': { '/api': {
// target: 'https://dev.unitj.cn', target: 'https://dev.unitj.cn',
target: 'http://58.223.177.48:8088', // target: 'http://58.223.177.48:8088',
changeOrigin: true, changeOrigin: true,
// ws: false, // ws: false,
rewrite: (path) => path.replace(new RegExp(`^/api`), ''), rewrite: (path) => path.replace(new RegExp(`^/api`), ''),
......
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