版本更新历史
每个版本发布时间 + 主要改动。最新版本在最上面。
升级方式:左侧菜单 About → Check for Updates → 按提示安装。Plugin 端 .app 由 Solution Provider 帮你装。
v1.6.5 — 2026-05-04
多 GRN per PO + Delta 计算 + Master/Detail 视图
一张 PO 可以有多张 GRN
- 之前每张 PO 只对应一张 GRN,partial receipt 时容易丢数据。
- 现在 每个 RECEIVING / RECEIVED / CLOSED webhook 都建一张新 GRN,只含本次新增的 delta(cumulative - 之前已 booked)。
- 重传 webhook 自动跳过(delta = 0)—— 没有重复入库。
修复重大 bug
- EA vs UOM 单位错误:
PODTL.TransferedQty实际存的是 EA,之前误当 PO line UOM 比较 → delta 计算混乱。现在统一用 EA 比较。 - GRN 不更新 PODTL.TransferedQty:
grn.AddDetail()不会自动建 PO ↔ GRN 链接,所以 AutoCount 不更新已收数。现在 grn.Save() 后手动 UPDATE PODTL.TransferedQty += 实际 SmallestQty,下次 webhook 算 delta 才能基于准确基线。 - Qty 四舍五入漂移:用 PO line UOM 写入时 AutoCount 按 item decimal places round Qty。现在回读 GRDTL.SmallestQty 用实际值更新 PODTL,保证 PO ↔ GRN ↔ inventory 三边一致。
Webhook 数据来源更稳健
- WMS 有时把 cumulative 留在
asnLineItems.quantity= 0,把实际接收量写在asnItemReceiveDetails(per-event RV records)。 - 新逻辑 sum 两个来源的 receiveQty 取 MAX,不管 WMS 哪边填了都能拿到正确累计。
Plugin UI: PO → ASN Sync master/detail
- 主行:PO + GRNs count 列
- ▶ 展开看每张 GRN:GRN# (View button) / WMS Status / GRN Date / Created By / Items / Webhook At
移除
- 旧的 "DUPLICATE_SKIPPED" 防御机制(v1.6.3 加的)—— 用 delta 逻辑天然替代。
v1.6.4 — 2026-05-03
修复 plugin 卡顿
- M009 schema migration:自动加上
Z_WmsPickingNoteStatus(WmsSyncEnabled)的 filtered index。- 之前
PickingNoteWorker每 15 秒 poll 一次都要全表扫描,在 50K+ 行的客户 DB 上一锁就是几十秒,plugin UI 同时读这些表也跟着卡。 - 现在 worker 只摸索引里的"正在同步"小子集,几毫秒搞定。Plugin 加载 Picking List 不再卡。
- 客户无感知:API 启动那一瞬间自动建好 index(< 1 秒),不影响数据。
- 之前
v1.6.3 — 2026-05-02
Sync Log 大改 + 防重复 GRN + Retry Failed 按钮
Sync Log 增强
- View Payload 对话框:选中行点 View Payload(或双击行)打开弹窗,pretty-print 完整 Request + Response JSON,每个面板有 Copy 按钮。
- Ctrl + Alt + 0 cleanup panel:在 Sync Log tab 按这个组合键弹出"Cleanup & Retention"对话框,可以按日期范围 + Type 批量 Clear Payloads(保留行)或 Delete Rows(硬删除)。
- 自动按天清理:
PayloadRetentionDays设置控制(默认 90 天),每小时 API 自动 NULL 出超过 N 天的 payload 字段,bound DB 体积。 - 所有 worker 现在都写完整 payload:之前只有 PoTransferController + ItemSync 写 payload;现在 PickingNoteWorker / AsnCreateWorker / CancellationWorker / AsnCancellationWorker 也全部写。
防重复 GRN
- WmsCallbackController.HandleAsnStatus:创建 GRN 之前先检查
Z_WmsAsnReceiving和PODTL.TransferedQty。 - 之前 WMS 重发 webhook(网络重传、partial→complete、per-SKU partial deliveries)会每次都建一张新 GRN。现在跳过重复,把 callback 行链接到原始 GRN。
- 修复 source 标注:
Z_WmsAsnReceiving或PODTL.TransferedQty,让审计清晰。
新增 Retry Failed 按钮
- 三个 tab 各加一个:
- Item Code Sync → "Retry Failed Items"(按勾选行)
- PO → ASN Sync → "Retry Failed PO Pushes"(按 Ctrl+Click 选中行)
- Picking List Sync → "Retry Failed Picking Notes"(按勾选行)
- 都有确认对话框列出要重试的 ID。只动选中的行,不会一键 retry 所有。
AsnCreateWorker 不再无限重试
- 失败的 PO 现在 park 为
WmsStage = 'Failed',下一轮 poll 跳过。 - 之前每 15 秒都重试,PO 数据有问题会一直骚扰 WMS。
- 用户必须看 Sync Log 找出失败原因,修复后用 Retry Failed PO Pushes 主动重试。
其他
- 所有 Sync Now 按钮加确认对话框(Picking / Item Code / Item Type)。
- Item Code Sync Now 上限从 5 提到 20。
- Sync Log tab 列标题修复(z-order bug 导致表头被遮)。
v1.6.2 — 2026-05-02
支持大 PO + B2B 订单类型 + Picking Note SQL 超时修复
- WmsGatewayClient:替换
FormUrlEncodedContent为手动 byte-identicalStringContent。FormUrlEncodedContent内部有 ~65520 字符的 URI 长度上限,超过 200+ 行 line items 的 PO 推送会报 "Invalid URI: The Uri string is too long"。- 现在 1000+ 行的 PO 也能推。
- PickingNoteWorker:OrderType 改为
B2B,加serviceLevel = LTL。- Melodies 客户的仓库流程需要这两个字段,否则后续操作(点 Ship 按钮)会失败。
- PickingNoteWorker SQL 超时:把
db.GetDataTable换成原生SqlCommand+CommandTimeout = 120。- 客户 DB 有 50K+ Z_PickingNote 行 + 几百万 detail 行,30 秒默认超时不够。
v1.6.1 — 2026-05-02
PO Transfer 跳过本地 item 检查 + 完整 payload 日志
- PoTransferController:取消推送前的 item-exists 预检查。
- 客户偏好让 WMS 自己返回错误(更权威 + 实时)。
- WMS 错误信息(含完整 request + response)写入 Z_WmsSyncLog,方便排查。
- 推送失败时,整张 request + response payload 落到 sync log。
v1.6.0 — 2026-05-02
导航与 UI 大整理
默认菜单顺序变了
- Operation Menu 顺序:Item Code Sync → PO → ASN Sync → Picking List Sync → Cancel Picking Job → Sync Log → About。
- Item Type Sync 和 UOM Names Sync 不再是独立菜单 —— 改为 Item Code Sync 页右上角的两个按钮(弹窗形式)。
默认行为变更
- Picking List Sync 默认 manual:Auto-sync new 默认 OFF,由 Ctrl + Alt + 0 弹窗启用(高级选项)。
- Cancel Picking Job 默认只读:行不能勾选,必须 Ctrl + Alt + 0 进入"可选模式"才能勾。
- 打开主窗口默认停在 Item Code Sync(之前是 Picking List)。
搜索功能
- 每个 tab 顶部都有 Search 文本框 + Filter 按钮。
- Enter 键 = 触发 Filter。
- 搜索是"任意列匹配":item code、PN 号、PO 号、客户名、driver、备注……都可以。
页面标题
- Header 上动态显示当前页面("WMS Sync Hub / Item Code Sync"),不再只是 logo。
Picking List 列宽优化
- Picking Note 列宽缩小 70%,腾出空间给其他信息。
- ItemCode 列宽缩小 20%。
v1.5.0 — 2026-05-02
UOM 推送变 opt-in + 单行触发按钮 + 完整 sync log 审计
- PackageInfoSyncStarted master switch:UOM 描述推送(Phase 2)默认 OFF,必须显式启用。
- Push UOM (focused) 按钮:Item Code Sync 页右上角,针对当前光标行单独推送 UOM。前提:item 必须已经同步过(LastSyncDate 不为空)。
- Z_WmsSyncLog 审计:UOM_PUSH 类型的记录写完整 payload。
v1.4.0 — 2026-05-01
BAS Packaging Description Sync (Phase 2 of Item Sync)
- 新增 WmsBasService:通过 BAS direct API(gwmsth.best-inc.com)登录拿 token + cookie。
- ItemSyncWorker 加 Phase 2:Phase 1(GLINK BatchOperateItem 推 SKU)成功后,自动调 BAS API 把 AutoCount UOM 名字(UN / CT 等)覆盖到 WMS packaging description。
- 1-5 秒随机 jitter + 每 cycle max 10 个 item,防止打死 BAS API。
v1.3.x — 2026-05-01
Item Type Sync via WMS BAS direct API
- v1.3.0:后端 ItemTypeSyncWorker,通过 BAS API 把 AutoCount.ItemType 推到 WMS 商品分类。
- v1.3.1:硬化 + plugin UI 加 Start Sync 按钮。
- v1.3.2:修复 navBar inject bug + Sync Now 重试 fail / never-seen 的行。
v1.2.x — 2026-05-01 / 2026-04-27
早期功能迭代
- v1.2.3:Item Sync UX 大改 + worker 硬化 + 切换到 AED_LS_01 数据库。
- v1.2.4:AutoCount resolver 跳过 backup 文件夹(_bk20250207 等),加 appsettings 覆盖路径。
- ShipFrom 支持 StreetLine2 + StreetLine3(长地址)。
- DPAPI 自动加密 SqlPassword + LoginPassword(service 启动时)。
早期版本 — 2026-04-24 / 25
基础设施
- API 用 Topshelf 包装为 Windows Service。
- About 对话框 + Check-for-Updates(WmsHubUpdater + S3 release pipeline)。
- Plugin 端 ErrorLogger 接到 hot paths + footer 版本指示器。
查看最新公告
有时候发布间隔很短(v1.6.0 到 v1.6.4 同一天发了 5 个版本)—— 这是因为客户实测中发现的问题陆续修复。保持 API 自动更新打开就不会落后。