Files
junhong_cmp_fiber/openspec/changes/archive/2026-09-18-fix-device-realname-without-current-card/reconciliation.md
break 54c4ec7ba4
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 14m42s
fix(设备实名): 无当前卡时按绑定卡实名回退并初始化单槽当前卡
- 设备资产解析外层 real_name_status:存在当前使用卡时沿用该卡状态,无任何当前卡时任一有效绑定卡已实名即视为已实名
- 手工绑定与设备导入:设备最大槽位为 1 且有效绑定唯一时,在同一事务内将该绑定初始化为当前使用卡;多卡设备不推断
- 同步 asset-device、personal-customer 主 Spec;归档变更并附存量核对清单(75 条单槽唯一待修复绑定,其中 16 条已实名)
2026-09-18 17:49:12 +08:00

154 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 存量当前卡标识核对与受控修复清单
本文件是 change `fix-device-realname-without-current-card` 任务 4.1 的只读核对产物,供维护者执行任务 4.2 的受控修复使用。
- 核对时间2026-09-18
- 核对环境生产库只读查询dbhub `pro_main`),全程未产生写入。
- 核对口径:`design.md` 决策 4 的只读查询。
## 口径 SQL
```sql
SELECT d.id AS device_id, b.id AS binding_id, b.iot_card_id
FROM tb_device_sim_binding b
JOIN tb_device d ON d.id = b.device_id AND d.deleted_at IS NULL
WHERE b.bind_status = 1
AND d.max_sim_slots = 1
AND NOT EXISTS (SELECT 1 FROM tb_device_sim_binding x
WHERE x.device_id = b.device_id AND x.bind_status = 1 AND x.is_current)
AND (SELECT count(*) FROM tb_device_sim_binding y
WHERE y.device_id = b.device_id AND y.bind_status = 1) = 1;
```
## 结果统计
| 指标 | 数量 |
| --- | --- |
| 待修复绑定(=待修复设备) | 75 |
| 其中绑定卡已实名(`real_name_status = 1` | 16 |
| 其中绑定卡未实名 | 59 |
影响面参考(同库只读统计):
| 指标 | 数量 |
| --- | --- |
| 存在有效绑定卡的设备 | 19031 |
| 其中没有任何当前卡标识 | 638 |
| 其中存在已实名绑定卡 | 76 |
| 其中单槽唯一有效绑定(本清单范围) | 75已实名 16 |
## 待修复绑定清单
| device_no | device_id | binding_id | iot_card_id | iccid | real_name_status |
| --- | --- | --- | --- | --- | --- |
| 60002846141 | 6 | 11 | 5113 | 89860624660028461414 | 1 |
| 60002846880 | 11 | 16 | 5118 | 89860624660028468807 | 1 |
| 60002817472 | 13 | 18 | 5120 | 89860624660028174728 | 1 |
| 60002817732 | 14 | 19 | 5121 | 89860624660028177325 | 1 |
| 60002842491 | 16 | 21 | 5123 | 89860624660028424917 | 1 |
| 90001595835 | 369 | 974 | 86943 | 89860624590015958355 | 1 |
| 60003081045 | 18909 | 36349 | 131202 | 89860624660030810459 | 1 |
| 90001595210 | 18912 | 36356 | 131211 | 89860624590015952101 | 1 |
| 90001595801 | 18921 | 36373 | 131227 | 89860624590015958017 | 1 |
| 90001595438 | 18942 | 36414 | 131355 | 89860624590015954388 | 1 |
| 60003080864 | 19081 | 36711 | 131611 | 89860624660030808644 | 1 |
| 90001595459 | 19082 | 36712 | 131226 | 89860624590015954594 | 1 |
| 90001595626 | 19090 | 36730 | 131609 | 89860624590015956268 | 1 |
| 60003080488 | 19091 | 36731 | 131610 | 89860624660030804882 | 1 |
| 90001595086 | 19092 | 36732 | 131679 | 89860624590015950865 | 1 |
| 60003081496 | 19128 | 36784 | 131780 | 89860624660030814964 | 1 |
| 60002842359 | 7 | 12 | 5114 | 89860624660028423596 | 0 |
| 60002846803 | 8 | 13 | 5115 | 89860624660028468039 | 0 |
| 60002842779 | 9 | 14 | 5116 | 89860624660028427795 | 0 |
| 60002842976 | 10 | 15 | 5117 | 89860624660028429767 | 0 |
| 60002817595 | 12 | 17 | 5119 | 89860624660028175956 | 0 |
| 60002817949 | 15 | 20 | 5122 | 89860624660028179495 | 0 |
| 60003080109 | 368 | 973 | 86942 | 89860624660030801094 | 0 |
| 60003081398 | 370 | 975 | 86944 | 89860624660030813982 | 0 |
| 90001595523 | 371 | 976 | 86945 | 89860624590015955237 | 0 |
| 60003081183 | 372 | 977 | 86946 | 89860624660030811838 | 0 |
| 60003081174 | 373 | 978 | 86947 | 89860624660030811747 | 0 |
| 60003081651 | 374 | 979 | 86948 | 89860624660030816514 | 0 |
| 90001595896 | 375 | 980 | 86949 | 89860624590015958967 | 0 |
| 60003080879 | 376 | 981 | 86950 | 89860624660030808792 | 0 |
| 90001595588 | 377 | 982 | 86951 | 89860624590015955880 | 0 |
| 60003081516 | 378 | 983 | 86952 | 89860624660030815169 | 0 |
| 60003081645 | 379 | 984 | 86953 | 89860624660030816456 | 0 |
| 60003081643 | 380 | 985 | 86954 | 89860624660030816431 | 0 |
| 60003080711 | 381 | 986 | 86955 | 89860624660030807117 | 0 |
| 60003080190 | 382 | 987 | 86956 | 89860624660030801904 | 0 |
| 90001595805 | 383 | 988 | 86957 | 89860624590015958058 | 0 |
| 60003080161 | 384 | 989 | 86958 | 89860624660030801615 | 0 |
| 90001595810 | 385 | 990 | 86959 | 89860624590015958108 | 0 |
| 60003081366 | 386 | 991 | 86960 | 89860624660030813669 | 0 |
| 60003081251 | 387 | 992 | 86961 | 89860624660030812513 | 0 |
| 60003081350 | 388 | 993 | 86962 | 89860624660030813503 | 0 |
| 60003080752 | 389 | 994 | 86963 | 89860624660030807521 | 0 |
| 60003081310 | 390 | 995 | 86964 | 89860624660030813107 | 0 |
| 60003080791 | 391 | 996 | 86965 | 89860624660030807919 | 0 |
| 60003081268 | 392 | 997 | 86966 | 89860624660030812687 | 0 |
| 90001595763 | 18913 | 36357 | 131212 | 89860624590015957639 | 0 |
| 90001595413 | 18914 | 36358 | 131213 | 89860624590015954131 | 0 |
| 60003080907 | 19093 | 36733 | 131680 | 89860624660030809071 | 0 |
| 60002817276 | 19101 | 36756 | 112006 | 89860624660028172763 | 0 |
| 60003080052 | 19102 | 36757 | 131715 | 89860624660030800526 | 0 |
| 90001595253 | 19103 | 36758 | 131716 | 89860624590015952531 | 0 |
| 90001595502 | 19104 | 36759 | 131717 | 89860624590015955021 | 0 |
| 60003081741 | 19105 | 36760 | 131718 | 89860624660030817413 | 0 |
| 90001595886 | 19107 | 36763 | 131719 | 89860624590015958868 | 0 |
| 90001595902 | 19108 | 36764 | 131720 | 89860624590015959023 | 0 |
| 90001595553 | 19109 | 36765 | 131721 | 89860624590015955534 | 0 |
| 90001595460 | 19110 | 36766 | 131722 | 89860624590015954602 | 0 |
| 60003081979 | 19111 | 36767 | 131723 | 89860624660030819799 | 0 |
| 60003081938 | 19112 | 36768 | 131724 | 89860624660030819385 | 0 |
| 60003081807 | 19113 | 36769 | 131725 | 89860624660030818072 | 0 |
| 90001595761 | 19114 | 36770 | 131726 | 89860624590015957613 | 0 |
| 90001595422 | 19115 | 36771 | 131727 | 89860624590015954222 | 0 |
| 60003081975 | 19116 | 36772 | 131728 | 89860624660030819757 | 0 |
| 60003080037 | 19117 | 36773 | 131729 | 89860624660030800377 | 0 |
| 90001595510 | 19118 | 36774 | 131730 | 89860624590015955104 | 0 |
| 60003080038 | 19119 | 36775 | 131731 | 89860624660030800385 | 0 |
| 60003080062 | 19120 | 36776 | 131732 | 89860624660030800625 | 0 |
| 60002817135 | 19121 | 36777 | 111363 | 89860624660028171351 | 0 |
| 60003080264 | 19122 | 36778 | 131745 | 89860624660030802647 | 0 |
| 90001595473 | 19123 | 36779 | 131746 | 89860624590015954735 | 0 |
| 60003080128 | 19124 | 36780 | 131776 | 89860624660030801284 | 0 |
| 90001595873 | 19125 | 36781 | 131777 | 89860624590015958736 | 0 |
| 60003081839 | 19126 | 36782 | 131778 | 89860624660030818395 | 0 |
| 60003081051 | 19127 | 36783 | 131779 | 89860624660030810517 | 0 |
## 受控修复(由维护者执行,不随发布自动执行)
修复语句使用与核对完全相同的口径,且限定 `bind_status = 1`,同一设备至多命中一条:
```sql
UPDATE tb_device_sim_binding b
SET is_current = true, updated_at = now()
WHERE b.bind_status = 1
AND b.id IN (
SELECT b2.id
FROM tb_device_sim_binding b2
JOIN tb_device d ON d.id = b2.device_id AND d.deleted_at IS NULL
WHERE b2.bind_status = 1
AND d.max_sim_slots = 1
AND NOT EXISTS (SELECT 1 FROM tb_device_sim_binding x
WHERE x.device_id = b2.device_id AND x.bind_status = 1 AND x.is_current)
AND (SELECT count(*) FROM tb_device_sim_binding y
WHERE y.device_id = b2.device_id AND y.bind_status = 1) = 1
);
```
执行前后核对:
1. 执行前重跑本文件口径 SQL与清单行数75比对不一致则以最新结果为准。
2. 执行后重跑口径 SQL结果应为 0 行。
3. 校验同一设备不存在多条 `is_current = true`
```sql
SELECT device_id, count(*) FROM tb_device_sim_binding
WHERE bind_status = 1 AND is_current GROUP BY device_id HAVING count(*) > 1;
```
应返回 0 行。
4. 抽样实接口核对资产信息外层实名与卡列表当前卡标识(含设备 `90001595626`)。
回滚:`UPDATE tb_device_sim_binding SET is_current = false WHERE id IN (<清单 binding_id>)`。