From dbf6946b16ca5aabb8fc2035dd205c0f620de60b Mon Sep 17 00:00:00 2001 From: yumoqing Date: Mon, 13 Jul 2026 14:22:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BE=9B=E9=94=80=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E6=8A=98=E6=89=A3=E6=98=8E=E7=BB=86=E9=80=9A=E8=BF=87product?= =?UTF-8?q?=5Fsupplier=5Fmapping=E5=85=B3=E8=81=94=E4=BA=A7=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 产品与供应商的关联在product_supplier_mapping表(supplier_org_id/external_supplier_id), 不在product.org_id。修复后: 1. 查合同→供应商→supplier_orgid+supplier_id 2. 查product_supplier_mapping获取该供应商的产品ID列表 3. 用产品ID列表过滤product表 --- supplychain/__pycache__/init.cpython-310.pyc | Bin 28750 -> 29168 bytes supplychain/init.py | 43 +++++++++++++------ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/supplychain/__pycache__/init.cpython-310.pyc b/supplychain/__pycache__/init.cpython-310.pyc index db488c9a5428e2e2cb6494f43ae0fde37c3bd6c7..a7d51037bd6917319e9208a610e69a291a33d99d 100644 GIT binary patch delta 1387 zcmZ`(O>7%Q6rLH6*Xy;tw)1O4OIJ~U;*yvKRRXFIeiB!0L_mp|fPf5K)ZkuVU9PuC_(CqI1O%+4oM@EQYr4Ddc7GClp|D5C)dg#C~Rv2dN7 zM&}Wu=g`|dfhM#q$}|=c#KGHS&mTlYgg+}HOwXcHIG`;{3&Qe?>BDmuU&R=yXBr@= zH@%1^kRPd|K>yzgQ9(tR8JlFkMpQ&c(3~C^Lf_JbQHpLu))ik>sIC8}g6_SgDlDQP z*32I}(82Sq4&p4aWiXQ^Zy}+NpgP{h-H4^Sk%RUtLRV1nNDvpXt(b_H;(!Fe1SI)q zeoD=CT*il38qBo&b#rcWzhP`e2X89G%TXo$f$L5}O%_&;)tEtRrpH;5-R)sIlJ1lQlFt`U_B)_d_ z9B7R909VCC;f2ERq~+xy)?s~MILs<~`#I<3!YekZ-jeIHN91=?sUGX{xx#qC^8BK| z>RC@)Ck9Sf&y9^(z4ukjOLw+I4qWPZ1XhpU@EjH#&E*JBV<`QRsz0SF|18hUT$Ecg zk0q_M<1b#YTwYc`6fts#NtA_4Z1 zz;%2HeiSQ&!3UeeV>#TQ+;(}6G)VqbBjh@ao3Le%(qJ{BgNt_AzV7m&6orHUL~eGW zYF@r(KiricT&gS-m%O3;epvOHocv*SNKUaEPj&KdRkrsORTSxp&M4|sv<}n=dA85L zSFaTMXwXu{Da-WBSsAk*!YO&&KGv(^xcckhhgC?dbr^7YUPE6lx~@}R^cr|sPTHfj zHz1DOYzuc_3Xg^xZh}6yPp*sf9W&>yHEZ}bv+GXIyPZ3157dR-_fpADejkRrFnc> z-YM1a$WHNUjKujd=!O>*ot4*@PvL@mceyV-435`jWBE}$yrY%h!Kr=~F``Hl$TPXVNxJsBq)iAAZUC*B0hQm62%9k?QF|7Wp|m~YJgn} z>A|bXcu_e(yl^#Kxp`IYa`1t7^<*^B=)a{A2njR!{+an--?#sM|AIF^;g}hX$_Q3+ zV!WViypAQN>Qs0tfHwd;De(GN9^NJBL23OZgD zcKn{?O6;O5(MSRng1a|QybX0C5>X|vlZla`^wzrBsYe(ie@_7N$O~2ZU88q+z|V4U?QD0fprHb0s>VK7%s#Bbu_*#xW2s5Ae!AcjM{z=%;mj-H4*3We4WBH93F;~)atlt6CeA$p2g1lm{M2}A?nt!Ba`cD;=WRKc}M8Rn)`=dkU{ zW9VdaX$$`TsOFTIK`h22nUQi%FFG32D9OwbXIdj!({NZi>zuHOU9zmAt}$Y={FF|~ z_Tn>Q8pSy%HEAj9*fN2Y(Tb*#*Nr@J%xZ`KW%jgLDpHcREG^B5ZtRby^GwrbdNsr8 zsrF$uXk#yZGwPeWzDa^f&F9C4Zw_A_Cw31g;cqiqh~0redTIUKJ%W#t%c&t^`7vMR z1=6u#>eTDt@9y6UvU-dVf37XyIB(9i@rKD3p3Ajjl`rKwBXOVOxSz3^yM8GHFJZAk zYQiFH35$Y%6R;GJf5#*hcl{LQnn#jkJF z?dxm#c@eks_Tm)oSqj<@?6elhbyEXF_AHF9IN9Jr#U{sBC6^=|+G diff --git a/supplychain/init.py b/supplychain/init.py index bf73e98..7bd9afc 100644 --- a/supplychain/init.py +++ b/supplychain/init.py @@ -995,36 +995,51 @@ async def get_agreement_discount_items(request): async def get_contract_discount_items(request): """Return products with discount status for a supply contract. - Products are filtered by the contract's supplier org_id — only products - belonging to the supplier should appear in the supplier agreement. + Products are linked to suppliers via product_supplier_mapping, not org_id. """ params_kw = getattr(request._run_ns, 'params_kw', {}) or {} contract_id = params_kw.get('contract_id') or params_kw.get('id') if not contract_id: return [] env = request._run_ns - # Get supplier_orgid from the contract's supplier - supplier_orgid = '0' + # Get supplier info from contract + supplier_orgid = None + supplier_id = None async with get_sor_context(env, 'supplychain') as sor: rows = await sor.sqlExe( - "SELECT s.orgid FROM suppliers s " + "SELECT s.orgid, s.id as supplier_id FROM suppliers s " "JOIN supply_contracts sc ON sc.supplier_id = s.id " "WHERE sc.id = ${cid}$", {'cid': contract_id} ) - if rows and rows[0].orgid: + if rows: supplier_orgid = rows[0].orgid - # Get products from sage — only this supplier's products + supplier_id = rows[0].supplier_id + if not supplier_orgid: + return [] + # Get product IDs mapped to this supplier via product_supplier_mapping + product_ids = set() + async with get_sor_context(env, 'supplychain') as sor: + mappings = await sor.sqlExe( + "SELECT product_id FROM product_supplier_mapping " + "WHERE status = '1' AND (supplier_org_id = ${oid}$ OR external_supplier_id = ${sid}$)", + {'oid': supplier_orgid, 'sid': supplier_id} + ) + for m in mappings: + product_ids.add(m.product_id) + if not product_ids: + return [] + # Get products from sage products = [] async with get_sor_context(env, 'sage') as sor: rows = await sor.sqlExe( - """SELECT p.id as productid, p.product_name, p.product_code, p.price as sale_price, - pc.id as category_id, pc.name as category_name - FROM product p - LEFT JOIN product_category pc ON p.category_id = pc.id - WHERE p.status = '1' AND p.org_id = ${oid}$ - ORDER BY pc.sort_order, pc.name, p.sort_order, p.product_name""", - {'oid': supplier_orgid} + "SELECT p.id as productid, p.product_name, p.product_code, p.price as sale_price, " + "pc.id as category_id, pc.name as category_name " + "FROM product p " + "LEFT JOIN product_category pc ON p.category_id = pc.id " + "WHERE p.status = '1' AND p.id IN (" + ",".join(repr(pid) for pid in product_ids) + ") " + "ORDER BY pc.sort_order, pc.name, p.sort_order, p.product_name", + {} ) for r in rows: products.append({