338 lines
17 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{% set cats_r = get_category_tree(org_id='0') %}
{% set cats = (cats_r or {}).get('tree', []) if (cats_r or {}).get('success') else [] %}
{% set userid = get_user() %}
{% set userorgid = get_userorgid() %}
{
"widgettype": "VBox",
"options": {
"width": "100%",
"height": "100%",
"padding": "0",
"bgcolor": "var(--bg-page)"
},
"subwidgets": [
{
"widgettype": "TabPanel",
"options": {
"css": "filler",
"width": "100%",
"height": "100%",
"tab_pos": "top",
"items": [
{% for cat in cats %}
{% set pr = get_products_by_category(cat.id, org_id='0') %}
{% set prods = (pr or {}).get('products', []) %}
{
"name": "cat_{{cat.id}}",
"label": {{json.dumps(cat.name or '', ensure_ascii=False)}},
"content": {
"widgettype": "VScrollPanel",
"options": {
"width": "100%",
"height": "100%"
},
"subwidgets": [
{
"widgettype": "VBox",
"options": {
"width": "100%",
"padding": "20px 24px",
"gap": "16px"
},
"subwidgets": [
{
"widgettype": "HBox",
"options": {
"width": "100%",
"flexWrap": "wrap",
"gap": "16px"
},
"subwidgets": [
{% set ns = namespace(first=true) %}
{% for p in prods %}
{% if p.get('is_active', true) %}
{# 显示价 = 资源真实定价 × 客户折扣率2026-09-06未登录按 '*' 通用折扣报价 #}
{% set cust = get_customer_price_display(p.get('id'), user_org_id=userorgid or '') %}
{% set pricing_text = (cust or {}).get('pricing_text', '定价暂不可用') if (cust or {}).get('success') else ((cust or {}).get('message') or '定价暂不可用') %}
{% set original_text = (cust or {}).get('original_text', '') %}
{# 多价目产品(如模型按分辨率×类型分档)用表格展示定价要素+价格2026-09-09 用户要求),
一行文本拼「A ¥x | A ¥y」客户看不出适用条件单价目仍走文本 #}
{% set price_table = (cust or {}).get('price_table') or none %}
{% set is_pipeline = (p.get('product_type') == 'pipeline') %}
{# 模型按量产品不支持也无需「购买」purchase_realtime 只支持 account/storage/pipeline
卡片不弹购买框、不出立即购买按钮改为「按量付费」字样2026-09-08 用户要求) #}
{% set is_model = (p.get('product_type') in ('pipeline_llm_model', 'llm_model')) %}
{% set extra = {} %}
{% if is_pipeline %}
{# 产线订阅状态:已订阅→「进入产线」直达;未订阅→「立即购买」弹购买确认 #}
{% set sub = check_subscription_valid(p.get('id'), userorgid or '') if userorgid else {'valid': False} %}
{% set _urls = {'PIPE-OPP': '/pipeline-opportunity/agent', 'PIPE-BID': '/pipeline-bidding/agent', 'PIPE-DEV': '/pipeline_core/agent', 'opportunity_general': '/pipeline-opportunity/agent', 'bidding_general': '/pipeline-bidding/agent', 'sdlc_general': '/pipeline_core/agent'} %}
{% set extra = {'tab_name': 'pipeline_card_' + str(p.get('product_code','')), 'tab_label': p.get('product_name') or '', 'url': _urls.get(p.get('product_code') or '', ''), 'planned': not _urls.get(p.get('product_code') or '', ''), 'message': (p.get('product_name') or '') + '规划中,尚未开发', 'subscribed': (sub or {}).get('valid', False), 'sub_end': (sub or {}).get('end_date', '')} %}
{% endif %}
{% if not ns.first %},{% endif %}
{% set ns.first = false %}
{
"widgettype": "VBox",
"options": {
"css": "card",
"cwidth": 24,
"cheight": 15,
"padding": "20px",
"bgcolor": "var(--surface-card)",
"cursor": {{json.dumps('default' if is_model else 'pointer')}},
"gap": "8px"
},
{% if is_pipeline %}
"binds": [
{% if extra.planned %}
{
"wid": "self",
"event": "click",
"actiontype": "script",
"target": "self",
"script": {{json.dumps("bricks.show_message({title:" + json.dumps(extra.tab_label, ensure_ascii=False) + ",message:" + json.dumps(extra.message, ensure_ascii=False) + "});", ensure_ascii=False)}}
}
{% else %}
{
"wid": "self",
"event": "click",
"actiontype": "script",
"target": "self",
"script": {{json.dumps("var _tp=bricks.getWidgetById('main_content',bricks.app);if(_tp&&_tp.open_tab){_tp.open_tab({name:" + json.dumps(extra.tab_name, ensure_ascii=False) + ",label:" + json.dumps(extra.tab_label, ensure_ascii=False) + ",url:" + json.dumps(extra.url, ensure_ascii=False) + ",removable:true});}", ensure_ascii=False)}}
}
{% endif %}
],
{% elif not is_model %}
"binds": [
{
"wid": "self",
"event": "click",
"actiontype": "urlwidget",
"target": "PopupWindow",
"popup_options": {
"title": {{json.dumps('购买 - ' + (p.get('product_name') or ''), ensure_ascii=False)}},
"cwidth": 40,
"cheight": 26
},
"options": {
"method": "POST",
"url": "{{entire_url('/product_management/storefront/api/purchase_confirm.dspy')}}",
"params": {
"product_id": {{json.dumps(p.get('id') or '', ensure_ascii=False)}}
}
}
}
],
{% endif %}
"subwidgets": [
{
"widgettype": "Title4",
"options": {
"text": {{json.dumps(p.get('product_name') or '', ensure_ascii=False)}},
"color": "var(--ink-1)"
}
},
{
"widgettype": "VScrollPanel",
"options": {
"flex": "1",
"width": "100%"
},
"subwidgets": [
{
"widgettype": "Text",
"options": {
"text": {{json.dumps(p.get('brief_intro') or '暂无介绍', ensure_ascii=False)}},
"fontSize": "13px",
"color": "var(--ink-3)",
"wrap": true
}
}
]
},
{% if is_pipeline and extra.planned %}
{
"widgettype": "Text",
"options": {
"otext": "规划中", "text": "规划中", "i18n": true,
"fontSize": "14px",
"color": "var(--ink-3)",
"fontWeight": "600"
}
},
{% else %}
{% if price_table %}
{# 多价目声明式表格2026-09-18 用户纠正:不用 Html 拼 table用 bricks 控件;
行类 tabular-header-row/tabular-row 框架双主题齐备;数据走 otext+i18n 回退原文) #}
{
"widgettype": "VBox",
"options": {"width": "100%", "gap": "0"},
"subwidgets": [
{
"widgettype": "HBox",
"options": {"css": "tabular-header-row", "width": "100%"},
"subwidgets": [
{% for h in price_table.headers %}
{"widgettype": "Text", "options": {"otext": {{json.dumps(h, ensure_ascii=False)}}, "text": {{json.dumps(h, ensure_ascii=False)}}, "i18n": true, "halign": "left", "css": "filler", "cfontsize": 0.75, "flex": "1 1 0px"}}{{ "," if not loop.last }}
{% endfor %}
]
}{{ "," if price_table.rows }}
{% for row in price_table.rows %}
{
"widgettype": "HBox",
"options": {"css": "tabular-row", "width": "100%"},
"subwidgets": [
{% for c in row %}
{% if c.k == 'price' %}
{"widgettype": "HBox", "options": {"css": "filler", "gap": "6px", "alignItems": "center", "flex": "1 1 0px"}, "subwidgets": [
{"widgettype": "Text", "options": {"otext": {{json.dumps(c.t, ensure_ascii=False)}}, "text": {{json.dumps(c.t, ensure_ascii=False)}}, "i18n": true, "halign": "left", "cfontsize": 0.75, "color": "#e74c3c"}}{% if c.orig %},
{"widgettype": "Text", "options": {"otext": {{json.dumps(c.orig, ensure_ascii=False)}}, "text": {{json.dumps(c.orig, ensure_ascii=False)}}, "i18n": true, "halign": "left", "cfontsize": 0.75, "color": "var(--ink-3)", "textDecoration": "line-through"}}{% endif %}
]}{{ "," if not loop.last }}
{% else %}
{"widgettype": "Text", "options": {"otext": {{json.dumps(c.t, ensure_ascii=False)}}, "text": {{json.dumps(c.t, ensure_ascii=False)}}, "i18n": true, "halign": "left", "css": "filler", "cfontsize": 0.75, "color": "var(--ink-2)", "flex": "1 1 0px"}}{{ "," if not loop.last }}
{% endif %}
{% endfor %}
]
}{{ "," if not loop.last }}
{% endfor %}
]
},
{% else %}
{
"widgettype": "Text",
"options": {
"text": {{json.dumps(pricing_text, ensure_ascii=False)}},
"fontSize": "14px",
"color": "#e74c3c"
}
},
{% if original_text %}
{
"widgettype": "Text",
"options": {
"text": {{json.dumps(original_text, ensure_ascii=False)}},
"fontSize": "11px",
"color": "var(--ink-3)",
"textDecoration": "line-through"
}
},
{% endif %}
{% endif %}
{% if is_pipeline %}
{
"widgettype": "Text",
"options": {
"text": {{json.dumps(('订阅制 · 已订阅至 ' + extra.sub_end) if extra.subscribed else '订阅制 · 模型/存储消耗另计', ensure_ascii=False)}},
"fontSize": "11px",
"color": {{json.dumps('#27ae60' if extra.subscribed else '#94a3b8')}}
}
},
{% endif %}
{% endif %}
{
"widgettype": "HBox",
"options": {
"width": "100%",
"justifyContent": "flex-end"
},
"subwidgets": [
{% if is_pipeline and extra.planned %}
{
"widgettype": "Text",
"options": {
"otext": "敬请期待", "text": "敬请期待", "i18n": true,
"fontSize": "13px",
"color": "var(--ink-3)"
}
}
{% elif is_pipeline and extra.subscribed %}
{
"widgettype": "Button",
"options": {
"label": "进入产线",
"bgcolor": "#2563eb",
"color": "#fff",
"padding": "8px 24px",
"borderRadius": "6px"
},
"binds": [
{
"wid": "self",
"event": "click",
"actiontype": "script",
"target": "self",
"script": {{json.dumps("var _tp=bricks.getWidgetById('main_content',bricks.app);if(_tp&&_tp.open_tab){_tp.open_tab({name:" + json.dumps(extra.tab_name, ensure_ascii=False) + ",label:" + json.dumps(extra.tab_label, ensure_ascii=False) + ",url:" + json.dumps(extra.url, ensure_ascii=False) + ",removable:true});}", ensure_ascii=False)}}
}
]
}
{% elif is_model %}
{
"widgettype": "Text",
"options": {
"otext": "按量付费", "text": "按量付费", "i18n": true,
"fontSize": "13px",
"color": "#e74c3c",
"fontWeight": "600"
}
}
{% elif userid %}
{
"widgettype": "Button",
"options": {
"label": "立即购买",
"bgcolor": "#e74c3c",
"color": "#fff",
"padding": "8px 24px",
"borderRadius": "6px"
},
"binds": [
{
"wid": "self",
"event": "click",
"actiontype": "urlwidget",
"target": "PopupWindow",
"popup_options": {
"title": {{json.dumps('购买 - ' + (p.get('product_name') or ''), ensure_ascii=False)}},
"cwidth": 40,
"cheight": 26
},
"options": {
"method": "POST",
"url": "{{entire_url('/product_management/storefront/api/purchase_confirm.dspy')}}",
"params": {
"product_id": {{json.dumps(p.get('id') or '', ensure_ascii=False)}}
}
}
}
]
}
{% else %}
{
"widgettype": "Text",
"options": {
"otext": "登录后购买", "text": "登录后购买", "i18n": true,
"fontSize": "13px",
"color": "var(--ink-3)"
}
}
{% endif %}
]
}
]
}
{% endif %}
{% endfor %}
]
}
]
}
]
}
}{% if not loop.last %},{% endif %}
{% endfor %}
]
}
}
]
}