From 194e0faa727e9816028af199635a89a21e562059 Mon Sep 17 00:00:00 2001 From: Zzz1zz Date: Mon, 11 Aug 2025 23:28:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=A1=B9=E7=9B=AE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.js | 1 + src/api/business.ts | 6 +- src/types/business.ts | 19 +- src/types/comm.ts | 2 +- .../project/drawer/project-info-drawer.vue | 46 +++++ .../drawer/project-list-filter-drawer.vue | 187 ++++++++++++++++++ src/views/business/project/index.vue | 75 ++++++- 7 files changed, 324 insertions(+), 12 deletions(-) create mode 100644 src/views/business/project/drawer/project-info-drawer.vue create mode 100644 src/views/business/project/drawer/project-list-filter-drawer.vue diff --git a/.eslintrc.js b/.eslintrc.js index 689122b..e74ce34 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -53,6 +53,7 @@ module.exports = { '@typescript-eslint/no-unused-vars': 1, '@typescript-eslint/no-empty-function': 1, '@typescript-eslint/no-explicit-any': 0, // 改为警告 + 'no-unused-expressions': 'off', 'no-console': process.env.NODE_ENV === 'production' ? 2 : 1, // 生产环境禁用console 'import/extensions': [ 2, diff --git a/src/api/business.ts b/src/api/business.ts index 0e10439..7a070c6 100644 --- a/src/api/business.ts +++ b/src/api/business.ts @@ -5,7 +5,7 @@ import { CreateProjectParam, ProjectDetailRes, } from '@/types/business'; -import { ProjectPaginationParams } from '@/types/comm'; +import { ProjectPaginationParams, CommonCityRes } from '@/types/comm'; import { HttpResponse } from './interceptor'; // import type { RouteRecordNormalized } from 'vue-router'; // import { UserState } from '@/store/modules/user/types'; @@ -42,3 +42,7 @@ export function updateProject( ): Promise { return axios.post('project/updateProject', params); } +// 全部项目的城市列表 +export function getProjectCityList(): Promise { + return axios.get(`project/getCityList`); +} diff --git a/src/types/business.ts b/src/types/business.ts index e26d0e9..2fd5a7d 100644 --- a/src/types/business.ts +++ b/src/types/business.ts @@ -20,6 +20,16 @@ export interface AllProjectsItem { name: string; // 项目名称 buildings: BuildingItem[]; } +export interface RoomItem { + id?: number; + projectId: number; + name: string; + buildingName: string; + rentArea: number; + RentAreaStr: string; + status: number; + statusStr: string; +} export interface ProjectItem extends BaseEntity { systemTenantId?: number; name: string; // 项目名称 @@ -33,6 +43,7 @@ export interface ProjectItem extends BaseEntity { isDelete: DeleteStatus; status: UserStatus; imageUrls: string[]; + signedPutURL: string[]; typeName: string; // 类型名称 district: string; province: string; @@ -44,7 +55,13 @@ export interface ProjectItem extends BaseEntity { rentRate: number; RoomAreaStr: string; // 列表显示的计租面积 RentAreaStr: string; // 列表显示的招商面积 + keepAreaStr?: string; // 列表显示的招商面积 RentRateStr: string; // 列表显示的出租率 + buildings?: BuildingItem[]; // 楼栋数据 + rooms?: RoomItem[]; + roomsNum?: number; + roomsRentNum?: number; + roomsUnRentNum?: number; } export type AllProjectListRes = HttpResponse<{ @@ -95,5 +112,5 @@ export interface ProjectInfo extends BaseEntity { } export type ProjectDetailRes = HttpResponse<{ - project: ProjectInfo; + project: ProjectItem; }>; diff --git a/src/types/comm.ts b/src/types/comm.ts index 0f80590..f526c87 100644 --- a/src/types/comm.ts +++ b/src/types/comm.ts @@ -43,7 +43,7 @@ export interface CommonProvinceItem { code: string; // 编码 } export interface CommonCityItem extends CommonProvinceItem { - ProvinceId: number; // 所属省份id + ProvinceId?: number; // 所属省份id } export interface CommonDistrictItem extends CommonProvinceItem { CityId: number; // 所属城市id diff --git a/src/views/business/project/drawer/project-info-drawer.vue b/src/views/business/project/drawer/project-info-drawer.vue new file mode 100644 index 0000000..c567313 --- /dev/null +++ b/src/views/business/project/drawer/project-info-drawer.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/src/views/business/project/drawer/project-list-filter-drawer.vue b/src/views/business/project/drawer/project-list-filter-drawer.vue new file mode 100644 index 0000000..c2e0b15 --- /dev/null +++ b/src/views/business/project/drawer/project-list-filter-drawer.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/src/views/business/project/index.vue b/src/views/business/project/index.vue index b041589..55c9e84 100644 --- a/src/views/business/project/index.vue +++ b/src/views/business/project/index.vue @@ -13,7 +13,7 @@ :placeholder="t('please.enter', { placeholder: t('content') })" @search="handleSearch" /> - + @@ -60,14 +60,30 @@ @@ -76,6 +92,16 @@ v-model:visible="showDrawer" :is-edit="isEdit" :record="currentProjectInfo" + @submitted="getProjectListData" + /> + + @@ -86,17 +112,23 @@ import { useI18n } from 'vue-i18n'; import type { TableColumnData } from '@arco-design/web-vue'; import useDataTable from '@/composables/useDataTable'; - import { ProjectItem, ProjectInfo } from '@/types/business'; + import { ProjectItem } from '@/types/business'; import { getProjectList, getProjectDetail } from '@/api/business'; import { ProjectPaginationParams, ProjectType } from '@/types/comm'; import projectFormDrawer from './drawer/project-form-drawer.vue'; + import projectInfoDrawer from './drawer/project-info-drawer.vue'; + import projectListFilterDrawer from './drawer/project-list-filter-drawer.vue'; const { t } = useI18n(); const { loading } = useLoading(false); const showDrawer = ref(false); + const showProjectInfoDrawer = ref(false); + const showListFilterDrawer = ref(false); + const currentProjectId = ref(null); const isLoadingEdit = ref(false); + const isLoadingDetail = ref(false); const isEdit = ref(false); - const currentProjectInfo = ref(null); + const currentProjectInfo = ref(null); const projectList = ref([]); const { data: renderData, @@ -152,15 +184,33 @@ } setLoading(false); }; - const getProjectDetailData = async (id: number) => { - isLoadingEdit.value = true; + const getProjectDetailData = async (id: number, edit: boolean) => { + if (currentProjectInfo.value && currentProjectInfo.value?.id === id) return; + edit ? (isLoadingEdit.value = true) : (isLoadingDetail.value = true); const { code, data } = await getProjectDetail(id); if (code === 200 && data) { currentProjectInfo.value = data.project; } isLoadingEdit.value = false; + isLoadingDetail.value = false; + }; + const handleWatchHouse = async (id: number) => { + try { + console.log(id, 'is id'); + } catch (error) { + // 处理错误 + } + }; + const handleFilterConfirm = ({ typeIds, cityIds, rentRate }) => { + queryParams.value.type = typeIds; + queryParams.value.province_ids = cityIds; + queryParams.value.rent_rate_min = rentRate[0]; + queryParams.value.rent_rate_max = rentRate[1]; + getProjectListData(); + }; + const handleDel = (id: number) => { + console.log(id, 'iiii'); }; - // 分页事件处理 const onPageChange = (page: number) => { setCurrent(page); @@ -177,12 +227,19 @@ }; const handleEditProject = async (id: number) => { isEdit.value = true; - await getProjectDetailData(id); + await getProjectDetailData(id, true); showDrawer.value = true; }; + const handleDetail = async (id: number) => { + await getProjectDetailData(id, false); + showProjectInfoDrawer.value = true; + }; const handleSearch = () => { getProjectListData(); }; + const handleFilter = () => { + showListFilterDrawer.value = true; + }; const getProjectTypeColor = (type: ProjectType) => { const typeMap = { 1: 'green', 2: 'red', 3: 'orange' }; return typeMap[type];