diff --git a/src/api/integrated/meetingRoom.ts b/src/api/integrated/meetingRoom.ts index 6b80046..278760f 100644 --- a/src/api/integrated/meetingRoom.ts +++ b/src/api/integrated/meetingRoom.ts @@ -39,3 +39,12 @@ export function putObj(obj?: Object) { }) } +// 获取会议室预约详情页面数据 +export function getBookingDetailPage(roomId: string, date: string) { + return request({ + url: `integrated/meetingRoom/app/booking-detail-page/${roomId}`, + method: 'get', + params: { date } + }) +} + diff --git a/src/api/integrated/meetingStats.ts b/src/api/integrated/meetingStats.ts new file mode 100644 index 0000000..a53743a --- /dev/null +++ b/src/api/integrated/meetingStats.ts @@ -0,0 +1,99 @@ +import request from '/@/utils/request'; + +// 会议室预约统计查询参数 +export interface MeetingStatsQuery { + startDate?: string; // 开始日期,格式:yyyy-MM-dd + endDate?: string; // 结束日期,格式:yyyy-MM-dd + dimension?: string; // 统计维度:dept-按部门统计,assignee-按负责人统计,time-按时间统计 + timeGranularity?: string; // 时间粒度:day-按天,week-按周,month-按月 + deptId?: number; // 部门ID,用于筛选特定部门 + roomId?: number; // 会议室ID,用于筛选特定会议室 +} + +// 总体统计数据 +export interface OverallStats { + totalBookings: number; // 总预约数 + approvedBookings: number; // 审核通过数 + pendingBookings: number; // 审核中数 + rejectedBookings: number; // 审核拒绝数 + cancelledBookings: number; // 已取消数 + approvalRate: number; // 通过率(百分比) + avgDuration: number; // 平均会议时长(分钟) + totalDuration: number; // 总会议时长(分钟) +} + +// 部门统计数据 +export interface DeptStats { + deptId: number; // 部门ID + deptName: string; // 部门名称(通过部门微服务获取) + bookingCount: number; // 预约数量 + approvedCount: number; // 通过数量 + approvalRate: number; // 通过率 + totalDuration: number; // 总会议时长 +} + +// 负责人统计数据 +export interface AssigneeStats { + assigneeName: string; // 负责人姓名 + bookingCount: number; // 预约数量 + approvedCount: number; // 通过数量 + approvalRate: number; // 通过率 + totalDuration: number; // 总会议时长 +} + +// 时间统计数据 +export interface TimeStats { + timeLabel: string; // 时间标签(格式化后的时间显示) + date?: string; // 日期(仅按天统计时有值) + bookingCount: number; // 预约数量 + approvedCount: number; // 通过数量 + totalDuration: number; // 总会议时长 +} + +// 状态统计数据 +export interface StatusStats { + status: string; // 状态码(1-审核中,2-审核通过,3-审核拒绝,4-已取消,5-取消,0-已到访) + statusName: string; // 状态名称 + count: number; // 数量 + percentage: number; // 占比(百分比) +} + +// 会议室统计数据 +export interface RoomStats { + roomId: number; // 会议室ID + roomName: string; // 会议室名称 + bookingCount: number; // 预约数量 + approvedCount: number; // 通过数量 + usageRate: number; // 使用率 + totalDuration: number; // 总会议时长 +} + +// 统计结果数据 +export interface MeetingStatsData { + overallStats: OverallStats; // 总体统计 + deptStats: DeptStats[]; // 部门统计 + assigneeStats: AssigneeStats[]; // 负责人统计 + timeStats: TimeStats[]; // 时间统计 + statusStats: StatusStats[]; // 状态统计 + roomStats: RoomStats[]; // 会议室统计 +} + +// 统计结果响应 +export interface MeetingStatsResponse { + code: number; + msg: string; + data: MeetingStatsData; +} + +/** + * 获取会议室预约统计信息 + * @param params 查询参数 + * @returns 统计结果 + */ +export function getMeetingStats(params?: MeetingStatsQuery): Promise { + return request({ + url: '/integrated/meetingBooking/stats', + method: 'get', + params + }); +} diff --git a/src/api/supermarketerp/profitMarginReport.ts b/src/api/supermarketerp/profitMarginReport.ts index 3c32665..babd8a6 100644 --- a/src/api/supermarketerp/profitMarginReport.ts +++ b/src/api/supermarketerp/profitMarginReport.ts @@ -89,3 +89,5 @@ export function exportProfitMarginReport(params?: object) { }) } + + diff --git a/src/views/integrated/meeting/booking/index.vue b/src/views/integrated/meeting/booking/index.vue index 5f6f7b4..b69191f 100644 --- a/src/views/integrated/meeting/booking/index.vue +++ b/src/views/integrated/meeting/booking/index.vue @@ -46,7 +46,7 @@ - + diff --git a/src/views/integrated/meeting/meetingRoom/bookingDetail.vue b/src/views/integrated/meeting/meetingRoom/bookingDetail.vue new file mode 100644 index 0000000..5d36f89 --- /dev/null +++ b/src/views/integrated/meeting/meetingRoom/bookingDetail.vue @@ -0,0 +1,337 @@ + + + + + diff --git a/src/views/integrated/meeting/meetingRoom/index.vue b/src/views/integrated/meeting/meetingRoom/index.vue index 21c2ea9..99e3b13 100644 --- a/src/views/integrated/meeting/meetingRoom/index.vue +++ b/src/views/integrated/meeting/meetingRoom/index.vue @@ -37,8 +37,11 @@ - + @@ -62,11 +72,17 @@ import { useDict } from '/src/hooks/dict'; // 引入组件 const FormDialog = defineAsyncComponent(() => import('./form.vue')); +const BookingDetail = defineAsyncComponent(() => import('./bookingDetail.vue')); + // 定义查询字典 const { meeting_status } = useDict('meeting_status') // 定义变量内容 const formDialogRef = ref() +// 预约详情相关 +const bookingDetailVisible = ref(false); +const selectedRoomId = ref(''); +const selectedRoomName = ref(''); // 搜索变量 const queryRef = ref() const showSearch = ref(true) @@ -109,6 +125,13 @@ const selectionChangHandle = (objs: { id: string }[]) => { multiple.value = !objs.length; }; +// 查看预约详情 +const viewBookingDetail = (row: any) => { + selectedRoomId.value = row.id; + selectedRoomName.value = row.roomName; + bookingDetailVisible.value = true; +}; + // 删除操作 const handleDelete = async (ids: string[]) => { try { diff --git a/src/views/integrated/meeting/summary/index.vue b/src/views/integrated/meeting/summary/index.vue new file mode 100644 index 0000000..3bbf999 --- /dev/null +++ b/src/views/integrated/meeting/summary/index.vue @@ -0,0 +1,575 @@ + + + + + diff --git a/src/views/supermarketerp/report/jsxs/components/ProductRankingTable.vue b/src/views/supermarketerp/report/jsxs/components/ProductRankingTable.vue index 34f7cd2..438b632 100644 --- a/src/views/supermarketerp/report/jsxs/components/ProductRankingTable.vue +++ b/src/views/supermarketerp/report/jsxs/components/ProductRankingTable.vue @@ -339,3 +339,6 @@ const handleCurrentChange = (page: number) => { + + + diff --git a/src/views/supermarketerp/report/jsxs/components/SalesChart.vue b/src/views/supermarketerp/report/jsxs/components/SalesChart.vue index c33fff7..d004fec 100644 --- a/src/views/supermarketerp/report/jsxs/components/SalesChart.vue +++ b/src/views/supermarketerp/report/jsxs/components/SalesChart.vue @@ -191,3 +191,6 @@ defineExpose({ + + + diff --git a/src/views/supermarketerp/report/jsxs/components/SummaryCard.vue b/src/views/supermarketerp/report/jsxs/components/SummaryCard.vue index c991858..dfc8eb4 100644 --- a/src/views/supermarketerp/report/jsxs/components/SummaryCard.vue +++ b/src/views/supermarketerp/report/jsxs/components/SummaryCard.vue @@ -203,3 +203,6 @@ const trendClass = computed(() => { + + + diff --git a/src/views/supermarketerp/report/jsxs/components/index.ts b/src/views/supermarketerp/report/jsxs/components/index.ts index 5eac805..f5bb8ad 100644 --- a/src/views/supermarketerp/report/jsxs/components/index.ts +++ b/src/views/supermarketerp/report/jsxs/components/index.ts @@ -7,3 +7,6 @@ export { default as SummaryCard } from './SummaryCard.vue'; export { default as ProductRankingTable } from './ProductRankingTable.vue'; + + + diff --git a/src/views/supermarketerp/report/jsxs/constants/index.ts b/src/views/supermarketerp/report/jsxs/constants/index.ts index fcd3482..f604fb2 100644 --- a/src/views/supermarketerp/report/jsxs/constants/index.ts +++ b/src/views/supermarketerp/report/jsxs/constants/index.ts @@ -207,3 +207,6 @@ export const SUCCESS_MESSAGES = { }; + + + diff --git a/src/views/supermarketerp/report/jsxs/index.vue b/src/views/supermarketerp/report/jsxs/index.vue index 452fb9e..4a4b72b 100644 --- a/src/views/supermarketerp/report/jsxs/index.vue +++ b/src/views/supermarketerp/report/jsxs/index.vue @@ -254,7 +254,7 @@ @@ -299,7 +299,7 @@ @@ -415,20 +415,11 @@ - - -