fix(platform): apply_model_pricing幂等修正(用户纠正:时序应只一条有效行)——内容无变化跳过/同日启用原地更新(防零宽死行)/仅历史行拉链;此前重复执行堆垃圾时序行
This commit is contained in:
parent
4543e035dd
commit
885a52c7d8
@ -720,16 +720,54 @@ async def _h_apply_model_pricing(sor, params, ctx):
|
|||||||
pp_desc = "定价出处:%s | 文档原文:%s" % (doc_url or "(未提供)", desc_quotes)
|
pp_desc = "定价出处:%s | 文档原文:%s" % (doc_url or "(未提供)", desc_quotes)
|
||||||
now = time.strftime('%Y-%m-%d')
|
now = time.strftime('%Y-%m-%d')
|
||||||
if old_ppid:
|
if old_ppid:
|
||||||
# 幂等更新:新时序行(拉链——旧行 expired_date 截到今天)
|
|
||||||
ppid = old_ppid
|
ppid = old_ppid
|
||||||
|
# 幂等核心(2026-09-05 用户纠正:时序应只有一条有效行,重复执行不得堆历史):
|
||||||
|
# 先取当前生效行比对内容——
|
||||||
|
# 内容相同 → 跳过(不产生新时序行)
|
||||||
|
# 内容不同且生效行今天才启用 → 原地 UPDATE(同日替换无历史区间可保留,
|
||||||
|
# 拉链会产生 enabled==expired 的零宽死行,纯垃圾)
|
||||||
|
# 内容不同且生效行是历史日期 → 正常拉链(关旧行+插新行)
|
||||||
|
recs2 = await sor.sqlExe(
|
||||||
|
"SELECT id, pricing_data, enabled_date FROM pricing_program_timing "
|
||||||
|
"WHERE ppid=${p}$ AND expired_date='9999-12-31' "
|
||||||
|
"ORDER BY enabled_date DESC LIMIT 1", {"p": ppid})
|
||||||
|
await sor.sqlExe("COMMIT", {})
|
||||||
|
cur = recs2[0] if recs2 else None
|
||||||
|
same = False
|
||||||
|
if cur is not None:
|
||||||
|
try:
|
||||||
|
same = (yaml.safe_load(getattr(cur, 'pricing_data', '') or '{}')
|
||||||
|
== yaml.safe_load(yaml_str))
|
||||||
|
except Exception:
|
||||||
|
same = (getattr(cur, 'pricing_data', '') or '') == yaml_str
|
||||||
|
await sor.sqlExe(
|
||||||
|
"UPDATE pricing_program SET description=${d}$ WHERE id=${i}$",
|
||||||
|
{"d": pp_desc[:1000], "i": ppid})
|
||||||
|
await sor.sqlExe("COMMIT", {})
|
||||||
|
if same:
|
||||||
|
results.append({"model": vmid, "ok": True, "ppid": ppid,
|
||||||
|
"action": "无变化(幂等跳过,未产生新时序行)",
|
||||||
|
"items": len(mitems), "factor": factor,
|
||||||
|
"dimensions": sorted(dims_all)})
|
||||||
|
continue
|
||||||
|
if cur is not None and str(getattr(cur, 'enabled_date', ''))[:10] == now:
|
||||||
|
await sor.sqlExe(
|
||||||
|
"UPDATE pricing_program_timing SET pricing_data=${y}$, name=${n}$ "
|
||||||
|
"WHERE id=${i}$",
|
||||||
|
{"y": yaml_str, "n": "%s %s计价" % (vmid, factor),
|
||||||
|
"i": getattr(cur, 'id', '')})
|
||||||
|
await sor.sqlExe("COMMIT", {})
|
||||||
|
action = "原地更新(同日替换,不产生历史行)"
|
||||||
|
results.append({"model": vmid, "ok": True, "ppid": ppid,
|
||||||
|
"action": action, "items": len(mitems),
|
||||||
|
"factor": factor, "dimensions": sorted(dims_all)})
|
||||||
|
continue
|
||||||
|
# 历史生效行 → 拉链
|
||||||
await sor.sqlExe(
|
await sor.sqlExe(
|
||||||
"UPDATE pricing_program_timing SET expired_date=${d}$ "
|
"UPDATE pricing_program_timing SET expired_date=${d}$ "
|
||||||
"WHERE ppid=${p}$ AND expired_date='9999-12-31'",
|
"WHERE ppid=${p}$ AND expired_date='9999-12-31'",
|
||||||
{"d": now, "p": ppid})
|
{"d": now, "p": ppid})
|
||||||
await sor.sqlExe(
|
action = "更新(拉链:旧行截至今日,新时序生效 %s)" % now
|
||||||
"UPDATE pricing_program SET description=${d}$ WHERE id=${i}$",
|
|
||||||
{"d": pp_desc[:1000], "i": ppid})
|
|
||||||
action = "更新(新时序生效 %s)" % now
|
|
||||||
else:
|
else:
|
||||||
ppid = getID()
|
ppid = getID()
|
||||||
await sor.C("pricing_program", {
|
await sor.C("pricing_program", {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user