预约记录关联查询接口说明

功能概述

新增了一个接口,通过业主姓名关联 ownerinfo 表和 appointment 表,筛选出与当前巡逻员相同车场(community)的数据,返回 appointment 表中的记录。

🌟 主要特性

  • 关联查询 : 通过车牌号关联 ownerinfoappointment
  • 权限过滤: 巡逻员只能查看自己负责社区的数据
  • 多维搜索: 支持车牌号、业主姓名、电话号码搜索
  • 分页支持: 支持分页查询,提高性能
  • 数据丰富: 返回预约信息和业主信息的完整数据

📊 接口详情

后端接口

URL : GET /api/violations/appointment-records-by-owner

参数:

复制代码
{
  "keyword": "搜索关键词(车牌号或业主姓名)", // 可选
  "page": 1,                               // 页码,默认1
  "size": 50                              // 每页数量,默认50
}

响应数据:

复制代码
{
  "code": 200,
  "message": "成功",
  "data": [
    {
      "appointmentId": 123,
      "plateNumber": "京A12345",
      "arriveDate": "2025-01-31 10:00:00",
      "leaveDate": "2025-01-31 12:00:00",
      "parkingSpace": "A-001",
      "appointmentStatus": "confirmed",
      "appointmentCreatedAt": "2025-01-30 15:30:00",
      "ownerId": 456,
      "ownerName": "张三",
      "ownerPhone": "13800138000",
      "community": "阳光花园",
      "parkingDuration": 2.0  // 停车时长(小时)
    }
  ]
}

前端 API 调用

复制代码
import { appointmentAnalysisApi } from '@/api/violation-api.js';

// 查询预约记录
const result = await appointmentAnalysisApi.getAppointmentRecordsByOwner({
  keyword: '京A12345',
  page: 1,
  size: 20
});

🔧 实现细节

后端实现

  1. Controller 层 (ViolationsController.java)
    • 新增 getAppointmentRecordsByOwner 接口方法
    • 处理参数验证和异常处理
    • 记录详细的操作日志
  1. Service 层 (ViolationsService.java & ViolationsServiceImpl.java)
    • 实现业务逻辑
    • 权限控制:巡逻员只能查看自己负责社区的数据
    • 数据关联查询和格式化
  1. SQL 查询逻辑

    SELECT DISTINCT
    a.id as appointment_id,
    a.plate_number,
    a.arrive_date,
    a.leave_date,
    a.parking_space,
    a.status as appointment_status,
    a.created_at as appointment_created_at,
    o.id as owner_id,
    o.name as owner_name,
    o.phone as owner_phone,
    o.community,
    TIMESTAMPDIFF(HOUR, a.arrive_date, a.leave_date) as parking_hours
    FROM appointment a
    INNER JOIN ownerinfo o ON a.plate_number = o.plate_number
    WHERE 1=1
    AND o.community = '当前巡逻员小区' -- 🔒 严格的小区权限过滤
    AND (a.community IS NULL OR a.community = '' OR a.community = '当前巡逻员小区') -- 🔒 appointment表小区一致性检查
    AND o.isaudit = '是' -- 🔍 只查询已审核的业主
    AND (
    a.plate_number LIKE '%关键词%'
    OR o.name LIKE '%关键词%'
    OR o.phone LIKE '%关键词%'
    ) -- 🔍 搜索条件
    ORDER BY a.created_at DESC
    LIMIT 50 OFFSET 0; -- 📄 分页

前端实现

  1. API 封装 (violation-api.js)
    • 新增 getAppointmentRecordsByOwner 方法
    • 统一参数处理和错误处理
  1. 测试页面 (appointment-owner-test.vue)
    • 完整的测试界面
    • 搜索功能和分页控制
    • 详细的数据展示和状态反馈

🔐 权限控制

  • 巡逻员权限: 严格限制只能查看自己负责小区的预约记录
  • 其他角色: 可以查看所有小区的预约记录(根据实际需求调整)

🔒 严格的小区权限控制逻辑:

  1. 巡逻员身份验证
    • 从 Token 中解析用户角色
    • 如果是巡逻员,从 patrolinfo 表获取其负责的小区
    • 如果巡逻员没有小区信息,直接返回空结果
  1. 小区数据过滤
    • 在 SQL 查询中强制添加 o.community = '巡逻员小区' 条件
    • 额外检查 appointment 表的小区字段(如果存在)
    • 只查询已审核的业主数据 o.isaudit = '是'
  1. 双重保险机制
    • SQL 级别的小区过滤
    • 业务层的二次过滤确认
    • 确保 100% 的数据都与巡逻员小区一致

📱 使用方式

1. 测试接口

访问测试页面:/pages/test/appointment-owner-test

2. 集成到现有功能

复制代码
// 在违规录入页面中使用
const searchOwnerRecords = async (keyword) => {
  try {
    const records = await appointmentAnalysisApi.getAppointmentRecordsByOwner({
      keyword: keyword,
      page: 1,
      size: 20
    });
    
    // 处理返回的数据
    console.log('预约记录:', records);
  } catch (error) {
    console.error('查询失败:', error);
  }
};
相关推荐
老白干2 小时前
jjwt 0.9.1 在 JDK 11+ 上的两个“坑”与完整解决方案
java·python·log4j
圆山猫8 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
笨鸟先飞,勤能补拙9 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
微学AI9 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
城管不管9 小时前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
IT小白杨9 小时前
从环境制备到自动化工作流:多账号运营的工程化架构拆解
java·经验分享·自动化·安全架构·指纹浏览器
长和信泰光伏储能9 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
豆瓣鸡10 小时前
算法日记 - Day3
java·开发语言·算法
浦信仿真大讲堂10 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
萧瑟余晖10 小时前
Java深入解析篇九之NIO详解
java·网络·nio