802 Commits

Author SHA1 Message Date
63799de416 fix(发货数据): 快递公司/仓库按实际出库单取,同步命令内存上限调至 4G
- 发货明细(jst_order_express_details)可能停在作废前的旧分配(如先分工厂代发仓、后改外采由总仓出库;或换单后仍是旧快递公司),
  工作平台按实际出库单显示。快递公司与出库单不一致或为空时改用出库单 logistics_company,
  仓库按出库单 wms_co_id 映射(从快递公司一致的明细行学习仓库名,扫描结束统一回填)。
- 9 月核对:快递名称不一致 434/331,612,仓库不一致 85,其中外采快递、线下快递、换单类为此原因。
- jushuitan:sync-shipping 内存上限 1536M -> 4096M:整月窗口重跑在扫描后段内存耗尽(退出码 255)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014nvGZkg27YMEdhry6eiuwf
2026-10-08 10:52:10 +08:00
c515da02d0 店铺收款账户账单筛选栏改回一行(去掉强制两行的栅格)
昨天 14:30 的「其余页签对齐淘系支付宝账户样式」把 .tw-filter 改成了 4 列栅格,并把「发生时间 + 查询按钮」显式放到第二行,所以淘系微信等页签的筛选栏又变成两行。

现在改回单行 flex:店铺 / 总账备注 / 账单项目 / 关键词 / 时间 / 查询按钮默认排一行,只有容器宽度不足(<=1024px)才折行。淘系支付宝页签同步改成同一套规则,两个组件保持一致。

已用无头 Edge 渲染同款结构的静态页校验:1912 宽下筛选栏就是一行。
2026-10-08 10:35:27 +08:00
8261b17328 种菜明细表同步:利润中心优先用历史值,缺失的用店铺维度报表的 ERP 店铺资料补齐
9 月有 19 家新店铺(1245 行)在历史映射里查不到,导致利润中心为空。现在按「ops_fys_shop_info.erpShopName → responsibleDepartment」补(就是店铺维度报表里 ERP系统店铺名称 → 店铺所属利润中心 那一列),两边都查不到才留空并在命令输出里列出。

历史值仍然优先,避免把人工维护过的取值改掉:实测 371 家可在 ERP 命中的店铺里 365 家两边一致,6 家不一致(朴美家居、朴美书房、拼多多-HX103、索菲亚办公、顾升、乐之益)已单独报给用户确认。
2026-10-08 09:59:11 +08:00
ef62cac0d9 种菜明细表:新增按月从聚水潭种菜报销工单同步的命令(带自动排重)
每个月都要手工整理「中心明细表」,改成一条命令:planting-details:sync-work-orders --month=YYYY-MM。

