From acad0f3d4d4e3c13a1f3c7371fc7d8282d6256b0 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 18 Mar 2026 18:30:21 +0800 Subject: [PATCH] bugfix --- models/pricing_item.xlsx | Bin 18446 -> 0 bytes models/pricing_program.xlsx | Bin 18192 -> 18318 bytes models/pricing_program_timing.xlsx | Bin 18301 -> 18414 bytes models/pricing_spec.xlsx | Bin 18457 -> 0 bytes models/pricing_type.xlsx | Bin 17525 -> 0 bytes pricing/pricing.py | 409 +++++++++++++++++------------ 6 files changed, 234 insertions(+), 175 deletions(-) delete mode 100644 models/pricing_item.xlsx delete mode 100644 models/pricing_spec.xlsx delete mode 100644 models/pricing_type.xlsx diff --git a/models/pricing_item.xlsx b/models/pricing_item.xlsx deleted file mode 100644 index f73782eee68a60f80346d3d3bb8be39247b26dce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18446 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 diff --git a/models/pricing_program.xlsx b/models/pricing_program.xlsx index 0a971dd18d096722722a4eef3bc65b9273bc2840..9c3cc613cdde3e6db1f0fba3e83b412179a45102 100644 GIT binary patch delta 3722 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 delta 3599 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 bx1;~BQy*h#wUmi>RIr9x3S>KK|E~Q9Gm)He diff --git a/models/pricing_program_timing.xlsx b/models/pricing_program_timing.xlsx index 1d75aca905399366bcaec753bbfd30eba884dc60..474de5210bb1b4671caa8c619492e7cd10b0d0f8 100644 GIT binary patch delta 3843 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 delta 3730 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 diff --git a/models/pricing_type.xlsx b/models/pricing_type.xlsx deleted file mode 100644 index b788c205d285cc4462ffede4e12d2b9adbbff5c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17525 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 diff --git a/pricing/pricing.py b/pricing/pricing.py index 5d7eb40..a0a7fca 100644 --- a/pricing/pricing.py +++ b/pricing/pricing.py @@ -1,186 +1,245 @@ import json +import yaml from ahserver.serverenv import ServerEnv from sqlor.dbpools import DBPools, get_sor_context from appPublic.log import debug, exception +from appPublic.dictObject import DictObject -class PricingProgram: - def __init__(self, ppid, sor): - self.ppid = ppid - self.sor = sor +import yaml - async def init(self): - await self.get_program() - await self.get_pricing_type() - - async def get_program(self): - recs = await self.sor.R('pricing_program', {'id': self.ppid}) - if len(recs): - self.__dict__.update(recs[0]) - - async def get_pricing_type(self): - self.pricing_type = await self.sor.R('pricing_type', - {'id': self.ptid}) - - async def get_items(self, biz_date=None): - if biz_date is None: - env = ServerEnv() - biz_date = await env.get_business_date(self.sor) - ppts = await self.get_program_timing(biz_date) - if len(ppts) < 1: - return None - ppt = ppts[0] - recs = await self.sor.R('pricing_item', {'pptid': ppt.id}) - return recs - - async def get_program_timing(self, biz_date): - sql = """select * from pricing_program_timing -where enabled_date >= ${biz_date}$ - and expired_date < ${biz_date}$ - and ppid = ${ppid}$ - """ - return await self.sor.sqlExe(sql, {'ppid':self.ppid, - 'biz_date': biz_date}) - - async def get_specs(self): - recs = await self.sor.R('pricing_spec', {'ptid': self.ptid}) - return recs - - async def get_spec_by_id(self, psid): - recs = await self.sor.R('pricing_spec', {'id': psid}) - if len(recs) > 0: - return recs[0] - return None - -async def get_specs(sor, psid): - sql = """select a.* from pricing_spec a where a.id=${psid}$""" - recs = await sor.sqlExe(sql, {'psid': psid}) - if len(recs)>0: - return recs[0] - return None - -async def sor_get_program_items(sor, ppid, biz_date): - sql = """select b.* from pricing_program_timing a, pricing_item b -where b.pptid = a.id - and a.ppid = ${ppid}$ - and a.enabled_date <= ${biz_date}$ - and a.expired_date > ${biz_date}$ """ - recs = await sor.sqlExe(sql, {'ppid': ppid, 'biz_date': biz_date}) - return recs +采用yaml描述定价策略, +一下是一个例子 +pricing_unit: 1000 +- id: input_token_pricing_1 + field: prompt_tokens + between: 0 ~= 1000 +- id: input_token_pricing_2 + - cnt_field: prompt_tokens + between: 1000 ~= 100000 +- id: input_token_pricing_2 + - cnt_field: prompt_tokens + between: 100000 ~= +- id: output_pricing + - cnt_field: completion_tokens -async def get_pricing_specs_by_pptid(pptid): - env = ServerEnv() - dbname = env.get_module_dbname('pricing') - db = DBPools() - async with db.sqlorContext(dbname) as sor: - sql = """select d.* -from pricing_program_timing a, pricing_program b, pricing_type c, pricing_spec d -where a.ppid = b.id - and b.ptid = c.id - and d.ptid = c.id - and a.id = ${pptid}$""" - recs = await sor.sqlExe(sql, {'pptid': pptid}) - return recs - return [] +视频定价 +fields: + resolution: + type: str + label: 分辨率 + value_mode: + - between + - in + - = + - > + - >= + - < + - <= -async def get_remote_pricing(sor, charge, data): - env = ServerEnv() - get_callerid = env.get_callerid - userid = await get_callerid(self.ownerid) - uapi = UAPI() - ret = await uapi.call(charge.upappid, charge.apiname, - userid, params=data) - d = json.loads(ret.decode('utf-8')) - return d + duration: + type: int + label: 时长 + audio: + type: boolean + label: 音频 -async def pricing_program_charging(sor, pricing_program_id, data): - env = ServerEnv() - if not data.get('biz_date'): - biz_date = await env.get_business_date(sor) - data['biz_date'] = biz_date - debug(f'{pricing_program_id=}, {data=}') - pp_items = await sor_get_program_items(sor, pricing_program_id, data['biz_date']) - charges = [] - debug(f'{pp_items=}, {data["biz_date"]=}') - for item in pp_items: - charge = item.copy() - spec = await get_specs(sor, charge.psid) - if spec.pricing_spec_mode == 'spec_amount': - if item.spec_value: - d = json.loads(item.spec_value) - matchs = True - for k,v in d.items(): - if v != item['k']: - matchs = False +pricings: + - resolution: 480p + duration: 4 + audio: false + - resolution: 480p + duration: 8 + audio: false + - resolution: 480p + duration: 12 + audio: false + - resolution: 480p + duration: 4 + audio: true + - resolution: 480p + duration: 8 + audio: true + - resolution: 480p + duration: 12 + audio: true + - resolution: 720p + duration: 4 + audio: false + - resolution: 720p + duration: 8 + audio: false + - resolution: 720p + duration: 12 + audio: false + - resolution: 720p + duration: 4 + audio: true + - resolution: 720p + duration: 8 + audio: true + - resolution: 720p + duration: 12 + audio: true + + +""" + +""" +typefuncs = { + 'int': int, + 'float': float +} +def typevalue(v, t): + if not v: + return None + f = typefuncs.get(t) + if not f: + return v + return f(v) + +def check_value(field, spec_value, data_value): + if field.value_mode == 'between': + arr = spec_value.split(' ') + if len(arr) < 2 or len(arr) > 3: + e = f'{spec_value=} error' + exception(e) + raise Exception(e) + + if (arr[0] is None or arr[-1] is None) and field.type == 'str': + e = f'字符串类型between方法的两个值任何一个都不能为空') + exception(e) + raise e + else: + if arr[0] is None: + arr[0] = -float('inf') + if arr[-1] is None: + arr[-1] = float('inf') + + if len(arr) == 2 or arr[1] == '=~' : + return arr[0] <= data_value and data_value < arr[-1] + if arr[1] == '~': + return arr[0] < data_value and data_value < arr[-1] + if arr[1] == '~=': + return arr[0] < data_value and data_value <= arr[-1] + e = f'{arr[1]}不认识的期间逻辑,只支持:~ =~ ~=' + exception(e) + raise Exception(e) + + if field.value_mode == 'in': + arr = spec_value.split(' ') + arr = [ typevalue(a, field.type) for a in arr ] + return data_value in arr + + mode = field.value_mode + if not mode: + mode = '=' + script = f'{data_value} {mode} {typevalue(spec_value, field.type)}' + x = eval(scrpt) + return x + +class PricingProgram: + def parse_pricing_spec(self, yamlstr): + d = yaml.safe_load(yamlstr) + assert isinstance(d, list) + return d + async def add_pricing_program(self, sor, + name, ownerid, + description, pricing_spec, id=None): + env = ServerEnv() + if not id: + id = env.uuid() + yamlstr = yaml.dump(pricing_spec) + await sor.C('pricing_program', { + 'id': id, + 'name': name, + 'ownerid': ownerid, + 'description': description, + 'pricing_spec': ymalstr + }) + + async def pp_db2app(self, pp): + try: + pp.pricing_spec = yaml.safe_load(pp.pricing_spec) + except Exception as e: + e = f'{pp.pricing_spec}:yaml数据格式错误' + exception(e) + raise Exception(e) + + async def pp_app2db(self, pp): + try: + pp.pricing_spec = yaml.dump(pp.pricing_spec) + except Exception as e: + e = f'{pp.pricing_spec}:导出到yaml失败' + exception(e) + raise Exception(e) + async def ppt_db2app(self, ppt): + try: + ppt.pricing_data = yaml.safe_load(ppt.pricing_data) + except Exception as e: + e = f'{ppt.pricing_data}:yaml数据格式错误' + exception(e) + raise Exception(e) + + async def ppt_app2db(self, ppt): + try: + ppt.pricing_data = yaml.dump(ppt.pricing_data) + except Exception as e: + e = f'{ppt.pricing_data}:yaml数据格式错误' + exception(e) + raise Exception(e) + + def pricing(self, config_data, yamlstr): + """ + yamlstr是从 + d = None + try: + d = yaml.safe_load(yamlstr) + except Exception as e: + exception(f'yaml.sage_load({yamlstr}) error: {e}') + raise e + if not d.fields: + exception(f'{d} has not "fields"') + raise Exception(f'定价定义中没有fields数据') + if not d.pricing: + exception(f'{d} has not "pricing"') + raise Exception(f'定价定义中没有pricing数据') + ret_items = [] + for i, p in enumerate(d.pricings): + p_ok = True + times = 1 + unit = 1 + for k,spec_value in p.items(): + f = d.fields.get(k) + if not f: + e = f'定价项({i})中的{k}在fields中没有定义' + exception(f'{e}') + raise Exception(e) + data_value = config_data.get(k) + if not value: + e = f'数据({config_data})没有({k})数据' + exception(e) + raise Exeption(e) + if f.type == 'unit': + unit = spec_value + elif f.type == 'times': + times = data_value + else: + f = check_value(f, spec_value, data_value) + if not f: + # 条件不满足 + p_ok = False break - if not matchs: - continue - - cnt = data.get(spec.count_name, 1) - if charge.pricing_unit is None or charge.pricing_unit < 1: - charge.pricing_unit = 1 - cost_amount = charge.cost_amount or 0.00 - charge.amount = cnt * charge.pricing_amount / charge.pricing_unit - charge.cost = cnt * cost_amount / charge.pricing_unit - charges.append(charge) - elif spec.pricing_spec_mode == 'remote_pricing': - charge.amount = await get_remote_pricing(sor, charge, params=d) - charges.append(charge) - elif spec.pricing_spec_mode == 'spec_subtype': - sub_charges = await pricing_program_charging(sor, - charge.subppid, d) - charges += sub_charges - - return charges - -async def sor_get_spec_fields(sor, piid): - sql = "select a.spec_names from pricing_spec a, pricing_item b where a.id = b.psid and b.id = ${piid}$" - recs = await sor.sqlExe(sql, {'piid': piid}) - if len(recs) < 1: - return [] - b = recs[0].spec_names - if b is None: - return [] - return json.loads(b) - -async def get_spec_names_fields(request, piid): - async with get_sor_context(request._run_ns, 'pricing') as sor: - fields = await sor_get_spec_fields(sor, piid) - if len(fields) < 1: - return '' - x = '' - for f in fields: - x += ','+ json.dumps(f) - return x - return '' - -async def get_spec_names_fields_names(request, piid): - async with get_sor_context(request._run_ns, 'pricing') as sor: - fs = await sor_get_spec_fields(sor, piid) - return [f['name'] for f in fs] - -async def get_all_spec_fields_by_pptid(request, pptid): - env = request._run_ns - async with get_sor_context(env, 'pricing') as sor: - sql = """select a.* -from pricing_spec a, - pricing_type b, - pricing_program c, - pricing_program_timing d -where - b.id=a.ptid - and b.id = c.ptid - and c.id = d.ppid - and d.id = ${pptid}$""" - recs = await sor.sqlExe(sql, {'pptid': pptid}) - ret = '' - for r in recs: - if r.spec_names: - x = { - "name":r.id, - "uitype":"group", - "nouse": True - } - x['fields'] = json.loads(r.spec_names) - ret += ','+ json.dumps(x, ensure_ascii=False, indent=4) - return ret + if p_ok: + if not p.price: + e = f'{p} 没有价格属性') + exception(e) + raise Exception(e) + np = p.copy() + np.amount = p.price * float(times) / float(unit) + ret_items.append(np) + if len(ret_items) == 0: + e = f'{config_data=}{yamlstr=}没有找到合适的定价‘ + exception(e) + raise Exception(e) + return ret_items