修复
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 53s

This commit is contained in:
Break
2026-05-29 15:08:25 +08:00
parent 1ee554daec
commit 6c8352491c
4 changed files with 200 additions and 20 deletions

View File

@@ -46,16 +46,19 @@ class CardRow:
class DeviceRow:
"""devices.csv 单行的解析结果。
简化为业务方核心关心的列:imei / virtual_no / sim_iccid_*。
简化为业务方核心关心的列:imei / virtual_no / device_* / max_sim_slots / sim_iccid_*。
店铺归属由"主卡 sim_iccid_1 的 agent_id → mapping.agents.target_shop_code"推导。
其他字段(device_name/device_model/manufacturer 等)直接用默认值,不暴露给业务方。
其他字段(manufacturer 等)直接用默认值,不暴露给业务方。
"""
line_no: int
imei: str
virtual_no: str # 留空时用 imei 兜底,见 _load_devices
sim_iccids: dict[int, str] # slot → iccid(只保留非空)
max_sim_slots: int = 4 # 默认 4 槽位
device_name: str = ""
device_model: str = ""
device_type: str = ""
max_sim_slots: int = 1 # 不填时按非空 sim_iccid_* 的最大槽位推导
current_slot: int = 1 # 默认 slot 1 为当前生效
@@ -220,6 +223,9 @@ def _load_devices(path: Path, result: LoadResult) -> None:
for idx, raw in enumerate(reader, start=2):
imei = _normalize_cell(raw.get("imei", ""))
virtual_no = _normalize_cell(raw.get("virtual_no", ""))
device_name = _normalize_cell(raw.get("device_name", ""))
device_model = _normalize_cell(raw.get("device_model", ""))
device_type = _normalize_cell(raw.get("device_type", ""))
# virtual_no 留空时用 imei 兜底(业务方说"虚拟号一般会提供,没有就用 imei")
effective_vno = virtual_no or imei
if not effective_vno:
@@ -242,12 +248,43 @@ def _load_devices(path: Path, result: LoadResult) -> None:
if v:
sim_iccids[slot] = v
max_sim_slots_raw = _normalize_cell(raw.get("max_sim_slots", ""))
if max_sim_slots_raw:
try:
max_sim_slots = int(max_sim_slots_raw)
except ValueError:
result.errors.append(
ErrorRow("devices.csv", idx, "max_sim_slots", max_sim_slots_raw, "invalid",
"最大卡槽数必须是 1-4 的整数")
)
continue
if max_sim_slots < 1 or max_sim_slots > 4:
result.errors.append(
ErrorRow("devices.csv", idx, "max_sim_slots", max_sim_slots_raw, "invalid",
"最大卡槽数必须在 1-4 之间")
)
continue
else:
max_sim_slots = max(sim_iccids.keys(), default=1)
overflow_slots = [slot for slot in sim_iccids if slot > max_sim_slots]
if overflow_slots:
result.errors.append(
ErrorRow("devices.csv", idx, "max_sim_slots", str(max_sim_slots), "slot_overflow",
f"已填写的卡槽 {max(overflow_slots)} 超出最大卡槽数")
)
continue
result.devices.append(
DeviceRow(
line_no=idx,
imei=imei,
virtual_no=effective_vno,
device_name=device_name,
device_model=device_model,
device_type=device_type,
sim_iccids=sim_iccids,
max_sim_slots=max_sim_slots,
)
)