first commit
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
"""给每箱 × 每身份建"默认配比"模板并置为生效。
|
||||
|
||||
为什么需要:箱子的一个 cycle 抽满后(drawn ≥ N),Java 会
|
||||
cycleRepository.resetCycle() + distributionService.refillFromConfig(boxId, audience)
|
||||
而 refillFromConfig 是**按 (boxId, audience) 查生效模板**(is_active=1,取 id 最大的一条):
|
||||
- 有生效模板 → 按模板 items_json 重写 count(writeDistribution),并按固定池反推回写 total_ornaments
|
||||
- 没有模板 → 只把 used 归零(配比不变)
|
||||
所以要让"抽完按模板重填",必须给每个 (box, audience) 都有一条生效模板。
|
||||
|
||||
用法:
|
||||
python _make_templates.py --dry # 只看会写什么
|
||||
python _make_templates.py # 写入
|
||||
"""
|
||||
import argparse
|
||||
import json
|
||||
from collections import defaultdict
|
||||
|
||||
import olympus_db as db
|
||||
from olympus.config import AUDIENCES
|
||||
|
||||
TEMPLATE_NAME = '默认配比'
|
||||
|
||||
|
||||
def build_rows():
|
||||
rows = []
|
||||
with db.get_conn() as conn:
|
||||
cur = conn.cursor()
|
||||
cur.execute('SELECT box_id, box_type, bet, rtp FROM game_olympus_box ORDER BY box_id')
|
||||
boxes = cur.fetchall()
|
||||
cur.execute('''SELECT box_id, ornament_id, audience, count
|
||||
FROM game_olympus_box_ornament ORDER BY box_id, audience, ornament_id''')
|
||||
cfg = defaultdict(dict)
|
||||
for box_id, orn, aud, cnt in cur.fetchall():
|
||||
cfg[(int(box_id), aud)][int(orn)] = int(cnt)
|
||||
for box_id, box_type, bet, rtp in boxes:
|
||||
for aud in AUDIENCES:
|
||||
items = cfg.get((int(box_id), aud), {})
|
||||
if not items:
|
||||
print('!! box%s %s 无配比,跳过' % (box_id, aud))
|
||||
continue
|
||||
items_json = json.dumps(
|
||||
[{'ornamentId': k, 'count': v} for k, v in sorted(items.items())],
|
||||
ensure_ascii=False, separators=(',', ':'))
|
||||
rows.append((int(box_id), aud, TEMPLATE_NAME, sum(items.values()), items_json))
|
||||
return rows
|
||||
|
||||
|
||||
def main():
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument('--dry', action='store_true')
|
||||
args = ap.parse_args()
|
||||
rows = build_rows()
|
||||
print('待写模板 %d 条(%d 箱 × %d 身份)' % (len(rows), len(rows) // len(AUDIENCES), len(AUDIENCES)))
|
||||
if args.dry:
|
||||
print('样例:', rows[0][:4], rows[0][4][:80], '...')
|
||||
return
|
||||
with db.get_conn() as conn:
|
||||
cur = conn.cursor()
|
||||
# 先取消原有生效模板,再 upsert(表上有 uk_box_aud_name 唯一键)
|
||||
cur.execute('''UPDATE game_olympus_box_template SET is_active=0''')
|
||||
cur.executemany('''INSERT INTO game_olympus_box_template
|
||||
(box_id, audience, name, total_rounds, items_json, is_active, create_time)
|
||||
VALUES (%s,%s,%s,%s,%s,1,NOW())
|
||||
ON DUPLICATE KEY UPDATE total_rounds=VALUES(total_rounds),
|
||||
items_json=VALUES(items_json), is_active=1, create_time=NOW()''', rows)
|
||||
cur.execute('''SELECT COUNT(*), SUM(is_active) FROM game_olympus_box_template''')
|
||||
print('模板表: 总行数/生效行数 =', cur.fetchone())
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user