-5. 如需工单、客户管理、卡片划拨或批次日志,请登录后在“办理”或“我的”查看获授权的入口;续费、变更与加油包暂未开放。
+5. 如果需要停复机、开通数据服务、套餐办理、预警或工单,请等待后续版本开放。
-
-
-## 登录与账号选择
+## 账号密码登录
1. 在需要账号数据的页面进入登录页,或在首页点击登录入口。
-
+
-2. 选择“密码登录”,输入已有手机号或用户名及密码,点击“登录”;或选择“验证码登录”,输入手机号,获取验证码时完成滑块验证,再输入收到的短信验证码登录。
+2. 输入已有账号和密码,完成页面要求的安全验证后点击“登录”。
-
+
3. 如果同一账号匹配多个登录身份,按页面提示选择本次要进入的账号。
4. 登录成功后返回原页面;设备页会按账号权限加载卡片数据。
-
+
-当前版本未开放注册、微信登录和找回密码。无法登录时请联系账号管理员或客服。
+当前版本不开放注册和微信登录。“忘记密码”页面会提示短信服务接入后开放,无法登录时请联系账号管理员或客服。
## 使用边界
+- 公开查询和排查结果仅供辅助判断,最终以运营商和业务系统状态为准。
- 未登录查询不会展示完整 IMSI、IMEI、APN、IP、套餐内部信息等受限字段。
- 请勿在查询、排查或反馈内容中提交身份证号、银行卡号等无关敏感信息;密码只应填写在登录表单中。
@@ -111,8 +96,4 @@ title: 小程序端使用手册
- [首页查卡、扫码与拍照](./home)
- [卡片详情](./devices)
- [卡片排查](./diagnosis)
-- [登录后办理概览](./business)
-- [客户管理与卡片划拨](./customers-and-allocation)
-- [工单服务](./work-orders)
-- [批次执行日志](./execution-logs)
-- [消息与个人中心](./messages-and-profile)
+- [常见问题](./faq)
diff --git a/docs/manual/web/api-and-logs.md b/docs/manual/web/api-and-logs.md
index 9b7b0ed..1b47516 100644
--- a/docs/manual/web/api-and-logs.md
+++ b/docs/manual/web/api-and-logs.md
@@ -8,13 +8,11 @@
页面显示本企业的企业 ID、企业名称、`appKey`(API 账号标识)和 `appSecret`(API 密钥),并提供复制按钮。接口鉴权和请求格式请配合 [OpenAPI 接口文档](/openapi/) 使用。
-页面或旧截图可能将应用标识标成 `appId` 或显示“APPID复制成功”,当前复制操作实际取的是 `appKey`。请按下方说明及目标接口版本区分字段,不根据旧按钮文案替换请求参数。
-
-**appKey ≠ appId**
-
+::: warning appKey ≠ appId
- **`appKey`** 和 **`appSecret`** 仅用于调用 `/openapi/v3/query/token` 换取 token
- **`appId`**(客户组织编码,如 `CUS-202601-0001`)由 token 接口返回,调用其他接口时在请求体中传入
- 不要把 `appKey` 当作 `appId` 使用,两者是不同的概念
+:::
### 安全要求
@@ -24,51 +22,32 @@
- 不同环境不要共用同一份配置文件。
- 怀疑泄露时立即停止相关调用并联系平台支持更换凭证。
-复制后粘贴到配置前,检查是否带入多余空格或换行。获取 token 失败时,先核对本企业的 appKey 与 appSecret 是否配套;后续请求失败时,按对应版本的接口文档核对 token、appId 和请求地址,不要混用不同版本的鉴权参数。
+复制后粘贴到配置前,检查是否带入多余空格或换行。接口返回鉴权失败时,先核对企业对应的 appId 与 appSecret 是否配套,再检查签名、时间戳和请求地址。
-## 执行日志
+## 执行日志(暂未开放)
**入口:** 左侧菜单 → **执行日志**。
-
-
批量续费、套餐变更、加油包、重启、停复机、划拨、达量断网等任务提交后,均应通过执行日志确认最终结果。
### 查询批次
-可按关键字、批次编号、批次类型、发起渠道、操作规模、输入方式、异步处理状态和创建时间查询。
-
-
-
-列表显示:
+可按关键字、批次编号、批次类型、异步处理状态和创建时间查询。列表显示:
- 批次编号和批次类型。
- 来源方式,如 Excel 或批量输入。
-- 发起渠道(如 Web、小程序或接口)及操作规模(单卡、批量);旧记录可能显示为未知,不能仅凭总数量推断来源。
- 运行结果和异步状态。
- 总数量、开始时间和结束时间。
点击批次编号可查看逐卡明细,包括行号、ICCID、MSISDN、IMSI、明细状态和异常原因。点击“查看”可查看批次概要、失败原因、源文件、结果文件和处理时间。
-划拨批次的概要还显示划拨单位和接收单位;若目标按每张卡分别指定,接收单位会提示在逐卡明细中查看。核对划拨结果时,先看批次单位,再查看每张卡的接收方和失败原因。
### 处理失败任务
1. 用提交时记录的批次号查询。
-2. 核对批次和逐卡状态。“待处理”“处理中”或“待核查”尚无确定结果,应先等待或请平台核实,不要重复提交。
+2. 确认批次已结束,避免把“处理中”误判为失败。
3. 点击批次号查看失败卡及异常原因。
-4. 有结果文件时下载核对;文件待生成、生成失败或暂无文件时,先查看逐卡明细。无文件或文件生成失败不代表卡片执行失败。
-5. 原批次结束后,只对确认失败且可修正的卡,核实当前卡片、套餐或归属状态后修正原因并重新提交,不要整批重复提交。划拨和出库还需按[结果有误时的处理步骤](./business-operations#划拨或出库结果有误时)核对。
+4. 下载结果文件,修正卡号、状态、套餐或模板数据。
+5. 只重提失败且可修正的卡,不要整批重复提交。
6. 无法处理的上游错误通过工单反馈,并附批次号和失败原因。
常见失败原因包括卡号不属于当前企业、卡状态不允许办理、套餐不匹配、余额不足、模板字段错误、上游超时或重复业务仍在处理中。
-
-## 接口资源与权限组(管理员)
-
-获授权管理员可通过“接口资源”维护接口名称、权限标识、请求方法、路径、版本及启停状态;通过“API 权限组”维护组名称、编码、状态和包含的接口资源。具体页面名称与分组以当前菜单为准。
-
-1. 在接口资源中按名称、版本和状态查询目标接口,确认方法、路径及权限标识与已部署接口一致。
-2. 在权限组中新增或编辑所需资源集合,核对启用状态后保存。
-3. 根据企业实际授权关系核对可访问范围;不要将持有 API 密钥理解为可调用全部接口。
-4. 变更后由获授权的接口调用方按对应 OpenAPI 文档验证,保留脱敏错误信息用于排查。
-
-配置资源或权限组不会自动新增后端接口实现。此类权限维护与普通用户复制本企业 API 凭证是不同操作。
diff --git a/docs/manual/web/business-operations.md b/docs/manual/web/business-operations.md
index dda8a9f..ca7862c 100644
--- a/docs/manual/web/business-operations.md
+++ b/docs/manual/web/business-operations.md
@@ -8,7 +8,7 @@
页面按“套餐及数据”“生命周期”“预警中心”展示业务入口。每个入口都有独立按钮权限,未授权的入口不会显示。
-展示的业务包括:
+可能出现的业务包括:
| 分类 | 业务 | 用途 |
| --- | --- | --- |
@@ -25,7 +25,7 @@
| 预警中心 | 流量预警配置 | 配置单卡流量阈值预警 |
| 预警中心 | 流量池预警配置 | 配置流量池阈值预警 |
-## 通用办理方式
+## 通用办理方式(部分开放)
不同业务会提供以下一种或多种数据来源:
@@ -33,32 +33,24 @@
- **批量输入:** 通常每行一个 ICCID;部分业务支持每行填写 `ICCID MSISDN IMSI`。
- **连续号段:** 填写 ICCID、MSISDN 或 IMSI 的起始值和结束值,适合连续卡段。
-当前页面提供的来源如下,不要把接口存在视为界面已提供入口:
-
-| 业务 | 当前页面来源 |
-| --- | --- |
-| 续费、加油包、开停数据、达量断网、重启、停复机、划拨、转销户 | Excel、批量输入 |
-| 变更套餐、退订、单卡预警 | Excel、批量输入、连续号段 |
-| 流量池预警 | Excel、批量输入,不支持连续号段 |
-
标准操作流程:
1. 选择业务入口和数据来源。
-2. 上传文件或输入卡号;需要预处理的业务先提交校验。
-3. 记录系统返回的批次号。直接提交型业务按页面确认后提交,不必寻找不存在的预处理步骤。
-4. 对预处理型业务,核对有效数量、失败数量、目标套餐、购买时长、生效方式、金额和余额等信息。
-5. 确认无误后提交原批次的正式任务。
+2. 上传文件或输入卡号,提交预处理。
+3. 记录系统返回的批次号。
+4. 核对有效数量、失败数量、目标套餐、购买时长、生效方式、金额和余额等信息。
+5. 确认无误后提交正式任务。
6. 前往“执行日志”查询批次最终状态和失败原因。
-### 提交前确认
-
+::: warning 提交前确认
批量任务可能影响通信、套餐、费用或卡生命周期。提交前应抽查卡号、目标企业、套餐编码、阈值、生效方式和付款方式。不要重复提交仍在处理中的批次。
+:::
-## 续费、变更与加油包
+## 续费、变更与加油包(暂未开放)
### 续费套餐
-支持 Excel 或批量输入。预处理后选择可续费套餐、续费年限、续费日期和可用付款方式。余额支付时必须确认余额充足;当前续费页顶层机构可按返回条件选择付款方式,非顶层机构使用余额支付。线下支付仅在实际允许且已完成相应确认时使用。
+支持 Excel 或批量输入。预处理后选择可续费套餐、续费年限、续费日期和付款方式。余额支付时必须确认余额充足;线下支付时按页面要求完成线下确认。
### 变更套餐
@@ -68,36 +60,27 @@
可选择“单卡加油包”或“流量池加油包”。单卡 Excel 需填写 ICCID 和加油包套餐编码;流量池 Excel 需填写流量池编码和套餐编码。预处理后核对数量、单价、总金额、付款账户和余额。
-## 生命周期和数据服务
+## 生命周期和数据服务(部分开放)
重启、自主停机、自主复机、开停数据、转销户和退订通常支持 Excel 或批量输入。生命周期任务提交后不会立即在列表全部完成,应通过批次号在执行日志中跟踪。
-
-
- 重启适合设备长时间不在线且卡状态正常的场景。
- 自主停机和关闭数据会中断通信,恢复前请确认业务窗口。
- 转销户通常不可逆或需要人工处理,提交前必须复核卡号。
- 划拨前确认目标企业,任务完成后卡的数据归属和可见范围会变化。
-**“开停数据”开关的是数据通信服务,不是 APN。** APN 目前只在[卡信息](./card-info)的会话信息、[智能诊断](./intelligent-diagnosis)的通信服务模块和通道测试结果中作为查询结果展示,业务受理没有单独的 APN 开停入口。需要变更 APN 相关配置时,先确认所属通道是否支持,不要用“开停数据”代替。
+## 达量断网批量配置(部分开放)
-另外,达量断网、区域限制等原因造成的断网不能通过重新开启数据服务或 APN 直接解除。诊断提示断网与在线会话需分别判断时,先处理真正的断网原因,再核对服务状态。
-
-## 达量断网批量配置
-
-在“业务受理”点击“达量断网”,当前页面通过 Excel 或批量输入配置,不显示连续号段入口:
-
-
+在“业务受理”点击“达量断网”,可通过 Excel、批量输入或连续号段批量配置:
1. 选择开启或关闭。
2. 开启时填写阈值,单位为 MB,阈值必须大于 0,最多保留 3 位小数。
-3. 按需设置“跨月保持断网”。开启后,因达量断网的卡即使跨账期恢复网络,也会再次自动断网,直至人工开网;开启前确认业务要求。
-4. 填写卡号或上传模板后提交。
-5. 记录批次号并在执行日志中检查结果。
+3. 填写卡号或上传模板后提交。
+4. 记录批次号并在执行日志中检查结果。
关闭配置表示不再按该阈值触发断网,不等同于立即恢复所有因其他原因停机的卡。
-## 达量断网页面
+## 达量断网页面(部分开放)
**入口:** 左侧菜单 → **通讯管理 → 达量断网**。
@@ -106,49 +89,11 @@
该页面用于查看和维护已有配置:
- 可按 MSISDN、ICCID、IMSI、IMEI 或配置状态查询。
-- 列表显示通道、所属公司、当前套餐、配置状态、阈值及跨月保持断网设置。
+- 列表显示通道、所属公司、当前套餐、配置状态和阈值。
- 有编辑权限时,可修改开启/关闭状态及阈值。
- 有删除权限时,可删除该卡的达量断网配置。
- 有导出权限时,可按当前条件导出配置。
-
+批量新增或修改建议从“业务受理 → 达量断网”完成;单卡核对和调整可在本页面完成。
-## 划拨给下级客户
-
-划拨用于调整已有业务卡的归属,与库存卡首次出库不同。
-
-1. 进入“业务受理 → 划拨”,选择当前有权使用的输入方式。
-
- 
-
-2. 选择系统返回的目标客户;目标列表为空时先确认客户关系及划拨权限。
-3. 上传最新模板或输入目标卡号,完成页面提供的预处理。
-4. 复核目标客户、有效卡数量和失败原因,再确认提交原批次。
-5. 保存批次号,在执行日志中核对逐卡结果;完成后查询卡片归属。
-
-划拨会改变数据归属和账号可见范围。不要将“任务已提交”当作已划拨成功,也不要在结果未确认时向其他客户重复划拨。
-
-## 划拨或出库结果有误时
-
-当前版本没有“回拨”或“撤销”按钮,划拨、出库出错后不能一键还原。按以下顺序处理:
-
-1. 先用批次号在[执行日志](./api-and-logs)核对批次和逐卡状态。若显示“待处理”“处理中”或“待核查”,结果尚未确认,应先等待或请平台核实,不要重复提交。
-2. 原批次结束后,只对逐卡结果已确认为“未执行”或“失败”的卡,分别在[卡信息](./card-info)或库存卡信息中核对当前归属、库存状态及正式卡记录。确认相关状态未变化后,修正原因,仅重新提交这些卡。
-3. 已成功但归属错误的卡,不要再次划拨到其他企业来“覆盖”错误结果。重复划拨会叠加归属变更记录,让后续核对更困难。
-4. 携带批次号、卡号清单、原归属企业、预期目标企业、当前实际归属、操作时间及相关订单号(如有)提交工单,请平台支持核实并给出处理方案。
-5. 处理完成后在[卡信息](./card-info)核对当前归属:列表中的“所属公司”或卡详情中的“所属企业”。订单和批次记录用于追溯处理过程,不单独作为当前归属已修正的依据。
-
-出库出错参照同样顺序:先看执行日志,再核对订单、库存与卡信息,不要用重复出库或备注掩盖问题。未执行或失败的卡还应确认是否仍在库存;已成功出库的卡会从库存列表移除,需在卡信息中确认正式卡及归属,不能仅凭库存列表查不到就判断出库成功。
-
-## 业务入口不可用时
-
-| 现象 | 处理方法 |
-| --- | --- |
-| 看不到某项业务 | 请管理员核对菜单及该业务的模板、预处理、提交权限 |
-| 可打开但无法下载模板或提交 | 不同操作有独立权限,应补齐所需权限后重试 |
-| 无可选套餐 | 核对当前套餐的可续费、可变更或加油包关系,以及套餐启用状态和价格 |
-| 预处理有失败项 | 按原因修正;正式提交前重新核对有效数量 |
-| 余额不足 | 核对付款账户、金额与付款方式,联系财务处理后再办理 |
-| 提交超时或结果不明 | 先查执行日志与卡片状态,避免重新创建相同任务 |
-
-页面没有配置操作行为的占位入口不属于可用业务。例如“添加安装位置”不能仅因显示在业务面板中就视为已可办理。
+
diff --git a/docs/manual/web/card-info.md b/docs/manual/web/card-info.md
index 9308333..73fd937 100644
--- a/docs/manual/web/card-info.md
+++ b/docs/manual/web/card-info.md
@@ -5,7 +5,7 @@
左侧菜单 → **通讯管理 → 卡信息**。
该页面是日常查卡的主要入口,可查询卡的身份标识、运营商状态、套餐、流量、归属企业、通道和到期情况。
-
+
## 查询卡片
@@ -25,12 +25,6 @@
查询不到卡时,先确认使用的是完整卡号,再清空状态、时间和通道等附加条件重试。
-### 批量查询
-
-在列表上方点击“批量操作 → 批量查询”,每行填写 1 至 3 个号码值(ICCID、MSISDN、IMSI),多个号码以空格分隔,同一行应属于同一张卡;单次最多 1000 行。
-
-点击“查询”后,结果保留当前筛选条件和公司范围,可使用原有“导出”按钮导出。若结果少于预期,先核对号码及附加条件。完成后点击“清除批量查询”恢复普通查询。
-
## 列表信息
| 字段 | 说明 |
@@ -52,12 +46,14 @@
## 查看卡详情
-点击列表中目标卡的 ICCID 打开详情。详情上方展示:MSISDN、ICCID、IMSI、IMEI、卡状态、网络类型、流量同步时间、套餐总流量、到期时间、出库时间、当前套餐、已用流量、剩余流量、所属企业、所属通道、达量断网配置状态、限额、备注。
+点击目标卡右侧“查看”。详情上方展示:MSISDN、ICCID、IMSI、IMEI、卡状态、网络类型、流量同步时间、套餐总流量、到期时间、出库时间、当前套餐、已用流量、剩余流量、所属企业、所属通道、达量断网配置状态、限额、备注。
+
+
详情下方包含以下页签:
- **会话信息:** APN、IPv4、IPv6、接入方式、在线状态、会话建立时间、实时 IMEI、开关机状态等。点击“刷新”重新查询;“未查询到会话”通常表示设备当前未建立数据会话,并不等同于卡已销户。
-- **归属信息:** 当前套餐编号、套餐名称、所属企业;通道信息以当前账号实际可见字段为准。
+- **归属信息:** 当前套餐编号、套餐名称、所属企业和所属通道(所属通道不予展示)。
- **主套餐:** 订单编号、套餐名称、套餐类型、订购状态、生效时间和到期时间。
- **叠加套餐:** 加油包名称、总流量、支付方式和交易时间。
- **变更历史:** 变更前后套餐、订购状态和办理时间。
@@ -68,30 +64,15 @@
页面上的操作按钮以账号权限为准。
-
-
- **备注:** 编辑本企业对卡片的业务备注,便于按项目、设备或使用场景检索。
- **同步用量:** 向上游请求最新用量。同步成功后查看“流量同步时间”是否更新。
- **同步状态:** 向上游请求最新运营商卡状态。
-- **导出:** 按当前筛选条件导出第一页最多 2000 张卡的信息。匹配数量超过 2000 时,应按卡号、时间或其他条件分段查询并分别导出,核对各文件的记录数。
+- **导出:** 按当前筛选条件导出卡信息。
- **诊断:** 在卡详情点击“诊断”,系统会携带当前 ICCID 跳转到智能诊断并自动查询。
-列表行的“更多”菜单还可能显示**开通数据、停用数据、自主停机、自主复机、重启**。这些操作各有独立权限;选择后先核对确认框中的 ICCID 和操作名称,再点击“确认提交”。缺少 ICCID 的卡不能提交。
+“批量操作”当前仍显示为待接入功能。
-单卡操作会创建业务任务;页面提示“任务已提交”或返回批次号不代表运营商侧已经完成。请在[执行日志](./api-and-logs)中按批次号核对最终状态,再刷新卡信息确认结果。
-
-列表“备注”弹窗目前只保存备注;出库时间、套餐周期和到期时间在此页为展示字段,不能通过“备注”入口修改。需要变更卡片业务信息时,使用对应的出库或套餐业务流程,并在提交后复核卡详情。
-
-## 单卡用量与历史月份
-
-列表和卡详情只显示当前账期的总流量、已用流量和剩余流量。需要按时间跨度看用量时,用以下两种方式:
-
-1. **趋势查看:** 在[智能诊断](./intelligent-diagnosis)执行一键诊断,结果中的流量趋势提供近 7 天、近 30 天和近 6 个月三档,适合判断设备是否持续上报、是否突增或长时间无流量。
-2. **逐月数值:** 需要某个月的确切用量时,通过 OpenAPI 的历史月用量接口按 ICCID 和月份(`yyyyMM`)查询,详见[旧版兼容接口 - 查询 SIM 历史月用量](/openapi/legacy/query)。该接口一次返回一个月份,查近 3 个月或近 6 个月需按月份分别调用。
-
-“近 1 个月 / 近 3 个月 / 近 6 个月”这组下拉项在**库存卡信息的“协议到期”条件**里,用于筛选协议到期时间,不是用量区间,两者不要混用。
-
-历史月份用量与当前账期的已用流量来自不同取数路径,口径和更新时间可能不同。跨月对比时先确认月份口径,不要直接把两个数值相减。
+
## 查看数据异常时
diff --git a/docs/manual/web/enterprise-management.md b/docs/manual/web/enterprise-management.md
index 0703617..5c194fb 100644
--- a/docs/manual/web/enterprise-management.md
+++ b/docs/manual/web/enterprise-management.md
@@ -16,67 +16,52 @@
**入口:** 左侧菜单 → **企业管理 → 角色管理**。
-角色用于向本机构用户分配菜单和按钮权限。列表显示本级角色,可按角色名称、角色权限字符和状态查询。
+
-- **默认管理员:** 本机构绑定的默认角色,只能查看,不能在此修改或删除。
-- **上级下发:** 由上级统一维护,本机构只能查看,不能修改或删除。
-- **本级自建角色:** 可按权限新增、修改;已绑定用户的角色不能删除,需先调整用户的角色分配。
+角色用于把菜单和按钮权限批量授予用户。列表可按角色名称、权限字符和状态查询。
### 创建角色
1. 点击“新增”。
+
+2. 填写角色名称和角色权限字符。
+3. 设置角色状态。
+4. 在“菜单权限”中勾选该角色需要使用的页面和操作。
+5. 需要传递给直属下级企业时,按业务要求设置“下发给下一级”。
- 
+ 
-2. 填写角色名称和角色权限字符,例如 `agentUser`;角色权限字符用于标识角色,具体页面和操作权限通过“菜单权限”勾选。
-3. 设置角色状态为“正常”或“停用”,按需填写备注。
-4. 在“菜单权限”中选择需要的目录、页面和按钮。可选范围受本机构已获授权的权限限制,不能授予范围之外的权限。默认不启用“父子联动”,勾选父项不会自动选中全部子项;需要联动选择时可勾选“父子联动”,并核对最终选择。
+6. 保存后回到“用户管理”,将角色分配给用户。
+
- 
-
-5. 保存后回到“用户管理”,为用户选择相应角色。用户表单不会提供用于下发的管理员角色供普通用户选择。
-
- 
-
-本级新增角色用于本机构用户授权;下级企业的默认管理员权限由系统的默认角色及下发规则管理,需要调整时联系上级或平台管理员。
-
-为用户配置角色时,只勾选其工作所需的页面和操作,并在分配后核对实际可见菜单及可用按钮。
-
-### 顶级与下级账号的权限核对
-
-账号层级本身不会自动开放整组功能。平台授权管理员可维护[通道](./channels)、[接口资源与权限组](./api-and-logs)及角色;下级企业管理员可在上级下发的范围内创建直属企业客户、用户和本级角色,并按实际授权使用查卡、同步、诊断、[业务受理](./business-operations)、库存、工单及 API 查询。
-
-为下级账号开通业务时,先由上级核对下发角色的菜单范围,再由本级管理员为用户分配角色;用户重新登录后,分别检查左侧菜单、页面按钮和可查询的卡片范围。看得到页面但无法提交时,还需核对该业务独立的模板、预处理或提交权限。默认管理员角色用于本机构管理,并不是一份对所有下级固定相同的功能清单。
+本级机构绑定的默认角色不能修改或删除。新增自定义角色时遵循最小权限原则,不要为普通查询人员授予企业删除、用户删除、角色修改或批量业务提交权限。
## 企业客户
**入口:** 左侧菜单 → **企业管理 → 企业客户**。
-
+
该页面面向获准管理下级企业的客户。可按企业名称和状态查询,列表显示企业名称、登录账号、负责人、联系电话、邮箱、组织所在地、详细地址、创建时间和状态。
根据按钮权限,可执行:
-- **新增:** 先确认本机构具备有效的下级管理员角色或平台配置的默认角色下发来源,再填写企业名称、登录账号、初始密码、联系方式和地址等信息。当前实现按默认角色及下发规则复制权限,不要求为每个客户创建同名角色。提示未配置唯一的下级管理员角色或默认角色异常时,联系管理员检查角色配置,不反复新建客户。
-
- 
+- **新增:** 创建直属企业客户之前,需在角色管理界面创建该企业客户同名角色,之后返回新增页面设置登录账号、初始密码、联系方式和企业地址等信息。
+
+
- **修改:** 调整企业名称、登录账号、负责人。
- 
+ 
- **重置密码:** 为该企业主账号设置新密码,密码长度为 5 至 20 位。
-
- 
-
+
- **企业管理:** 分两步维护单位信息和实名认证信息。

- **删除:** 删除前确认该企业没有仍在使用的卡、用户和业务数据。删除属于高风险操作。
-
- 
+
新增企业后,应及时通知对方修改初始密码,并按需要创建角色和用户。
@@ -96,7 +81,7 @@
4. 至少选择一个角色后保存。
初始密码长度为 5 至 20 位。建议使用更长且不重复的密码,并要求用户首次登录后修改。
-
+
### 维护用户
@@ -104,7 +89,7 @@
- “重置密码”可设置新密码。
- “删除”会使用户失去登录和数据访问能力,操作前确认账号不再使用。
-
+
## 建议的角色划分
diff --git a/docs/manual/web/faq.md b/docs/manual/web/faq.md
new file mode 100644
index 0000000..0f13e68
--- /dev/null
+++ b/docs/manual/web/faq.md
@@ -0,0 +1,57 @@
+# 常见问题
+
+## 登录后看不到某个菜单
+
+平台按角色显示菜单。先联系本企业管理员检查用户是否绑定正确角色、角色是否正常以及菜单权限是否勾选。若整个企业都没有该功能,需要联系平台支持开通。
+
+## 同事有按钮,我没有
+
+页面权限和按钮权限分别控制。即使都能进入同一页面,新增、编辑、导出、同步、删除或业务提交按钮也可能不同。由企业管理员对比双方角色权限。
+
+## 卡信息查询不到卡
+
+1. 清空其他筛选条件。
+2. 使用完整 MSISDN、ICCID 或 IMSI 查询。
+3. 检查是否有前后空格或字符缺失。
+4. 确认该卡已划拨到当前企业,且账号有相应数据范围。
+5. 仍无结果时创建工单并提供卡号。
+
+## 卡状态或流量没有更新
+
+在“卡信息”中分别执行“同步状态”和“同步用量”,完成后刷新列表,并查看同步时间是否变化。运营商接口可能有延迟;短时间内不要反复同步。
+
+## 智能诊断显示未查询到会话
+
+表示当前没有查到数据会话,不一定是卡异常。检查设备供电、信号、APN 和天线,确认数据服务已开启后重启设备,再稍后诊断。
+
+## 诊断提示运营商不支持
+
+当前卡所属通道未提供该项实时查询能力。结合卡信息、同步时间、设备侧日志和其他诊断模块判断;需要运营商侧核实时提交工单。
+
+## 批量业务提交后一直没有结果
+
+记录批次号,进入“执行日志”查看异步状态。仍在处理中时请等待;已失败时查看批次明细和失败原因。不要在结果未明确前重复提交同一批卡。
+
+## Excel 上传失败
+
+- 使用页面当次下载的最新模板。
+- 文件格式必须为 `.xls` 或 `.xlsx`,且不超过页面限制。
+- 不修改表头、不合并单元格、不增加公式。
+- 卡号列按文本格式保存,避免科学计数法或末位被修改。
+- 根据失败提示修正后,仅重提失败数据。
+
+## 达量断网开启后没有立即断网
+
+确认阈值单位为 MB、配置任务已成功、卡用量已同步且确实达到阈值。运营商侧执行可能有延迟;同时检查卡是否受其他套餐或通道策略影响。
+
+## 如何提交高质量工单
+
+提供完整 ICCID、MSISDN、故障开始时间、影响数量、设备位置、复现步骤、诊断结果、执行日志批次号和必要截图。描述中避免使用“卡有问题”这类无法定位的表述,也不要发送密码或 API 凭证。
+
+## 使用安全建议
+
+- 为每位操作人员创建独立账号,不共享管理员账号。
+- 查询人员、业务操作员和管理员使用不同角色。
+- 定期停用离职或不再使用的账号。
+- 高风险批量任务实行复核,保留批次号和结果文件。
+- 导出的卡信息、企业资料和 API 凭证按敏感数据管理。
diff --git a/docs/manual/web/home.md b/docs/manual/web/home.md
index d31cdd1..bfd06f1 100644
--- a/docs/manual/web/home.md
+++ b/docs/manual/web/home.md
@@ -1,12 +1,10 @@
# 首页与通用操作
-## 首页
+## 首页(暂未开放)
**入口:** 登录后默认进入“首页”;如已授权,也可点击左侧“首页”。
-
-
-首页由运行时配置决定显示哪些模块。当前代码中,部分模块已接入业务接口,部分仍为固定展示,阅读时应区分:
+首页用于快速掌握企业卡业务概况,通常包括:
- SIM 卡总数、本月新增、本月数据用量、本月短信用量和 SIM 卡月活跃度。
- 生命周期分布、流量池、物联卡位置分布等图表。
@@ -14,14 +12,7 @@
- 流量用尽关停、限额管控关停、封顶关停和套餐余量提醒等流量预警。
- 卡信息、智能诊断等快捷入口。
-| 模块 | 当前实现及使用方式 |
-| --- | --- |
-| 我的面板、生命周期分布、数据用量、流量池 | 已接入相应业务查询接口,结合账号范围及统计周期阅读 |
-| 近 6 月费用、位置分布、业务预警面板 | 当前使用固定展示数据,不能用于账单核对、实际定位或判断当前告警数量 |
-
-首页只作概览。处理单张卡应进入“卡信息”;费用核对使用订单记录,实际预警核对预警配置和通知记录。
-
-业务量模块当前查询的是数据流量,切换“语音”“短信”页签并未切换到独立的语音或短信统计接口,不能将图中的 GB/MB 数值解释为通话或短信量。
+首页数据用于概览和发现异常。处理单张卡时,应进入“卡信息”查看最新详情;预警统计与明细可能存在同步时间差。
## 列表页通用操作
@@ -33,7 +24,9 @@
卡号输入框通常支持 MSISDN、ICCID、IMSI。输入前后不要带空格;批量输入时一般每行一张卡。
-
+
+
+
### 表格工具
@@ -41,13 +34,9 @@

-### 导出
+### 导出(暂未开放)
-导出范围因页面而异,不要假定文件包含全部匹配结果。例如“卡信息”当前按查询条件导出第一页最多 2000 条;结果更多时,应分段筛选并分别导出。导出后核对文件记录数,并妥善保管包含卡号、设备号和企业信息的文件。
-
-
-
-
+“导出”通常按当前查询条件导出,而不是只导出当前页。建议先缩小查询范围再导出,并妥善保管包含卡号、设备号和企业信息的文件。
### 状态与数据时间
@@ -61,9 +50,3 @@
- 同一企业内不同用户看到的菜单和数据可能不同。
企业管理员可通过“企业管理 → 用户管理”和“角色管理”调整本企业用户权限。涉及平台未向企业开放的功能时,需要联系平台支持。
-
-## 通知公告(管理员)
-
-获授权管理员可从左侧“通知公告”页面按标题、类型、创建人或时间查询公告,并查看状态和内容。新增或修改时填写标题、类型、正文、状态和通知范围;选择指定组织或用户范围时,再核对目标名单后保存。删除支持单条或勾选多条,提交前确认范围,避免误删仍需展示的公告。
-
-“通知公告”的管理权限与普通账号接收站内消息是两回事。保存后可按公告状态、通知范围和用户通知公告记录核对接收对象。小程序[消息中心](../mini-program/messages-and-profile)读取独立的用户消息记录,不能仅凭 Web 公告创建成功就认定小程序会出现同一条公告。
diff --git a/docs/manual/web/index.md b/docs/manual/web/index.md
index 3a54e57..7063b90 100644
--- a/docs/manual/web/index.md
+++ b/docs/manual/web/index.md
@@ -1,6 +1,6 @@
# Web 端使用手册
-本手册面向 iotLCM Web 管理平台的企业客户、业务人员及获授权的平台管理员,说明页面入口、信息含义和操作流程。套餐配置、通道接入、库存出库等章节包含管理员功能,普通企业账号不一定可见。
+本手册面向 iotLCM Web 管理平台的企业客户,说明登录平台后各页面的入口、信息含义和常用操作。
::: info 权限说明
平台按企业、角色和用户分配权限。左侧菜单、页面按钮可能因企业实际授权不同而不同;看不到某项功能时,先联系本企业管理员确认角色权限。按钮以页面实际显示为准。
@@ -10,19 +10,14 @@

-1. 访问 [iotLCM 管理平台](https://admin.5iot.cn/)。
+1. 访问 [iotLCM 管理平台](https://admin.example.com/)。
2. 输入平台分配的账号和密码登录。
-3. 首次登录后,若仍使用初始密码或尚未绑定手机号,页面会弹出“账号安全提示”。按提示点击“去修改”或“去绑定”,分别进入个人中心的安全设置或手机号设置,完成密码修改、手机号绑定。
-
- 
-
+3. 首次登录后建议立即修改初始密码,并确认绑定的手机号、邮箱是否正确。
4. 登录后通过左侧菜单进入业务页面;顶部标签可在已打开页面间切换。
-提示框可选择“稍后再说”,不会阻止进入系统;同一浏览器标签会话内只提示一次。以后仍可从右上角个人中心进入相应设置。邮箱等资料可在个人中心核对。
-
若提示账号停用、密码错误或无可用菜单,请联系本企业管理员;企业管理员无法处理时,可通过工单联系平台支持。
-## 功能地图
+## 功能地图(部分开放)
| 菜单 | 页面 | 主要用途 |
| --- | --- | --- |
@@ -39,14 +34,6 @@
| 工单管理 | 工单记录 | 查询工单的状态变更与操作轨迹 |
| 顶级菜单 | 我的 API 凭证 | 查看并复制本企业接口凭证 |
| 顶级菜单 | 执行日志 | 跟踪批量任务结果及逐卡失败原因 |
-| 系统管理 | 通知公告 | 按权限维护公告内容、状态及通知范围 |
-| 系统管理(以部署为准) | 消息日志、通知日志 | 核对站内消息和通知是否发出、发给了谁 |
-| 套餐相关页面 | 套餐分类、上游套餐、流量套餐信息、流量套餐定价、流量池 | 维护产品、可办理关系和分层价格,查询池用量 |
-| 预警相关页面 | 卡预警配置、流量池预警配置 | 维护提醒阈值、接收方式和启停状态 |
-| 生命周期相关页面 | 入库管理、库存卡信息、批次管理、销户卡信息 | 管理入库、出库、批次和销户记录 |
-| 通道及同步相关页面 | 通道模板、通道管理、全量同步 | 配置上游接入,检查对接,并按权限发起全量或指定通道同步 |
-
-后五组使用页面名称定位;菜单由部署环境和权限配置决定,可能采用不同的分组名称。功能已有页面和接口实现不代表当前账号已获授权。列表或表单提交成功也不代表异步任务和运营商侧操作已完成。
“工单问题沟通”是从“我的工单”进入的详情页面,不在左侧单独显示。
@@ -56,13 +43,7 @@
1. 进入“通讯管理 → 卡信息”。
2. 用 MSISDN、ICCID、IMSI 或 IMEI 查询目标卡。
-
- 
-
-3. 点击列表中的 ICCID 打开卡详情,核对卡状态、套餐、用量、到期时间和同步时间。
-
- 
-
+3. 打开“查看”,核对卡状态、套餐、用量、到期时间和同步时间。
4. 数据较旧时使用“同步用量”或“同步状态”,再刷新查看。

@@ -89,12 +70,9 @@

-### 办理批量业务
+### 办理批量业务(暂未开放)
1. 进入“通讯管理 → 业务受理”,选择已授权的业务。
-
- 
-
2. 下载最新 Excel 模板,或使用批量输入、连续号段方式提交卡号。
3. 对需要预处理的业务先核对有效数量、失败项、套餐、价格和生效方式。
4. 确认提交后记录批次号。
@@ -102,14 +80,11 @@
## 阅读指引
-- [首页与通用操作](./home):了解查询、重置、导出、通知公告和数据刷新规则。
-- [卡信息](./card-info):了解卡列表字段、卡详情、会话信息及按权限提交的单卡操作。
+- [首页与通用操作](./home):了解查询、重置、导出和数据刷新规则。
+- [卡信息](./card-info):了解卡列表字段、卡详情和会话信息。
- [智能诊断](./intelligent-diagnosis):了解入口、诊断步骤和结果判断。
- [业务受理与达量断网](./business-operations):了解批量业务及达量断网配置。
- [企业、用户与角色](./enterprise-management):了解组织和账号权限管理。
- [工单管理](./work-orders):了解问题提交、沟通、关闭和评价。
- [API 凭证与执行日志](./api-and-logs):了解凭证保管和批次追踪。
-- [套餐配置与定价](./packages-and-pricing):维护产品、办理关系及客户价格。
-- [预警管理](./warnings):设置单卡和流量池提醒,区分预警与达量断网。
-- [入库、库存与出库](./inventory):管理卡片从入库到出库及销户后的查询。
-- [通道与接入管理](./channels):供获授权管理员配置上游接入。
+- [常见问题](./faq):快速排查菜单、数据、任务和诊断问题。
diff --git a/docs/manual/web/intelligent-diagnosis.md b/docs/manual/web/intelligent-diagnosis.md
index 6a4e65e..e2f5c48 100644
--- a/docs/manual/web/intelligent-diagnosis.md
+++ b/docs/manual/web/intelligent-diagnosis.md
@@ -8,7 +8,7 @@

-2. 左侧菜单 → **通讯管理 → 卡信息** → 在目标卡的“更多”菜单选择“诊断”;也可以点击 ICCID 打开卡详情后选择“诊断”。这两种操作都会带入 ICCID 并开始查询。
+2. 左侧菜单 → **通讯管理 → 卡信息** → 找到目标卡 → “查看” → “诊断”。第二种方式会自动带入 ICCID 并开始查询。

diff --git a/docs/manual/web/work-orders.md b/docs/manual/web/work-orders.md
index 65de08c..cc37410 100644
--- a/docs/manual/web/work-orders.md
+++ b/docs/manual/web/work-orders.md
@@ -4,7 +4,7 @@
**入口:** 左侧菜单 → **工单管理 → 我的工单**。
-
+
可按工单编号、工单类型和当前处理状态查询。列表显示工单编号、类型、标题、关联业务号、创建人、当前状态、首次响应时间和创建时间。
@@ -14,41 +14,38 @@
1. 点击“创建工单”。
2. 选择工单类型,如卡问题、套餐问题、订单问题、系统问题或其他问题。
-3. 如需填写“关联业务 ID”,使用对应业务记录的数字 ID,该字段不是 ICCID 或 MSISDN。无法确认时请联系管理员,完整卡号写在问题描述中,不要将长卡号填入数字 ID 字段。
+3. 填写关联业务 ID。卡问题建议填写完整 ICCID,并在问题描述中补充 MSISDN。
4. 填写清晰的工单标题和问题描述。
5. 按需上传截图、日志或结果文件。
6. 核对创建人信息后提交。
- 
-
问题描述建议包含:发生时间、影响范围、卡号、设备所在地、预期结果、实际现象、已执行的同步或诊断操作。不要在附件中上传 API 密钥、账号密码等敏感信息。
+
+
## 沟通与处理
点击工单右侧“沟通”;工单已结束时按钮显示为“查看”。工单问题沟通页会显示历史消息、附件、工单信息和处理轨迹。
-
+
- 在输入区填写回复内容,或按权限上传附件后发送。
+- 平台回复后可继续补充信息,尽量在同一工单中保持上下文完整。
- 有转单权限时,可把工单转交其他处理方。
- 问题确认解决后可执行“解决”;不再需要处理时可“取消”。
- 工单完成后可“关闭”,并按 1 至 5 分提交满意度和评价内容。
-
+
+
+
按钮是否出现取决于工单当前状态和用户权限。已完结或已取消的工单通常只能查看。
-### 处理角色与状态
-
-创建人、当前处理方及仅有查看权限的用户职责不同。取消由创建人按状态执行,解决和转单由有权限的当前处理方办理,评价由创建人在完结后提交。不要因为可查看工单就认为有权处理。
-
-Web 端“已解决”与小程序“待确认”对应同一处理阶段,尚未等同于“已完结”。问题仍存在时按当前端实际提供的操作反馈,保留同一工单的上下文。工单类型在两端可能采用不同的字典或显示文案,按当前表单选择,不根据数字值互相推断。
-
## 工单记录
**入口:** 左侧菜单 → **工单管理 → 工单记录**。
-
+
该页面用于审计工单流转,可按工单编号和操作类型查询。主要字段包括操作类型、操作机构、操作用户、目标部门、目标用户、变更前状态和变更后状态。
diff --git a/docs/openapi/legacy/index.md b/docs/openapi/legacy/index.md
index 0c02e1a..4f09dab 100644
--- a/docs/openapi/legacy/index.md
+++ b/docs/openapi/legacy/index.md
@@ -8,18 +8,18 @@ outline: deep
本文档收录历史 `/route/open/*` 路径下仍在维护的兼容接口。鉴权通过请求体 `verify` 中的 `appId`、`password` 和 `timeStamp` 完成;`sign` 为历史兼容字段,当前服务不校验。
-这些接口由 iotLCM OpenAPI 服务实现并提供,与 V3 接口同域(`apiv3.5iot.cn`),仅请求路径与鉴权方式不同。
+这些接口由 iotLCM OpenAPI 服务实现并提供,与 V3 接口同域(`api.example.com`),仅请求路径与鉴权方式不同。
## 服务地址
```text
-https://apiv3.5iot.cn
+https://api.example.com
```
完整请求 URL:
```text
-https://apiv3.5iot.cn/route/open/{接口名}
+https://api.example.com/route/open/{接口名}
```
## 统一鉴权
@@ -82,7 +82,7 @@ appId={appId}&password={password}&timeStamp={timeStamp}&key={accessKey}
```java
// 服务器请求地址
-protected static String server_Ip = "https://apiv3.5iot.cn/route/open";
+protected static String server_Ip = "https://api.example.com/route/open";
// appId
public static String appId = null;
// 密钥密码
@@ -121,7 +121,7 @@ public static void main(String[] args) {
verify.put("sign", getSign(verify, accessKey));
parmap.put("type", "iccid");
- parmap.put("cardno", "89860423123123132135");
+ parmap.put("cardno", "89860400000000002135");
map.put("verify", verify);
map.put("Param", parmap);
diff --git a/docs/openapi/legacy/query.md b/docs/openapi/legacy/query.md
index fa6889c..1549f07 100644
--- a/docs/openapi/legacy/query.md
+++ b/docs/openapi/legacy/query.md
@@ -27,12 +27,12 @@ POST /route/open/cardInfo
{
"Param": {
"type": "iccid",
- "cardno": "898604F4152391115474"
+ "cardno": "89860400000000005474"
},
"verify": {
"timeStamp": "1784097284347",
- "password": "588035550bd35c0001fbcda2c4d812ebdebae9763127943f097758e029a0fdbc",
- "appId": "b96b84a4d70740c1bfe569a11ca62e219affe3a6",
+ "password": "example-password",
+ "appId": "example-app-id",
"sign": ""
}
}
@@ -70,10 +70,10 @@ POST /route/open/cardInfo
"result": {
"vid": "3933",
"msisdn": "1441543605474",
- "iccid": "898604F4152391115474",
+ "iccid": "89860400000000005474",
"imsi": "460087436015474",
"imei": "",
- "deptName": "山东云则",
+ "deptName": "示例企业",
"statusId": 4,
"packageId": "yd-100m-3y",
"packageName": "每月100m3年",
@@ -107,12 +107,12 @@ POST /route/open/simDataUsage
```json
{
"Param": {
- "iccid": "898604F4152391115474"
+ "iccid": "89860400000000005474"
},
"verify": {
"timeStamp": "1784097284347",
- "password": "588035550bd35c0001fbcda2c4d812ebdebae9763127943f097758e029a0fdbc",
- "appId": "b96b84a4d70740c1bfe569a11ca62e219affe3a6",
+ "password": "example-password",
+ "appId": "example-app-id",
"sign": ""
}
}
@@ -156,13 +156,13 @@ POST /route/open/simDataUsageMonthly
```json
{
"Param": {
- "iccid": "898604F4152391115474",
+ "iccid": "89860400000000005474",
"dateTime": "202509"
},
"verify": {
"timeStamp": "1784097284347",
- "password": "588035550bd35c0001fbcda2c4d812ebdebae9763127943f097758e029a0fdbc",
- "appId": "b96b84a4d70740c1bfe569a11ca62e219affe3a6",
+ "password": "example-password",
+ "appId": "example-app-id",
"sign": ""
}
}
@@ -205,12 +205,12 @@ POST /route/open/simStatus
```json
{
"Param": {
- "iccid": "898604F4152391115474"
+ "iccid": "89860400000000005474"
},
"verify": {
"timeStamp": "1784097284347",
- "password": "588035550bd35c0001fbcda2c4d812ebdebae9763127943f097758e029a0fdbc",
- "appId": "b96b84a4d70740c1bfe569a11ca62e219affe3a6",
+ "password": "example-password",
+ "appId": "example-app-id",
"sign": ""
}
}
@@ -253,12 +253,12 @@ POST /route/open/simSession
```json
{
"Param": {
- "iccid": "898604F4152391115474"
+ "iccid": "89860400000000005474"
},
"verify": {
"timeStamp": "1784097284347",
- "password": "588035550bd35c0001fbcda2c4d812ebdebae9763127943f097758e029a0fdbc",
- "appId": "b96b84a4d70740c1bfe569a11ca62e219affe3a6",
+ "password": "example-password",
+ "appId": "example-app-id",
"sign": ""
}
}
@@ -328,14 +328,14 @@ POST /route/open/queryCardInfoList
{
"Param": {
"iccid": [
- "898604F4152391115473",
- "898604F4152391115474"
+ "89860400000000005473",
+ "89860400000000005474"
]
},
"verify": {
"timeStamp": "1784097284347",
- "password": "588035550bd35c0001fbcda2c4d812ebdebae9763127943f097758e029a0fdbc",
- "appId": "b96b84a4d70740c1bfe569a11ca62e219affe3a6",
+ "password": "example-password",
+ "appId": "example-app-id",
"sign": ""
}
}
@@ -363,7 +363,7 @@ POST /route/open/queryCardInfoList
"message": "",
"result": [
{
- "iccid": "898604F4152391115473",
+ "iccid": "89860400000000005473",
"activateDate": "2023-05-11",
"dueExpireTime": "",
"imei": "",
@@ -374,7 +374,7 @@ POST /route/open/queryCardInfoList
"status": 4
},
{
- "iccid": "898604F4152391115474",
+ "iccid": "89860400000000005474",
"activateDate": "2026-06-01",
"dueExpireTime": "2029-01-31 23:59:59",
"imei": "",
diff --git a/docs/openapi/operator/mobile-v5/index.md b/docs/openapi/operator/mobile-v5/index.md
index 74c30c1..3e828e7 100644
--- a/docs/openapi/operator/mobile-v5/index.md
+++ b/docs/openapi/operator/mobile-v5/index.md
@@ -1,31 +1,31 @@
---
title: 白名单转发
-description: 通过 apiv3.5iot.cn 访问中国移动物联网能力开放平台 V5 接口
+description: 通过 api.example.com 访问中国移动物联网能力开放平台 V5 接口
outline: deep
---
# 白名单转发
-本目录说明如何通过 `apiv3.5iot.cn` 访问中国移动物联网能力开放平台 V5 接口。平台仅提供安全代理转发,不改变中国移动 V5 接口的请求方法、请求参数、响应结构和业务语义。
+本目录说明如何通过 `api.example.com` 访问中国移动物联网能力开放平台 V5 接口。平台仅提供安全代理转发,不改变中国移动 V5 接口的请求方法、请求参数、响应结构和业务语义。
## 服务地址
客户侧统一使用:
```text
-https://apiv3.5iot.cn
+https://api.example.com
```
V5 接口的请求路径保持与中国移动官方接口一致,将官方域名替换为平台域名即可:
```text
-https://apiv3.5iot.cn/v5/{官方接口路径}
+https://api.example.com/v5/{官方接口路径}
```
例如,官方接口路径为 `/v5/ec/query/sim-basic-info` 时,客户侧请求路径为:
```http
-POST https://apiv3.5iot.cn/v5/ec/query/sim-basic-info
+POST https://api.example.com/v5/ec/query/sim-basic-info
```
平台会将该请求转发至:
@@ -64,7 +64,7 @@ https://api.iot.10086.cn/v5/ec/query/sim-basic-info
### 单卡基本信息查询
```http
-POST https://apiv3.5iot.cn/v5/ec/query/sim-basic-info
+POST https://api.example.com/v5/ec/query/sim-basic-info
```
请求参数:
@@ -82,8 +82,8 @@ POST https://apiv3.5iot.cn/v5/ec/query/sim-basic-info
```json
{
"transid": "113712264334542026051515200001000",
- "token": "c5e1cad63e654237052be9908f989bf3515b3bdaeca904dd2e904061b65e8153",
- "iccid": "898608501624D0000009"
+ "token": "example-access-token",
+ "iccid": "89860800000000000009"
}
```
@@ -110,7 +110,7 @@ POST https://apiv3.5iot.cn/v5/ec/query/sim-basic-info
{
"msisdn": "1442206200009",
"imsi": "460240406200009",
- "iccid": "898608501624D0000009",
+ "iccid": "89860800000000000009",
"activeDate": "2025-03-26 15:49:50",
"openDate": "2025-03-13 16:52:10",
"remark": ""
diff --git a/docs/openapi/operator/shared-token/index.md b/docs/openapi/operator/shared-token/index.md
index b830fa0..3bf8b0d 100644
--- a/docs/openapi/operator/shared-token/index.md
+++ b/docs/openapi/operator/shared-token/index.md
@@ -11,10 +11,10 @@ outline: deep
## 服务地址
```text
-https://apiv3.5iot.cn
+https://api.example.com
```
-HTTP(`http://apiv3.5iot.cn`)仅为存量兼容保留,不做自动跳转,新接入请使用 HTTPS。
+HTTP(`http://api.example.com`)仅为存量兼容保留,不做自动跳转,新接入请使用 HTTPS。
## 接口信息
@@ -35,7 +35,7 @@ POST /openapi/v3/query/operator-token
```json
{
- "appId": "7s9g2p5n8z1d4m6r",
+ "appId": "example-app-id",
"chanKey": "channel_010"
}
```
@@ -52,7 +52,7 @@ POST /openapi/v3/query/operator-token
"data": {
"chanAlias": "中国移动物联网",
"chanKey": "channel_010",
- "accessToken": "c5e1cad63e654237052be9908f989bf3515b3bdaeca904dd2e904061b65e8153",
+ "accessToken": "example-access-token",
"tokenExpire": "2026-09-09 16:00:00"
},
"error": null
@@ -76,10 +76,10 @@ POST /openapi/v3/query/operator-token
```bash
curl --request POST \
- --url https://apiv3.5iot.cn/openapi/v3/query/operator-token \
+ --url https://api.example.com/openapi/v3/query/operator-token \
--header 'Content-Type: application/json' \
--data '{
- "appId": "7s9g2p5n8z1d4m6r",
+ "appId": "example-app-id",
"chanKey": "channel_010"
}'
```
diff --git a/docs/openapi/v3/common.md b/docs/openapi/v3/common.md
index c1e7e1f..8d6c77d 100644
--- a/docs/openapi/v3/common.md
+++ b/docs/openapi/v3/common.md
@@ -9,15 +9,23 @@ outline: deep
## 服务地址
```text
-https://apiv3.5iot.cn
+https://api.example.com
```
-HTTP(`http://apiv3.5iot.cn`)仅为存量兼容保留,不做自动跳转,新接入请使用 HTTPS。
+HTTP(`http://api.example.com`)仅为存量兼容保留,不做自动跳转,新接入请使用 HTTPS。
## 鉴权
先调用 `/openapi/v3/query/token` 获取访问令牌,再在请求头中传入 `X-Access-Token`。请求体中的 `appId` 必须与凭证所属客户一致。
+## 标准入口与兼容入口
+
+新接入统一使用本文的 `/openapi/v3/change/*` 路径。原 `/openapi/v3/common/*` 前缀已停止提供,调用返回 `404`,请改用 `/change` 下的对应接口。
+
+批量续费使用 `/change/batch-sim-subscribe`;历史 `/change/renew` 接收 `cards[]`,允许每张卡携带套餐信息,作为兼容入口保留。两者共用续费实现。
+
+批量变更达量断网使用 `/change/batch-sim-traffic-cutoff`。原 `/change/traffic-cutoff-config` 不再对外提供,请改用标准入口——两者请求参数完全一致,迁移无需改动报文体。`/query/traffic-cutoff-config` 仅查询配置。
+
## 统一返回结构
```json
@@ -63,7 +71,7 @@ POST /openapi/v3/change/sim-subscribe
```json
{
"appId": "CUS-202608-0001",
- "iccid": "89860401785462635152",
+ "iccid": "89860400000000005152",
"packageId": "001",
"validity": 1,
"remark": "客户单卡续费"
@@ -95,7 +103,7 @@ POST /openapi/v3/change/sim-subscribe
"data": {
"orderId": "54",
"orderSn": "REN20260910153546001000001",
- "iccid": "89860401785462635152",
+ "iccid": "89860400000000005152",
"planName": "中移-1G",
"effectiveType": "immediate",
"effectiveDate": "2026-09-10 15:35:46",
@@ -116,7 +124,7 @@ POST /openapi/v3/change/sim-subscribe
"data": {
"orderId": "0",
"orderSn": "",
- "iccid": "89860401785462635152",
+ "iccid": "89860400000000005152",
"planName": "",
"effectiveType": "",
"effectiveDate": "",
@@ -157,7 +165,7 @@ POST /openapi/v3/change/sim-traffic-cutoff
```json
{
"appId": "CUS-202608-0001",
- "iccid": "89860401785462635152",
+ "iccid": "89860400000000005152",
"trafficCutoffStatus": 1,
"trafficCutoffThreshold": 1024,
"remark": "客户开启达量断网"
@@ -186,8 +194,8 @@ POST /openapi/v3/change/sim-traffic-cutoff
"message": "",
"data": {
"success": true,
- "iccid": "89860401785462635152",
- "msisdn": "14162635152",
+ "iccid": "89860400000000005152",
+ "msisdn": "14100005152",
"imsi": "460045462635152",
"trafficCutoffStatus": 1,
"trafficCutoffThreshold": 1024,
@@ -206,7 +214,7 @@ POST /openapi/v3/change/sim-traffic-cutoff
"message": "",
"data": {
"success": false,
- "iccid": "89860401785462635152",
+ "iccid": "89860400000000005152",
"trafficCutoffStatus": 1,
"trafficCutoffThreshold": 1024,
"trafficCutoffThresholdUnit": "MB",
@@ -249,7 +257,7 @@ POST /openapi/v3/change/batch-sim-subscribe
"appId": "CUS-202608-0001",
"cards": [
{
- "iccid": "89860401785462635152"
+ "iccid": "89860400000000005152"
}
],
"packageId": "001",
@@ -313,7 +321,7 @@ POST /openapi/v3/change/batch-sim-traffic-cutoff
"appId": "CUS-202608-0001",
"cards": [
{
- "iccid": "89860401785462635152"
+ "iccid": "89860400000000005152"
}
],
"trafficCutoffStatus": 1,
diff --git a/docs/openapi/v3/index.md b/docs/openapi/v3/index.md
index f5a9e34..11e70ab 100644
--- a/docs/openapi/v3/index.md
+++ b/docs/openapi/v3/index.md
@@ -9,10 +9,10 @@ outline: deep
## 服务地址
```text
-https://apiv3.5iot.cn
+https://api.example.com
```
-HTTP(`http://apiv3.5iot.cn`)仅为存量兼容保留,不做自动跳转,新接入请使用 HTTPS。
+HTTP(`http://api.example.com`)仅为存量兼容保留,不做自动跳转,新接入请使用 HTTPS。
## 统一返回结构
@@ -76,4 +76,6 @@ X-Access-Token: {accessToken}
⚠️ **不要把 `appKey`(API 账号标识)当成 `appId` 使用。** `appKey` 只用于获取 token。
:::
-权限控制:调用接口需具备对应接口资源的访问权限,权限与 API 账号所属权限组关联。未配置资源时,按当前开放策略放行。
+权限控制:调用接口需具备对应接口资源的访问权限,权限与 API 账号所属权限组关联。未登记资源、资源停用、账号未授权均拒绝访问,返回 `10014`;权限数据查询异常返回 `10016`(系统侧故障,不是授权问题)。
+
+原 `/openapi/v3/common/*` 前缀已停止提供,调用返回 `404`,请使用 `/openapi/v3/change/*` 下的对应接口。
diff --git a/docs/openapi/v3/query.md b/docs/openapi/v3/query.md
index 071ec99..fcdb846 100644
--- a/docs/openapi/v3/query.md
+++ b/docs/openapi/v3/query.md
@@ -32,7 +32,7 @@ X-Access-Token: {accessToken}
```json
{
"appId": "CUS-202601-0001",
- "iccid": "898604F4152391115474"
+ "iccid": "89860400000000005474"
}
```
@@ -90,9 +90,9 @@ X-Access-Token: {accessToken}
"code": 0,
"message": "",
"data": {
- "iccid": "898604F4152391115474",
+ "iccid": "89860400000000005474",
"imei": "",
- "username": "山东云则",
+ "username": "示例企业",
"location": "370100000000",
"planCategory": "移动小流量",
"currentPlanName": "每月100m3年",
@@ -162,7 +162,7 @@ X-Access-Token: {accessToken}
```json
{
"appId": "CUS-202601-0001",
- "iccid": "898604F4152391115474"
+ "iccid": "89860400000000005474"
}
```
@@ -184,7 +184,7 @@ X-Access-Token: {accessToken}
"code": 0,
"message": "",
"data": {
- "iccid": "898604F4152391115474",
+ "iccid": "89860400000000005474",
"lifeCycle": 2,
"lifeCycleName": "已激活"
},
@@ -225,7 +225,7 @@ POST /openapi/v3/query/sim-limit
```json
{
"appId": "CUS-202601-0001",
- "iccid": "898604F4152391115474"
+ "iccid": "89860400000000005474"
}
```
@@ -272,7 +272,7 @@ POST /openapi/v3/query/sim-imei
```json
{
"appId": "CUS-202601-0001",
- "iccid": "898604F4152391115474"
+ "iccid": "89860400000000005474"
}
```
@@ -315,7 +315,7 @@ POST /openapi/v3/query/sim-usage
```json
{
"appId": "CUS-202601-0001",
- "iccid": "898604F4152391115474"
+ "iccid": "89860400000000005474"
}
```
@@ -371,13 +371,13 @@ X-Access-Token: {accessToken}
"appId": "CUS-202601-0001",
"cards": [
{
- "iccid": "898604F4152391115473"
+ "iccid": "89860400000000005473"
},
{
- "iccid": "898604F4152391115474"
+ "iccid": "89860400000000005474"
},
{
- "iccid": "8986112223600594371"
+ "iccid": "8986110000000004371"
}
]
}
@@ -414,19 +414,19 @@ X-Access-Token: {accessToken}
"items": [
{
"matched": true,
- "iccid": "898604F4152391115473",
+ "iccid": "89860400000000005473",
"lifeCycle": 2,
"lifeCycleName": "已激活"
},
{
"matched": true,
- "iccid": "898604F4152391115474",
+ "iccid": "89860400000000005474",
"lifeCycle": 2,
"lifeCycleName": "已激活"
},
{
"matched": true,
- "iccid": "8986112223600594371",
+ "iccid": "8986110000000004371",
"lifeCycle": 2,
"lifeCycleName": "已激活"
}
@@ -467,13 +467,13 @@ X-Access-Token: {accessToken}
"appId": "CUS-202601-0001",
"cards": [
{
- "iccid": "898604F4152391115474"
+ "iccid": "89860400000000005474"
},
{
- "iccid": "898604F4152391115473"
+ "iccid": "89860400000000005473"
},
{
- "iccid": "8986112223600594371"
+ "iccid": "8986110000000004371"
}
]
}
@@ -510,19 +510,19 @@ X-Access-Token: {accessToken}
"items": [
{
"matched": true,
- "iccid": "898604F4152391115474",
+ "iccid": "89860400000000005474",
"useUnit": "MB",
"useAmount": 0.875
},
{
"matched": true,
- "iccid": "898604F4152391115473",
+ "iccid": "89860400000000005473",
"useUnit": "MB",
"useAmount": 12.5
},
{
"matched": true,
- "iccid": "8986112223600594371",
+ "iccid": "8986110000000004371",
"useUnit": "MB",
"useAmount": 36.25
}
@@ -563,10 +563,10 @@ X-Access-Token: {accessToken}
"appId": "CUS-202601-0001",
"cards": [
{
- "iccid": "898604F4152391115474"
+ "iccid": "89860400000000005474"
},
{
- "iccid": "898604F4152391115473"
+ "iccid": "89860400000000005473"
},
{
"msisdn": "1441543605474"
@@ -605,12 +605,12 @@ X-Access-Token: {accessToken}
"items": [
{
"matched": true,
- "iccid": "898604F4152391115474",
+ "iccid": "89860400000000005474",
"imei": ""
},
{
"matched": true,
- "iccid": "898604F4152391115473",
+ "iccid": "89860400000000005473",
"imei": "865466070817587"
},
{
@@ -651,13 +651,13 @@ POST /openapi/v3/query/traffic-cutoff-config
"appId": "CUS-202601-0001",
"cards": [
{
- "iccid": "898604F4152391115474"
+ "iccid": "89860400000000005474"
},
{
- "iccid": "898604F4152391115475"
+ "iccid": "89860400000000005475"
},
{
- "iccid": "898604F4152391115476"
+ "iccid": "89860400000000005476"
}
],
"includeUsage": true
@@ -699,7 +699,7 @@ POST /openapi/v3/query/traffic-cutoff-config
"items": [
{
"matched": true,
- "iccid": "898604F4152391115474",
+ "iccid": "89860400000000005474",
"trafficCutoffStatus": 0,
"trafficCutoffStatusName": "未配置",
"trafficCutoffThreshold": 0,
@@ -710,7 +710,7 @@ POST /openapi/v3/query/traffic-cutoff-config
},
{
"matched": true,
- "iccid": "898604F4152391115475",
+ "iccid": "89860400000000005475",
"trafficCutoffStatus": 1,
"trafficCutoffStatusName": "已开启",
"trafficCutoffThreshold": 100,
@@ -721,7 +721,7 @@ POST /openapi/v3/query/traffic-cutoff-config
},
{
"matched": true,
- "iccid": "898604F4152391115476",
+ "iccid": "89860400000000005476",
"trafficCutoffStatus": 2,
"trafficCutoffStatusName": "已关闭",
"trafficCutoffThreshold": 50,
diff --git a/docs/openapi/v3/token.md b/docs/openapi/v3/token.md
index 37ba917..69d8000 100644
--- a/docs/openapi/v3/token.md
+++ b/docs/openapi/v3/token.md
@@ -24,8 +24,8 @@ POST /openapi/v3/query/token
```json
{
- "appKey": "b96b84a4d70740c1bfe569a11ca62e219affe3a6",
- "appSecret": "588035550bd35c0001fbcda2c4d812ebdebae9763127943f097758e029a0fdbc"
+ "appKey": "example-app-key",
+ "appSecret": "example-app-secret"
}
```
@@ -50,7 +50,7 @@ POST /openapi/v3/query/token
"message": "",
"data": {
"appId": "CUS-202601-0001",
- "accessToken": "eyJhbGciOiJIUzI1NiJ9.eyJ1IjoiZWE3ZjJiZGY5MjQyNDFkZjg3NGIwZDMzNmZkN2UzMzEiLCJleHAiOjE3ODQ3MDAyODB9.JiYK-CXdXQKKU0UNhNOqKX5Hzyk4lVMtIpunQJDxlBI"
+ "accessToken": "example-access-token"
},
"error": null
}
diff --git a/docs/public/images/manual/api-credentials-entry.png b/docs/public/images/manual/api-credentials-entry.png
index 4f7fc6a..71a980f 100644
Binary files a/docs/public/images/manual/api-credentials-entry.png and b/docs/public/images/manual/api-credentials-entry.png differ
diff --git a/docs/public/images/manual/business-operations-batch-threshold.png b/docs/public/images/manual/business-operations-batch-threshold.png
index 361e904..4cd14c9 100644
Binary files a/docs/public/images/manual/business-operations-batch-threshold.png and b/docs/public/images/manual/business-operations-batch-threshold.png differ
diff --git a/docs/public/images/manual/card-detail-diagnosis-entry-attachment.png b/docs/public/images/manual/card-detail-diagnosis-entry-attachment.png
index 7039a6c..407091a 100644
Binary files a/docs/public/images/manual/card-detail-diagnosis-entry-attachment.png and b/docs/public/images/manual/card-detail-diagnosis-entry-attachment.png differ
diff --git a/docs/public/images/manual/card-detail-diagnosis-entry-new.png b/docs/public/images/manual/card-detail-diagnosis-entry-new.png
index d1f0fca..0a8d437 100644
Binary files a/docs/public/images/manual/card-detail-diagnosis-entry-new.png and b/docs/public/images/manual/card-detail-diagnosis-entry-new.png differ
diff --git a/docs/public/images/manual/card-detail-tabs.png b/docs/public/images/manual/card-detail-tabs.png
index b6e766e..2ec16cb 100644
Binary files a/docs/public/images/manual/card-detail-tabs.png and b/docs/public/images/manual/card-detail-tabs.png differ
diff --git a/docs/public/images/manual/card-info-common-actions.png b/docs/public/images/manual/card-info-common-actions.png
index db5dd71..19fbd08 100644
Binary files a/docs/public/images/manual/card-info-common-actions.png and b/docs/public/images/manual/card-info-common-actions.png differ
diff --git a/docs/public/images/manual/card-info-detail-summary.jpg b/docs/public/images/manual/card-info-detail-summary.jpg
index 86a5981..6132325 100644
Binary files a/docs/public/images/manual/card-info-detail-summary.jpg and b/docs/public/images/manual/card-info-detail-summary.jpg differ
diff --git a/docs/public/images/manual/card-info-main-entry.png b/docs/public/images/manual/card-info-main-entry.png
index af7962b..f5d6b99 100644
Binary files a/docs/public/images/manual/card-info-main-entry.png and b/docs/public/images/manual/card-info-main-entry.png differ
diff --git a/docs/public/images/manual/card-info-more-actions.png b/docs/public/images/manual/card-info-more-actions.png
index 40372f1..76f2d8f 100644
Binary files a/docs/public/images/manual/card-info-more-actions.png and b/docs/public/images/manual/card-info-more-actions.png differ
diff --git a/docs/public/images/manual/card-info-query-batch.jpg b/docs/public/images/manual/card-info-query-batch.jpg
index 1af0033..81b24c2 100644
Binary files a/docs/public/images/manual/card-info-query-batch.jpg and b/docs/public/images/manual/card-info-query-batch.jpg differ
diff --git a/docs/public/images/manual/card-info-query-filters.png b/docs/public/images/manual/card-info-query-filters.png
index b348536..fff16bf 100644
Binary files a/docs/public/images/manual/card-info-query-filters.png and b/docs/public/images/manual/card-info-query-filters.png differ
diff --git a/docs/public/images/manual/card-info-query-single.jpg b/docs/public/images/manual/card-info-query-single.jpg
index f2f8533..87db1df 100644
Binary files a/docs/public/images/manual/card-info-query-single.jpg and b/docs/public/images/manual/card-info-query-single.jpg differ
diff --git a/docs/public/images/manual/card-info-sync-actions.png b/docs/public/images/manual/card-info-sync-actions.png
index fe68c24..4bcee90 100644
Binary files a/docs/public/images/manual/card-info-sync-actions.png and b/docs/public/images/manual/card-info-sync-actions.png differ
diff --git a/docs/public/images/manual/card-info-view-entry.png b/docs/public/images/manual/card-info-view-entry.png
index c6e92af..224d306 100644
Binary files a/docs/public/images/manual/card-info-view-entry.png and b/docs/public/images/manual/card-info-view-entry.png differ
diff --git a/docs/public/images/manual/card-warning-list-actions.png b/docs/public/images/manual/card-warning-list-actions.png
index 0a9c640..85de539 100644
Binary files a/docs/public/images/manual/card-warning-list-actions.png and b/docs/public/images/manual/card-warning-list-actions.png differ
diff --git a/docs/public/images/manual/enterprise-customer-create-form.jpg b/docs/public/images/manual/enterprise-customer-create-form.jpg
index 1bbf7ae..1366f01 100644
Binary files a/docs/public/images/manual/enterprise-customer-create-form.jpg and b/docs/public/images/manual/enterprise-customer-create-form.jpg differ
diff --git a/docs/public/images/manual/enterprise-customer-delete-confirm.png b/docs/public/images/manual/enterprise-customer-delete-confirm.png
index ed3c4da..d07b604 100644
Binary files a/docs/public/images/manual/enterprise-customer-delete-confirm.png and b/docs/public/images/manual/enterprise-customer-delete-confirm.png differ
diff --git a/docs/public/images/manual/enterprise-customer-edit.png b/docs/public/images/manual/enterprise-customer-edit.png
index 77670a3..7d6fc2f 100644
Binary files a/docs/public/images/manual/enterprise-customer-edit.png and b/docs/public/images/manual/enterprise-customer-edit.png differ
diff --git a/docs/public/images/manual/enterprise-customer-entry.jpg b/docs/public/images/manual/enterprise-customer-entry.jpg
index c81ee81..6175285 100644
Binary files a/docs/public/images/manual/enterprise-customer-entry.jpg and b/docs/public/images/manual/enterprise-customer-entry.jpg differ
diff --git a/docs/public/images/manual/enterprise-customer-manage.png b/docs/public/images/manual/enterprise-customer-manage.png
index 0028e22..d438fdb 100644
Binary files a/docs/public/images/manual/enterprise-customer-manage.png and b/docs/public/images/manual/enterprise-customer-manage.png differ
diff --git a/docs/public/images/manual/enterprise-customer-reset-password.png b/docs/public/images/manual/enterprise-customer-reset-password.png
index 1622b32..56de26d 100644
Binary files a/docs/public/images/manual/enterprise-customer-reset-password.png and b/docs/public/images/manual/enterprise-customer-reset-password.png differ
diff --git a/docs/public/images/manual/enterprise-customer-role-match.png b/docs/public/images/manual/enterprise-customer-role-match.png
new file mode 100644
index 0000000..5b2d475
Binary files /dev/null and b/docs/public/images/manual/enterprise-customer-role-match.png differ
diff --git a/docs/public/images/manual/enterprise-information-entry.png b/docs/public/images/manual/enterprise-information-entry.png
index f6fc357..2e9a63d 100644
Binary files a/docs/public/images/manual/enterprise-information-entry.png and b/docs/public/images/manual/enterprise-information-entry.png differ
diff --git a/docs/public/images/manual/intelligent-diagnosis-result-attachment.png b/docs/public/images/manual/intelligent-diagnosis-result-attachment.png
index 226afd2..75bf93f 100644
Binary files a/docs/public/images/manual/intelligent-diagnosis-result-attachment.png and b/docs/public/images/manual/intelligent-diagnosis-result-attachment.png differ
diff --git a/docs/public/images/manual/intelligent-diagnosis-result.png b/docs/public/images/manual/intelligent-diagnosis-result.png
index addcdc6..da890c0 100644
Binary files a/docs/public/images/manual/intelligent-diagnosis-result.png and b/docs/public/images/manual/intelligent-diagnosis-result.png differ
diff --git a/docs/public/images/manual/intelligent-diagnosis-submit-button.png b/docs/public/images/manual/intelligent-diagnosis-submit-button.png
index 451ab1c..6407a14 100644
Binary files a/docs/public/images/manual/intelligent-diagnosis-submit-button.png and b/docs/public/images/manual/intelligent-diagnosis-submit-button.png differ
diff --git a/docs/public/images/manual/intelligent-diagnosis-submit.jpg b/docs/public/images/manual/intelligent-diagnosis-submit.jpg
index 673183b..67eaaeb 100644
Binary files a/docs/public/images/manual/intelligent-diagnosis-submit.jpg and b/docs/public/images/manual/intelligent-diagnosis-submit.jpg differ
diff --git a/docs/public/images/manual/inventory-batch-management.png b/docs/public/images/manual/inventory-batch-management.png
index 850976f..b1a2a9c 100644
Binary files a/docs/public/images/manual/inventory-batch-management.png and b/docs/public/images/manual/inventory-batch-management.png differ
diff --git a/docs/public/images/manual/inventory-card-query-filters.png b/docs/public/images/manual/inventory-card-query-filters.png
index d6900ca..f10b3f8 100644
Binary files a/docs/public/images/manual/inventory-card-query-filters.png and b/docs/public/images/manual/inventory-card-query-filters.png differ
diff --git a/docs/public/images/manual/inventory-inbound-batch-query.png b/docs/public/images/manual/inventory-inbound-batch-query.png
index c56c27c..e97e727 100644
Binary files a/docs/public/images/manual/inventory-inbound-batch-query.png and b/docs/public/images/manual/inventory-inbound-batch-query.png differ
diff --git a/docs/public/images/manual/inventory-outbound-entry.png b/docs/public/images/manual/inventory-outbound-entry.png
index 78d9d81..0bcc90e 100644
Binary files a/docs/public/images/manual/inventory-outbound-entry.png and b/docs/public/images/manual/inventory-outbound-entry.png differ
diff --git a/docs/public/images/manual/login-page.png b/docs/public/images/manual/login-page.png
index 68d7838..792124a 100644
Binary files a/docs/public/images/manual/login-page.png and b/docs/public/images/manual/login-page.png differ
diff --git a/docs/public/images/manual/mini-program-scan-photo-entry.png b/docs/public/images/manual/mini-program-scan-photo-entry.png
index 9483c5b..4ed550f 100644
Binary files a/docs/public/images/manual/mini-program-scan-photo-entry.png and b/docs/public/images/manual/mini-program-scan-photo-entry.png differ
diff --git a/docs/public/images/manual/mini-program/account-login-methods-v102.png b/docs/public/images/manual/mini-program/account-login-methods-v102.png
index 45d00a6..03ca837 100644
Binary files a/docs/public/images/manual/mini-program/account-login-methods-v102.png and b/docs/public/images/manual/mini-program/account-login-methods-v102.png differ
diff --git a/docs/public/images/manual/mini-program/account-password-login.png b/docs/public/images/manual/mini-program/account-password-login.png
new file mode 100644
index 0000000..9763984
Binary files /dev/null and b/docs/public/images/manual/mini-program/account-password-login.png differ
diff --git a/docs/public/images/manual/mini-program/all-devices-v102.png b/docs/public/images/manual/mini-program/all-devices-v102.png
index 1d0337e..08e5951 100644
Binary files a/docs/public/images/manual/mini-program/all-devices-v102.png and b/docs/public/images/manual/mini-program/all-devices-v102.png differ
diff --git a/docs/public/images/manual/mini-program/allocation-batch-logs-v102.png b/docs/public/images/manual/mini-program/allocation-batch-logs-v102.png
index 9201b14..c3bcd1e 100644
Binary files a/docs/public/images/manual/mini-program/allocation-batch-logs-v102.png and b/docs/public/images/manual/mini-program/allocation-batch-logs-v102.png differ
diff --git a/docs/public/images/manual/mini-program/allocation-select-cards-v102.jpg b/docs/public/images/manual/mini-program/allocation-select-cards-v102.jpg
index c20ad22..554a778 100644
Binary files a/docs/public/images/manual/mini-program/allocation-select-cards-v102.jpg and b/docs/public/images/manual/mini-program/allocation-select-cards-v102.jpg differ
diff --git a/docs/public/images/manual/mini-program/business-account-login-entry.png b/docs/public/images/manual/mini-program/business-account-login-entry.png
index 7c46f3e..9644790 100644
Binary files a/docs/public/images/manual/mini-program/business-account-login-entry.png and b/docs/public/images/manual/mini-program/business-account-login-entry.png differ
diff --git a/docs/public/images/manual/mini-program/business-device-tab.png b/docs/public/images/manual/mini-program/business-device-tab.png
index a64726e..5c8879b 100644
Binary files a/docs/public/images/manual/mini-program/business-device-tab.png and b/docs/public/images/manual/mini-program/business-device-tab.png differ
diff --git a/docs/public/images/manual/mini-program/business-login-methods.jpg b/docs/public/images/manual/mini-program/business-login-methods.jpg
index 038dc19..6938696 100644
Binary files a/docs/public/images/manual/mini-program/business-login-methods.jpg and b/docs/public/images/manual/mini-program/business-login-methods.jpg differ
diff --git a/docs/public/images/manual/mini-program/card-details-account-data-v2.jpg b/docs/public/images/manual/mini-program/card-details-account-data-v2.jpg
new file mode 100644
index 0000000..8570b96
Binary files /dev/null and b/docs/public/images/manual/mini-program/card-details-account-data-v2.jpg differ
diff --git a/docs/public/images/manual/mini-program/card-details-account-data-v3.png b/docs/public/images/manual/mini-program/card-details-account-data-v3.png
index d535f2e..738cdcc 100644
Binary files a/docs/public/images/manual/mini-program/card-details-account-data-v3.png and b/docs/public/images/manual/mini-program/card-details-account-data-v3.png differ
diff --git a/docs/public/images/manual/mini-program/card-details-quick-actions.png b/docs/public/images/manual/mini-program/card-details-quick-actions.png
index de1a1b0..89c05d8 100644
Binary files a/docs/public/images/manual/mini-program/card-details-quick-actions.png and b/docs/public/images/manual/mini-program/card-details-quick-actions.png differ
diff --git a/docs/public/images/manual/mini-program/card-details-traffic.png b/docs/public/images/manual/mini-program/card-details-traffic.png
index 95b390a..62ddcfd 100644
Binary files a/docs/public/images/manual/mini-program/card-details-traffic.png and b/docs/public/images/manual/mini-program/card-details-traffic.png differ
diff --git a/docs/public/images/manual/mini-program/card-details-v102.png b/docs/public/images/manual/mini-program/card-details-v102.png
index 15d234b..b2213a2 100644
Binary files a/docs/public/images/manual/mini-program/card-details-v102.png and b/docs/public/images/manual/mini-program/card-details-v102.png differ
diff --git a/docs/public/images/manual/mini-program/card-details-v2.jpg b/docs/public/images/manual/mini-program/card-details-v2.jpg
new file mode 100644
index 0000000..b5c28d0
Binary files /dev/null and b/docs/public/images/manual/mini-program/card-details-v2.jpg differ
diff --git a/docs/public/images/manual/mini-program/card-details.png b/docs/public/images/manual/mini-program/card-details.png
new file mode 100644
index 0000000..4abca70
Binary files /dev/null and b/docs/public/images/manual/mini-program/card-details.png differ
diff --git a/docs/public/images/manual/mini-program/card-diagnosis-updated-v102.png b/docs/public/images/manual/mini-program/card-diagnosis-updated-v102.png
index 6e77799..63b5e9a 100644
Binary files a/docs/public/images/manual/mini-program/card-diagnosis-updated-v102.png and b/docs/public/images/manual/mini-program/card-diagnosis-updated-v102.png differ
diff --git a/docs/public/images/manual/mini-program/card-diagnosis-v102.png b/docs/public/images/manual/mini-program/card-diagnosis-v102.png
index 63968f9..236d94b 100644
Binary files a/docs/public/images/manual/mini-program/card-diagnosis-v102.png and b/docs/public/images/manual/mini-program/card-diagnosis-v102.png differ
diff --git a/docs/public/images/manual/mini-program/card-diagnosis-v2.jpg b/docs/public/images/manual/mini-program/card-diagnosis-v2.jpg
new file mode 100644
index 0000000..af80f61
Binary files /dev/null and b/docs/public/images/manual/mini-program/card-diagnosis-v2.jpg differ
diff --git a/docs/public/images/manual/mini-program/card-diagnosis.jpg b/docs/public/images/manual/mini-program/card-diagnosis.jpg
new file mode 100644
index 0000000..bf5dd1f
Binary files /dev/null and b/docs/public/images/manual/mini-program/card-diagnosis.jpg differ
diff --git a/docs/public/images/manual/mini-program/devices-list-account-data-v2.jpg b/docs/public/images/manual/mini-program/devices-list-account-data-v2.jpg
new file mode 100644
index 0000000..7e7a803
Binary files /dev/null and b/docs/public/images/manual/mini-program/devices-list-account-data-v2.jpg differ
diff --git a/docs/public/images/manual/mini-program/devices-list-account-data-v3.png b/docs/public/images/manual/mini-program/devices-list-account-data-v3.png
index 48a0db2..65f4bdd 100644
Binary files a/docs/public/images/manual/mini-program/devices-list-account-data-v3.png and b/docs/public/images/manual/mini-program/devices-list-account-data-v3.png differ
diff --git a/docs/public/images/manual/mini-program/devices-list-account-data.jpg b/docs/public/images/manual/mini-program/devices-list-account-data.jpg
new file mode 100644
index 0000000..44f6adc
Binary files /dev/null and b/docs/public/images/manual/mini-program/devices-list-account-data.jpg differ
diff --git a/docs/public/images/manual/mini-program/devices-page.png b/docs/public/images/manual/mini-program/devices-page.png
new file mode 100644
index 0000000..e7d1375
Binary files /dev/null and b/docs/public/images/manual/mini-program/devices-page.png differ
diff --git a/docs/public/images/manual/mini-program/devices-search-account-data-v2.jpg b/docs/public/images/manual/mini-program/devices-search-account-data-v2.jpg
new file mode 100644
index 0000000..bd2ada2
Binary files /dev/null and b/docs/public/images/manual/mini-program/devices-search-account-data-v2.jpg differ
diff --git a/docs/public/images/manual/mini-program/diagnosis-entry-from-home-v102.jpg b/docs/public/images/manual/mini-program/diagnosis-entry-from-home-v102.jpg
index 4f9f5d8..861d5c4 100644
Binary files a/docs/public/images/manual/mini-program/diagnosis-entry-from-home-v102.jpg and b/docs/public/images/manual/mini-program/diagnosis-entry-from-home-v102.jpg differ
diff --git a/docs/public/images/manual/mini-program/diagnosis-entry-from-home.png b/docs/public/images/manual/mini-program/diagnosis-entry-from-home.png
new file mode 100644
index 0000000..b9e1a3c
Binary files /dev/null and b/docs/public/images/manual/mini-program/diagnosis-entry-from-home.png differ
diff --git a/docs/public/images/manual/mini-program/diagnosis-entry-from-query-v2.png b/docs/public/images/manual/mini-program/diagnosis-entry-from-query-v2.png
new file mode 100644
index 0000000..54e145f
Binary files /dev/null and b/docs/public/images/manual/mini-program/diagnosis-entry-from-query-v2.png differ
diff --git a/docs/public/images/manual/mini-program/diagnosis-entry-from-query-v3.png b/docs/public/images/manual/mini-program/diagnosis-entry-from-query-v3.png
index 600c2ac..185b077 100644
Binary files a/docs/public/images/manual/mini-program/diagnosis-entry-from-query-v3.png and b/docs/public/images/manual/mini-program/diagnosis-entry-from-query-v3.png differ
diff --git a/docs/public/images/manual/mini-program/diagnosis-entry-from-query.jpg b/docs/public/images/manual/mini-program/diagnosis-entry-from-query.jpg
new file mode 100644
index 0000000..437b5fe
Binary files /dev/null and b/docs/public/images/manual/mini-program/diagnosis-entry-from-query.jpg differ
diff --git a/docs/public/images/manual/mini-program/diagnosis-manual-input.jpg b/docs/public/images/manual/mini-program/diagnosis-manual-input.jpg
new file mode 100644
index 0000000..db93e4f
Binary files /dev/null and b/docs/public/images/manual/mini-program/diagnosis-manual-input.jpg differ
diff --git a/docs/public/images/manual/mini-program/diagnosis-manual-input.png b/docs/public/images/manual/mini-program/diagnosis-manual-input.png
new file mode 100644
index 0000000..ac515df
Binary files /dev/null and b/docs/public/images/manual/mini-program/diagnosis-manual-input.png differ
diff --git a/docs/public/images/manual/mini-program/execution-log-allocation-details.png b/docs/public/images/manual/mini-program/execution-log-allocation-details.png
index 7c663dc..b11496a 100644
Binary files a/docs/public/images/manual/mini-program/execution-log-allocation-details.png and b/docs/public/images/manual/mini-program/execution-log-allocation-details.png differ
diff --git a/docs/public/images/manual/mini-program/execution-log-allocation-entry.png b/docs/public/images/manual/mini-program/execution-log-allocation-entry.png
index 5d75113..10e64f8 100644
Binary files a/docs/public/images/manual/mini-program/execution-log-allocation-entry.png and b/docs/public/images/manual/mini-program/execution-log-allocation-entry.png differ
diff --git a/docs/public/images/manual/mini-program/execution-log-filters-v102.png b/docs/public/images/manual/mini-program/execution-log-filters-v102.png
index a6f327f..45693a0 100644
Binary files a/docs/public/images/manual/mini-program/execution-log-filters-v102.png and b/docs/public/images/manual/mini-program/execution-log-filters-v102.png differ
diff --git a/docs/public/images/manual/mini-program/execution-log-load-more.png b/docs/public/images/manual/mini-program/execution-log-load-more.png
index ea5a983..309b2b5 100644
Binary files a/docs/public/images/manual/mini-program/execution-log-load-more.png and b/docs/public/images/manual/mini-program/execution-log-load-more.png differ
diff --git a/docs/public/images/manual/mini-program/home-card-query-v102.png b/docs/public/images/manual/mini-program/home-card-query-v102.png
index 31f791f..291d72c 100644
Binary files a/docs/public/images/manual/mini-program/home-card-query-v102.png and b/docs/public/images/manual/mini-program/home-card-query-v102.png differ
diff --git a/docs/public/images/manual/mini-program/home-card-query.png b/docs/public/images/manual/mini-program/home-card-query.png
new file mode 100644
index 0000000..3bc6863
Binary files /dev/null and b/docs/public/images/manual/mini-program/home-card-query.png differ
diff --git a/docs/public/images/manual/mini-program/home-device-overview-v102.png b/docs/public/images/manual/mini-program/home-device-overview-v102.png
index 5a4749f..db82ffe 100644
Binary files a/docs/public/images/manual/mini-program/home-device-overview-v102.png and b/docs/public/images/manual/mini-program/home-device-overview-v102.png differ
diff --git a/docs/public/images/manual/mini-program/login-entry-home-v102.png b/docs/public/images/manual/mini-program/login-entry-home-v102.png
index 06f29ab..f258b61 100644
Binary files a/docs/public/images/manual/mini-program/login-entry-home-v102.png and b/docs/public/images/manual/mini-program/login-entry-home-v102.png differ
diff --git a/docs/public/images/manual/mini-program/login-entry-home.jpg b/docs/public/images/manual/mini-program/login-entry-home.jpg
new file mode 100644
index 0000000..8956dc9
Binary files /dev/null and b/docs/public/images/manual/mini-program/login-entry-home.jpg differ
diff --git a/docs/public/images/manual/mini-program/login-page-entry-v102.png b/docs/public/images/manual/mini-program/login-page-entry-v102.png
index 923cc8e..553e005 100644
Binary files a/docs/public/images/manual/mini-program/login-page-entry-v102.png and b/docs/public/images/manual/mini-program/login-page-entry-v102.png differ
diff --git a/docs/public/images/manual/mini-program/login-page-entry.jpg b/docs/public/images/manual/mini-program/login-page-entry.jpg
new file mode 100644
index 0000000..b8b58b4
Binary files /dev/null and b/docs/public/images/manual/mini-program/login-page-entry.jpg differ
diff --git a/docs/public/images/manual/mini-program/login-success-home-v102.png b/docs/public/images/manual/mini-program/login-success-home-v102.png
index 10cd6e3..078df4b 100644
Binary files a/docs/public/images/manual/mini-program/login-success-home-v102.png and b/docs/public/images/manual/mini-program/login-success-home-v102.png differ
diff --git a/docs/public/images/manual/mini-program/photo-entry-v102.png b/docs/public/images/manual/mini-program/photo-entry-v102.png
index f3af1e6..2b3fcaa 100644
Binary files a/docs/public/images/manual/mini-program/photo-entry-v102.png and b/docs/public/images/manual/mini-program/photo-entry-v102.png differ
diff --git a/docs/public/images/manual/mini-program/photo-entry.png b/docs/public/images/manual/mini-program/photo-entry.png
new file mode 100644
index 0000000..403a6ce
Binary files /dev/null and b/docs/public/images/manual/mini-program/photo-entry.png differ
diff --git a/docs/public/images/manual/mini-program/public-card-details-updated-v102.png b/docs/public/images/manual/mini-program/public-card-details-updated-v102.png
index 3977d01..3805b6e 100644
Binary files a/docs/public/images/manual/mini-program/public-card-details-updated-v102.png and b/docs/public/images/manual/mini-program/public-card-details-updated-v102.png differ
diff --git a/docs/public/images/manual/mini-program/public-query-result-v102.png b/docs/public/images/manual/mini-program/public-query-result-v102.png
index 67c7c00..854d7b5 100644
Binary files a/docs/public/images/manual/mini-program/public-query-result-v102.png and b/docs/public/images/manual/mini-program/public-query-result-v102.png differ
diff --git a/docs/public/images/manual/mini-program/query-actions-updated-v102.png b/docs/public/images/manual/mini-program/query-actions-updated-v102.png
index ee3e264..cbcdbfd 100644
Binary files a/docs/public/images/manual/mini-program/query-actions-updated-v102.png and b/docs/public/images/manual/mini-program/query-actions-updated-v102.png differ
diff --git a/docs/public/images/manual/mini-program/query-actions-v102.png b/docs/public/images/manual/mini-program/query-actions-v102.png
index ddaa0d1..b554cf9 100644
Binary files a/docs/public/images/manual/mini-program/query-actions-v102.png and b/docs/public/images/manual/mini-program/query-actions-v102.png differ
diff --git a/docs/public/images/manual/mini-program/query-actions-v2.jpg b/docs/public/images/manual/mini-program/query-actions-v2.jpg
new file mode 100644
index 0000000..2f09818
Binary files /dev/null and b/docs/public/images/manual/mini-program/query-actions-v2.jpg differ
diff --git a/docs/public/images/manual/mini-program/query-actions.jpg b/docs/public/images/manual/mini-program/query-actions.jpg
new file mode 100644
index 0000000..89b05d3
Binary files /dev/null and b/docs/public/images/manual/mini-program/query-actions.jpg differ
diff --git a/docs/public/images/manual/mini-program/query-and-entry.jpg b/docs/public/images/manual/mini-program/query-and-entry.jpg
new file mode 100644
index 0000000..89b05d3
Binary files /dev/null and b/docs/public/images/manual/mini-program/query-and-entry.jpg differ
diff --git a/docs/public/images/manual/mini-program/query-complete-v102.png b/docs/public/images/manual/mini-program/query-complete-v102.png
index 212a786..8b30f2f 100644
Binary files a/docs/public/images/manual/mini-program/query-complete-v102.png and b/docs/public/images/manual/mini-program/query-complete-v102.png differ
diff --git a/docs/public/images/manual/mini-program/query-complete.png b/docs/public/images/manual/mini-program/query-complete.png
new file mode 100644
index 0000000..a90cc79
Binary files /dev/null and b/docs/public/images/manual/mini-program/query-complete.png differ
diff --git a/docs/public/images/manual/mini-program/query-result.png b/docs/public/images/manual/mini-program/query-result.png
index 9e93ced..41976c3 100644
Binary files a/docs/public/images/manual/mini-program/query-result.png and b/docs/public/images/manual/mini-program/query-result.png differ
diff --git a/docs/public/images/manual/mini-program/scan-entry-highlight.png b/docs/public/images/manual/mini-program/scan-entry-highlight.png
index b92684d..6dce04f 100644
Binary files a/docs/public/images/manual/mini-program/scan-entry-highlight.png and b/docs/public/images/manual/mini-program/scan-entry-highlight.png differ
diff --git a/docs/public/images/manual/mini-program/work-order-details-v102.png b/docs/public/images/manual/mini-program/work-order-details-v102.png
index b31c792..7bc4cf1 100644
Binary files a/docs/public/images/manual/mini-program/work-order-details-v102.png and b/docs/public/images/manual/mini-program/work-order-details-v102.png differ
diff --git a/docs/public/images/manual/mini-program/work-order-list-filters.png b/docs/public/images/manual/mini-program/work-order-list-filters.png
index 94758d3..79dda20 100644
Binary files a/docs/public/images/manual/mini-program/work-order-list-filters.png and b/docs/public/images/manual/mini-program/work-order-list-filters.png differ
diff --git a/docs/public/images/manual/mini-program/work-orders-submit-entry-v102.png b/docs/public/images/manual/mini-program/work-orders-submit-entry-v102.png
index bbb60ee..7f2d6f9 100644
Binary files a/docs/public/images/manual/mini-program/work-orders-submit-entry-v102.png and b/docs/public/images/manual/mini-program/work-orders-submit-entry-v102.png differ
diff --git a/docs/public/images/manual/role-create-add-button.png b/docs/public/images/manual/role-create-add-button.png
index 7dbb043..1bc9147 100644
Binary files a/docs/public/images/manual/role-create-add-button.png and b/docs/public/images/manual/role-create-add-button.png differ
diff --git a/docs/public/images/manual/role-management-entry.png b/docs/public/images/manual/role-management-entry.png
index fe31ada..5298ca1 100644
Binary files a/docs/public/images/manual/role-management-entry.png and b/docs/public/images/manual/role-management-entry.png differ
diff --git a/docs/public/images/manual/table-tools.png b/docs/public/images/manual/table-tools.png
index 1c225c4..0a5c0b1 100644
Binary files a/docs/public/images/manual/table-tools.png and b/docs/public/images/manual/table-tools.png differ
diff --git a/docs/public/images/manual/user-management-entry.png b/docs/public/images/manual/user-management-entry.png
index 76d3f5b..b7a5b5c 100644
Binary files a/docs/public/images/manual/user-management-entry.png and b/docs/public/images/manual/user-management-entry.png differ
diff --git a/docs/public/images/manual/web/card-info-export.png b/docs/public/images/manual/web/card-info-export.png
index 898a8dc..b292d54 100644
Binary files a/docs/public/images/manual/web/card-info-export.png and b/docs/public/images/manual/web/card-info-export.png differ
diff --git a/docs/public/images/manual/web/card-info-main-entry.png b/docs/public/images/manual/web/card-info-main-entry.png
index af53053..668c664 100644
Binary files a/docs/public/images/manual/web/card-info-main-entry.png and b/docs/public/images/manual/web/card-info-main-entry.png differ
diff --git a/docs/public/images/manual/web/card-info-query.png b/docs/public/images/manual/web/card-info-query.png
index 6479ce9..a962a20 100644
Binary files a/docs/public/images/manual/web/card-info-query.png and b/docs/public/images/manual/web/card-info-query.png differ
diff --git a/docs/public/images/manual/web/export-download-center.png b/docs/public/images/manual/web/export-download-center.png
index bdb1393..77f1b25 100644
Binary files a/docs/public/images/manual/web/export-download-center.png and b/docs/public/images/manual/web/export-download-center.png differ
diff --git a/docs/public/images/manual/web/inventory-inbound-methods.png b/docs/public/images/manual/web/inventory-inbound-methods.png
index d176234..88b9c35 100644
Binary files a/docs/public/images/manual/web/inventory-inbound-methods.png and b/docs/public/images/manual/web/inventory-inbound-methods.png differ
diff --git a/docs/public/images/manual/web/work-order-close.png b/docs/public/images/manual/web/work-order-close.png
index 8b55192..f2adf57 100644
Binary files a/docs/public/images/manual/web/work-order-close.png and b/docs/public/images/manual/web/work-order-close.png differ
diff --git a/docs/public/images/manual/web/work-order-communication-entry.png b/docs/public/images/manual/web/work-order-communication-entry.png
index 6a8762e..6ca3e0f 100644
Binary files a/docs/public/images/manual/web/work-order-communication-entry.png and b/docs/public/images/manual/web/work-order-communication-entry.png differ
diff --git a/docs/public/images/manual/web/work-orders-records-entry.png b/docs/public/images/manual/web/work-orders-records-entry.png
index df83874..252b569 100644
Binary files a/docs/public/images/manual/web/work-orders-records-entry.png and b/docs/public/images/manual/web/work-orders-records-entry.png differ
diff --git a/docs/public/images/manual/work-order-communication-entry.png b/docs/public/images/manual/work-order-communication-entry.png
index d5f8551..59d5243 100644
Binary files a/docs/public/images/manual/work-order-communication-entry.png and b/docs/public/images/manual/work-order-communication-entry.png differ
diff --git a/docs/public/images/manual/work-order-create-form-attachment.png b/docs/public/images/manual/work-order-create-form-attachment.png
index 2331fbf..94e2754 100644
Binary files a/docs/public/images/manual/work-order-create-form-attachment.png and b/docs/public/images/manual/work-order-create-form-attachment.png differ
diff --git a/docs/public/images/manual/work-orders-closed-evaluation.png b/docs/public/images/manual/work-orders-closed-evaluation.png
index dd20264..0bdc8b0 100644
Binary files a/docs/public/images/manual/work-orders-closed-evaluation.png and b/docs/public/images/manual/work-orders-closed-evaluation.png differ
diff --git a/docs/public/images/manual/work-orders-communication.png b/docs/public/images/manual/work-orders-communication.png
index 8612f67..538625b 100644
Binary files a/docs/public/images/manual/work-orders-communication.png and b/docs/public/images/manual/work-orders-communication.png differ
diff --git a/docs/public/images/manual/work-orders-records-entry.png b/docs/public/images/manual/work-orders-records-entry.png
index 9785430..97d53e8 100644
Binary files a/docs/public/images/manual/work-orders-records-entry.png and b/docs/public/images/manual/work-orders-records-entry.png differ
diff --git a/scripts/test-apis.ps1 b/scripts/test-apis.ps1
new file mode 100644
index 0000000..fe2baed
--- /dev/null
+++ b/scripts/test-apis.ps1
@@ -0,0 +1,174 @@
+$ErrorActionPreference = "Continue"
+$base = $env:OPENAPI_BASE_URL
+$appKey = $env:OPENAPI_APPKEY
+$appSecret = $env:OPENAPI_APPSECRET
+$iccid = $env:OPENAPI_ICCID
+$chanKey = $env:OPENAPI_CHANKEY
+if (-not $base -or -not $appKey -or -not $appSecret -or -not $iccid -or -not $chanKey) {
+ throw "Set OPENAPI_BASE_URL, OPENAPI_APPKEY, OPENAPI_APPSECRET, OPENAPI_ICCID and OPENAPI_CHANKEY first"
+}
+$tmp = Join-Path $PSScriptRoot ".apitest-output"
+
+if (-not (Test-Path $tmp)) { New-Item -ItemType Directory -Path $tmp | Out-Null }
+
+# Try a quick connectivity check
+try {
+ $ping = Invoke-WebRequest -Uri "$base/" -Method GET -TimeoutSec 8 -UseBasicParsing -ErrorAction Stop
+ Write-Host "[ping] status=$($ping.StatusCode)"
+} catch {
+ Write-Host "[ping] FAIL: $($_.Exception.Message)"
+}
+
+$ts = [DateTimeOffset]::UtcNow.ToUnixTimeMilliseconds().ToString()
+
+function Call-Api {
+ param(
+ [string]$Label,
+ [string]$Url,
+ [string]$Method = "POST",
+ [hashtable]$Headers = @{},
+ [string]$BodyJson = $null,
+ [int]$TimeoutSec = 15
+ )
+ Write-Host ""
+ Write-Host "==== $Label ===="
+ Write-Host "$Method $Url"
+ if ($Headers.Count -gt 0) { Write-Host ("Headers: " + (($Headers.GetEnumerator() | ForEach-Object { "$($_.Key):
" }) -join "; ")) }
+ if ($null -ne $BodyJson) {
+ $logBody = $BodyJson | ConvertFrom-Json
+ if ($logBody.verify) {
+ $logBody.verify.password = ""
+ $logBody.verify.sign = ""
+ }
+ Write-Host ("Body: " + ($logBody | ConvertTo-Json -Depth 10 -Compress))
+ }
+ try {
+ $params = @{
+ Uri = $Url
+ Method = $Method
+ TimeoutSec = $TimeoutSec
+ UseBasicParsing = $true
+ }
+ if ($Headers.Count -gt 0) { $params.Headers = $Headers }
+ if ($null -ne $BodyJson) {
+ $params.ContentType = "application/json; charset=utf-8"
+ $params.Body = $BodyJson
+ }
+ $resp = Invoke-WebRequest @params -ErrorAction Stop
+ $code = $resp.StatusCode
+ $text = $resp.Content
+ Write-Host "HTTP $code"
+ if ($text.Length -gt 4000) {
+ Write-Host $text.Substring(0, 4000)
+ $fn = Join-Path $tmp ("$Label".Replace('\','_').Replace('/','_') + ".txt")
+ Set-Content -LiteralPath $fn -Value $text -Encoding utf8NoBOM
+ Write-Host "(truncated, full saved to $fn)"
+ } else {
+ Write-Host $text
+ }
+ } catch {
+ $msg = $_.Exception.Message
+ Write-Host "ERROR: $msg"
+ if ($_.Exception.Response) {
+ $sr = New-Object System.IO.StreamReader($_.Exception.Response.GetResponseStream())
+ $body = $sr.ReadToEnd()
+ Write-Host "BODY: $body"
+ }
+ }
+}
+
+# ===== V3 =====
+# 3.2 token (obtain once, reuse for the rest of V3)
+$tokenJson = $null
+try {
+ $tokenBody = @{ appKey=$appKey; appSecret=$appSecret } | ConvertTo-Json -Compress
+ $resp = Invoke-WebRequest -Uri "$base/openapi/v3/query/token" -Method POST -ContentType "application/json; charset=utf-8" -Body $tokenBody -TimeoutSec 12 -UseBasicParsing -ErrorAction Stop
+ $tokenJson = $resp.Content
+ Write-Host "==== V3-token ===="
+ Write-Host "POST $base/openapi/v3/query/token"
+ Write-Host 'Body: '
+ Write-Host "HTTP $($resp.StatusCode)"
+ Write-Host 'Token response received (token redacted)'
+} catch {
+ Write-Host "==== V3-token ===="
+ Write-Host "POST $base/openapi/v3/query/token"
+ Write-Host "token fetch FAIL: $($_.Exception.Message)"
+ if ($_.Exception.Response) {
+ $sr = New-Object System.IO.StreamReader($_.Exception.Response.GetResponseStream())
+ Write-Host "token err body: $($sr.ReadToEnd())"
+ }
+}
+
+$accessToken = $null
+$appId = $null
+if ($tokenJson) {
+ try {
+ $obj = $tokenJson | ConvertFrom-Json
+ $accessToken = $obj.data.accessToken
+ $appId = $obj.data.appId
+ Write-Host "Got accessToken (len=$($accessToken.Length)), appId="
+ } catch {
+ Write-Host "token parse error: $($_.Exception.Message)"
+ }
+}
+
+if ($accessToken) {
+ $authHeader = @{ "X-Access-Token" = $accessToken }
+
+ # 3.3 access-token (carrier)
+ $b = @{ appId=$appId; chanKey=$chanKey } | ConvertTo-Json -Compress
+ Call-Api -Label "V3-access-token" -Url "$base/openapi/v3/query/access-token" -Headers $authHeader -BodyJson $b
+
+ # 3.4 sim-info
+ $b = @{ appId=$appId; iccid=$iccid } | ConvertTo-Json -Compress
+ Call-Api -Label "V3-sim-info" -Url "$base/openapi/v3/query/sim-info" -Headers $authHeader -BodyJson $b
+
+ # 3.5 sim-limit
+ $b = @{ appId=$appId; iccid=$iccid } | ConvertTo-Json -Compress
+ Call-Api -Label "V3-sim-limit" -Url "$base/openapi/v3/query/sim-limit" -Headers $authHeader -BodyJson $b
+
+ # 3.6 sim-imei
+ $b = @{ appId=$appId; iccid=$iccid } | ConvertTo-Json -Compress
+ Call-Api -Label "V3-sim-imei" -Url "$base/openapi/v3/query/sim-imei" -Headers $authHeader -BodyJson $b
+
+ # 3.7 sim-usage
+ $b = @{ appId=$appId; iccid=$iccid } | ConvertTo-Json -Compress
+ Call-Api -Label "V3-sim-usage" -Url "$base/openapi/v3/query/sim-usage" -Headers $authHeader -BodyJson $b
+} else {
+ Write-Host "[skip] no accessToken; skipping V3 authenticated endpoints"
+}
+
+# ===== V1+V2 =====
+$verify = @{
+ timeStamp = $ts
+ password = $appSecret
+ appId = $appKey
+ sign = ""
+}
+
+# 3.1 cardInfo
+$b = @{ Param = @{ type="iccid"; cardno=$iccid }; verify = $verify } | ConvertTo-Json -Depth 6 -Compress
+Call-Api -Label "V1V2-cardInfo" -Url "$base/route/open/cardInfo" -BodyJson $b
+
+# 3.2 simDataUsage
+$b = @{ Param = @{ iccid=$iccid }; verify = $verify } | ConvertTo-Json -Depth 6 -Compress
+Call-Api -Label "V1V2-simDataUsage" -Url "$base/route/open/simDataUsage" -BodyJson $b
+
+# 3.3 simDataUsageMonthly
+$b = @{ Param = @{ iccid=$iccid; dateTime="2025-09-14" }; verify = $verify } | ConvertTo-Json -Depth 6 -Compress
+Call-Api -Label "V1V2-simDataUsageMonthly" -Url "$base/route/open/simDataUsageMonthly" -BodyJson $b
+
+# 3.4 simStatus
+$b = @{ Param = @{ iccid=$iccid }; verify = $verify } | ConvertTo-Json -Depth 6 -Compress
+Call-Api -Label "V1V2-simStatus" -Url "$base/route/open/simStatus" -BodyJson $b
+
+# 3.5 simSession
+$b = @{ Param = @{ iccid=$iccid }; verify = $verify } | ConvertTo-Json -Depth 6 -Compress
+Call-Api -Label "V1V2-simSession" -Url "$base/route/open/simSession" -BodyJson $b
+
+# 3.6 queryCardInfoList
+$b = @{ Param = @{ iccid = @($iccid) }; verify = $verify } | ConvertTo-Json -Depth 6 -Compress
+Call-Api -Label "V1V2-queryCardInfoList" -Url "$base/route/open/queryCardInfoList" -BodyJson $b
+
+Write-Host ""
+Write-Host "==== DONE ===="