12 个科目
金额单位:元;科目14 仅作勾稽,不计净额
运行记录
每月 1 日 08:00 自动跑;也可在「脚本与任务」里手动重跑历史月
当月汇率(USD→CNY)
按支付日期取自 Frankfurter,跨境单折算依据
本页是月结数据的完整逻辑说明书
数据从哪来、怎么算、怎么核对、怎么归集,一目了然。改动月结相关代码前请先读本页,改完跑回归脚本。
一、数据流总览(五步)
| 步骤 | 环节 | 做什么 | 产出 |
| S1 | ERP 数据提取 | 只读连接 ERP MySQL(47.111.190.250/bingyu),按科目分别抽取订单、工艺、售后、运费、支付、退款、客户、商品、汇率等原始数据 | 各科目录入内存/临时结果 |
| S2 | 规则引擎演算 | 胚衫销售(01)与售后SKU(10)走规则引擎:跨境单按当日 USD→CNY 汇率折算+五规则(渠道费/平台补贴等加减项);售后是 01 的镜像(正存负用) | 引擎输出 Excel(含行级 SKU 明细) |
| S3 | 长表组装 | 把 01~15 各科目按统一 22 列 schema(金额+12 个维度字段)拼成一张长表;金额全部折 RMB | 长表(每月 6~7 万行) |
| S4 | 入库 + 核对 | 写入数织 PG(mj_fact_long 等表);跑 C1~C6 六条核对断言,任一失败即判 FAIL 且不推送成功 | mj_run / mj_check 结果 |
| S5 | 展示 / 推送 / 导出 | 页面五页签展示;企微机器人推送结果摘要;页面导出两 Sheet Excel(店铺×科目 + 整合后,含客服/客户备注) | 页面数据 / 企微消息 / xlsx |
二、科目体系(15 科目)
净额 = SUM(01..06) + SUM(10..13,15);科目14 仅勾稽
| 编码 | 科目 | 取数月份 | 方向 | 数据来源 | 计净额 |
| 01 | 胚衫销售(SKU级) | 发货月 | 正 | 规则引擎(ERP 订单+跨境折RMB+五规则) | 是 |
| 02 | 工艺明细 | 发货月 | 正 | ws_customize_craft_lines.real_line_amount(行级) | 是 |
| 03 | 工艺附加 | 发货月 | 正 | ws_customize_add_cost.cost_total(行级) | 是 |
| 04 | 工艺调整 | 发货月 | 正负 | ws_customize_order_adjust.money(reckon_type 定正负) | 是 |
| 05 | 工艺折扣 | 发货月 | 负 | ws_customize_order.discount_money(正存负用) | 是 |
| 06 | 运费 | 发货月 | 正 | ws_order_money.pay_money(money_type=3 实收) | 是 |
| 10 | 售后-退货退款SKU明细 | 退款月 | 负 | 规则引擎售后镜像(与 01 同源反向) | 是 |
| 11 | 售后-仅退款(type2) | 退款月 | 负 | ws_service(type=2) | 是 |
| 12 | 售后-退运费(type4) | 退款月 | 负 | ws_service(type=4) | 是 |
| 13 | 售后-退费用(type6) | 退款月 | 负 | ws_service(type=6) | 是 |
| 14 | 售后-退货退款头表(锚点) | 退款月 | 正 | ws_service(type=1 头表),只用于与科目10原币勾稽 | 否·仅勾稽 |
| 15 | 售后服务费 | 退款月 | 正负 | 申请金额−实退金额的差额行(少退正/多退负) | 是 |
三、维度字段提取逻辑(22 列)
| 字段 | 取数逻辑 | 覆盖范围 |
| 支付方式 | 销售:ws_order_pay 实际渠道优先(多渠道「+」合并)→ 无流水回退 ws_order.pay_type。售后:ws_service_refund.pay_type 优先(原支付渠道,多笔合并)→ 回退 ws_service.pay_type → source/no_original_pay 再兜底原销售订单。store_balance 显示「店铺余额」 | 全部科目 100% |
| 品牌/分类/品名 | 01/10 取引擎输出;02 按工艺行款号回查 ws_product(约 40% 命中,工艺款号多为自由文本) | 01/10 100%;02 部分 |
| 款号/颜色/尺码/SKU | 01/10 引擎行级输出;其余科目单据级天然无商品行(不是漏数) | 01/10 100% |
| 登录账号/客户姓名 | ws_customer;售后经 customer_id / customer_name | 全部科目 100% |
| 物流方式 | ws_order.carrier_id → ws_carrier.express_name(规避 express_name 偶写运单号);售后取 ws_service 承运商,空回退来源销售单 | 06 100%;10/11-15 ≈99% |
| 工艺部门 | 02 行级:排产人部门(ws_customize_craft_work→ws_user→ws_user_department,仅工艺部)优先,无排产人按工艺类型映射;03 固定「后整工艺部」;04 行级:adjust.craft_id→ws_craft.short_name 映射(100% 覆盖,无短名兜底订单级);05 订单级 | 02-05 100% |
四、判断逻辑(C1~C6 核对断言)
每月跑完自动执行,全 PASS 才算成功;断言通用化,换月份无需改代码
| 断言 | 逻辑 |
| C1 工艺四科目 vs money 层 | 长表 02+03+04+05 合计 = ws_order_money 加工费聚合,验证工艺金额未漏算/重算 |
| C2 售后SKU原币 vs 头表锚点 | 科目10 原币合计 vs 科目14 头表锚点;容差 = 科目15 服务费(少退/多退差额天然不等) |
| C3 运费 vs money 层实收 | 长表 06 = ws_order_money(money_type=3) 独立聚合 |
| C4 长表01行数 = 引擎输出行数 | 组装不丢行 |
| C5 长表10行数 = 引擎输出行数 | 售后镜像不丢行 |
| C6 单头级单据唯一性 | 单据级科目(03/05/06/11-15)单号不重复 |
五、归集逻辑
| 归集项 | 规则 |
| 净额 | SUM(科目01..06) + SUM(科目10..13,15);科目14 不参与。2026-07 = 10,958,528.51;2026-10 = 12,958,938.16(回归基准) |
| 店铺×科目 | 按 store × subject_code 二维汇总金额,末行合计、末列净额;导出 Sheet1 用 |
| 科目汇总 | mj_subject_summary:各科目行数/金额/是否计净额,总览页 KPI 来源 |
| 导出 | 双 Sheet xlsx:店铺×科目(整月全量)+ 整合后(跟随筛选);文件名「月结数据_月_整合后.xlsx」 |
| 企微推送 | 跑完推结果摘要(净额/耗时/断言结果);webhook 配置在「核对与运行」页 |
六、运行机制与防回归
| 项 | 说明 |
| 定时任务 | 每月 1 日 08:00(cron 0 8 1 * *),脚本 ID month-settle,队列串行执行约 3~8 分钟 |
| 服务器脚本 | 月结脚本目录 month-settle/(源码真源在 研发项目 aliyun_server/month_settle/scripts/,改完用部署脚本上传,禁止直接改服务器文件) |
| 后端接口 | 任务执行器 hf_jobs.py 的 _mj 段(只读查询+导出);xlsx 由 python3.8 子进程 + mj_xlsx.py 生成 |
| 防回归 | 改动 scripts/*、hf_jobs.py 的 _mj 段、mj.js、index.html 的 page-mj* 后,必须跑回归脚本:本地 aliyun_server 目录执行 python putrun.py _regression_check.py,期望全 PASS(两月净额基准 + C1~C6 + 页面接口) |
| 权限 | 页面与接口仅管理员可见;ERP 连接只读账号 |
看什么每家供应商自己报的现货,按「供应商 + 供应商货号」汇总;最后一列是多少天前报的。
供应商报的是自己的货号,要经过「供应商对照」翻译成款号才算得进采购计划;没翻译过来的会标「未映射」。
| 供应商 | 供应商货号 | 现货(件) | SKU 行 |
对应到哪些款 | 上次上报 | 新鲜度 |
两套款号左边「供应商货号」是供应商报表里的原始写法,系统原样保留;「ERP 款号」是按「供应商对照」映射出来的。
没有建立对应关系时,系统先按「同款号 / 去掉结尾 U 同池」自动匹配,行尾会标出匹配方式。
① 上传供应商现货表
支持 .xls / .xlsx,一次一个文件;同厂同款同日期重复上传会整份覆盖
↑
把 Excel 拖到这里,或点击选择文件
系统会自动识别款号、颜色、尺码、件数,并校验合计是否对得上;供应商必须确认
② 导入商品明细(SKU 级)
支持 .csv / .xlsx,从 ERP 导出后直接上传,自动识别列名
↑
把商品明细拖到这里,或点击选择文件
需要包含「商品款号 / 颜色 / 尺寸 / 标箱量」这类列;标箱量按 SKU 入库
解析结果
字段识别
前 8 行样例
数据来源
三类数据各自的接入方式
| 数据 | 接入方式 | 状态 | 说明 |
| 供应商现货 | Excel 上传 | 已启用 | 手工上传,按「供应商 + 款 + 日期」覆盖当日快照 |
| 商品明细 | Excel / CSV 导入 | 已启用 | 按 SKU 覆盖导入,箱规以这里为准 |
| 商品明细 | ERP MCP 直连 | 计划中 | 下月 ERP 出 MCP 后接入,届时自动同步 |
| 年度生产计划 | Excel 上传 | 已启用 | 供应商给的年度大计划,入口在「生产计划」页;按款号+颜色+尺码覆盖导入 |
| 采购订单行 | ERP MCP / 帆软采购主题 | 计划中 | 已交付与在途的来源。表已建好,接入后自动出数,页面不用改 |
| 销售 / 客户 | 旺店通 + MySQL | 未接入 | 后续按需接入 |
口径箱规只认「商品档案」(SKU 级标箱量);一个款可对应多个供应商,补货分单只认「供应商对照」;款资料只维护类别与托规格,不再记供应商。
商品档案
| 款号 | 店铺 | 分类 / 品牌 | SKU 数 | 颜色 | 箱规 | 克重(g) |
款资料(类别 / 托规格)
箱规以商品档案为准;这里只维护类别与托规格
这张表在翻译什么供应商报的是自己的货号,系统算采购要的是款号。两条关系都在这里手工维护,系统不猜:
一款多供应商(同一款可以由几家供货)、一个供应商货号对多个款(国内款 + 国外款共用一批现货)。
按库存在后台仍会算「对账池」(同款号视为一池),但那只用于报表分组,不会替你生成对应关系。
已生成的采购表
点单号或「明细」可查看这张单的 SKU 明细;删除只影响这张单据,不影响库存和补货数据。
上传技能包
同事做好的 .zip 传上来,检查通过就能挂定时任务
上传后系统自动体检:能不能在这台服务器上跑、卡在哪、怎么改。
不通过会生成一份「修复说明」,直接丢给做技能的 AI 让它照着改,改完再传一次,直到阻塞项清零。
本地执行器(可选,旧方式)
脚本现在都跑在服务器上;只有想让脚本跑在你自己的电脑上时,才需要这里
正在检测本地执行器…
—
先在本机启动执行器(只做一次)
设了开机自启就不用再管
- 下载下面的「脚本包」,解压到本机任意目录(路径别太深)
- 双击包里的
脚本中心\启动执行器.bat,看到「已启动:http://127.0.0.1:8765」就是好了
- 想开机就自动可用:双击
脚本中心\安装开机自启.bat
- 回到本页点右上角「重新检测」,脚本卡片就从灰变亮
执行器只监听 127.0.0.1,外网进不来;只认数据中台这个域名,别的网站调不动它;
只执行 scripts.json 里登记过的脚本,网页没法传任意命令。
云端脚本包
正在读取版本…
脚本文件不跟着网页走:换一台电脑,先把这个包下载解压,再启动里面的执行器,这一页的脚本就能点了。
定时任务
任务在服务器上按设定时间自动执行,不依赖任何电脑开机。每次执行都会留下日志,可直接查看。
企微应用
未配置
系统以企业自建应用的身份,直接读取「由它自己创建」的企微智能表格。只有下面登记的受管表格会被自动同步,同事在企微里的编辑照旧。
数据通道
系统和企微之间所有数据流动都在这一张清单里,按方向分两组:拉取是同事在企微表格里填、系统定时读进来;推送是系统算好、写进企微表格给业务看。两条路共用同一个应用、同一份密钥、同一套调度,所以放一起管。
要删表请去企微客户端删;只想让系统别再同步它,点行内「移出管理」
企微数据
这里保存的是系统从企微读到的只读副本。每张受管表格独立成一条记录、独立设置可见范围;每次读取生成一批,可回滚。
表格的登记与建表在「企微接入」页,这里只看数据和历史
同步方式:服务器上的定时任务「企微表格同步」用企微应用身份读取受管表格,不需要开电脑。
· 内容没变 → 不产生新批次,只刷新同步时间
· 表头被改(加列/删列)→ 数据照常保存,状态标红并列出变化,不会静默覆盖
· 读取失败或读到 0 行 → 拒绝入库,上一期数据继续生效
· 想立刻拉一次 → 在「企微接入」页对应表格点「立即同步」,或到「定时任务」里执行「企微表格同步」
新建账号
登录账号或手机号都能登录;密码由管理员设置后线下告知本人
创建后立即可登录,无需再激活
操作日志
记录登录、账号变更、数据批量写入/删除。数据类记录只记「谁在哪张表改了多少行」,不保存明细内容。