- 口径用 1~8 月已入库的 7 万多行反推验证过:只取「工单类型=种菜报销、状态=已完成」的工单,明细表「日期」= 工单完成日 - 1 天(历史命中 100%),所以某月数据 = 完成时间落在该月次日到下月次日的工单。
- 字段映射(聚水潭只返回 fieldId,不给字段名,这批 id 是拿历史数据逐列对撞出来的):财务售价/财务运费/财务佣金/京喜差价/扣款/财务空包费/财务打款金额 分别对应工单的 任务付款/任务快递费/任务佣金/京喜差价/任务扣款/任务空包费/最终报销金额;负责人、账户、类型、标签、创建人、平台商品ID 也各有对应字段。
- 自动排重:写入前先删掉「本月 + 本次订单号」的已有行,重复执行不会翻倍;--force-clear 才整月覆盖,--dry-run 只看不写。
- 所属利润中心没有工单来源,用表里已有的 店铺→利润中心 映射回填,命中不了的店铺在命令输出里逐个提示。
- 补测试:字段映射 + 日期口径 + 去重 + 利润中心回填 + force-clear。
2026-10-08 09:35:34 +08:00
636187a9d8 业绩明细:差额口径改为(收入金额+优惠金额+冲减金额)−商品金额 2026-10-07 18:32:10 +08:00
c1995319e6 业绩明细导出:当前页按页面每页条数(10/20/50)导出 2026-10-07 17:58:04 +08:00
dba61e5c8e 业绩明细:平台/店铺可搜索多选、导出跟随筛选且空值导出 0.00、分页支持每页条数与跳页(表头吸顶/序号列固定) 2026-10-07 17:54:34 +08:00
c8a035a18f 业绩明细:新增优惠金额/冲减金额两列(取科目映射表财务备注=优惠收入/冲减收入,支持 --amounts-only 回填) 2026-10-07 17:08:46 +08:00
4bcfde58f7 按文件导入改为两遍:先挑出真正有标签的订单,再拆行写入
聚水潭导出是一单多行,实测有 97 单是「部分明细行带标签、部分为空」;单遍处理会给这些单多写一行「(无标签)」。改成第一遍收集有标签的订单号,第二遍只对整单无标签的订单写「(无标签)」,并补上对应断言。
2026-10-07 16:59:01 +08:00
8a70fd4482 修 JstOrderLabelImporter:把延迟清区间的逻辑挪到 importFromFile,恢复镜像导入的 --replace
上一个提交的补丁打在了 import() 上:镜像导入的 --replace 清空被删掉,而 importFromFile 用到未定义的 \ 直接报错。现在两边各归各位。
2026-10-07 16:57:35 +08:00
daa4c939e7 聚水潭订单标签明细:支持按聚水潭导出的订单 Excel 导入,并放开筛选下拉上限
镜像 ops_jst_orders 只覆盖 2026-04-01 之后,缺的历史区间只能靠财务在聚水潭「导出订单」导文件补。所以:- 新增 JstOrderExportReader:ZipArchive+expat 流式解析聚水潭导出 xlsx。这类文件字符串走 inlineStr、dimension 只写 A1、单文件上万行 ×135 列(解压 78MB),常规读法会读成空表或吃满内存;实测 12286 行 3.5 秒、峰值内存 10MB。
- jst-order-labels:import 新增 --file=:按「线上订单号+标签」去重后拆行写入,可配合 --from/--to 过滤窗口;带 --replace 时先成功读到数据行再清区间,避免文件有问题却先删了线上数据。
- 筛选下拉上限 500 -> 5000:导入 4~7 月后店铺已达 604 个,原来下拉里会缺 104 个店铺;提交筛选值的截断上限同步放开。
- 补两个测试:导出文件去重拆行、窗口过滤+replace。
2026-10-07 16:53:55 +08:00
chenxi
55e1533b40 Merge remote-tracking branch 'origin/main' 2026-10-07 16:50:23 +08:00
471aa714e8 fix(发货数据): 以本地全量核对通过的版本替换 #282 的同步实现
#282 的整合版在本地全量同步中发现问题,改用已与工作平台逐单核对通过的实现(保留 #283/#284 及 main 其它改动):
- 订单元数据只缓存精简字段(状态仅存取消/拆分/合并,标签只存是否线上发货),全表扫描后释放;
  #282 缓存完整标签会在全表扫描时内存超限导致同步中途退出
