"""营销官网视图(批次 C3)。 原则(计划要求):**不写纸面功能**——官网每个卖点都必须对应一个已实现特性, 价格页数据直接读 `billing.Plan.limits`(与配额校验同源)。 """ from __future__ import annotations from django.shortcuts import render from apps.billing.models import seed_plans def _plans(): """套餐列表(价格页 + 首页价格预览共用)。""" from apps.billing.models import Plan seed_plans() return list(Plan.objects.filter(is_active=True).order_by("sort_order", "code")) def _base_context(**extra): ctx = { "site_name": "dealerhub 经销商中枢", "tagline": "AI 开单 + 应收风控的经销商进销存", "demo_url": "/#/login", "app_url": "/#/dashboard", } ctx.update(extra) return ctx def home(request): """首页:H1 + 6 角色价值 + 三大 AI 卖点 + 演示入口 + 价格预览。""" features = [ { "icon": "📦", "title": "进销存一体", "desc": "采购进货、销售开单、库存批次、往来账款打通,一张单贯穿到底。", }, { "icon": "🏷️", "title": "批次效期(FEFO)", "desc": "入库登记生产/到期日,出库自动近效期优先分摊,临期自动预警。" "食品、生鲜、医药刚需。", }, { "icon": "📐", "title": "整件散包多单位", "desc": "箱/瓶/提/公斤自由换算,录单按常用单位,库存自动折基本单位。", }, { "icon": "💰", "title": "信用额度管控", "desc": "客户额度自动校验,超额拦截并可审批放行,放行留痕可追溯。", }, { "icon": "📊", "title": "应收账龄 + 对账单", "desc": "六桶账龄分析、客户对账单可生成分享链接,客户手机直接打开核对。", }, { "icon": "🖨️", "title": "打印中心", "desc": "销售单/进货单模板可编辑,一键打印或存 PDF,含批次号与抹零明细。", }, ] ai_features = [ { "badge": "独家", "icon": "⚠️", "title": "AI 应收风险预警", "desc": "回款周期漂移 + 欠款趋势 + 开单频次三因子加权评分," "在客户跑单前给出预警——竞品 AI 都在做开单,只有我们做风控。", "highlight": True, }, { "badge": "省时", "icon": "🤖", "title": "AI 录单", "desc": "把客户微信发来的订货文字粘进来,自动识别商品与数量、匹配档案," "回填成销售单草稿。", "highlight": False, }, { "badge": "参谋", "icon": "💬", "title": "AI 经营问答", "desc": "用大白话问「谁欠钱最多」「这个月赚了多少」,系统实时取数作答,只读不改数据。", "highlight": False, }, ] roles = [ ("老板", "经营大盘 + AI 风控 + 利润表", "手机上看当天销售、欠款排行、风险客户,不用等财务月报。"), ("财务", "总账凭证 + 账龄 + 对账单", "单据自动生成凭证,试算平衡一眼可见,对账单直接发客户。"), ("销售", "开单取价 + 信用提示 + 移动下单", "客户历史价自动带出,超额当场提示,不会白跑一趟。"), ("仓管", "批次效期 + 库存流水", "近效期优先出库,临期自动提醒,盘点差异有据可查。"), ("采购", "进货单 + 供应商应付", "进货即入账,批次号/保质期一次录完,应付自动生成。"), ("运营", "E 渠道 + 开放 API", "抖店/1688 订单自动拉取,开放 API 对接自有系统。"), ] return render(request, "website/home.html", _base_context( features=features, ai_features=ai_features, roles=roles, plans=_plans()[:3], )) def pricing(request): """价格页:三档功能对比(数据源 = Plan.limits)。 对比值在视图里预计算成「行 × 列」矩阵——Django 模板不支持按变量键取字典, 放这里算比在模板里绕 `{% for k, val in ... %}` 清晰得多。 """ plans = _plans() compare_rows = [ ("用户数", "users", False), ("商品数", "products", False), ("月单据量", "bills_monthly", False), ("AI 录单(次/月)", "ai_parse_order", False), ("AI 问答(次/月)", "ai_ask", False), ("批次效期管理", "batch_managed", True), ("总账核算", "finance_ledger", True), ("打印模板数", "print_templates", False), ("订货商城(B2B)", "storefront", True), ] matrix = [] for label, key, is_flag in compare_rows: cells = [] for p in plans: value = (p.limits or {}).get(key) if is_flag: cells.append("✓" if value else "—") elif value: cells.append(f"{value:,}") else: cells.append("不限") matrix.append({"label": label, "cells": cells, "is_flag": is_flag}) return render(request, "website/pricing.html", _base_context( plans=plans, matrix=matrix, page_title="价格与功能对比", page_desc="dealerhub 经销商进销存套餐价格:免费版、基础版 ¥998/月、专业版 ¥4800/月," "含批次效期、总账核算与 AI 应收风控。", )) def industry_food(request): """食品行业落地页:批次效期 + FEFO + 整件散包(均为已实现特性)。""" return render(request, "website/industry.html", _base_context( page_title="食品经销商进销存 · 批次效期与临期预警", page_desc="面向食品饮料经销商的进销存系统:批次生产/到期日登记、出库近效期优先" "(FEFO)、临期自动预警、整件散包多单位换算、打印单据含批次号。", industry="食品饮料", plans=_plans(), pain_points=[ ("临期损耗靠人记", "仓库靠贴纸条记到期日,一个疏忽就压一批货过期作废。"), ("整件散包换算容易错", "客户要 3 箱 + 5 瓶,业务员心算成瓶数经常错,对账扯皮。"), ("客户赊销没底线", "老客户越欠越多,没有额度控制,坏账才发现。"), ], solutions=[ ("批次账 + FEFO 出库", "入库录批次号与到期日,出库自动按近效期优先分摊," "同一单可跨多批次,分摊明细进库存流水。"), ("临期自动预警", "设置提前 N 天(默认 30 天),系统每日扫描在库批次," "临期批次自动进消息中心并按批次去重。"), ("多单位换算", "箱/瓶/提/公斤自由配置换算率,录单用业务员习惯的单位," "库存恒按基本单位记账,金额按录入单位计价。"), ("信用额度 + 账龄", "客户额度自动校验,超额拦截或审批放行;" "六桶账龄看清钱在哪一段。"), ], )) def industry_hardware(request): """五金建材落地页:多单位换算 + 尾差抹零(均为已实现特性)。""" return render(request, "website/industry.html", _base_context( page_title="五金建材经销商进销存 · 多单位换算与抹零", page_desc="面向五金建材经销商的进销存系统:多单位换算(吨/件/米/公斤)、" "单据抹零(分/角/元)、最低售价管控、账龄与对账单分享。", industry="五金建材", plans=_plans(), pain_points=[ ("单位换算乱", "螺纹钢按吨、螺丝按盒、线材按米,换算率记在业务员脑子里。"), ("零头对不齐", "小数单价乘数量出来的零头,客户要求抹掉,手工改容易改错账。"), ("低价报单无管控", "业务员为了成单自行压价,低于成本价也报,月底才发现亏损。"), ], solutions=[ ("换算率落在商品档案", "每个商品配置多单位与换算率,录单直接选单位," "系统自动折算,不再靠心算。"), ("三档抹零", "单据级选择不抹/抹分/抹角/抹元,系统向下取整," "抹零额单独记录并在单据与打印上体现。"), ("最低售价管控", "设置商品最低售价,低于则拦截;确需特价可勾选" "「审批放行」,放行记录留痕。"), ("价格历史参考", "开单时自动带出该客户专属价、上次成交价与历史区间," "报价有依据。"), ], )) def industry_autoparts(request): """汽配落地页:预留序列号路线(明确标注"规划中",不写纸面功能)。""" return render(request, "website/industry.html", _base_context( page_title="汽配经销商进销存 · 序列号追溯(规划中)", page_desc="面向汽配经销商的进销存系统:当前可用批次效期、多单位、信用额度、" "账龄对账单;序列号(SN)出入库追溯在专业版路线图中。", industry="汽配", plans=_plans(), pain_points=[ ("配件型号多", "同型号不同批次、不同供应商,混在一起分不清来源。"), ("售后追溯难", "客户拿回一个件说有问题,查不到是哪批进的、卖给谁了。"), ("赊销对账慢", "月底和修理厂对账,靠微信翻聊天记录。"), ], solutions=[ ("当前可用:批次账", "按供应商批次入库,出库按批次分摊," "至少能追到「哪一批」的粒度。"), ("当前可用:多单位", "按箱/套/个录入,库存按基本单位记账。"), ("当前可用:对账单分享", "一键生成客户对账单链接,修理厂老板手机打开即可核对," "不用翻聊天记录。"), ("规划中:序列号 SN 追溯", "出入库绑定 SN、售后按 SN 反查流向," "在专业版路线图中,尚未交付,故此处只作说明。"), ], ))