338 lines
17 KiB
XML
338 lines
17 KiB
XML
{% 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 %}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|