From 45333b6b2311ba559fe13d5b3cff115b38f0dd22 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 24 Feb 2026 17:32:46 +0800 Subject: [PATCH] bugfix --- discount/.init.py.swp | Bin 0 -> 16384 bytes discount/init.py | 137 +++++++++++++++++++++++++++++++++++++ models/discount.xlsx | Bin 0 -> 18316 bytes models/discount_qr.xlsx | Bin 0 -> 18273 bytes wwwroot/generate_qr.dspy | 58 ++++++++++++++++ wwwroot/promote.ui | 37 ++++++++++ wwwroot/promote/index.dspy | 5 ++ 7 files changed, 237 insertions(+) create mode 100644 discount/.init.py.swp create mode 100644 discount/init.py create mode 100644 models/discount.xlsx create mode 100644 models/discount_qr.xlsx create mode 100644 wwwroot/generate_qr.dspy create mode 100644 wwwroot/promote.ui create mode 100644 wwwroot/promote/index.dspy diff --git a/discount/.init.py.swp b/discount/.init.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..b5465aebeb9cc37bb66228ccafa69c5970dc9b4d GIT binary patch literal 16384 zcmeI2TZklA8OM*CxY>4HBl;$SC+%o=XM1`tLC8)VH@Gvw368FbiG*csYPwF(l-pg^ zT~$4^lW~lwOE8GI2Jb{A7*Hb^Wbr{C#Jp%A1bxtlfFUZr zGYq0o4ZrC=*ZR)?eCJxTa{S(Iw2b~^75f(x@}!=Tj*I!qVVlk)Cw$rHzQjqj}9B;Wd$d-kdFvYJwXQh`!|Qh`!|Qh`!|Qh`!|Qi1;m1>(U0 z@c@P%$c()+`+nWT_jOtLboPDQM0yr1ze)v41xf`<1xf`<1xf`<1xf`<1xf`<1xf`< z1^x#Wa9knQUoXT@4`Lke|IPXT`5T4!Ib4P{xDDpuFdT&E-Xz2mFn|m2L1@4Mc;Sc; zPr?=WECg^T%)t!2^hP0m36Fvgedxfwa0(<`2Y)&&#MAI=_%>XI&%s$Z1@DG`y+Mel z;2ZD|d<+_J0G_D`@dNlg1aJ1Jk5aK8BRrmr7;Nx%#-VU#z z)3fk1(3)L=hhZJg!|iYkouyBGv1u&~uy8w8L{7qT)oGen)P2@tV{|>1sNGAFGRTowhe+%`~>wkWQrA zJGYyiX*Jr~U7J>)^87+uLe+`R9Y5bP&l45fIA_E0;#}(}c5EN)Y~G4@f7^9pMdQ4# z^n;kjcOtCTU&xzPHta24RP|`sYf3*N?>3LCnzGe7X@2Txs~8D3(9~(RWu(~vX}*5i z783ieR2K(csOUxvlkbx=Tc-N$nQFC~+b(xFp+|ZPp$_b(7v*)d>ch^@i?wy{cDg!?3-fRt8SI#;l`% zC9%bBCB7I;Cn@VmB-=omXjV;<%+EBzP7oy7K$@6!jSgTa@@=u=?R1N4^UvJ(@X4a} zuh}p6vV?La2VkR7xolsFvYOr2jOb`|86=Rufw5S;G7|UQHMJ3t(6)V+~kt36hqSIyh zkj(7ynv!Os7>1p|RZMxwL-evRW(K8QZp%BZnKaGAWse=5 zuA7sD)VtKxQ0e6-i8-E{W{0jRMfYk0b|1AO*-<)cOcR`8T3z~-LzC`P>GcOe7#F*F zB6C_scSx2s-&&>_*}gL0xhsPp=tU-v-el^{W_D=FsvHc?j#heJr^WKY+_JP#$iB2N znQ4f|sd1_I3Vr_nI_KISarV{cfAfC-pPcc(4-bNZGjJ2U#QFXbY=8#~@E&-PbNwIT zdH5b&27T^dhNEx;{F^iVpW$hE3Lb|?;LGqO*no8y!7ZTg0bb^e|6BMmd=Yx^0k|Dz z;1K+kv;K?l8+Z~v1D}Rf=)x?#4gSKp|1tO$d=oA~2&dtC_yZawI!rwzmkFf;r2?e_ zr2?e_r2_wL1=1_(U5-`kH=|vmlQUX=%bIQG$UCvUOS4VA#?zHgyW&fW>W!H>Naja9 zitQSo6d^I+@s(HK*?~7d>L%Bz<<)m`$}6wF_v5XGJtFVn>N{4~`sQL^UQDFN^y2hj z52j`!y4Jx_c}8t0Ni)}g`rX;&<+{0o(RXd;j_MAFOWpJhMd6N` zw?151kG ${biz_date}$ for update""" + recs = await sor.sqlExe(sql, {'resellerid': resellerid, 'customerid': customerid, 'biz_date': biz_date}) + if not recs: + return True + if new_discount > news[0].discount: + return False + await sor.U('discount', {'id': recs[0].id, 'expired_date': biz_date}) + return True + +async def sor_get_star_discount(sor, resellerid, biz_date): + env = ServerEnv() + sql = """select * from discount +where resellerid = ${resellerid}$ + and enabled_date <= ${biz_date}$ + and expired_date > ${biz_date}$""" + ns = { + "resellerid": resellerid, + "biz_date": biz_date + } + recs = await sqlExe(sql, ns) + if not recs: + return 1 + + return recs[0].discount + + +async def sor_get_customer_discount(sor, resellerid, customerid): + env = ServerEnv() + biz_date = await env.get_business_date(sor) + sql = """select * from discount +where resellerid = ${resellerid}$ + and customerid = ${customerid}$ + and enabled_date <= ${biz_date}$ + and expired_date > ${biz_date}$""" + ns = { + "resellerid": resellerid, + "customerid": customerid, + "biz_date": biz_date + } + recs = await sqlExe(sql, ns) + if not recs: + return await sor_get_star_discount(sor, resellerid, biz_date) + + return recs[0].discount + +async def get_customer_discount(resellerid, customerid): + env = ServerEnv() + async with get_sor_context(env, 'discount') as sor: + return sor_get_customer_discount(sor, resellerid, customerid) + return 1 + +def load_discount(): + env = ServerEnv() + env.get_customer_discount = get_customer_discount + env.sor_get_customer_discount = sor_get_customer_discount + env.discount_qrcode = discount_qrcode + env.set_promote_discount = set_promote_discount diff --git a/models/discount.xlsx b/models/discount.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..38aaca9861719a15a6c99310ebf0a49f11e83ce6 GIT binary patch literal 18316 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 xr(Wav8}|2n>Lh$G4{{S%89pL}~ literal 0 HcmV?d00001 diff --git a/models/discount_qr.xlsx b/models/discount_qr.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f21104ccefb963bb8dd306400ff4376d92d9440d GIT binary patch literal 18273 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 literal 0 HcmV?d00001 diff --git a/wwwroot/generate_qr.dspy b/wwwroot/generate_qr.dspy new file mode 100644 index 0000000..5bc6ee9 --- /dev/null +++ b/wwwroot/generate_qr.dspy @@ -0,0 +1,58 @@ +params_kw.discount = float(params_kw.discount) +if params_kw.discount <= 0 or params_kw.discount >= 1: + e = Exception(f'discount({params_kw.discount}) invalid') + exception(f'{e}') + raise e + +if params_kw.valid_term[-1] not in ['D', 'M', 'Y']: + e = Exception(f'valid_term must ends with "D", "M" or "Y"') + exception(f'{e}') + raise e +cnt = int(params_kw.valid_term[:-1]) +if cnt < 0: + e = Exception(f'valid_term({params_kw.valid_term}) invalid') + exception(f'{e}') + raise e + +if not params_kw.expired_date: + params_kw.expired_date = '9999-12-31' +x = await discount_qrcode(request, params_kw) +return { + "widgettype": "VBox", + "options": { + "width": "100%", + "height": "100%" + }, + "subwidgets": [ + { + "widgettype": "Image", + "options": { + "width": "auto", + "height": "auto", + "url": entire_url('/idfile') + f'?path={x.qr_webpath}' + } + }, { + "widgettype": "HBox", + "options": { + "width": "100%", + "cheight": 2 + }, + "subwidgets": [ + { + "widgettype": "Text", + "options": { + "otext": "折扣:", + "i18n": True, + "cwidth": 3 + } + },{ + "widgettype": "Text", + "options":{ + "text": x.discount + } + } + ] + } + ] +} + diff --git a/wwwroot/promote.ui b/wwwroot/promote.ui new file mode 100644 index 0000000..6d91df8 --- /dev/null +++ b/wwwroot/promote.ui @@ -0,0 +1,37 @@ +{ + "widgettype": "Form", + "options": { + "width": "100%", + "height": "100%", + "fields": [ + { + "name": "valid_term", + "label": "有效期", + "uitype": "str", + "tip":"格式:xY, xM, xD,x是1到多位数字,Y(年),M(月),D(日)" + },{ + "name": "expired_date", + "label": "促销失效日期", + "uitype": "date", + "tip": "促销二维码需在此日期前使用" + },{ + "name": "discount", + "lable": "折扣", + "uitype": "float", + "tip": "折扣>0, < 1, 最终价格=产品价格*折扣, 折扣越小,折扣力度越大" + } + ] + }, + "binds":[ + { + "wid": "self", + "event": "submit", + "actiontype": "urlwidget", + "target": "self", + "options": { + "url": "{{entire_url('generate_qr.dspy')}}", + "params": {} + } + } + ] +} diff --git a/wwwroot/promote/index.dspy b/wwwroot/promote/index.dspy new file mode 100644 index 0000000..583deae --- /dev/null +++ b/wwwroot/promote/index.dspy @@ -0,0 +1,5 @@ +orgid = await get_userorgid() +if orgid is None: + return UiError(title='Error', message='You need login') + +ret = await set_promote_discount(request, params_kw)