openapi: 3.1.0
info:
  title: BAI PocketBase Manage API
  description: |
    基于 PocketBase `bai_api_pb_hooks` 的对外接口文档，可直接导入 Postman。
    当前 `tbl_auth_users.openid` 已被定义为全平台统一身份锚点：
    - 微信用户：`openid = 微信 openid`
    - 平台用户：`openid = 服务端生成的 GUID`
    请在 Apifox 环境中统一设置全局 Header：`Authorization: Bearer {{token}}`。
  version: 1.0.0-manage
  license:
    name: Proprietary
    identifier: LicenseRef-Proprietary
servers:
  - url: https://bai-api.blv-oa.com
    description: "生产环境"
  - url: http://localhost:8090
    description: "PocketBase 本地环境"
tags:
  - name: 系统
    description: "基础检查接口"
  - name: 平台认证
    description: "面向平台用户的认证接口；平台用户会生成 GUID 并写入统一 `openid` 字段。"
  - name: 字典管理
    description: "字典读接口公开；字典写接口面向 ManagePlatform 用户。"
  - name: 附件管理
    description: "面向 ManagePlatform 用户的附件上传、查询与删除接口。"
  - name: 文档管理
    description: "面向 ManagePlatform 用户的文档新增、查询、修改、删除接口；查询时会自动返回关联附件的 PocketBase 文件流链接。"
  - name: 文档历史
    description: "面向 ManagePlatform 用户的文档操作历史查询接口。"
