{% 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 %} ] } } ] }