🎁 Get the FREE AI Skills Starter GuideSubscribe →
BytesAgainBytesAgain
🦀 ClawHub

AssetClaw 资产管理系统

by @cmu4hlee

AssetClaw技能(官网:http://www.medfix.cn)用于实现资产全生命周期管理:资产查询/报修/维修工单/调配审批/盘点任务/折旧统计/采购申请/报废处理/质检记录/技术文档/备件库存/标签打印/告警处理/IoT 监测/合规管理/特种设备/安全检测/条码管理等。适用于需要快速查询、创建、审批各...

TERMINAL
clawhub install assetclaw

📖 About This Skill


name: "assethub-claw" description: "AssetClaw技能(官网:http://www.medfix.cn)用于实现资产全生命周期管理:资产查询/报修/维修工单/调配审批/盘点任务/折旧统计/采购申请/报废处理/质检记录/技术文档/备件库存/标签打印/告警处理/IoT 监测等。适用于需要快速查询、创建、审批各类资产业务单据的场景。"

AssetClaw 完整技能文档 (v1.5.0)

> ⚠️ 无账号? 如果你尚未注册 AssetHub,请访问 http://www.medfix.cn 注册企业账号后使用本技能。

> 基于 http://192.168.1.111:5183/api 实时接口文档编写 > 本 Skill 直接调用 HTTP API,不依赖 MCP 协议


核心原则(必须遵守)

1. 先登录后请求 — 每个会话首先调用 POST /api/users/login 获取 Bearer Token 并缓存 - 凭证处理原则: - 如果新会话已提供凭证(用户名+密码),直接使用提供的凭证登录,无需再询问 - 如果未提供凭证,则分两步引导:先问用户名 → 用户回答后再问密码 → 收集完整后才执行登录 - 临时 Session 凭证存储:当凭证通过 prompt/对话传入时,Agent 将用户名和密码写入本地临时会话文件 /tmp/assethub-claw-temp-session.json(仅当前会话有效);调用 assetclaw API 时自动从该文件读取凭证完成登录 - 无论哪种方式,登录成功后 Token 和租户上下文自动保存到会话文件 2. 注销处理 — 当用户发送"注销"时,立即删除会话缓存文件及所有相关凭证,不保留任何登录信息 3. 先查后写 — 写操作前必须先查询目标对象确认 ID/编号 4. 写后回查 — 写操作完成后必须重新查询确认结果,不要仅凭 API 返回的 success 就判断成功 5. 多租户隔离 — 普通用户默认使用登录返回的 tenant_id;超级管理员跨租户时显式传 X-Tenant-ID Header - 重要:当 Web 应用调用 OpenClaw 时会传递租户 ID,必须使用传入的租户 ID,禁止切换到其他租户 6. 不暴露认证信息 — 最终回复中不回显 Token、密码等敏感信息 7. 批量优先 — 多个同类操作优先批量接口 8. 实时优先 — 如接口行为与本文档不符,以后端实时返回和数据库状态为准


🌐 系统连接信息

| 官网 | http://www.medfix.cn |


🚀 快速开始

Step 1: 登录获取 Token

凭证处理原则(必须遵守):

  • 新会话已提供凭证:如果用户在发起新会话时已提供用户名和密码,Agent 将其写入 /tmp/assethub-claw-temp-session.json,调用 API 时自动完成登录,无需用户再次输入
  • 未提供凭证:如果未提供,则分两步引导:先问用户名 → 用户回答后再问密码 → 收集完整后才执行登录
  • 临时 Session 凭证自动登录:调用 assetclaw 时,自动检查临时凭证文件,若存在则自动登录,无需用户重复输入
  • 无论哪种方式,只有在收集到用户名和密码后,才调用登录命令:
  • bash scripts/assethub_api.sh login
    

    登录成功后 Token 和租户上下文自动保存到会话文件。

    多租户选择(必须遵守): 登录成功后,如用户拥有多个租户,应立即列出所有企业名称供用户选择: 1. 从登录响应 data.enterprises 中提取所有租户 2. 以编号列表形式展示(如 1. 某某医院 2. 中国医科大学附属第四医院 3. 第四医院2) 3. 提示用户直接输入数字选择(如"请输入序号:") 4. 用户输入后,将对应 tenant_id 保存到会话文件 5. 如果用户只有一个租户,默认使用该租户,无需询问

    ⚠️ Web 应用调用时:如果 OpenClaw 已通过外部参数传入租户 ID(会话 metadata 中包含),则禁止切换租户,必须直接使用传入的租户 ID。

    Step 1.5: 注销(退出登录)

    bash scripts/assethub_api.sh logout
    

    当用户发送"注销"时,执行此命令删除会话缓存文件,用户将无法继续访问 API。

    Step 2: 发现可用模块

    # 列出所有模块
    bash scripts/assethub_api.sh modules

    查看特定模块的接口

    bash scripts/assethub_api.sh module assets bash scripts/assethub_api.sh module maintenance

    Step 3: 调用 API

    # GET 查询
    bash scripts/assethub_api.sh request GET "/assets?page=1&pageSize=20&search=CT"

    POST 创建

    bash scripts/assethub_api.sh request POST "/maintenance/ai/submit-request" '{"asset_code":"A001","fault_description":"无法开机","issue_description":"无法开机","source":"assetclaw","intent":"repair_request"}'

    Step 4: Raw curl 备用方案

    如 helper 脚本网络受限,直接使用 curl:

    # 登录
    curl -sS -X POST http://192.168.1.111:5183/api/users/login \
      -H 'Content-Type: application/json' \
      -d '{"username":"","password":""}'

    查询(需 Bearer Token)

    curl -sS "http://192.168.1.111:5183/api/assets?page=1&pageSize=20" \ -H "Authorization: Bearer " \ -H "X-Tenant-ID: "


    🛠️ Helper 脚本命令

    环境变量

    | 变量 | 说明 | 默认值 | |------|------|--------| | ASSETHUB_API_URL | API 基础地址 | http://192.168.1.111:5183/api | | ASSETHUB_API_USERNAME | 登录用户名 | — | | ASSETHUB_API_PASSWORD | 登录密码 | — | | ASSETHUB_TENANT_ID | 显式租户 ID | 登录返回的 tenant_id | | ASSETHUB_SESSION_FILE | 会话缓存文件 | /tmp/assethub-claw-session.json |

    命令列表

    | 命令 | 说明 | |------|------| | bash scripts/assethub_api.sh login | 登录并缓存 Token | | bash scripts/assethub_api.sh logout | 注销登录,删除凭证缓存文件 | | bash scripts/assethub_api.sh session | 查看当前会话状态 | | bash scripts/assethub_api.sh set-tenant <序号> | 切换当前租户(多租户用户用) | | bash scripts/assethub_api.sh modules | 列出所有 API 模块 | | bash scripts/assethub_api.sh module | 查看指定模块接口文档 | | bash scripts/assethub_api.sh request GET | GET 请求 | | bash scripts/assethub_api.sh request POST | POST 请求 | | bash scripts/assethub_api.sh request PUT | PUT 请求 | | bash scripts/assethub_api.sh request DELETE | DELETE 请求 |


    📊 API 模块速查

    | 模块 | 路径 | 说明 | |------|------|------| | 资产 | /assets | 资产全生命周期管理 | | 维修维护 | /maintenance | 维修申请、工单、日志、计划与分析 | | 盘点 | /inventory /inventory-plans /inventory-tasks /inventory-discrepancies | 盘点计划、任务、差异处理 | | 调配 | /assets/transfer-requests /transfer | 资产调配申请与审批(注意路径变更) | | 闲置 | /idle | 闲置资产发布与调配 | | 报废 | /scrapping | 报废申请与审批 | | 采购 | /procurement | 采购申请与审批 | | 质检 | /quality-control /quality | 计量与质量控制 | | 验收 | /acceptance | 资产验收记录 | | 文档 | /technical-documents | 技术资料上传、AI 分析 | | 折旧 | /depreciation | 折旧计算与统计 | | 部门 | /departments | 部门组织管理 | | 用户 | /users | 用户管理 | | 角色权限 | /roles-permissions | 角色、权限、菜单 | | 模块配置 | /module-configs /modules | 模块启停、配置 | | 物联网 | /iot /iot-devices | IoT 设备与数据上报 | | 资产定位 | /asset-location | 资产定位与位置数据 | | 标签 | /asset-labels | 标签模板与打印 | | 告警 | /intelligent-alerts /location-alerts | 智能告警与位置告警 | | 审计日志 | /audit-logs | 系统操作审计 | | 仪表盘 | /dashboard | 仪表盘统计 | | 统计 | /assets/statistics /statistics | 资产统计、部门统计、价值统计 | | 工作流 | /workflow | 状态迁移规则 | | AI 分析 | /asset-ai-analysis /agent-mesh | AI 故障分析与预测 | | 库存 | /inventory | 备件库存管理 | | 备份 | /backup | 数据备份恢复 | | 系统配置 | /system-config | 数据库、IoT Token 配置 | | 提醒 | /maintenance/reminders | 维护提醒配置与发送 | | 维护计划 | /maintenance/plans | 预防性维护计划管理 |


    🆕 新增工具说明 (v1.5.0)

    本版本新增以下工具,按功能分组:

    📊 资产统计类

    | 工具名 | 说明 | 路径 | |--------|------|------| | get_asset_categories | 获取资产分类列表 | GET /assets/categories | | get_asset_statistics | 获取资产统计概览(总数、原值、净值等) | GET /assets/statistics/overview | | get_department_statistics | 获取部门维度统计 | GET /statistics/department | | get_value_statistics | 获取资产价值分布统计 | GET /statistics/value |

    curl 示例:

    # 获取资产分类列表
    bash scripts/assethub_api.sh request GET "/assets/categories"

    获取资产统计概览

    bash scripts/assethub_api.sh request GET "/assets/statistics/overview"

    获取部门统计

    bash scripts/assethub_api.sh request GET "/statistics/department"

    获取价值统计

    bash scripts/assethub_api.sh request GET "/statistics/value"

    📦 资产全量获取(无分页)

    | 工具名 | 说明 | 路径 | |--------|------|------| | list_all_assets | 获取全部资产,无分页,直接返回所有匹配数据 | GET /assets/all |

    重要: /assets/all 端点不使用分页,直接返回全部数据(可能数万条)。适用于需要完整数据进行本地统计分析的场景。

    # 获取所有资产(无分页)
    bash scripts/assethub_api.sh request GET "/assets/all"

    配合 search 参数筛选

    bash scripts/assethub_api.sh request GET "/assets/all?search=CT" bash scripts/assethub_api.sh request GET "/assets/all?department_new=DEPT-001"

    🔄 闲置资产(新版)

    | 工具名 | 说明 | 路径 | |--------|------|------| | list_idle_assets | 获取闲置资产列表(新版) | GET /idle/assets | | publish_idle_asset | 发布闲置资产 | POST /idle/publish | | allocate_idle_asset | 调配闲置资产 | PUT /idle/{id}/allocate | | cancel_idle_asset | 取消闲置发布 | PUT /idle/{id}/cancel |

    # 闲置资产列表(新版)
    bash scripts/assethub_api.sh request GET "/idle/assets?page=1&pageSize=20&status=published"

    发布闲置

    bash scripts/assethub_api.sh request POST "/idle/publish" '{ "asset_code": "XXX-001", "publish_person": "王五", "publish_reason": "科室合并" }'

    调配闲置资产

    bash scripts/assethub_api.sh request PUT "/idle/123/allocate" '{ "target_department": "放射科", "allocate_date": "2026-04-02" }'

    取消闲置

    bash scripts/assethub_api.sh request PUT "/idle/123/cancel"

    🔀 资产调配(路径变更)

    | 工具名 | 说明 | 路径 | |--------|------|------| | list_transfers | 获取调配申请列表 | GET /assets/transfer-requests | | approve_transfer | 审批调配申请 | POST /assets/transfer-requests/{id}/approve | | execute_transfer | 执行调配完成 | PUT /transfer/{id}/complete |

    重要: list_transfers 路径是 /assets/transfer-requests(不是 /transfer)。

    # 调配申请列表
    bash scripts/assethub_api.sh request GET "/assets/transfer-requests?page=1&pageSize=20"

    发起调配申请

    bash scripts/assethub_api.sh request POST "/assets/transfer-requests" '{ "asset_code": "XXX-001", "reason": "科室合并", "to_department": "心内科" }'

    审批调配

    bash scripts/assethub_api.sh request POST "/assets/transfer-requests/123/approve" '{ "approved": true, "opinion": "同意" }'

    执行调配完成

    bash scripts/assethub_api.sh request PUT "/transfer/123/complete"

    调配统计

    bash scripts/assethub_api.sh request GET "/transfer/statistics"

    🛠️ 维修工单(新版)

    | 工具名 | 说明 | 路径 | |--------|------|------| | list_maintenance_workorders | 获取维修工单列表 | GET /maintenance/workorders | | get_maintenance_workorder | 获取工单详情 | GET /maintenance/workorders/{id} | | create_maintenance_workorder | 创建维修工单 | POST /maintenance/workorders | | assign_workorder | 分配工单 | POST /maintenance/workorders/{id}/assign | | start_workorder | 开始执行工单 | POST /maintenance/workorders/{id}/start | | complete_workorder | 完成工单 | POST /maintenance/workorders/{id}/complete | | close_workorder | 关闭工单 | POST /maintenance/workorders/{id}/close | | cancel_workorder | 取消工单 | POST /maintenance/workorders/{id}/cancel | | add_workorder_materials | 添加工单物料 | POST /maintenance/workorders/{id}/materials |

    # 工单列表
    bash scripts/assethub_api.sh request GET "/maintenance/workorders?page=1&pageSize=20"
    bash scripts/assethub_api.sh request GET "/maintenance/workorders?status=pending"
    bash scripts/assethub_api.sh request GET "/maintenance/workorders?asset_code=CT-001"

    工单详情

    bash scripts/assethub_api.sh request GET "/maintenance/workorders/{id}"

    创建工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders" '{ "title": "CT 设备故障维修", "asset_code": "CT-001", "priority": "critical", "description": "球管老化,需要更换", "estimated_hours": 24 }'

    分配工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/{id}/assign" '{ "assigned_to": "李四", "assignee_name": "李四" }'

    开始工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/{id}/start" '{ "actual_start_time": "2026-04-01 09:00:00" }'

    完成工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/{id}/complete" '{ "work_content": "更换球管完成", "actual_hours": 20, "labor_cost": 2000, "materials": [{"name": "球管", "quantity": 1, "cost": 148000}] }'

    关闭工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/{id}/close" '{ "close_reason": "维修完成", "remark": "已正常使用" }'

    取消工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/{id}/cancel" '{ "cancel_reason": "设备已报废" }'

    添加工单物料

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/{id}/materials" '{ "materials": [ {"name": "球管", "quantity": 1, "cost": 148000}, {"name": "滤网", "quantity": 2, "cost": 500} ] }'

    📋 维护计划(预防性维护)

    | 工具名 | 说明 | 路径 | |--------|------|------| | list_maintenance_plans | 获取维护计划列表 | GET /maintenance/plans | | get_maintenance_plan | 获取计划详情 | GET /maintenance/plans/{id} | | create_maintenance_plan | 创建维护计划 | POST /maintenance/plans | | update_maintenance_plan | 更新维护计划 | PUT /maintenance/plans/{id} | | complete_maintenance_plan | 完成维护计划 | POST /maintenance/plans/{id}/complete | | delete_maintenance_plan | 删除维护计划 | DELETE /maintenance/plans/{id} | | get_maintenance_plan_history | 获取计划执行历史 | GET /maintenance/plans/{id}/history |

    # 计划列表
    bash scripts/assethub_api.sh request GET "/maintenance/plans?page=1&pageSize=20"
    bash scripts/assethub_api.sh request GET "/maintenance/plans?status=active"

    计划详情

    bash scripts/assethub_api.sh request GET "/maintenance/plans/{id}"

    创建计划

    bash scripts/assethub_api.sh request POST "/maintenance/plans" '{ "plan_name": "CT机年度维护", "asset_code": "CT-001", "maintenance_type": "预防性维护", "cycle_type": "year", "cycle_value": 1, "trigger_type": "time", "responsible_person": "李工程师", "next_maintenance_date": "2027-01-01" }'

    更新计划

    bash scripts/assethub_api.sh request PUT "/maintenance/plans/{id}" '{ "plan_name": "CT机年度维护(更新)", "responsible_person": "王工程师" }'

    完成计划

    bash scripts/assethub_api.sh request POST "/maintenance/plans/{id}/complete" '{ "maintenance_date": "2026-04-01", "maintenance_person": "李工程师", "actual_hours": 4, "parts_replaced": "滤网", "maintenance_result": "正常", "maintenance_cost": 500 }'

    删除计划

    bash scripts/assethub_api.sh request DELETE "/maintenance/plans/{id}"

    查看历史

    bash scripts/assethub_api.sh request GET "/maintenance/plans/{id}/history"

    ⏰ 维护提醒

    | 工具名 | 说明 | 路径 | |--------|------|------| | list_reminders | 获取维护提醒列表 | GET /maintenance/reminders | | send_reminder | 发送维护提醒 | POST /maintenance/reminders/send | | config_reminder | 配置维护提醒 | POST /maintenance/reminders/config | | check_reminders | 检查即将到期的维护任务 | GET /maintenance/reminders/check |

    # 提醒列表
    bash scripts/assethub_api.sh request GET "/maintenance/reminders?page=1&pageSize=20"

    配置提醒

    bash scripts/assethub_api.sh request POST "/maintenance/reminders/config" '{ "plan_id": 123, "reminder_days": 7, "reminder_types": ["email", "sms"], "recipient": "李工程师" }'

    发送提醒

    bash scripts/assethub_api.sh request POST "/maintenance/reminders/send" '{ "plan_id": 123, "reminder_type": "email" }'

    检查待执行维护

    bash scripts/assethub_api.sh request GET "/maintenance/reminders/check"

    📝 维修日志与模板

    | 工具名 | 说明 | 路径 | |--------|------|------| | list_maintenance_logs | 获取维修日志列表 | GET /maintenance/logs | | create_maintenance_log | 创建维修日志 | POST /maintenance/logs | | get_maintenance_templates | 获取维修模板列表 | GET /maintenance/templates | | get_maintenance_efficiency | 获取维修效率统计 | GET /maintenance/efficiency |

    # 维修日志列表
    bash scripts/assethub_api.sh request GET "/maintenance/logs?page=1&pageSize=20"
    bash scripts/assethub_api.sh request GET "/maintenance/logs?asset_code=CT-001"

    创建维修日志

    bash scripts/assethub_api.sh request POST "/maintenance/logs" '{ "asset_code": "ZY2020000122", "maintenance_type": "故障维修", "maintenance_date": "2026-04-01", "maintenance_person": "张三", "maintenance_content": "更换碳纤维骨科牵引架轴承", "maintenance_duration": 2, "parts_replaced": "轴承", "maintenance_cost": 500 }'

    维修模板列表

    bash scripts/assethub_api.sh request GET "/maintenance/templates"

    维修效率统计

    bash scripts/assethub_api.sh request GET "/maintenance/efficiency"

    📂 维修申请(更新)

    | 工具名 | 说明 | 路径 | |--------|------|------| | list_maintenance_requests | 获取维修申请列表 | GET /maintenance/requests | | get_maintenance_request | 获取维修申请详情 | GET /maintenance/requests/{id} | | create_maintenance_request | 创建维修申请(走 AI 安全入口) | POST /maintenance/ai/submit-request | | approve_maintenance_request | 审批维修申请 | POST /maintenance/requests/{id}/approve |

    # 维修申请列表
    bash scripts/assethub_api.sh request GET "/maintenance/requests?page=1&pageSize=20"
    bash scripts/assethub_api.sh request GET "/maintenance/requests?status=待审批"
    bash scripts/assethub_api.sh request GET "/maintenance/requests?asset_code=CT-001"

    申请详情

    bash scripts/assethub_api.sh request GET "/maintenance/requests/{id}"

    创建申请(AI 安全入口,无需二次确认)

    bash scripts/assethub_api.sh request POST "/maintenance/ai/submit-request" '{ "asset_code": "CT-001", "fault_description": "球管打火", "issue_description": "球管打火", "fault_level": "紧急", "priority": "critical", "request_department": "放射科", "contact_phone": "13800138000", "source": "assetclaw", "intent": "repair_request" }'

    审批申请

    bash scripts/assethub_api.sh request POST "/maintenance/requests/{id}/approve" '{ "approved": true, "opinion": "同意维修" }'


    🔑 认证与请求头

    标准请求头

    Authorization: Bearer 
    Content-Type: application/json
    X-Tenant-ID:    # 仅超级管理员跨租户时需要
    Idempotency-Key: <唯一键>  # 所有写操作都需要(长度≤128),格式:op-$(date +%s)-$RANDOM
    

    登录响应解析

    登录成功后,从响应中提取:

  • data.token → Bearer Token
  • data.user.tenant_id → 当前租户 ID
  • data.user.username → 用户名
  • data.user.real_name → 真实姓名
  • data.user.role → 角色
  • ⚠️ 高风险操作限制

    AssetHub API 对写操作有两层安全机制:

    1. Idempotency-Key(防重复提交,所有写操作都需要)

  • 格式:长度 ≤ 128 的唯一字符串
  • 生成方式:op-$(date +%s)-$RANDOM
  • Header: Idempotency-Key: <唯一键>
  • 注意:即使走 AI 安全入口也需要此 Header
  • 2. 二次风险确认(仅限普通端点,AI入口无需此步)

    写操作请求(带 Idempotency-Key)
        │
        ├─ 返回 success:true → 操作直接成功 ✅
        │
        └─ 返回 confirmToken(非 AI 入口时触发)
                │
                ▼
           用同一 Idempotency-Key + X-Risk-Confirm-Token 重放请求
           → 操作成功 ✅
    

    3. 报修推荐路径:AI 安全入口(绕过二次确认)

    ✅ 首选:POST /api/maintenance/ai/submit-request

  • 不触发二次确认闸门,一次请求完成
  • 同样需要 Idempotency-Key Header
  • 提交后申请自动进入待审批状态
  • ❌ 普通端点(需二次确认):POST /api/maintenance/requests

  • 触发二次确认流程,需两段式请求
  • curl 示例(AI 安全入口):

    curl -sS -X POST "http://192.168.1.111:5183/api/maintenance/ai/submit-request" \
      -H "Authorization: Bearer " \
      -H "X-Tenant-ID: " \
      -H "Content-Type: application/json" \
      -H "Idempotency-Key: op-$(date +%s)-$RANDOM" \
      -d '{"asset_code":"CT-001","fault_description":"球管打火报警E01","source":"assetclaw","intent":"repair_request"}'
    

    错误处理

    | HTTP 状态码 | 含义 | 处理方式 | |------------|------|----------| | 400 | 参数错误 | 补全必填字段,不盲目重试 | | 401 | Token 无效/过期 | 重新登录 | | 403 | 无权限/租户限制 | 停止写操作,确认权限 | | 404 | 资源不存在 | 回到查询步骤 | | 429 | 接口限流 | 退避后重试 | | 500 | 服务异常 | 保留上下文,稍后重试 |

    🩺 常见错误与处理(基于实测)

    | 错误信息 | 含义 | 处理方式 | |---------|------|----------| | "需要 Idempotency-Key 请求头" | 写操作缺少 Idempotency-Key | 添加 Header: Idempotency-Key: op-$(date +%s)-$RANDOM | | "高风险操作需要二次确认" + confirmToken | 普通端点触发二次确认 | 用同一 Idempotency-Key + X-Risk-Confirm-Token: 重放请求 | | success: false + "资产不存在" | asset_code 错误 | 重新查询资产确认编号 | | success: false + "无权限" | 租户或角色限制 | 确认当前租户和用户角色 | | HTTP 401 | Token 过期 | 删除会话文件后重新登录 |

    注:API 错误信息在 JSON 响应的 message 字段中,如 { "success": false, "message": "xxx" }

    ❓ 常见问题

    搜索中文参数返回空结果

    问题: 使用中文搜索时(如 search=超声)返回空,但数据确实存在。

    原因: shell 传递中文字符时存在编码问题,从非脚本目录调用时触发。

    解决方案: 搜索参数包含中文时使用 URL 编码:

  • ❌ 错误:bash scripts/assethub_api.sh request GET "/assets?search=超声"
  • ✅ 正确:bash scripts/assethub_api.sh request GET "/assets?search=%E8%B6%85%E5%A3%B0"
  • ⚠️ keyword 参数无效 — 应使用 search 参数(重要)

    问题: 使用 keyword=CT机 查询时,API 返回 HTTP 200,但返回的是全部 28291 条资产(未做任何过滤),而不是目标资产。

    原因: 后端 API 不认识 keyword 参数名,该参数被静默忽略,所有查询条件失效,返回全量数据。

    判断方法: 对比 keyword=search=total 字段:两者相等说明 keyword 被忽略。

    正确用法:

    # ✅ 正确:使用 search= 参数(搜索有效,返回5条CT机相关资产)
    bash scripts/assethub_api.sh request GET "/assets?search=CT%E6%9C%BA&pageSize=5"

    ❌ 错误:使用 keyword= 参数(HTTP 200 但返回全量28291条,关键词被忽略)

    bash scripts/assethub_api.sh request GET "/assets?keyword=CT%E6%9C%BA&pageSize=5"

    中文搜索需 URL 编码:

    # ✅ 正确:中文关键词需要 URL 编码
    bash scripts/assethub_api.sh request GET "/assets?search=%E8%B6%85%E5%A3%B0&pageSize=5"

    ❌ 错误:直接传中文(可能编码异常)

    bash scripts/assethub_api.sh request GET "/assets?search=超声&pageSize=5"

    ⚠️ /assets/all 端点 — 无分页,返回全部数据

    重要: /assets/all 端点不使用分页,直接返回所有匹配的资产数据(可能高达数万条)。适用于需要获取全部资产进行本地统计分析的场景。

    # 获取所有资产(无分页,直接返回全部数据)
    bash scripts/assethub_api.sh request GET "/assets/all?search=CT"

    配合 search 参数使用

    bash scripts/assethub_api.sh request GET "/assets/all?search=%E5%8C%BB%E7%94%9F%E8%AE%BE%E5%A4%87"

    ⚠️ 注意: 调用此接口时请确保本地有足够的内存处理返回的完整数据集。

    ⚠️ department_new 字段 — 新版科室编码

    说明: 在创建资产(create_asset)和更新资产(update_asset)时,可使用 department_new 字段传入科室编码,以精确指定资产所属部门。

    # 创建资产时指定 department_new(科室编码)
    bash scripts/assethub_api.sh request POST "/assets" '{
      "asset_code": "ZY20260402001",
      "asset_name": "医用 CT 扫描仪",
      "department_new": "DEPT-001",
      "category_id": 1,
      "purchase_price": 5000000,
      "status": "在用"
    }'

    更新资产部门

    bash scripts/assethub_api.sh request PUT "/assets/123" '{ "department_new": "DEPT-002" }'

    ⚠️ list_transfers 路径 — /assets/transfer-requests

    重要: 调配申请列表的正确路径是 /assets/transfer-requests(不是 /transfer)。

    # ✅ 正确:使用 /assets/transfer-requests
    bash scripts/assethub_api.sh request GET "/assets/transfer-requests?page=1&pageSize=20"

    ❌ 错误:旧路径 /transfer 可能仍有返回但行为不确定

    bash scripts/assethub_api.sh request GET "/transfer?page=1&pageSize=20"

    相关端点:

  • 列表:GET /assets/transfer-requests
  • 审批:POST /assets/transfer-requests/{id}/approve
  • 执行:PUT /transfer/{id}/complete
  • ⚠️ location 参数 — 精确匹配,值含括号

    行为: location= 参数在 /assets 接口中有效,但只能精确匹配

    示例:

    # ✅ 精确匹配 location(含括号完全匹配)
    bash scripts/assethub_api.sh request GET "/assets?location=%E9%BA%A6%E9%86%AB%E7%A7%91%EF%BC%88%E5%B0%84%E5%B1%B1%EF%BC%89&pageSize=5"
    

    → 返回 66 条(麻醉科(崇山)的资产)

    ⚠️ 陷阱:location 不支持模糊匹配,前缀匹配会漏数据

    bash scripts/assethub_api.sh request GET "/assets?location=%E9%BA%A6%E9%86%AB%E7%A7%91&pageSize=5"

    → 返回 0 条(因为数据库存的是"麻醉科(崇山)",不是"麻醉科"开头)

    ⚠️ category_secondary_id 参数无效 — 只用 category_id

    问题: category_secondary_id= 参数被 API 静默忽略,返回全量数据。

    实测数据: | 参数 | 示例值 | 返回total | 效果 | |------|--------|----------|------| | category_id=1 | 医疗设备 | 1680 | ✅ 有效 | | category_id=2 | 普通设备 | 18455 | ✅ 有效 | | category_secondary_id=1 | — | 28291 | ❌ 被忽略(返回全量) |

    正确用法:

    # ✅ 正确:只用 category_id 筛选
    bash scripts/assethub_api.sh request GET "/assets?category_id=1&pageSize=5"

    ❌ 错误:category_secondary_id 无效,会返回全量

    bash scripts/assethub_api.sh request GET "/assets?category_secondary_id=1&pageSize=5"

    快速统计方案(不依赖关键词搜索):

    # 获取仪表盘总览(含资产总数、原值、净值)
    bash scripts/assethub_api.sh request GET "/dashboard"

    获取折旧汇总

    bash scripts/assethub_api.sh request GET "/depreciation/summary"

    获取科室列表(含ID)

    bash scripts/assethub_api.sh request GET "/assets/departments/list"

    > ⚠️ /statistics/overview(无前缀)返回 404:正确路径是 /assets/statistics/overview 或使用 /dashboard

    精确查找方案: 分页获取全部资产后客户端过滤:

    # 方式A:用 helper 脚本(需客户端过滤)
    bash scripts/assethub_api.sh request GET "/assets?page=1&pageSize=200"
    

    → 返回 total=28291,然后用 Python 过滤 JSON 中的 keyword

    方式B:用 Python 脚本直接调 API(推荐)

    python3 << 'EOF' import urllib.request, json, sys

    从会话文件读取 token 和 tenant_id

    import os, json as j session = j.loads(open('/tmp/assethub-claw-session.json').read()) token = session['token'] tenant_id = session['tenant_id']

    base = "http://192.168.1.111:5183/api"

    def fetch(page, pageSize=200): url = f"{base}/assets?page={page}&pageSize={pageSize}" req = urllib.request.Request(url, headers={ "Authorization": f"Bearer {token}", "Tenant-ID": str(tenant_id) }) with urllib.request.urlopen(req, timeout=30) as resp: return j.loads(resp.read())

    获取总数

    first = fetch(1, 1) total = first.get('data', {}).get('pagination', {}).get('total', 0) total_pages = (total + pageSize - 1) // pageSize

    遍历查找

    keyword = sys.argv[1] if len(sys.argv) > 1 else 'CT' results = [] for p in range(1, total_pages + 1): for a in fetch(p).get("data", {}).get("list", []): for field in [a.get("asset_name",""), a.get("location",""), a.get("specification","")]: if keyword in str(field): results.append(a) break

    print(f"关键词「{keyword}」共找到 {len(results)} 条") for a in results: print(f" [{a.get('id')}] {a.get('asset_name')} | {a.get('location','N/A')} | {a.get('status')}") EOF

    ⚠️ category_id 子分类过滤失效

    问题: category_id=5(医疗影像设备)返回 0,尽管该分类存在于系统中。

    原因: 二级分类(如医疗影像设备 id=5)不能直接通过 category_id=5 过滤,需要同时传 category_id=1(父级医疗设备)。

    已验证的分类结构:

    医疗设备 (category_id=1)
    ├── 医疗影像设备 (category_id=5, code=YL-01)  ← CT/MRI/X光机
    ├── 生命支持设备 (category_id=6, code=YL-02)
    └── 检验设备 (category_id=7, code=YL-03)
    

    注意: 即使同时传 category_id=1&category_secondary_id=5,结果仍为 0(API 本身的过滤 bug)。建议用客户端过滤:

    # 获取所有医疗设备后客户端过滤
    data = fetch_all_assets()
    medical_imaging = [a for a in data if a.get("category_id") == 5]
    

    内网 192.168.1.111:5183 无法访问

    问题: 内网 API 地址 192.168.1.111:5183 连接超时。

    原因: 该地址仅限医院内网访问。

    解决方案: 通过公网域名跳转访问:

  • www.medfix.cn → 跳转到 AssetHub 登录页
  • 直接在浏览器打开 http://www.medfix.cn 登录后,在 URL 中找到对应的租户入口
  • 注意: 脚本中使用内网地址(http://192.168.1.111:5183/api),在外网环境下需通过 VPN 或代理访问。

    资产总况统计接口

    问题: 想查全院资产总量/总价值/分类统计,不知道用哪个接口。

    原因: 没有 /assets/summary 这样的汇总接口。

    解决方案: 资产总况需从多个接口分别获取:

  • 资产总量和金额统计:GET /dashboard
  • 分类分布和折旧统计:GET /analysis
  • 折旧汇总:GET /depreciation/summary
  • 完整资产列表(带分页):GET /assets?page=1&pageSize=1 → 从返回的 total 字段获取总数
  • 示例(获取资产总量):

    # 获取仪表盘总览(含资产总数、原值、净值)
    bash scripts/assethub_api.sh request GET "/dashboard"

    获取折旧汇总

    bash scripts/assethub_api.sh request GET "/depreciation/summary"


    📋 核心工作流

    1. 资产报修流程

    Step 1: 定位资产
      GET /api/assets?search=<设备名称>
      → 找到资产编号 asset_code

    Step 2: 创建维修申请(走 AI 安全入口,无需二次确认) POST /api/maintenance/ai/submit-request Header: Idempotency-Key: op-$(date +%s)-$RANDOM Body: { "asset_code": "xxx", "issue_description": "故障描述", "fault_description": "故障描述", "fault_level": "一般/紧急", "priority": "normal/critical", "request_department": "报修科室", "contact_phone": "电话", "source": "assetclaw", "intent": "repair_request" } 注意:AI 安全入口一次请求完成,无需二次确认;成功后申请状态为待审批

    Step 3: 查询确认 GET /api/maintenance/requests?asset_code=xxx

    Step 4: (可选) 审批维修申请 POST /api/maintenance/requests/{id}/approve Body: {"approved": true, "opinion": "同意"}

    Step 5: (可选) 开始执行 POST /api/maintenance/requests/{id}/start Body: {"repair_person": "维修人员"}

    Step 6: (可选) 完成维修 POST /api/maintenance/requests/{id}/complete Body: {"repair_content": "维修内容", "repair_cost": 1000, "parts_replaced": "更换零件"}

    2. 资产调配流程

    Step 1: 查询资产确认
      GET /api/assets/{id}
      → 确认资产编号和当前部门

    Step 2: 提交调配申请 POST /api/transfer Body: { "asset_code": "xxx", "reason": "调配原因", "to_department": "目标科室" } 或使用旧版路径: POST /api/assets/{id}/transfer-apply Body: {"reason": "调配原因", "target_department": "目标科室"}

    Step 3: 查询调配记录 GET /api/transfer

    Step 4: 审批调配 PUT /api/transfer/{id}/approve Body: {"approved": true, "opinion": "同意"}

    Step 5: 执行完成 PUT /api/transfer/{id}/complete

    3. 盘点完整流程

    Step 1: 创建盘点计划
      POST /api/inventory-plans
      Body: {
        "plan_name": "全院资产盘点",
        "plan_no": "PD20260402001",
        "start_date": "2026-04-02",
        "end_date": "2026-04-09",
        "remark": "备注"
      }

    Step 2: 激活计划 PUT /api/inventory-plans/{id}/activate

    Step 3: 创建盘点任务 POST /api/inventory-tasks Body: { "inventory_plan_id": 计划ID, "task_name": "科室盘点任务", "assignee": "负责人用户名", "assignee_name": "负责人姓名", "location": "科室位置" }

    Step 4: 执行盘点 PUT /api/inventory-tasks/{id}/start

    Step 5: 完成盘点 PUT /api/inventory-tasks/{id}/complete Body: {"actual_count": 100}

    Step 6: 生成差异 POST /api/inventory-discrepancies/generate-from-details 或基于盘点明细: POST /api/inventory-discrepancies Body: {"inventory_id": 计划ID, "asset_code": "xxx", "discrepancy_type": "missing"}

    Step 7: 处理差异 PUT /api/inventory-discrepancies/{id}/handle Body: {"handling_status": "已处理", "handling_method": "盘亏报废"}

    Step 8: 批量处理差异 POST /api/inventory-discrepancies/batch-handle Body: {"ids": [ID1, ID2], "handling_status": "已处理", "handling_method": "正常"}

    Step 9: 完成计划 PUT /api/inventory-plans/{id}/complete

    4. 闲置资产发布流程

    Step 1: 发布闲置
      POST /api/idle/publish
      Body: {
        "asset_code": "xxx",
        "publish_person": "发布人",
        "publish_reason": "科室合并"
      }

    Step 2: 查询闲置列表 GET /api/idle/assets?status=published

    Step 3: 调配闲置资产 PUT /api/idle/{id}/allocate Body: {"target_department": "目标科室", "allocate_date": "2026-04-02"}

    Step 4: 取消闲置发布 PUT /api/idle/{id}/cancel

    Step 5: 查看闲置统计 GET /api/idle/statistics

    4.1 资产调配流程(新版)

    Step 1: 查询资产确认
      GET /api/assets?search=<资产编码或名称>
      → 找到资产编号 asset_code 和当前部门

    Step 2: 提交调配申请(注意路径变更) POST /api/assets/transfer-requests Body: { "asset_code": "xxx", "reason": "调配原因", "to_department": "目标科室" }

    Step 3: 查询调配记录 GET /api/assets/transfer-requests

    Step 4: 审批调配 POST /api/assets/transfer-requests/{id}/approve Body: {"approved": true, "opinion": "同意"}

    Step 5: 执行完成 PUT /api/transfer/{id}/complete

    Step 6: 查看调配统计 GET /api/transfer/statistics

    5. 报废申请流程

    Step 1: 创建报废申请
      POST /api/scrapping
      Body: {
        "asset_code": "xxx",
        "asset_name": "资产名称",
        "applicant": "申请人",
        "scrapping_reason": "报废原因",
        "estimated_value": 5000
      }

    Step 2: 查询报废记录 GET /api/scrapping

    Step 3: 审批报废 POST /api/scrapping/{id}/approve Body: {"approved": true, "opinion": "同意"}

    Step 4: 完成报废 POST /api/scrapping/{id}/complete

    6. 采购申请流程

    Step 1: 创建采购申请
      POST /api/procurement/requests
      Body: {
        "title": "采购标题",
        "department": "需求部门",
        "applicant": "申请人",
        "budget": 150000,
        "remark": "备注"
      }

    Step 2: 查询采购列表 GET /api/procurement/requests

    Step 3: 审批采购 PUT /api/procurement/requests/{id}/approve Body: {"approved": true, "opinion": "同意"}

    Step 4: 执行采购 PUT /api/procurement/requests/{id}/execute Body: {"completed": true, "result": "已完成采购"}

    Step 5: 验收 PUT /api/procurement/requests/{id}/acceptance

    7. 文档上传审核流程

    Step 1: 上传文档
      POST /api/technical-documents
      Body (form-data):
        file: <文件>
        title: "资料标题"
        category: "技术资料"
        asset_code: "xxx"

    Step 2: 审核文档 POST /api/technical-documents/{id}/review Body: {"status": "approved", "comment": "审核通过"}

    Step 3: 创建分享链接 POST /api/technical-documents/{id}/share Body: {"expires_days": 30, "supplier_name": "供应商"}

    Step 4: AI 问答 POST /api/technical-documents/ai/ask Body: {"question": "问题", "document_ids": [ID1, ID2]}

    8. 预防性维护流程(新版维护计划)

    Step 1: 创建维护计划
      POST /api/maintenance/plans
      Body: {
        "plan_name": "CT机年度维护",
        "asset_code": "xxx",
        "maintenance_type": "预防性维护",
        "cycle_type": "year",
        "cycle_value": 1,
        "trigger_type": "time",
        "responsible_person": "负责人",
        "next_maintenance_date": "2027-01-01"
      }

    Step 2: 配置提醒 POST /api/maintenance/reminders/config Body: { "plan_id": 计划ID, "reminder_days": 7, "reminder_types": ["email", "sms"], "recipient": "工程师" }

    Step 3: 检查待执行维护 GET /api/maintenance/reminders/check

    Step 4: 发送维护提醒 POST /api/maintenance/reminders/send Body: {"plan_id": 计划ID, "reminder_type": "email"}

    Step 5: 执行维护 POST /api/maintenance/plans/{id}/complete Body: { "maintenance_date": "2026-04-01", "maintenance_person": "张三", "actual_hours": 4, "parts_replaced": "滤网", "maintenance_result": "正常", "maintenance_cost": 500 }

    Step 6: 查看维护历史 GET /api/maintenance/plans/{id}/history

    Step 7: 查看维修工单列表 GET /api/maintenance/workorders?status=pending

    Step 8: 创建维修工单 POST /api/maintenance/workorders Body: { "title": "设备维修", "asset_code": "xxx", "priority": "critical", "description": "故障描述", "estimated_hours": 24 }

    Step 9: 分配工单 POST /api/maintenance/workorders/{id}/assign Body: {"assigned_to": "李四", "assignee_name": "李四"}

    Step 10: 开始工单 POST /api/maintenance/workorders/{id}/start

    Step 11: 完成工单 POST /api/maintenance/workorders/{id}/complete Body: { "work_content": "维修完成", "actual_hours": 20, "labor_cost": 2000, "materials": [{"name": "球管", "quantity": 1, "cost": 148000}] }

    Step 12: 关闭工单 POST /api/maintenance/workorders/{id}/close Body: {"close_reason": "维修完成", "remark": "已正常使用"}

    9. IoT 设备注册与数据上报

    Step 1: 注册 IoT 设备
      POST /api/iot/devices
      Body: {
        "device_name": "温湿度传感器-001",
        "device_type": "environment_sensor",
        "device_id": "ENV-001",
        "asset_code": "ASSET-001",
        "manufacturer": "小米"
      }

    Step 2: 上报设备位置 POST /api/iot/location/assets/{assetCode}/location Body: {"latitude": 31.23, "longitude": 121.47, "location_code": "L001"}

    Step 3: 批量上报区域定位 POST /api/iot/zone-location/ingest/batch Body: { "events": [ { "device_id": "BEACON-001", "asset_code": "ASSET-001", "event_time": "2026-04-01T10:00:00Z", "location_code": "L001", "rssi": -65 } ] }

    Step 4: 查询最新位置 GET /api/iot/zone-location/assets/{assetCode}/latest

    Step 5: 查询位置历史 GET /api/iot/location/assets/{assetCode}/location/history

    10. 质检记录流程

    Step 1: 创建计量记录
      POST /api/quality-control/metrology
      Body: {
        "asset_code": "xxx",
        "metrology_type": "年度计量",
        "metrology_date": "2026-04-01",
        "result": "合格"
      }

    Step 2: 创建质量控制记录 POST /api/quality-control/quality-control Body: { "asset_code": "xxx", "qc_type": "性能检测", "qc_date": "2026-04-01", "result": "合格", "finding": "无异常" }

    Step 3: 查询质检历史 GET /api/quality-control/asset/{assetCode}/history

    Step 4: 统计查询 GET /api/quality-control/metrology/statistics GET /api/quality-control/quality-control/statistics


    🔍 查询决策树

    "查某类设备"问题

    用户要查某类设备(未限定科室)
      │
      └─ GET /api/assets?search=<设备名称>&pageSize=50 ✅
         (不要用 keyword 参数,会被忽略返回全量28291条数据)
    

    "查询科室资产"问题 ⚠️ 重要

    用户要查某科室资产(如"检验科资产"、"病理科资产")
      │
      ├─ ⚠️ 陷阱1:department参数只能精确匹配 department 字段
      │         科室信息也可能存在 location 字段中
      │         例:"检验科"资产在 department="检验科" 有543条
      │                     在 location="检验科(崇山)" 有12条
      │
      ├─ ⚠️ 陷阱2:location参数也只能精确匹配
      │         例:location=检验科 返回12条(含括号变体仍只有12条)
      │
      └─ ✅ 正确做法:
           方案A(精确):同时查询 department=科室名 和 location=科室名,合并去重
           方案B(完整):全量扫描,在代码中过滤 department / location / department_new 字段
           注:department字段有数据(不是全量),location字段数据较少但仍需覆盖
    

    "查询调配记录"问题

    用户要查询调配
      │
      └─ GET /api/transfer 或 GET /api/assets/transfer-requests
    

    "查询盘点状态"问题

    用户要查盘点
      │
      ├─ 盘点计划列表: GET /api/inventory-plans         # 有效,但当前租户下可能无数据
      ├─ 盘点任务列表: GET /api/inventory-tasks         # 有效,但当前租户下可能无数据
      ├─ 盘点差异记录: GET /api/inventory-discrepancies # 有效,但当前租户下可能无数据
      │
      └─ 盘点详情: GET /api/inventory/{id}             # ⚠️ 有SQL BUG,返回500错误
    

    "查询维修记录"问题

    用户要查维修
      │
      ├─ 维修申请: GET /api/maintenance/requests
      ├─ 维修工单: GET /api/maintenance/workorders
      └─ 维修日志: GET /api/maintenance/logs
    

    "查询资产详情"问题

    已知资产 ID(数字)
      └─ GET /api/assets/{id}  (id 为数字 ID)

    已知资产编码(asset_code) └─ GET /api/assets/asset_code/{asset_code} 或先 GET /api/assets?search= 找到 id

    ⚠️ 全量扫描规范(适用于全面统计场景)

    当用户要求"全院某类资产统计"、科室资产统计等需要完整数据时:

    1. 分页遍历:总资产 28291 条,每页 300 条,共 95 页
       → 必须遍历所有页,不能只取前几页

    2. 关键词过滤:在 Python 脚本中遍历所有资产,对所有文本字段 (asset_name / location / department / use_department / department_new 等) 进行关键词匹配

    3. 科室查询示例(以"检验科"为例): - ❌ 错误:只查 department='检验科' → 漏掉 415 件 - ✅ 正确:遍历所有资产,对所有字段匹配 '检验科' → 匹配到 550 件(分布在 location/department 等多字段)

    4. 统计输出: - 按 location 分组汇总(location 含科室信息最多) - 计算每组数量、总价值、状态分布 - 输出高价值资产(>5万或>10万) - 输出品牌/类型分布


    📖 常用 API 调用示例

    资产操作

    # 资产列表(模糊搜索)
    bash scripts/assethub_api.sh request GET "/assets?page=1&pageSize=20&search=监护仪"

    ⚠️ 按科室查询资产——重要提醒:

    department 参数只能精确匹配 department 字段(需 URL 编码中文)

    科室信息大量存储在 location / use_department / department_new 字段

    如需完整科室资产,必须同时查询 department 和 location 再合并去重

    bash scripts/assethub_api.sh request GET "/assets?page=1&pageSize=20&department=%E6%A3%80%E9%AA%8C%E7%A7%91"

    科室名完整查询(同时匹配 department + location 字段,Python脚本)

    python3 << 'PYEOF' import urllib.request, json, sys, urllib.parse

    session = json.loads(open('/tmp/assethub-claw-session.json').read()) token = session['token']; tenant_id = session['tenant_id'] base = "http://192.168.1.111:5183/api"

    def fetch(path): url = f"{base}{path}" req = urllib.request.Request(url, headers={ "Authorization": f"Bearer {token}", "Tenant-ID": str(tenant_id) }) with urllib.request.urlopen(req, timeout=30) as resp: return json.loads(resp.read())

    DEPT = sys.argv[1] if len(sys.argv) > 1 else "内科" seen = {} for field in ["department", "location"]: data = fetch(f"/assets?page=1&pageSize=1&{field}={urllib.parse.quote(DEPT)}") total = data.get("data", {}).get("pagination", {}).get("total", 0) if total > 0: page_count = min((total + 199) // 200, 50) for p in range(1, page_count + 1): for a in fetch(f"/assets?page={p}&pageSize=200&{field}={urllib.parse.quote(DEPT)}").get("data",{}).get("list",[]): key = a.get("id") if key and key not in seen: seen[key] = a

    print(f"科室「{DEPT}」共 {len(seen)} 条资产(合并 department + location)") for a in list(seen.values())[:10]: print(f" [{a.get('id')}] {a.get('asset_name')} | {a.get('department')} | {a.get('location')}") PYEOF

    资产列表(按状态筛选)

    bash scripts/assethub_api.sh request GET "/assets?page=1&pageSize=20&status=在用"

    资产详情

    bash scripts/assethub_api.sh request GET "/assets/123"

    创建资产(支持 department_new 科室编码字段)

    bash scripts/assethub_api.sh request POST "/assets" '{ "asset_code": "ZY20260402001", "asset_name": "医用 CT 扫描仪", "category_id": 1, "purchase_price": 5000000, "status": "在用", "department_new": "DEPT-001", "department_id": 3 }'

    更新资产(支持 department_new 字段)

    bash scripts/assethub_api.sh request PUT "/assets/123" '{ "asset_name": "医用 CT 扫描仪(新)", "status": "维修", "department_new": "DEPT-002" }'

    资产变更日志

    bash scripts/assethub_api.sh request GET "/assets/123/change-logs"

    导出资产

    bash scripts/assethub_api.sh request GET "/assets/export?status=在用"

    获取全部资产(无分页,直接返回全部数据,适用于统计分析)

    bash scripts/assethub_api.sh request GET "/assets/all?search=CT" bash scripts/assethub_api.sh request GET "/assets/all?department_new=DEPT-001"

    获取资产详情(支持 id 或 asset_code)

    bash scripts/assethub_api.sh request GET "/assets/123" bash scripts/assethub_api.sh request GET "/assets/asset_code/CT-001"

    创建资产(支持 department_new 字段)

    bash scripts/assethub_api.sh request POST "/assets" '{ "asset_code": "ZY20260402001", "asset_name": "医用 CT 扫描仪", "category_id": 1, "purchase_price": 5000000, "status": "在用", "department_new": "DEPT-001" }'

    更新资产(支持 department_new 字段)

    bash scripts/assethub_api.sh request PUT "/assets/123" '{ "asset_name": "医用 CT 扫描仪(新)", "status": "维修", "department_new": "DEPT-002" }'

    资产变更日志

    bash scripts/assethub_api.sh request GET "/assets/123/change-logs"

    获取资产分类列表

    bash scripts/assethub_api.sh request GET "/assets/categories"

    获取资产统计(总数、原值、净值等)

    bash scripts/assethub_api.sh request GET "/assets/statistics/overview" bash scripts/assethub_api.sh request GET "/assets/statistics/age-distribution"

    获取部门统计

    bash scripts/assethub_api.sh request GET "/statistics/department"

    获取价值统计

    bash scripts/assethub_api.sh request GET "/statistics/value"

    维修管理

    维修申请状态流转

    维修申请从创建到完成经历以下状态:

    [新建/待审批] → [已批准] → [维修中] → [已完成]
         ↓
      [已拒绝]     (维修过程中可暂停)
    

  • 待审批:提交后等待管理员审批(API筛选用 status=待审批
  • 已批准:审批通过,等待派工(API筛选用 status=已批准
  • 维修中:维修人员已开始处理(API筛选用 status=维修中
  • 已完成:维修完成(API筛选用 status=已完成
  • 已拒绝:审批未通过(API筛选用 status=已拒绝
  • 查看维修申请详情

    # 查看单个维修申请详情(包含状态、审批意见、维修人员等)
    bash scripts/assethub_api.sh request GET "/maintenance/requests/{request_id}"

    维修工单列表(维修执行层)

    bash scripts/assethub_api.sh request GET "/maintenance/workorders?page=1&pageSize=20"

    维修记录日志(包含维修过程详情)

    bash scripts/assethub_api.sh request GET "/maintenance/logs?request_id={request_id}"

    维修状态跟踪决策树

    报修后查不到记录?
      └─→ 用 request_no 或 asset_code 查询:
          bash scripts/assethub_api.sh request GET "/maintenance/requests?asset_code=000000555"
      └─→ 确认 status 字段值(API筛选请用中文,如 status=待审批):

    状态一直停留在"待审批"? └─→ 超级管理员直接审批: bash scripts/assethub_api.sh request POST "/maintenance/requests/{id}/approve" \ '{"approved": true, "opinion": "同意维修"}'

    状态是"已批准"但没人来修? └─→ 查看是否有维修人员被分配: GET /maintenance/requests/{id} 检查 repair_person 字段 └─→ 创建维修工单(派工): POST /maintenance/workorders '{"request_id": 123, "repair_person": "张三"}'

    想查某台设备的维修历史? └─→ GET /maintenance/logs?asset_code=000000555 └─→ 或 GET /maintenance/requests?asset_code=000000555

    常用维修操作命令

    # 维修申请列表
    bash scripts/assethub_api.sh request GET "/maintenance/requests?page=1&pageSize=20"

    维修申请列表(按状态,注意状态值必须用中文)

    bash scripts/assethub_api.sh request GET "/maintenance/requests?status=待审批&pageSize=20"

    创建维修申请(AI 安全入口,一次完成,无需二次确认)

    注意:curl 直接调用时需添加 Idempotency-Key Header

    bash scripts/assethub_api.sh request POST "/maintenance/ai/submit-request" '{ "asset_code": "CT-001", "issue_description": "球管打火,报警 E01", "fault_description": "球管打火,报警 E01", "fault_level": "紧急", "priority": "critical", "request_department": "放射科", "contact_phone": "13800138000", "source": "assetclaw", "intent": "repair_request" }'

    直接 curl 调用(需手动加 Idempotency-Key)

    curl -sS -X POST "http://192.168.1.111:5183/api/maintenance/ai/submit-request" \ -H "Authorization: Bearer " \ -H "X-Tenant-ID: " \ -H "Content-Type: application/json" \ -H "Idempotency-Key: op-$(date +%s)-$RANDOM" \ -d '{"asset_code":"CT-001","fault_description":"球管打火,报警 E01","issue_description":"球管打火,报警 E01","fault_level":"紧急","priority":"critical","request_department":"放射科","contact_phone":"13800138000","source":"assetclaw","intent":"repair_request"}'

    审批维修申请

    bash scripts/assethub_api.sh request POST "/maintenance/requests/123/approve" '{ "approved": true, "opinion": "同意维修" }'

    注:curl 直接调用时需添加 Idempotency-Key Header

    开始执行维修

    bash scripts/assethub_api.sh request POST "/maintenance/requests/123/start" '{ "repair_person": "李四" }'

    注:curl 直接调用时需添加 Idempotency-Key Header

    完成维修

    bash scripts/assethub_api.sh request POST "/maintenance/requests/123/complete" '{ "repair_content": "更换球管,清理内部灰尘,校准参数", "repair_cost": 150000, "parts_replaced": "CT球管", "repair_end_date": "2026-04-03" }'

    注:curl 直接调用时需添加 Idempotency-Key Header

    维修工单列表

    bash scripts/assethub_api.sh request GET "/maintenance/workorders?page=1&pageSize=20"

    创建维修工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders" '{ "title": "CT 设备故障维修", "asset_code": "CT-001", "priority": "critical", "description": "球管老化,需要更换", "estimated_hours": 24 }'

    分配维修工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/123/assign" '{ "assigned_to": "李四", "assignee_name": "李四" }'

    完成维修工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/123/complete" '{ "work_content": "更换球管完成", "actual_hours": 20, "labor_cost": 2000, "outsourcing_cost": 0, "materials": [{"name": "球管", "quantity": 1, "cost": 148000}] }'

    维修日志列表

    bash scripts/assethub_api.sh request GET "/maintenance/logs?page=1&pageSize=20"

    创建维修日志

    bash scripts/assethub_api.sh request POST "/maintenance/logs" '{ "asset_code": "ZY2020000122", "maintenance_type": "故障维修", "maintenance_date": "2026-04-01", "maintenance_person": "张三", "maintenance_content": "更换碳纤维骨科牵引架轴承", "maintenance_duration": 2, "parts_replaced": "轴承", "maintenance_cost": 500 }'

    维修统计

    bash scripts/assethub_api.sh request GET "/maintenance/statistics?start_date=2026-01-01&end_date=2026-04-01"

    维修效率统计

    bash scripts/assethub_api.sh request GET "/maintenance/efficiency/overview"

    维修费用分析

    bash scripts/assethub_api.sh request GET "/maintenance/costs/analysis"

    调配/闲置/报废

    # 调配申请列表
    bash scripts/assethub_api.sh request GET "/transfer?page=1&pageSize=20"

    发起调配申请

    bash scripts/assethub_api.sh request POST "/transfer" '{ "asset_code": "XXX-001", "reason": "科室合并,需调拨设备", "to_department": "心内科" }'

    审批调配

    bash scripts/assethub_api.sh request PUT "/transfer/123/approve" '{ "approved": true, "opinion": "同意" }'

    执行调配完成

    bash scripts/assethub_api.sh request PUT "/transfer/123/complete"

    闲置资产列表

    bash scripts/assethub_api.sh request GET "/idle?page=1&pageSize=20"

    闲置资产列表(新接口,带更多筛选参数)

    bash scripts/assethub_api.sh request GET "/idle/assets?page=1&pageSize=20&status=published"

    发布闲置

    bash scripts/assethub_api.sh request POST "/idle" '{ "asset_code": "XXX-001", "publish_person": "王五" }'

    发布闲置资产(新接口)

    bash scripts/assethub_api.sh request POST "/idle/publish" '{ "asset_code": "XXX-001", "publish_person": "王五", "publish_reason": "科室合并" }'

    调配闲置资产

    bash scripts/assethub_api.sh request PUT "/idle/123/allocate" '{ "target_department": "放射科", "allocate_date": "2026-04-02" }'

    取消闲置发布

    bash scripts/assethub_api.sh request PUT "/idle/123/cancel"

    闲置资产统计

    bash scripts/assethub_api.sh request GET "/idle/statistics"

    调配申请列表(注意:路径已变更)

    bash scripts/assethub_api.sh request GET "/assets/transfer-requests?page=1&pageSize=20"

    发起调配申请

    bash scripts/assethub_api.sh request POST "/assets/transfer-requests" '{ "asset_code": "XXX-001", "reason": "科室合并,需调拨设备", "to_department": "心内科" }'

    审批调配申请

    bash scripts/assethub_api.sh request POST "/assets/transfer-requests/123/approve" '{ "approved": true, "opinion": "同意" }'

    执行调配完成

    bash scripts/assethub_api.sh request PUT "/transfer/123/complete"

    调配统计

    bash scripts/assethub_api.sh request GET "/transfer/statistics"

    报废申请列表

    bash scripts/assethub_api.sh request GET "/scrapping?page=1&pageSize=20"

    创建报废申请

    bash scripts/assethub_api.sh request POST "/scrapping" '{ "asset_code": "OLD-CT-001", "asset_name": "旧 CT 扫描仪", "applicant": "张三", "scrapping_reason": "设备老旧,无法维修", "estimated_value": 5000 }'

    审批报废

    bash scripts/assethub_api.sh request POST "/scrapping/123/approve" '{ "approved": true, "opinion": "同意报废" }'

    完成报废

    bash scripts/assethub_api.sh request POST "/scrapping/123/complete"

    盘点

    # 盘点计划列表
    bash scripts/assethub_api.sh request GET "/inventory-plans?page=1&pageSize=20"

    创建盘点计划

    bash scripts/assethub_api.sh request POST "/inventory-plans" '{ "plan_name": "2026年上半年度设备盘点", "plan_no": "PD-2026-001", "start_date": "2026-04-01", "end_date": "2026-04-30", "remark": "全院资产盘点" }'

    激活盘点计划

    bash scripts/assethub_api.sh request PUT "/inventory-plans/123/activate"

    盘点任务列表

    bash scripts/assethub_api.sh request GET "/inventory-tasks?page=1&pageSize=20"

    创建盘点任务

    bash scripts/assethub_api.sh request POST "/inventory-tasks" '{ "inventory_plan_id": 123, "task_name": "放射科室盘点任务", "assignee": "李四", "assignee_name": "李四", "location": "放射科", "department_code": "DEPT-001" }'

    开始盘点

    bash scripts/assethub_api.sh request PUT "/inventory-tasks/123/start"

    完成盘点

    bash scripts/assethub_api.sh request PUT "/inventory-tasks/123/complete" '{ "actual_count": 50, "remark": "部分设备位置有调整" }'

    盘点差异列表

    bash scripts/assethub_api.sh request GET "/inventory-discrepancies?page=1&pageSize=20"

    处理盘点差异

    bash scripts/assethub_api.sh request PUT "/inventory-discrepancies/123/handle" '{ "handling_status": "已处理", "handling_method": "正常", "handling_notes": "已确认位置正确" }'

    批量处理盘点差异

    bash scripts/assethub_api.sh request POST "/inventory-discrepancies/batch-handle" '{ "ids": [1, 2, 3], "handling_status": "已处理", "handling_method": "正常" }'

    完成盘点计划

    bash scripts/assethub_api.sh request PUT "/inventory-plans/123/complete"

    取消盘点计划

    bash scripts/assethub_api.sh request PUT "/inventory-plans/123/cancel"

    采购/质检/验收

    # 采购申请列表
    bash scripts/assethub_api.sh request GET "/procurement/requests?page=1&pageSize=20"

    创建采购申请

    bash scripts/assethub_api.sh request POST "/procurement/requests" '{ "title": "迈瑞监护仪采购", "department": "心内科", "applicant": "张三", "budget": 150000, "remark": "科室新增需要" }'

    审批采购

    bash scripts/assethub_api.sh request PUT "/procurement/requests/123/approve" '{ "approved": true, "opinion": "同意采购" }'

    执行采购

    bash scripts/assethub_api.sh request PUT "/procurement/requests/123/execute" '{ "completed": true, "result": "已完成采购" }'

    验收

    bash scripts/assethub_api.sh request PUT "/procurement/requests/123/acceptance"

    计量记录列表

    bash scripts/assethub_api.sh request GET "/quality-control/metrology?page=1&pageSize=20"

    创建计量记录

    bash scripts/assethub_api.sh request POST "/quality-control/metrology" '{ "asset_code": "XXX-001", "metrology_type": "年度计量", "metrology_date": "2026-04-01", "result": "合格" }'

    质量控制记录列表

    bash scripts/assethub_api.sh request GET "/quality-control/quality-control?page=1&pageSize=20"

    创建质量控制记录

    bash scripts/assethub_api.sh request POST "/quality-control/quality-control" '{ "asset_code": "XXX-001", "qc_type": "年度质检", "qc_date": "2026-04-01", "qc_person": "李四", "result": "合格", "finding": "无异常" }'

    质检统计

    bash scripts/assethub_api.sh request GET "/quality-control/statistics"

    验收记录列表

    bash scripts/assethub_api.sh request GET "/acceptance/records?page=1&pageSize=20"

    创建验收记录

    bash scripts/assethub_api.sh request POST "/acceptance/records" '{ "asset_code": "XXX-001", "acceptance_date": "2026-04-01", "acceptor": "张三", "result": "合格", "finding": "无异常" }'

    文档

    # 文档列表
    bash scripts/assethub_api.sh request GET "/technical-documents?page=1&pageSize=20&keyword=CT"

    文档列表(按分类)

    bash scripts/assethub_api.sh request GET "/technical-documents?category=技术资料&pageSize=20"

    上传文档(需要 form-data,curl 示例)

    curl -sS -X POST "http://192.168.1.111:5183/api/technical-documents" \ -H "Authorization: Bearer " \ -F "file=@/path/to/file.pdf" \ -F "title=设备操作手册" \ -F "category=操作手册" \ -F "asset_code=XXX-001"

    审核文档

    bash scripts/assethub_api.sh request POST "/technical-documents/123/review" '{ "status": "approved", "comment": "审核通过" }'

    创建文档分享

    bash scripts/assethub_api.sh request POST "/technical-documents/123/share" '{ "expires_days": 30, "supplier_name": "供应商名称" }'

    文档评论

    bash scripts/assethub_api.sh request POST "/technical-documents/enhanced/documents/123/comments" '{ "content": "文档内容有误,请更正" }'

    收藏文档

    bash scripts/assethub_api.sh request POST "/technical-documents/enhanced/documents/123/favorite"

    AI 问答

    bash scripts/assethub_api.sh request POST "/technical-documents/ai/ask" '{ "question": "这台设备的维护周期是多久?", "document_ids": [1, 2, 3] }'

    AI 搜索

    bash scripts/assethub_api.sh request POST "/technical-documents/ai/search" '{ "query": "CT 球管维护" }'

    文档分类列表

    bash scripts/assethub_api.sh request GET "/technical-documents/enhanced/categories"

    文档标签列表

    bash scripts/assethub_api.sh request GET "/technical-documents/enhanced/tags"

    预防性维护

    # 维护计划列表
    bash scripts/assethub_api.sh request GET "/maintenance/plans?page=1&pageSize=20"

    创建维护计划

    bash scripts/assethub_api.sh request POST "/maintenance/plans" '{ "plan_name": "CT机年度维护", "asset_code": "CT-001", "maintenance_type": "预防性维护", "cycle_type": "year", "cycle_value": 1, "trigger_type": "time", "responsible_person": "李工程师", "next_maintenance_date": "2027-01-01" }'

    配置维护提醒

    bash scripts/assethub_api.sh request POST "/maintenance/reminders/config" '{ "plan_id": 123, "reminder_days": 7, "reminder_types": ["email", "sms"], "recipient": "李工程师" }'

    发送维护提醒

    bash scripts/assethub_api.sh request POST "/maintenance/reminders/send" '{ "plan_id": 123, "reminder_type": "email" }'

    检查维护提醒

    bash scripts/assethub_api.sh request GET "/maintenance/reminders/check"

    完成维护计划

    bash scripts/assethub_api.sh request POST "/maintenance/plans/123/complete" '{ "maintenance_date": "2026-04-01", "maintenance_person": "李工程师", "actual_hours": 4, "parts_replaced": "滤网", "maintenance_result": "正常", "maintenance_cost": 500 }'

    维护计划历史

    bash scripts/assethub_api.sh request GET "/maintenance/plans/123/history"

    维修模板列表

    bash scripts/assethub_api.sh request GET "/maintenance/templates?page=1&pageSize=20"

    维修日志列表

    bash scripts/assethub_api.sh request GET "/maintenance/logs?page=1&pageSize=20" bash scripts/assethub_api.sh request GET "/maintenance/logs?asset_code=CT-001&pageSize=20"

    创建维修日志

    bash scripts/assethub_api.sh request POST "/maintenance/logs" '{ "asset_code": "ZY2020000122", "maintenance_type": "故障维修", "maintenance_date": "2026-04-01", "maintenance_person": "张三", "maintenance_content": "更换碳纤维骨科牵引架轴承", "maintenance_duration": 2, "parts_replaced": "轴承", "maintenance_cost": 500 }'

    获取维修模板列表

    bash scripts/assethub_api.sh request GET "/maintenance/templates"

    获取维修效率统计

    bash scripts/assethub_api.sh request GET "/maintenance/efficiency"

    ========== 维护计划(预防性维护)==========

    维护计划列表

    bash scripts/assethub_api.sh request GET "/maintenance/plans?page=1&pageSize=20" bash scripts/assethub_api.sh request GET "/maintenance/plans?status=active&pageSize=20"

    获取维护计划详情

    bash scripts/assethub_api.sh request GET "/maintenance/plans/{id}"

    创建维护计划

    bash scripts/assethub_api.sh request POST "/maintenance/plans" '{ "plan_name": "CT机年度维护", "asset_code": "CT-001", "maintenance_type": "预防性维护", "cycle_type": "year", "cycle_value": 1, "trigger_type": "time", "responsible_person": "李工程师", "next_maintenance_date": "2027-01-01" }'

    更新维护计划

    bash scripts/assethub_api.sh request PUT "/maintenance/plans/{id}" '{ "plan_name": "CT机年度维护(更新)", "responsible_person": "王工程师" }'

    完成维护计划

    bash scripts/assethub_api.sh request POST "/maintenance/plans/{id}/complete" '{ "maintenance_date": "2026-04-01", "maintenance_person": "李工程师", "actual_hours": 4, "parts_replaced": "滤网", "maintenance_result": "正常", "maintenance_cost": 500 }'

    删除维护计划

    bash scripts/assethub_api.sh request DELETE "/maintenance/plans/{id}"

    获取维护计划历史

    bash scripts/assethub_api.sh request GET "/maintenance/plans/{id}/history"

    ========== 维修提醒 ==========

    提醒列表

    bash scripts/assethub_api.sh request GET "/maintenance/reminders?page=1&pageSize=20"

    配置维护提醒

    bash scripts/assethub_api.sh request POST "/maintenance/reminders/config" '{ "plan_id": 123, "reminder_days": 7, "reminder_types": ["email", "sms"], "recipient": "李工程师" }'

    发送维护提醒

    bash scripts/assethub_api.sh request POST "/maintenance/reminders/send" '{ "plan_id": 123, "reminder_type": "email" }'

    检查维护提醒(查看即将到期的维护任务)

    bash scripts/assethub_api.sh request GET "/maintenance/reminders/check"

    ========== 维修工单 ==========

    维修工单列表

    bash scripts/assethub_api.sh request GET "/maintenance/workorders?page=1&pageSize=20" bash scripts/assethub_api.sh request GET "/maintenance/workorders?status=pending&pageSize=20" bash scripts/assethub_api.sh request GET "/maintenance/workorders?asset_code=CT-001"

    获取维修工单详情

    bash scripts/assethub_api.sh request GET "/maintenance/workorders/{id}"

    创建维修工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders" '{ "title": "CT 设备故障维修", "asset_code": "CT-001", "priority": "critical", "description": "球管老化,需要更换", "estimated_hours": 24 }'

    分配维修工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/{id}/assign" '{ "assigned_to": "李四", "assignee_name": "李四" }'

    开始执行工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/{id}/start" '{ "actual_start_time": "2026-04-01 09:00:00" }'

    完成维修工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/{id}/complete" '{ "work_content": "更换球管完成", "actual_hours": 20, "labor_cost": 2000, "outsourcing_cost": 0, "materials": [{"name": "球管", "quantity": 1, "cost": 148000}] }'

    关闭工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/{id}/close" '{ "close_reason": "维修完成", "remark": "已正常使用" }'

    取消工单

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/{id}/cancel" '{ "cancel_reason": "设备已报废" }'

    添加工单物料

    bash scripts/assethub_api.sh request POST "/maintenance/workorders/{id}/materials" '{ "materials": [ {"name": "球管", "quantity": 1, "cost": 148000}, {"name": "滤网", "quantity": 2, "cost": 500} ] }'

    维修申请列表

    bash scripts/assethub_api.sh request GET "/maintenance/requests?page=1&pageSize=20" bash scripts/assethub_api.sh request GET "/maintenance/requests?status=待审批&pageSize=20" bash scripts/assethub_api.sh request GET "/maintenance/requests?asset_code=CT-001"

    获取维修申请详情

    bash scripts/assethub_api.sh request GET "/maintenance/requests/{id}"

    创建维修申请(AI 安全入口,一次完成,无需二次确认)

    bash scripts/assethub_api.sh request POST "/maintenance/ai/submit-request" '{ "asset_code": "CT-001", "issue_description": "球管打火,报警 E01", "fault_description": "球管打火,报警 E01", "fault_level": "紧急", "priority": "critical", "request_department": "放射科", "contact_phone": "13800138000", "source": "assetclaw", "intent": "repair_request" }'

    审批维修申请

    bash scripts/assethub_api.sh request POST "/maintenance/requests/{id}/approve" '{ "approved": true, "opinion": "同意维修" }'

    开始执行维修

    bash scripts/assethub_api.sh request POST "/maintenance/requests/{id}/start" '{ "repair_person": "李四" }'

    完成维修

    bash scripts/assethub_api.sh request POST "/maintenance/requests/{id}/complete" '{ "repair_content": "更换球管,清理内部灰尘,校准参数", "repair_cost": 150000, "parts_replaced": "CT球管", "repair_end_date": "2026-04-03" }'

    折旧

    # 折旧列表
    bash scripts/assethub_api.sh request GET "/depreciation?page=1&pageSize=20"

    按部门折旧汇总

    bash scripts/assethub_api.sh request GET "/depreciation/summary/by-department"

    按月折旧趋势

    bash scripts/assethub_api.sh request GET "/depreciation/summary/by-month?months=12"

    按类型折旧汇总

    bash scripts/assethub_api.sh request GET "/depreciation/summary/by-type"

    计算折旧

    bash scripts/assethub_api.sh request POST "/depreciation/calculate" '{ "as_of_date": "2026-04-01" }'

    折旧方法列表

    bash scripts/assethub_api.sh request GET "/depreciation/methods"

    导出折旧报表

    bash scripts/assethub_api.sh request GET "/depreciation/export"

    部门/用户/角色

    # 部门树
    bash scripts/assethub_api.sh request GET "/departments/tree"

    部门列表

    bash scripts/assethub_api.sh request GET "/departments?page=1&pageSize=20"

    创建部门

    bash scripts/assethub_api.sh request POST "/departments" '{ "department_name": "放射科", "parent_code": "ROOT" }'

    用户列表

    bash scripts/assethub_api.sh request GET "/users?page=1&pageSize=20"

    创建用户

    bash scripts/assethub_api.sh request POST "/users" '{ "username": "zhangsan", "real_name": "张三", "password": "Password123", "role": "engineer", "email": "zhangsan@example.com", "phone": "13800138000" }'

    获取当前用户信息

    bash scripts/assethub_api.sh request GET "/users/me"

    角色列表

    bash scripts/assethub_api.sh request GET "/roles-permissions/roles"

    获取角色权限

    bash scripts/assethub_api.sh request GET "/roles-permissions/roles/engineer/permissions"

    更新角色权限

    bash scripts/assethub_api.sh request PUT "/roles-permissions/roles/engineer/permissions" '{ "permissions": ["asset.view", "asset.create", "maintenance.request"] }'

    获取角色菜单

    bash scripts/assethub_api.sh request GET "/roles-permissions/roles/engineer/menus"

    更新角色菜单

    bash scripts/assethub_api.sh request PUT "/roles-permissions/roles/engineer/menus" '{ "menus": ["assets", "maintenance", "inventory"] }'

    当前用户菜单权限

    bash scripts/assethub_api.sh request GET "/roles-permissions/user/menus"

    IoT/定位

    # IoT 设备列表
    bash scripts/assethub_api.sh request GET "/iot/devices?page=1&pageSize=20"

    注册 IoT 设备

    bash scripts/assethub_api.sh request POST "/iot/devices" '{ "device_name": "温湿度传感器-001", "device_type": "environment_sensor", "device_id": "ENV-001", "asset_code": "ASSET-001", "manufacturer": "小米", "model": "MHO-A400" }'

    上报设备定位数据

    bash scripts/assethub_api.sh request POST "/iot/location/assets/ASSET-001/location" '{ "latitude": 31.2304, "longitude": 121.4737, "altitude": 10, "battery_level": 85 }'

    批量上报区域定位

    bash scripts/assethub_api.sh request POST "/iot/zone-location/ingest/batch" '{ "events": [ { "device_id": "BEACON-001", "asset_code": "ASSET-001", "event_time": "2026-04-01T10:00:00Z", "location_code": "L001", "building_name": "门诊楼", "floor_number": 3, "area_name": "放射科", "rssi": -65, "battery_level": 85 } ] }'

    查询最新环境监测数据

    bash scripts/assethub_api.sh request GET "/iot/environment-monitoring/assets/ASSET-001/latest"

    查询资产位置历史

    bash scripts/assethub_api.sh request GET "/iot/location/assets/ASSET-001/location/history?start_time=2026-04-01&end_time=2026-04-02"

    资产绑定设备

    bash scripts/assethub_api.sh request POST "/asset-location/assets/ASSET-001/bind-device" '{ "device_id": "BEACON-001" }'

    查询区域定位管道健康状态

    bash scripts/assethub_api.sh request GET "/iot/zone-location/pipeline/health"

    查询设备类型列表

    bash scripts/assethub_api.sh request GET "/iot/devices/types"

    标签打印

    # 标签模板列表
    bash scripts/assethub_api.sh request GET "/asset-labels/templates?page=1&pageSize=20"

    创建标签模板

    bash scripts/assethub_api.sh request POST "/asset-labels/templates" '{ "name": "标准资产标签", "description": "包含资产编号、名称、位置", "width": 4, "height": 2, "dpi": 300, "fields": [ {"field_name": "asset_code", "label": "资产编号", "x": 0, "y": 0}, {"field_name": "asset_name", "label": "资产名称", "x": 0, "y": 20} ] }'

    批量生成 ZPL 标签

    bash scripts/assethub_api.sh request POST "/asset-labels/generate-zpl-batch" '{ "template_id": 1, "asset_codes": ["ASSET-001", "ASSET-002", "ASSET-003"], "quantity_per_asset": 1 }'

    测试打印机连接

    bash scripts/assethub_api.sh request POST "/asset-labels/printer/test-connection" '{ "printer_ip": "192.168.1.100", "printer_port": 9100, "timeout_ms": 5000 }'

    打印标签

    bash scripts/assethub_api.sh request POST "/asset-labels/print" '{ "template_id": 1, "asset_code": "ASSET-001", "printer_ip": "192.168.1.100", "printer_port": 9100, "quantity": 1, "print_timeout_ms": 10000, "retry_count": 3 }'

    告警

    # 智能告警列表
    bash scripts/assethub_api.sh request GET "/intelligent-alerts?page=1&pageSize=20"

    告警概览

    bash scripts/assethub_api.sh request GET "/intelligent-alerts/overview"

    处理告警

    bash scripts/assethub_api.sh request POST "/intelligent-alerts/123/handle" '{ "handle_result": "已确认并处理" }'

    标记告警为已读

    bash scripts/assethub_api.sh request POST "/intelligent-alerts/123/read"

    全部标记已读

    bash scripts/assethub_api.sh request POST "/intelligent-alerts/read-all"

    位置告警列表

    bash scripts/assethub_api.sh request GET "/location-alerts?page=1&pageSize=20"

    处理位置告警

    bash scripts/assethub_api.sh request PUT "/location-alerts/123/handle" '{ "handle_result": "已确认资产位置正常" }'

    批量处理位置告警

    bash scripts/assethub_api.sh request POST "/location-alerts/batch/handle" '{ "ids": [1, 2, 3], "handle_result": "已确认" }'

    位置告警统计

    bash scripts/assethub_api.sh request GET "/location-alerts/stats"

    审计/备份

    # 审计日志列表
    bash scripts/assethub_api.sh request GET "/audit-logs?page=1&pageSize=20"

    审计日志列表(按操作类型)

    bash scripts/assethub_api.sh request GET "/audit-logs?action_type=asset.create&pageSize=20"

    审计日志统计

    bash scripts/assethub_api.sh request GET "/audit-logs/stats?start_date=2026-01-01&end_date=2026-04-01"

    备份列表

    bash scripts/assethub_api.sh request GET "/backup?page=1&pageSize=20"

    创建备份

    bash scripts/assethub_api.sh request POST "/backup" '{ "description": "定期备份 2026-04-01" }'

    恢复备份

    bash scripts/assethub_api.sh request POST "/backup/123/restore" '{ "confirm": true }'

    仪表盘/统计

    # 仪表盘概览
    bash scripts/assethub_api.sh request GET "/dashboard"

    实时数据

    bash scripts/assethub_api.sh request GET "/dashboard/realtime"

    资产统计概览(含总数、原值、净值)

    bash scripts/assethub_api.sh request GET "/assets/statistics/overview"

    资产价值分布

    bash scripts/assethub_api.sh request GET "/analysis/value-distribution"

    资产使用年限分布

    bash scripts/assethub_api.sh request GET "/assets/statistics/age-distribution"

    折旧趋势

    bash scripts/assethub_api.sh request GET "/analysis/depreciation"

    风险仪表盘

    bash scripts/assethub_api.sh request GET "/risk/dashboard"

    合规状态

    bash scripts/assethub_api.sh request GET "/compliance/status"

    合规仪表盘统计

    bash scripts/assethub_api.sh request GET "/compliance/dashboard-stats"

    资产分类列表(用于下拉选择)

    bash scripts/assethub_api.sh request GET "/assets/categories"

    部门统计

    bash scripts/assethub_api.sh request GET "/statistics/department"

    价值统计(按分类、状态等维度)

    bash scripts/assethub_api.sh request GET "/statistics/value"

    调配统计

    bash scripts/assethub_api.sh request GET "/transfer/statistics"

    闲置统计

    bash scripts/assethub_api.sh request GET "/idle/statistics"

    模块配置

    # 模块列表
    bash scripts/assethub_api.sh request GET "/modules?page=1&pageSize=20"

    租户模块配置列表

    bash scripts/assethub_api.sh request GET "/module-configs/list"

    启用模块

    bash scripts/assethub_api.sh request POST "/module-configs/enable" '{ "module_id": "assets", "config": {} }'

    停用模块

    bash scripts/assethub_api.sh request POST "/module-configs/disable" '{ "module_id": "assets" }'

    获取单模块配置

    bash scripts/assethub_api.sh request GET "/module-configs/assets"

    更新模块配置

    bash scripts/assethub_api.sh request PUT "/module-configs/assets" '{ "enabled": true, "config": {"key": "value"} }'

    获取模块菜单权限

    bash scripts/assethub_api.sh request GET "/module-configs/assets/menus"

    批量更新模块菜单

    bash scripts/assethub_api.sh request PUT "/module-configs/assets/menus" '{ "menus": [ {"menu_key": "assets", "is_visible": true}, {"menu_key": "maintenance", "is_visible": true} ] }'

    模块版本历史

    bash scripts/assethub_api.sh request GET "/module-configs/assets/versions"

    创建模块版本备份

    bash scripts/assethub_api.sh request POST "/module-configs/assets/versions" '{ "change_log": "配置更新" }'

    回滚模块版本

    bash scripts/assethub_api.sh request POST "/module-configs/assets/rollback" '{ "version_id": 5 }'

    验证模块配置

    bash scripts/assethub_api.sh request GET "/module-configs/assets/validate"

    工作流

    # 获取默认工作流
    bash scripts/assethub_api.sh request GET "/workflow/default"

    获取工作流状态

    bash scripts/assethub_api.sh request GET "/workflow/states"

    获取迁移规则

    bash scripts/assethub_api.sh request GET "/workflow/transitions"

    执行状态迁移

    bash scripts/assethub_api.sh request POST "/workflow/transition/123" '{ "transition_id": 2, "reason": "设备报废" }'

    获取资产可执行状态迁移

    bash scripts/assethub_api.sh request GET "/assets/123/transitions"

    AI 分析

    # AI 故障分析
    bash scripts/assethub_api.sh request GET "/asset-ai-analysis/analysis-history?page=1&pageSize=20"

    分析单个资产

    bash scripts/assethub_api.sh request POST "/asset-ai-analysis/analyze-asset/CT-001" '{ "start_date": "2026-01-01", "end_date": "2026-04-01" }'

    批量分析资产

    bash scripts/assethub_api.sh request POST "/asset-ai-analysis/analyze-assets" '{ "asset_codes": ["CT-001", "CT-002"], "analysis_type": "fault_prediction" }'

    维修效率分析

    bash scripts/assethub_api.sh request GET "/maintenance/efficiency/overview"

    维修响应时间统计

    bash scripts/assethub_api.sh request GET "/maintenance/efficiency/response-time"

    工程师绩效统计

    bash scripts/assethub_api.sh request GET "/maintenance/efficiency/technician"

    资产使用频率

    bash scripts/assethub_api.sh request GET "/maintenance/efficiency/asset-frequency"

    维修类型分布

    bash scripts/assethub_api.sh request GET "/maintenance/analysis/type-distribution"

    维修费用趋势

    bash scripts/assethub_api.sh request GET "/maintenance/analysis/cost-trend"

    预测性维护

    bash scripts/assethub_api.sh request POST "/agent-mesh/intelligence/predictive-maintenance" '{ "asset_code": "CT-001", "days_ahead": 30 }'

    风险评分

    bash scripts/assethub_api.sh request POST "/agent-mesh/intelligence/risk-score" '{ "asset_code": "CT-001" }'

    健康指数

    bash scripts/assethub_api.sh request POST "/agent-mesh/intelligence/health-index" '{ "asset_code": "CT-001" }'

    维修 AI 对话初始化

    bash scripts/assethub_api.sh request POST "/maintenance/ai/init"

    维修 AI 发送消息

    bash scripts/assethub_api.sh request POST "/maintenance/ai/message" '{ "conversation_id": "conv-xxx", "message": "CT球管打火怎么办" }'

    库存管理

    # 库存记录列表
    bash scripts/assethub_api.sh request GET "/inventory?page=1&pageSize=20"

    创建库存记录

    bash scripts/assethub_api.sh request POST "/inventory" '{ "item_name": "球管", "category": "备件", "warehouse": "备件库", "location": "A区-01", "quantity": 5, "unit": "个", "remark": "CT备件" }'

    调整库存

    入库:

    bash scripts/assethub_api.sh request PUT "/inventory/123" '{ "adjust_type": "in", "quantity": 2, "reason": "新购入库" }'

    出库:

    bash scripts/assethub_api.sh request PUT "/inventory/123" '{ "adjust_type": "out", "quantity": 1, "reason": "维修使用" }'

    调整:

    bash scripts/assethub_api.sh request PUT "/inventory/123" '{ "adjust_type": "adj", "quantity": -1, "reason": "盘点调整" }'

    系统配置

    # 获取数据库配置
    bash scripts/assethub_api.sh request GET "/system-config/database"

    更新数据库配置

    bash scripts/assethub_api.sh request PUT "/system-config/database" '{ "host": "localhost", "port": 3306, "database": "assethub", "user": "root", "password": "newpassword" }'

    测试数据库连接

    bash scripts/assethub_api.sh request POST "/system-config/database/test"

    IoT Token 列表

    bash scripts/assethub_api.sh request GET "/system-config/iot-tokens"

    生成 IoT Token

    bash scripts/assethub_api.sh request POST "/system-config/iot-tokens/generate" '{ "name": "网关Token", "scopes": ["zone-location:write", "environment:write"] }'

    验证 IoT Token

    bash scripts/assethub_api.sh request POST "/system-config/iot-tokens/verify" '{ "token": "iot-xxx" }'

    获取 IoT Token 使用指南

    bash scripts/assethub_api.sh request GET "/system-config/iot-tokens/usage-guide"


    ⚠️ 重要兼容说明

    维修申请字段

  • 必填: asset_code + fault_description
  • 兼容旧文档: 可同时传 issue_description(与 fault_description 相同值)
  • 调配申请

  • 新版路径: POST /api/transfer
  • 旧版路径: POST /api/assets/{id}/transfer-apply(兼容 asset_code 参数)
  • 闲置发布

  • publish_person 必填
  • asset_codeasset_name 至少一个
  • 报废申请

  • 必填: asset_code, asset_name, applicant, scrapping_reason
  • 盘点计划

  • 新版路径: /inventory-plans(推荐)
  • 旧版路径: /inventory

  • 📤 输出格式规范

    查询结果统一用表格展示,字段包括:

  • 编号/ID、名称/标题、状态
  • 关联资产/部门/人员
  • 创建时间/更新时间
  • 关键数值(价格、数量、费用等)
  • 统计类查询应包含合计行和关键洞察。

    操作结果先展示操作内容,再展示回查确认结果。


    📍 常见设备名称映射

    | 用户说 | 系统资产名称 | |--------|------------| | 监护仪 | 插件式病人监护仪 | | 心电/心电图机 | 数字式多道心电图机、12导联心电图机等 | | 呼吸机 | 呼吸机 | | 注射泵 | 注射泵 | | 除颤仪 | 体外除颤监护仪 | | 血液透析 | 血液透析设备(血液透析滤过机) | | CT | CT机、16层CT机、64排螺旋CT等 | | 核磁共振 | 核磁共振成像设备(MRI) | | 车辆/机动车 | 救护车、轿车、客车、旅行车、核酸检测车、铲车、装载机、电动车(指机动车,非手推车) |


    📝 故障描述规范

    报修时的描述应尽量具体:

    | 规范 | 示例 | |------|------| | ✅ 正确 | "显示屏不亮,无法开机" | | ✅ 正确 | "心电导联无信号" | | ✅ 正确 | "CT球管打火,报警E01" | | ❌ 错误 | "坏了" / "不能用" / "故障" |


    🔢 状态值速查

    | 资源 | 状态值 | |------|--------| | 资产 | 在用 / 维修 / 闲置 / 调配中 / 报废 | | 维修申请 | pending / approved / in_progress / completed / cancelled | | 调配 | pending / approved / rejected / completed | | 盘点计划 | draft / active / completed / cancelled | | 盘点任务 | pending / in_progress / completed / cancelled | | 采购 | pending / approved / rejected / executed / completed | | 报废 | pending / approved / rejected / completed | | 质检结果 | 合格 / 不合格 / 待整改 | | 文档审核 | pending / approved / rejected |


    📝 经验教训(基于实际操作发现)

    2026-04-02 关键发现:科室资产多字段分布问题

    问题现象:

  • 查询"检验科资产"时,使用 department=检验科 参数只返回 0 条记录
  • 全量扫描(遍历所有页 + 所有文本字段)后,发现检验科实际有 550 件资产
  • 根本原因: AssetHub 的科室信息分散存储在多个字段:

  • department — 正式科室字段(很多资产此处为空)
  • location — 位置字段,包含大量科室信息(如"检验科(崇山)")
  • use_department — 使用科室字段
  • department_new — 新版科室字段
  • 经验: 1. 查询科室资产时,必须对所有文本字段做关键词匹配,不能依赖单一 department 参数 2. 全量扫描时需遍历所有页(总资产 28291 条 × 95 页) 3. 车辆识别需要排除"输液车/处置车/抢救车"等医用小型手推车

    2026-04-02 发现:API 安全机制与 AI 入口

    问题现象:

  • 直接调用 /maintenance/requests POST 无 Idempotency-Key → 返回"需要 Idempotency-Key"
  • 带 Idempotency-Key 调用普通端点 → 触发二次确认,返回 confirmToken
  • 带 Idempotency-Key 调用 AI 入口 /maintenance/ai/submit-request直接成功,无需二次确认
  • 经验: 1. 所有写操作必须带 Idempotency-Key: op-$(date +%s)-$RANDOM 2. 报修走 AI 安全入口 POST /maintenance/ai/submit-request,一次完成,不触发二次确认 3. 普通端点需两段式:第一次拿 confirmToken,第二次带 X-Risk-Confirm-Token 重放