components:
  schemas:
    ApiResponse:
      type: object
      required: [statusCode, errMsg, data]
      properties:
        statusCode:
          type: integer
          description: "业务状态码"
          example: 200
        errMsg:
          type: string
          description: "业务提示信息"
          example: 操作成功
        data:
          description: "业务响应数据"
          type: object
          additionalProperties: true
    HealthData:
      type: object
      properties:
        status:
          type: string
          example: healthy
        version:
          type: string
          description: "当前已部署 hooks 版本号，用于确认发布是否生效"
          example: 2026.03.26-health-probe.1
        timestamp:
          type: string
          format: date-time
    UsersCountData:
      type: object
      properties:
        total_users:
          type: integer
          description: "tbl_auth_users 表中的用户总数"
          example: 128
    HelloWorldData:
      type: object
      properties:
        message:
          type: string
          example: Hello, World!
        timestamp:
          type: string
          format: date-time
        status:
          type: string
          example: success
        build_time:
          type:
            - string
            - 'null'
          format: date-time
    CompanyInfo:
      anyOf:
        - type: object
          description: 用户所属公司信息；当用户尚未绑定公司时返回 `null`
          properties:
            pb_id:
              type: string
              description: PocketBase 记录主键 id
            company_id:
              type: string
              description: 公司业务 id，由数据库自动生成
            company_name:
              type: string
              description: 公司名称
            company_type:
              type: string
              description: 公司类型
            company_entity:
              type: string
              description: 公司法人
            company_usci:
              type: string
              description: 统一社会信用代码
            company_nationality:
              type: string
              description: 国家名称
            company_nationality_code:
              type: string
              description: 国家编码
            company_province:
              type: string
              description: 省份名称
            company_province_code:
              type: string
              description: 省份编码
            company_city:
              type: string
              description: 城市名称
            company_city_code:
              type: string
              description: 城市编码
            company_district:
              type: string
              description: 区/县名称
            company_district_code:
              type: string
              description: 区/县编码
            company_postalcode:
              type: string
              description: 邮政编码
            company_add:
              type: string
              description: 公司地址
            company_status:
              type: string
              description: 公司状态
            company_level:
              type: string
              description: 公司等级
            company_owner_openid:
              type: string
              description: 公司所有者 openid
            company_remark:
              type: string
              description: 备注
            created:
              type: string
              description: 记录创建时间
            updated:
              type: string
              description: 记录更新时间
          example:
            pb_id: PocketBase记录主键id | string
            company_id: 公司业务id，由数据库自动生成 | string
            company_name: 公司名称 | string
            company_type: 公司类型 | string
            company_entity: 公司法人 | string
            company_usci: 统一社会信用代码 | string
            company_nationality: 国家名称 | string
            company_nationality_code: 国家编码 | string
            company_province: 省份名称 | string
            company_province_code: 省份编码 | string
            company_city: 城市名称 | string
            company_city_code: 城市编码 | string
            company_district: 区县名称 | string
            company_district_code: 区县编码 | string
            company_postalcode: 邮政编码 | string
            company_add: 公司地址 | string
            company_status: 公司状态 | string
            company_level: 公司等级 | string
            company_owner_openid: 公司所有者openid | string
            company_remark: 备注 | string
            created: 记录创建时间 | string
            updated: 记录更新时间 | string
        - type: 'null'
    UserInfo:
      type: object
      description: |
        统一用户视图。
        其中 `openid` 为全平台统一身份标识：微信用户使用微信 openid，平台用户使用服务端生成 GUID。
      properties:
        pb_id:
          description: "PocketBase 记录主键 id"
          type: string
        users_convers_id:
          description: "会话侧用户 ID"
          type: string
        users_id:
          description: "用户业务 ID"
          type: string
        users_idtype:
          description: "用户身份来源类型"
          anyOf:
            - type: string
              enum: [WeChat, ManagePlatform]
            - type: string
        users_id_number:
          description: "证件号"
          type: string
        users_status:
          description: "用户状态"
          type: string
        users_rank_level:
          description: "用户星级数值"
          type: [number, string]
        users_auth_type:
          description: "账户类型"
          type: [number, string]
        users_type:
          description: "用户类型"
          anyOf:
            - type: string
              enum: [游客, 注册用户]
            - type: string
        users_name:
          description: "用户姓名 / 昵称"
          type: string
        users_phone:
          description: "手机号"
          type: string
        users_phone_masked:
          type: string
        users_level:
          type: string
          description: "用户等级"
        users_tag:
          type: string
          description: "用户标签"
        users_picture:
          type: string
          description: "用户头像附件的 `attachments_id`"
        users_picture_url:
          type: string
          description: "根据 `users_picture -> tbl_attachments` 自动解析出的头像文件流链接"
        users_id_pic_a:
          type: string
          description: "证件正面附件的 `attachments_id`"
        users_id_pic_a_url:
          type: string
          description: "根据 `users_id_pic_a -> tbl_attachments` 自动解析出的文件流链接"
        users_id_pic_b:
          type: string
          description: "证件反面附件的 `attachments_id`"
        users_id_pic_b_url:
          type: string
          description: "根据 `users_id_pic_b -> tbl_attachments` 自动解析出的文件流链接"
        users_title_picture:
          type: string
          description: "资质附件的 `attachments_id`"
        users_title_picture_url:
          type: string
          description: "根据 `users_title_picture -> tbl_attachments` 自动解析出的文件流链接"
        openid:
          type: string
          description: "全平台统一身份标识；微信用户为微信 openid，平台用户为服务端生成的 GUID"
        company_id:
          type: string
          description: "公司业务 id，存储 `tbl_company.company_id`"
        users_parent_id:
          type: string
          description: "上级用户业务 id"
        users_promo_code:
          type: string
          description: "推广码"
        usergroups_id:
          type: string
          description: "用户组业务 id"
        company:
          $ref: '#/components/schemas/CompanyInfo'
        created:
          type: string
          description: "用户创建时间"
        updated:
          type: string
          description: "用户更新时间"
      example:
        pb_id: PocketBase记录主键id | string
        users_convers_id: 会话侧用户ID | string
        users_id: 用户业务ID | string
        users_idtype: 用户身份来源类型 | string
        users_id_number: 证件号 | string
        users_type: 用户类型 | string
        users_name: 用户姓名或昵称 | string
        users_status: 用户状态 | string
        users_rank_level: 用户星级数值 | number
        users_auth_type: 账户类型 | number
        users_phone: 手机号 | string
        users_phone_masked: 手机号脱敏值 | string
        users_level: 用户等级 | string
        users_tag: 用户标签 | string
        users_picture: 用户头像附件ID | string
        users_picture_url: 用户头像文件流链接 | string
        users_id_pic_a: 证件正面附件ID | string
        users_id_pic_a_url: 证件正面文件流链接 | string
        users_id_pic_b: 证件反面附件ID | string
        users_id_pic_b_url: 证件反面文件流链接 | string
        users_title_picture: 资质附件ID | string
        users_title_picture_url: 资质附件文件流链接 | string
        openid: 全平台统一身份标识 | string
        company_id: 公司业务id | string
        users_parent_id: 上级用户业务id | string
        users_promo_code: 推广码 | string
        usergroups_id: 用户组业务id | string
        company:
          pb_id: PocketBase记录主键id | string
          company_id: 公司业务id，由数据库自动生成 | string
          company_name: 公司名称 | string
          company_type: 公司类型 | string
          company_entity: 公司法人 | string
          company_usci: 统一社会信用代码 | string
          company_nationality: 国家名称 | string
          company_nationality_code: 国家编码 | string
          company_province: 省份名称 | string
          company_province_code: 省份编码 | string
          company_city: 城市名称 | string
          company_city_code: 城市编码 | string
          company_district: 区县名称 | string
          company_district_code: 区县编码 | string
          company_postalcode: 邮政编码 | string
          company_add: 公司地址 | string
          company_status: 公司状态 | string
          company_level: 公司等级 | string
          company_owner_openid: 公司所有者openid | string
          company_remark: 备注 | string
          created: 记录创建时间 | string
          updated: 记录更新时间 | string
        created: 用户创建时间 | string
        updated: 用户更新时间 | string
    PocketBaseAuthResponse:
      type: object
      description: |
        项目统一认证响应。
        所有对外接口统一返回 `statusCode`、`errMsg`、`data`，认证成功时额外返回顶层 `token`。
      properties:
        statusCode:
          type: integer
          description: "业务状态码"
          example: 200
        errMsg:
          type: string
          description: "业务提示信息"
          example: 登录成功
        data:
          description: "业务响应数据"
          type: object
          properties:
            status:
              anyOf:
                - type: string
                  enum: [register_success, login_success]
                - type: string
            is_info_complete:
              type: [boolean, string]
            user:
              $ref: '#/components/schemas/UserInfo'
        token:
          type: string
          description: "PocketBase 原生 auth token；仅认证类接口在成功时额外返回"
      example:
        statusCode: 200
        errMsg: 登录成功
        data:
          status: 登录或注册状态 | string
          is_info_complete: 资料是否完整 | boolean
          user:
            pb_id: PocketBase记录主键id | string
            users_id: 用户业务ID | string
            users_idtype: 用户身份来源类型 | string
            users_name: 用户姓名或昵称 | string
            users_phone: 手机号 | string
            users_phone_masked: 手机号脱敏值 | string
            users_status: 用户状态 | string
            users_rank_level: 用户星级数值 | number
            users_auth_type: 账户类型 | number
            users_type: 用户类型 | string
            users_picture: 用户头像附件ID | string
            users_picture_url: 用户头像文件流链接 | string
            users_id_pic_a: 证件正面附件ID | string
            users_id_pic_a_url: 证件正面文件流链接 | string
            users_id_pic_b: 证件反面附件ID | string
            users_id_pic_b_url: 证件反面文件流链接 | string
            users_title_picture: 资质附件ID | string
            users_title_picture_url: 资质附件文件流链接 | string
            openid: 全平台统一身份标识 | string
            company_id: 公司业务id | string
            users_parent_id: 上级用户业务id | string
            users_promo_code: 推广码 | string
            usergroups_id: 用户组业务id | string
            company:
              pb_id: PocketBase记录主键id | string
              company_id: 公司业务id，由数据库自动生成 | string
              company_name: 公司名称 | string
              company_type: 公司类型 | string
              company_entity: 公司法人 | string
              company_usci: 统一社会信用代码 | string
              company_nationality: 国家名称 | string
              company_nationality_code: 国家编码 | string
              company_province: 省份名称 | string
              company_province_code: 省份编码 | string
              company_city: 城市名称 | string
              company_city_code: 城市编码 | string
              company_district: 区县名称 | string
              company_district_code: 区县编码 | string
              company_postalcode: 邮政编码 | string
              company_add: 公司地址 | string
              company_status: 公司状态 | string
              company_level: 公司等级 | string
              company_owner_openid: 公司所有者openid | string
              company_remark: 备注 | string
              created: 记录创建时间 | string
              updated: 记录更新时间 | string
            created: 用户创建时间 | string
            updated: 用户更新时间 | string
        token: PocketBase原生认证token | string
    WechatLoginRequest:
      type: object
      required: [users_wx_code]
      description: "微信小程序登录/注册请求体。"
      properties:
        users_wx_code:
          type: string
          description: "微信小程序登录临时凭证 code"
          example: 0a1b2c3d4e5f6g
    WechatProfileRequest:
      type: object
      description: "微信用户资料完善请求体。"
      properties:
        users_name:
          type: string
          description: "用户姓名 / 昵称"
          example: 张三
        users_phone_code:
          type: string
          description: "可选。若传入，服务端优先通过微信接口换取真实手机号并写入数据库"
          example: 2b7d9f2e3c4a5b6d7e8f
        users_phone:
          type: string
          description: "可选。未传 `users_phone_code` 时，可直接写入手机号"
          example: '13800138000'
        users_type:
          type: string
          description: "可选。用户类型；仅在传入非空值时更新"
          example: 服务商
        company_id:
          type: string
          description: "可选。公司业务 id；仅在传入非空值时更新"
          example: WX-COMPANY-10001
        users_tag:
          type: string
          description: "可选。用户标签；非空时才更新"
          example: 核心客户
        users_picture:
          type: string
          description: "可选。用户头像附件的 `attachments_id`"
          example: ATT-1743123456789-abc123
        users_id_pic_a:
          type: string
          description: "可选。证件正面附件的 `attachments_id`"
        users_id_pic_b:
          type: string
          description: "可选。证件反面附件的 `attachments_id`"
        users_title_picture:
          type: string
          description: "可选。资质附件的 `attachments_id`"
    WechatProfileResponseData:
      type: object
      properties:
        status:
          type: string
          enum: [update_success]
        user:
          $ref: '#/components/schemas/UserInfo'
    PlatformRegisterRequest:
      type: object
      required: [users_name, users_phone, password, passwordConfirm, users_picture]
      description: "平台用户注册请求体；注册成功后将生成 GUID 并写入统一 `openid` 字段。"
      properties:
        users_name:
          type: string
          description: "用户姓名 / 昵称"
          example: 张三
        users_phone:
          type: string
          description: "手机号"
          example: 13800138000
        password:
          type: string
          description: "PocketBase 认证密码"
          example: 12345678
        passwordConfirm:
          type: string
          example: 12345678
        users_picture:
          type: string
          description: "用户头像附件的 `attachments_id`"
          example: ATT-1743123456789-abc123
        users_id_number:
          description: "证件号"
          type: string
        users_id_pic_a:
          type: string
          description: "可选。证件正面附件的 `attachments_id`"
        users_id_pic_b:
          type: string
          description: "可选。证件反面附件的 `attachments_id`"
        users_title_picture:
          type: string
          description: "可选。资质附件的 `attachments_id`"
        users_level:
          description: "用户等级文本"
          type: string
        users_tag:
          description: "用户标签"
          type: string
        users_type:
          description: "用户类型"
          type: string
        company_id:
          description: "所属公司业务 ID"
          type: string
        users_parent_id:
          description: "上级用户业务 ID"
          type: string
        users_promo_code:
          description: "推广码"
          type: string
        usergroups_id:
          description: "用户组 / 角色 ID"
          type: string
    PlatformLoginRequest:
      type: object
      required: [login_account, password]
      description: "平台用户登录请求体；前端使用邮箱或手机号 + 密码提交，服务端内部转换为 PocketBase 原生 password auth。"
      properties:
        login_account:
          type: string
          description: "支持邮箱或手机号"
          example: admin@example.com
        password:
          type: string
          description: "PocketBase 认证密码"
          example: 12345678
    SystemRefreshTokenRequest:
      type: object
      description: |
        系统刷新 token 请求体。
        `users_wx_code` 允许为空。
        当 `Authorization` 对应 token 有效时，可不传或传空；
        当 token 失效时，需提供 `users_wx_code` 走微信 code 重新签发流程。
      properties:
        users_wx_code:
          type:
            - string
            - 'null'
          description: "微信小程序登录临时凭证 code"
          example: 0a1b2c3d4e5f6g
    RefreshTokenData:
      type: object
      properties: {}
    DictionaryItem:
      type: object
      required: [enum, description, sortOrder]
      properties:
        enum:
          type: string
          example: enabled
        description:
          type: string
          example: 启用
        image:
          type: string
          description: "对应图片附件的 `attachments_id`，允许为空"
          example: ATT-1743037200000-abc123
        imageUrl:
          type: string
          description: "根据 `image -> tbl_attachments` 自动解析出的图片文件流链接"
        imageAttachment:
          anyOf:
            - $ref: '#/components/schemas/AttachmentRecord'
            - type: 'null'
        sortOrder:
          type: [integer, string]
          example: 1
      example:
        enum: 枚举值 | string
        description: 枚举描述 | string
        image: 图片附件ID | string
        imageUrl: 图片文件流链接 | string
        imageAttachment:
          attachments_id: 附件业务ID | string
          attachments_filename: 原始文件名 | string
        sortOrder: 排序值 | integer
    DictionaryRecord:
      type: object
      properties:
        pb_id:
          description: "PocketBase 记录主键 id"
          type: string
        system_dict_id:
          description: "字典业务 ID"
          type: string
        dict_name:
          description: "字典名称，当前按全局唯一维护"
          type: string
        dict_word_is_enabled:
          description: "字典是否启用"
          type: [boolean, string]
        dict_word_parent_id:
          description: "父级字典业务 ID"
          type: string
        dict_word_remark:
          description: "备注"
          type: string
        items:
          type: array
          items:
            $ref: '#/components/schemas/DictionaryItem'
        created:
          description: "记录创建时间"
          type: string
        updated:
          description: "记录更新时间"
          type: string
      example:
        pb_id: PocketBase记录主键id | string
        system_dict_id: 字典业务ID | string
        dict_name: 字典名称 | string
        dict_word_is_enabled: 字典是否启用 | boolean
        dict_word_parent_id: 父级字典业务ID | string
        dict_word_remark: 备注 | string
        items:
          - enum: UT1
            description: 枚举描述 | string
            image: 图片附件ID | string
            imageUrl: 图片文件流链接 | string
            sortOrder: 排序值 | integer
        created: 记录创建时间 | string
        updated: 记录更新时间 | string
    DictionaryListRequest:
      type: object
      properties:
        keyword:
          type: string
          description: "对 `dict_name` 的模糊搜索关键字"
          example: 状态
    DictionaryDetailRequest:
      type: object
      required: [dict_name]
      properties:
        dict_name:
          type: string
          description: "字典名称，当前按全局唯一维护"
          example: 用户状态
    DictionaryMutationRequest:
      type: object
      required: [dict_name, items]
      properties:
        original_dict_name:
          type: string
          description: "更新时用于定位原始记录；新增时可不传"
          example: 用户状态
        dict_name:
          type: string
          description: "字典名称，当前按全局唯一维护"
          example: 用户状态
        dict_word_is_enabled:
          type: boolean
          description: "字典是否启用"
          example: true
        dict_word_parent_id:
          type: string
          description: "父级字典业务 ID"
          example: ''
        dict_word_remark:
          type: string
          description: "备注"
          example: 系统状态字典
        items:
          type: array
          minItems: 1
          description: "每项会分别序列化写入 `dict_word_enum`、`dict_word_description`、`dict_word_image`、`dict_word_sort_order`"
          items:
            $ref: '#/components/schemas/DictionaryItem'
    DictionaryDeleteRequest:
      type: object
      required: [dict_name]
      properties:
        dict_name:
          type: string
          description: "字典名称，当前按全局唯一维护"
          example: 用户状态
    AttachmentRecord:
      type: object
      properties:
        pb_id:
          description: "PocketBase 记录主键 id"
          type: string
        attachments_id:
          description: "附件业务 ID"
          type: string
        attachments_link:
          type: string
          description: "PocketBase 实际存储的文件名"
        attachments_url:
          type: string
          description: "附件文件流访问链接"
        attachments_download_url:
          type: string
          description: "附件下载链接"
        attachments_filename:
          description: "原始文件名"
          type: string
        attachments_filetype:
          description: "文件类型 / MIME"
          type: string
        attachments_size:
          description: "文件大小"
          type: [number, string]
        attachments_owner:
          description: "上传者业务标识"
          type: string
        attachments_md5:
          description: "文件 MD5"
          type: string
        attachments_ocr:
          description: "OCR 识别结果"
          type: string
        attachments_status:
          description: "附件状态"
          type: string
        attachments_remark:
          description: "备注"
          type: string
        created:
          description: "记录创建时间"
          type: string
        updated:
          description: "记录更新时间"
          type: string
      example:
        pb_id: PocketBase记录主键id | string
        attachments_id: 附件业务ID | string
        attachments_link: PocketBase实际存储文件名 | string
        attachments_url: 附件文件流访问链接 | string
        attachments_download_url: 附件下载链接 | string
        attachments_filename: 原始文件名 | string
        attachments_filetype: 文件类型或MIME | string
        attachments_size: 文件大小 | number
        attachments_owner: 上传者业务标识 | string
        attachments_md5: 文件MD5 | string
        attachments_ocr: OCR识别结果 | string
        attachments_status: 附件状态 | string
        attachments_remark: 备注 | string
        created: 记录创建时间 | string
        updated: 记录更新时间 | string
    AttachmentListRequest:
      type: object
      properties:
        keyword:
          type: string
          description: "对 `attachments_id`、`attachments_filename` 的模糊搜索关键字"
          example: 手册
        status:
          type: string
          description: "按附件状态过滤"
          example: active
    AttachmentDetailRequest:
      type: object
      required: [attachments_id]
      properties:
        attachments_id:
          type: string
          description: "附件业务 ID"
          example: ATT-1743037200000-abc123
    AttachmentUploadRequest:
      type: object
      required: [attachments_link]
      properties:
        attachments_link:
          type: string
          format: binary
          description: "要上传到 `tbl_attachments` 的单个文件"
        attachments_filename:
          type: string
          description: "原始文件名；不传时可由前端直接使用文件名"
        attachments_filetype:
          type: string
          description: "文件 MIME 类型"
        attachments_size:
          type: number
          description: "文件大小"
        attachments_md5:
          description: "文件 MD5"
          type: string
        attachments_ocr:
          description: "OCR 识别结果"
          type: string
        attachments_status:
          type: string
          description: "附件状态"
          example: active
        attachments_remark:
          description: "备注"
          type: string
    DocumentRecord:
      type: object
      properties:
        pb_id:
          description: "PocketBase 记录主键 id"
          type: string
        document_id:
          description: "文档业务 ID"
          type: string
        document_create:
          type: string
          description: "文档创建时间，由数据库自动生成"
        document_effect_date:
          description: "文档生效日期"
          type: string
        document_expiry_date:
          description: "文档到期日期"
          type: string
        document_type:
          type: string
          description: "多选时按 `system_dict_id@dict_word_enum|...` 保存"
        document_title:
          description: "文档标题"
          type: string
        document_subtitle:
          description: "文档副标题"
          type: string
        document_summary:
          description: "文档摘要"
          type: string
        document_content:
          description: "正文内容，保存 Markdown"
          type: string
        document_image:
          type: string
          description: "关联多个 `attachments_id`，底层使用 `|` 分隔保存"
        document_image_ids:
          type: array
          description: "`document_image` 解析后的附件 id 列表"
          items:
            type: string
        document_image_urls:
          type: array
          description: "根据 `document_image -> tbl_attachments` 自动解析出的图片文件流链接列表"
          items:
            type: string
        document_image_url:
          type: string
          description: "兼容字段，返回第一张图片的文件流链接"
        document_image_attachments:
          type: array
          items:
            $ref: '#/components/schemas/AttachmentRecord'
        document_image_attachment:
          anyOf:
            - $ref: '#/components/schemas/AttachmentRecord'
            - type: 'null'
        document_video:
          type: string
          description: "关联多个 `attachments_id`，底层使用 `|` 分隔保存"
        document_video_ids:
          type: array
          description: "`document_video` 解析后的附件 id 列表"
          items:
            type: string
        document_video_urls:
          type: array
          description: "根据 `document_video -> tbl_attachments` 自动解析出的视频文件流链接列表"
          items:
            type: string
        document_video_url:
          type: string
          description: "兼容字段，返回第一个视频的文件流链接"
        document_video_attachments:
          type: array
          items:
            $ref: '#/components/schemas/AttachmentRecord'
        document_video_attachment:
          anyOf:
            - $ref: '#/components/schemas/AttachmentRecord'
            - type: 'null'
        document_file:
          type: string
          description: "关联多个 `attachments_id`，底层使用 `|` 分隔保存"
        document_file_ids:
          type: array
          description: "`document_file` 解析后的附件 id 列表"
          items:
            type: string
        document_file_urls:
          type: array
          description: "根据 `document_file -> tbl_attachments` 自动解析出的文件流链接列表"
          items:
            type: string
        document_file_url:
          type: string
          description: "兼容字段，返回第一个文件的文件流链接"
        document_file_attachments:
          type: array
          items:
            $ref: '#/components/schemas/AttachmentRecord'
        document_file_attachment:
          anyOf:
            - $ref: '#/components/schemas/AttachmentRecord'
            - type: 'null'
        document_owner:
          type: string
          description: "上传者 openid"
        document_relation_model:
          description: "关联机型 / 模型标识"
          type: string
        document_keywords:
          type: string
          description: "固定字典多选字段，使用 `|` 分隔"
        document_share_count:
          description: "分享次数"
          type: [number, string]
        document_download_count:
          description: "下载次数"
          type: [number, string]
        document_favorite_count:
          description: "收藏次数"
          type: [number, string]
        document_status:
          type: string
          description: "文档状态，仅允许 `有效` 或 `过期`，由系统根据生效日期和到期日期自动计算；当两者都为空时默认 `有效`"
        document_embedding_status:
          description: "文档嵌入状态"
          type: string
        document_embedding_error:
          description: "文档嵌入错误原因"
          type: string
        document_embedding_lasttime:
          description: "最后一次嵌入更新时间"
          type: string
        document_vector_version:
          description: "向量版本号 / 模型名称"
          type: string
        document_product_categories:
          type: string
          description: "固定字典多选字段，使用 `|` 分隔"
        document_application_scenarios:
          type: string
          description: "固定字典多选字段，使用 `|` 分隔"
        document_hotel_type:
          type: string
          description: "固定字典多选字段，使用 `|` 分隔"
        document_remark:
          description: "备注"
          type: string
        created:
          description: "记录创建时间"
          type: string
        updated:
          description: "记录更新时间"
          type: string
      example:
        pb_id: PocketBase记录主键id | string
        document_id: 文档业务ID | string
        document_create: 文档创建时间，由数据库自动生成 | string
        document_effect_date: 文档生效日期 | string
        document_expiry_date: 文档到期日期 | string
        document_type: 文档类型，按system_dict_id@dict_word_enum保存 | string
        document_title: 文档标题 | string
        document_subtitle: 文档副标题 | string
        document_summary: 文档摘要 | string
        document_content: 正文内容Markdown | string
        document_image: 图片附件ID列表，使用竖线分隔 | string
        document_image_ids:
          - 图片附件ID | string
        document_image_urls:
          - 图片文件流链接 | string
        document_image_url: 第一张图片文件流链接 | string
        document_video: 视频附件ID列表，使用竖线分隔 | string
        document_video_ids:
          - 视频附件ID | string
        document_video_urls:
          - 视频文件流链接 | string
        document_video_url: 第一个视频文件流链接 | string
        document_file: 文件附件ID列表，使用竖线分隔 | string
        document_file_ids:
          - 文件附件ID | string
        document_file_urls:
          - 文件流链接 | string
        document_file_url: 第一个文件流链接 | string
        document_owner: 上传者openid | string
        document_relation_model: 关联机型或模型标识 | string
        document_keywords: 关键词多选，使用竖线分隔 | string
        document_share_count: 分享次数 | number
        document_download_count: 下载次数 | number
        document_favorite_count: 收藏次数 | number
        document_status: 文档状态 | string
        document_embedding_status: 文档嵌入状态 | string
        document_embedding_error: 文档嵌入错误原因 | string
        document_embedding_lasttime: 最后一次嵌入更新时间 | string
        document_vector_version: 向量版本号或模型名称 | string
        document_product_categories: 产品关联文档多选，使用竖线分隔 | string
        document_application_scenarios: 筛选依据多选，使用竖线分隔 | string
        document_hotel_type: 适用场景多选，使用竖线分隔 | string
        document_remark: 备注 | string
        created: 记录创建时间 | string
        updated: 记录更新时间 | string
    DocumentListRequest:
      type: object
      properties:
        keyword:
          type: string
          description: "对 `document_id`、`document_title`、`document_subtitle`、`document_summary`、`document_keywords` 的模糊搜索关键字"
          example: 安装
        status:
          type: string
          example: active
        document_type:
          type: string
          description: "支持按存储值过滤；多选时格式为 `system_dict_id@dict_word_enum|...`"
          example: 说明书
    DocumentDetailRequest:
      type: object
      required: [document_id]
      properties:
        document_id:
          type: string
          description: "文档业务 ID"
          example: DOC-1743037200000-abc123
    DocumentMutationRequest:
      type: object
      required: [document_title, document_type]
      properties:
        document_id:
          type: string
          description: "创建时可不传，由服务端自动生成；更新时必填"
          example: DOC-1743037200000-abc123
        document_effect_date:
          type: string
          description: "支持 `YYYY-MM-DD` 或 PocketBase 可识别日期时间字符串"
          example: 2026-03-27
        document_expiry_date:
          type: string
          description: "支持 `YYYY-MM-DD` 或 PocketBase 可识别日期时间字符串"
          example: 2027-03-27
        document_type:
          type: string
          description: "必填；前端显示为字典项描述，存库时按 `system_dict_id@dict_word_enum|...` 保存"
        document_title:
          description: "文档标题"
          type: string
        document_subtitle:
          description: "文档副标题"
          type: string
        document_summary:
          description: "文档摘要"
          type: string
        document_content:
          description: "正文内容，保存 Markdown"
          type: string
        document_image:
          oneOf:
            - type: string
              description: "多个图片附件 id 使用 `|` 分隔"
            - type: array
              items:
                type: string
          description: "图片附件 id 列表；支持数组或 `|` 分隔字符串"
        document_video:
          oneOf:
            - type: string
              description: "多个视频附件 id 使用 `|` 分隔"
            - type: array
              items:
                type: string
          description: "视频附件 id 列表；支持数组或 `|` 分隔字符串"
        document_file:
          oneOf:
            - type: string
              description: "多个文件附件 id 使用 `|` 分隔"
            - type: array
              items:
                type: string
          description: "文件附件 id 列表；支持数组或 `|` 分隔字符串"
        document_relation_model:
          description: "关联机型 / 模型标识"
          type: string
        document_keywords:
          type: string
          description: "从 `文档-关键词` 字典多选后使用 `|` 分隔保存"
        document_share_count:
          description: "分享次数"
          type: number
        document_download_count:
          description: "下载次数"
          type: number
        document_favorite_count:
          description: "收藏次数"
          type: number
        document_status:
          type: string
          description: "文档状态，仅允许 `有效` 或 `过期`，由系统根据生效日期和到期日期自动计算；当两者都为空时默认 `有效`"
        document_embedding_status:
          description: "文档嵌入状态"
          type: string
        document_embedding_error:
          description: "文档嵌入错误原因"
          type: string
        document_embedding_lasttime:
          description: "最后一次嵌入更新时间"
          type: string
        document_vector_version:
          description: "向量版本号 / 模型名称"
          type: string
        document_product_categories:
          type: string
          description: "从 `文档-产品关联文档` 字典多选后使用 `|` 分隔保存"
        document_application_scenarios:
          type: string
          description: "从 `文档-筛选依据` 字典多选后使用 `|` 分隔保存"
        document_hotel_type:
          type: string
          description: "从 `文档-适用场景` 字典多选后使用 `|` 分隔保存"
        document_remark:
          description: "备注"
          type: string
    DocumentDeleteRequest:
      type: object
      required: [document_id]
      properties:
        document_id:
          type: string
          description: "文档业务 ID"
          example: DOC-1743037200000-abc123
    DocumentHistoryRecord:
      type: object
      properties:
        pb_id:
          description: "PocketBase 记录主键 id"
          type: string
        doh_id:
          description: "文档操作历史业务 ID"
          type: string
        doh_document_id:
          description: "关联文档业务 ID"
          type: string
        doh_operation_type:
          description: "操作类型"
          type: string
        doh_user_id:
          description: "操作人业务 ID"
          type: string
        doh_current_count:
          description: "本次操作对应次数"
          type: [number, string]
        doh_remark:
          description: "备注"
          type: string
        created:
          description: "记录创建时间"
          type: string
        updated:
          description: "记录更新时间"
          type: string
      example:
        pb_id: PocketBase记录主键id | string
        doh_id: 文档操作历史业务ID | string
        doh_document_id: 关联文档业务ID | string
        doh_operation_type: 操作类型 | string
        doh_user_id: 操作人业务ID | string
        doh_current_count: 本次操作对应次数 | number
        doh_remark: 备注 | string
        created: 记录创建时间 | string
        updated: 记录更新时间 | string
    DocumentHistoryListRequest:
      type: object
      properties:
        document_id:
          type: string
          description: "可选；传入时仅查询指定文档的操作历史"
          example: DOC-1743037200000-abc123
