274 Commits

Author SHA1 Message Date
d47a72c175 店铺违规预警:新增违规原因与处置方式两列(页面/统一表/导入导出) (#323) 2026-10-13 11:32:27 +08:00
7ecd5a59e6 fix(发货数据): 快递名称、仓库按发货数据视图取值,与工作平台一致
- 9 月核对剩余 256 条快递名称、44 条仓库不一致;抽样 14/14 工作平台显示的就是发货数据视图
  (Jst_SendData_View_extension) 的 expressName / wareHoursName。视图有值时以视图为准,
  视图没有该出库单时保留出库单/发货明细推断的值。
- 发货数据视图、出库单头按 300 个出库单一批查询(原 800),减少副本库超时导致整月重跑中断。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014nvGZkg27YMEdhRy6EiUwf
2026-10-13 09:53:02 +08:00
e61e3b50fb 店铺违规预警:补充生产每日同步定时任务(cron 遗漏) (#315) 2026-10-13 09:36:14 +08:00
c55c06026f 快递应付:报价维护只留报价页签 + 附加费结算定时同步(每日7天/每周90天) (#314) 2026-10-12 17:49:10 +08:00
e883d262f0 快递应付:修复三方仓进销存加载超时 2026-10-12 17:22:17 +08:00
26f945ba29 本地预览:测试断言同步到已启用的 OPcache 配置
deploy/php-local.ini 已改为 OPcache 开启 + 每次请求校验时间戳,测试仍断言 opcache.enable=0 导致失败;更新为 enable=1 并校验时间戳。
2026-10-12 17:12:10 +08:00
d8dfb33437 fix(发货数据): 仓库按实际出库单发货仓、补入无需物流虚拟发货、作废单号识别换单
- 仓库一律按实际出库单 wms_co_id 映射(从快递公司一致的明细行学习仓库名,样本>=3 且占比>=90% 才回填),
  修正发货明细写总仓而实际由工厂代发仓出库(如 710099981090 千优代发仓)的情况。
- 快递名称为"无需物流"(补差/信誉/运费等虚拟发货,如 X00006)的包裹仓库统一为"简尚-自动发货仓",与工作平台一致。
- 换单配对:快递明细单号只对应作废出库单时视为已换单,改用有效出库单的新单号(如 DPK366101313659 -> SF1549142274850)。
- 出库单兜底不再跳过"无需物流"的无单号出库单(信誉订单/补差价/运费专用等虚拟发货),按工作平台口径补入自动发货仓、快递单号为空;
  9 月核对工作平台有、线上无的 565 条虚拟链接,抽查确认为此原因(出库单无单号被跳过)。
- 换单配对查询(logistic_id 无索引)副本库超时时跳过本页,不再中断整轮同步;结果返回 tracking_pairing_skipped_pages。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014nvGZkg27YMEdhry6eiuwf
2026-10-12 09:58:05 +08:00
1e689d254e 附加费结算:超长费/退回费/拦截费拉取、导入核验与模板导出 2026-10-12 09:33:24 +08:00
cbec6a8b62 供应商管理增加每天08:15完整同步 (#302) 2026-10-11 13:57:28 +08:00
ad3961b82d 修正供应商易签宝账号并接入签署选择 (#300) 2026-10-11 13:39:03 +08:00
49c6e1ecd1 修复供应商管理资料镜像索引与存储分类 (#298) 2026-10-11 12:34:31 +08:00
665b8fafd2 接入供应商管理页面与共享镜像 (#297) 2026-10-11 12:11:15 +08:00
0e1feaf1e6 修复协议文件签字盖章区域过小 (#293) 2026-10-11 10:17:32 +08:00
473b6f4ebb 修复流程审批状态取不到:OA 流程表改用 jiansun 的实时副本
原来取的是中台库 dbo.flow_flow,那份数据停在 2026-07-16,7 月之后的申请
(比如 shp20260716165004772 京喜-清木居工厂店 关店流程)审批状态全是空的,
而工作平台显示「流程中」。

jiansun.dbo.flow_flow 是实时表(今天还在更新,10543 行),同名单据里
flowStatus=1、当前审批人=山时。已登记并完成首次全量 + 建 flowId 索引;
中台那份旧副本改为停止同步(数据保留)。

流程统计页与店铺账号密码的「流程类型 / 审批状态 / 流程状态」两处取值都跟着换成实时表。
2026-10-09 10:25:43 +08:00
b4821ca933 唯品会MP/JX账户:订单结算时间改为「账单期间」,筛选项也按账单期间过滤
1) 两列改名:AccountBillColumns 里唯品会两个页签的「订单结算时间」→「账单期间」(金额式账期月份,如 2026-07),列类型从 date 改 text 避免被当日期格式化;
2) 筛选标签:DATE_FILTER_LABELS 里 vipshop / vipshop-jx 从「结算时间」改成「账单期间」;
3) 筛选真正生效:这两个页签的 start/end 不再过滤 occurred_at,改为按 payload.settle_period(YYYY-MM)与所选区间取月份交集,页面列表与导出同步生效。
同步更新 AccountBillsTableTest 的断言。
2026-10-09 09:35:16 +08:00
d69a7d2ca7 店铺账号密码:把流程类型和审批状态两列都拉过来
上一版只带了「流程状态」(关店流程的审批状态)。改成按 ERP 店铺名取该店铺
最近一单申请流程(开店/变更/关店/主体注销自动),同时给出流程类型与审批状态,
列位置仍在「店铺状态」后面;两列都可搜索多选筛选、可排序。

线上:966 个账号店铺里 396 家最近一单是关店流程;状态文案与流程统计页一致。
状态映射缓存从 10 分钟放宽到 30 分钟(全量算一次要几秒,数据变化很慢)。
2026-10-08 15:12:41 +08:00
c88c0f165e 店铺账号密码:新增「流程状态」列(取店铺关店流程)
按 ERP 店铺名关联 jiansun.dbo.fys_shopInfo_flow 的关店流程(flowType=10),
同一店铺取最近一单,状态用 OA 流程表的审批状态文案(流程中/完成/拒绝/撤回…)。
列加在「店铺状态」后面,同时做成可搜索多选筛选,并支持按流程状态排序。

线上:966 个账号店铺里 486 个有关店流程(流程中 352 / 完成 46 / 撤回 14 / 拒绝 2 /
其余审批状态暂缺),列值缓存 10 分钟。
2026-10-08 14:51:44 +08:00
885961084e 流程统计:接入店铺申请流程(开店/变更/关店)共享镜像
数据源:jiansun.dbo.fys_shopInfo_flow(申请单明细,4572 行,含店铺/平台/负责人/利润中心/商标/变更原因/关店原因等)
+ 中台库 dbo.flow_flow(按 flowId 关联审批状态与当前审批人),两个数据集已登记并完成首次全量。

- 新增 ShopInfoFlowMirrorRepository:左连接两套镜像,支持单据编号/申请人/申请日期/当前审批人/
  ERP店铺名称/店铺运营负责人/利润中心/商标号等文本筛选,流程类型、审批状态、平台为可搜索多选。
- 审批状态文案取自 OA 前端字典:0暂存/1流程中/2拒绝/3完成/4撤回/5待签署/6已签署/7待审批;
  流程类型:8店铺开店/9店铺变更/10店铺关店/12主体注销自动流程。
- 页面按目录表渲染(查询条件、筛选字段、导出),列与外部店铺申请页对齐。
- TableRegistry 登记为只读上游页,镜像未就绪时页面给提示而不是报错。
2026-10-08 14:38:16 +08:00
69f3d9228f 店铺账号密码:授权状态 / 店铺状态筛选改成可搜索多选
复用已有的 CaiWuMultiSelect 组件(按钮 + 复选面板 + 全选/清空),勾选结果提交为
authorization_status[] / store_status[],多个取值取并集;一个都不勾=全部。

- 目录表的筛选控件在 query 表单外(靠 form 属性关联),给多选组件补了 formId 选项,
  生成的隐藏 input 带上 form,保证能随查询表单提交。
- pageFilters 支持数组筛选值(去重、最多 50 个);仓库侧筛选统一按列表处理,
  单选(旧链接)和多选都兼容。
2026-10-08 13:48:51 +08:00
401dfb089a 店铺账号密码:上游新增字段自动跟随(镜像补列 + 页面自动多出这一列)
新增 business-mirror:follow-upstream-columns:先把数据字典刷新到最新,再把上游
视图里新增、当前数据集还没同步的字段追加进镜像定义并立刻建列,下一次常规同步
就会带回数据。只做新增,不删除/不改写已有字段;字段名带 password/secret/token/
cipher/credential 等敏感关键字的一律跳过。已登记到发布 cron(每天 06:40)。

页面侧:config/upstream_mirrors.php 的 auto_follow_columns 用「页面 => 数据集」
登记,FollowedUpstreamColumns 服务把 followed_columns 变成表格列;这类列只展示、
不生成查询条件(后端还没有对应筛选口径)。

数据集自带的数据变动仍然由每分钟的 business-mirror:sync-tables 增量同步。
2026-10-08 13:19:53 +08:00
627fa966ef 店铺账号密码:新增授权状态、店铺状态两列(在账号分组名称后面)
两列都来自已有的共享镜像,按店铺名关联(下划线、空格统一成短横线):
- 授权状态:聚水潭店铺档案 jst_shopInfo 的授权到期时间;无到期时间为未授权,
  已过期为已过期,其余为已授权。
- 店铺状态:店铺档案 fys_shopInfo.shopState,0 正常 / 3 关闭中 / 6 已关闭,
  与店铺基础信息页口径一致。

两列同时做成下拉筛选(已授权/已过期/未授权、正常/关闭中/已关闭),并支持按业务
顺序排序;映射结果缓存 10 分钟,避免每次列表都全表读两张档案表。

线上命中率:账号表 966 个店铺,授权状态命中 963、店铺状态命中 948。
2026-10-08 11:39:34 +08:00
dcdea11f0f 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:27 +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
db2ee47fd8 发布切换容器前等待生产上游同步完成 (#284) 2026-10-07 15:00:48 +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
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
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
fb15402003 feat: 店铺维度报表无业绩月份列默认隐藏 (#281) 2026-10-07 10:01:13 +08:00
cf7924fdc6 订单售后费用明细:合并淘系(天猫/淘宝)订单来源
聚水潭把淘系订单放在 jst_qmcust_* 系列;页面镜像已接入后,报表改为两套来源合并:

- 订单、明细、售后分别按来源取数(ops_jst_orders* 与 ops_jst_qmcust_*),列映射一致;
  淘系明细没有 send_warehouse,用订单上的 wms_co_id 兜底
- 每套来源各自下推筛选条件并按当前页各取所需行数再合并,避免整表物化后排序
- 店铺候选同时包含两类店铺(天猫-/淘宝- 前缀)
- 镜像数据集登记:jst_qmcust_orderlist/_item、jst_qmcust_refundlist/_item 及分层策略
- 用例:淘系订单与售后进入报表、店铺候选包含淘系、双源多店铺筛选
2026-10-07 10:00:20 +08:00
eda10bd740 订单售后费用明细:店铺筛选改为可点选的多选模糊查询
- 店铺名称由单个输入框改为可点选的多选下拉:候选里可按关键字模糊筛选、多选、全选当前结果/清空
- 提交 shop_name[],多个店铺取并集逐个模糊匹配;保留旧的单值 shop_name 兼容
- 候选来自订单镜像中真实出现过的店铺,缓存 1 小时;单次最多 50 个店铺,超出在面板内提示
- 补充仓库层与页面层用例
2026-10-07 10:00:20 +08:00
5ef4119a3d feat: 主体维度经营报表无数据月份列默认隐藏 (#280) 2026-10-06 23:51:16 +08:00
e777e75176 店铺违规信息预警:统一表头映射,支持查询、导入导出与每日同步 2026-10-06 19:02:22 +08:00
13a9697447 店铺收款账户账单新增「总账备注」筛选;每日账单脚本支持胜算异步分片导出
- 所有账户页签在「店铺」右侧新增「总账备注」下拉:按(平台+账单项目)翻译成账单项目集合过滤,页面/列设置/导出同口径;淘系支付宝、淘系微信同页签混多平台时按店铺名前缀细分
- 每日账单脚本:胜算超出同步导出上限(url=null+taskId)时自动从「异步导出下载管理」取回本次任务全部分片并合并成一份 CSV,导入前按页面笔数核对(不一致则跳过导入)
- 实测:京东 7 月异步导出两片 219158+235846=455004 笔 / 收入 17695094.84 / 支出 8035128.21,与已导入口径一致
2026-10-06 18:46:57 +08:00
78857a51d9 feat: 店铺维度报表按主体期间拆分并支持期初数据维护
- 改为按期初数据+系统主体+爬虫新主体生成主体期间,一行一期间,修复流程历史重复行
- 变更日当天归新主体、老主体失效显示变更日前一天;关店和其他非正常状态两列显示 -
- 期初数据首次打开固化为系统库设置,可在「规则信息 → 店铺维度报表逻辑配置」在线增删改
- 爬虫店铺主体按税号归一,首次抓到的新主体写入期间变更表并自动生成新期间
- 新增期间变更表迁移与 crawl_shop_company 镜像数据集
2026-10-06 18:42:12 +08:00
d6b0b7f1d7 feat: 接入退货取件管理镜像、实际运费核算与 XLSX 导出 2026-10-06 16:05:59 +08:00
4523682d1e feat: 逆向物流报价页接入计费规则与费率表 2026-10-06 16:01:35 +08:00
e147c90a2c 店铺收款账户账单新增「总账备注」列(按平台+账单项目映射表取值)
- 新增 ec_account_ledger_remarks 映射表与 account-ledger-remarks:import 导入命令(平台/账单项目/总账备注)
- 新增 AccountLedgerRemarkMap:按店铺名前缀识别平台,无前缀时用页签默认平台;缺失匹配保持空白
- 全部账户页签(含淘系支付宝自有列定义)在「店铺/店铺名称」右侧新增「总账备注」列,页面/列设置/导出共用同一份列定义
- 控制器在分页与导出流读取时补齐 payload.ledger_remark,不改动上游账单与共享镜像数据
- 用例:新增 AccountLedgerRemarkMapTest;修正唯品会 JX/MP 列清单断言
2026-10-06 15:42:57 +08:00
047a527b3f 唯品会JX账户时间筛选标签改为结算时间
唯品会JX账户的时间筛选标签由「发生时间」改为「结算时间」;标签仍集中在 DATE_FILTER_LABELS 映射(京东账单/京喜账单/京东网银钱包=费用结算时间,抖音/唯品会MP/唯品会JX=结算时间,其余默认发生时间)。
2026-09-29 11:12:48 +08:00
21cb3dcbcf 唯品会MP账户时间筛选标签改为结算时间
唯品会MP账户的时间筛选标签由「发生时间」改为「结算时间」,与该页签的订单签收或退款时间口径一致;标签仍集中在 DATE_FILTER_LABELS 映射(抖音、唯品会MP=结算时间;京东账单/京喜账单/京东网银钱包=费用结算时间;其余默认发生时间)。
2026-09-29 11:03:53 +08:00
2d59e63861 抖音账户时间筛选标签改为结算时间
抖音账户的时间筛选标签由「发生时间」改为「结算时间」,与该页签的「结算时间」列名一致。标签集中成 DATE_FILTER_LABELS 映射(京东账单/京喜账单/京东网银钱包=费用结算时间,抖音=结算时间,其余沿用发生时间),不再散落 if-else。
2026-09-29 10:53:04 +08:00
a0c99c3e8d 新增店铺收款京喜账单页签并从京东账单切分
在京东账单右侧新增京喜账单页签,复用京东日账单的取数、列定义、筛选、排序、分页与导出,只增加平台维度过滤:京东账单排除京喜店铺,京喜账单只取京喜店铺。平台口径集中在 config/jd_bill_platform.php 与 JdBillPlatform(含口径切换起始日期参数,默认全量历史),仓库通过 forPlatform() 收窄,两个口径互补、总额守恒,底层镜像数据不修改不删除。真实镜像实测:京喜 488,464 笔 + 京东 210,983 笔 = 拆分前 699,447 笔,收入/支出/差额逐项误差为 0。
2026-09-28 19:25:53 +08:00
9bee8e3f46 Merge branch 'feature/qiuxiang-vipshop-jx-account' 2026-09-28 17:52:27 +08:00
a08b28199d 新增店铺收款唯品会JX账户页签
店铺收款账户账单新增 vipshop-jx 页签:导航配置、列定义、控制器与前端路由;读取共享账单表 ec_account_bills 中的唯品会JX(JITX)原始账单(店铺/类型/二次备注/销售订单号/含税金额),按金额正负拆出收入与支出,订单日期由销售订单号前 6 位还原(原始账单无日期列)。DB 页签日期统一按 Y-m-d H:i:s 返回,JX 页签汇总口径为收支净额,并补齐单元与功能测试。
2026-09-28 17:51:41 +08:00
26556a9169 Add warehouse short names to inventory report
Restore warehouse name mapping ledger and inventory short-name column.
2026-09-28 16:33:38 +08:00
454919b0c7 Revert "Merge branch 'fix/chenxi-inventory-mapping-release-20260928'"
This reverts commit c328dcbe77e114d1111c22ca22870227ad280ab7, reversing
changes made to bfbfe935eab814027d7d2328accc18a60171a712.
2026-09-28 12:00:54 +08:00