简介这份《骑士加油商业需求文档》PPT面向互联网油站赛道的创业者、产品经理与商业分析学习者系统梳理了智慧油站解决方案的完整商业逻辑。文档围绕市场分析、商业模式、产品规划、收益与成本、风险及对策五大模块展开涵盖石油行业3万亿年交易规模、11万座油站痛点、竞品模式对比、SWOT分析、储值卡与油站管理系统迭代里程碑以及208,200元成本与385万元年收益的测算模型可帮助读者快速理解B端油站服务的产品设计与盈利路径。资源包共1个pptx文件约2.26MB结构清晰、图文并茂适合作为商业计划书撰写与行业研究的参考模板。目前已有59人学习下载对关注O2O加油与产业互联网方向的读者具有较高借鉴价值。1. 从一份“骑士加油商业需求文档.pptx”说起它到底在解决什么问题如果你手里正躺着一份名为“骑士加油商业需求文档.pptx”的文件或者你被要求写出一份这样的文档那你大概率不是在做学术研究而是在面对一个非常具体的业务场景一群骑手、司机或者外勤人员每天在路上跑油费是硬成本而平台或服务商想从中找到一个可持续的商业模式。这份文档的核心不是讲“加油有多重要”而是讲清楚“谁付钱、付给谁、怎么分、系统怎么落”。它要回答的是骑士端怎么看到优惠、加油站怎么接入、平台怎么结算、运营怎么算账。适合三类人看一是产品经理需要把需求写成研发能接的文档二是技术负责人需要评估这套东西能不能用现有系统改三是运营或商务想知道这个模式跑不跑得通。我见过太多人把这类文档写成“市场前景广阔”的作文结果研发看完不知道要建几张表。所以这篇不聊虚的直接拆一份可落地的商业需求文档应该长什么样以及从文档到代码中间要补哪些坑。2. 骑士加油商业需求文档的核心模块拆解从角色到分账2.1 先分清四个角色骑士、加油站、平台、资金方任何加油类商业需求文档第一页如果没把角色列清楚后面全是糊涂账。我一般会强制在文档开头画一张角色关系表不是流程图就是表格谁给谁钱、谁给谁开票、谁承担优惠成本一行一行写死。骑士就是最终加油的人他关心的是“每升便宜几毛”和“能不能不用下车付钱”。加油站关心的是“你平台能不能给我带量且钱别拖”。平台关心的是“我贴出去的优惠能不能从加油站返佣或者资金方补贴里赚回来”。资金方可能是银行、可能是油企、也可能是平台自己的营销预算。这四个角色的诉求经常打架文档里不写清楚研发做出来的分账逻辑就是玄学。常见做法是在文档第二章放一张“角色-权益-结算对象”对照表。比如骑士端看到的是“加200减15”加油站端看到的是“实收185平台补15”平台端看到的是“营销成本15预期返佣8净成本7”。这张表一旦定下来后面所有接口字段都从这里推导。我踩过的坑是文档里只写了“平台补贴”没写补贴是实时到账还是月结结果研发按实时到账做了财务那边根本走不通最后返工。所以角色表后面必须紧跟一张“资金流向表”把每一笔钱的进出时间、账户、凭证写清楚。2.2 商业需求文档里必须写死的三个分账参数分账是这类文档最容易翻车的地方。我一般要求文档里至少写死三个参数优惠分摊比例、结算周期、最小结算单位。优惠分摊比例是指一笔加油订单里平台承担多少、加油站承担多少、资金方承担多少。比如骑士加200元油优惠15元平台出10元加油站出5元那分摊比例就是2:1。这个比例不写死研发没法做分账逻辑运营也没法算ROI。结算周期是指加油站什么时候能拿到钱是T1、T7还是月结。这个直接决定加油站愿不愿意接入。最小结算单位是指分账金额精确到分还是角别小看这个财务系统对不上账经常就是因为四舍五入规则没统一。文档里最好用表格把这些参数列出来并标注“是否可配置”。我的血泪经验是凡是写“可配置”的参数研发就会问“配置界面在哪”所以要么在文档里明确配置后台的需求要么直接写死成常量别留模糊地带。另外分账参数一定要和合同条款对齐文档里写平台出10元合同里写平台出8元上线后就是事故。我一般会在文档末尾附一句“本参数以商务合同为准如有冲突以合同为准”但这句话不能当挡箭牌写文档的时候就要和商务对一遍。2.3 从文档到接口骑士端展示优惠的字段设计商业需求文档不能只停在业务层至少要往下探一层到接口字段。骑士端要展示“附近加油站”和“优惠金额”那文档里就得定义清楚加油站列表接口返回哪些字段、优惠金额怎么算、排序规则是什么。我一般会在文档里直接贴一段伪JSON不是代码就是字段说明。比如{ station_id: S001, station_name: XX加油站, distance: 1.2, original_price: 7.85, discount_amount: 0.35, final_price: 7.50, settle_type: platform_subsidy }这段字段说明里discount_amount是每升优惠还是总优惠必须写清楚。我见过文档里写“优惠金额”研发理解成总优惠前端按每升展示结果用户加完油发现不对投诉到客服。所以文档里要加一列“单位”并且写清楚计算规则final_price original_price - discount_amount且discount_amount是每升优惠。另外settle_type是给后端分账用的前端不展示但文档里要写否则后端不知道这笔优惠走哪个结算通道。这些字段一旦定下来后面改的成本很高所以文档评审时一定要拉上前后端一起过。3. 把商业需求文档变成可执行方案技术选型与数据表设计3.1 为什么这类项目我优先选关系型数据库而不是文档库加油分账涉及钱钱就必须有事务。我不管别人怎么吹NoSQL只要涉及资金流水、分账记录、对账单我一律优先选MySQL或者PostgreSQL。原因很简单分账要么全成功要么全失败不能出现“骑士扣了钱但加油站没收到”的中间状态。关系型数据库的事务能保证这一点而且后续财务对账时SQL查起来比文档库方便太多。文档库适合存日志、存非结构化数据但不适合存分账核心表。常见做法是核心交易表用MySQL日志和埋点用Elasticsearch或者MongoDB各干各的。表设计上至少要有四张核心表订单表、分账明细表、加油站结算表、骑士优惠券表。订单表记录每一笔加油订单的原始金额、优惠金额、实付金额。分账明细表记录这笔订单里平台出多少、加油站出多少、资金方出多少以及分账状态。加油站结算表按结算周期汇总记录应结金额、已结金额、结算状态。骑士优惠券表记录优惠券的发放、核销、过期。这四张表的关系要在文档里用ER图或者表格描述清楚别只丢给研发去猜。3.2 建表SQL分账明细表的最小字段集下面这段SQL是我在多个类似项目里沉淀下来的最小字段集可以直接抄但要根据你的结算周期调整字段长度和索引。注意我加了注释说明每个字段为什么存在。CREATE TABLE fuel_order_split ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, order_id VARCHAR(64) NOT NULL COMMENT 加油订单号关联订单表, station_id VARCHAR(32) NOT NULL COMMENT 加油站ID, rider_id VARCHAR(64) NOT NULL COMMENT 骑士ID, original_amount DECIMAL(10,2) NOT NULL COMMENT 原始金额单位元, discount_amount DECIMAL(10,2) NOT NULL COMMENT 总优惠金额单位元, platform_amount DECIMAL(10,2) NOT NULL COMMENT 平台承担金额, station_amount DECIMAL(10,2) NOT NULL COMMENT 加油站承担金额, funder_amount DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT 资金方承担金额, settle_status TINYINT NOT NULL DEFAULT 0 COMMENT 结算状态0待结算 1已结算 2结算失败, settle_time DATETIME DEFAULT NULL COMMENT 结算时间, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_order_id (order_id), KEY idx_station_settle (station_id, settle_status), KEY idx_rider (rider_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT加油分账明细表;这段SQL里uk_order_id唯一索引是关键防止同一笔订单重复分账。idx_station_settle是给加油站结算查询用的因为结算时通常按加油站结算状态筛选。platform_amount、station_amount、funder_amount三个字段加起来必须等于discount_amount这个约束在代码里校验数据库层面也可以加CHECK约束但MySQL 5.7之前不支持所以我在代码里做。settle_status用TINYINT而不是枚举是为了后续扩展状态时不用改表结构。这些细节文档里不写研发可能就按自己的习惯来了后面改起来很痛苦。3.3 结算批处理的伪代码与幂等设计分账明细写完之后下一步是结算。结算通常是定时任务按结算周期跑。我一般会写一个批处理按加油站分组汇总待结算金额然后调用支付接口。这里最大的坑是幂等如果批处理跑了一半挂了重启后不能重复结算。我的做法是在分账明细表里用settle_status做状态机结算前先更新状态为“处理中”结算成功再更新为“已结算”失败更新为“结算失败”。批处理每次只捞settle_status0的记录并且用乐观锁或者SELECT ... FOR UPDATE锁住。def settle_station(station_id, settle_date): # 1. 捞取待结算记录加行锁 records query( SELECT * FROM fuel_order_split WHERE station_id%s AND settle_status0 FOR UPDATE, station_id ) if not records: return total sum(r.station_amount for r in records) # 2. 调用支付接口带唯一结算单号 settle_no fSETTLE_{station_id}_{settle_date} resp payment_client.transfer( accountstation_id, amounttotal, settle_nosettle_no ) # 3. 根据结果更新状态 if resp.success: update(UPDATE fuel_order_split SET settle_status1, settle_timeNOW() WHERE id IN (%s) % ,.join(str(r.id) for r in records)) else: update(UPDATE fuel_order_split SET settle_status2 WHERE id IN (%s) % ,.join(str(r.id) for r in records))这段伪代码里FOR UPDATE是防止并发结算同一批记录。settle_no是幂等键支付接口那边如果收到重复的settle_no应该返回之前的结果而不是重复转账。settle_status2的记录需要人工介入或者重试机制不能自动重试因为可能是账户信息错误。文档里要写清楚这些状态流转否则运维不知道该怎么处理失败记录。我一般会在文档里附一张状态机图但这里不用mermaid就用文字描述0→1成功0→2失败2→0人工重置后重试。4. 骑士加油商业需求文档的避坑与排查那些上线后才明白的事4.1 优惠叠加导致的负毛利现象上线第一个月财务发现某些订单平台实际补贴金额超过了预期甚至出现加油站实收大于原始金额的情况。原因文档里只写了“平台优惠”和“加油站优惠”可以叠加但没写叠加上限。运营配置活动时两个优惠同时生效导致优惠总额超过了平台预算。解决在文档里强制加一条“优惠叠加规则”明确最多叠加几层、总优惠不超过原始金额的百分之多少。代码里加校验分账前先算总优惠超过阈值直接拒绝或者降级。4.2 加油站ID不统一导致结算串户现象结算时发现A加油站的款打到了B加油站账户。原因加油站ID在订单表里用的是平台内部ID在结算表里用的是第三方油企的ID两个ID没做映射。文档里只写了“加油站ID”没写是哪个系统的ID。解决文档里必须区分“内部站点ID”和“外部站点ID”并加一张映射表。所有接口传参必须明确是哪个ID。我一般会在文档里写“本文档中未特殊说明的站点ID均指内部站点ID”但这句话救不了命最好每个字段都标清楚。4.3 结算周期与发票流不同步现象加油站已经收到结算款但平台还没收到加油站的发票财务无法入账。原因文档里只写了资金结算周期没写发票流转周期。资金T1结算发票月结导致财务账上挂着大量未收发票。解决文档里要加一节“发票管理”明确发票开具时间、邮寄方式、电子发票还是纸质发票。最好把发票状态也做成一个字段和结算状态联动。我见过最狠的坑是加油站是个体户根本开不了专票最后平台自己承担税点。4.4 骑士端展示价格与加油站实际价格不一致现象骑士到站后发现加油机显示的价格和App里不一样投诉。原因App里的价格是平台维护的加油站调价后没同步。文档里没写价格同步机制。解决文档里要写清楚价格来源是平台手动维护还是对接油企接口。如果是手动维护就要加调价审核流程和同步延迟说明。我一般会建议加一个“价格异常反馈”入口骑士发现不一致可以上报运营核实后补偿。这个功能文档里不写上线后客服会被打爆。4.5 分账金额四舍五入导致总分不平现象分账明细表里三条记录加起来比总优惠多一分钱或者少一分钱。原因分账时用了浮点数或者四舍五入规则不统一。解决文档里明确“所有金额单位精确到分使用整数运算最后一条记录用减法兜底”。代码里用Decimal或者整数分别用float。我一般会在分账逻辑里写前N-1条按比例算最后一条 总优惠 - 前N-1条之和。这样永远不会不平。5. 进阶用一份可交互的原型验证商业需求文档的可行性5.1 为什么我坚持在文档评审前先跑一个最小原型商业需求文档写得再细评审时还是有人会问“这个流程真的跑得通吗”。我的习惯是在文档定稿前用Python或者Node.js写一个最小原型把核心流程跑一遍创建订单、计算分账、写入数据库、模拟结算。不需要前端就用命令行或者Postman。这个原型不是为了上线是为了验证文档里的字段和状态机有没有漏洞。我一般会花半天时间写但能省掉后面至少两天的扯皮。原型代码不用提交到主仓库就放在本地评审时投屏跑一遍比讲十页PPT都管用。5.2 最小原型的核心逻辑与验证点下面这段Python伪代码展示了原型里最关键的验证点分账金额是否平、状态流转是否正确、幂等是否生效。你可以直接改成可运行的脚本用SQLite代替MySQL。from decimal import Decimal def split_order(order): # 验证点1分账金额必须等于总优惠 total_discount Decimal(order[discount_amount]) platform Decimal(order[platform_amount]) station Decimal(order[station_amount]) funder Decimal(order[funder_amount]) assert platform station funder total_discount, 分账不平 # 验证点2实付金额 原始金额 - 总优惠 assert Decimal(order[original_amount]) - total_discount Decimal(order[final_amount]), 实付金额错误 # 验证点3幂等同一订单不能重复分账 if db.query(SELECT id FROM fuel_order_split WHERE order_id%s, order[order_id]): return duplicate db.insert(fuel_order_split, {...}) return ok这段代码里assert是原型的核心跑的时候如果断言失败说明文档里的字段定义有矛盾。我一般会准备十条测试订单覆盖正常、优惠叠加、金额为零、重复订单等场景。跑通之后把断言条件写回文档作为验收标准。这样研发实现时也有明确的测试用例。另外原型里不要用浮点数全部用Decimal这个习惯能避免后面很多对账问题。5.3 从原型到正式开发的交接清单原型跑通后文档里要加一个“交接清单”列出正式开发前必须确认的事项。我一般会列这几项数据库表结构是否已评审、分账参数是否已和商务确认、结算周期是否已和财务确认、加油站ID映射表是否已提供、发票流程是否已明确。每一项都要有责任人和截止时间。这个清单不写在文档正文里作为附录。我自己的习惯是每次评审完把清单复制到项目管理工具里逐项关闭。没有这个清单文档写得再好落地时也会漏东西。希望帮到你。本文还有配套的精品资源点击获取