- 按规则排除的包裹(取消/拆分/合并/线上发货)清除本窗口旧记录
- 剩余 @ 前缀统一去掉(工作平台导出无 @)
- 自动发货仓虚拟/补差单:单号已被其它包裹实际输出时留空(对齐工作平台)
- 出库映射保留作废单但排在有效单之后;换单按出库单号顺序一对一配对
测试:同步单测相应调整(作废单排序、多候选配对)。
验证:本地清空 8.15-9.30 后全量同步 9.1-9.16,与工作平台对比两边共有包裹 195,555,带单号漏拉 1 单。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014nvGZkg27YMEdhry6eiuwf
2026-10-07 16:33:23 +08:00
chenxi
701bc42f44 Merge remote-tracking branch 'origin/main' 2026-10-07 16:18:47 +08:00
chenxi
77b808245b 业绩明细账单侧筛选收窄为「总账备注 = 订单收入」
同步命令与页面说明改为仅按「订单收入」取账单侧数据,其余匹配/输出/统计口径不变。
2026-10-07 16:18:36 +08:00
ae694004cf 总账备注匹配:账单项目自动去 wx 前缀再查一次
先原样匹配,不中则去掉开头 wx 前缀(wx基础软件服务费 → 基础软件服务费)再匹配;原样命中优先,不影响既有结果。
科目映射表优先级链路与回落原总账备注链路都按此顺序匹配。
2026-10-07 15:58:42 +08:00
0933941533 总账备注取科目映射表:平台/账单项目键做大小写与空格归一
科目映射表平台写「唯品会JX」、页签内部键「唯品会jx」,原样索引匹配不到;统一小写去空格后索引与查找。
2026-10-07 15:30:56 +08:00
1cbc8312a6 店铺收款账户账单:总账备注优先取「科目映射表」的财务备注
账单项目在「科目映射表」里能匹到(同平台+同项目)时,总账备注取该规则的「财务备注」;
多规则时按业务备注/商品名称关键词取最具体的一条;匹不到则保留原有总账备注映射。规则按平台+项目预索引,避免逐行扫全表。
2026-10-07 15:24:58 +08:00
db2ee47fd8 发布切换容器前等待生产上游同步完成 (#284) 2026-10-07 15:00:48 +08:00
chenxi
9f1f4d08a7 淘系支付宝账户筛选栏去掉数据源渠道与收支类型,关键词移到账单项目后
第 1 行:原始店铺/总账备注/账单项目/关键词;第 2 行:发生时间 + 查询/重置右对齐,
与其它账户页签布局一致。
2026-10-07 14:57:35 +08:00
chenxi
73617e4899 Merge remote-tracking branch 'origin/main' 2026-10-07 14:50:18 +08:00
chenxi
57c1ea7046 抖音账户关键词框与其它页签统一(去掉匹配方式下拉)
关键词改为单输入框;后端对 15~30 位纯数字按等值匹配(记录编码/订单号)快速返回,
其余仍为包含匹配,避免抖音账户全表扫描导致的长等待。
2026-10-07 14:50:07 +08:00
4b3baeaaf0 拼多多完整账单导入:账单项目为空时按「收支方向 + 业务描述」回填
源文件偶发账单项目为空的行;导入时在 activate 之前用同代已有口径回填(方向+描述取众数),
找不到口径的行保持原样。生产已用同一规则回填历史 10 行(技术服务费 4 / 交易收入 4 / 优惠券结算 1 / 提现 1),
拼多多页签总账备注为空从 10 行降到 0。
2026-10-07 14:36:34 +08:00
chenxi
74d3558bfa 店铺收款账户账单其余页签对齐淘系支付宝账户样式
统计卡片与筛选栏按淘系支付宝页压缩(金额改万元),筛选栏改 4 列等宽栅格
(发生时间跨 2 格、按钮右对齐),并修复窄屏工具区被撑高的问题。
2026-10-07 14:30:30 +08:00
chenxi
d7e6e50a04 Merge remote-tracking branch 'origin/main' 2026-10-07 14:22:30 +08:00
chenxi
9160ca77a0 淘系支付宝账户筛选栏改为每行 4 个的等宽栅格
四列等宽栅格(发生时间跨 2 格、按钮右对齐),容器 ≤860px 两列、≤560px 单列;
日期控件改弹性宽度避免溢出;字段与功能不变,筛选区高度由 314px 降到 155px。
2026-10-07 14:22:23 +08:00
c4a976751d 修复订单售后页面一直转圈:店铺候选改成定时预热
上一次把店铺候选的完整计算放在 app()->terminating() 里,但服务器是 mod_php,
响应要等整个请求(含终止回调)结束才算完成,浏览器就一直转圈、侧边栏停在骨架屏。
线上实测:发布后第一个打开订单售后费用明细的人,页面会卡两分钟以上。

改成:页面只返回毫秒级的店铺目录兜底,完整候选(目录 ∪ 订单镜像店铺)由新增的
order-data:warm-shop-candidates 每小时预热一次,并在发布脚本的 cron 里注册。
2026-10-07 14:21:36 +08:00
a9da8d4447 修复发货镜像字段校准与合并列表耗时 (#283) 2026-10-07 14:08:20 +08:00
916fb30f37 修复批量筛选:纯数字单号当数组键会被 PHP 转成 int
batchValues() 原来拿值本身当数组键去重,纯数字订单号(如 3317080368285022883)会被
PHP 转成 int,后续 whereIn 就成了数字和长文本比较,走不上 so_id / outer_oi_id 的
前缀索引,实测退化成全表扫描(70 秒以上)。

改成键加 v 前缀、返回原字符串,ctype_digit 显式传字符串。新增用例覆盖前导零单号
0001234 与 1234,防止再回归。
2026-10-07 14:05:53 +08:00
chenxi
c38299b078 Merge remote-tracking branch 'origin/main' 2026-10-07 13:58:01 +08:00
chenxi
4310a58104 淘系支付宝账户:压缩顶部区域、统计金额改万元、修复工具区异常高度
统计卡片与筛选栏整体收紧约 26%(金额改万元展示),修复窄屏下工具区
被 flex-basis 撑高 384px 导致明细表被推离首屏的问题;明细表样式不变。
2026-10-07 13:57:54 +08:00
e5922dd78e 订单售后费用明细 / 商品推广费用明细:订单号和商品编码支持批量查询
两个页签的「订单号」「商品编码」改成多行输入框,可以直接粘一整列:
每行一个,或用逗号、空格、分号、顿号分隔,一次最多 50 个值,多值取并集。

- 订单号批量:先去两套来源解析候选 o_id(单表、等值 IN,走各自前缀索引),
  再按订单过滤;单个订单号仍保留「从头匹配」的模糊语义。
  线上实测 20 个真实单号解析 0.01 秒。
- 商品编码批量:每个编码在 商品/款式/店铺编码(推广页为 item_id)里匹配一组,
  多组 OR;仍受统计日期/订单日期范围约束。
- 非淘系旧查询路径同步支持批量,保持两套口径一致。
2026-10-07 13:55:02 +08:00
6c054c7081 整合发货补漏与导出口径修复,保留主线同步保护 (#282) 2026-10-07 13:52:18 +08:00
4b97b30a3a 商品推广费用明细:店铺筛选改成和订单售后费用明细一致的多选控件
- 把「店铺名称:可点选的多选 + 模糊搜索」抽成公共组件
  partials/order-data-shop-picker.blade.php,订单售后费用明细改为引用它,
  商品推广费用明细用同一个控件(原来是一个纯文本输入框)。
- 推广页提交 shop_name[](多个取并集),后端镜像查询和非淘系旧查询都改成
  按多个店铺 OR 匹配,仍兼容原来的单个 shop_name。
- 推广表的店铺名带下划线(天猫_卓禾家具旗舰店),和订单镜像的「天猫-…」
  不是同一套命名,所以候选单独取自 ops_item_sales_cost_ratio 当前统计日期
  出现过的店铺,按日期缓存 24 小时(单次约 0.4 秒、约 400 个店铺)。
2026-10-07 13:39:25 +08:00
chenxi
2a30d9bac3 Merge remote-tracking branch 'origin/main' 2026-10-07 13:20:37 +08:00
chenxi
35ee115522 淘系支付宝账户筛选栏样式对齐淘系微信账户
改用与 AccountBills 相同的筛选栅格与容器查询(≤1200px 两列、≤600px 单列,
发生时间整行),替换原来 7 列一行排开的布局。
2026-10-07 13:20:30 +08:00
d76b102bca 总账备注平台口径:1688 / 新佰广 前缀按阿里巴巴匹配
新佰广1688、1688xxx 店铺名不带「阿里巴巴」前缀,之前落到页签默认平台(淘系支付宝=淘宝),
1688 系账单项目匹配不到总账备注;新增两条前缀映射(1688、新佰广 → 阿里巴巴)并补单测断言。
2026-10-07 13:20:06 +08:00
af83d75a00 订单售后费用明细:订单号查询改为先解析候选订单再过滤
订单号原来在「订单 ⋈ 明细」关联后做三列 %x% 匹配,没有日期条件时优化器会放弃
索引,淘系那套 520 万订单 × 680 万明细必须全表扫描,线上实测单条跑到 19 分钟
还没结束(还占满 Apache 工作进程)。

改成两段式:先用带前缀索引的单表查询把订单号解析成两套来源各自的候选 o_id
(线上订单号 / 子订单号从头匹配、内部订单号按数值等值),再让分支按 o_id 过滤。
两套来源分开解析,避免两侧 o_id 撞号。候选超过 500 条或订单号不足 4 个字符时
退回原来的包含匹配,保持既有行为。

顺带给 jst_OrderItem 补 outer_oi_id 前缀索引(非淘系子订单号原来要扫 70 秒),
已在生产建好索引。
2026-10-07 11:31:56 +08:00
e8b8b816f4 修复「是否种菜订单」映射读取为空:补 deleted_at 列并改用表查询
新建的 jst_order_label_planting_rules 缺 deleted_at,而模型基类带 SoftDeletes,查询报错被兜底成空映射,
页面全部显示「否」。补迁移 2026_10_07_130000(建表迁移同步补上)并把服务改为 DB 表查询。
2026-10-07 11:20:03 +08:00
96b8f503c6 账单明细:平台筛选改为按账户/数据来源分类(与店铺收款账户账单页签一致)
- 平台下拉改为淘系支付宝/淘系微信/拼多多/京东账单/京喜账单/京东网银钱包/抖音/得物

- 京东账单与京喜账单同表,按店铺前缀切分;财务备注/财务类型仍按店铺前缀匹配映射表
2026-10-07 11:12:24 +08:00
d877735507 聚水潭订单标签明细:新增「是否种菜订单」列
下单时间后面新增「是否种菜订单」列,逐行按(公司 + 标签)匹配财务维护的映射表:命中为是、未命中为否。
- 新表 jst_order_label_planting_rules + 模型 + 缓存服务,导入命令 jst-order-labels:import-planting-rules(读「判断种菜单.xlsx」)
- 导出 CSV 同步新增该列,页面/导出同口径
- 本地构建通过;改动/新增 PHP 文件 php -l 通过
2026-10-07 11:14:04 +08:00
5b95b655bb 运费对账:全量汇总缓存 1 小时,避免每 15 分钟重跑两分钟的重查询
无筛选的全量汇总约 110~200 秒,按原来的 900 秒缓存会让常看这个页面的人
反复等两分钟;带筛选的汇总走索引很快,保持 15 分钟。
2026-10-07 11:01:29 +08:00
chenxi
1a024c2b26 Merge remote-tracking branch 'origin/main' 2026-10-07 10:55:58 +08:00
chenxi
d7582cdb46 修复业绩明细导出:补平台筛选 + 改游标流式输出
导出补齐平台筛选,并把 chunk(1000) 的 OFFSET 轮询改为 cursor() 单查询流式输出。
2026-10-07 10:55:52 +08:00
af8f1403fb 修复运费对账汇总卡死与订单店铺候选查询过慢
- 运费对账全量汇总:哈希关联的 join buffer 从 16MB 提到 128MB(空间上限 384MB)。
  300 万行明细 × 400 万行最新关联表在 16MB 下会退化成磁盘多趟扫描,实测超过
  max_statement_time(300s) 也跑不完,页面「记录数/运费合计」永远停在计算中;
  调整后约 110 秒出结果并写入缓存。
- 订单售后费用明细店铺候选:改回两个来源各自 DISTINCT 后在 PHP 合并(UNION 会
  把两个上百万行结果一起物化去重排序)。同时完整候选只算一次并缓存 24 小时,
  冷缓存时先返回毫秒级的店铺目录,完整列表放到响应结束后补齐,避免页面为了
  下拉候选把工作进程占住两分钟。
2026-10-07 10:52:36 +08:00
40832546da 聚水潭订单标签明细:店铺/标签筛选改为可搜索多选
店铺名称、标签由原生单选 select 改为项目已有的「可搜索多选」组件(可打字搜索、全选/清空、勾选一条或多条),
结果按 shop_name[]/label[] GET 提交;控制器支持数组并与旧单值参数兼容,店铺 whereIn 精确匹配、多个标签 OR 包含匹配,
页面/分页/导出同口径。生产数据实测:多选店铺 951=951、多选标签 39575=39575、旧单值 92=92 均与独立 SQL 一致。
2026-10-07 10:54:07 +08:00
chenxi
2341a839f3 Merge remote-tracking branch 'origin/main' 2026-10-07 10:41:06 +08:00
chenxi
0bb4df6512 业绩明细扩展到店铺收款账户账单全部平台页签
按页签配置来源表与列映射(得物用 bill_date、京东系列/抖音用 order_no+income、
京东与京喜按店铺名拆分、京东/抖音只取活动代);单号查询同时带原始号与核心号
以匹配拼多多的日期前缀单号;镜像表增加平台维度与平台列/筛选。
2026-10-07 10:41:00 +08:00
4258bd4e0e 侧边栏权限:新增一级菜单「种菜数据汇总」不再被旧权限集合隐藏
种菜明细表 / 聚水潭订单标签明细 原本挂在「账单流水数据」下,移入新一级菜单「种菜数据汇总」后,
按页面键保存过精确权限的访问组(总账组/结算组/税务组)里没有新 section,导致菜单不显示、直达链接 403。
按既有 company-management 兼容做法:能看「账单流水数据」即可见「种菜数据汇总」。
生产数据实测(临时容器、同镜像、只读):修复前 12 个访问组账号全部看不到,修复后 21 个账号全部可见。
2026-10-07 10:27:20 +08:00
fb15402003 feat: 店铺维度报表无业绩月份列默认隐藏 (#281) 2026-10-07 10:01:13 +08:00