221 lines
11 KiB
Python
221 lines
11 KiB
Python
"""营销官网视图(批次 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 反查流向,"
|
||
"在专业版路线图中,尚未交付,故此处只作说明。"),
|
||
],
|
||
))
|