迁移脚本的修复
This commit is contained in:
@@ -338,19 +338,34 @@ def _target_series_id_expr_for_iccid(
|
||||
"""按卡当前套餐映射生成新库套餐系列 SQL 表达式。
|
||||
|
||||
系列归属以新系统目标套餐为准,避免奇成套餐系列与新库系列二次映射不一致。
|
||||
如果旧卡没有当前正式套餐,但本批 mapping 只指定了一个 target_series_id,则按批量兜底写入。
|
||||
"""
|
||||
if not iccid:
|
||||
return "NULL"
|
||||
meta = card_metas.get(iccid)
|
||||
if meta is None or not meta.current_meal_id:
|
||||
if meta is None:
|
||||
return "NULL"
|
||||
pkg_map = mapping.lookup_package(meta.current_meal_id)
|
||||
if pkg_map is None or not pkg_map.target_package_id:
|
||||
series_candidates: list[str] = []
|
||||
if meta.current_meal_id:
|
||||
pkg_map = mapping.lookup_package(meta.current_meal_id)
|
||||
if pkg_map is not None and pkg_map.target_package_id:
|
||||
series_candidates.append(
|
||||
"(SELECT series_id FROM tb_package "
|
||||
f"WHERE id = {pkg_map.target_package_id} AND package_type = 'formal' AND deleted_at IS NULL LIMIT 1)"
|
||||
)
|
||||
series_map = mapping.lookup_series(getattr(meta, "current_series_id", ""))
|
||||
if series_map is not None and series_map.target_series_id:
|
||||
series_candidates.append(str(series_map.target_series_id))
|
||||
default_series_ids = sorted({
|
||||
item.target_series_id
|
||||
for item in mapping.series.values()
|
||||
if item.target_series_id
|
||||
})
|
||||
if len(default_series_ids) == 1 and str(default_series_ids[0]) not in series_candidates:
|
||||
series_candidates.append(str(default_series_ids[0]))
|
||||
if not series_candidates:
|
||||
return "NULL"
|
||||
return (
|
||||
"(SELECT series_id FROM tb_package "
|
||||
f"WHERE id = {pkg_map.target_package_id} AND package_type = 'formal' AND deleted_at IS NULL LIMIT 1)"
|
||||
)
|
||||
return f"COALESCE({', '.join(series_candidates)})"
|
||||
|
||||
|
||||
def _write_formal_package_guard(f, target_pkg_id: int, legacy_meal_name: str) -> None:
|
||||
@@ -373,7 +388,8 @@ def _write_formal_package_guard(f, target_pkg_id: int, legacy_meal_name: str) ->
|
||||
f"'迁移套餐映射禁止指向加油包: legacy_meal_name=' || {_sql_str(legacy_meal_name)} || "
|
||||
f"', target_package_id={target_pkg_id}, package_type=' || v_package_type;\n"
|
||||
" END IF;\n"
|
||||
"END $$;\n\n"
|
||||
"END;\n"
|
||||
"$$;\n\n"
|
||||
)
|
||||
|
||||
|
||||
@@ -390,7 +406,8 @@ def _write_shop_guards(f, shop_codes: set[str]) -> None:
|
||||
" RAISE EXCEPTION USING MESSAGE = "
|
||||
f"'迁移目标店铺不存在或已删除: shop_code={shop_code}';\n"
|
||||
" END IF;\n"
|
||||
"END $$;\n\n"
|
||||
"END;\n"
|
||||
"$$;\n\n"
|
||||
)
|
||||
|
||||
|
||||
@@ -635,6 +652,7 @@ def _write_iot_cards(
|
||||
"SET\n"
|
||||
f" status = {card_status},\n"
|
||||
f" shop_id = {shop_id_expr},\n"
|
||||
f" series_id = COALESCE({series_id_expr}, series_id),\n"
|
||||
f" virtual_no = {_sql_str(card_virtual_no) if card_virtual_no else 'NULL'},\n"
|
||||
f" is_standalone = {is_standalone},\n"
|
||||
f" device_virtual_no = {_sql_str(device_virtual_no)},\n"
|
||||
@@ -643,6 +661,7 @@ def _write_iot_cards(
|
||||
" AND (\n"
|
||||
f" status IS DISTINCT FROM {card_status}\n"
|
||||
f" OR shop_id IS DISTINCT FROM {shop_id_expr}\n"
|
||||
f" OR ({series_id_expr}) IS NOT NULL AND series_id IS DISTINCT FROM ({series_id_expr})\n"
|
||||
f" OR virtual_no IS DISTINCT FROM {_sql_str(card_virtual_no) if card_virtual_no else 'NULL'}\n"
|
||||
f" OR is_standalone IS DISTINCT FROM {is_standalone}\n"
|
||||
f" OR device_virtual_no IS DISTINCT FROM {_sql_str(device_virtual_no)}\n"
|
||||
@@ -705,6 +724,7 @@ def _write_devices(
|
||||
("max_sim_slots", str(d.max_sim_slots)),
|
||||
("status", str(device_status)),
|
||||
("shop_id", shop_id_expr),
|
||||
("series_id", series_id_expr),
|
||||
("device_name", d.device_name),
|
||||
("device_model", d.device_model),
|
||||
("device_type", d.device_type),
|
||||
@@ -712,13 +732,16 @@ def _write_devices(
|
||||
if value or column in {"max_sim_slots", "status", "shop_id"}
|
||||
]
|
||||
if metadata_updates:
|
||||
sql_literal_columns = {"max_sim_slots", "status", "shop_id"}
|
||||
sql_literal_columns = {"max_sim_slots", "status", "shop_id", "series_id"}
|
||||
set_lines = [
|
||||
f"{column} = {value}" if column in sql_literal_columns else f"{column} = {_sql_str(value)}"
|
||||
f"{column} = COALESCE({value}, {column})" if column == "series_id"
|
||||
else f"{column} = {value}" if column in sql_literal_columns
|
||||
else f"{column} = {_sql_str(value)}"
|
||||
for column, value in metadata_updates
|
||||
]
|
||||
diff_checks = [
|
||||
f"{column} IS DISTINCT FROM {value}"
|
||||
f"({value}) IS NOT NULL AND {column} IS DISTINCT FROM ({value})" if column == "series_id"
|
||||
else f"{column} IS DISTINCT FROM {value}"
|
||||
if column in sql_literal_columns
|
||||
else f"{column} IS DISTINCT FROM {_sql_str(value)}"
|
||||
for column, value in metadata_updates
|
||||
|
||||
Reference in New Issue
Block a user