supplychain/wwwroot/api/query_supply_discount.dspy
yumoqing da32159ad9 feat: 供应商和分销商管理模块 (supplychain)
- 7个数据库表: suppliers, supply_contracts, supply_contract_items,
  sub_distributors, distribution_agreements, distribution_agreement_items,
  supplychain_accounting
- CRUD JSON配置 (7个列表 + editable段)
- API端点: create/update/delete (21个) + calculate_accounting + query_discount (2个)
- 前端页面: index.ui + 5个功能页 + menu.ui
- 记账计算: 自动查找有效合同/协议折扣,计算进货金额、分销金额、利润
- 折扣查找优先级: 精确产品 > 产品分类 > 默认折扣
- productid/prodtypeid引用product模块(即将开发)
2026-05-25 15:37:06 +08:00

71 lines
3.1 KiB
Plaintext

import json
async def main(request, params_kw):
"""
查询某产品在有效供销合同下的折扣信息。
参数: productid, prodtypeid(可选)
折扣查找优先级:
1. 精确匹配 productid
2. 匹配 prodtypeid
3. 使用合同默认折扣
"""
user_orgid = await get_userorgid()
dbname = get_module_dbname('supplychain')
productid = params_kw.get("productid")
prodtypeid = params_kw.get("prodtypeid")
if not productid:
return json.dumps({"status": "error", "message": "缺少productid参数"})
config = getConfig(".")
DBPools(config.databases)
async with db.sqlorContext(dbname) as sor:
# Try exact product match
sql = """SELECT sci.id, sci.contract_id, sci.discount, sci.settlement_price,
sc.contract_code, sc.contract_name, sc.supplier_id,
s.supplier_name
FROM supply_contract_items sci
JOIN supply_contracts sc ON sci.contract_id = sc.id
LEFT JOIN suppliers s ON sc.supplier_id = s.id
WHERE sci.resellerid = ${resellerid}$
AND sc.status = '1'
AND sc.start_date <= CURDATE()
AND (sc.end_date IS NULL OR sc.end_date >= CURDATE())
AND sci.productid = ${productid}$
ORDER BY sc.start_date DESC"""
recs = await sor.sqlExe(sql, {"resellerid": user_orgid, "productid": productid})
if not recs and prodtypeid:
sql = """SELECT sci.id, sci.contract_id, sci.discount, sci.settlement_price,
sc.contract_code, sc.contract_name, sc.supplier_id,
s.supplier_name
FROM supply_contract_items sci
JOIN supply_contracts sc ON sci.contract_id = sc.id
LEFT JOIN suppliers s ON sc.supplier_id = s.id
WHERE sci.resellerid = ${resellerid}$
AND sc.status = '1'
AND sc.start_date <= CURDATE()
AND (sc.end_date IS NULL OR sc.end_date >= CURDATE())
AND sci.prodtypeid = ${prodtypeid}$
ORDER BY sc.start_date DESC"""
recs = await sor.sqlExe(sql, {"resellerid": user_orgid, "prodtypeid": prodtypeid})
if not recs:
# Fallback to contract default
sql = """SELECT id as contract_id, contract_code, contract_name,
supplier_id, default_discount as discount, NULL as settlement_price
FROM supply_contracts
WHERE resellerid = ${resellerid}$
AND status = '1'
AND start_date <= CURDATE()
AND (end_date IS NULL OR end_date >= CURDATE())
ORDER BY start_date DESC"""
recs = await sor.sqlExe(sql, {"resellerid": user_orgid})
result = [dict(r) for r in recs] if recs else []
return json.dumps({"status": "ok", "data": result})