From c480f957c5b2b6030ea28dfe6db49017289a44e0 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Thu, 10 Sep 2026 19:27:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lastleg-service/AGENTS.md | 4 +- scripts/agents-index-contract.ps1 | 111 ++++++++++++++---------------- 2 files changed, 55 insertions(+), 60 deletions(-) diff --git a/lastleg-service/AGENTS.md b/lastleg-service/AGENTS.md index e97d75a18..4a6119858 100644 --- a/lastleg-service/AGENTS.md +++ b/lastleg-service/AGENTS.md @@ -9,6 +9,8 @@ ## 快速索引 +人工计划自动生成托盘与资源重试:`inboundplan/controller/InboundPlanController.java` → `inboundplan/service/ContainerInboundPlanConversionCoordinator.java` 的 `convertManualAndAutoMaterialize`;保存单票后重读全柜预览,全员为 `PLANNED/RESOURCE_PENDING`、预览就绪且存在待绑定资源时自动调用柜级 `confirm`。一票柜立即触发,多票柜在最后一票齐全后触发;资源异常沿 `resourcePendingPlanCount` 和原柜级预览/确认入口重试,不新增独立正常人工步骤。回归入口为 `src/test/java/com/baiyue/lastleg/inboundplan/service/ContainerInboundPlanConversionCoordinatorTest.java`。 + 头程来源托盘快照:`service/LoadingCompletedConsumer.java`、`mapper/LastlegSourcePalletMapper.java`;来源标签随装柜完成事件落入 `ll_order_source_pallet`,后续由 `inboundplan/service/InboundPlanService.java` 与 `ContainerInboundPlanConversionCoordinator.java` 传递给海外资源批量预留。排查标签跨区丢失时沿此链路核对,不能在尾程页面重新生成头程托盘码。 | 功能 | 入口 | @@ -122,5 +124,5 @@ - 安全投影边界变更同时运行 `SecurityProjectionArchitectureTest` 与 `LastlegSecurityContractTest`;`security/controller|dto|service` 只允许依赖本子域和根 `InternalServiceTokenGuard`,其他 Lastleg 业务包不得直接依赖这些投影内部包。 - 表字段、注释和索引同步维护基线 SQL 与统一增量 SQL;生产/存量库只执行增量脚本。 - 事件契约变化同时检查 `common-event-contract` 版本、Event Bridge 消费方和旧 Payload 哈希兼容。 -- 定向验证:`mvn -pl lastleg -am test`。 +- 定向验证:从后端根执行 `mvn -pl lastleg-service -am test`。 - 事件链路变更至少覆盖重复事件、相同来源入仓单、事务回滚、并发单号、内部令牌和租户越权测试。 diff --git a/scripts/agents-index-contract.ps1 b/scripts/agents-index-contract.ps1 index bc13ba95a..42596bc14 100644 --- a/scripts/agents-index-contract.ps1 +++ b/scripts/agents-index-contract.ps1 @@ -87,6 +87,13 @@ $overseasPdaAgentsPath = Join-Path $workspaceRoot 'apps/pda-overseas-uniapp/AGEN $backendAgentsPath = Join-Path $backendRoot 'AGENTS.md' $rootAgents = Read-RequiredText $rootAgentsPath +$businessIndexPath = Join-Path $workspaceRoot 'docs/业务快速索引.md' +$businessIndex = Read-RequiredText $businessIndexPath +Assert-Contains $rootAgents 'docs/业务快速索引.md' '根按需业务索引入口' +Assert-MarkdownTableUnique $businessIndexPath '## 业务快速路由表' 0 '详细业务路由表' +Assert-MarkdownTableUnique $businessIndexPath '## 常用说法与歧义分流' 0 '业务歧义分流表' +Assert-Contains $businessIndex '## 业务快速路由表' '详细业务表存在' +Assert-Contains $businessIndex '## 常用说法与歧义分流' '业务歧义分流存在' $adminAgents = Read-RequiredText $adminAgentsPath $clientAgents = Read-RequiredText $clientAgentsPath $pdaAgents = Read-RequiredText $pdaAgentsPath @@ -104,7 +111,7 @@ Assert-Contains $rootAgents '源码结构、接口与 DTO、字段、状态机 Assert-Contains $rootAgents '数据库记录、上传文件、缓存、会话、消息、搜索索引和其他运行状态均视为可丢弃' '根开发运行状态范围' Assert-Contains $rootAgents '后端 MyBatis Mapper 新增、移动或扫描遗漏' '根 Mapper 快速入口' Assert-Contains $rootAgents 'node scripts/mapper-scan-contract.mjs' '根 Mapper 静态门禁' -Assert-Contains $rootAgents '脚本管理、全量验证与测试造数' '根脚本管理快速入口' +Assert-Contains $businessIndex '脚本管理、全量验证与测试造数' '根脚本管理快速入口' Assert-Contains $rootAgents 'baiyue-firstleg/scripts/AGENTS.md' '根脚本最近指引' Assert-Contains $engineeringConstraints '禁止为旧代码、旧调用或开发环境存量保留旧接口/旧字段别名' '工程无兼容执行规则' Assert-Contains $engineeringConstraints '不授权自动重置数据库、删除数据/文件、执行 SQL、部署或修改环境' '无兼容安全边界' @@ -124,29 +131,15 @@ Assert-Contains $rootAgents 'docs/独立任务协作登记.md' '根测试协作 Assert-Contains $engineeringConstraints '不得同时加载两表后混合选取任务' '工程协作登记选择门禁' Assert-Contains $docsIndex '[测试环境独立任务协作登记](独立任务协作登记.md)' '文档测试登记入口' Assert-Contains $docsIndex '[开发环境独立任务协作登记](开发环境独立任务协作登记.md)' '文档开发登记入口' -Assert-Contains $testTaskRegistry 'projectId `c64729ff-6710-43c6-8ef2-d84e9666cc1e`' '测试登记保存项目' -Assert-Contains $testTaskRegistry 'C:\Users\BY-OY\Desktop\code\chongchong-global`' '测试登记工作目录' -# 启用状态属于各环境当前登记事实;不得用测试分支的历史任务名称/ID强制重新启用本地清空表。 -$registeredTestRows = @([regex]::Matches($testTaskRegistry, '(?m)^\|\s*`([0-9a-f-]{36})`\s*\|')) -if ($registeredTestRows.Count -eq 0) { - Assert-Contains $testTaskRegistry '不启用总控调度' '测试登记清空状态' - Assert-Contains $testTaskRegistry '当前无已登记总控或长期专项' '测试登记清空明示' - Assert-Contains $testTaskRegistry '持续授权同步失效' '测试登记清空授权边界' -} else { - Assert-Contains $testTaskRegistry '已重新启用测试环境总控调度' '测试登记启用状态' - Assert-Contains $testTaskRegistry 'parent_task_id' '测试登记父任务字段' - Assert-Contains $testTaskRegistry 'project_id' '测试登记项目字段' - Assert-Matches $testTaskRegistry '(?m)^\|[^\r\n]*【总控】[^\r\n]*\|' '测试登记总控职责' - $registeredIds = @($registeredTestRows | ForEach-Object { $_.Groups[1].Value }) - if (@($registeredIds | Select-Object -Unique).Count -ne $registeredIds.Count) { - Add-Failure '测试登记存在重复 task_id' - } - $taskLines = @($testTaskRegistry -split '\r?\n' | Where-Object { $_ -match '^\|\s*`[0-9a-f-]{36}`\s*\|' }) - $controlLines = @($taskLines | Where-Object { $_.Contains('【总控】') }) - if ($controlLines.Count -ne 1) { Add-Failure '测试登记必须有且仅有一个总控' } - foreach ($taskLine in $taskLines) { - Assert-Contains $taskLine '`c64729ff-6710-43c6-8ef2-d84e9666cc1e`' '测试任务项目隔离' - } +# 当前测试登记已明确清空;历史 projectId/task_id 不得成为恢复调度的依据。 +Assert-Contains $testTaskRegistry '当前无登记任务' '测试登记清空明示' +Assert-Contains $testTaskRegistry '清空全部任务登记与调度规则' '测试登记清空状态' +Assert-Contains $testTaskRegistry '不根据旧登记、历史消息或历史台账自动派工、恢复任务或回传进度' '测试登记禁止历史派工' +Assert-Contains $testTaskRegistry '不作为当前调度或授权依据' '测试登记清空授权边界' +Assert-NotContains $testTaskRegistry '已重新启用测试环境总控调度' '测试登记不得隐式启用' +$checked++ +if ($testTaskRegistry -match '(?m)^\|\s*`[0-9a-f-]{36}`\s*\|') { + Add-Failure '测试登记不得残留任务行' } Assert-NotContains $testTaskRegistry '01a0194a-259c-7171-8967-074731a27618' '测试登记历史总控' Assert-NotContains $testTaskRegistry '01a06c0b-0515-7c60-b329-77342b54e666' '测试登记当前开发总控' @@ -164,7 +157,7 @@ foreach ($businessDocsEntry in @( 'docs/国内货柜履约/README.md', 'docs/海外仓业务/README.md' )) { - Assert-Contains $rootAgents $businessDocsEntry "根业务域入口 $businessDocsEntry" + Assert-Contains $businessIndex $businessDocsEntry "根业务域入口 $businessDocsEntry" } foreach ($removedPhaseDocsEntry in @('docs/一期/', 'docs/二期/', 'docs/三期/', 'docs/四期/')) { Assert-NotContains $rootAgents $removedPhaseDocsEntry "根已删除阶段目录 $removedPhaseDocsEntry" @@ -172,18 +165,18 @@ foreach ($removedPhaseDocsEntry in @('docs/一期/', 'docs/二期/', 'docs/三 Assert-NotContains $rootAgents '不含出库和派送' '根海外仓全流程范围' # 新增稳定业务能力必须从根表和目标部署单元直接命中。 -Assert-Contains $rootAgents '入库单扣货、解除与履约门禁' '根入库扣货路由' +Assert-Contains $businessIndex '入库扣货、解除与凭证' '根入库扣货路由' Assert-Contains $adminAgents '入库扣货、解除与凭证历史' 'Admin 入库扣货路由' Assert-Contains $backendAgents '入库单扣货、解除、凭证与履约门禁' '后端入库扣货路由' -Assert-Contains $rootAgents '客户资金账户、充值与海外业务资金指令' '根客户资金账户路由' +Assert-Contains $businessIndex '客户资金账户、充值、授信与业务扣费' '根客户资金账户路由' Assert-Contains $adminAgents '客户资金账户与柜级公共费用分摊' 'Admin 客户资金账户路由' Assert-Contains $clientAgents '客户资金账户、授信与充值申请' 'Client 客户资金账户路由' Assert-Contains $backendAgents '客户资金账户、充值、授信、冻结、结算与跨区资金指令' '后端客户资金账户路由' -Assert-Contains $rootAgents '顶层授权快照' '根海外顶层授权快照' +Assert-Contains $businessIndex '顶层授权快照' '根海外顶层授权快照' Assert-Contains $backendAgents '顶层授权快照' '后端海外顶层授权快照' -Assert-Contains $rootAgents '目的港码头拖车与还空预警' '根目的港码头拖车路由' -Assert-Contains $rootAgents '与订舱级拖车预约是不同生命周期' '根两类拖车边界' -Assert-Contains $rootAgents '尾程订单控制与柜级入仓计划转换' '根尾程订单控制路由' +Assert-Contains $businessIndex '目的港码头拖车与还空预警' '根目的港码头拖车路由' +Assert-Contains $businessIndex '与订舱级拖车预约是不同生命周期' '根两类拖车边界' +Assert-Contains $businessIndex '尾程订单控制与柜级入仓计划转换' '根尾程订单控制路由' Assert-Contains $adminAgents '目的港码头拖车与还空预警' 'Admin 目的港码头拖车路由' Assert-Contains $adminAgents '尾程订单控制与柜级入仓计划转换' 'Admin 尾程订单控制路由' Assert-Contains $backendAgents '目的港码头拖车与还空预警' '后端目的港码头拖车路由' @@ -209,7 +202,7 @@ $firstlegAgents = Read-RequiredText (Join-Path $backendRoot 'firstleg/AGENTS.md' $lastlegAgents = Read-RequiredText (Join-Path $backendRoot 'lastleg-service/AGENTS.md') $warehouseAgents = Read-RequiredText (Join-Path $backendRoot 'warehouse/AGENTS.md') $coloadOpenApi = Read-RequiredText (Join-Path $backendRoot 'firstleg/src/main/resources/openapi/coload-groups-v1.yaml') -Assert-Contains $rootAgents 'modules/unified-orders/api/coLoadGroups.ts' '根同柜不可拆组入口' +Assert-Contains $businessIndex 'modules/unified-orders/api/coLoadGroups.ts' '根同柜不可拆组入口' Assert-Contains $adminAgents '成员数是入仓片段数,不等于订单票数' 'Admin 同柜成员语义' Assert-Contains $backendAgents 'loading/coload/controller/PlatformColoadGroupController.java' '后端同柜不可拆组入口' Assert-Contains $firstlegAgents '服务端冻结每票全部 `WAIT_SPLIT` 可用入仓片段与满箱数' 'Firstleg 同柜建组边界' @@ -233,7 +226,7 @@ Assert-Contains $lastlegAgents '/api/platform/v1/last-leg/inbound-plans/convert- # 本轮新增的批量下单、测量计费、智能装柜、账单联查与导出重试必须从最近指引直达。 $fileAgents = Read-RequiredText (Join-Path $backendRoot 'file/AGENTS.md') $financeAgents = Read-RequiredText (Join-Path $backendRoot 'finance/AGENTS.md') -Assert-Contains $rootAgents '客户头程订单批量导入' '根批量下单快速路由' +Assert-Contains $businessIndex '客户头程订单批量导入' '根批量下单快速路由' Assert-Contains $orderAgents 'MerchantBatchImportService.java' 'Order 批量导入入口' Assert-Contains $orderAgents '仓库目录必须翻页读取全部候选' 'Order 批量模板全量仓库约束' Assert-Contains $clientAgents '中文批量导入' 'Client 批量导入入口' @@ -259,7 +252,7 @@ $orderDeclarationService = Read-RequiredText (Join-Path $backendRoot 'order/src/ $unifiedOrderQueryService = Read-RequiredText (Join-Path $backendRoot 'order/src/main/java/com/baiyue/order/service/UnifiedOrderQueryService.java') $firstlegDeclarationService = Read-RequiredText (Join-Path $backendRoot 'firstleg/src/main/java/com/baiyue/firstleg/service/OrderDeclarationSyncService.java') $adminDeclarationEditor = Read-RequiredText (Join-Path $workspaceRoot 'apps/admin-web/src/modules/unified-orders/components/OrderDeclarationEditorDialog.vue') -Assert-Contains $rootAgents '平台修改客户原始申报与履约渠道' '根订单申报快速路由' +Assert-Contains $businessIndex '平台修改客户原始申报与履约渠道' '根订单申报快速路由' Assert-Contains $adminAgents '客户原始申报资料编辑与渠道变更' 'Admin 订单申报快速路由' Assert-Contains $backendAgents '平台修改客户原始申报、履约渠道变更与跨服务同步' '后端订单申报快速路由' Assert-Contains $orderAgents '平台版本化修改客户原始申报' 'Order 申报编辑入口' @@ -272,7 +265,7 @@ Assert-Contains $orderDeclarationService 'ORDER_DECLARATION_UPDATED_V1' 'Order Assert-Contains $firstlegDeclarationService 'mapper.byEvent(event.tenantId(), event.eventId())' 'Firstleg 申报 eventId 幂等' Assert-Contains $firstlegDeclarationService 'event.version() < current.orderVersion()' 'Firstleg 申报版本单调性' Assert-Contains $adminDeclarationEditor '仓库/PDA 实测数据不会被覆盖' 'Admin 申报事实边界提示' -Assert-Contains $rootAgents '统一列表仍固定显示 `PENDING_REVIEW` 并提供审核动作' '根待审核订单优先状态' +Assert-Contains $businessIndex '统一列表仍固定显示 `PENDING_REVIEW` 并提供审核动作' '根待审核订单优先状态' Assert-Contains $orderAgents '统一主状态/下一动作仍固定为 `PENDING_REVIEW/APPROVE_ORDER`' 'Order 待审核优先状态' Assert-Contains $unifiedOrderQueryService 'order.getStatus() == OrderStatus.SUBMITTED' 'Order 待审核状态判断' Assert-Contains $unifiedOrderQueryService 'pendingReview ? "PENDING_REVIEW" : summary.mainStatus()' 'Order 待审核主状态优先' @@ -285,14 +278,14 @@ $fbaPricingService = Read-RequiredText (Join-Path $backendRoot 'firstleg/src/mai $inboundFeeDetailService = Read-RequiredText (Join-Path $backendRoot 'firstleg/src/main/java/com/baiyue/firstleg/service/InboundFeeDetailService.java') $adminUnifiedOrdersApi = Read-RequiredText (Join-Path $workspaceRoot 'apps/admin-web/src/modules/unified-orders/api/unifiedOrders.ts') $adminCarrierRatesView = Read-RequiredText (Join-Path $workspaceRoot 'apps/admin-web/src/modules/fba-pricing/carrier-rates/pages/CarrierRatesView.vue') -Assert-Contains $rootAgents '头程订单、批量审核预览与入仓码关系' '根批量审核预览路由' +Assert-Contains $businessIndex '头程订单、批量审核预览与入仓码关系' '根批量审核预览路由' Assert-Contains $adminAgents '订单列表、批量审核预览、详情、商品图片与入库费用' 'Admin 批量审核预览路由' Assert-Contains $backendAgents '平台订单批量审核预览' '后端批量审核预览路由' Assert-Contains $orderAgents '平台批量审核预览' 'Order 批量审核预览入口' Assert-Contains $orderOpenApi '/api/platform/v1/orders/first-leg/batch-review-preview:' 'Order 批量审核预览 OpenAPI' Assert-Contains $batchReviewPreviewService '固定两次批量查询生成审核弹窗快照' 'Order 批量审核禁止逐票查询' Assert-Contains $adminUnifiedOrdersApi '/platform/v1/orders/first-leg/batch-review-preview' 'Admin 批量审核预览 API' -Assert-Contains $rootAgents '客户专属报价、柜级阶梯运费与费用调整' '根客户专属报价路由' +Assert-Contains $businessIndex '客户专属报价、柜级阶梯运费与费用调整' '根客户专属报价路由' Assert-Contains $adminAgents '客户专属价格簿、柜级阶梯运费与受控调价' 'Admin 客户专属报价路由' Assert-Contains $backendAgents '客户专属价格簿、柜级阶梯运费与受控调价' '后端客户专属报价路由' Assert-Contains $firstlegAgents '客户专属价格簿、柜级阶梯运费与调价边界' 'Firstleg 客户专属报价入口' @@ -309,7 +302,7 @@ Assert-Path 'baiyue-firstleg/firstleg/src/main/java/com/baiyue/firstleg/pricing/ # 海外异常处理必须贯通证据、原出库来源和库存恢复,不能退化为仅修改派送状态。 $exceptionOrderService = Read-RequiredText (Join-Path $backendRoot 'lastleg-service/src/main/java/com/baiyue/lastleg/exceptionorder/service/ExceptionOrderService.java') $inventoryCommandService = Read-RequiredText (Join-Path $backendRoot 'lastleg-service/src/main/java/com/baiyue/lastleg/inventory/command/service/InventoryCommandService.java') -Assert-Contains $rootAgents '退回海外仓时先把实收恢复到指定真实托盘/库位' '根海外异常库存恢复路由' +Assert-Contains $businessIndex '退回海外仓时先把实收恢复到指定真实托盘/库位' '根海外异常库存恢复路由' Assert-Contains $adminAgents '库存恢复、异常完成与派送 `RETURNED` 由服务端原子推进' 'Admin 海外异常原子边界' Assert-Contains $backendAgents '海外异常退回、库存恢复与客户回访' '后端海外异常库存恢复路由' Assert-Contains $lastlegAgents 'ExceptionEvidenceFileGateway.java' 'Lastleg 异常证据入口' @@ -325,9 +318,9 @@ $pendingReviewOrderService = Read-RequiredText (Join-Path $backendRoot 'order/sr $merchantInboundBillingService = Read-RequiredText (Join-Path $backendRoot 'firstleg/src/main/java/com/baiyue/firstleg/service/MerchantInboundBillingService.java') $clientSession = Read-RequiredText (Join-Path $workspaceRoot 'apps/client-web/src/api/session.ts') $clientHttp = Read-RequiredText (Join-Path $workspaceRoot 'apps/client-web/src/api/http.ts') -Assert-Contains $rootAgents '`PENDING_REVIEW/WAIT_MEASURE/WAIT_SPLIT/LOADING`' '根智能装柜四态候选' -Assert-Contains $rootAgents '能否加入以服务端 `canAssign` 为准' '根智能装柜资格边界' -Assert-Contains $rootAgents '人工加入允许跨渠道,智能推荐仍按柜次渠道' '根智能装柜渠道边界' +Assert-Contains $businessIndex '`PENDING_REVIEW/WAIT_MEASURE/WAIT_SPLIT/LOADING`' '根智能装柜四态候选' +Assert-Contains $businessIndex '能否加入以服务端 `canAssign` 为准' '根智能装柜资格边界' +Assert-Contains $businessIndex '人工加入允许跨渠道,智能推荐仍按柜次渠道' '根智能装柜渠道边界' Assert-Contains $backendAgents '/pending-review-assignments' '后端待审核装柜占位入口' Assert-Contains $backendAgents '/unpicked-items' '后端未拣整批移除入口' Assert-Contains $firstlegAgents '任一成员已拣则整组保留' 'Firstleg 同柜组整批移除边界' @@ -338,7 +331,7 @@ Assert-Contains $firstlegOpenApi '/api/platform/v1/first-leg/smart-loading/plans Assert-Contains $firstlegOpenApi '/api/platform/v1/first-leg/smart-loading/plans/{planId}/unpicked-items:' '未拣整批移除 OpenAPI' Assert-Contains $pendingReviewOrderService 'orders.pendingReviewPage' 'Order 待审核候选权威查询' Assert-Contains $pendingReviewOrderService '"PENDING_REVIEW"' 'Order 待审核候选状态映射' -Assert-Contains $rootAgents '客户入库结果与头程费用确认' '根客户入库费用确认入口' +Assert-Contains $businessIndex '客户入库结果与头程费用确认' '根客户入库费用确认入口' Assert-Contains $firstlegAgents 'expectedFeeVersion' 'Firstleg 客户费用版本确认' Assert-Contains $clientAgents 'components/InboundBillingPanel.vue' 'Client 入库费用确认入口' Assert-Contains $firstlegOpenApi '/api/merchant/v1/first-leg/orders/{orderId}/inbound-billing/confirm:' '客户费用确认 OpenAPI' @@ -358,7 +351,7 @@ $smartLoadingService = Read-RequiredText (Join-Path $backendRoot 'firstleg/src/m $inboundSchema = Read-RequiredText (Join-Path $backendRoot 'firstleg/src/main/resources/db/phase2-inbound-schema.sql') $adminWeightPanel = Read-RequiredText (Join-Path $workspaceRoot 'apps/admin-web/src/modules/inbounds/weight/components/WeightOcrPanel.vue') $clientOrdersView = Read-RequiredText (Join-Path $workspaceRoot 'apps/client-web/src/modules/first-leg/views/FirstLegOrdersView.vue') -Assert-Contains $rootAgents '称重确认、整票库位块与部分拣货资源结算' '根称重库位块路由' +Assert-Contains $businessIndex '称重确认、整票库位块与部分拣货资源结算' '根称重库位块路由' Assert-Contains $backendAgents '称重确认、整票库位块与 PDA 资源结算' '后端称重库位块路由' Assert-Contains $firstlegAgents 'MeasurementLocationOccupationService.java' 'Firstleg 称重库位块入口' Assert-Contains $firstlegAgents '最新测量批次的正数 `totalVolumeCbm/originalVolumeCbm` 取较大值' 'Firstleg 库位块测量批次体积选择' @@ -378,7 +371,7 @@ Assert-Contains $inboundSchema 'UNIQUE KEY uk_pallet_allocation_weight (tenant_i Assert-Contains $adminWeightPanel 'row.locationCode' 'Admin 称重卡片库位消费' Assert-Contains $adminWeightPanel 'putawayStatusLabel(row.slotStatus)' 'Admin 称重卡片槽位状态' Assert-NotContains $adminWeightPanel 'class="putaway-guide"' 'Admin 已移除整票预留引导区' -Assert-Contains $rootAgents '`totalPackageCount/remainingPackageCount`' '根智能装柜暂估数量' +Assert-Contains $businessIndex '`totalPackageCount/remainingPackageCount`' '根智能装柜暂估数量' Assert-Contains $firstlegAgents '`totalPackageCount/remainingPackageCount`' 'Firstleg 智能装柜暂估数量' Assert-Contains $adminAgents '`totalPackageCount/remainingPackageCount`' 'Admin 智能装柜暂估数量' Assert-Contains $firstlegOpenApi 'required: [id, packageCount, totalPackageCount, remainingPackageCount' '智能装柜计划数量 OpenAPI' @@ -397,7 +390,7 @@ $iamMemberService = Read-RequiredText (Join-Path $backendRoot 'iam/src/main/java $adminCustomersView = Read-RequiredText (Join-Path $workspaceRoot 'apps/admin-web/src/modules/customers/pages/CustomersView.vue') $clientCompanyProfile = Read-RequiredText (Join-Path $workspaceRoot 'apps/client-web/src/modules/tenant-management/views/CompanyProfileView.vue') $clientMembersView = Read-RequiredText (Join-Path $workspaceRoot 'apps/client-web/src/modules/tenant-management/views/MembersView.vue') -Assert-Contains $rootAgents '公司联系电话/邮箱是企业资料,不作为成员登录标识' '根企业联系人边界' +Assert-Contains $businessIndex '公司联系电话/邮箱是企业资料,不作为成员登录标识' '根企业联系人边界' Assert-Contains $adminAgents '公司联系电话只作企业联系信息,不修改管理员/成员登录手机号' 'Admin 企业联系人边界' Assert-Contains $clientAgents '成员登录手机号可选,修改时同步 Auth、撤销该账号会话并审计' 'Client 成员登录手机号边界' Assert-Contains $authAgents '登录标识与企业联系人解耦' 'Auth 登录标识入口' @@ -411,7 +404,7 @@ Assert-Contains $clientCompanyProfile '不会修改任何成员的登录手机 Assert-Contains $clientMembersView '用于该成员手机号登录;修改后会同步认证账号并退出该成员现有会话' 'Client 成员登录手机号提示' $fileAgents = Read-RequiredText (Join-Path $backendRoot 'file/AGENTS.md') $qualificationOpenApi = Read-RequiredText (Join-Path $backendRoot 'file/src/main/resources/openapi/qualification-required-package-v1.yaml') -Assert-Contains $rootAgents '法人身份证选填,可在已有营业执照后单独补传或替换' '根法人身份证单独上传语义' +Assert-Contains $businessIndex '法人身份证选填,可在已有营业执照后单独补传或替换' '根法人身份证单独上传语义' Assert-Contains $fileAgents '法人身份证选填,客户可在已有营业执照后通过 `/api/merchant/v1/files/qualifications` 单独新增或替换' 'File 法人身份证单独上传入口' Assert-Contains $qualificationOpenApi '/api/merchant/v1/files/qualifications:' '客户单文件资质 OpenAPI' Assert-Contains $qualificationOpenApi 'LEGAL_PERSON_ID 可在已有营业执照后单独新增或替换' '客户法人身份证单独上传契约' @@ -427,8 +420,8 @@ $adminLastMileOrders = Read-RequiredText (Join-Path $workspaceRoot 'apps/admin-w $loadingListsOpenApi = Read-RequiredText (Join-Path $backendRoot 'firstleg/src/main/resources/openapi/loading-lists-v1.yaml') $pdaLoadingApi = Read-RequiredText (Join-Path $workspaceRoot 'apps/pda-uniapp/api/pda-loading.js') $cabinetEvidenceService = Read-RequiredText (Join-Path $backendRoot 'firstleg/src/main/java/com/baiyue/firstleg/loading/service/CabinetLoadingEvidenceService.java') -Assert-Contains $rootAgents '拖车预约由 `RELEASED` 订舱拥有,不按客户、柜次、装柜计划或真实柜号归属' '根订舱级拖车语义' -Assert-Contains $rootAgents '证据以 `taskId + warehouseId` 进入任务专用 API' '根柜级证据入口' +Assert-Contains $businessIndex '拖车预约由 `RELEASED` 订舱拥有,不按客户、柜次、装柜计划或真实柜号归属' '根订舱级拖车语义' +Assert-Contains $businessIndex '证据以 `taskId + warehouseId` 进入任务专用 API' '根柜级证据入口' Assert-Contains $adminAgents '订舱级拖车预约' 'Admin 拖车快速入口' Assert-Contains $adminAgents '不选择或提交客户、柜次、装柜计划或真实集装箱号' 'Admin 拖车订舱级边界' Assert-Contains $backendAgents '订舱级拖车' '后端拖车快速入口' @@ -465,7 +458,7 @@ Assert-Contains $adminAgents 'PDA 最终完成前必须补齐' 'Admin 真实柜 Assert-Contains $pdaAgents '当前 `taskId + warehouseId` 走任务专用 API' '国内 PDA 柜级证据入口' Assert-Contains $pdaLoadingApi '/first-leg/pda-loading/tasks/${encodeURIComponent(taskId)}/evidence?warehouseId=' '国内 PDA 证据查询 API' Assert-NotContains $pdaLoadingApi '/inbounds/${encodeURIComponent(inboundId)}/loading/evidence' '国内 PDA 旧入仓证据 API' -Assert-Contains $rootAgents '上传以幂等键绑定包含文件内容的请求哈希' '根装柜证据上传重放边界' +Assert-Contains $businessIndex '上传以幂等键绑定包含文件内容的请求哈希' '根装柜证据上传重放边界' Assert-Contains $firstlegAgents '完全重放返回当前视图且不得再次上传 File' 'Firstleg 装柜证据重放边界' Assert-Contains $cabinetEvidenceService 'uploadHash(warehouseId, expectedVersion, evidenceType, sealNo, remark, multipart)' '装柜证据上传请求哈希' Assert-Contains $cabinetEvidenceService 'digest.update(multipart.getBytes())' '装柜证据文件内容哈希' @@ -612,7 +605,7 @@ foreach ($overseasFulfillmentRoute in @( foreach ($overseasFulfillmentRootEntry in @( 'OutboundsView.vue', 'DeliveryOrdersView.vue', 'ExceptionOrdersView.vue', 'CustomerVisitsView.vue' )) { - Assert-Contains $rootAgents $overseasFulfillmentRootEntry '根海外履约正式业务路由' + Assert-Contains $businessIndex $overseasFulfillmentRootEntry '根海外履约正式业务路由' } Assert-Contains $adminAgents '海外排车、出库与派送' 'Admin 海外出库派送入口' Assert-Contains $adminAgents '海外异常退回与客户回访' 'Admin 海外异常回访入口' @@ -704,8 +697,8 @@ $containerCustomsOpenApi = Read-RequiredText (Join-Path $backendRoot 'firstleg/s $adminContainerCustomsApi = Read-RequiredText (Join-Path $workspaceRoot 'apps/admin-web/src/modules/container-loading/api/platformContainerCustoms.ts') $clientContainerCustomsApi = Read-RequiredText (Join-Path $workspaceRoot 'apps/client-web/src/modules/first-leg/api/customs.ts') $customsFileOpenApi = Read-RequiredText (Join-Path $backendRoot 'file/src/main/resources/openapi/customs-file-and-export-v1.yaml') -Assert-Contains $rootAgents 'ContainerCustomsPanel.vue' '根整柜报关 Admin 入口' -Assert-Contains $rootAgents 'CustomsDocumentsDialog.vue' '根整柜报关 Client 入口' +Assert-Contains $businessIndex 'ContainerCustomsPanel.vue' '根整柜报关 Admin 入口' +Assert-Contains $businessIndex 'CustomsDocumentsDialog.vue' '根整柜报关 Client 入口' Assert-Contains $adminAgents 'components/ContainerCustomsPanel.vue' 'Admin 整柜报关入口' Assert-Contains $adminAgents 'complete-all-buy' 'Admin 全买单柜入口' Assert-Contains $clientAgents 'components/CustomsDocumentsDialog.vue' 'Client 退税报关资料入口' @@ -747,7 +740,7 @@ Assert-Contains $lastlegBusinessOpenApi 'snapshotVersion' 'Lastleg 整柜计划 Assert-Contains $lastlegBusinessOpenApi 'snapshotHash' 'Lastleg 整柜计划快照哈希' Assert-Contains $lastlegBusinessOpenApi 'sourceContainerBookingId' 'Lastleg 稳定来源柜身份' Assert-Contains $adminAgents '/orders/container-summaries' 'Admin 柜级摘要目标入口' -Assert-Contains $rootAgents '尾程订单控制与柜级入仓计划转换' '根柜级计划入口' +Assert-Contains $businessIndex '尾程订单控制与柜级入仓计划转换' '根柜级计划入口' Assert-Contains $backendAgents '分页返回全部稳定来源柜' '后端全柜工作台范围' Assert-Contains $adminAgents '服务端分页返回全部稳定来源柜' 'Admin 全柜工作台范围' Assert-Contains $lastlegAgents '分页返回全部稳定来源柜' 'Lastleg 全柜工作台范围' @@ -791,8 +784,8 @@ $eventTypes = Read-RequiredText (Join-Path $backendRoot 'common-event-contract/s $overseasDispatcher = Read-RequiredText (Join-Path $backendRoot 'event-bridge-service/src/main/java/com/baiyue/eventbridge/service/OverseasEventDispatcher.java') $financeEventConsumer = Read-RequiredText (Join-Path $backendRoot 'finance/src/main/java/com/baiyue/finance/service/BusinessFeeSourceEventService.java') $financePhase1Service = Read-RequiredText (Join-Path $backendRoot 'finance/src/main/java/com/baiyue/finance/service/FinancePhase1OperationService.java') -Assert-Contains $rootAgents '财务管理与柜级公共费用分摊' '根柜费分摊快速路由' -Assert-Contains $rootAgents '海外业务费用来源与客户财务' '根海外费用快速路由' +Assert-Contains $businessIndex '财务管理与柜级公共费用分摊' '根柜费分摊快速路由' +Assert-Contains $businessIndex '海外业务费用来源与客户财务' '根海外费用快速路由' Assert-Contains $adminAgents '财务、客户资金账户与柜级公共费用分摊' 'Admin 柜费分摊快速路由' Assert-Contains $backendAgents '柜级公共费用跨客户分摊' '后端柜费分摊快速路由' Assert-Contains $backendAgents '海外业务费用来源跨区入池' '后端海外费用快速路由' @@ -827,16 +820,16 @@ Assert-Contains $overseasDispatcher 'EventTypes.WALLET_COMMAND_REQUESTED' 'Event Assert-Matches $overseasDispatcher '(?s)FINANCE_EVENT_TYPES\.contains\(eventType\).{0,150}?financeEventClient\.deliver\(event\)' 'Event Bridge Finance 事件定向投递' Assert-Contains $financeAgents '`eventId + payloadHash` 防重放冲突' 'Finance 海外事件幂等边界' Assert-Contains $financeAgents '`PAYABLE + DIRECT_PAID` 审核版本必须生成 `BUSINESS_DIRECT_PAID`' 'Finance 直接已付隔离边界' -Assert-Contains $rootAgents '入库单扣货、解除与履约门禁' '根入库扣货快速路由' -Assert-Contains $adminAgents '入库单扣货、解除、凭证与历史' 'Admin 入库扣货快速路由' +Assert-Contains $businessIndex '入库扣货、解除与凭证' '根入库扣货快速路由' +Assert-Contains $adminAgents '入库扣货、解除与凭证历史' 'Admin 入库扣货快速路由' Assert-Contains $backendAgents '入库单扣货、解除、凭证与履约门禁' '后端入库扣货快速路由' Assert-Contains $firstlegAgents '入库单扣货、履约门禁与凭证' 'Firstleg 入库扣货入口' -Assert-Contains $rootAgents '客户资金账户、充值与海外业务资金指令' '根客户钱包快速路由' +Assert-Contains $businessIndex '客户资金账户、充值、授信与业务扣费' '根客户钱包快速路由' Assert-Contains $backendAgents '客户资金账户、充值、授信、冻结、结算与跨区资金指令' '后端客户钱包快速路由' Assert-Contains $lastlegAgents '海外业务资金指令与结果' 'Lastleg 跨区钱包入口' Assert-Contains $lastlegAgents '拆柜打托成本与客户应收分摊' 'Lastleg 拆柜打托费用入口' Assert-Contains $clientAgents '换标申请必须提交正数 CNY `chargeAmount`' 'Client 换标钱包金额边界' -Assert-Contains $rootAgents '海外 Token 只携带稳定身份、客户/仓库范围和版本声明,不携带角色或权限集' '根海外小 Token 边界' +Assert-Contains $businessIndex '海外 Token 不携带角色或权限集' '根海外小 Token 边界' Assert-Contains $backendAgents '海外 Token 只携带稳定身份、客户/仓库范围和版本声明,不携带角色或权限集' '后端海外小 Token 边界' Assert-Contains $financeEventConsumer 'envelope.payloadHash().equals(row.get("payload_hash"))' 'Finance 海外事件 Payload 哈希幂等' Assert-Contains $financeEventConsumer "cost_origin='BUSINESS_DIRECT_PAID'" 'Finance 海外直接已付成本投影'