diff --git a/README.md b/README.md index 07bb3fa..cb7c1ac 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,22 @@ Manages the complete supply chain workflow for reseller/distributor organization | `distribution_agreements` | Distribution agreements between reseller and sub-reseller | | `distribution_agreement_items` | Product-level discount details per distribution agreement | | `sales_ledger` | Sales transaction records with calculated amounts | +| `platform_supply_relations` | Platform-level org-to-org supply relationships (P0) | +| `platform_supply_products` | Product details within platform supply relations (P0) | +| `product_supplier_mapping` | Unified product-to-supplier mapping across internal/external (P0) | + +### P0 Platform Supply Chain (2026-06) + +Enables supply chain relationships between organizations on the Sage platform: + +- **platform_supply_relations**: Links two organizations (supplier ↔ buyer) with cooperation type (distribution/agency/direct-supply), settlement mode (discount/commission/fixed), and contract period +- **platform_supply_products**: Product-level pricing within a supply relation — supply price, retail price, discount, commission rate, min order qty +- **product_supplier_mapping**: Unified view mapping any product to its supplier(s), whether internal (platform org) or external (suppliers table), with preferred supplier flag + +Key business APIs: +- `query_platform_suppliers.dspy` — List platform orgs available as suppliers (excludes current user's org) +- `query_platform_products.dspy` — List active products owned by a supplier org +- `import_supplier_product.dspy` — Import a supplier's product into buyer's mapping (creates product_supplier_mapping record) ### Discount Calculation Logic @@ -165,3 +181,11 @@ result = await env.calculate_sale_amounts(request, { }) # Returns: {contract_id, agreement_id, total_amount, supply_discount, supply_amount, distribution_discount, distribution_amount, profit_amount} ``` + +## Deployment Checklist + +1. Execute DDL: `models/mysql.ddl.sql` — creates 3 new tables (platform_supply_relations, platform_supply_products, product_supplier_mapping) +2. Init appcodes: Run `init/data.json` inserts for 6 appcode groups +3. Build CRUD UI: `bash build.sh` +4. Register RBAC: `~/repos/sage/py3/bin/python scripts/load_path.py` (or central load_path.py) +5. Restart Sage diff --git a/scripts/load_path.py b/scripts/load_path.py index 6a823fc..3bdde7f 100755 --- a/scripts/load_path.py +++ b/scripts/load_path.py @@ -116,8 +116,20 @@ PATHS_LOGINED = [ "/supplychain/api/query_dist_discount.dspy", # 平台供销关系 "/supplychain/platform_supply_relations_list/index.ui", + "/supplychain/platform_supply_relations_list/get_platform_supply_relations.dspy", + "/supplychain/platform_supply_relations_list/add_platform_supply_relations.dspy", + "/supplychain/platform_supply_relations_list/update_platform_supply_relations.dspy", + "/supplychain/platform_supply_relations_list/delete_platform_supply_relations.dspy", "/supplychain/platform_supply_products_list/index.ui", + "/supplychain/platform_supply_products_list/get_platform_supply_products.dspy", + "/supplychain/platform_supply_products_list/add_platform_supply_products.dspy", + "/supplychain/platform_supply_products_list/update_platform_supply_products.dspy", + "/supplychain/platform_supply_products_list/delete_platform_supply_products.dspy", "/supplychain/product_supplier_mapping_list/index.ui", + "/supplychain/product_supplier_mapping_list/get_product_supplier_mapping.dspy", + "/supplychain/product_supplier_mapping_list/add_product_supplier_mapping.dspy", + "/supplychain/product_supplier_mapping_list/update_product_supplier_mapping.dspy", + "/supplychain/product_supplier_mapping_list/delete_product_supplier_mapping.dspy", # CRUD API — platform_supply_relations "/supplychain/api/platform_supply_relations_create.dspy", "/supplychain/api/platform_supply_relations_update.dspy", @@ -158,16 +170,28 @@ PATHS_OPERATOR = [ # 平台供销关系管理 "/supplychain/platform_supply_relations_list", "/supplychain/platform_supply_relations_list/index.ui", + "/supplychain/platform_supply_relations_list/get_platform_supply_relations.dspy", + "/supplychain/platform_supply_relations_list/add_platform_supply_relations.dspy", + "/supplychain/platform_supply_relations_list/update_platform_supply_relations.dspy", + "/supplychain/platform_supply_relations_list/delete_platform_supply_relations.dspy", "/supplychain/api/platform_supply_relations_create.dspy", "/supplychain/api/platform_supply_relations_update.dspy", "/supplychain/api/platform_supply_relations_delete.dspy", "/supplychain/platform_supply_products_list", "/supplychain/platform_supply_products_list/index.ui", + "/supplychain/platform_supply_products_list/get_platform_supply_products.dspy", + "/supplychain/platform_supply_products_list/add_platform_supply_products.dspy", + "/supplychain/platform_supply_products_list/update_platform_supply_products.dspy", + "/supplychain/platform_supply_products_list/delete_platform_supply_products.dspy", "/supplychain/api/platform_supply_products_create.dspy", "/supplychain/api/platform_supply_products_update.dspy", "/supplychain/api/platform_supply_products_delete.dspy", "/supplychain/product_supplier_mapping_list", "/supplychain/product_supplier_mapping_list/index.ui", + "/supplychain/product_supplier_mapping_list/get_product_supplier_mapping.dspy", + "/supplychain/product_supplier_mapping_list/add_product_supplier_mapping.dspy", + "/supplychain/product_supplier_mapping_list/update_product_supplier_mapping.dspy", + "/supplychain/product_supplier_mapping_list/delete_product_supplier_mapping.dspy", "/supplychain/api/product_supplier_mapping_create.dspy", "/supplychain/api/product_supplier_mapping_update.dspy", "/supplychain/api/product_supplier_mapping_delete.dspy", diff --git a/supplychain/__pycache__/init.cpython-310.pyc b/supplychain/__pycache__/init.cpython-310.pyc new file mode 100644 index 0000000..5dc0ef3 Binary files /dev/null and b/supplychain/__pycache__/init.cpython-310.pyc differ diff --git a/supplychain/init.py b/supplychain/init.py index 74c7c76..0d90e2c 100644 --- a/supplychain/init.py +++ b/supplychain/init.py @@ -628,6 +628,195 @@ LIMIT 1""" return json.dumps({"status": "ok", "data": result}) +# ============================================================ +# Platform Supply Relations APIs (P0) +# ============================================================ + +def _generate_psr_code(supplier_org_id, buyer_org_id): + """Generate unique relation code: PSR-{YYYYMMDD}-{seq}.""" + env = ServerEnv() + today = env.strdate(env.today()) + prefix = f"PSR-{today.replace('-', '')}" + db, dbname = _get_sor() + with db.sqlorContext(dbname) as sor: + sql = """SELECT COUNT(*) as cnt FROM platform_supply_relations +WHERE supplier_org_id = ${sid}$ AND relation_code LIKE ${prefix}$""" + recs = sor.sqlExe(sql, {"sid": supplier_org_id, "prefix": prefix + "%"}) + seq = (recs[0].cnt if recs else 0) + 1 + return f"{prefix}-{seq:04d}" + + +async def create_platform_supply_relations(request, params_kw): + """Create a platform supply relation.""" + env = ServerEnv() + user_id = await env.get_user() + data = params_kw + db, dbname = _get_sor() + async with db.sqlorContext(dbname) as sor: + supplier_org_id = data.get("supplier_org_id") + buyer_org_id = data.get("buyer_org_id") + relation_code = data.get("relation_code") or _generate_psr_code(supplier_org_id, buyer_org_id) + now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + rec = { + "id": getID(), + "supplier_org_id": supplier_org_id, + "buyer_org_id": buyer_org_id, + "relation_code": relation_code, + "relation_name": data.get("relation_name"), + "relation_type": data.get("relation_type", "distribution"), + "settlement_mode": data.get("settlement_mode", "discount"), + "default_discount": data.get("default_discount", 1.0), + "default_commission_rate": data.get("default_commission_rate", 0.0), + "sign_date": data.get("sign_date"), + "start_date": data.get("start_date"), + "end_date": data.get("end_date"), + "status": data.get("status", "1"), + "remark": data.get("remark"), + "created_by": user_id, + "created_at": now, + "updated_at": now, + } + await sor.C("platform_supply_relations", rec) + return json.dumps({"status": "ok", "data": rec, "message": "创建成功"}) + + +async def update_platform_supply_relations(request, params_kw): + """Update a platform supply relation.""" + data = params_kw + db, dbname = _get_sor() + async with db.sqlorContext(dbname) as sor: + now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + rec = {"id": data["id"], "updated_at": now} + for key in ["relation_name", "relation_type", "settlement_mode", + "default_discount", "default_commission_rate", "sign_date", + "start_date", "end_date", "status", "remark"]: + if key in data: + rec[key] = data[key] + await sor.U("platform_supply_relations", rec) + return json.dumps({"status": "ok", "message": "更新成功"}) + + +async def delete_platform_supply_relations(request, params_kw): + """Delete a platform supply relation and its products.""" + data = params_kw + db, dbname = _get_sor() + async with db.sqlorContext(dbname) as sor: + await sor.D("platform_supply_products", {"relation_id": data["id"]}) + await sor.D("platform_supply_relations", {"id": data["id"]}) + return json.dumps({"status": "ok", "message": "删除成功"}) + + +# ============================================================ +# Platform Supply Products APIs (P0) +# ============================================================ + +async def create_platform_supply_products(request, params_kw): + """Create a platform supply product item.""" + data = params_kw + db, dbname = _get_sor() + async with db.sqlorContext(dbname) as sor: + now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + rec = { + "id": getID(), + "relation_id": data.get("relation_id"), + "supplier_org_id": data.get("supplier_org_id"), + "buyer_org_id": data.get("buyer_org_id"), + "source_product_id": data.get("source_product_id"), + "supply_price": data.get("supply_price", 0), + "suggested_retail_price": data.get("suggested_retail_price"), + "discount": data.get("discount", 1.0), + "commission_rate": data.get("commission_rate", 0.0), + "min_order_qty": data.get("min_order_qty"), + "status": data.get("status", "1"), + "remark": data.get("remark"), + "created_at": now, + "updated_at": now, + } + await sor.C("platform_supply_products", rec) + return json.dumps({"status": "ok", "data": rec, "message": "创建成功"}) + + +async def update_platform_supply_products(request, params_kw): + """Update a platform supply product item.""" + data = params_kw + db, dbname = _get_sor() + async with db.sqlorContext(dbname) as sor: + now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + rec = {"id": data["id"], "updated_at": now} + for key in ["supply_price", "suggested_retail_price", "discount", + "commission_rate", "min_order_qty", "status", "remark"]: + if key in data: + rec[key] = data[key] + await sor.U("platform_supply_products", rec) + return json.dumps({"status": "ok", "message": "更新成功"}) + + +async def delete_platform_supply_products(request, params_kw): + """Delete a platform supply product item.""" + data = params_kw + db, dbname = _get_sor() + async with db.sqlorContext(dbname) as sor: + await sor.D("platform_supply_products", {"id": data["id"]}) + return json.dumps({"status": "ok", "message": "删除成功"}) + + +# ============================================================ +# Product Supplier Mapping APIs (P0) +# ============================================================ + +async def create_product_supplier_mapping(request, params_kw): + """Create a product supplier mapping.""" + data = params_kw + db, dbname = _get_sor() + async with db.sqlorContext(dbname) as sor: + now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + rec = { + "id": getID(), + "product_id": data.get("product_id"), + "product_category_id": data.get("product_category_id"), + "supplier_type": data.get("supplier_type", "internal"), + "supplier_org_id": data.get("supplier_org_id"), + "external_supplier_id": data.get("external_supplier_id"), + "buyer_org_id": data.get("buyer_org_id"), + "supply_price": data.get("supply_price"), + "currency": data.get("currency", "CNY"), + "min_order_qty": data.get("min_order_qty", 1), + "lead_time_days": data.get("lead_time_days"), + "is_preferred": data.get("is_preferred", "0"), + "status": data.get("status", "1"), + "relation_id": data.get("relation_id"), + "contract_id": data.get("contract_id"), + "created_at": now, + "updated_at": now, + } + await sor.C("product_supplier_mapping", rec) + return json.dumps({"status": "ok", "data": rec, "message": "创建成功"}) + + +async def update_product_supplier_mapping(request, params_kw): + """Update a product supplier mapping.""" + data = params_kw + db, dbname = _get_sor() + async with db.sqlorContext(dbname) as sor: + now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + rec = {"id": data["id"], "updated_at": now} + for key in ["supply_price", "currency", "min_order_qty", "lead_time_days", + "is_preferred", "status", "remark", "relation_id", "contract_id"]: + if key in data: + rec[key] = data[key] + await sor.U("product_supplier_mapping", rec) + return json.dumps({"status": "ok", "message": "更新成功"}) + + +async def delete_product_supplier_mapping(request, params_kw): + """Delete a product supplier mapping.""" + data = params_kw + db, dbname = _get_sor() + async with db.sqlorContext(dbname) as sor: + await sor.D("product_supplier_mapping", {"id": data["id"]}) + return json.dumps({"status": "ok", "message": "删除成功"}) + + # ============================================================ # Register functions with ServerEnv # ============================================================ @@ -635,34 +824,68 @@ LIMIT 1""" def load_supplychain(): """Register all supplychain functions with ServerEnv.""" env = ServerEnv() - # Supplier + # Supplier (register both singular and plural for backward compat) env.create_supplier = create_supplier + env.create_suppliers = create_supplier env.update_supplier = update_supplier + env.update_suppliers = update_supplier env.delete_supplier = delete_supplier + env.delete_suppliers = delete_supplier # Supply Contract env.create_supply_contract = create_supply_contract + env.create_supply_contracts = create_supply_contract env.update_supply_contract = update_supply_contract + env.update_supply_contracts = update_supply_contract env.delete_supply_contract = delete_supply_contract + env.delete_supply_contracts = delete_supply_contract # Supply Contract Items env.create_supply_contract_item = create_supply_contract_item + env.create_supply_contract_items = create_supply_contract_item env.update_supply_contract_item = update_supply_contract_item + env.update_supply_contract_items = update_supply_contract_item env.delete_supply_contract_item = delete_supply_contract_item + env.delete_supply_contract_items = delete_supply_contract_item # Sub-Reseller env.create_sub_reseller = create_sub_reseller + env.create_sub_resellers = create_sub_reseller env.update_sub_reseller = update_sub_reseller + env.update_sub_resellers = update_sub_reseller env.delete_sub_reseller = delete_sub_reseller + env.delete_sub_resellers = delete_sub_reseller + # Sub-Distributor (not yet implemented) # Distribution Agreement env.create_distribution_agreement = create_distribution_agreement + env.create_distribution_agreements = create_distribution_agreement env.update_distribution_agreement = update_distribution_agreement + env.update_distribution_agreements = update_distribution_agreement env.delete_distribution_agreement = delete_distribution_agreement + env.delete_distribution_agreements = delete_distribution_agreement # Distribution Agreement Items env.create_distribution_agreement_item = create_distribution_agreement_item + env.create_distribution_agreement_items = create_distribution_agreement_item env.update_distribution_agreement_item = update_distribution_agreement_item + env.update_distribution_agreement_items = update_distribution_agreement_item env.delete_distribution_agreement_item = delete_distribution_agreement_item + env.delete_distribution_agreement_items = delete_distribution_agreement_item # Sales Ledger env.create_sales_ledger = create_sales_ledger + env.create_sales_ledgers = create_sales_ledger env.update_sales_ledger = update_sales_ledger + env.update_sales_ledgers = update_sales_ledger env.delete_sales_ledger = delete_sales_ledger + env.delete_sales_ledgers = delete_sales_ledger + # P0: Platform Supply Relations + env.create_platform_supply_relations = create_platform_supply_relations + env.update_platform_supply_relations = update_platform_supply_relations + env.delete_platform_supply_relations = delete_platform_supply_relations + # P0: Platform Supply Products + env.create_platform_supply_products = create_platform_supply_products + env.update_platform_supply_products = update_platform_supply_products + env.delete_platform_supply_products = delete_platform_supply_products + # P0: Product Supplier Mapping + env.create_product_supplier_mapping = create_product_supplier_mapping + env.update_product_supplier_mapping = update_product_supplier_mapping + env.delete_product_supplier_mapping = delete_product_supplier_mapping # Calculation API env.calculate_sale_amounts = calculate_sale_amounts return True diff --git a/wwwroot/api/import_supplier_product.dspy b/wwwroot/api/import_supplier_product.dspy index de1c1dd..5cf283c 100644 --- a/wwwroot/api/import_supplier_product.dspy +++ b/wwwroot/api/import_supplier_product.dspy @@ -1,37 +1,28 @@ -import json -from sqlor import sqlExe -from uuid import uuid4 -from datetime import datetime - -# 引入供应方产品到需求方:创建 product_supplier_mapping 记录 source_product_id = params_kw.get("source_product_id", "") supplier_org_id = params_kw.get("supplier_org_id", "") relation_id = params_kw.get("relation_id", "") supply_price = params_kw.get("supply_price", "0") -suggested_retail_price = params_kw.get("suggested_retail_price", "") min_order_qty = params_kw.get("min_order_qty", "1") if not all([source_product_id, supplier_org_id, relation_id]): - print(json.dumps({"status": "error", "message": "source_product_id, supplier_org_id, relation_id are required"})) -else: - user_org_id = await get_user_orgid() - new_id = uuid4().hex - now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + return json.dumps({"status": "error", "message": "source_product_id, supplier_org_id, relation_id are required"}) - # 获取产品分类 - prod_sql = "SELECT category_id FROM product WHERE id = ${pid}$" - prod = await sqlExe(prod_sql, {"pid": source_product_id}) +user_org_id = await get_userorgid() +new_id = getID() +now = curDateString() + " " + timestampstr()[:8] + +async with get_sor_context(request._run_ns, 'sage') as sor: + prod = await sor.sqlExe("SELECT category_id FROM product WHERE id = ${pid}$", {"pid": source_product_id}) cat_id = prod[0].category_id if prod else "" - sql = """ + await sor.sqlExe(""" INSERT INTO product_supplier_mapping (id, product_id, product_category_id, supplier_type, supplier_org_id, buyer_org_id, supply_price, min_order_qty, status, relation_id, created_at) VALUES (${id}$, ${product_id}$, ${category_id}$, 'internal', ${supplier_org_id}$, ${buyer_org_id}$, ${supply_price}$, ${min_order_qty}$, '1', ${relation_id}$, ${created_at}$) - """ - await sqlExe(sql, { + """, { "id": new_id, "product_id": source_product_id, "category_id": cat_id, @@ -42,4 +33,5 @@ else: "relation_id": relation_id, "created_at": now }) - print(json.dumps({"status": "ok", "message": "产品引入成功", "id": new_id})) + +return json.dumps({"status": "ok", "message": "产品引入成功", "id": new_id}) diff --git a/wwwroot/api/platform_supply_products_create.dspy b/wwwroot/api/platform_supply_products_create.dspy index 49d9ac2..8789bb8 100644 --- a/wwwroot/api/platform_supply_products_create.dspy +++ b/wwwroot/api/platform_supply_products_create.dspy @@ -1,9 +1,5 @@ -import json -from ahserver.serverenv import ServerEnv -env = ServerEnv() -create_func = getattr(env, 'create_platform_supply_products', None) +create_func = create_platform_supply_products if create_func is None: - print(json.dumps({"status": "error", "message": "create_platform_supply_products function not found"})) -else: - result = await create_func(request, params_kw) - print(result) + return json.dumps({"status": "error", "message": "create_platform_supply_products not registered"}) +result = await create_func(request, params_kw) +return result diff --git a/wwwroot/api/platform_supply_products_delete.dspy b/wwwroot/api/platform_supply_products_delete.dspy index 995ec57..7855ee8 100644 --- a/wwwroot/api/platform_supply_products_delete.dspy +++ b/wwwroot/api/platform_supply_products_delete.dspy @@ -1,9 +1,5 @@ -import json -from ahserver.serverenv import ServerEnv -env = ServerEnv() -delete_func = getattr(env, 'delete_platform_supply_products', None) +delete_func = delete_platform_supply_products if delete_func is None: - print(json.dumps({"status": "error", "message": "delete_platform_supply_products function not found"})) -else: - result = await delete_func(request, params_kw) - print(result) + return json.dumps({"status": "error", "message": "delete_platform_supply_products not registered"}) +result = await delete_func(request, params_kw) +return result diff --git a/wwwroot/api/platform_supply_products_update.dspy b/wwwroot/api/platform_supply_products_update.dspy index 85ce459..bd108dc 100644 --- a/wwwroot/api/platform_supply_products_update.dspy +++ b/wwwroot/api/platform_supply_products_update.dspy @@ -1,9 +1,5 @@ -import json -from ahserver.serverenv import ServerEnv -env = ServerEnv() -update_func = getattr(env, 'update_platform_supply_products', None) +update_func = update_platform_supply_products if update_func is None: - print(json.dumps({"status": "error", "message": "update_platform_supply_products function not found"})) -else: - result = await update_func(request, params_kw) - print(result) + return json.dumps({"status": "error", "message": "update_platform_supply_products not registered"}) +result = await update_func(request, params_kw) +return result diff --git a/wwwroot/api/platform_supply_relations_create.dspy b/wwwroot/api/platform_supply_relations_create.dspy index 82bdbae..059df5c 100644 --- a/wwwroot/api/platform_supply_relations_create.dspy +++ b/wwwroot/api/platform_supply_relations_create.dspy @@ -1,9 +1,5 @@ -import json -from ahserver.serverenv import ServerEnv -env = ServerEnv() -create_func = getattr(env, 'create_platform_supply_relations', None) +create_func = create_platform_supply_relations if create_func is None: - print(json.dumps({"status": "error", "message": "create_platform_supply_relations function not found"})) -else: - result = await create_func(request, params_kw) - print(result) + return json.dumps({"status": "error", "message": "create_platform_supply_relations not registered"}) +result = await create_func(request, params_kw) +return result diff --git a/wwwroot/api/platform_supply_relations_delete.dspy b/wwwroot/api/platform_supply_relations_delete.dspy index 6e45fd1..00b83a3 100644 --- a/wwwroot/api/platform_supply_relations_delete.dspy +++ b/wwwroot/api/platform_supply_relations_delete.dspy @@ -1,9 +1,5 @@ -import json -from ahserver.serverenv import ServerEnv -env = ServerEnv() -delete_func = getattr(env, 'delete_platform_supply_relations', None) +delete_func = delete_platform_supply_relations if delete_func is None: - print(json.dumps({"status": "error", "message": "delete_platform_supply_relations function not found"})) -else: - result = await delete_func(request, params_kw) - print(result) + return json.dumps({"status": "error", "message": "delete_platform_supply_relations not registered"}) +result = await delete_func(request, params_kw) +return result diff --git a/wwwroot/api/platform_supply_relations_update.dspy b/wwwroot/api/platform_supply_relations_update.dspy index 5e592e8..be1dd79 100644 --- a/wwwroot/api/platform_supply_relations_update.dspy +++ b/wwwroot/api/platform_supply_relations_update.dspy @@ -1,9 +1,5 @@ -import json -from ahserver.serverenv import ServerEnv -env = ServerEnv() -update_func = getattr(env, 'update_platform_supply_relations', None) +update_func = update_platform_supply_relations if update_func is None: - print(json.dumps({"status": "error", "message": "update_platform_supply_relations function not found"})) -else: - result = await update_func(request, params_kw) - print(result) + return json.dumps({"status": "error", "message": "update_platform_supply_relations not registered"}) +result = await update_func(request, params_kw) +return result diff --git a/wwwroot/api/product_supplier_mapping_create.dspy b/wwwroot/api/product_supplier_mapping_create.dspy index 9dba7e2..1563cfe 100644 --- a/wwwroot/api/product_supplier_mapping_create.dspy +++ b/wwwroot/api/product_supplier_mapping_create.dspy @@ -1,9 +1,5 @@ -import json -from ahserver.serverenv import ServerEnv -env = ServerEnv() -create_func = getattr(env, 'create_product_supplier_mapping', None) +create_func = create_product_supplier_mapping if create_func is None: - print(json.dumps({"status": "error", "message": "create_product_supplier_mapping function not found"})) -else: - result = await create_func(request, params_kw) - print(result) + return json.dumps({"status": "error", "message": "create_product_supplier_mapping not registered"}) +result = await create_func(request, params_kw) +return result diff --git a/wwwroot/api/product_supplier_mapping_delete.dspy b/wwwroot/api/product_supplier_mapping_delete.dspy index 7de8d1e..51e53ad 100644 --- a/wwwroot/api/product_supplier_mapping_delete.dspy +++ b/wwwroot/api/product_supplier_mapping_delete.dspy @@ -1,9 +1,5 @@ -import json -from ahserver.serverenv import ServerEnv -env = ServerEnv() -delete_func = getattr(env, 'delete_product_supplier_mapping', None) +delete_func = delete_product_supplier_mapping if delete_func is None: - print(json.dumps({"status": "error", "message": "delete_product_supplier_mapping function not found"})) -else: - result = await delete_func(request, params_kw) - print(result) + return json.dumps({"status": "error", "message": "delete_product_supplier_mapping not registered"}) +result = await delete_func(request, params_kw) +return result diff --git a/wwwroot/api/product_supplier_mapping_update.dspy b/wwwroot/api/product_supplier_mapping_update.dspy index fbbaec1..2df171b 100644 --- a/wwwroot/api/product_supplier_mapping_update.dspy +++ b/wwwroot/api/product_supplier_mapping_update.dspy @@ -1,9 +1,5 @@ -import json -from ahserver.serverenv import ServerEnv -env = ServerEnv() -update_func = getattr(env, 'update_product_supplier_mapping', None) +update_func = update_product_supplier_mapping if update_func is None: - print(json.dumps({"status": "error", "message": "update_product_supplier_mapping function not found"})) -else: - result = await update_func(request, params_kw) - print(result) + return json.dumps({"status": "error", "message": "update_product_supplier_mapping not registered"}) +result = await update_func(request, params_kw) +return result diff --git a/wwwroot/api/query_platform_products.dspy b/wwwroot/api/query_platform_products.dspy index 6aec17a..09d86b0 100644 --- a/wwwroot/api/query_platform_products.dspy +++ b/wwwroot/api/query_platform_products.dspy @@ -1,23 +1,20 @@ -import json -from sqlor import sqlExe - -# 查询某供应方机构的可用产品列表 supplier_org_id = params_kw.get("supplier_org_id", "") if not supplier_org_id: - print(json.dumps({"status": "error", "message": "supplier_org_id is required"})) -else: - sql = """ + return json.dumps({"status": "error", "message": "supplier_org_id is required"}) + +async with get_sor_context(request._run_ns, 'sage') as sor: + rows = await sor.sqlExe(""" SELECT p.id, p.product_code, p.product_name, p.product_type, p.brief_intro, p.price, p.currency, p.status, pc.name as category_name FROM product p - LEFT JOIN product_category pc ON p.category_id = pc.id + LEFT JOIN product_category pc ON p.category_id = pc.id AND p.org_id = pc.org_id WHERE p.org_id = ${supplier_org_id}$ AND p.status = '1' ORDER BY p.sort_order, p.product_name - """ - rows = await sqlExe(sql, {"supplier_org_id": supplier_org_id}) - print(json.dumps([{"id": r.id, "product_code": r.product_code, - "product_name": r.product_name, "product_type": r.product_type, - "brief_intro": r.brief_intro, "price": r.price, "currency": r.currency, - "category_name": r.category_name} for r in rows], ensure_ascii=False)) + """, {"supplier_org_id": supplier_org_id}) + +return json.dumps([{"id": r.id, "product_code": r.product_code, + "product_name": r.product_name, "product_type": r.product_type, + "brief_intro": r.brief_intro, "price": r.price, "currency": r.currency, + "category_name": r.category_name} for r in rows], ensure_ascii=False) diff --git a/wwwroot/api/query_platform_suppliers.dspy b/wwwroot/api/query_platform_suppliers.dspy index 054ad0a..96d3cb2 100644 --- a/wwwroot/api/query_platform_suppliers.dspy +++ b/wwwroot/api/query_platform_suppliers.dspy @@ -1,16 +1,13 @@ -import json -from sqlor import sqlExe +user_org_id = await get_userorgid() +async with get_sor_context(request._run_ns, 'sage') as sor: + rows = await sor.sqlExe(""" + SELECT id, orgname, orgabbr, contactor, contactor_phone, main_business + FROM organization + WHERE id != ${user_org_id}$ + AND (del_flg IS NULL OR del_flg = '0') + ORDER BY orgname + """, {"user_org_id": user_org_id}) -# 查询平台上所有可作为供应方的机构(排除当前用户的机构) -user_org_id = await get_user_orgid() -sql = """ -SELECT id, orgname, orgabbr, contactor, contactor_phone, main_business -FROM organization -WHERE id != ${user_org_id}$ - AND (del_flg IS NULL OR del_flg = '0') -ORDER BY orgname -""" -rows = await sqlExe(sql, {"user_org_id": user_org_id}) -print(json.dumps([{"id": r.id, "orgname": r.orgname, "orgabbr": r.orgabbr, +return json.dumps([{"id": r.id, "orgname": r.orgname, "orgabbr": r.orgabbr, "contactor": r.contactor, "contactor_phone": r.contactor_phone, - "main_business": r.main_business} for r in rows], ensure_ascii=False)) + "main_business": r.main_business} for r in rows], ensure_ascii=False)