From b7e02f07825a095373861803d75a95cc8e23bc25 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Fri, 31 Jul 2026 14:09:41 +0800 Subject: [PATCH] 1 --- 一期/一期开发进度表.md | 32 +- 二期/README.md | 10 +- 二期/二期产品待确认事项.md | 88 ++- 二期/二期开发规划.md | 517 +++++++----------- 二期/二期开发进度表.md | 189 +++---- 二期/二期计费财务模块规划.md | 204 +++---- 二期/二期计费财务需求确认表.md | 68 ++- 二期/二期计费财务需求确认表.xlsx | Bin 8957 -> 10355 bytes 二期/二期需求确认清单.md | 384 +++---------- 二期/二期需求确认清单.xlsx | Bin 13300 -> 12802 bytes .../2026-07-31-二期需求确认-产品回传-v1.xlsx | Bin 0 -> 19439 bytes 二期/产品回传/2026-07-31-产品确认合并记录.md | 55 ++ 二期/虫虫出海二期开发进度表.xlsx | Bin 30733 -> 23409 bytes 13 files changed, 616 insertions(+), 931 deletions(-) create mode 100644 二期/产品回传/2026-07-31-二期需求确认-产品回传-v1.xlsx create mode 100644 二期/产品回传/2026-07-31-产品确认合并记录.md diff --git a/一期/一期开发进度表.md b/一期/一期开发进度表.md index dea8952..a3ae5c2 100644 --- a/一期/一期开发进度表.md +++ b/一期/一期开发进度表.md @@ -1,8 +1,8 @@ # 虫虫出海一期开发进度表 > 创建日期:2026-07-27 -> 更新日期:2026-07-30 -> 当前阶段:一期双端持续浏览器联调;Client 一期核心静态页面与路由已完成(静态完成度 100%)。后端 2026-07-30 业务成熟度回归已确认认证、个人资料、成员、角色、仓库、往来单位、订单草稿和履约快递能力通过真实 API 检查;前端已继续接入个人资料、修改密码、成员完整维护、角色权限回显/保存和商户往来单位候选,仍需完成关键写操作、资质图片及 Admin 目标租户订单的人工浏览器验收 +> 更新日期:2026-07-31 +> 当前阶段:一期双端持续浏览器联调;Client 一期核心静态页面与路由已完成(静态完成度 100%)。当前采用“前端可改、`baiyue-firstleg/` 后端只读核对”的联调方式;已修正订单主往来单位 `customerId`、往来单位类型契约,并接入角色编辑/启停/删除真实 API。仍需后端准备启用收货仓、自定义角色和快递有值样本后完成浏览器只读验收,写操作暂不执行 > 总体状态:开发中 头程订单一期闭环范围与接口草案见 `一期头程订单闭环设计.md`。 @@ -69,10 +69,10 @@ | ADM-USER-01 | 后台 | 内部用户 | 用户列表、搜索、分页和详情 | P0 | 进行中 | 70% | BASE-03 | 待分配 | 前端列表、筛选和分页已完成 | | ADM-USER-02 | 后台 | 内部用户 | 新增、编辑、启停、重置密码 | P0 | 进行中 | 65% | ADM-USER-01 | 待分配 | 前端交互已完成,操作日志与接口待接入 | | ADM-USER-03 | 后台 | 内部用户 | 给用户分配一个或多个角色 | P0 | 进行中 | 75% | ADM-ROLE-01 | 待分配 | 多角色选择与回显已完成 | -| ADM-ROLE-01 | 后台 | 角色 | 角色列表、新增、编辑、删除、启停 | P0 | 联调中 | 82% | BASE-03 | 待分配 | 平台角色列表与新增已接 `/api/platform/v1/iam/roles`;编辑、删除、启停接口未提供,真实会话中明确禁用且不回退模拟写入 | +| ADM-ROLE-01 | 后台 | 角色 | 角色列表、新增、编辑、删除、启停 | P0 | 联调中 | 92% | BASE-03 | 待分配 | 已按后端 `RbacController` 接入角色查询、新增、编辑、启停、删除、权限回显及全量保存;待准备自定义角色样本完成真实写操作验收 | | ADM-ROLE-02 | 后台 | 角色 | 给角色分配菜单和操作权限 | P0 | 已阻塞 | 75% | ADM-PERM-01 | 待分配 | 写接口是全量替换,但缺少角色当前 `permissionIds` 回显;真实会话暂不开放保存,避免清空已有授权 | | ADM-PERM-01 | 后台 | 权限 | 菜单树、页面权限、按钮权限和接口权限模型 | P0 | 联调中 | 88% | BASE-02 | 待分配 | `GET/POST /api/platform/v1/iam/permissions` 已接入;真实模式只创建 `MENU/BUTTON`,编辑和启停接口待补 | -| ADM-PERM-02 | 后台 | 权限 | 登录后返回当前用户菜单和权限集合 | P0 | 联调中 | 80% | ADM-PERM-01 | 待分配 | 已实现 JWT 权限与 IAM 启用资源取交集、动态菜单和会话恢复;待 Gateway 恢复后复验权限变更后的 Token 刷新 | +| ADM-PERM-02 | 后台 | 权限 | 登录后返回当前用户菜单和权限集合 | P0 | 联调中 | 80% | ADM-PERM-01 | 待分配 | 已接 `/api/platform/v1/iam/authorization/permissions` 当前用户启用权限快照,并与 JWT 权限取交集;待 Gateway 恢复后复验权限变更后的 Token 刷新 | | ADM-PERM-03 | 后台 | 权限 | 未授权页面、按钮隐藏和接口拒绝访问 | P0 | 联调中 | 65% | ADM-PERM-02 | 待分配 | 前端路由、菜单和主要按钮已按稳定权限码控制;后端文档确认方法级按钮权限尚未覆盖所有管理接口 | | ADM-ORDER-01 | 后台 | 头程订单 | 订单列表、组合查询、分页和导出 | P0 | 进行中 | 70% | BASE-03 | 待分配 | 前端组合筛选、分页、选择与导出反馈已完成 | | ADM-ORDER-02 | 后台 | 头程订单 | 订单详情、货物、收发货和平台收货仓信息 | P0 | 进行中 | 75% | ADM-ORDER-01 | 待分配 | 前端详情按下单时仓库快照展示;API 与数据库持久化待接入 | @@ -99,17 +99,17 @@ | CLI-PROFILE-01 | 客户端 | 公司信息 | 企业基本信息、法人信息、联系人、手机、邮箱、微信和地址查看与维护 | P0 | 进行中 | 65% | CLI-REG-01 | 待分配 | 原型按“企业基本信息/联系信息”分页签展示;当前静态编辑交互已完成,等待接口和真实权限控制 | | CLI-PROFILE-02 | 客户端 | 公司信息 | 一期营业执照状态、查看和上传 | P1 | 联调中 | 90% | BASE-04 | 待分配 | 已接资料编辑、资质查询、营业执照上传及携带 Token 的图片预览;按后端限制为单张 JPG/PNG、最大 5MB,待稳定环境完成浏览器验收 | | CLI-MEMBER-01 | 客户端 | 企业成员 | 成员列表、新增、编辑、启停和重置密码 | P0 | 联调中 | 92% | CLI-REG-01 | 待分配 | 姓名、联系方式、memberNo 和 roleIds 已真实回显;新增、编辑、启停、重置密码均接精确 membershipId 路径,所有者保护由服务端最终校验 | -| CLI-ROLE-01 | 客户端 | 角色 | 企业角色新增、编辑、删除、启停 | P0 | 联调中 | 80% | CLI-MEMBER-01 | 待分配 | 已接角色列表和新增角色;编辑、删除、启停接口未在联调文档中提供,页面进入 API 模式后不再回退模拟写入 | +| CLI-ROLE-01 | 客户端 | 角色 | 企业角色新增、编辑、删除、启停 | P0 | 测试中 | 90% | CLI-MEMBER-01 | 待分配 | 已从后端只读源码确认并接入编辑、状态和删除真实接口;浏览器真实读取正常,当前只有内置角色,需自定义角色样本复测操作入口且暂不执行写入 | | CLI-ROLE-02 | 客户端 | 角色 | 为成员分配一个或多个角色 | P0 | 联调中 | 92% | CLI-ROLE-01 | 待分配 | 成员 roleIds 已回显,新增/编辑成员通过精确 membershipId 全量保存角色;待浏览器执行一次真实写入验收 | | CLI-MENU-01 | 客户端 | 菜单分配 | 企业管理员为本企业角色分配客户端菜单和操作权限 | P0 | 进行中 | 60% | CLI-ROLE-01 | 待分配 | 已确认操作人为企业管理员;分组选择交互已完成,动态菜单生成与平台菜单隔离需由服务端契约保证 | | CLI-PERM-01 | 客户端 | 权限 | 页面、按钮和接口权限定义及角色授权 | P0 | 联调中 | 90% | CLI-MENU-01 | 待分配 | 角色 permissionIds 与启用权限资源已映射回显;非内置启用角色可全量保存权限,待准备自定义角色完成浏览器写入验收 | | CLI-PERM-02 | 客户端 | 权限 | 按当前成员权限生成菜单并执行接口鉴权 | P0 | 进行中 | 55% | CLI-PERM-01 | 待分配 | 已完成演示账号权限集合、动态菜单、路由 403、首个可访问页面、会话恢复和按钮权限预览;服务端仍必须校验 `tenant_id` 与权限 | -| CLI-CP-01 | 客户端 | 往来单位查询 | 只读查询当前可用的发货单位和收货单位,支持关键词和类型筛选 | P0 | 联调中 | 88% | ADM-CP-03、BASE-03 | 待分配 | 已接 `/api/merchant/v1/partners/candidates`,按 SENDER/RECEIVER 查询当前租户启用候选;无维护入口且不回退演示数据 | +| CLI-CP-01 | 客户端 | 往来单位查询 | 只读查询当前可用的发货单位和收货单位,支持关键词和类型筛选 | P0 | 联调中 | 90% | ADM-CP-03、BASE-03 | 待分配 | 已接 `/api/merchant/v1/partners/candidates`;后端类型修正为 `CUSTOMER / SUPPLIER / BOTH`,一次读取启用候选并同时供订单发货方/收货方选择,无维护入口且不回退演示数据 | | CLI-WH-01 | 客户端 | 平台收货仓选择 | 查询已启用仓库,展示名称、地址和收货时间 | P0 | 测试中 | 95% | WH-BASE-01、ADM-WH-02 | 待分配 | 浏览器已读取 1 条真实启用仓库,选择后成功加载深圳地址和每日 16:00 截单时间;历史订单引用失效仓库时要求重新选择,不回退模拟仓库 | | CLI-ORDER-01 | 客户端 | 头程订单 | 新建头程订单、保存草稿和提交;提交前校验企业资料审核状态 | P0 | 联调中 | 92% | BASE-03、ADM-CUSTOMER-03 | 待分配 | 企业审核状态改为进入订单页时真实加载;创建/编辑/提交契约、幂等键和权限映射已接。为避免污染联调数据,本轮只读验收未执行保存和提交 | | CLI-ORDER-02 | 客户端 | 头程订单 | 我的订单列表和详情 | P0 | 测试中 | 95% | CLI-ORDER-01 | 待分配 | 浏览器真实读取 1 条草稿及详情,货物、双方快照和状态历史正常回显;编辑前强制加载完整详情,修复列表简要数据导致空货物和响应式复制异常 | | CLI-ORDER-03 | 客户端 | 头程订单 | 下单选择平台收货仓;提交时保存仓库 ID 和展示快照 | P0 | 测试中 | 90% | CLI-WH-01、CLI-ORDER-01 | 待分配 | 新订单真实仓库选择和详情回显已验证;当前旧草稿引用已不存在的仓库 `2001`,客户端清空失效选择并提示重新选择,服务端样本关联待修复 | -| CLI-ORDER-04 | 客户端 | 头程订单 | 从已启用往来单位选择发货方/收货方并带入联系人和地址,提交时保存快照 | P0 | 测试中 | 92% | CLI-CP-01、CLI-ORDER-01 | 待分配 | 真实候选接口和订单双方快照已接;当前新建表单候选为空,旧订单快照可完整回显并以“历史快照”标识已不在候选中的单位 | +| CLI-ORDER-04 | 客户端 | 头程订单 | 从已启用往来单位选择发货方/收货方并带入联系人和地址,提交时保存快照 | P0 | 测试中 | 94% | CLI-CP-01、CLI-ORDER-01 | 待分配 | 真实候选接口和订单双方快照已接;创建/编辑请求已用发货方 ID 填充后端必填 `customerId`。当前无启用收货仓,创建入口被禁用,候选下拉待准备仓库样本后复测 | | ADM-ORDER-05 | 后台 | 头程订单 | 维护履约快递公司、快递单号并在订单详情展示 | P1 | 进行中 | 80% | ADM-EXP-02、ADM-ORDER-02 | 待分配 | Vue 列表/详情/维护弹窗、单组限制、停用历史回显和审计记录完成;一期不接轨迹订阅,业务 API 待新架构确认 | | CLI-ORDER-05 | 客户端 | 头程订单 | 订单详情只读展示后台维护的快递公司和快递单号 | P1 | 测试中 | 75% | ADM-ORDER-05、CLI-ORDER-02 | 待分配 | 真实订单详情已验证“平台尚未维护快递信息”空态,客户侧无编辑入口;仍需后台准备含快递公司和单号的样本复测有值回显 | | TEST-01 | 公共 | 测试 | 用户、角色、权限和越权访问测试 | P0 | 进行中 | 40% | 权限模块完成 | 待分配 | 客户端已覆盖权限过滤、403、首个可访问页面、按钮权限和会话恢复;跨企业越权及接口拒绝必须待服务端测试 | @@ -228,7 +228,7 @@ | 客户端权限效果 | 通过(静态) | 按演示账号过滤导航,拒绝无权限路由并显示 403,恢复刷新后的权限身份,控制主要业务按钮和首个可访问页面 | | 往来单位与订单快照 | 通过(静态) | 仅选择启用的发货/收货单位,可调整本单联系人和地址;保存后形成独立快照,不反向修改主数据 | | 快递信息 | 通过(静态) | 订单详情只读展示平台维护的快递公司和单号,并提供未维护空态;客户侧无写入口 | -| 服务端与数据安全 | 联调中 | 认证、权限资源、企业资料、营业执照、个人资料、成员完整维护、角色权限保存、仓库详情、往来单位、头程订单及快递只读字段已接真实 API;角色编辑/启停/删除路径仍待 Gateway OpenAPI 明确,客户端不猜测接口 | +| 服务端与数据安全 | 联调中 | 认证、权限资源、企业资料、营业执照、个人资料、成员完整维护、角色完整维护、仓库详情、往来单位、头程订单及快递只读字段已接真实 API;订单 `customerId` 与 `CUSTOMER / SUPPLIER / BOTH` 契约已按后端源码和回归脚本复核 | > 客户端静态页面阶段通过不等于一期业务完成。菜单隐藏和页面只读只用于前端体验,服务端仍必须按当前用户、`tenant_id` 和权限编码执行授权校验。 @@ -310,3 +310,19 @@ - 当前订单详情的快递公司和快递单号均为空,客户端正确显示只读空态;需后端准备含快递信息的样本后复测有值场景。 - 当前订单的部分中文字段由接口直接返回 `????`,涉及仓库名称、发货方、品名、渠道名称和备注;英文、数字、货物数量重量及收货方地址正常。该问题应由后端检查初始化脚本、数据库字符集或写入编码。 - 过程中 Gateway 曾短暂返回 502/401,页面失败态、重试和会话清理行为符合预期;重新登录后恢复。最终代码门禁通过:Client 94 项自动化测试、`pnpm typecheck` 和 `pnpm build` 均成功。 + +### Client 后端只读契约核对与复测(2026-07-31) + +- 联调方式调整为前端代码可修改、`baiyue-firstleg/` 后端仓库只读。后端每次拉取后优先核对相关 Controller、DTO、Service、Repository 与回归脚本,不改后端 Java、SQL、配置或文档。 +- 后端已存在商户角色编辑、状态和删除接口,客户端已接入 `PUT /api/merchant/v1/iam/roles/{roleId}`、`PUT /api/merchant/v1/iam/roles/{roleId}/status`、`DELETE /api/merchant/v1/iam/roles/{roleId}`,不再执行本地假更新。 +- 下单服务端强制校验主往来单位 `customerId`,并用服务端往来单位名称覆盖客户端 `customerName`;客户端创建和编辑请求现以所选发货方 ID 填充 `customerId`,发货方和收货方详情仍分别保存订单快照。 +- 往来单位主数据类型为 `CUSTOMER / SUPPLIER / BOTH`,不是订单角色 `SENDER / RECEIVER`。客户端改为一次读取当前租户启用候选,并允许同一候选用于发货方或收货方。 +- 本地 Gateway 真实登录成功,角色页读取两个内置角色及权限数正常;当前无自定义角色样本,未执行角色写操作。订单页当前返回 0 个启用收货仓,“创建订单”正确禁用,因此往来单位下拉仍待仓库样本恢复后只读验收。 +- 代码门禁通过:Client 94 项自动化测试、`pnpm typecheck` 和 `pnpm build` 均成功。新增契约断言覆盖 `customerId`、往来单位后端类型/双订单角色映射,以及角色编辑、状态、删除真实调用。 + +### Admin 后端只读契约核对与角色接入(2026-07-31) + +- 从后端 `iam/RbacController.java` 与 `RbacDtos.java` 确认平台角色已提供详情、编辑、启停、删除和权限全量替换接口,前端不再受旧联调文档缺口限制。 +- Admin 角色页现同时读取角色 `permissionIds` 与权限资源,真实回显菜单和按钮授权;编辑使用 `PUT /api/platform/v1/iam/roles/{roleId}`,启停使用 `PUT /api/platform/v1/iam/roles/{roleId}/status`,删除使用 `DELETE /api/platform/v1/iam/roles/{roleId}`,授权使用 `PUT /api/platform/v1/iam/roles/permissions`。 +- 19 位角色和权限 ID 延续字符串处理,避免 JavaScript 数值精度丢失;保存、启停和删除均有重复提交防护与真实失败反馈,不回退本地成功。 +- 后端订单 Controller 仍包含订单驳回接口,与当前一期“不设置已驳回状态”的确认结论冲突,本轮明确不接入该接口;企业资料审核驳回不受此订单规则影响。 diff --git a/二期/README.md b/二期/README.md index add5de2..435e7c3 100644 --- a/二期/README.md +++ b/二期/README.md @@ -1,13 +1,13 @@ # 二期文档 -二期以头程物流“02 到仓”为作业主线,完成预约取货、送货上门、入库测量、差异核对和指定库位闭环,并增加费用规则、应收应付、对账、线下收付款核销和单票利润的轻量财务闭环。 +二期以头程物流“02 到仓”为作业主线,完成预约取货、送货上门、入库测量、差异记录和指定库位闭环,并增加头程费用项目、计费规则、费用试算和费用明细。产品已确认二期不建设应收应付、对账、收付款、核销、发票和利润模块。 ## 文档 - [二期开发规划:头程到仓](二期开发规划.md) -- [二期计费与财务模块规划](二期计费财务模块规划.md) -- [二期计费财务需求确认表](二期计费财务需求确认表.md) -- [二期计费财务需求确认表(Excel)](二期计费财务需求确认表.xlsx) +- [二期头程计费模块规划](二期计费财务模块规划.md) +- [二期头程计费需求确认表](二期计费财务需求确认表.md) +- [二期头程计费需求确认表(Excel,保留历史文件名)](二期计费财务需求确认表.xlsx) - [二期产品待确认事项(发产品填写)](二期产品待确认事项.md) - [二期开发进度表](二期开发进度表.md) - [二期开发进度表(Excel)](虫虫出海二期开发进度表.xlsx) @@ -17,4 +17,4 @@ ## 当前状态 -二期已经启动,采用“需求确认与开发并行”的推进方式。当前产品岗位空缺,由项目负责人会同业务、仓库、财务和技术形成临时需求基线;后续产品到岗后复核,不静默改写已开发规则。当前有 11 项仍需补齐,其中到仓作业 7 项、计费财务 4 项;其余事项按已有业务方向、原型和安全实现规则形成二期基线。具体任务状态和实际进度由开发负责人回填,当前文档不代表已承诺完成日期。 +二期已经启动,采用“需求确认与开发并行”的推进方式。2026-07-31 已合并产品确认结果:到仓作业结论已补齐,二期财务范围收缩为“仅头程计费”。当前只剩 P2-Q14、P2-Q15、P2-Q16 三项计费细节待确认;应收应付、对账、收付款、核销、发票、汇率结算和利润不纳入二期。具体任务状态和实际进度由开发负责人回填,当前文档不代表已承诺完成日期。 diff --git a/二期/二期产品待确认事项.md b/二期/二期产品待确认事项.md index 8e13dd7..e845fe2 100644 --- a/二期/二期产品待确认事项.md +++ b/二期/二期产品待确认事项.md @@ -1,64 +1,56 @@ # 虫虫出海二期产品待确认事项 -> 更新日期:2026-07-30 -> 适用范围:头程物流“02 到仓”及二期计费财务 -> 正式确认与状态维护以 [二期需求确认清单](二期需求确认清单.md) 的“会议确认主表”为准;本文件仅作为便于发送给产品的精简视图。 -> 填写方式:产品空缺期间由项目负责人组织会议填写“临时结论”和“状态”,不需要填写确认人和确认时间。 -> 生效规则:状态为“临时基线”且结论可直接转为业务规则时用于当前开发;产品到岗复核后改为“已确认”。状态为“暂缓”时必须写明二期临时处理方式。 +> 更新日期:2026-07-31 +> 适用范围:头程物流“02 到仓”及头程计费 +> 正式状态以 [二期需求确认清单](二期需求确认清单.md) 为准。 +> 产品只有一人,不需要填写确认人和确认时间;会议只填写最终结论和状态。 -## 一、结论摘要 +## 一、会议结论摘要 -- 需要产品补充确认:11 项。 -- 到仓作业:7 项,分别为 P2-Q1、Q4、Q5、Q6、Q8、Q10、Q11。 -- 计费财务:4 项,分别为 P2-Q13 至 P2-Q16。 -- 其余 13 项已有产品方向、原型依据或可采用安全实现基线,不再重复发给产品确认。 +- 产品已确认到仓作业规则及二期“只做头程计费”的范围。 +- 当前只需确认 P2-Q14、P2-Q15、P2-Q16,共 3 项。 +- P2-Q17 至 P2-Q24 对应应收应付、对账、收付款、核销、发票、汇率结算和利润能力,均不纳入二期。 +- 产品回传中 Q14 至 Q16 的“63”没有业务含义,本次会议需要重新填写。 -## 二、需要产品确认的 11 项 +## 二、本次会议需要确认的 3 项 -| 编号 | 已有结论/原型情况 | 会议需要补充确认 | 当前建议 | 临时结论(会议填写) | 状态 | -|---|---|---|---|---|---| -| P2-Q1 | 已提出“以实际货物入库为准”;原型没有少货关闭流程 | 谁能关闭少货到仓单;关闭条件;原因、照片或交接凭证是否必填;是否通知客户 | 收货员登记少货,仓库主管关闭;必填原因并保留凭证;关闭后通知客户 | 待填写 | 待确认 | -| P2-Q4 | 已给出“毛重÷363”和“(长×宽×高÷6000)×箱数”;原型有 cm、kg、m³ 和材积重 | `/363` 的业务含义;各输入单位;计费重是否取毛重与材积重较大值;精度和舍入 | 长 cm、重量 kg、体积 m³;保留原始值和公式版本;最终结果统一四舍五入 | 待填写 | 待确认 | -| P2-Q5 | 已确认差异需要客户确认;原型没有拒绝和超时规则 | 是否所有差异都确认;客户拒绝或超时怎么办;确认前是否暂停上架和计费 | 数量、重量、体积、破损及归属差异均需确认;确认前暂停后续作业,拒绝后转人工处理 | 待填写 | 待确认 | -| P2-Q6 | 已确认没有独立隔离区 | 差异期间货物放置方式;谁能解除业务暂停;解除条件 | 保持当前物理位置并标记业务暂停;客户确认且仓库主管复核后解除 | 待填写 | 待确认 | -| P2-Q8 | 已确认上传称重照片和测量照片;原型没有附件规则 | 是否必传;按箱件还是按收货批次上传;数量、大小、格式和补传规则 | 每个收货批次必传称重、测量照片;支持补传但保留首次提交和补传记录 | 待填写 | 待确认 | -| P2-Q10 | 已暂缓无预报货物认领;原型没有临时处理方式 | 暂缓期间是拒收,还是允许线下登记后待认领;若允许,谁能绑定订单 | 二期系统拒绝将无预报货物直接绑定企业订单;线下处置,不进入正式库存和计费 | 待填写 | 待确认 | -| P2-Q11 | 已确认保存 12 个月;原型没有保留策略 | 从哪个时间点起算;到期删除还是归档;联系方式、照片、凭证和审计是否同期限 | 从业务单关闭日起算;联系方式匿名化,照片和凭证到期删除,审计记录按合规要求归档 | 待填写 | 待确认 | -| P2-Q13 | 原型覆盖费用、应收应付、账单、收付款和利润,但不能证明二期全部纳入 | 二期财务闭环终点 | 做到费用、应收应付、对账、线下收付款登记与核销、单票利润;不做在线支付、会计凭证和总账 | 待填写 | 待确认 | -| P2-Q14 | 原型费用项目较多,混合头程、仓储和其他阶段 | “02 到仓”首批费用项目白名单,以及每项应收/应付方向、单位、币种和税率 | 只纳入到仓实际使用项目;白名单外费用允许人工新增但必须审核 | 待填写 | 待确认 | -| P2-Q15 | 原型有费用分类和应收/应付,没有明确阶梯价、最低收费和规则优先级 | 二期需要的计费维度;是否支持阶梯价、最低收费、封顶、组合价和冲突优先级 | 至少支持客户、往来单位、仓库、服务类型和生效区间;复杂价格结构按实际需要裁剪 | 待填写 | 待确认 | -| P2-Q16 | 原型有费用日期和审核状态,没有明确到仓事件的自动计费节点 | 各类费用在哪个节点试算、生成、生效和锁定;人工费用何时生效 | 实测完成生成试算,差异确认后生效并锁定;非测量费用按已确认业务事件生成 | 待填写 | 待确认 | +| 编号 | 本次需要确定 | 当前建议 | 最终结论(会议填写) | 状态 | +|---|---|---|---|---| +| P2-Q14 | “02 到仓”首批头程费用项目、计费单位、币种、税率/税务属性和触发节点 | 只纳入实际使用的头程费用;白名单外人工补录必须填写原因并留痕 | 待填写 | 待确认 | +| P2-Q15 | 计费维度;是否支持阶梯价、最低收费、封顶、组合价和冲突优先级 | 先支持客户、往来单位、仓库、服务类型和生效区间;复杂结构按实际业务裁剪 | 待填写 | 待确认 | +| P2-Q16 | 实测、上架及人工费用在哪个节点试算、生成、确认、调整和作废 | 实测完成生成试算;其他费用按已确认头程事件生成;来源键保证幂等 | 待填写 | 待确认 | ## 三、P2-Q14 首批费用项目填写模板 -产品确认 P2-Q14 时,至少补齐以下字段;没有实际业务的费用不要为了匹配原型而纳入二期。 +没有实际业务的费用不要为了匹配原型而纳入二期。 -| 费用编码 | 费用名称 | 业务阶段 | 应收/应付 | 往来对象 | 计费单位 | 默认币种 | 默认税率 | 自动/人工 | 触发节点 | -|---|---|---|---|---|---|---|---|---|---| -| 待填写 | 待填写 | 02 到仓 | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 | +| 费用编码 | 费用名称 | 费用性质 | 计费对象 | 计费单位 | 默认币种 | 默认税率 | 自动/人工 | 触发节点 | +|---|---|---|---|---|---|---|---|---| +| 待填写 | 待填写 | 待填写 | 待填写 | 待填写 | CNY | 待填写 | 待填写 | 待填写 | -## 四、无需再次发产品确认的 13 项 +## 四、已确认,无需再次询问 -| 编号 | 二期采用的结论 | 依据 | +| 编号 | 产品结论 | 二期开发口径 | |---|---|---| -| P2-Q2 | 二期不做系统服务商调度;取货安排在线下完成,系统只记录结果和人工费用 | 产品回传结论已明确系统边界 | -| P2-Q3 | 预约在线下完成;系统记录预约日期时间、改期/取消结果及操作日志 | 产品回传方向和原型时间字段足以形成最小基线 | -| P2-Q7 | 二期不做库位容量校验;库位停用和状态合法性仍做基础校验 | 产品已明确当前没有库位容量 | -| P2-Q9 | 二期暂不接 PDA,使用后台或响应式作业页 | 产品已暂缓,且 PDA 原型属于“03 出仓” | -| P2-Q12 | 标签打印机为佳博 1324D 热敏标签打印机 | 产品已确认;纸张、连接、驱动和指令协议属于开发前实机核验 | -| P2-Q17 | 本位币 CNY;保存原币、人工业务汇率和折算金额,费用生效时锁定汇率快照 | 原型已有币种、汇率及人民币:美元汇率字段 | -| P2-Q18 | 保存未税金额、税率、税额和含税总额;金额/税额 2 位、汇率 6 位,服务端统一舍入 | 原型已有 0%/6%/9%/13% 税率及税额、含税合计 | -| P2-Q19 | 经办提交、财务审核;生效费用只能调整、红冲或作废并留痕 | 原型已有新增、客服提交和财务通过等状态;审计要求禁止直接覆盖 | -| P2-Q20 | 支持按选择和按截止时间生成账单,保存结算期间、账期和到期日 | 原型已有两种账单生成方式和结算字段 | -| P2-Q21 | 账单审核、确认、拒绝、锁定;争议调整后生成新版本 | 原型已有待审核、审核通过、审核拒绝、待确认、明细和支付历史 | -| P2-Q22 | 支持线下收付款、部分收付、余额、核销和反核销;不做预收预付、跨币种核销及银行自动认领 | 原型已有部分收款、已结清、余额、支付历史和核销入口 | -| P2-Q23 | 二期只登记发票信息和状态,不接电子税局或第三方开票平台 | 原型只有发票登记字段,没有外部开票接口 | -| P2-Q24 | 利润=已生效应收-已生效应付,利润率=利润÷收入;仅财务授权角色可见 | 原型已有收入、成本、利润、利润率和多维报表 | +| P2-Q1 | 以实际货物重量、体积为准 | 实测结果作为后续作业和头程计费输入 | +| P2-Q2 | 不做系统服务商调度 | 线下安排取货,系统记录结果 | +| P2-Q3 | 预约在线下完成 | 系统记录预约时间、改期/取消结果和操作日志 | +| P2-Q4 | 小数点三位向上取整 | 保存原始值和规则版本,业务结果按三位向上取整 | +| P2-Q5 | 差异同步客户,无需确认,只做记录 | 不提供客户确认动作,不阻塞上架或计费 | +| P2-Q6 | 不考虑隔离区 | 不建设隔离区和释放流程 | +| P2-Q7 | 不做库位容量校验 | 只校验库位状态、仓库归属和权限 | +| P2-Q8 | 称重、测量照片必传,大小不限制 | 产品不设业务上限;系统保留类型校验和可配置技术安全上限 | +| P2-Q10 | 不考虑无预报货物 | 不建设无预报认领和正式订单绑定流程 | +| P2-Q11 | 永久保存 | 业务记录不自动删除;运维补充备份和合规策略 | +| P2-Q12 | 使用佳博 1324D 热敏标签打印机 | 开发前核验纸张、连接、驱动和指令协议 | +| P2-Q13 | 二期只做头程计费 | 不生成应收、应付、账单、付款、核销、发票或利润数据 | + +P2-Q9 暂缓:二期不接 PDA,使用后台或响应式作业页。 ## 五、确认后的处理 -1. 产品空缺期间由项目负责人组织填写 11 项的“临时结论”和“状态”。 -2. 产品确认后保留原始回传副本,不覆盖本文件或既有回传文件。 -3. 技术审核结论是否足以转成状态、权限、计算、异常和验收规则。 -4. 审核通过后同步更新二期开发规划、需求确认清单、开发进度表及 Excel 版本。 -5. P2-Q13 至 P2-Q16 未形成临时基线前,计费财务只开发可逆的基础结构,不锁定闭环范围、复杂价格和自动计费节点。 +1. 将 Q14 至 Q16 的最终结论和状态回写正式需求确认清单。 +2. 技术审核结论是否足以转为字段、状态、计算、权限、异常和验收规则。 +3. 同步更新二期开发规划、头程计费规划、开发进度表和 Excel。 +4. 保留产品原始回传和本次会议版本;后续修改用新版本,不覆盖历史文件。 + diff --git a/二期/二期开发规划.md b/二期/二期开发规划.md index ccf5638..8359b78 100644 --- a/二期/二期开发规划.md +++ b/二期/二期开发规划.md @@ -1,416 +1,291 @@ -# 虫虫出海二期开发规划:头程到仓与计费财务 +# 虫虫出海二期开发规划:头程到仓与头程计费 > 创建日期:2026-07-28 -> 状态:开发已启动,需求确认并行 +> 更新日期:2026-07-31 +> 状态:开发已启动,3 项计费细节确认中 > 流程依据:[头程物流流程图](参考资料/头程物流流程图.svg)中的头程物流“02 到仓” +> 产品确认:[2026-07-31 产品确认合并记录](产品回传/2026-07-31-产品确认合并记录.md) > 前置阶段:[一期文档](../一期/README.md) ## 一、二期目标 -二期承接一期“客户下单并选择平台收货仓”的结果,完成货物从待到仓到入仓、测量、差异确认和指定库位的作业闭环,并在实测数据之上完成费用生成、应收应付、对账、线下收付款核销和单票利润的最小财务闭环。 - -流程严格对应五个动作: +二期承接一期“客户下单并选择平台收货仓”的结果,完成货物从待到仓、实际收货、测量、差异记录到指定库位的作业闭环,并在实测数据之上完成头程费用计算。 ```text -预约取货 / 送货上门 +线下预约 / 送货预报 ↓ 货物到达平台收货仓 ↓ -入库测量(件数、重量、体积和计费数据) +实际收货、称重、测量和拍照 ↓ -申报与实测差异核对 +申报与实测差异记录并通知客户 ↓ 仓库作业(指定库位) ↓ -计费、应收应付、对账与核销 +头程费用试算与费用明细确认 ``` -二期完成标准不是“增加到仓状态”,而是每票货能够回答:怎么到仓、何时到仓、谁接收、实际收到什么、与订单差多少、差异如何处理、最终放在哪个库位、产生了哪些收入与成本、是否完成对账和收付款核销。 - -### 当前启动策略 - -- 二期已经开工,产品岗位暂时空缺;现阶段由项目负责人组织业务、仓库、财务和技术形成临时需求基线。 -- 可先行开发稳定且可逆的能力:公共数据结构、权限与审计骨架、列表和详情、原始测量与附件、标签适配层、费用及账单基础数据结构。 -- 依赖 P2-Q1、Q4、Q5、Q6、Q8、Q10、Q11、Q13 至 Q16 的自动流转、计算参数和最终锁定规则,在结论明确前必须配置化或保持可替换,不写死高成本业务假设。 -- 后续产品到岗后复核临时基线。已进入开发的规则发生变化时,必须记录影响范围、数据迁移和验收调整,不直接覆盖历史版本。 +二期不建设应收应付、对账、收付款、核销、发票、利润或总账。完成标准是每票货能够回答:何时到仓、实际收到什么、实测结果是什么、与申报差多少、差异是否已通知、最终放在哪个库位,以及产生了哪些头程费用和计算依据。 ## 二、阶段边界 ### 纳入二期 -- 客户预约取货和送货上门两种到仓方式。 -- 平台收货仓到仓预报、预约安排、到仓签到和收货登记。 -- 实收件数、重量、体积、尺寸、外包装和现场照片记录。 -- 申报数据与实测数据对比、差异单、确认和调整留痕。 -- 最小库位档案、上架任务、指定库位和上架完成记录。 -- 箱件/托盘处理单元、标签和当前库位位置记录,为后续出仓提供可追踪输入。 -- 客户端查看预约、到仓、实测、差异和上架结果。 -- 管理后台进行预约调度、仓库收货、差异处理和库位分配。 -- 费用项目、计费规则版本、费用试算与生效、应收应付和调整审计。 -- 客户/供应商对账单、线下收付款登记、部分核销、反核销和余额查询。 -- 发票状态登记、客户账单中心和单票利润查询。 -- 服务端完成权限、状态、幂等、并发、审计和历史快照。 +- 客户取货或送货预报,以及线下预约结果、改期和取消记录。 +- 平台收货仓到仓签到、分批收货、处理单元标签和收货冲正。 +- 实收件数、重量、体积、尺寸、外包装、称重照片和测量照片。 +- 申报数据与实测数据对比、差异记录、客户通知和审计。 +- 最小库位档案、上架任务、指定库位和位置历史。 +- 头程费用项目、计费规则版本、费用试算、人工费用、调整、确认和费用明细。 +- 服务端权限、租户隔离、状态、幂等、并发、文件鉴权、审计和历史快照。 ### 明确不纳入二期 -- 流程图头程“03 出仓”:智能排柜、订舱、预约拖车、PDA 拣货、装柜、报关和港务信息。 -- 完整 WMS:可用库存、库存成本、常规移库、盘点、冻结、拣货、复核和出库。二期只保留支撑指定库位所需的处理单元和位置记录。 -- 正式 PDA 硬件扫描头或厂商 SDK 接入;二期仓库作业先由管理后台或响应式作业页完成。 -- 对客询价、报价审批、报价转订单和合约报价体系。 -- 在线支付、银企直连、银行流水自动认领、电子税局开票、会计凭证和总账报表;二期财务边界见 [二期计费与财务模块规划](二期计费财务模块规划.md)。 -- 快递轨迹、地图调度、车队 GPS 和外部承运商接口自动同步。 -- FBA/海外目的仓及尾程到港、到仓、出仓、签收流程。 +- 应收应付台账、客户/供应商对账、账单确认和争议。 +- 收款、付款、退款、核销、反核销、银行流水和在线支付。 +- 发票登记、开票接口、汇率结算、利润和财务报表。 +- 会计科目、会计凭证和总账。 +- 流程图头程“03 出仓”:智能排柜、订舱、拖车、PDA 拣货、装柜、报关和港务信息。 +- 完整 WMS:可用库存、库存成本、常规移库、盘点、冻结、拣货、复核和出库。 +- PDA 硬件或厂商 SDK;二期使用后台或响应式作业页。 +- 独立隔离区、差异等待客户确认、无预报货物认领和待认领区。 +- 时间窗容量调度、自动服务商分配、地图、GPS 和外部承运商接口。 +- FBA/海外目的仓及尾程到港、到仓、出仓和签收流程。 -## 三、参与角色与数据边界 +## 三、已确认业务规则 + +| 编号 | 产品结论 | 开发规则 | +|---|---|---| +| P2-Q1 | 以实际货物重量、体积为准 | 实测结果作为后续作业和头程计费输入,申报值只用于对比 | +| P2-Q2 | 不做系统服务商调度 | 取货安排在线下完成,系统只记录结果 | +| P2-Q3 | 预约在线下完成 | 记录预约日期时间、改期/取消结果和操作日志,不建设容量调度 | +| P2-Q4 | 小数点三位向上取整 | 保存原始值和公式版本,业务结果按三位向上取整 | +| P2-Q5 | 差异同步客户,无需确认,只做记录 | 差异不阻塞上架或计费;记录通知结果和审计 | +| P2-Q6 | 不考虑隔离区 | 不建设隔离库位、隔离上架和释放流程 | +| P2-Q7 | 不做库位容量校验 | 仅校验库位启停、仓库归属和权限合法性 | +| P2-Q8 | 称重、测量照片必传,大小不限制 | 产品不设业务大小上限;系统保留文件类型校验和可配置技术安全上限 | +| P2-Q9 | PDA 暂缓 | 二期使用后台或响应式作业页 | +| P2-Q10 | 不考虑无预报货物 | 不建设无预报认领和正式订单绑定流程 | +| P2-Q11 | 永久保存 | 业务记录不自动删除;访问审计、备份和合规策略由运维补充 | +| P2-Q12 | 佳博 1324D 热敏标签打印机 | 开发前实机核验纸张、连接、驱动和指令协议 | +| P2-Q13 | 二期只做头程计费 | 费用结果不自动形成应收、应付、账单或收付款数据 | + +## 四、角色与数据边界 | 角色 | 数据范围 | 主要操作 | |---|---|---| -| 企业订单操作员 | 当前企业订单、到仓单和对客账单 | 提交预约、查看到仓结果、确认差异和查看账单 | -| 企业管理员 | 当前企业全部订单、到仓单和对客账单 | 查看、确认差异、确认/争议账单、管理企业联系人 | -| 平台客服/运营 | 授权客户和订单范围 | 审核预约、协调取货、处理异常、差异和对账争议 | +| 企业订单操作员 | 当前企业订单和到仓单 | 提交预报、查看到仓、实测、差异通知和公开费用 | +| 企业管理员 | 当前企业全部订单和到仓单 | 查看到仓、实测、差异、上架和公开费用 | +| 平台客服/运营 | 授权客户和订单范围 | 维护预约结果、处理异常、通知差异和查看头程费用 | | 仓库收货员 | 被授权的平台收货仓 | 到仓签到、收货、测量、拍照和异常登记 | -| 仓库上架员 | 被授权的平台收货仓和库位 | 领取上架任务、指定库位、确认完成 | -| 计费专员 | 授权客户、仓库和业务范围 | 费用试算、人工加费、调整申请和对账准备 | -| 财务审核员 | 平台财务授权范围 | 费用审核、对账审核、收付款与核销审核 | -| 财务管理员 | 平台财务授权范围 | 费用项目、计费规则、汇率、结算参数和利润查询 | +| 仓库上架员 | 被授权的仓库和库位 | 领取上架任务、指定库位和确认完成 | +| 计费专员 | 授权客户、仓库和业务范围 | 费用试算、人工补录和发起调整 | +| 计费审核员 | 授权计费范围 | 确认费用、审核调整和作废 | +| 计费管理员 | 平台计费范围 | 维护费用项目、计费规则版本和权限 | | 平台管理员 | 平台授权范围 | 维护仓库、库位、快递公司、往来单位和权限 | -服务端必须依据登录身份确定企业、平台数据范围和仓库权限。订单 ID、企业 ID、仓库 ID 或操作员 ID 均不能由前端参数单独决定授权。 +服务端根据登录身份确定企业、平台和仓库数据范围;前端传入的订单 ID、企业 ID、仓库 ID 或操作员 ID 不能单独决定授权。 -## 四、业务模块 +## 五、业务模块 -### 1. 到仓单与到仓预报 +### 1. 到仓预报与预约结果 -- 规划基线采用“订单 1:N 到仓单、到仓单 1:N 收货批次、收货批次 1:N 处理单元”。一张订单可以分次取货或送货,每次独立预约形成到仓单;同一次预约允许分批实际到仓。 -- 到仓单记录所属订单、平台收货仓、到仓方式、预计时间、联系人、货物摘要和备注。 -- 生成客户可见的到仓单号和仓库收货识别码。 -- 客户、平台代客创建和系统补录必须记录来源及操作者。 -- 重复提交使用幂等键,避免网络重试产生重复预约。 -- 到仓单保存计划件数/箱数、累计实收、剩余数量和是否允许继续到仓。未全部到仓时显示“部分收货”,由后续批次补齐或由授权人员填写原因后人工关闭。 -- 到仓单分配到具体订单货物明细及计划数量;同一货物明细在所有有效到仓单中的累计计划量不得超过订单可到仓量,取消或关闭后按规则释放未使用分配量。 -- 已人工关闭的少货到仓单不得继续登记新批次;需要补货时创建新的到仓单并关联原单。 +- 订单与到仓单采用 1:N;同一订单可以分次到仓。 +- 预约在线下完成,系统记录到仓方式、预约时间、联系人、平台收货仓、改期、取消和备注。 +- 不建设时间窗容量、服务商自动分配和外部调度接口。 -### 2. 预约取货 +### 2. 到仓签到与分批收货 -- 客户选择取货地址、联系人、联系电话和期望取货时间窗。 -- 带入往来单位联系人与地址,允许本次预约调整但不反向覆盖档案。 -- 平台审核预约,分配快递公司或服务商、司机/联系人和预约时间。 -- 支持待审核、已安排、已取货、运输中、已到仓、已取消和异常结果。 -- 取货调度结果使用独立子状态维护;到仓单主状态只表达货物整体到仓进度,二者通过业务动作联动但不能相互覆盖。 -- 一期快递公司和往来单位作为调度基础资料;外部轨迹和自动派单不进入二期。 -- 仓库维护营业时间、停收日期、时间窗容量和人工超额确认权限;预约变更、爽约和重复时间窗冲突必须留痕。 +- 到仓单与收货批次采用 1:N;每批记录实际到仓时间、交接人、收货员、实收数量和凭证。 +- 以实际货物数量、重量和体积为后续作业依据。 +- 系统不接收无预报货物的正式订单绑定,不建设待认领流程。 +- 错绑订单或企业通过主管冲正处理,原记录不可删除。 -### 3. 送货上门 +### 3. 处理单元和标签 -- 客户选择送达仓库、预计送达时间和送货联系人。 -- 可记录快递公司、快递单号或自送车辆信息。 -- 仓库按到仓单号、订单号、快递单号或收货识别码检索预报。 -- 无预报货物允许登记为“待认领”,但不得直接归入其他企业订单。 -- 取消、过期、改仓和重复到仓必须保留处理记录。 -- 到仓前改仓需取消原到仓单并新建目标仓到仓单,不直接改写已确认的仓库快照。 +- 收货批次拆分为箱件或托盘处理单元,生成稳定内部编码。 +- 支持打印、失败重试、补打、换标和作废;同一有效标签不能绑定多个处理单元。 +- 使用佳博 1324D 实机完成标签适配验证。 -### 4. 到仓签到与收货 +### 4. 测量和照片 -- 记录实际到仓时间、到仓方式、交接人、收货员和交接凭证。 -- 登记实际包裹/箱数、包装状态、唛头、破损、受潮、缺失和多货等异常。 -- 上传现场照片,照片关联到仓单和收货批次并受权限控制。 -- 支持一票分批到仓;每个收货批次有独立时间、实收和异常记录。 -- 到仓签到与实收提交均需幂等,防止重复扫码或重复点击。 -- 每个实际箱件或托盘生成稳定处理单元编码,可打印和补打标签;补打、换标、作废和重复码处理必须保留操作者及原因。 -- 二期箱件/托盘标签打印设备确定为佳博 1324D 热敏标签打印机。标签纸尺寸、连接方式、驱动和打印指令协议须在开发前通过实机核验,不依据型号名称直接假定。 -- 托盘处理单元可以组合多个箱件,保存父子关系和各箱件对应的订单货物明细;拆托或重新组托必须生成新的组合版本。 -- 错绑企业、订单或到仓单时不得删除收货记录。由有权限的主管发起冲正,保留原绑定、冲正原因、审批人和重新认领结果。 +- 保存原始长度、宽度、高度、重量、体积、材积重和计费重,以及单位和公式版本。 +- 原始值不可覆盖;复测生成新版本并记录原因和操作者。 +- 业务结果按小数点三位向上取整,同时保留未舍入原始值。 +- 称重照片和测量照片必传;服务端执行格式、恶意内容、访问权限和可配置技术大小上限校验。 -### 5. 入库测量 +### 5. 差异记录与通知 -- 按收货批次或箱件记录实测数量、毛重、体积和尺寸。 -- 服务端汇总订单实收件数、总重量和总体积,不接受客户端独立提交冲突合计。 -- 保留测量设备/方式、操作员、时间和修订版本;修改实测数据必须填写原因。 -- 测量规则使用独立版本,明确长度、重量和体积单位、体积重系数、精度及舍入方式。每条实测记录保存原始值、换算值、规则版本和复核结果,确保历史计费数据可复算。 -- 二期输出体积重、计费重等结果,并作为费用试算输入;测量或计费规则版本发布后不反向改写已确认测量记录和已生效费用。 -- 覆盖测量中、待复核、已完成和测量异常状态。 +- 自动对比申报与实测的数量、重量、体积、尺寸和包装信息。 +- 差异只记录并通知客户,不需要客户确认,不暂停上架和计费。 +- 保存差异类型、申报值、实测值、通知状态、通知时间和审计记录。 -### 6. 调整差异核对 +### 6. 库位与上架 -- 自动对比订单申报与仓库实测,形成数量、重量、体积、包装和货物归属差异。 -- 差异支持待处理、待客户确认、客户已确认、平台调整完成和已关闭。 -- 小于阈值的差异是否自动接受必须由产品配置,不在代码中写死。 -- 客户确认后冻结本次实测版本;再次调整需创建新版本并记录原因。 -- 差异未关闭时默认进入业务暂停。货物可以临时上架到隔离区,但不能标记正式上架完成,也不能进入后续出仓。 -- 隔离区库位具有明确类型和暂停原因;差异关闭后执行释放并生成从隔离区到正式库位的位置变更记录。 -- 客户对差异有异议时记录争议说明、证据、责任人和处理期限;超时策略必须配置,不能静默自动确认。 +- 维护仓库、库区、库位编码、名称、状态和权限范围。 +- 二期不做承重、箱数或体积容量校验,也不建设隔离区和待认领区。 +- 上架任务关联收货批次、目标库位、执行人、状态和完成时间。 +- 上架完成后写入处理单元当前位置和历史位置,为后续出仓提供输入。 -### 7. 指定库位与上架 +### 7. 头程计费 -- 维护最小库位档案:仓库、库区、库位编码、名称、类型、状态、容量约束和备注。库位类型至少区分正式库位、隔离区和待认领区。 -- 创建上架任务,关联到仓单、收货批次、目标库位、执行人和优先级。 -- 支持待分配、待上架、上架中、已完成、已取消和异常状态。 -- 同一收货批次允许拆分到多个库位;每条分配记录保留数量或箱件范围。 -- 上架完成时写入处理单元的当前库位位置,并保留进入、移出和历史位置。位置记录是三期拣货的输入,不等同于建设完整可用库存或库存成本台账。 -- 目标库位停用、容量不足或不允许该货物类型时,服务端拒绝上架并要求重新分配。 +- 维护头程费用项目、计费单位、币种、税务属性、业务阶段和启停状态。 +- 计费规则按已确认维度和生效区间版本化,历史费用保存规则和计算快照。 +- 头程订单、到仓实测或已确认业务事件触发费用试算,重复事件不得重复计费。 +- 支持自动费用、人工补录、调整、确认、作废、查询和导出。 +- 已确认费用不直接覆盖,变更通过调整记录留痕。 +- 详细规则见 [二期头程计费模块规划](二期计费财务模块规划.md)。 -### 8. 客户可视与通知 - -- 客户端订单详情增加到仓时间线:预约、取货/送货、到仓、实测、差异、上架。 -- 客户只能查看本企业数据、公开照片和对客异常说明。 -- 差异待确认、预约变更和到仓异常提供站内提醒。 -- 短信、邮件或微信通知仅在渠道和合规方案确认后接入。 -- 司机电话、客户联系人、照片和交接凭证按角色脱敏和授权下载,并明确保留期限、导出审计和到期清理策略。 - -### 9. 计费规则与费用台账 - -- 建立费用项目、应收/应付方向、计费单位、币种、税务属性和启停状态。 -- 计费规则按客户、供应商/往来单位、仓库、服务类型和有效期版本化;历史费用保存输入、规则版本和计算快照。 -- 实测确认、差异关闭或其他已确认业务节点触发费用草稿,重复事件不得重复计费。 -- 生效费用不直接覆盖,改费、红冲、作废通过独立调整记录和审核链处理。 - -### 10. 应收应付与对账 - -- 应收关联客户,应付关联快递公司、仓库服务商或其他往来单位。 -- 支持按票或按周期生成客户/供应商对账单,并维护审核、确认、争议、关闭和作废状态。 -- 客户端提供账单列表、明细、确认和异议入口,不返回供应商成本、利润和内部备注。 - -### 11. 收付款、发票与利润 - -- 登记线下收款、付款、退款和调整,支持部分核销、多对多核销、反核销和凭证审计。 -- 二期只登记发票申请、号码、金额、税率、日期、状态和附件,不连接外部开票平台。 -- 单票利润按已生效应收减已生效应付计算;多币种使用锁定汇率折算,仅财务授权角色可见。 -- 详细范围、任务和验收规则见 [二期计费与财务模块规划](二期计费财务模块规划.md)。 - -## 五、建议状态模型 - -不要把所有过程混成一个订单状态,建议使用到仓进度、差异、上架任务和异常处理四个相互关联的状态域。异常只暂停业务,不覆盖货物当前进度阶段。 +## 六、状态模型 ### 到仓单状态 -| 稳定编码 | 中文名称 | 含义 | -|---|---|---| -| `PENDING_ARRANGEMENT` | 待安排 | 到仓预报已创建,尚未完成取货或送货安排 | -| `SCHEDULED` | 已预约 | 取货或送货时间已确认 | -| `IN_TRANSIT_TO_WAREHOUSE` | 运往仓库 | 已取货或客户已发出 | -| `ARRIVED` | 已到仓 | 已完成到仓签到,等待收货测量 | -| `PARTIALLY_RECEIVED` | 部分收货 | 已确认至少一个收货批次,仍有计划货物待到仓或待人工关闭 | -| `MEASURING` | 测量中 | 正在登记和复核实收数据 | -| `RECEIVED` | 已收货 | 实收版本已确认 | -| `PUTAWAY_PENDING` | 待上架 | 实收已确认,等待正式库位分配或差异解除 | -| `PUTAWAY_COMPLETED` | 已上架 | 指定库位作业完成,二期流程结束 | -| `CANCELLED` | 已取消 | 到仓前按规则取消 | - -主状态根据到仓单及其收货批次汇总。部分收货不能仅凭前端设置;服务端根据计划数量、累计实收和人工关闭标记计算可用动作。少货人工关闭只结束剩余到仓等待,不等于差异已确认;已有实收仍须完成测量、差异处理和正式上架后才能进入 `PUTAWAY_COMPLETED`。 - -### 取货调度子状态 - -`PENDING_REVIEW`、`SCHEDULED`、`PICKED_UP`、`IN_TRANSIT`、`ARRIVED`、`CANCELLED`。调度异常由异常单表达,不增加会覆盖正常进度的 `EXCEPTION` 状态。 - -送货上门不创建取货调度记录;到仓单从预约确认或发货动作推进主状态。取货车辆到达仓库后只能发起签到,必须由有收货权限的人员确认签到成功,才能把到仓单推进为 `ARRIVED`;签到、收货和后续处理仍以到仓单及收货批次为准。 +| 状态 | 含义 | +|---|---| +| `CREATED` | 已创建,等待线下预约结果 | +| `SCHEDULED` | 已记录预约结果 | +| `PARTIALLY_RECEIVED` | 已有收货批次,仍有计划货物待到仓 | +| `RECEIVED` | 实际收货完成 | +| `PUTAWAY_PENDING` | 等待指定库位 | +| `PUTAWAY_COMPLETED` | 指定库位完成 | +| `CANCELLED` | 到仓前取消 | ### 差异状态 -`NONE`、`PENDING_REVIEW`、`PENDING_CUSTOMER_CONFIRMATION`、`DISPUTED`、`CONFIRMED`、`ADJUSTED`、`CLOSED`。 +| 状态 | 含义 | +|---|---| +| `DETECTED` | 已检测到差异 | +| `NOTIFIED` | 已通知客户 | +| `CLOSED` | 差异记录已归档 | -### 上架任务状态 +差异状态不阻塞到仓主状态、上架或头程计费。 -`PENDING_ASSIGNMENT`、`PENDING_PUTAWAY`、`IN_PROGRESS`、`COMPLETED`、`CANCELLED`。异常和暂停由独立异常单及 `businessHold` 表达。 +### 头程费用状态 -### 异常与业务暂停 +| 状态 | 含义 | +|---|---| +| `DRAFT` | 草稿或人工补录中 | +| `CALCULATED` | 已试算 | +| `CONFIRMED` | 已确认,禁止直接覆盖 | +| `VOIDED` | 已作废,保留历史和原因 | -异常单状态使用 `OPEN`、`PROCESSING`、`WAITING_CUSTOMER`、`RESOLVED`、`CLOSED`。异常单记录发生阶段、类型、责任人、处理期限、证据、解决结果和恢复动作。 - -到仓单、收货批次或处理单元可设置 `businessHold`、暂停原因和解除条件。异常解决后恢复原进度阶段,不通过把主状态从 `EXCEPTION` 猜回原状态。 - -订单主状态只保留对全链路有意义的粗粒度节点,到仓、差异、上架和异常细节由对应业务对象维护。 - -## 六、核心数据对象 +## 七、核心数据对象 | 数据对象 | 关键内容 | |---|---| -| 到仓单 | 订单、企业、仓库、方式、预计时间、联系人、状态、来源和版本 | -| 到仓计划分配 | 到仓单、订单货物明细、计划数量、累计实收、剩余数量、释放数量和人工关闭信息 | -| 取货预约 | 取货地址快照、时间窗、服务商、司机/联系人和调度状态 | -| 预约容量 | 仓库、营业时间、停收日期、时间窗、容量、已占用量和超额授权 | -| 收货批次 | 实际到仓时间、交接人、收货员、实收摘要和现场凭证 | -| 处理单元 | 稳定箱件/托盘编码、标签状态、所属批次、订单货物明细、数量、父子组合和当前业务暂停状态 | -| 组托版本 | 托盘、成员箱件、组合版本、生效/失效时间、操作人和拆托/重组原因 | -| 标签记录 | 处理单元、标签编码、设备型号、打印结果、生成、打印、补打、换标、作废及原因 | -| 测量规则版本 | 单位、体积重系数、精度、舍入方式、生效时间和版本状态 | -| 测量明细 | 处理单元、原始尺寸/重量、换算值、体积、体积重、计费重、规则版本、设备、操作员和复核版本 | -| 差异单 | 申报值、实测值、差异类型、阈值、责任人、确认和调整记录 | -| 异常单 | 发生阶段、类型、暂停范围、责任人、期限、证据、解决和恢复记录 | -| 库位 | 仓库、库区、稳定编码、名称、类型、容量约束、状态和数据范围 | -| 上架任务 | 收货批次、目标库位、数量/箱件范围、执行人、状态和完成时间 | -| 位置记录 | 处理单元、库位、数量/箱件范围、进入时间、移出时间和当前标记 | -| 冲正记录 | 原企业/订单/到仓单绑定、冲正原因、审批人、新绑定和完成时间 | -| 到仓时间线 | 事件、前后状态、操作者、发生时间、说明和请求关联 ID | -| 费用项目/计费规则 | 应收应付方向、单位、币种、税务属性、适用维度、计费方式、生效区间和规则版本 | -| 费用记录/调整 | 业务来源、往来方、计费输入、规则快照、原币金额、汇率、税额、状态和调整链 | -| 对账单/明细 | 对账对象、周期、费用、调整、已核销、余额、到期日、状态、版本和争议 | -| 收付款/核销 | 往来方、收付类型、金额、币种、流水、凭证、核销金额、反核销和审核记录 | -| 发票/汇率版本 | 发票方向、号码、金额、税率、日期、状态、附件,以及汇率日期、来源和锁定状态 | +| 到仓单 | 订单、仓库、到仓方式、预约结果、联系人、计划摘要和状态 | +| 收货批次 | 实际到仓时间、交接人、收货员、实收摘要和凭证 | +| 处理单元 | 箱件/托盘编码、标签状态、所属批次、数量和当前位置 | +| 标签记录 | 处理单元、标签编码、设备、打印结果、补打、换标、作废和原因 | +| 测量规则版本 | 单位、公式、三位向上取整、生效时间和版本状态 | +| 测量明细 | 原始尺寸/重量、换算值、舍入结果、规则版本、照片和复测版本 | +| 差异记录 | 申报值、实测值、差异类型、通知状态、通知时间和审计信息 | +| 库位 | 仓库、库区、编码、名称、状态和权限范围 | +| 上架任务/位置记录 | 收货批次、目标库位、执行人、状态、当前和历史位置 | +| 费用项目 | 编码、名称、费用性质、单位、币种、税务属性、业务阶段和状态 | +| 计费规则版本 | 适用维度、价格参数、生效区间、版本和发布状态 | +| 头程费用明细 | 业务来源、来源键、计费输入、规则快照、金额、状态和调整链 | +| 审计记录 | 操作、对象、前后值、操作者、时间、请求和结果 | -所有基础资料引用都同时保存稳定 ID 和必要快照。仓库、往来单位、快递公司或库位后续改名、停用时,不改变历史到仓记录。 +所有基础资料引用同时保存稳定 ID 和必要快照。历史到仓、测量和费用记录不得因基础资料改名、停用或规则更新而改变。 -## 七、应用范围 +## 八、应用和服务范围 ### 管理后台 `apps/admin-web` -- 到仓单列表、筛选、详情和状态操作。 -- 预约取货审核、仓库时间窗容量和服务商调度。 -- 到仓签到、收货批次、处理单元标签、测量和照片。 -- 差异处理、异常暂停、客户确认结果、调整和主管冲正。 -- 库区/库位维护、隔离区、上架任务及当前货物位置查询。 -- 费用项目、计费规则、费用审核与调整、应收应付、客户/供应商对账、收付款核销、发票登记和利润查询。 -- 权限至少拆分为查看、预约调度、收货、标签、测量、差异处理、异常解除、冲正、库位维护、上架、规则发布、费用调整、费用审核、对账审核、收付款、核销、反核销、发票登记和利润查看。 +- 到仓单、预约结果、签到、收货批次、标签、测量、照片和差异通知。 +- 库区/库位、上架任务和当前位置查询。 +- 费用项目、计费规则、费用试算、人工补录、调整、确认、作废和导出。 ### 企业客户端 `apps/client-web` -- 创建取货预约或送货预报。 -- 查看预约安排、到仓时间线、实测结果和公开照片。 -- 查看并确认差异;确认失败时保留页面输入和上下文。 -- 查看部分到仓、剩余待到仓数量、业务暂停和异常处理结果。 -- 查看上架完成结果,不暴露其他企业、内部库位运营信息或平台内部备注。 -- 查看本企业账单、费用明细和付款状态,确认或提出异议;不暴露应付成本和内部利润。 +- 创建取货或送货预报。 +- 查看预约结果、到仓时间线、实测、公开照片、差异通知和上架结果。 +- 如二期客户端展示头程费用,只显示本企业公开费用,不显示内部备注和其他企业数据。 -### 服务端 `services/api` +### 国内头程后端 `baiyue-firstleg/` - 最终保证身份、租户、仓库数据范围、状态转换、幂等、并发和审计。 -- 管理到仓单、预约容量、收货批次、处理单元、标签、测量规则、差异、异常、库位、位置记录、上架、冲正及时间线事务边界。 -- 管理计费规则版本、费用生成幂等、费用调整、应收应付、对账单版本、收付款核销、发票登记、汇率锁定和利润权限边界。 +- 管理到仓单、收货批次、处理单元、标签、测量、差异通知、库位、上架、位置和冲正事务边界。 +- 管理计费规则版本、费用生成幂等、三位向上取整、费用调整和历史复算。 - 文件访问使用不可预测标识和授权下载,不信任客户端文件名与 MIME 类型。 -- 联系方式、司机信息、照片和交接凭证执行字段脱敏、最小返回、导出审计、保留期限和到期清理。 -- 为未来 PDA 或外部调度接口预留适配边界,但二期不绑定厂商 SDK。 -## 八、建议里程碑 +## 九、里程碑 | 里程碑 | 交付目标 | 进入条件 | |---|---|---| -| P2-M0 规则锁定 | 到仓规则、计费财务边界、费用项目、规则版本、结算、核销、汇率和权限基线确认 | 一期订单及基础资料契约稳定 | -| P2-M1 到仓预报 | 预约取货、送货上门预报及平台调度形成闭环 | 快递公司、往来单位和收货仓 API 可用 | -| P2-M2 到仓收货 | 到仓签到、分批收货、处理单元标签、异常、冲正和照片可追溯 | 文件存储和仓库权限可用 | -| P2-M3 测量差异 | 测量规则版本、可复算结果、自动对比、客户确认、隔离和调整闭环可用 | 测量口径和阈值确认 | -| P2-M4 库位上架 | 库位档案、隔离区、上架任务、处理单元当前位置和历史位置可查 | 库位编码、容量和拆分规则确认 | -| P2-M5 计费财务 | 费用生成、应收应付、客户/供应商对账、收付款核销和单票利润闭环可用 | Q13-Q16 确认,P2-M3 实测数据可用 | -| P2-M6 联调验收 | 跨端联调、迁移、安全、异常、财务勾稽、性能和发布完成 | P2-M1 至 P2-M5 验收通过 | +| P2-M0 规则锁定 | 到仓契约、测量口径、头程计费边界和权限基线确认 | 一期订单及基础资料契约稳定 | +| P2-M1 到仓预报 | 取货/送货预报及线下预约结果可记录 | 收货仓 API 可用 | +| P2-M2 到仓收货 | 签到、分批收货、标签、照片和冲正可追溯 | 文件服务和仓库权限可用 | +| P2-M3 测量差异 | 原始测量、三位向上取整、差异记录和通知可用 | 测量公式可用 | +| P2-M4 库位上架 | 库位、上架任务和位置历史可查 | 库位编码规则确认 | +| P2-M5 头程计费 | 费用项目、规则版本、试算、调整和费用明细可用 | P2-Q14 至 Q16 确认,P2-M3 可用 | +| P2-M6 联调验收 | 跨端联调、安全、幂等、复算、性能和发布完成 | P2-M1 至 P2-M5 验收通过 | -## 九、建议开发任务 +## 十、开发任务 | ID | 端 | 模块 | 交付内容 | 优先级 | 依赖 | |---|---|---|---|---|---| | P2-BASE-01 | 公共 | 到仓契约 | 状态、枚举、权限、事件、错误码和快照模型 | P0 | 一期订单契约 | -| P2-BASE-02 | 公共 | 数据模型 | 到仓单、计划分配、预约容量、批次、处理单元、标签、组托版本、测量规则、差异、异常、库位、位置、冲正和时间线 | P0 | P2-BASE-01 | +| P2-BASE-02 | 公共 | 数据模型 | 到仓单、批次、处理单元、标签、测量、差异、库位、位置、费用和审计 | P0 | P2-BASE-01 | | P2-ADM-01 | 后台 | 到仓列表 | 查询、筛选、分页、详情、空态和异常态 | P0 | P2-BASE-01 | -| P2-ADM-02 | 后台 | 预约调度 | 审核预约、分配服务商、调整时间和取消 | P0 | P2-ADM-01 | -| P2-SCH-01 | 后台 | 预约容量 | 营业时间、停收日期、时间窗容量、冲突和人工超额授权 | P0 | P2-ADM-02 | -| P2-CLI-01 | 客户端 | 到仓预报 | 预约取货、送货上门、联系人地址带入、可用时间窗和提交 | P0 | P2-BASE-01、P2-SCH-01 | +| P2-ADM-02 | 后台 | 预约结果 | 记录、调整和取消线下预约结果 | P0 | P2-ADM-01 | +| P2-CLI-01 | 客户端 | 到仓预报 | 取货/送货方式、联系人、仓库和货物摘要提交 | P0 | P2-BASE-01 | | P2-WH-01 | 后台 | 到仓签到 | 识别到仓单、分批收货、交接和异常登记 | P0 | P2-BASE-02 | -| P2-LABEL-01 | 后台 | 处理单元标签 | 箱件/托盘编码、佳博 1324D 实机适配、打印结果、失败重试、补打、换标、作废和重复码处理 | P0 | P2-WH-01 | -| P2-REV-01 | 后台 | 收货冲正 | 错绑企业/订单/到仓单的主管审批、解绑和重新认领 | P0 | P2-WH-01 | -| P2-WH-02 | 后台 | 入库测量 | 原始测量、规则版本、换算、复核、照片和历史复算 | P0 | P2-LABEL-01 | -| P2-DIFF-01 | 公共 | 差异引擎 | 申报实测对比、阈值、差异单和阻塞规则 | P0 | P2-WH-02、P2-HOLD-01 | -| P2-ADM-03 | 后台 | 差异处理 | 复核、说明、调整、关闭和审计 | P0 | P2-DIFF-01 | -| P2-CLI-02 | 客户端 | 差异确认 | 查看实测、公开照片、确认或反馈差异 | P0 | P2-DIFF-01 | -| P2-HOLD-01 | 公共 | 异常与暂停 | 异常单、业务暂停、隔离、责任期限、解除和恢复阶段 | P0 | P2-BASE-02 | -| P2-LOC-01 | 后台 | 库位维护 | 库区、库位编码、类型、容量、状态和权限范围 | P0 | P2-BASE-02 | -| P2-PUT-01 | 后台 | 上架任务 | 创建、分配、拆分、隔离上架、异常和完成 | P0 | P2-LOC-01、P2-WH-02、P2-HOLD-01 | -| P2-POS-01 | 公共 | 位置记录 | 处理单元当前位置、进入/移出历史和库位占用校验 | P0 | P2-PUT-01 | -| P2-SEC-01 | 公共 | 隐私与保留 | 联系方式脱敏、照片授权、导出审计、保留期限和清理 | P0 | P2-WH-01 | -| P2-TIME-01 | 公共 | 时间线通知 | 对客事件、站内提醒和失败补偿记录 | P1 | 核心流程完成 | -| P2-FEE-01 | 后台 | 费用项目 | 费用项目、方向、单位、币种、税务属性和启停 | P0 | P2-BASE-01 | -| P2-RATE-01 | 后台/服务端 | 计费规则 | 规则维度、版本、生效区间、阶梯/最低价和发布审核 | P0 | P2-FEE-01、P2-WH-02 | -| P2-CALC-01 | 服务端 | 计费引擎 | 规则匹配、试算、事件触发、幂等、计算快照和复算 | P0 | P2-RATE-01 | -| P2-FEE-02 | 后台 | 费用台账 | 自动/人工费用、审核、调整、红冲、锁定和审计 | P0 | P2-CALC-01 | -| P2-ARAP-01 | 后台 | 应收应付 | 客户应收、供应商应付、查询汇总、权限和导出 | P0 | P2-FEE-02、一期往来单位 | -| P2-RECON-01 | 后台 | 对账单 | 按票/月结生成、审核、确认、争议、版本和关闭 | P0 | P2-ARAP-01 | -| P2-CLI-03 | 客户端 | 账单中心 | 对客账单列表、明细、确认、异议和付款状态 | P0 | P2-RECON-01 | -| P2-CASH-01 | 后台 | 收付款核销 | 收付款登记、凭证、审核、部分核销、反核销和余额 | P0 | P2-RECON-01 | -| P2-INV-01 | 后台 | 发票登记 | 开票/收票申请、号码、金额、税率、状态和附件 | P1 | P2-RECON-01 | -| P2-PROFIT-01 | 后台 | 单票利润 | 收入、成本、毛利、毛利率、折算和权限控制 | P1 | P2-ARAP-01、汇率版本 | -| P2-TEST-01 | 公共 | 自动化测试 | 越权、幂等、计费复算、费用调整、对账勾稽、核销、反核销、标签、差异、位置、文件和隐私测试 | P0 | 所有 P0 模块 | -| P2-REL-01 | 公共 | 发布验收 | 初始化预约日历、库区库位、测量规则、标签打印参数、迁移、联调、验收和生产发布 | P0 | P2-TEST-01 | +| P2-LABEL-01 | 后台 | 处理单元标签 | 编码、佳博 1324D 适配、失败重试、补打、换标和作废 | P0 | P2-WH-01 | +| P2-REV-01 | 后台 | 收货冲正 | 错绑企业/订单/到仓单的审批、解绑和重绑 | P0 | P2-WH-01 | +| P2-WH-02 | 后台 | 入库测量 | 原始测量、三位向上取整、复测、照片和历史复算 | P0 | P2-LABEL-01 | +| P2-DIFF-01 | 公共 | 差异计算 | 申报实测对比、差异记录、通知状态和审计 | P0 | P2-WH-02 | +| P2-ADM-03 | 后台 | 差异通知 | 查看、补充说明、通知客户和关闭记录 | P0 | P2-DIFF-01 | +| P2-CLI-02 | 客户端 | 差异查看 | 查看实测、公开照片和差异通知,不提供确认动作 | P1 | P2-DIFF-01 | +| P2-HOLD-01 | 公共 | 异常记录 | 非差异类异常、责任人、证据、处理结果和审计 | P1 | P2-BASE-02 | +| P2-LOC-01 | 后台 | 库位维护 | 库区、库位编码、状态和权限范围,不做容量校验 | P0 | P2-BASE-02 | +| P2-PUT-01 | 后台 | 上架任务 | 创建、分配、拆分、异常和完成,不做隔离上架 | P0 | P2-LOC-01、P2-WH-02 | +| P2-POS-01 | 公共 | 位置记录 | 处理单元当前位置和进入/移出历史 | P0 | P2-PUT-01 | +| P2-SEC-01 | 公共 | 文件与保留 | 文件鉴权、类型/安全校验、访问审计、永久保存和备份边界 | P0 | P2-WH-01 | +| P2-TIME-01 | 公共 | 时间线通知 | 对客事件、差异通知和失败补偿记录 | P1 | 核心流程完成 | +| P2-FEE-01 | 后台 | 费用项目 | 头程费用项目、单位、币种、税务属性和启停 | P0 | P2-Q14、P2-BASE-01 | +| P2-RATE-01 | 后台/服务端 | 计费规则 | 规则维度、版本、生效区间、价格结构和发布 | P0 | P2-Q15、P2-FEE-01 | +| P2-CALC-01 | 服务端 | 计费引擎 | 规则匹配、试算、事件触发、幂等、三位向上取整和复算 | P0 | P2-Q16、P2-RATE-01、P2-WH-02 | +| P2-FEE-02 | 后台 | 头程费用明细 | 自动/人工费用、确认、调整、作废、查询、导出和审计 | P0 | P2-CALC-01 | +| P2-TEST-01 | 公共 | 自动化测试 | 越权、幂等、测量舍入、计费复算、标签、差异、位置、文件和审计 | P0 | 所有 P0 模块 | +| P2-REL-01 | 公共 | 发布验收 | 初始化仓库、库位、测量规则、标签和费用基础数据,联调、验收和发布 | P0 | P2-TEST-01 | -## 十、测试与验收重点 +二期开发任务共 24 项。应收应付、对账、账单中心、收付款核销、发票和利润六项任务已根据产品确认从二期移除。 -- 企业 A 不能读取、预约、确认企业 B 的到仓单和差异。 -- 无仓库权限的员工不能收货、测量或分配库位。 -- 重复预约、签到、标签生成、测量提交和上架完成不会产生重复记录。 -- 取货调度、到仓主进度、差异、上架和异常状态独立维护;任一异常解除后能恢复到原业务阶段,不覆盖或倒退其他状态域。 -- 一张订单多到仓单、一个到仓单多批收货的累计、剩余、部分收货和人工关闭结果正确。 -- 少货人工关闭后不能继续登记原到仓单批次,也不会跳过测量、差异确认或正式上架;后续补货通过新到仓单关联原单。 -- 多张有效到仓单不能超额分配同一订单货物明细;取消和人工关闭后未使用计划量按规则释放。 -- 未认领货物不会归入错误订单或企业;错误绑定只能通过授权冲正恢复,原记录不可删除。 -- 标签补打、换标和作废可追溯,重复标签不能同时绑定两个有效处理单元。 -- 使用佳博 1324D 实机验证标签内容、尺寸、清晰度、连续打印、失败提示和重试;断电、缺纸或连接中断不会误记为打印成功。 -- 组托、拆托和重新组托保留箱件父子关系及版本,任一箱件不会同时属于两个有效托盘。 -- 实测修改保留旧版本、原因和操作者,客户确认绑定明确版本。 -- 历史实测使用保存的单位、系数、精度、舍入规则和公式版本可复算出相同结果。 -- 差异未关闭时严格执行已确认的上架和后续流程阻塞规则。 -- 隔离区上架不会标记正式上架完成;解除暂停后生成到正式库位的位置变更。 -- 上架完成后每个处理单元有且只有一个有效当前位置,停用或容量不足库位被服务端拒绝。 -- 停用仓库、快递公司、往来单位和库位不能用于新业务,但历史记录可读。 -- 照片和附件覆盖类型、大小、恶意内容、越权访问和删除引用。 -- 联系方式按角色脱敏,敏感文件下载和批量导出有审计,过期数据按保留策略清理。 -- 相同计费事件重试不重复生成费用,历史费用能按规则、输入和汇率快照复算一致。 -- 费用调整、红冲、对账版本、核销和反核销形成不可删除的审计链。 -- 对账单费用、调整、已核销和余额勾稽一致;多币种不直接相加且折算可追溯。 -- 客户及非财务角色不能读取供应商成本、内部利润和其他企业财务数据。 +## 十一、测试与验收重点 + +- 企业 A 不能读取或操作企业 B 的到仓、测量、差异或费用数据。 +- 重复预约记录、签到、标签生成、测量、上架和计费事件不产生重复有效记录。 +- 实测修改保留旧版本、原因和操作者;原始值和三位向上取整结果可追溯。 +- 差异能够通知客户并记录结果,但不会等待客户确认或阻塞上架、计费。 +- 称重照片和测量照片必传;文件类型、恶意内容、越权访问和技术大小上限校验有效。 +- 佳博 1324D 实机打印内容、尺寸、清晰度、连续打印、缺纸、断电和重试符合预期。 +- 不存在隔离区、待认领区、无预报认领或库位容量拦截的隐藏流程。 +- 上架完成后每个处理单元只有一个有效当前位置,停用或越权库位被拒绝。 +- 相同计费事件重试不重复生成费用;历史费用能按规则版本和输入复算一致。 +- 已确认费用不能静默覆盖;调整、作废和导出均有审计。 +- 系统不会生成应收、应付、对账单、收付款、核销、发票或利润数据。 - 页面覆盖加载、空态、失败、无权限、重复操作、数据过期和窄屏场景。 -- 二期验收终点为指定库位完成,不以库存或出仓功能作为完成条件。 -## 十一、启动前待确认事项 - -### 已采用的规划基线 - -| 编号 | 规划基线 | 说明 | -|---|---|---| -| P2-B1 | 订单 1:N 到仓单,到仓单 1:N 收货批次,批次 1:N 处理单元 | 支持分次预约和分批实际到仓 | -| P2-B2 | 异常单和业务暂停独立于到仓主状态 | 异常解除后恢复原进度,不覆盖或猜测主阶段 | -| P2-B3 | 二期建立处理单元和位置记录 | 只支撑标签、指定库位和三期拣货输入,不扩张为完整库存系统 | -| P2-B4 | 差异未关闭默认业务暂停,不建设单独隔离区 | 暂停期间不得进入正式上架完成和计费锁定节点 | -| P2-B5 | 错误收货通过主管冲正处理 | 不删除原记录,保留原绑定、原因、审批和重新认领结果 | - -### 已确认的业务决策 - -| 编号 | 已确认事项 | 实施说明 | -|---|---|---| -| P2-Q1 | 少货处理以实际入库货物为准 | 实收和计划差异进入客户确认,原到仓单按实收结果处理 | -| P2-Q2 | 不走系统服务商调度 | 取货安排在线下完成,系统不建设自动服务商分配;相关费用人工添加 | -| P2-Q3 | 人工线下预约时间 | 系统记录预约结果、改期和取消留痕,不建设时间窗容量调度 | -| P2-Q4 | 毛重及材积重公式已确认 | 毛重相关值按毛重÷363;材积重按(长×宽×高÷6000)×箱数,单位和舍入写入规则版本 | -| P2-Q5 | 差异需要客户确认 | 差异确认前保持业务暂停 | -| P2-Q6 | 不建设单独隔离区域 | 以业务暂停控制后续操作,不生成隔离库位流程 | -| P2-Q7 | 当前不做库位容量校验 | 保留库位启停和权限校验,不按重量、箱数或体积拦截 | -| P2-Q8 | 上传称重照片和测量照片 | 收货测量流程提供对应附件上传和权限控制 | -| P2-Q11 | 敏感数据和凭证保存 12 个月 | 起算点及到期删除/归档方式在技术规则中统一定义 | -| P2-Q12 | 箱件/托盘标签使用佳博 1324D 热敏标签打印机 | 设备型号已锁定;标签纸尺寸、连接方式、驱动、指令协议和仓库部署参数在开发前通过实机核验 | - -### 暂缓事项 - -| 编号 | 暂缓事项 | 二期临时基线 | -|---|---|---| -| P2-Q9 | 是否使用 PDA | 二期不接 PDA,使用后台或响应式作业页 | -| P2-Q10 | 无预报货物认领和超期处理 | 无预报货物不得直接绑定企业订单,完整认领和超期规则后续确认 | - -### 仍需产品确认 - -以下事项由项目负责人依据 [二期需求确认清单](二期需求确认清单.md) 组织业务、仓库、财务和技术形成临时结论。本表保留规划摘要;状态为“临时基线”且结论可转为开发规则时可用于当前开发,产品到岗复核后改为“已确认”。 +## 十二、仍需确认事项 | 编号 | 待确认问题 | 当前建议 | |---|---|---| -| P2-Q13 | 二期计费财务做到哪一个闭环终点? | 建议做到线下收付款登记和核销,不做总账会计 | -| P2-Q14 | 首批费用项目及应收/应付方向是什么? | 按到仓相关费用建立白名单,其他费用人工新增需审核 | -| P2-Q15 | 计费规则需要哪些维度、阶梯和最低收费? | 至少支持客户、供应商、仓库、服务和有效期版本 | -| P2-Q16 | 费用在什么业务节点生成并锁定? | 实测试算,差异关闭后确认;特殊费用按事件生成 | +| P2-Q14 | 首批头程费用项目、单位、币种、税率和触发节点 | 只纳入“02 到仓”实际使用费用;白名单外人工补录需留痕 | +| P2-Q15 | 计费维度、阶梯价、最低收费、封顶、组合价和优先级 | 先支持客户、往来单位、仓库、服务和生效区间 | +| P2-Q16 | 费用试算、生成、确认、调整和作废节点 | 实测完成试算,其他费用按已确认业务事件生成 | -P2-Q17 至 P2-Q24 已根据财务原型和安全实现规则形成二期基线,不再要求产品重复确认;详细口径见 [二期计费财务需求确认表](二期计费财务需求确认表.md)。 +回传中的“63”不作为业务结论。P2-Q13 已确认仅做头程计费;P2-Q17 至 P2-Q24 不纳入二期。 -## 十二、建议实施顺序 +## 十三、建议实施顺序 -1. 锁定仍需业务确认的口径,并完成到仓领域契约和数据关系评审。 -2. 先实现服务端到仓单、预约容量、权限和部分收货汇总,再接客户预报与后台调度。 -3. 实现到仓签到、分批收货、处理单元标签、照片、主管冲正和待认领流程。 -4. 实现测量规则版本、原始测量、历史复算、差异对比和客户确认闭环。 -5. 实现异常单、业务暂停、隔离区、解除和恢复阶段。 -6. 实现库位容量、上架任务、处理单元当前位置和历史位置,终点锁定为“指定库位完成”。 -7. 建立费用项目、计费规则和汇率版本,接入实测数据完成试算、审核、调整和应收应付台账。 -8. 实现客户/供应商对账、账单中心、线下收付款、核销、反核销、发票登记和单票利润。 -9. 完成跨租户、财务权限、幂等、并发、计费复算、对账勾稽、文件、隐私、异常和冲正流程测试。 -10. 使用脱敏初始化数据联调、验收和灰度发布。 +1. 合并已确认的到仓规则,更新状态、权限和数据对象。 +2. 实现到仓预报、线下预约结果、签到和分批收货。 +3. 实现处理单元、佳博 1324D 标签、冲正和必传照片。 +4. 实现原始测量、三位向上取整、复测和差异通知。 +5. 实现库位、上架任务和位置历史,不建设隔离和容量校验。 +6. 确认 P2-Q14 至 Q16,建立头程费用项目和计费规则版本。 +7. 接入实测和业务事件,完成费用试算、人工补录、调整和费用明细。 +8. 完成租户隔离、幂等、计费复算、文件安全、审计和回归测试。 +9. 使用脱敏初始化数据联调、验收和发布。 diff --git a/二期/二期开发进度表.md b/二期/二期开发进度表.md index 4e0e818..d0947a7 100644 --- a/二期/二期开发进度表.md +++ b/二期/二期开发进度表.md @@ -1,130 +1,115 @@ -# 虫虫出海二期开发进度表:到仓与计费财务 +# 虫虫出海二期开发进度表:到仓与头程计费 > 创建日期:2026-07-28 -> 更新日期:2026-07-30 +> 更新日期:2026-07-31 > 当前阶段:开发已启动,需求确认并行 -> 总体状态:已开工,具体任务进度待回填 +> 总体状态:到仓规则和范围已确认,3 项计费细节待补充;实际开发进度待负责人回填 -二期严格以头程物流“02 到仓”为范围,规划和业务问题分别见 [二期开发规划](二期开发规划.md)与[二期需求确认清单](二期需求确认清单.md)。`docs/悦` 中的原型用于确认已有业务线索,不代表功能已经开发完成。 +二期严格以头程物流“02 到仓”和头程计费为范围。范围依据见 [二期开发规划](二期开发规划.md),确认结论见 [二期需求确认清单](二期需求确认清单.md)。原型只用于页面、字段和流程参考,不自动扩大二期范围。 ## 一、进度口径 -- 开发任务共 31 项。项目已开工,但尚未收到具体已开工任务、完成量和负责人信息,因此任务表暂不虚填进度;开发负责人应在本表逐项回填状态和百分比。 -- 二期共跟踪 24 项:4 项已确认、6 项确认中、2 项暂缓、4 项待确认、8 项原型基线。 -- 仍需产品处理 11 项:P2-Q1、Q4、Q5、Q6、Q8、Q10、Q11、Q13 至 Q16。 -- 无需重复确认:P2-Q2、Q3、Q7、Q9、Q12,以及已采用原型基线的 P2-Q17 至 Q24。 -- 原型覆盖只表示存在页面、字段或流程参考,不能计入开发进度。 -- 产品岗位空缺期间,业务、仓库、财务和技术在 [二期需求确认清单](二期需求确认清单.md) 中形成临时基线;后续产品复核产生的变化按需求变更处理。 +- 开发任务共 24 项;未收到具体完成量、负责人和日期前,不虚填开发进度。 +- 需求问题共 24 项:已确认 12 项、暂缓 1 项、待确认 3 项、不纳入二期 8 项。 +- 当前会议只需处理 P2-Q14、P2-Q15、P2-Q16。 +- P2-Q9 暂缓,二期不接 PDA;P2-Q17 至 P2-Q24 不纳入二期。 +- 应收应付、对账、收付款、核销、发票、汇率结算、利润和总账不进入任务、排期和验收。 ## 二、总体进度 | 工作流 | 范围 | 状态 | 开发进度 | 需求状态 | 负责人 | 备注 | |---|---|---|---:|---|---|---| -| 规则与数据 | 到仓契约、数据模型、安全和隐私 | 需求确认中 | 0% | 到仓规则已确认;财务规则待确认 | 待分配 | 一期订单及基础资料契约是前置依赖 | -| 到仓预报 | 预约取货、送货上门、预约容量和调度 | 待开始 | 0% | P2-Q2、Q3 已确认 | 待分配 | 改为人工线下预约,系统记录预约结果 | -| 到仓收货 | 签到、分批收货、标签、异常和冲正 | 需求确认中 | 0% | P2-Q1、Q8 已确认;Q10 暂缓 | 待分配 | 无预报货物临时禁止直接绑定企业订单 | -| 测量差异 | 实测、审核、差异阈值、客户确认和暂停 | 待开始 | 0% | P2-Q4、Q5、Q6 已确认 | 待分配 | 不设隔离区,差异期间采用业务暂停 | -| 库位上架 | 库位、状态、上架任务和位置历史 | 待开始 | 0% | P2-Q7 已确认;Q9 暂缓 | 待分配 | 不做容量校验,二期暂不接 PDA | -| 计费财务 | 费用规则、应收应付、对账、核销、发票和利润 | 需求确认中 | 0% | P2-Q13 至 Q16 待形成临时基线;Q17 至 Q24 原型基线 | 待分配 | 当前会议需确定范围、首批费用、规则复杂度和计费节点 | -| 联调发布 | 时间线、测试、初始化和发布 | 待开始 | 0% | 依赖全部 P0 决策 | 待分配 | 需求基线确认后再排期 | +| 规则与数据 | 到仓契约、数据模型、权限、文件和审计 | 待开始 | 0% | 到仓规则已确认 | 待分配 | 一期订单及基础资料契约是前置依赖 | +| 到仓预报 | 取货/送货预报和线下预约结果记录 | 待开始 | 0% | Q2、Q3 已确认 | 待分配 | 不做容量调度和系统服务商分配 | +| 到仓收货 | 签到、分批收货、标签、照片、异常和冲正 | 待开始 | 0% | Q1、Q8、Q10、Q12 已确认 | 待分配 | 不建设无预报认领流程 | +| 测量差异 | 实测、三位向上取整、差异记录和客户通知 | 待开始 | 0% | Q4、Q5、Q6 已确认 | 待分配 | 差异无需客户确认,不阻塞上架或计费 | +| 库位上架 | 库位、上架任务和位置历史 | 待开始 | 0% | Q7 已确认;Q9 暂缓 | 待分配 | 不做容量校验、隔离区和 PDA | +| 头程计费 | 费用项目、规则版本、试算、调整和费用明细 | 需求确认中 | 0% | Q13 已确认;Q14-Q16 待确认 | 待分配 | 不生成后续财务数据 | +| 联调发布 | 时间线、测试、初始化、联调和发布 | 待开始 | 0% | 依赖 Q14-Q16 | 待分配 | 确认计费细节后锁定验收基线 | ## 三、详细任务表 | ID | 里程碑 | 端 | 模块 | 功能/交付内容 | 优先级 | 状态 | 进度 | 原型覆盖 | 需求阻塞 | 依赖 | 负责人 | 计划开始 | 计划完成 | 备注 | |---|---|---|---|---|---|---|---:|---|---|---|---|---|---|---| -| P2-BASE-01 | P2-M0 | 公共 | 到仓契约 | 状态、枚举、权限、事件、错误码和快照模型 | P0 | 需求确认中 | 0% | 部分 | Q1-Q11 | 一期订单契约 | 待分配 | 待排期 | 待排期 | 原型存在状态线索,最终契约以业务确认结果为准 | -| P2-BASE-02 | P2-M0 | 公共 | 数据模型 | 到仓单、计划分配、预约容量、批次、处理单元、标签、组托、测量、差异、异常、库位、位置和冲正 | P0 | 需求确认中 | 0% | 部分 | Q1-Q11 | P2-BASE-01 | 待分配 | 待排期 | 待排期 | 原型字段可参考,数据关系按二期规划建设 | -| P2-ADM-01 | P2-M1 | 后台 | 到仓列表 | 查询、筛选、分页、详情、空态和异常态 | P0 | 待开始 | 0% | 较完整 | - | P2-BASE-01 | 待分配 | 待排期 | 待排期 | 后台原型有入库单列表、筛选和详情入口 | -| P2-ADM-02 | P2-M1 | 后台 | 预约调度 | 审核预约、分配服务商、调整时间和取消 | P0 | 待开始 | 0% | 部分 | Q2、Q3 | P2-ADM-01 | 待分配 | 待排期 | 待排期 | 原型未明确服务商分配和改期规则 | -| P2-SCH-01 | P2-M1 | 后台 | 预约容量 | 营业时间、停收日期、时间窗容量、冲突和人工超额授权 | P0 | 待开始 | 0% | 无 | Q3 | P2-ADM-02 | 待分配 | 待排期 | 待排期 | 需要业务确认时间窗及容量口径 | -| P2-CLI-01 | P2-M1 | 客户端 | 到仓预报 | 预约取货、送货上门、联系人地址带入、可用时间窗和提交 | P0 | 待开始 | 0% | 部分 | Q2、Q3 | P2-BASE-01、P2-SCH-01 | 待分配 | 待排期 | 待排期 | 原型有提货方式和提货信息,没有完整预约闭环 | -| P2-WH-01 | P2-M2 | 后台 | 到仓签到 | 识别到仓单、分批收货、交接和异常登记 | P0 | 待开始 | 0% | 部分 | Q1、Q8、Q10 | P2-BASE-02 | 待分配 | 待排期 | 待排期 | 原型有待到仓、收货中状态,未覆盖无预报认领 | -| P2-LABEL-01 | P2-M2 | 后台 | 处理单元标签 | 箱件/托盘编码、佳博 1324D 实机适配、打印结果、失败重试、补打、换标和作废 | P0 | 待开始 | 0% | 部分 | 设备参数核验 | P2-WH-01 | 待分配 | 待排期 | 待排期 | 型号已确认;纸张、连接、驱动和指令协议待实机核验 | -| P2-REV-01 | P2-M2 | 后台 | 收货冲正 | 错绑企业/订单/到仓单的主管审批、解绑和重新认领 | P0 | 待开始 | 0% | 无 | Q10 | P2-WH-01 | 待分配 | 待排期 | 待排期 | 原记录不可删除 | -| P2-WH-02 | P2-M3 | 后台 | 入库测量 | 原始测量、规则版本、换算、复核、照片和历史复算 | P0 | 待开始 | 0% | 较完整 | Q4、Q8 | P2-LABEL-01 | 待分配 | 待排期 | 待排期 | 原型有 cm、kg、m³、材积重及测量审核 | -| P2-DIFF-01 | P2-M3 | 公共 | 差异引擎 | 申报实测对比、阈值、差异单和阻塞规则 | P0 | 待开始 | 0% | 部分 | Q4、Q5 | P2-WH-02、P2-HOLD-01 | 待分配 | 待排期 | 待排期 | 原型有对比和审核,没有阈值 | -| P2-ADM-03 | P2-M3 | 后台 | 差异处理 | 复核、说明、调整、关闭和审计 | P0 | 待开始 | 0% | 部分 | Q5、Q6 | P2-DIFF-01 | 待分配 | 待排期 | 待排期 | 原型有审核不通过和失败原因 | -| P2-CLI-02 | P2-M3 | 客户端 | 差异确认 | 查看实测、公开照片、确认或反馈差异 | P0 | 待开始 | 0% | 无 | Q5、Q8 | P2-DIFF-01 | 待分配 | 待排期 | 待排期 | 客户确认流程需要新增 | -| P2-HOLD-01 | P2-M3 | 公共 | 异常与暂停 | 异常单、业务暂停、隔离、责任期限、解除和恢复阶段 | P0 | 待开始 | 0% | 部分 | Q1、Q5、Q6、Q10 | P2-BASE-02 | 待分配 | 待排期 | 待排期 | 原型仅有是否扣货和扣货理由 | -| P2-LOC-01 | P2-M4 | 后台 | 库位维护 | 库区、库位编码、类型、容量、状态和权限范围 | P0 | 待开始 | 0% | 较完整 | Q7 | P2-BASE-02 | 待分配 | 待排期 | 待排期 | 原型有库区、类型、最大承重和占用状态 | -| P2-PUT-01 | P2-M4 | 后台 | 上架任务 | 创建、分配、拆分、隔离上架、异常和完成 | P0 | 待开始 | 0% | 较完整 | Q6、Q7、Q9 | P2-LOC-01、P2-WH-02、P2-HOLD-01 | 待分配 | 待排期 | 待排期 | 原型有待上架、上架中、已完成及目标库位 | -| P2-POS-01 | P2-M4 | 公共 | 位置记录 | 处理单元当前位置、进入/移出历史和库位占用校验 | P0 | 待开始 | 0% | 部分 | Q7 | P2-PUT-01 | 待分配 | 待排期 | 待排期 | 原型有库存流水线索,二期不建设完整库存系统 | -| P2-SEC-01 | P2-M0 | 公共 | 隐私与保留 | 联系方式脱敏、照片授权、导出审计、保留期限和清理 | P0 | 需求确认中 | 0% | 无 | Q11 | P2-WH-01 | 待分配 | 待排期 | 待排期 | 保存期限需业务、法务和运维确认 | -| P2-FEE-01 | P2-M5 | 后台 | 费用项目 | 费用项目、方向、单位、币种、税务属性和启停 | P0 | 需求确认中 | 0% | 较完整 | Q14、Q18 | P2-BASE-01 | 待分配 | 待排期 | 待排期 | 后台原型有费用项目维护 | -| P2-RATE-01 | P2-M5 | 后台/服务端 | 计费规则 | 规则维度、版本、生效区间、阶梯/最低价和发布审核 | P0 | 需求确认中 | 0% | 部分 | Q15-Q18 | P2-FEE-01、P2-WH-02 | 待分配 | 待排期 | 待排期 | 原型有费用字段,缺可审计的规则版本 | -| P2-CALC-01 | P2-M5 | 服务端 | 计费引擎 | 规则匹配、试算、事件触发、幂等、计算快照和复算 | P0 | 需求确认中 | 0% | 无 | Q15-Q18 | P2-RATE-01 | 待分配 | 待排期 | 待排期 | 实测数据是主要计费输入 | -| P2-FEE-02 | P2-M5 | 后台 | 费用台账 | 自动/人工费用、审核、调整、红冲、锁定和审计 | P0 | 需求确认中 | 0% | 较完整 | Q16、Q18、Q19 | P2-CALC-01 | 待分配 | 待排期 | 待排期 | 原型有费用新增、审核和删除入口,删除需改为红冲 | -| P2-ARAP-01 | P2-M5 | 后台 | 应收应付 | 客户应收、供应商应付、查询汇总、权限和导出 | P0 | 需求确认中 | 0% | 较完整 | Q13、Q17-Q19 | P2-FEE-02、一期往来单位 | 待分配 | 待排期 | 待排期 | 原型有客户应收应付与供应商费用 | -| P2-RECON-01 | P2-M5 | 后台 | 对账单 | 按票/月结生成、审核、确认、争议、版本和关闭 | P0 | 需求确认中 | 0% | 较完整 | Q20、Q21 | P2-ARAP-01 | 待分配 | 待排期 | 待排期 | 原型有客户/供应商对账单与明细 | -| P2-CLI-03 | P2-M5 | 客户端 | 账单中心 | 对客账单列表、明细、确认、异议和付款状态 | P0 | 需求确认中 | 0% | 部分 | Q20、Q21 | P2-RECON-01 | 待分配 | 待排期 | 待排期 | 客户端已有应付账单列表和明细参考 | -| P2-CASH-01 | P2-M5 | 后台 | 收付款核销 | 收付款登记、凭证、审核、部分核销、反核销和余额 | P0 | 需求确认中 | 0% | 较完整 | Q17、Q22 | P2-RECON-01 | 待分配 | 待排期 | 待排期 | 原型有收付款状态,核销勾稽规则需补充 | -| P2-INV-01 | P2-M5 | 后台 | 发票登记 | 开票/收票申请、号码、金额、税率、状态和附件 | P1 | 需求确认中 | 0% | 部分 | Q18、Q23 | P2-RECON-01 | 待分配 | 待排期 | 待排期 | 二期建议不接外部开票平台 | -| P2-PROFIT-01 | P2-M5 | 后台 | 单票利润 | 收入、成本、毛利、毛利率、折算和权限控制 | P1 | 需求确认中 | 0% | 较完整 | Q17、Q24 | P2-ARAP-01、汇率版本 | 待分配 | 待排期 | 待排期 | 原型有利润表和收入成本明细 | -| P2-TIME-01 | P2-M6 | 公共 | 时间线通知 | 对客事件、站内提醒和失败补偿记录 | P1 | 待开始 | 0% | 部分 | Q1、Q5、Q8、Q21 | 核心流程完成 | 待分配 | 待排期 | 待排期 | 外部通知渠道不纳入未确认范围 | -| P2-TEST-01 | P2-M6 | 公共 | 自动化测试 | 越权、幂等、计费复算、费用调整、对账勾稽、核销、反核销、标签、差异、位置、文件和隐私测试 | P0 | 待开始 | 0% | 不适用 | 全部 P0 决策 | 所有 P0 模块 | 待分配 | 待排期 | 待排期 | 原型覆盖不能代替自动化测试 | -| P2-REL-01 | P2-M6 | 公共 | 发布验收 | 初始化业务/财务基础数据、迁移、联调、勾稽检查、验收和发布 | P0 | 待开始 | 0% | 不适用 | 全部 P0 决策 | P2-TEST-01 | 待分配 | 待排期 | 待排期 | 需求基线确认后才能承诺排期 | +| P2-BASE-01 | P2-M0 | 公共 | 到仓契约 | 状态、枚举、权限、事件、错误码和快照模型 | P0 | 待开始 | 0% | 部分 | - | 一期订单契约 | 待分配 | 待排期 | 待排期 | 按已确认到仓规则建设 | +| P2-BASE-02 | P2-M0 | 公共 | 数据模型 | 到仓单、批次、处理单元、标签、测量、差异、库位、位置、费用和审计 | P0 | 待开始 | 0% | 部分 | - | P2-BASE-01 | 待分配 | 待排期 | 待排期 | 不包含后续财务对象 | +| P2-ADM-01 | P2-M1 | 后台 | 到仓列表 | 查询、筛选、分页、详情、空态和异常态 | P0 | 待开始 | 0% | 较完整 | - | P2-BASE-01 | 待分配 | 待排期 | 待排期 | 后台原型可参考 | +| P2-ADM-02 | P2-M1 | 后台 | 预约结果 | 记录、调整和取消线下预约结果 | P0 | 待开始 | 0% | 部分 | - | P2-ADM-01 | 待分配 | 待排期 | 待排期 | 不建设容量调度和自动分配 | +| P2-CLI-01 | P2-M1 | 客户端 | 到仓预报 | 取货/送货方式、联系人、仓库和货物摘要提交 | P0 | 待开始 | 0% | 部分 | - | P2-BASE-01 | 待分配 | 待排期 | 待排期 | 预约在线下完成 | +| P2-WH-01 | P2-M2 | 后台 | 到仓签到 | 识别到仓单、分批收货、交接和异常登记 | P0 | 待开始 | 0% | 部分 | - | P2-BASE-02 | 待分配 | 待排期 | 待排期 | 不建设无预报认领 | +| P2-LABEL-01 | P2-M2 | 后台 | 处理单元标签 | 编码、佳博 1324D 适配、失败重试、补打、换标和作废 | P0 | 待开始 | 0% | 部分 | 设备参数核验 | P2-WH-01 | 待分配 | 待排期 | 待排期 | 开发前完成实机核验 | +| P2-REV-01 | P2-M2 | 后台 | 收货冲正 | 错绑企业/订单/到仓单的审批、解绑和重绑 | P0 | 待开始 | 0% | 无 | - | P2-WH-01 | 待分配 | 待排期 | 待排期 | 原记录不可删除 | +| P2-WH-02 | P2-M3 | 后台 | 入库测量 | 原始测量、三位向上取整、复测、照片和历史复算 | P0 | 待开始 | 0% | 较完整 | - | P2-LABEL-01 | 待分配 | 待排期 | 待排期 | 照片必传并保留技术安全控制 | +| P2-DIFF-01 | P2-M3 | 公共 | 差异计算 | 申报实测对比、差异记录、通知状态和审计 | P0 | 待开始 | 0% | 部分 | - | P2-WH-02 | 待分配 | 待排期 | 待排期 | 差异不阻塞主流程 | +| P2-ADM-03 | P2-M3 | 后台 | 差异通知 | 查看、补充说明、通知客户和关闭记录 | P0 | 待开始 | 0% | 部分 | - | P2-DIFF-01 | 待分配 | 待排期 | 待排期 | 只记录和通知 | +| P2-CLI-02 | P2-M3 | 客户端 | 差异查看 | 查看实测、公开照片和差异通知 | P1 | 待开始 | 0% | 部分 | - | P2-DIFF-01 | 待分配 | 待排期 | 待排期 | 不提供客户确认动作 | +| P2-HOLD-01 | P2-M3 | 公共 | 异常记录 | 非差异类异常、责任人、证据、处理结果和审计 | P1 | 待开始 | 0% | 部分 | - | P2-BASE-02 | 待分配 | 待排期 | 待排期 | 不建设隔离区或差异暂停 | +| P2-LOC-01 | P2-M4 | 后台 | 库位维护 | 库区、库位编码、状态和权限范围 | P0 | 待开始 | 0% | 较完整 | - | P2-BASE-02 | 待分配 | 待排期 | 待排期 | 不做容量校验 | +| P2-PUT-01 | P2-M4 | 后台 | 上架任务 | 创建、分配、拆分、异常和完成 | P0 | 待开始 | 0% | 较完整 | - | P2-LOC-01、P2-WH-02 | 待分配 | 待排期 | 待排期 | 不做隔离上架 | +| P2-POS-01 | P2-M4 | 公共 | 位置记录 | 处理单元当前位置和进入/移出历史 | P0 | 待开始 | 0% | 部分 | - | P2-PUT-01 | 待分配 | 待排期 | 待排期 | 二期不建设完整库存系统 | +| P2-SEC-01 | P2-M0 | 公共 | 文件与保留 | 文件鉴权、类型/安全校验、访问审计、永久保存和备份边界 | P0 | 待开始 | 0% | 无 | - | P2-WH-01 | 待分配 | 待排期 | 待排期 | 产品不设业务大小上限 | +| P2-TIME-01 | P2-M6 | 公共 | 时间线通知 | 对客事件、差异通知和失败补偿记录 | P1 | 待开始 | 0% | 部分 | - | 核心流程完成 | 待分配 | 待排期 | 待排期 | 外部通知渠道另行配置 | +| P2-FEE-01 | P2-M5 | 后台 | 费用项目 | 头程费用项目、单位、币种、税务属性和启停 | P0 | 需求确认中 | 0% | 较完整 | Q14 | P2-BASE-01 | 待分配 | 待排期 | 待排期 | 仅头程费用白名单 | +| P2-RATE-01 | P2-M5 | 后台/服务端 | 计费规则 | 规则维度、版本、生效区间、价格结构和发布 | P0 | 需求确认中 | 0% | 部分 | Q15 | P2-FEE-01 | 待分配 | 待排期 | 待排期 | 复杂度按会议结论裁剪 | +| P2-CALC-01 | P2-M5 | 服务端 | 计费引擎 | 规则匹配、试算、事件触发、幂等、三位向上取整和复算 | P0 | 需求确认中 | 0% | 无 | Q16 | P2-RATE-01、P2-WH-02 | 待分配 | 待排期 | 待排期 | 保存输入、规则和计算快照 | +| P2-FEE-02 | P2-M5 | 后台 | 头程费用明细 | 自动/人工费用、确认、调整、作废、查询、导出和审计 | P0 | 需求确认中 | 0% | 较完整 | Q16 | P2-CALC-01 | 待分配 | 待排期 | 待排期 | 不生成应收应付或账单 | +| P2-TEST-01 | P2-M6 | 公共 | 自动化测试 | 越权、幂等、测量舍入、计费复算、标签、差异、位置、文件和审计 | P0 | 待开始 | 0% | 不适用 | Q14-Q16 | 所有 P0 模块 | 待分配 | 待排期 | 待排期 | 验证不会产生后续财务数据 | +| P2-REL-01 | P2-M6 | 公共 | 发布验收 | 初始化仓库、库位、测量规则、标签和费用基础数据,联调、验收和发布 | P0 | 待开始 | 0% | 不适用 | Q14-Q16 | P2-TEST-01 | 待分配 | 待排期 | 待排期 | 需求基线确认后承诺排期 | ## 四、里程碑 -| 里程碑 | 交付目标 | 状态 | 进度 | 进入条件 | 计划完成 | +| 里程碑 | 交付目标 | 状态 | 开发进度 | 进入条件 | 计划完成 | |---|---|---|---:|---|---| -| P2-M0 规则锁定 | 业务决策、到仓/财务契约、数据关系和权限基线确认 | 需求确认中 | 42% | 一期订单及基础资料契约稳定 | 待排期 | -| P2-M1 到仓预报 | 预约取货、送货预报和平台调度闭环 | 待开始 | 0% | Q2、Q3 确认 | 待排期 | -| P2-M2 到仓收货 | 签到、分批收货、标签、异常、冲正和照片可追溯 | 待开始 | 0% | Q1、Q8、Q10 及标签参数确认 | 待排期 | -| P2-M3 测量差异 | 实测、复算、差异、客户确认和隔离闭环 | 待开始 | 0% | Q4、Q5、Q6 确认 | 待排期 | -| P2-M4 库位上架 | 库位、上架任务和位置历史可查 | 待开始 | 0% | Q7、Q9 确认 | 待排期 | -| P2-M5 计费财务 | 计费、应收应付、对账、核销和利润闭环可用 | 需求确认中 | 0% | Q13-Q16 确认,P2-M3 实测数据可用 | 待排期 | -| P2-M6 联调验收 | 跨端联调、安全、勾稽、测试、初始化和发布完成 | 待开始 | 0% | P2-M1 至 P2-M5 验收通过 | 待排期 | +| P2-M0 规则锁定 | 到仓契约、数据关系、权限和文件基线 | 待开始 | 0% | 一期订单及基础资料契约稳定 | 待排期 | +| P2-M1 到仓预报 | 取货/送货预报和线下预约结果可记录 | 待开始 | 0% | 收货仓 API 可用 | 待排期 | +| P2-M2 到仓收货 | 签到、分批收货、标签、照片和冲正可追溯 | 待开始 | 0% | 文件服务、仓库权限及标签设备可用 | 待排期 | +| P2-M3 测量差异 | 原始测量、三位向上取整、差异记录和通知可用 | 待开始 | 0% | 测量规则可用 | 待排期 | +| P2-M4 库位上架 | 库位、上架任务和位置历史可查 | 待开始 | 0% | 库位编码规则确认 | 待排期 | +| P2-M5 头程计费 | 费用项目、规则版本、试算、调整和费用明细可用 | 需求确认中 | 0% | Q14-Q16 确认,P2-M3 可用 | 待排期 | +| P2-M6 联调验收 | 跨端联调、安全、幂等、复算、测试和发布完成 | 待开始 | 0% | P2-M1 至 P2-M5 验收通过 | 待排期 | -## 五、原型映射 +## 五、原型映射与范围边界 -| 流程/能力 | 原型依据 | 覆盖判断 | 二期任务 | 缺口或边界 | -|---|---|---|---|---| -| 预约取货/送货上门 | 入库单提货方式、提货时间和联系人字段 | 部分 | P2-ADM-02、P2-SCH-01、P2-CLI-01 | 缺服务商分配、时间窗容量、改期和爽约规则 | -| 到仓收货 | 海外仓入库单的待到仓、收货中、已上架状态 | 部分 | P2-WH-01、P2-REV-01 | 缺分批收货、待认领和冲正闭环 | -| 入库测量 | 入库单测量、测量审核、原单/实测对比 | 较完整 | P2-WH-02 | 缺计算规则版本、精度、舍入和历史复算 | -| 差异核对 | 审核通过/不通过、失败原因、是否扣货 | 部分 | P2-DIFF-01、P2-ADM-03、P2-CLI-02、P2-HOLD-01 | 缺阈值、客户确认、隔离和释放规则 | -| 指定库位 | 库位维护、最大承重、上架任务和上架状态 | 较完整 | P2-LOC-01、P2-PUT-01、P2-POS-01 | 缺容量强校验、隔离区和位置历史契约 | -| 标签打印 | 唛头导出、打印列表、Zebra/HP 打印机示例 | 部分 | P2-LABEL-01 | 二期实际设备为佳博 1324D,需实机适配 | -| 费用与应收应付 | 费用项目、客户应收应付、供应商费用 | 较完整 | P2-FEE-01、P2-FEE-02、P2-ARAP-01 | 缺规则版本、幂等、红冲和权限契约 | -| 对账与核销 | 客户/供应商对账、结算单应收应付、收付款状态 | 较完整 | P2-RECON-01、P2-CLI-03、P2-CASH-01 | 缺多对多核销、反核销和勾稽规则 | -| 发票与利润 | 发票状态、利润表、收入成本明细 | 部分 | P2-INV-01、P2-PROFIT-01 | 外部开票不纳入;利润和汇率采用原型基线 | -| PDA | 头程“03 出仓”PDA 拣货原型 | 不纳入二期 | - | 二期到仓不接 PDA,待业务确认边界 | -| 完整库存/WMS | 库存查询、理货、盘点、出库等原型 | 不纳入二期 | - | 二期仅维护处理单元和位置记录 | +| 流程/能力 | 原型覆盖 | 二期任务 | 二期处理 | +|---|---|---|---| +| 取货/送货预报 | 部分 | P2-ADM-02、P2-CLI-01 | 记录线下预约结果,不做容量调度 | +| 到仓收货 | 部分 | P2-WH-01、P2-REV-01 | 分批收货和冲正;不建设无预报认领 | +| 入库测量 | 较完整 | P2-WH-02 | 补充规则版本、三位向上取整和历史复算 | +| 差异核对 | 部分 | P2-DIFF-01、P2-ADM-03、P2-CLI-02 | 只记录和通知,不需要客户确认、不阻塞后续流程 | +| 指定库位 | 较完整 | P2-LOC-01、P2-PUT-01、P2-POS-01 | 不做容量校验和隔离区 | +| 标签打印 | 部分 | P2-LABEL-01 | 使用佳博 1324D 实机适配 | +| 头程费用 | 部分 | P2-FEE-01、P2-RATE-01、P2-CALC-01、P2-FEE-02 | 只做费用项目、规则、试算、调整和明细 | +| 应收应付、对账、收付款、核销 | 原型存在 | - | 不纳入二期 | +| 发票、汇率结算、利润和财务报表 | 原型存在 | - | 不纳入二期 | +| PDA | 有“03 出仓”原型 | - | Q9 暂缓,二期不接 PDA | +| 完整库存/WMS | 原型存在 | - | 二期只维护处理单元位置记录 | ## 六、需求确认进度 -| 编号 | 状态 | 主题 | 产品结论 | 涉及业务角色 | -|---|---|---|---|---| -| P2-Q1 | 确认中 | 少货到仓单人工关闭 | 方向已确认,关闭权限、条件、凭证和通知待补 | 仓库、平台运营 | -| P2-Q2 | 已确认 | 预约取货服务商类型 | 不走系统服务商调度,人工添加费用项目 | 业务、调度 | -| P2-Q3 | 已确认 | 精确时间或预约时间窗 | 人工线下预约时间,系统记录结果 | 仓库、调度 | -| P2-Q4 | 确认中 | 实测单位和计费公式 | 公式方向已确认,含义、单位、计费重和舍入待补 | 仓库、财务/计费 | -| P2-Q5 | 确认中 | 差异阈值和客户确认 | 确认方向已明确,拒绝、超时和阻塞规则待补 | 业务、仓库、客服 | -| P2-Q6 | 确认中 | 隔离区释放规则 | 不设隔离区,暂停位置、解除权限和条件待补 | 仓库、业务 | -| P2-Q7 | 已确认 | 库位容量校验口径 | 当前不做库位容量校验 | 仓库 | -| P2-Q8 | 确认中 | 到仓照片必传节点 | 照片类型已明确,必传粒度和附件规则待补 | 仓库、客服 | -| P2-Q9 | 暂缓 | 二期是否使用 PDA | 临时按二期不接 PDA 处理 | 仓库、产品 | -| P2-Q10 | 暂缓 | 无预报货物认领和超期处理 | 临时禁止直接绑定企业订单 | 仓库、平台运营 | -| P2-Q11 | 确认中 | 敏感数据和凭证保存期限 | 12 个月已明确,起算点和到期处理待补 | 业务、法务、运维 | -| P2-Q12 | 已确认 | 标签打印设备 | 佳博 1324D 热敏标签打印机 | 业务 | -| P2-Q13 | 待确认 | 二期计费财务闭环终点 | 待确认 | 产品、业务、财务、技术 | -| P2-Q14 | 待确认 | 首批费用项目及收付方向 | 待确认 | 业务、财务/计费 | -| P2-Q15 | 待确认 | 计费维度、阶梯和最低收费 | 待确认 | 业务、财务/计费 | -| P2-Q16 | 待确认 | 费用生成和锁定节点 | 待确认 | 业务、仓库、财务/计费 | -| P2-Q17 | 原型基线 | 币种、本位币和汇率 | CNY 本位币,保存原币、人工汇率和锁定快照 | 财务 | -| P2-Q18 | 原型基线 | 税务、金额精度和舍入 | 保存未税、税率、税额、含税;金额 2 位、汇率 6 位 | 财务/税务 | -| P2-Q19 | 原型基线 | 人工费用调整和审批 | 经办提交、财务审核,生效后只允许调整或红冲 | 财务、内控 | -| P2-Q20 | 原型基线 | 对账方式和结算周期 | 按选择或截止时间生成,保存结算期间和账期 | 业务、财务、客服 | -| P2-Q21 | 原型基线 | 对账审核、确认和争议 | 审核、确认、拒绝、锁定,争议产生新版本 | 业务、财务、客服 | -| P2-Q22 | 原型基线 | 收付款与核销规则 | 线下收付、部分核销和反核销,不含预收及跨币种 | 财务、内控 | -| P2-Q23 | 原型基线 | 发票管理边界 | 只登记,不接外部开票平台 | 财务/税务、产品 | -| P2-Q24 | 原型基线 | 利润口径与查看权限 | 生效应收减应付,利润率为利润÷收入,财务授权可见 | 财务、管理层 | +| 状态 | 数量 | 编号 | 说明 | +|---|---:|---|---| +| 已确认 | 12 | Q1-Q8、Q10-Q13 | 到仓规则和“仅头程计费”已进入基线 | +| 暂缓 | 1 | Q9 | 二期不接 PDA | +| 待确认 | 3 | Q14-Q16 | 费用白名单、计费复杂度、费用生成节点 | +| 不纳入二期 | 8 | Q17-Q24 | 后续财务与结算能力 | -## 七、状态维护规则 +## 七、测试与验收重点 -- 状态统一使用:需求确认中、待开始、进行中、联调中、测试中、已完成、已阻塞。 -- 原型覆盖统一使用:较完整、部分、无、不适用;不得把“较完整”换算为开发进度。 -- 负责人、计划开始和计划完成由排期会议填写;在需求基线确认前保持“待分配/待排期”。 -- 开始编码后才可以填写大于 0% 的开发进度;开发、测试和验收均完成后才更新为“已完成”。 -- 需求确认结论先回写 [二期需求确认清单](二期需求确认清单.md),再同步更新本表、开发规划、任务依赖和验收标准。 +- 企业和仓库数据权限隔离有效,越权请求被服务端拒绝。 +- 重复签到、标签、测量、上架和计费事件不产生重复有效记录。 +- 原始测量、三位向上取整结果、规则版本、复测原因和操作者可追溯。 +- 差异能够通知客户并留痕,但不会等待客户确认或阻塞上架、计费。 +- 称重和测量照片必传;文件类型、恶意内容、越权访问和技术大小上限校验有效。 +- 佳博 1324D 完成内容、尺寸、连续打印、缺纸、断电和失败重试验证。 +- 系统不存在隔离区、待认领区、无预报认领或库位容量拦截的隐藏流程。 +- 费用可追溯到来源事件、计费输入和规则版本,历史费用复算一致。 +- 已确认费用不能静默覆盖,调整、作废和导出均有审计。 +- 系统不产生应收、应付、对账单、收付款、核销、发票、利润或总账数据。 + +## 八、状态维护规则 + +- 开发状态统一使用:需求确认中、待开始、进行中、联调中、测试中、已完成、已阻塞。 +- 原型覆盖统一使用:较完整、部分、无、不适用;原型覆盖不得换算为开发进度。 +- 负责人、计划开始和计划完成由排期会议填写;未获得实际数据时保持“待分配/待排期”。 +- 开始编码后才能填写大于 0% 的开发进度;开发、测试和验收完成后才能标记“已完成”。 +- 需求结论先回写 [二期需求确认清单](二期需求确认清单.md),再同步本表、开发规划、任务依赖和验收标准。 diff --git a/二期/二期计费财务模块规划.md b/二期/二期计费财务模块规划.md index 1122f02..4e32237 100644 --- a/二期/二期计费财务模块规划.md +++ b/二期/二期计费财务模块规划.md @@ -1,167 +1,117 @@ -# 虫虫出海二期计费与财务模块规划 +# 虫虫出海二期头程计费模块规划 > 创建日期:2026-07-28 -> 状态:开发已启动,范围确认并行 +> 更新日期:2026-07-31 +> 状态:产品已确认范围,计费规则细节确认中 +> 历史文件名保留:`二期计费财务模块规划.md` > 关联规划:[二期开发规划](二期开发规划.md) -> 原型依据:`docs/悦/货代SAAS平台后台/货代SaaS平台原型.html`、`docs/悦/头程下单/柏悦客户端.html` +> 产品确认记录:[2026-07-31 二期产品确认合并记录](产品回传/2026-07-31-产品确认合并记录.md) -## 一、建设目标 +## 一、产品确认的范围结论 -二期在“02 到仓”作业闭环上增加最小可用的计费与财务闭环,使每票到仓业务能够回答:按什么规则计费、产生了哪些应收和应付、是否完成对账、已收付多少、剩余多少,以及本票业务的收入、成本和毛利是多少。 +二期只做头程业务的费用计算,不建设后续财务闭环。计费结果是头程订单的业务费用明细,不自动形成应收、应付、账单、付款、核销、发票或利润数据。 ```text -到仓实测/业务事件 - ↓ -费用规则匹配与试算 - ↓ -费用审核、调整与锁定 - ↓ -应收 / 应付费用台账 - ↓ -客户 / 供应商对账单 - ↓ -收付款登记与核销 - ↓ -单票利润与财务状态 +头程订单 / 到仓实测 / 业务事件 + ↓ +费用项目与计费规则匹配 + ↓ +费用试算与计算过程快照 + ↓ +人工补录 / 调整 / 审核 + ↓ +头程费用明细确认 ``` ## 二、二期纳入范围 -### 1. 费用项目与计费规则 +### 1. 头程费用项目 -- 维护费用项目、应收/应付方向、默认币种、计费单位、税务属性和启停状态。 -- 计费规则支持客户、供应商/往来单位、仓库、服务类型、货物属性、生效日期和失效日期等适用维度。 -- 支持按票、箱、托、件、重量、体积、计费重、次数和固定金额计费;阶梯价、最低收费和封顶规则是否进入二期由业务确认。 -- 规则必须版本化。历史费用保存规则版本、计费输入、计算过程和结果快照,不因新规则发布而变化。 -- 二期的计费规则用于实际业务计费,不等同于对客询价或正式报价体系。 +- 维护费用编码、名称、费用性质、计费单位、默认币种、税率/税务属性、启停状态和适用业务阶段。 +- 费用项目只覆盖头程及“02 到仓”实际使用的费用,不因原型存在而自动纳入。 +- 费用白名单由 P2-Q14 确认;白名单外费用允许人工补录时,必须记录原因和操作者。 -### 2. 费用生成与调整 +### 2. 计费规则版本 -- 到仓签到、实测确认、异常处理或指定库位完成后,根据已确认的触发节点生成费用草稿。 -- 自动费用与人工费用均关联订单、到仓单、收货批次或处理单元,并记录客户/供应商、费用项目、数量、单价、币种、汇率、税额和来源。 -- 同一业务事件重复投递不得重复生成费用;费用生成使用稳定来源键保证幂等。 -- 费用支持试算、待审核、生效、已锁定、已冲销和作废状态。 -- 生效费用不允许直接覆盖。调整通过新增调整行或红冲行处理,并保留原因、原记录、申请人和审核人。 +- 规则支持按客户、往来单位、仓库、服务类型、货物属性和生效区间等维度匹配,最终维度由 P2-Q15 确认。 +- 支持固定金额和“数量 × 单价”的基础计费;阶梯价、最低收费、封顶和组合价未确认前不写死。 +- 每次规则发布生成新版本。历史费用保存规则版本、计费输入和计算结果快照,不因新版本发布而改变。 -### 3. 应收与应付 +### 3. 费用生成与试算 -- 应收面向客户企业,应付面向快递公司、仓库服务商或其他往来单位。 -- 支持按订单、到仓单、客户、供应商、费用项目、币种、审核状态和结算状态查询。 -- 应收和应付分别授权;客户侧永不返回供应商成本、内部利润和内部调整备注。 -- 多币种费用按原币保存,不允许直接跨币种相加;折算金额使用锁定汇率和汇率日期。 +- 费用可由头程订单、到仓实测、上架或其他已确认业务事件触发,具体节点由 P2-Q16 确认。 +- 同一来源事件使用稳定来源键,重复投递不得重复生成费用。 +- 费用计算保存原始数量、计费数量、单价、单位、币种、税率、金额、规则版本和计算过程。 +- 测量和计费业务结果按产品确认执行“小数点三位向上取整”,同时保存未舍入原始值。 -### 4. 对账单与账单 +### 4. 费用明细与调整 -- 支持按票结算或按结算周期汇总生成客户/供应商对账单。 -- 对账单包含期初、当期费用、调整、已核销、未核销、结算起止日期和到期日。 -- 支持草稿、待审核、待对方确认、已确认、有争议、已关闭和已作废状态。 -- 对账单确认后锁定明细;争议通过退回、调整费用和重新生成版本处理,不直接修改已确认版本。 -- 企业客户端可以查看账单列表和明细、确认或提出异议;二期供应商对账采用后台登记确认结果,不建设供应商端。 +- 支持自动生成和人工补录的头程费用明细。 +- 费用状态采用:草稿、已试算、已确认、已作废。 +- 已确认费用不直接覆盖;修改通过调整记录处理,保留原费用、调整前后值、原因、操作者和时间。 +- 支持按订单、到仓单、费用项目、客户、仓库、币种和状态查询、查看计算明细与导出。 -### 5. 收付款与核销 +### 5. 权限与审计 -- 二期支持线下收款、付款、退款和调整的登记,不接在线支付渠道。 -- 支持部分核销、一笔收付款核销多张账单、一张账单被多笔收付款核销。 -- 保存交易日期、往来单位、金额、币种、流水号、凭证、经办人和审核记录。 -- 已审核核销不得删除;错误处理采用反核销或冲正,并保留完整审计链。 -- 二期不纳入预收、预付及跨币种核销;确需支持时按范围变更处理。 +| 角色 | 权限 | +|---|---| +| 计费专员 | 维护费用草稿、执行试算、人工补录和发起调整 | +| 计费审核员 | 确认费用、审核调整和作废 | +| 计费管理员 | 维护费用项目、规则版本和计费权限 | +| 客服/运营 | 查看授权订单的对客费用,不维护规则 | +| 企业客户 | 是否展示头程费用明细由客户端范围决定;不得查看内部备注或其他企业数据 | -### 6. 发票与利润 +费用项目、规则发布、试算、人工补录、调整、确认、作废和导出均需记录审计日志。 -- 二期只登记发票申请、发票号码、金额、税率、开票/收票日期、状态和附件,不直接连接电子税局。 -- 单票利润按已生效应收减已生效应付计算,同时展示未对账、未核销和异常费用提示。 -- 利润报表至少支持按订单、客户、供应商、仓库和月份筛选;不同币种先按锁定汇率折算到本位币。 -- 利润和成本只向财务及授权管理角色开放。 +## 三、二期明确不纳入 -## 三、明确不纳入二期 +- 应收、应付台账及账龄。 +- 客户或供应商对账单、结算周期、账单确认和争议处理。 +- 收款、付款、退款、部分核销、多对多核销和反核销。 +- 发票申请、开票/收票登记、电子税局或第三方开票接口。 +- 汇率结算、汇兑差额、本位币折算、单票利润和利润率报表。 +- 在线支付、银企直连、银行流水自动认领。 +- 会计科目、会计凭证、总账和法定财务报表。 -- 对客询价、报价审批、报价转订单和合约报价体系。 -- 在线支付、支付网关、自动扣款、银企直连和银行流水自动认领。 -- 电子税局或第三方开票平台直连、税务申报和税控设备集成。 -- 会计科目、会计凭证、总账、资产负债表、现金流量表及法定财务报表。 -- 自动获取外部汇率;二期由财务维护并锁定业务使用汇率。 -- 预算、资金计划、信用保险和复杂授信管理。 +原型中的上述页面仅作为后续阶段参考,不进入二期任务、排期或验收。 -## 四、角色与权限 - -| 角色 | 主要权限 | 数据边界 | -|---|---|---| -| 计费专员 | 维护费用草稿、试算、发起调整 | 授权客户、仓库和业务范围 | -| 财务审核员 | 审核费用、对账单、收付款和核销 | 平台授权范围 | -| 财务管理员 | 维护费用项目、规则、汇率、结算参数和财务权限 | 平台授权范围 | -| 客服/运营 | 查看对客费用、发起对账、处理争议 | 授权客户范围,不可查看供应商成本和利润 | -| 企业客户 | 查看本企业账单、明细、付款状态并确认或提出异议 | 当前企业 | -| 平台管理员 | 配置角色权限和审计查询 | 不因管理员身份默认获得财务明细权限 | - -关键动作至少拆分为:规则发布、费用新增、费用调整、费用审核、对账单审核、收款登记、付款登记、核销、反核销、发票登记、利润查看和财务导出。 - -## 五、核心数据对象 +## 四、核心数据对象 | 数据对象 | 关键内容 | |---|---| -| 费用项目 | 编码、名称、应收/应付方向、计费单位、默认币种、税务属性和状态 | -| 计费规则版本 | 适用客户/供应商/仓库/服务、计费方式、阶梯、最低价、币种、生效区间和版本状态 | -| 费用记录 | 业务来源、应收/应付、往来方、计费输入、单价、金额、税额、币种、汇率、规则快照和状态 | -| 费用调整 | 原费用、调整类型、差额、原因、申请人、审核人和冲销链 | -| 对账单 | 对账对象、结算周期、币种、期初、费用、调整、核销、余额、到期日、状态和版本 | -| 对账单明细 | 对账单、费用记录、业务单据、原币金额、折算金额和争议状态 | -| 收付款记录 | 收/付/退/调、往来方、金额、币种、日期、流水号、凭证和审核状态 | -| 核销记录 | 收付款记录、账单/费用、核销金额、汇兑差额、操作者、时间和冲正关系 | -| 发票记录 | 发票方向、抬头、税号、号码、金额、税率、日期、状态、附件和关联账单 | -| 汇率版本 | 原币、目标币、汇率、汇率日期、来源、审核人和锁定状态 | +| 费用项目 | 编码、名称、费用性质、计费单位、默认币种、税务属性、业务阶段和状态 | +| 计费规则版本 | 适用范围、计费方式、价格参数、生效区间、版本号、发布状态和审计信息 | +| 费用计算记录 | 业务来源、来源键、计费输入、规则版本、原始结果、舍入结果和计算时间 | +| 头程费用明细 | 订单/到仓单、费用项目、数量、单价、单位、币种、税率、金额、来源和状态 | +| 费用调整记录 | 原费用、调整前后值、原因、操作者、审核结果和时间 | -所有金额使用定点小数,不使用浮点数。金额和税额保留 2 位、业务汇率保留 6 位,由服务端统一四舍五入;原币金额、折算金额和使用汇率必须同时保存。 +金额和计量值使用定点小数,不使用浮点数。原始值、三位向上取整结果和规则版本必须同时可追溯。 -## 六、开发任务建议 +## 五、开发任务 | ID | 端 | 模块 | 交付内容 | 优先级 | 依赖 | |---|---|---|---|---|---| -| P2-FEE-01 | 后台 | 费用项目 | 费用项目、方向、单位、币种、税务属性和启停 | P0 | P2-BASE-01 | -| P2-RATE-01 | 后台/服务端 | 计费规则 | 规则维度、版本、生效区间、阶梯/最低价和发布审核 | P0 | P2-FEE-01、P2-WH-02 | -| P2-CALC-01 | 服务端 | 计费引擎 | 规则匹配、试算、事件触发、幂等、计算快照和复算 | P0 | P2-RATE-01 | -| P2-FEE-02 | 后台 | 费用台账 | 自动/人工费用、审核、调整、红冲、锁定和审计 | P0 | P2-CALC-01 | -| P2-ARAP-01 | 后台 | 应收应付 | 客户应收、供应商应付、查询汇总、权限和导出 | P0 | P2-FEE-02、一期往来单位 | -| P2-RECON-01 | 后台 | 对账单 | 按票/月结生成、审核、确认、争议、版本和关闭 | P0 | P2-ARAP-01 | -| P2-CLI-03 | 客户端 | 账单中心 | 对客账单列表、明细、确认、异议和付款状态 | P0 | P2-RECON-01 | -| P2-CASH-01 | 后台 | 收付款核销 | 收付款登记、凭证、审核、部分核销、反核销和余额 | P0 | P2-RECON-01 | -| P2-INV-01 | 后台 | 发票登记 | 开票/收票申请、号码、金额、税率、状态和附件 | P1 | P2-RECON-01 | -| P2-PROFIT-01 | 后台 | 单票利润 | 收入、成本、毛利、毛利率、折算和权限控制 | P1 | P2-ARAP-01、汇率版本 | +| P2-FEE-01 | 后台 | 费用项目 | 费用项目、单位、币种、税务属性、业务阶段和启停 | P0 | P2-BASE-01、P2-Q14 | +| P2-RATE-01 | 后台/服务端 | 计费规则 | 规则维度、版本、生效区间、基础价格结构和发布审核 | P0 | P2-FEE-01、P2-Q15 | +| P2-CALC-01 | 服务端 | 计费引擎 | 规则匹配、试算、事件触发、幂等、三位向上取整、快照和复算 | P0 | P2-RATE-01、P2-Q16、P2-WH-02 | +| P2-FEE-02 | 后台 | 头程费用明细 | 自动/人工费用、确认、调整、作废、查询、导出和审计 | P0 | P2-CALC-01 | -## 七、启动前业务确认 +## 六、仍需确认的三项 -### 仍需产品确认 - -| 编号 | 待确认问题 | 当前建议 | +| 编号 | 待确认问题 | 回传处理 | |---|---|---| -| P2-Q13 | 二期计费财务做到哪一个闭环终点? | 做到线下收付款登记和核销,不做在线支付、会计凭证和总账 | -| P2-Q14 | “02 到仓”首批费用项目及应收/应付方向是什么? | 建立费用白名单,白名单外费用只允许人工新增并审核 | -| P2-Q15 | 计费规则需要哪些维度、阶梯和最低收费? | 至少支持客户、往来单位、仓库、服务和有效期;复杂价格结构按实际需要裁剪 | -| P2-Q16 | 各类费用在什么业务节点生成、审核和锁定? | 实测完成试算,差异确认后生效;其他费用按已确认事件生成 | +| P2-Q14 | “02 到仓”首批费用项目、计费单位、币种、税率和触发节点 | 回传中的“63”无业务含义,未合并 | +| P2-Q15 | 计费规则维度,以及是否支持阶梯价、最低收费、封顶、组合价和冲突优先级 | 回传中的“63”无业务含义,未合并 | +| P2-Q16 | 各类费用在哪个节点试算、生成、确认和作废,人工费用何时生效 | 回传中的“63”无业务含义,未合并 | -### 已由原型和实现基线确定 +P2-Q13 已确认:二期只做到头程费用计算。P2-Q17 至 P2-Q24 对应的应收应付、对账、收付款、发票、汇率结算和利润能力不适用于二期。 -| 编号 | 已确定结论 | 原型依据摘要 | -|---|---|---| -| P2-Q17 | 本位币 CNY;保存原币、人工业务汇率和折算金额,费用生效时锁定汇率快照 | 币种、汇率、CNY/USD/EUR 及人民币:美元汇率字段 | -| P2-Q18 | 保存未税金额、税率、税额、含税总额;金额/税额 2 位、汇率 6 位,服务端统一舍入 | 0%/6%/9%/13% 税率及税额、含税合计 | -| P2-Q19 | 经办提交、财务审核;生效费用只能调整、红冲或作废并留痕 | 新增、客服提交、财务通过等状态 | -| P2-Q20 | 支持按选择和按截止时间生成账单,保存结算期间、账期和到期日 | 两种生成账单入口及结算字段 | -| P2-Q21 | 账单审核、确认、拒绝、锁定和争议后新版本流程 | 待审核、审核通过、审核拒绝、待确认及明细/历史 | -| P2-Q22 | 线下收付款、部分收付、余额、核销和反核销;不含预收预付、跨币种和银行自动认领 | 待收款、部分收款、已结清、余额、支付历史和核销入口 | -| P2-Q23 | 只做发票信息和状态登记,不接外部开票平台 | 发票抬头、日期、状态、税率和税额字段 | -| P2-Q24 | 利润=已生效应收-已生效应付,利润率=利润÷收入;仅财务授权角色可见 | 收入、成本、利润、利润率及多维报表 | - -P2-Q13 至 P2-Q16 纳入 [二期需求确认清单](二期需求确认清单.md)。产品岗位空缺期间可先开发费用、账单和审计基础结构,但闭环范围、费用白名单、复杂价格规则和自动计费节点必须配置化;四项临时结论回写后再锁定最终业务流。P2-Q17 至 P2-Q24 不再要求重复确认。 - -## 八、验收重点 +## 七、验收重点 - 相同业务事件重试不会重复生成费用。 -- 历史费用使用保存的规则版本、计费输入和汇率能够复算一致。 -- 费用调整、红冲、核销和反核销形成不可删除的完整审计链。 -- 多币种不直接汇总;所有折算都能追溯到汇率版本和日期。 -- 对账单明细之和、调整、核销和余额能够勾稽一致。 -- 部分核销、多对多核销和反核销后的未结余额正确且不为负数。 -- 客户不能查看供应商成本、内部利润、内部备注或其他企业账单。 -- 未授权运营人员不能查看利润、付款和供应商成本。 -- 已确认对账单不能静默修改,重新计算必须生成调整或新版本。 -- 财务导出、凭证下载和敏感金额查询具有权限与审计记录。 +- 每条费用能够追溯到订单/到仓单、费用项目、规则版本、计费输入和来源事件。 +- 原始计算值和三位向上取整结果同时保存,历史费用能够复算一致。 +- 已确认费用不能静默覆盖,调整和作废具有完整审计链。 +- 禁用或更新规则不会改变历史费用结果。 +- 未授权用户不能查看、修改或导出其他企业、仓库或业务范围的费用。 +- 系统不产生应收应付、对账单、收付款、核销、发票或利润数据。 diff --git a/二期/二期计费财务需求确认表.md b/二期/二期计费财务需求确认表.md index 459e7ec..2101d4d 100644 --- a/二期/二期计费财务需求确认表.md +++ b/二期/二期计费财务需求确认表.md @@ -1,34 +1,52 @@ -# 二期计费财务需求确认表 +# 二期头程计费需求确认表 -> 用途:产品空缺期间由项目负责人组织确认原型无法决定、且会改变二期范围或计费模型的事项。 -> 不需要填写确认人和确认日期;状态为“临时基线”且有可开发结论时用于当前开发,产品到岗复核后改为“已确认”。 -> 关联文档:[二期计费与财务模块规划](二期计费财务模块规划.md) +> 更新日期:2026-07-31 +> 状态:产品已确认二期只做头程计费,当前仅剩 3 项计费细节待确认 +> 历史文件名保留:`二期计费财务需求确认表.md` +> 关联文档:[二期头程计费模块规划](二期计费财务模块规划.md)、[产品确认合并记录](产品回传/2026-07-31-产品确认合并记录.md) -## 一、需要产品确认的 4 项 +## 一、已确认的范围 -| 编号 | 需要产品确认的事项 | 当前建议 | 最终结论 | 状态 | +| 编号 | 产品结论 | 二期开发口径 | 状态 | +|---|---|---|---| +| P2-Q13 | 二期只做头程计费 | 建设头程费用项目、计费规则、费用试算、人工补录、调整、确认、作废和费用明细 | 已确认 | + +头程费用结果不自动形成应收、应付、对账单、收付款、核销、发票、利润或总账数据。 + +## 二、会议仍需确认的 3 项 + +| 编号 | 需要确认的事项 | 当前建议 | 最终结论 | 状态 | |---|---|---|---|---| -| P2-Q13 | 二期计费财务做到哪一个闭环终点? | 做到费用生成、应收应付、对账、线下收付款登记与核销、单票利润;不做在线支付、会计凭证和总账 | 待填写 | 待确认 | -| P2-Q14 | “02 到仓”首批费用项目白名单及应收/应付方向是什么? | 逐项给出费用编码、名称、方向、单位、默认币种和税率;未进白名单的费用只允许人工新增并审核 | 待填写 | 待确认 | -| P2-Q15 | 二期计费规则需要支持到什么复杂度? | 至少按客户、往来单位、仓库、服务类型和生效区间匹配;阶梯价、最低收费、封顶和组合价只实现业务明确需要的部分 | 待填写 | 待确认 | -| P2-Q16 | 各类费用在哪个业务节点生成、审核和锁定? | 实测完成生成试算,差异确认后生效并锁定;非测量费用按已确认业务事件生成 | 待填写 | 待确认 | +| P2-Q14 | “02 到仓”首批头程费用项目、计费单位、币种、税率/税务属性和触发节点 | 只纳入实际使用的头程费用;白名单外人工补录必须填写原因并留痕 | 待填写 | 待确认 | +| P2-Q15 | 计费维度,以及是否支持阶梯价、最低收费、封顶、组合价和冲突优先级 | 先支持客户、往来单位、仓库、服务类型和生效区间;复杂价格结构按实际需要裁剪 | 待填写 | 待确认 | +| P2-Q16 | 各类费用在哪个节点试算、生成、确认、调整和作废 | 实测完成生成试算;其他费用按已确认头程业务事件生成;稳定来源键保证幂等 | 待填写 | 待确认 | -## 二、原型已经明确,不再发产品确认 +产品回传中 Q14、Q15、Q16 出现的“63”没有明确业务含义,不作为产品结论合并。 -| 编号 | 采用的二期基线 | 原型依据 | +### P2-Q14 首批费用填写模板 + +| 费用编码 | 费用名称 | 费用性质 | 计费对象 | 计费单位 | 默认币种 | 默认税率 | 自动/人工 | 触发节点 | +|---|---|---|---|---|---|---|---|---| +| 待填写 | 待填写 | 待填写 | 待填写 | CNY | 待填写 | 待填写 | 待填写 | 待填写 | + +## 三、明确不纳入二期 + +| 编号 | 主题 | 二期处理 | |---|---|---| -| P2-Q17 | 本位币采用 CNY;费用保存原币、业务汇率和折算金额;二期人工维护汇率,不接外部汇率源,费用生效时锁定汇率快照 | 原型已有 CNY、USD、EUR、币种、汇率及“人民币:美元汇率”字段 | -| P2-Q18 | 保存未税金额、税率、税额和含税总额;税额按未税金额×税率计算;金额/税额保留 2 位、汇率保留 6 位并由服务端统一四舍五入 | 原型已有 0%、6%、9%、13% 税率及金额、税额、含税合计 | -| P2-Q19 | 经办提交、财务审核;生效费用不直接删除或覆盖,只能调整、红冲或作废并保留审计链 | 原型已有“新增、客服提交、财务通过”等审核状态;直接删除入口按财务审计要求收紧 | -| P2-Q20 | 支持勾选费用生成账单和按截止时间批量生成;账单保存结算起止日、账期和到期日,二期不额外建设复杂自动月结调度 | 原型已有“按选择生成账单”“按截止时间生成账单”、结算起止日和账期 | -| P2-Q21 | 账单按草稿/待审核/审核通过/审核拒绝/待确认/已关闭流转;确认后锁定,争议调整后生成新版本 | 原型已有待审核、审核通过、审核拒绝、待确认、账单明细和支付历史 | -| P2-Q22 | 支持线下收付款登记、部分收付、余额和核销;错误核销用反核销留痕;二期不做预收预付、跨币种核销和银行自动认领 | 原型已有待收款、部分收款、已结清、逾期、应付/已付/余额、支付历史和核销入口 | -| P2-Q23 | 二期仅登记开票/收票信息、税率、税额、日期、状态和附件,不接电子税局或第三方开票平台 | 原型只有发票抬头、开票日期、已开票/未开票、税率和税额,没有外部开票接口 | -| P2-Q24 | 单票利润=已生效应收-已生效应付;利润率=利润÷收入;支持按客户、货柜、单票和月份查看,仅财务授权角色可见 | 原型直接展示收入、成本、利润、利润率及相应查询维度 | +| P2-Q17 | 汇率结算和本位币折算 | 不纳入二期 | +| P2-Q18 | 财务税务结算口径 | 不纳入二期;费用项目如需税率字段,按 Q14 配置 | +| P2-Q19 | 财务费用审批、应收应付审批 | 不纳入二期;仅保留头程费用调整审计 | +| P2-Q20 | 客户/供应商对账和结算周期 | 不纳入二期 | +| P2-Q21 | 账单确认、争议和关闭 | 不纳入二期 | +| P2-Q22 | 收付款、核销、反核销和银行流水 | 不纳入二期 | +| P2-Q23 | 发票登记和外部开票平台 | 不纳入二期 | +| P2-Q24 | 利润、利润率和财务报表 | 不纳入二期 | -## 三、会议填写规则 +## 四、会议填写规则 + +- 认可当前建议:将建议复制到“最终结论”,状态改为“已确认”。 +- 修改当前建议:填写会议确定的可开发口径,状态改为“已确认”。 +- 暂时无法确定:状态改为“暂缓”,并写清二期临时处理方式。 +- 不需要填写确认人和确认时间。 +- 确认后保留本次会议文件,不覆盖产品原始回传;新一轮确认使用新版本文件名。 -- 认可当前建议:复制为临时结论,将“状态”改为“临时基线”。 -- 修改当前建议:填写会议确定的临时口径,再将“状态”改为“临时基线”。 -- 暂不确定:将“状态”改为“暂缓”,并填写二期临时处理方式。 -- P2-Q17 至 P2-Q24 已作为原型和安全实现基线,不再重复确认;产品到岗后如提出变更,再按需求变更流程更新。 diff --git a/二期/二期计费财务需求确认表.xlsx b/二期/二期计费财务需求确认表.xlsx index 44db5726e9d98249a18654f46e132daabb2cafaa..33192480097b52d280311beb18ae42e58e4eae3e 100644 GIT binary patch delta 8488 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 R2!!)+%RfYyg!I4P{vU3xR?GkZ delta 7086 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 diff --git a/二期/二期需求确认清单.md b/二期/二期需求确认清单.md index 8c81a15..4362ee6 100644 --- a/二期/二期需求确认清单.md +++ b/二期/二期需求确认清单.md @@ -1,319 +1,113 @@ -# 虫虫出海二期需求确认清单:头程到仓与计费财务 +# 虫虫出海二期需求确认清单:头程到仓与头程计费 > 创建日期:2026-07-28 -> 更新日期:2026-07-30 -> 当前状态:开发已启动;11 项待形成临时结论,13 项已有结论或原型基线 -> 确认范围:头程物流“02 到仓”及二期计费财务闭环 +> 更新日期:2026-07-31 +> 当前状态:产品已确认二期只做头程计费,3 项计费细节待补充 +> 确认范围:头程物流“02 到仓”及头程费用计算 > 关联规划:[二期开发规划](二期开发规划.md) -> 原型依据:[头程物流流程图](参考资料/头程物流流程图.svg) +> 原型依据:[头程物流流程图](参考资料/头程物流流程图.svg) +> 产品回传:[2026-07-31 产品确认合并记录](产品回传/2026-07-31-产品确认合并记录.md) ## 一、文档用途 -本清单用于组织业务、仓库、运营、财务和技术共同确认二期需求口径。产品岗位空缺期间由项目负责人主持;产品到岗后再对临时基线进行复核。确认重点不是页面长什么样,而是谁可以操作、什么条件可以推进、异常如何处理以及最终如何验收。 +本清单记录二期产品确认结果和仍需补齐的开发规则。产品已确认的结论直接进入基线;仍待确认的事项不得写成不可变的业务默认值,应保持配置化或可替换。二期由单一产品负责人统一确认,不记录确认人和确认时间;项目负责人组织业务、仓库、计费和技术共同补齐可开发结论。 -未形成结论的问题不得直接写成不可变的开发默认值。每项临时确认至少记录结论、适用范围和例外情况;状态为“临时基线”且结论可直接转为开发规则时,可用于当前开发。产品到岗复核后改为“已确认”;复核产生变化时按需求变更处理。 +二期财务边界已经确定:只做头程费用项目、计费规则、费用试算和头程费用明细,不做应收应付、对账、付款、核销、发票、汇率结算、利润或总账。 ## 二、确认参与人 | 参与方 | 主要职责 | |---|---| -| 项目负责人 | 产品空缺期间主持确认、记录临时结论、维护范围和验收口径 | -| 产品负责人 | 到岗后复核临时基线,处理范围变化和产品验收口径 | -| 业务/运营负责人 | 确认客户服务、调度、差异和异常处理规则 | -| 仓库负责人 | 确认收货、测量、照片、库位、标签和现场作业规则 | -| 财务/计费负责人 | 确认计费、币种汇率、税务、应收应付、对账、收付款、核销、发票和利润口径 | -| 法务/运维负责人 | 确认隐私数据、照片和凭证的保留与清理策略 | -| 技术负责人 | 评估可实现性、系统影响和数据迁移风险,不替代业务作决定 | +| 项目负责人 | 组织确认、维护本清单和临时基线 | +| 产品负责人 | 统一确认范围、业务结论和验收口径 | +| 业务/运营负责人 | 确认头程业务、差异、异常和费用场景 | +| 仓库负责人 | 确认收货、测量、照片和现场作业规则 | +| 财务/计费负责人 | 确认头程费用项目、计费维度和计算节点,不扩展到财务结算 | +| 技术负责人 | 评估可实现性、数据影响和迁移风险 | -## 三、确认顺序 +## 三、当前仍需确认的 3 项 -建议按以下顺序召开确认会,前一组结论可能影响后一组的数据和流程设计: - -1. 到仓与调度:补充 P2-Q1、P2-Q10。 -2. 测量与差异:补充 P2-Q4、P2-Q5、P2-Q6、P2-Q8。 -3. 合规与保留:补充 P2-Q11。 -4. 计费与财务:确认 P2-Q13 至 P2-Q16。 -5. 原型基线复核:P2-Q17 至 P2-Q24 仅在产品要求变更时讨论。 -6. 汇总评审:核对跨问题冲突,更新规划基线、任务依赖和验收标准。 - -## 四、会议确认主表 - -会议时只维护本表的“临时结论”和“状态”。已有方向不是可开发结论,项目负责人需要组织相关业务角色将例外情况、权限、节点或临时处理方式补充完整。 - -| 编号 | 已有结论/原型情况 | 本次会议必须确定 | 当前建议 | 临时结论(会议填写) | 状态 | +| 编号 | 原型/回传情况 | 本次需要确定 | 当前建议 | 临时结论 | 状态 | |---|---|---|---|---|---| -| P2-Q1 | 已提出“以实际货物入库为准”;原型没有少货关闭流程 | 谁能关闭;关闭条件;原因、照片或交接凭证是否必填;是否通知客户 | 收货员登记少货,仓库主管关闭;必填原因并保留凭证;关闭后通知客户 | 待填写 | 确认中 | -| P2-Q4 | 已给出“毛重÷363”和“(长×宽×高÷6000)×箱数”;原型有 cm、kg、m³ 和材积重 | `/363` 的业务含义;输入单位;计费重取值;精度和舍入 | 长 cm、重量 kg、体积 m³;保留原始值和公式版本;最终结果统一四舍五入 | 待填写 | 确认中 | -| P2-Q5 | 已确认差异需要客户确认;原型没有拒绝和超时规则 | 是否所有差异都确认;拒绝或超时如何处理;确认前是否暂停上架和计费 | 数量、重量、体积、破损及归属差异均需确认;确认前暂停后续作业,拒绝后转人工处理 | 待填写 | 确认中 | -| P2-Q6 | 已确认没有独立隔离区 | 差异期间货物放置方式;谁能解除业务暂停;解除条件 | 保持当前物理位置并标记业务暂停;客户确认且仓库主管复核后解除 | 待填写 | 确认中 | -| P2-Q8 | 已确认上传称重照片和测量照片;原型没有附件规则 | 是否必传;按箱件还是收货批次上传;数量、大小、格式和补传规则 | 每个收货批次必传称重、测量照片;允许补传但保留首次提交和补传记录 | 待填写 | 确认中 | -| P2-Q10 | 已暂缓无预报货物认领;原型没有临时处理方式 | 暂缓期间拒收还是允许线下登记待认领;如允许,谁能绑定订单 | 二期系统拒绝将无预报货物直接绑定企业订单;线下处置,不进入正式库存和计费 | 待填写 | 暂缓 | -| P2-Q11 | 已确认保存 12 个月;原型没有保留策略 | 起算时间;到期删除还是归档;联系方式、照片、凭证和审计是否同期限 | 从业务单关闭日起算;联系方式匿名化,照片和凭证到期删除,审计记录归档 | 待填写 | 确认中 | -| P2-Q13 | 原型覆盖费用、应收应付、账单、收付款和利润,但不能证明二期全部纳入 | 二期财务闭环终点 | 做到费用、应收应付、对账、线下收付款登记与核销、单票利润;不做在线支付、会计凭证和总账 | 待填写 | 待确认 | -| P2-Q14 | 原型费用项目较多,混合头程、仓储和其他阶段 | “02 到仓”首批费用白名单,以及每项应收/应付方向、单位、币种和税率 | 只纳入到仓实际使用项目;白名单外费用允许人工新增但必须审核 | 待填写 | 待确认 | -| P2-Q15 | 原型有费用分类和应收/应付,没有明确阶梯价、最低收费和规则优先级 | 计费维度;是否支持阶梯价、最低收费、封顶、组合价和冲突优先级 | 至少支持客户、往来单位、仓库、服务类型和生效区间;复杂价格结构按实际需要裁剪 | 待填写 | 待确认 | -| P2-Q16 | 原型有费用日期和审核状态,没有明确到仓事件的自动计费节点 | 各类费用在哪个节点试算、生成、生效和锁定;人工费用何时生效 | 实测完成生成试算,差异确认后生效并锁定;非测量费用按已确认业务事件生成 | 待填写 | 待确认 | +| P2-Q14 | 费用白名单位置出现“63”占位值,不能作为业务结论 | “02 到仓”首批费用项目、计费单位、币种、税率/税务属性和触发节点 | 只纳入二期实际使用的头程费用;白名单外允许人工补录但必须留痕 | 待填写 | 待确认 | +| P2-Q15 | 计费规则复杂度位置出现“63”占位值,不能作为业务结论 | 计费维度,以及是否支持阶梯价、最低收费、封顶、组合价和冲突优先级 | 先支持客户、往来单位、仓库、服务类型和生效区间;复杂结构按业务需要裁剪 | 待填写 | 待确认 | +| P2-Q16 | 费用生成节点位置出现“63”占位值,不能作为业务结论 | 实测、差异、上架和人工费用分别在哪个节点试算、生成、确认和作废 | 实测完成生成试算;其他费用按已确认头程业务事件生成;来源键保证幂等 | 待填写 | 待确认 | -填写规则:认可当前建议时,可将建议复制到“临时结论”并把状态改为“临时基线”;不能确定时使用“暂缓”,同时写明二期处理方式。产品到岗复核后再改为“已确认”。 +### P2-Q14 首批头程费用填写模板 -## 五、全量确认跟踪表 - -项目负责人在产品空缺期间维护临时结论和状态。状态使用:待确认、确认中、临时基线、已确认、暂缓、原型基线;产品到岗后负责复核“临时基线”。 - -| 编号 | 优先级 | 涉及业务角色 | 状态 | -|---|---|---|---| -| P2-Q1 | P0 | 仓库、平台运营 | 确认中 | -| P2-Q2 | P0 | 业务、调度 | 已确认 | -| P2-Q3 | P0 | 仓库、调度 | 已确认 | -| P2-Q4 | P0 | 仓库、财务/计费 | 确认中 | -| P2-Q5 | P0 | 业务、仓库、客服 | 确认中 | -| P2-Q6 | P0 | 仓库、业务 | 确认中 | -| P2-Q7 | P0 | 仓库 | 已确认 | -| P2-Q8 | P0 | 仓库、客服 | 确认中 | -| P2-Q9 | P0 | 仓库、产品 | 暂缓 | -| P2-Q10 | P0 | 仓库、平台运营 | 暂缓 | -| P2-Q11 | P0 | 业务、法务、运维 | 确认中 | -| P2-Q12 | P0 | 仓库、技术 | 已确认 | -| P2-Q13 | P0 | 产品、业务、财务、技术 | 待确认 | -| P2-Q14 | P0 | 业务、财务/计费 | 待确认 | -| P2-Q15 | P0 | 业务、财务/计费 | 待确认 | -| P2-Q16 | P0 | 业务、仓库、财务/计费 | 待确认 | -| P2-Q17 | P0 | 财务 | 原型基线 | -| P2-Q18 | P0 | 财务/税务 | 原型基线 | -| P2-Q19 | P0 | 财务、内控 | 原型基线 | -| P2-Q20 | P0 | 业务、财务、客服 | 原型基线 | -| P2-Q21 | P0 | 业务、财务、客服 | 原型基线 | -| P2-Q22 | P0 | 财务、内控 | 原型基线 | -| P2-Q23 | P1 | 财务/税务、产品 | 原型基线 | -| P2-Q24 | P1 | 财务、管理层 | 原型基线 | - -## 六、详细确认事项与依据 - -### P2-Q1 少货到仓单如何人工关闭 - -- 优先级:P0,阻塞收货状态和差异流程设计。 -- 需确认方:仓库负责人、平台运营负责人。 -- 原型情况:未体现少货关闭人、审批动作和证明材料。 -- 需要确认: - - 谁可以发起少货关闭? - - 谁拥有最终关闭权限? - - 是否需要客户确认后才能关闭? - - 必须提供哪些证明:实收数量、现场照片、交接凭证或承运商说明? -- 当前建议:收货员登记少货并上传证据,仓库主管确认关闭;平台运营仅在争议场景介入,系统同步通知客户。 -- 业务确认结论:待填写。 -- 产品确认状态/结论:确认中;“以实际货物入库为准”作为方向保留,关闭权限、条件、凭证和通知规则仍需在本清单“会议确认主表”补齐。 - -### P2-Q2 预约取货由哪类服务商承接 - -- 优先级:P0,影响快递公司、往来单位和调度数据模型。 -- 需确认方:业务负责人、调度负责人。 -- 原型情况:存在快递公司、往来单位和提货方式字段,但没有明确三者的分配关系。 -- 需要确认: - - 只允许选择快递公司,还是也允许车队、供应商等往来单位? - - 同一预约能否更换服务商?更换后是否需要重新通知客户? - - 自有司机是否作为一种服务商处理? -- 当前建议:统一抽象为“可分配服务商”,快递公司、车队和其他承运往来单位作为不同类型。 -- 业务确认结论:待填写。 -- 产品确认状态/结论:已确认,不走系统服务商调度,相关费用由人工添加费用清单项目。 - -### P2-Q3 预约采用精确时间还是时间窗 - -- 优先级:P0,影响预约容量、冲突校验和客户表单。 -- 需确认方:仓库负责人、调度负责人。 -- 原型情况:只有提货时间和预计到仓日期,没有时间窗及容量规则。 -- 需要确认: - - 预约精确到日期、小时还是开始/结束时间窗? - - 每个时间窗允许多少票、多少箱或多少车辆? - - 迟到、爽约和临时改期如何处理? -- 当前建议:采用开始时间和结束时间组成的时间窗,由仓库配置营业时间、停收日期和时间窗容量。 -- 业务确认结论:待填写。 -- 产品确认状态/结论:已确认,采用人工线下预约时间,系统记录预约结果。 - -### P2-Q4 实测及计费计算口径 - -- 优先级:P0,阻塞测量数据模型、差异计算和历史复算。 -- 需确认方:仓库负责人、财务/计费负责人。 -- 原型情况:明确展示 cm、kg、m³、材积重及原单/实测对比,但没有体积重系数、计费公式、精度和舍入规则。 -- 必须逐项确认: - -| 计算项 | 业务确认值 | -|---|---| -| 长度单位 | 待填写 | -| 重量单位 | 待填写 | -| 体积单位 | 待填写 | -| 体积重公式及除数 | 待填写 | -| 计费重取值规则 | 待填写 | -| 尺寸、重量和体积精度 | 待填写 | -| 每一步还是最终结果舍入 | 待填写 | -| 舍入方式 | 待填写 | - -- 当前建议:公式由服务端按版本统一计算,每条测量记录保存原始值和规则版本,规则变更不反向修改历史记录。 -- 产品确认状态/结论:确认中;公式方向已保留,`/363` 含义、单位、计费重取值和舍入规则仍需在本清单“会议确认主表”补齐。 - -### P2-Q5 哪些差异必须由客户确认 - -- 优先级:P0,影响差异单、业务暂停和客户确认页面。 -- 需确认方:业务负责人、仓库负责人、客户服务负责人。 -- 原型情况:有原单/实测对比、审核通过、审核不通过和失败原因,没有自动接受阈值及客户确认条件。 -- 必须逐项确认: - -| 差异类型 | 自动接受范围 | 必须客户确认范围 | 是否暂停后续作业 | -|---|---|---|---| -| 数量/箱数 | 待填写 | 待填写 | 待填写 | -| 重量 | 待填写 | 待填写 | 待填写 | -| 体积 | 待填写 | 待填写 | 待填写 | -| 包装/破损 | 待填写 | 待填写 | 待填写 | -| 货物归属 | 待填写 | 待填写 | 待填写 | - -- 当前建议:阈值按差异类型配置,超过阈值必须客户确认;阈值不得写死在客户端。 -- 产品确认状态/结论:确认中;“差异需要客户确认”作为方向保留,拒绝、超时和确认前阻塞规则仍需补齐。 - -### P2-Q6 隔离区货物如何释放 - -- 优先级:P0,影响差异暂停、隔离位置和正式上架。 -- 需确认方:仓库负责人、业务负责人。 -- 原型情况:存在“是否扣货/扣货理由”,但没有隔离库位、批准释放人和释放条件。 -- 需要确认: - - 哪些异常必须进入隔离区? - - 谁可以批准释放? - - 哪些情况必须先取得客户确认? - - 释放后由谁安排转移到正式库位? -- 当前建议:差异关闭后由仓库主管批准释放;重大数量、破损或货物归属差异需先由客户确认。 -- 业务确认结论:待填写。 -- 产品确认状态/结论:确认中;不设隔离区并采用业务暂停作为方向保留,货物位置、解除权限和解除条件仍需补齐。 - -### P2-Q7 库位容量采用什么校验口径 - -- 优先级:P0,影响库位档案和上架校验。 -- 需确认方:仓库负责人。 -- 原型情况:库位原型已有“最大承重(kg)”和闲置/占用状态,但没有超容量处理规则。 -- 需要确认: - - 二期是否以最大承重作为强校验? - - 箱数和体积是否需要同时强校验? - - 超容量时禁止上架,还是允许主管授权? -- 当前建议:二期以最大承重为强校验,箱数和体积先提示;确需超额时必须由仓库主管授权并留痕。 -- 业务确认结论:待填写。 -- 产品确认状态/结论:已确认,当前不做库位容量校验。 - -### P2-Q8 哪些到仓节点必须上传现场照片 - -- 优先级:P0,影响收货表单、文件存储和验收规则。 -- 需确认方:仓库负责人、客户服务负责人。 -- 原型情况:照片上传出现在 BOL/派送页面,到仓收货原型没有照片必传规则。 -- 需要确认: - - 正常收货是否必须上传照片? - - 破损、受潮、少货、多货和无预报货物是否分别必传? - - 每类异常至少需要几张、拍摄哪些角度? -- 当前建议:破损、受潮、少货、多货和无预报货物必传;正常收货是否必传由仓库确认。 -- 业务确认结论:待填写。 -- 产品确认状态/结论:确认中;照片类型已明确,必传粒度、附件限制和补传规则仍需补齐。 - -### P2-Q9 二期是否使用 PDA - -- 优先级:P0,影响二期终端范围和技术方案。 -- 需确认方:仓库负责人、项目负责人;产品到岗后复核。 -- 原型情况:流程图将 PDA 拣货放在头程“03 出仓”,现有 PDA 原型也是集装箱拣货,不是到仓测量或上架。 -- 需要确认:二期到仓签到、测量和上架是否统一使用电脑/响应式作业页,不接入 PDA? -- 当前建议:二期不接 PDA,使用管理后台或响应式作业页;PDA 正式接入在“03 出仓/WMS”阶段规划。 -- 业务确认结论:待填写。 -- 产品确认状态/结论:暂缓;二期开发基线暂按不接 PDA、使用后台或响应式作业页处理。 - -### P2-Q10 无预报货物如何认领和超期处理 - -- 优先级:P0,影响租户隔离、待认领区和错绑冲正。 -- 需确认方:仓库负责人、平台运营负责人。 -- 原型情况:没有无预报货物、待认领区、认领审批和超期处理设计。 -- 需要确认: - - 谁可以创建无预报收货记录? - - 认领需要客户提供什么证明? - - 由单人、双人还是主管确认后绑定订单? - - 超过多少天未认领,如何通知、收费、退回或处置? -- 当前建议:先进入待认领区,由主管确认后绑定企业和订单;超期天数及处置方式由业务另行明确。 -- 业务确认结论:待填写。 -- 产品确认状态/结论:暂缓;无预报货物不得直接绑定企业订单,具体认领和超期规则后续确认。 - -### P2-Q11 敏感数据和凭证保存多久 - -- 优先级:P0,影响存储成本、隐私合规和自动清理任务。 -- 需确认方:业务负责人、法务负责人、运维负责人。 -- 原型情况:没有联系方式、司机信息、现场照片和交接凭证的保留期限。 -- 必须逐项确认: - -| 数据类型 | 在线保存期限 | 归档期限 | 到期处理方式 | -|---|---|---|---| -| 客户/司机联系方式 | 待填写 | 待填写 | 待填写 | -| 到仓现场照片 | 待填写 | 待填写 | 待填写 | -| 交接凭证 | 待填写 | 待填写 | 待填写 | -| 导出及下载审计 | 待填写 | 待填写 | 待填写 | - -- 当前建议:按数据类型分别设置期限;到期后自动删除或匿名化,下载和批量导出必须保留审计。 -- 产品确认状态/结论:确认中;12 个月期限作为方向保留,起算点、删除/归档和各类数据适用范围仍需补齐。 - -### P2-Q13 二期计费财务的闭环终点 - -- 优先级:P0,决定二期财务系统边界和总体工作量。 -- 需确认方:产品、业务、财务和技术负责人。 -- 需要确认:二期是否以“线下收付款登记并完成核销”为终点;是否明确排除在线支付、银企直连、外部开票、会计凭证和总账。 -- 当前建议:采用 [二期计费与财务模块规划](二期计费财务模块规划.md)中的轻量财务闭环。 -- 产品确认状态/结论:待确认。 - -### P2-Q14 首批费用项目及应收应付方向 - -- 优先级:P0,阻塞费用项目、权限和数据初始化。 -- 需确认方:业务、财务/计费负责人。 -- 需要确认:费用编码、名称、应收/应付、计费单位、默认币种、税率/税务属性、可否人工新增和启停规则。 -- 当前建议:先建立到仓相关费用白名单,其他费用人工新增必须审核。 -- 产品确认状态/结论:待确认。 - -P2-Q14 费用白名单按下表逐项填写;原型中存在但“02 到仓”实际不用的费用不要纳入二期。 - -| 费用编码 | 费用名称 | 应收/应付 | 往来对象 | 计费单位 | 默认币种 | 默认税率 | 自动/人工 | 触发节点 | +| 费用编码 | 费用名称 | 费用性质 | 计费对象 | 计费单位 | 默认币种 | 默认税率 | 自动/人工 | 触发节点 | |---|---|---|---|---|---|---|---|---| -| 待填写 | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 | +| 待填写 | 待填写 | 待填写 | 待填写 | 待填写 | CNY | 待填写 | 待填写 | 待填写 | -### P2-Q15 计费规则维度和价格结构 +## 四、已确认的到仓作业结论 -- 优先级:P0,阻塞规则模型和计费引擎。 -- 需确认方:业务、财务/计费负责人。 -- 需要确认:是否按客户、供应商、仓库、服务、货物属性和有效期区分;是否支持阶梯价、最低收费、封顶、组合价和优先级冲突处理。 -- 当前建议:规则版本化,至少支持客户、供应商、仓库、服务和有效期;复杂组合价未确认前不实现。 -- 产品确认状态/结论:待确认。 - -### P2-Q16 费用生成和锁定节点 - -- 优先级:P0,阻塞实测、差异和费用状态衔接。 -- 需确认方:业务、仓库、财务/计费负责人。 -- 需要确认:到仓签到、实测完成、差异关闭、上架完成分别生成哪些费用;何时只是试算,何时生效并禁止直接修改。 -- 当前建议:实测完成生成试算,差异关闭后确认;事件来源键保证重复触发不重复计费。 -- 产品确认状态/结论:待确认。 - -### P2-Q17 至 P2-Q24 原型财务基线 - -以下事项已能从财务原型和必要的审计规则形成二期基线,不再发给产品重复确认。详细依据见 [二期计费财务需求确认表](二期计费财务需求确认表.md)。 - -| 编号 | 二期采用基线 | 状态 | -|---|---|---| -| P2-Q17 | 本位币 CNY;保存原币、人工业务汇率和折算金额,费用生效时锁定汇率快照 | 原型基线 | -| P2-Q18 | 保存未税金额、税率、税额和含税总额;金额/税额 2 位、汇率 6 位,服务端统一舍入 | 原型基线 | -| P2-Q19 | 经办提交、财务审核;生效费用只能调整、红冲或作废并留痕 | 原型基线 | -| P2-Q20 | 支持按选择和按截止时间生成账单,保存结算期间、账期和到期日 | 原型基线 | -| P2-Q21 | 账单审核、确认、拒绝、锁定;争议处理后生成新版本 | 原型基线 | -| P2-Q22 | 线下收付款、部分收付、余额、核销和反核销;不含预收预付、跨币种及银行自动认领 | 原型基线 | -| P2-Q23 | 只登记发票信息和状态,不接外部开票平台 | 原型基线 | -| P2-Q24 | 利润=已生效应收-已生效应付,利润率=利润÷收入;仅财务授权角色可见 | 原型基线 | - -## 七、已确认事项 - -| 编号 | 确认结论 | 后续核验 | 状态 | +| 编号 | 产品结论 | 二期开发口径 | 状态 | |---|---|---|---| -| P2-Q12 | 箱件/托盘标签使用佳博 1324D 热敏标签打印机 | 标签纸尺寸、连接方式、驱动、打印指令协议和仓库部署参数需在开发前实机核验 | 已确认 | +| P2-Q1 | 以实际货物重量、体积为准 | 收货实测结果作为后续作业和头程计费输入 | 已确认 | +| P2-Q2 | 不走系统服务商调度,取货安排线下完成 | 系统记录到仓结果,不建设服务商调度闭环 | 已确认 | +| P2-Q3 | 预约在线下完成 | 系统记录预约日期时间、改期/取消结果和操作日志 | 已确认 | +| P2-Q4 | 小数点三位向上取整 | 保存原始测量值和规则版本,结果按三位向上取整 | 已确认 | +| P2-Q5 | 差异同步给客户,无需客户确认,只做记录 | 差异不阻塞后续作业;保留差异记录、通知和审计 | 已确认 | +| P2-Q6 | 不考虑隔离区 | 不建设独立隔离区和隔离释放流程 | 已确认 | +| P2-Q7 | 当前不做库位容量校验 | 不做容量强校验,但校验库位停用和状态合法性 | 已确认 | +| P2-Q8 | 称重、测量照片必传,大小不限制 | 必传照片;保留可配置技术安全上限、类型校验和访问审计 | 已确认 | +| P2-Q9 | 暂缓 PDA | 二期使用后台或响应式作业页,不接 PDA | 暂缓 | +| P2-Q10 | 不考虑无预报货物场景 | 不建设无预报货物认领和正式订单绑定流程 | 已确认 | +| P2-Q11 | 永久保存 | 业务记录不自动删除;运维另行制定存储、备份和合规处理策略 | 已确认 | +| P2-Q12 | 使用佳博 1324D 热敏标签打印机 | 纸张、连接、驱动和指令协议在开发前实机核验 | 已确认 | -## 八、确认完成标准 +## 五、已确认的头程计费范围 -阻塞开发的 P0 问题形成临时基线后,项目负责人应组织一次汇总评审并完成以下动作: +| 编号 | 产品结论 | 二期处理 | +|---|---|---| +| P2-Q13 | 二期只做头程计费 | 只建设费用项目、计费规则、费用试算、调整、确认和头程费用明细 | +| P2-Q17 | 不进入二期 | 不建设汇率结算和本位币折算 | +| P2-Q18 | 不进入二期 | 不建设财务税务结算口径;费用项目如需税率字段,按 Q14 配置即可 | +| P2-Q19 | 不进入二期 | 不建设财务费用审核、应收应付审核或会计审计链;保留头程费用调整审计 | +| P2-Q20 | 不进入二期 | 不建设客户/供应商对账和结算周期 | +| P2-Q21 | 不进入二期 | 不建设账单确认、争议和关闭流程 | +| P2-Q22 | 不进入二期 | 不建设收付款、核销、反核销和银行自动认领 | +| P2-Q23 | 不进入二期 | 不建设发票登记和外部开票平台 | +| P2-Q24 | 不进入二期 | 不建设利润、利润率和财务报表 | -- 将确认结论回写到 [二期开发规划](二期开发规划.md)的规划基线、业务规则和状态模型。 -- 调整受影响的开发任务、依赖、优先级和验收标准。 -- 对仍存在例外或暂缓决定的事项明确负责人、截止日期和临时处理规则。 -- 产品空缺期间由项目负责人、业务负责人、仓库负责人、财务负责人和技术负责人共同形成临时范围基线;产品到岗后复核。 -- 范围基线确认后再制定正式排期;确认清单本身不代表已经承诺开发时间。 +原型中对应的完整财务页面不自动进入二期,后续阶段如需建设,另行立项确认。 + +## 六、全量状态跟踪 + +| 编号 | 优先级 | 主题 | 状态 | +|---|---|---|---| +| P2-Q1 | P0 | 实收重量体积口径 | 已确认 | +| P2-Q2 | P0 | 取货服务商调度 | 已确认 | +| P2-Q3 | P0 | 线下预约记录 | 已确认 | +| P2-Q4 | P0 | 测量结果精度 | 已确认 | +| P2-Q5 | P0 | 差异通知方式 | 已确认 | +| P2-Q6 | P0 | 隔离区 | 已确认 | +| P2-Q7 | P0 | 库位容量校验 | 已确认 | +| P2-Q8 | P0 | 到仓照片 | 已确认 | +| P2-Q9 | P0 | PDA | 暂缓 | +| P2-Q10 | P0 | 无预报货物 | 已确认 | +| P2-Q11 | P0 | 数据保存 | 已确认 | +| P2-Q12 | P0 | 标签设备 | 已确认 | +| P2-Q13 | P0 | 二期财务范围 | 已确认 | +| P2-Q14 | P0 | 首批费用项目 | 待确认 | +| P2-Q15 | P0 | 计费规则复杂度 | 待确认 | +| P2-Q16 | P0 | 费用生成节点 | 待确认 | +| P2-Q17 | P0 | 汇率结算 | 不纳入二期 | +| P2-Q18 | P0 | 财务税务结算 | 不纳入二期 | +| P2-Q19 | P0 | 财务费用审批 | 不纳入二期 | +| P2-Q20 | P0 | 对账周期 | 不纳入二期 | +| P2-Q21 | P0 | 账单确认争议 | 不纳入二期 | +| P2-Q22 | P0 | 收付款核销 | 不纳入二期 | +| P2-Q23 | P1 | 发票管理 | 不纳入二期 | +| P2-Q24 | P1 | 利润报表 | 不纳入二期 | + +## 七、确认完成标准 + +P2-Q14 至 P2-Q16 形成可开发结论后,头程计费模块可以进入正式任务拆分和开发验收。后续需求变化按变更流程处理,不得将应收应付、对账、付款、核销、发票或利润功能默认带入二期。 + +确认完成后需要同步: + +- 二期头程计费模块规划。 +- 二期开发规划和开发进度表。 +- 头程计费任务依赖、数据对象和验收标准。 +- 二期会议确认 Excel 及产品回传归档记录。 diff --git a/二期/二期需求确认清单.xlsx b/二期/二期需求确认清单.xlsx index 0afd572841d5e3cde4bcf9601bab784edfae2da5..ffaf890120364dad08aac779df2cb12921219432 100644 GIT binary patch delta 10872 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 TxkykkATS^zUKo7K@(cJs9)-jJ delta 11309 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 literal 0 HcmV?d00001 diff --git a/二期/产品回传/2026-07-31-产品确认合并记录.md b/二期/产品回传/2026-07-31-产品确认合并记录.md new file mode 100644 index 0000000..a484b19 --- /dev/null +++ b/二期/产品回传/2026-07-31-产品确认合并记录.md @@ -0,0 +1,55 @@ +# 2026-07-31 二期产品确认合并记录 + +> 原始回传:[2026-07-31-二期需求确认-产品回传-v1.xlsx](2026-07-31-二期需求确认-产品回传-v1.xlsx) +> 回传来源:WXWork 文件 `二期需求确认清单.xlsx` +> 原始文件 SHA-256:`841F976133F772BD52E085785C57D8BA90687CA07CC57B8009C71138F78C8563` + +## 一、已合并到二期到仓基线 + +| 编号 | 产品结论 | 合并后的开发口径 | +|---|---|---| +| P2-Q1 | 以实际货物重量、体积为准 | 收货实测结果作为后续作业和头程计费输入;少货关闭规则按现有临时基线保留 | +| P2-Q4 | 小数点三位向上取整 | 测量和计费中间结果保留原始值,展示/业务结果按三位向上取整;公式版本可追溯 | +| P2-Q5 | 差异同步给客户,无需客户确认,只做记录 | 差异不再阻塞后续作业,不建设客户确认动作;保留差异记录、通知和审计 | +| P2-Q6 | 不考虑 | 二期不建设独立隔离区和隔离释放流程 | +| P2-Q8 | 照片必传,大小不限制 | 称重照片、测量照片必传;产品未设置业务大小上限,系统仍保留可配置的技术安全上限和文件类型校验 | +| P2-Q10 | 不考虑,无此场景 | 二期不建设无预报货物认领流程;不预留正式订单绑定和计费入口 | +| P2-Q11 | 永久保存 | 业务上不自动删除照片、凭证和测量记录;具体存储成本、合规删除和备份策略由运维另行制定 | + +## 二、财务范围合并结论 + +产品在本轮确认中明确:二期财务只做“头程计费”,不做后续财务闭环。 + +### 二期纳入 + +- 头程费用项目维护。 +- 头程计费规则、计费单位、价格版本和生效区间。 +- 结合头程订单、到仓实测和业务事件生成费用试算结果。 +- 费用结果的人工补录、调整、审核、作废和审计留痕。 +- 头程费用明细查询、订单关联、计算过程和规则快照。 + +### 二期明确不纳入 + +- 应收应付台账。 +- 客户或供应商对账单、结算周期和账单确认。 +- 收付款、退款、核销、反核销和银行流水。 +- 发票登记、开票接口和税务申报。 +- 汇率结算、利润、利润率和财务报表。 +- 总账、会计凭证、在线支付和银企直连。 + +这些模块的原型页面只作为后续阶段参考,不再进入二期开发任务、验收标准或进度统计。 + +## 三、未合并内容 + +| 编号 | 回传内容 | 处理 | +|---|---|---| +| P2-Q14 | 费用白名单及费用字段位置出现“63”占位值 | 不作为确认结论;继续确认“02 到仓”首批费用项目、计费单位、币种、税率和触发节点 | +| P2-Q15 | 计费规则复杂度位置出现“63”占位值 | 不作为确认结论;继续确认计费维度、阶梯价、最低收费和规则优先级 | +| P2-Q16 | 费用生成节点位置出现“63”占位值 | 不作为确认结论;继续确认实测、差异、上架和人工费用的生成节点 | + +## 四、合并后处理 + +- 更新二期开发规划、计费规划、需求确认清单和开发进度表。 +- 从二期财务任务中移除应收应付、对账、付款、核销、发票和利润任务。 +- 将 P2-Q13 标记为“已确认:仅头程计费”,P2-Q14 至 P2-Q16 保持待确认。 +- 产品原始回传只读归档,不覆盖;后续回传使用新版本文件名。 diff --git a/二期/虫虫出海二期开发进度表.xlsx b/二期/虫虫出海二期开发进度表.xlsx index ba38438e9cdb5d56f9d8997e0a887e134230d9da..a777d168b719d0888da0dc73869565d0f03476e2 100644 GIT binary patch literal 23409 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 OaNk3?-@*(IuKojlO-n8S literal 30733 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

B3~hs&UJ8 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