Files

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