paths:
  /pb/api/system/test-helloworld:
    post:
      tags: [系统]
      summary: HelloWorld 测试接口
      responses:
        '200':
          description: "成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                $ref: '#/components/schemas/HelloWorldData'
  /pb/api/system/health:
    post:
      tags: [系统]
      summary: 健康检查
      responses:
        '200':
          description: "成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                $ref: '#/components/schemas/HealthData'
  /pb/api/system/users-count:
    post:
      tags: [系统]
      summary: 查询用户总数
      description: "统计 `tbl_auth_users` 集合中的记录总数，并返回一个数值。"
      responses:
        '200':
          description: "成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                $ref: '#/components/schemas/UsersCountData'
  /pb/api/platform/register:
    post:
      tags: [平台认证]
      summary: 平台用户注册
      description: |
        创建平台用户 auth record。
        服务端会自动生成 GUID 并写入统一身份字段 `openid`，同时写入 `users_idtype = ManagePlatform`。
        前端以 `users_phone + password/passwordConfirm` 注册，但服务端仍会创建 PocketBase 原生 auth 用户。
        注册成功后直接返回 PocketBase 原生 auth token。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PlatformRegisterRequest'
      responses:
        '200':
          description: "注册成功"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PocketBaseAuthResponse'
        '400':
          description: "参数错误或手机号已存在"
        '500':
          description: "GUID 生成失败、auth identity 缺失或保存用户失败"
        '415':
          description: "请求体必须为 application/json"
        '429':
          description: "重复请求过于频繁"
  /pb/api/platform/login:
    post:
      tags: [平台认证]
      summary: 平台用户登录
      description: |
        前端使用平台注册时保存的 `邮箱或手机号 + password` 登录。
        仅允许 `users_idtype = ManagePlatform` 的用户通过该接口登录。
        服务端会根据 `login_account` 自动判断邮箱或手机号，并定位平台用户，再使用该用户的 PocketBase 原生 identity（当前为 `email`）执行原生 password auth。
        登录成功后直接返回 PocketBase 原生 auth token。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PlatformLoginRequest'
            example:
              login_account: 13509214696
              password: Momo123456
      responses:
        '200':
          description: "登录成功"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PocketBaseAuthResponse'
              example:
                statusCode: 200
                errMsg: 登录成功
                data:
                  status: login_success
                  is_info_complete: false
                  user:
                    pb_id: vtukf6agem2xbcv
                    users_id: ''
                    users_idtype: ManagePlatform
                    users_name: momo
                    users_phone: '13509214696'
                    users_phone_masked: '135****4696'
                    users_status: ''
                    users_rank_level: 0
                    users_auth_type: 0
                    users_type: ''
                    users_picture: ''
                    openid: app_momo
                    company_id: ''
                    users_parent_id: ''
                    users_promo_code: ''
                    usergroups_id: ''
                    company: null
                    created: ''
                    updated: ''
                token: eyJhbGciOi...
        '400':
          description: "参数错误、密码错误或用户类型不匹配"
        '404':
          description: "平台用户不存在"
        '500':
          description: "平台用户缺少原生登录 identity 或服务端内部错误"
        '415':
          description: "请求体必须为 application/json"
        '429':
          description: "重复请求过于频繁"
  /pb/api/dictionary/list:
    post:
      tags: [字典管理]
      summary: 查询字典列表
      description: |
        公开读接口，无需 token。
        支持按 `dict_name` 模糊搜索，返回字典全量信息，并将三个聚合字段组装为 `items`。
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DictionaryListRequest'
      responses:
        '200':
          description: "查询成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                type: object
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/DictionaryRecord'
        '415':
          description: "请求体必须为 application/json"
  /pb/api/dictionary/detail:
    post:
      tags: [字典管理]
      summary: 查询指定字典
      description: |
        公开读接口，无需 token。
        按唯一键 `dict_name` 查询单条字典，并返回组装后的 `items`。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DictionaryDetailRequest'
      responses:
        '200':
          description: "查询成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                $ref: '#/components/schemas/DictionaryRecord'
        '400':
          description: "参数错误"
        '404':
          description: "未找到对应字典"
        '415':
          description: "请求体必须为 application/json"
  /pb/api/dictionary/create:
    post:
      tags: [字典管理]
      summary: 新增字典
      description: |
        仅允许 `ManagePlatform` 用户访问。
        `system_dict_id` 由服务端自动生成；`dict_name` 必须唯一；
        `items` 会分别序列化写入 `dict_word_enum`、`dict_word_description`、`dict_word_image`、`dict_word_sort_order` 四个字段。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DictionaryMutationRequest'
      responses:
        '200':
          description: "新增成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                $ref: '#/components/schemas/DictionaryRecord'
        '400':
          description: "参数错误或 dict_name 已存在"
        '401':
          description: "token 无效或已过期"
        '403':
          description: "非 ManagePlatform 用户无权访问"
        '415':
          description: "请求体必须为 application/json"
        '429':
          description: "重复请求过于频繁"
  /pb/api/dictionary/update:
    post:
      tags: [字典管理]
      summary: 修改字典
      description: |
        仅允许 `ManagePlatform` 用户访问。
        根据 `original_dict_name`（未传时回退为 `dict_name`）定位原记录并更新。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DictionaryMutationRequest'
      responses:
        '200':
          description: "修改成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                $ref: '#/components/schemas/DictionaryRecord'
        '400':
          description: "参数错误或 dict_name 冲突"
        '401':
          description: "token 无效或已过期"
        '403':
          description: "非 ManagePlatform 用户无权访问"
        '404':
          description: "未找到待修改字典"
        '415':
          description: "请求体必须为 application/json"
        '429':
          description: "重复请求过于频繁"
  /pb/api/dictionary/delete:
    post:
      tags: [字典管理]
      summary: 删除字典
      description: |
        仅允许 `ManagePlatform` 用户访问。
        按 `dict_name` 真删除对应记录。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DictionaryDeleteRequest'
      responses:
        '200':
          description: "删除成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                type: object
                properties:
                  dict_name:
                    description: "字典名称，当前按全局唯一维护"
                    type: string
        '400':
          description: "参数错误或删除失败"
        '401':
          description: "token 无效或已过期"
        '403':
          description: "非 ManagePlatform 用户无权访问"
        '404':
          description: "未找到待删除字典"
        '415':
          description: "请求体必须为 application/json"
        '429':
          description: "重复请求过于频繁"
  /pb/api/attachment/list:
    post:
      tags: [附件管理]
      summary: 查询附件列表
      description: |
        仅允许 `ManagePlatform` 用户访问。
        支持按 `attachments_id`、`attachments_filename` 模糊搜索，并可按 `attachments_status` 过滤。
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttachmentListRequest'
      responses:
        '200':
          description: "查询成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                type: object
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/AttachmentRecord'
        '401':
          description: "token 无效或已过期"
        '403':
          description: "非 ManagePlatform 用户无权访问"
        '415':
          description: "请求体必须为 application/json"
  /pb/api/attachment/detail:
    post:
      tags: [附件管理]
      summary: 查询附件详情
      description: |
        仅允许 `ManagePlatform` 用户访问。
        按 `attachments_id` 查询单条附件，并返回 PocketBase 文件流链接与下载链接。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttachmentDetailRequest'
      responses:
        '200':
          description: "查询成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                $ref: '#/components/schemas/AttachmentRecord'
        '400':
          description: "参数错误"
        '401':
          description: "token 无效或已过期"
        '403':
          description: "非 ManagePlatform 用户无权访问"
        '404':
          description: "未找到对应附件"
        '415':
          description: "请求体必须为 application/json"
  /pb/api/attachment/upload:
    post:
      tags: [附件管理]
      summary: 上传附件
      description: |
        仅允许 `ManagePlatform` 用户访问。
        使用 `multipart/form-data` 上传单个文件到 `tbl_attachments`，服务端会自动生成 `attachments_id`，
        并返回可直接访问的 PocketBase 文件流链接。
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/AttachmentUploadRequest'
      responses:
        '200':
          description: "上传成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                $ref: '#/components/schemas/AttachmentRecord'
        '400':
          description: "参数错误、缺少文件或附件保存失败"
        '401':
          description: "token 无效或已过期"
        '403':
          description: "非 ManagePlatform 用户无权访问"
  /pb/api/attachment/delete:
    post:
      tags: [附件管理]
      summary: 删除附件
      description: |
        仅允许 `ManagePlatform` 用户访问。
        按 `attachments_id` 真删除附件；若附件已被 `tbl_document.document_image`、`document_video` 或 `document_file` 引用，则拒绝删除。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttachmentDetailRequest'
      responses:
        '200':
          description: "删除成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                type: object
                properties:
                  attachments_id:
                    description: "附件业务 ID"
                    type: string
        '400':
          description: "参数错误、附件已被文档引用或删除失败"
        '401':
          description: "token 无效或已过期"
        '403':
          description: "非 ManagePlatform 用户无权访问"
        '404':
          description: "未找到待删除附件"
        '415':
          description: "请求体必须为 application/json"
        '429':
          description: "重复请求过于频繁"
  /pb/api/document/list:
    post:
      tags: [文档管理]
      summary: 查询文档列表
      description: |
        仅允许 `ManagePlatform` 用户访问。
        支持按标题、摘要、关键词等字段模糊搜索，并可按 `document_status`、`document_type` 过滤。
        返回结果会自动根据 `document_image`、`document_video`、`document_file` 中的多个 `attachments_id` 关联 `tbl_attachments`，
        额外补充 `document_image_urls`、`document_video_urls`、`document_file_urls` 以及对应附件对象数组。
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DocumentListRequest'
      responses:
        '200':
          description: "查询成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                type: object
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/DocumentRecord'
        '401':
          description: "token 无效或已过期"
        '403':
          description: "非 ManagePlatform 用户无权访问"
        '415':
          description: "请求体必须为 application/json"
  /pb/api/document/detail:
    post:
      tags: [文档管理]
      summary: 查询文档详情
      description: |
        仅允许 `ManagePlatform` 用户访问。
        按 `document_id` 查询单条文档，并返回与附件表联动解析后的多文件流链接。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DocumentDetailRequest'
      responses:
        '200':
          description: "查询成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                $ref: '#/components/schemas/DocumentRecord'
        '400':
          description: "参数错误"
        '401':
          description: "token 无效或已过期"
        '403':
          description: "非 ManagePlatform 用户无权访问"
        '404':
          description: "未找到对应文档"
        '415':
          description: "请求体必须为 application/json"
  /pb/api/document/create:
    post:
      tags: [文档管理]
      summary: 新增文档
      description: |
        仅允许 `ManagePlatform` 用户访问。
        `document_id` 可选；未传时服务端自动生成。
        `document_title`、`document_type` 为必填；其余字段均允许为空。
        `document_image`、`document_video`、`document_file` 支持传入多个已存在于 `tbl_attachments` 的 `attachments_id`。
        成功后会同步写入一条 `tbl_document_operation_history`，操作类型为 `create`。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DocumentMutationRequest'
      responses:
        '200':
          description: "新增成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                $ref: '#/components/schemas/DocumentRecord'
        '400':
          description: "参数错误、附件不存在或文档创建失败"
        '401':
          description: "token 无效或已过期"
        '403':
          description: "非 ManagePlatform 用户无权访问"
        '415':
          description: "请求体必须为 application/json"
        '429':
          description: "重复请求过于频繁"
  /pb/api/document/update:
    post:
      tags: [文档管理]
      summary: 修改文档
      description: |
        仅允许 `ManagePlatform` 用户访问。
        按 `document_id` 定位现有文档并更新。
        `document_title`、`document_type` 为必填；其余字段均允许为空。
        若传入 `document_image`、`document_video`、`document_file`，则支持多个 `attachments_id`，并会逐一校验是否存在。
        成功后会同步写入一条 `tbl_document_operation_history`，操作类型为 `update`。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DocumentMutationRequest'
      responses:
        '200':
          description: "修改成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                $ref: '#/components/schemas/DocumentRecord'
        '400':
          description: "参数错误、附件不存在或修改失败"
        '401':
          description: "token 无效或已过期"
        '403':
          description: "非 ManagePlatform 用户无权访问"
        '404':
          description: "未找到待修改文档"
        '415':
          description: "请求体必须为 application/json"
        '429':
          description: "重复请求过于频繁"
  /pb/api/document/delete:
    post:
      tags: [文档管理]
      summary: 删除文档
      description: |
        仅允许 `ManagePlatform` 用户访问。
        按 `document_id` 真删除文档，并在删除前同步写入一条 `tbl_document_operation_history`，操作类型为 `delete`。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DocumentDeleteRequest'
      responses:
        '200':
          description: "删除成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                type: object
                properties:
                  document_id:
                    description: "文档业务 ID"
                    type: string
        '400':
          description: "参数错误或删除失败"
        '401':
          description: "token 无效或已过期"
        '403':
          description: "非 ManagePlatform 用户无权访问"
        '404':
          description: "未找到待删除文档"
        '415':
          description: "请求体必须为 application/json"
        '429':
          description: "重复请求过于频繁"
  /pb/api/document-history/list:
    post:
      tags: [文档历史]
      summary: 查询文档操作历史
      description: |
        仅允许 `ManagePlatform` 用户访问。
        若 body 传入 `document_id`，则仅查询该文档的历史；否则返回全部文档操作历史，按创建时间倒序排列。
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DocumentHistoryListRequest'
      responses:
        '200':
          description: "查询成功"
          content:
            application/json:
              schema:
                description: "业务响应数据"
                type: object
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/DocumentHistoryRecord'
        '401':
          description: "token 无效或已过期"
        '403':
          description: "非 ManagePlatform 用户无权访问"
        '415':
          description: "请求体必须为 application/json"



