This commit is contained in:
@@ -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,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user