pricing/pricing/init.py

50 lines
2.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from appPublic.log import debug
from sqlor.dbpools import DBPools
from pricing.pricing import (
PricingProgram,
test_pricing,
generate_formula_from_factors,
get_pricing_display,
)
from ahserver.serverenv import ServerEnv
def _bind_pricing_events(dbpools, dbname):
"""Bind database events to Pricing cache invalidation handlers."""
bindings = [
# pricing_program_timing: SQLor 事件 payload 不保证含 ppid
# U/C 通过 id 反查 ppidD 需 before 预缓存供 after 刷新缓存。
(f'{dbname}:pricing_program_timing:c:after', PricingProgram.on_timing_create),
(f'{dbname}:pricing_program_timing:u:after', PricingProgram.reload_pp_data),
(f'{dbname}:pricing_program_timing:d:before', PricingProgram.precache_timing_delete),
(f'{dbname}:pricing_program_timing:d:after', PricingProgram.on_timing_delete),
# pricing_program: 增删改均刷新该程序的全部缓存
(f'{dbname}:pricing_program:c:after', PricingProgram.reload_pricing_program),
(f'{dbname}:pricing_program:u:after', PricingProgram.reload_pricing_program),
(f'{dbname}:pricing_program:d:after', PricingProgram.reload_pricing_program),
]
for event_name, handler in bindings:
dbpools.bind(event_name, handler)
debug(f'Pricing event bound: {event_name}')
def load_pricing():
env = ServerEnv()
env.write_pricing_patten = PricingProgram.write_pricing_patten
env.write_pricing_data = PricingProgram.write_pricing_data
env.pricing_program_charging = PricingProgram.charging
env.buffered_charging = PricingProgram.buffered_charging
env.load_pricing_data = PricingProgram.load_pricing_data
env.get_pricing_program = PricingProgram.get_pricing_program
env.test_pricing = test_pricing
env.generate_formula_from_factors = generate_formula_from_factors
env.get_pricing_display = get_pricing_display
# Bind hot_reload event — only when running in ahserver (event_dispatcher available)
if getattr(env, 'event_dispatcher', None) is not None:
env.event_dispatcher.bind('hot_reload', PricingProgram.on_hot_reload)
dbpools = DBPools()
dbname = env.get_module_dbname('pricing')
if dbname:
_bind_pricing_events(dbpools, dbname)
debug(f'Pricing event listeners bound for database: {dbname}')
else:
debug('Pricing event listeners skipped: no database configured for pricing module')