From 3644f418a52eda9fe8e90770bb1991cb857a5485 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 23 Dec 2025 16:24:19 +0800 Subject: [PATCH] bugfix --- models/pricing_item.xlsx | Bin 18442 -> 18446 bytes models/pricing_spec.xlsx | Bin 18434 -> 18448 bytes pricing/pricing.py | 84 ++++++++++++++++++++------------------- 3 files changed, 44 insertions(+), 40 deletions(-) diff --git a/models/pricing_item.xlsx b/models/pricing_item.xlsx index 22de7dccef7b15509e1139d2722386382ee705a0..f73782eee68a60f80346d3d3bb8be39247b26dce 100644 GIT binary patch delta 3174 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

L%Oa5&1m z-ja9erb+g+=wUIA{NnB+nIo$rVU|KT$11);l0JA>hMskV&cogN2eVQ)8V3cfdY*q( zvvEE&0e@vvL)(GMo*W8xD87Z{b_;8hl0>`xd((ES8;XxN=iHBTF3A@ArVhTqSgBQx zNED+06xTwkO^(*(GQ35Bbxa9XYXvzvfJKYq`YPis<=ViD(JdG!!3LhBEah#Ew$8N_ zW6QVDFdKP?@?xb;!<-+@2Dgmw*amPC$8+3(V}F73O*s*Pg4&7!7h-%AhX0n(*X*yeK_di0{{RL5R;)r zQUOVm^hG)WoRcp`PywEkfJQ4EMj6XPT?GID{0{&C7ytkO0000000000005selYvGR zliWrx0Wy;eM?e8?lTAk>8?Abte^mhh0BHgM01*HH00000000000001ClZ!__0qv8@ MM>+=WLI3~&06BsR<^TWy delta 3197 zcmV-@41)8HkO7L20kCcff588N$>{UjK6+4Un~7I zSL(?FfZW6=wYG>bHZ0{CHD{{eIan4-XVk(}FR>{!r-?~9x0%G9AP8|rMUHj|k$w+` zS}X+PSBjMx&+QIGb4e}GH>oI0jh30CnC z8`AeS8h#=CNdQBqfBq7fPCk_hrj=0(dj`;WNBSgw5@15!q+oNJgZClzu;we_YS^&S z;RjiT4OVynBf+Q92uQ2aN(9OKAX>lS)JyCtZ&g#V?w#Z!$Kc12;Zsa`EFoD`nq~$uNmQPh~e?e+{>YtTWg*{Cbh}iqh zpG%=R>>ZF0gaadG5uKYEwW(KX86$jWAU?d!o^i3og%%9Vlp)9UW!mDEj{ zK?B=DgLXZ&N;+seav#w*32`yD-4}w(1R7-H4K1wk?i_oss1!-nS6gp%TW@ra-+)sC z4u=Cgw2ub9ckB$%wB-v$ZhZUy00!B&yn8M0@Yp-$vS|6b?Ovy3Q0cr*C8LtfwC8SB z?nclH2u77heYTDN0+TTm6tjd3zZnY5ELn}*0{{U250gzMD}SJ>O>J{PLh7xDazd3g z?2hdbyEEIJS(@CeLTDsHol2yRf>G*1AP3?g8q%7$Mr*s_u-_)SIK< zy!rgS@BNxBUSD#Z+&%1b!f44TT+SOgOf6;;S}Pg1zP`EenUUiHQ5!jo;*zn9xpBRG z;gcfgA_sRVFMk^lK*fe2i>f$5^m{{^xjdGEba#55ia&gfV<)Rt?PHch*M=^Rnago2A_O+0} z4y!2;%btSZU|JLPMM6c|+s2m8OasS3cT_4iuA;zEP-ZOVx|j-{M(4s$n?Odzb`Lp$ z!Z~(C0`jL&Mgj>iNbOk!)ZC7b)QxjEW6mhWH6y;k)4<=~IEXviq^o2IP;8XL9wS z>^Bte?pDlke-^>&-SC&b>^GIX#Ld4rCbg)YNzwLRxN!hfmBdXDhx-TN=8sxjh*+*a zP9FhHJz^rwSV_K4M+OZzu{5$5Wovd3IV->ZnEbx-h9$1Vj*a64Bc3T3-SP`!dTU-$9 zD?e9dRD5ZdjH|}Dp-Tp3HyE8f1q}0F+m?ISs{E5_4GQef7J*KBb50&M=9W*qlgD1Ra5}x|UYHXn zY&M6-$zq!mVfyZ!^LjiS&!dGrpVfRcb10op!M(yl^KMRY~3hYdSKDgs~ z=P_R=9nkzgx#=NY-2tT%4Xz)p8 zoqrJlZ{3>ttpicEBBNQFBsnueHS|cBxoa4uCc_SHUo{c@lJr{dh?hUb5b8jDeJMJA~ui@S?_B8iSv1e8<_v>C4Uw?{=C$-C( zs00l#+5aOhjTorpP)_x&N*S&a;Yj6h8sUTp)W)Te1g@Ik$~wHAm2NB2kqUIsGAl$v zcc$rcX~cvQC?r=tjU-*@M3fW#tE>2 zCn=k;ra(LAnhayhb|9&ZyhC}h(neC}N3+EZWqY~>oWya8B{+Y|siU|9hRsMsCnRSh zviUT158w<#4HA^Im_!8scpVsN|9sFZ6Q>mJ*!WJTxKlP~gE+bmR*c5BZKHP9$ME?H zeqTMk_Ekfnx?M3qWzJc~3{a;{xo_JXPv&lSHMMT#*IWtU_s4Q2n9){OE_kjg!64XJ zFggBh^xVG200%%G_+Z&k!-vu2m~mj!j`ACmF%%TD`#{733Bdn>$>{5Y%q&@r z+yejr{tuI-MN$DnllVnC0+ue5xGp7=Sw<=Xm@kuYMHQ3JF9nmIMi3mlTCxpb1pojQ z5C8xe0000000000000000GTtBaYYrA;6^V2FOv{QKmlu$QAZ;i)@4D$Q~>}0X#xNM j5dZ)H0000000000003T-k4HWM>66Y!ItJ-N00000SCsQ} diff --git a/models/pricing_spec.xlsx b/models/pricing_spec.xlsx index cdad7d97c486287bf5e0aaa270865bd9e3918116..0ef8424fe8295152dc80262c0341a801d6a1d191 100644 GIT binary patch delta 4130 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 delta 4115 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 XGd}|JPE8hX0W+W`MZBQ+r|Z7}1W%=i diff --git a/pricing/pricing.py b/pricing/pricing.py index 5a08212..9d658e8 100644 --- a/pricing/pricing.py +++ b/pricing/pricing.py @@ -50,15 +50,22 @@ where enabled_date >= ${biz_date}$ 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 + 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}$ + and a.ppid = ${ppid}$ + and a.enabled_date <= ${biz_date}$ + and a.expired_date > ${biz_date}$ """ - recs = await sor.sqlExe(sql, {'ppid': ppid}) - return recs + recs = await sor.sqlExe(sql, {'ppid': ppid, 'biz_date': biz_date}) + return recs async def get_pricing_specs_by_pptid(pptid): env = ServerEnv() @@ -86,39 +93,36 @@ async def get_remote_pricing(sor, charge, data): return d async def pricing_program_charging(sor, pricing_program_id, data): - pp = PricingProgram(pricing_program_id, sor) - await pp.init() env = ServerEnv() - if not data.get('biz_date'): - biz_date = await env.get_business_date(self.sor) - data['biz_date'] = biz_date - pp_items = await sor_get_program_items(sor, pricing_program_id, data['biz_date']) - charges = [] - for item in pp_items: - charge = item.copy() - spec = await pp.get_spec_by_id(charge.psid) - d = data.get(spec.spec_name) - if d is None: - continue - cnt = data.get(spec.count_name, 1) - if spec.pricing_spec_mode == 'spec_name': - if d == item.spec_value: - change[spec.count_name] = cnt - charge.amount = item.pricing_amount * cnt - charges.append(charge) - elif spec.pricing_spec_mode == 'spec_amount': - if charge.pricing_unit is None or charge.pricing_unit < 1: - charge.pricing_unit = 1 - charge.amount = d * charge.pricing_amount / charge.pricing_unit - charge[spec.spec_name] = d - 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_chargeing(self.sor, - charge.subppid, d) - charges += sub_charges - - return charges + if not data.get('biz_date'): + biz_date = await env.get_business_date(self.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_name': + d = data.get(spec.spec_name) + if d == item.spec_value: + change[spec.count_name] = cnt + charge.amount = item.pricing_amount * cnt + charges.append(charge) + elif spec.pricing_spec_mode == 'spec_amount': + cnt = data.get(spec.count_name, 1) + if charge.pricing_unit is None or charge.pricing_unit < 1: + charge.pricing_unit = 1 + charge.amount = cnt * charge.pricing_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_chargeing(self.sor, + charge.subppid, d) + charges += sub_charges + + return charges