Files
baiyue-firstleg/scripts/synchronous-dependency-baseline.mjs
T
2026-10-08 17:07:57 +08:00

318 lines
26 KiB
JavaScript

export const CONTEXTS = Object.freeze(['REQUEST', 'BACKGROUND', 'INFRASTRUCTURE', 'EXTERNAL'])
export const ACCESS_MODES = Object.freeze(['READ', 'WRITE', 'READ_WRITE'])
export const IDEMPOTENCY = Object.freeze([
'SAFE_READ', 'IDEMPOTENCY_KEY', 'BUSINESS_KEY', 'EVENT_ID', 'STATE_CONVERGENT', 'NONE', 'MIXED'
])
const feign = (path, source, target, contexts, access, idempotency, note) => ({
id: `FEIGN:${path}`,
transport: 'FEIGN', path, source, target, contexts, access, idempotency, note
})
const http = (path, source, target, contexts, access, idempotency, note) => ({
id: `HTTP:${path}`,
transport: 'HTTP', path, source, target, contexts, access, idempotency, note
})
export const SYNCHRONOUS_CLIENTS = Object.freeze([
feign('lastleg-service/src/main/java/com/baiyue/lastleg/fleet/reporting/TripFinanceClient.java',
'lastleg-service', 'finance-service', ['REQUEST'], 'READ', 'SAFE_READ',
'车次财务按不可变发车客户及派送来源批量只读查询,POST无业务写入;内部服务令牌保护,实收另按公网权限裁剪,不逐行查询或推算未分配收款'),
feign('finance/src/main/java/com/baiyue/finance/fleet/VehicleCostFileClient.java',
'finance-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED',
'公司车辆付款凭证按平台及费用ID校验;上传创建不可变对象且无远端幂等键,读取可重复,禁止传输层自动重试上传'),
feign('lastleg-service/src/main/java/com/baiyue/lastleg/fleet/maintenance/VehicleCareFinanceClient.java',
'lastleg-service', 'finance-service', ['REQUEST'], 'READ', 'SAFE_READ',
'按维修/救援来源批量只读查询公司费用状态;POST为查询,不触发入账或付款'),
feign('lastleg-service/src/main/java/com/baiyue/lastleg/fleet/maintenance/VehicleCareSupplierClient.java',
'lastleg-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ',
'维修/救援登记读取并校验权威供应商状态,不创建或修改供应商'),
feign('lastleg-service/src/main/java/com/baiyue/lastleg/fleet/quote/FleetQuoteSupplierClient.java',
'lastleg-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ',
'采购报价读取启用卡车供应商及服务范围;内部令牌保护,只读供应商主档'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/fleet/reporting/HttpTripOperationsEvidenceGateway.java',
'lastleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED',
'出车实测凭证按平台/车次独立归属;上传无远端幂等键,当前/历史版本引用经Lastleg校验后读取,不自动重试上传'),
feign('lastleg-service/src/main/java/com/baiyue/lastleg/client/FinanceFeeCoverageClient.java',
'lastleg-service', 'finance-service', ['REQUEST'], 'READ', 'SAFE_READ',
'原运费覆盖只读:按实际客户与头程入仓ID批量读取Finance已接受来源;目标端只查本库,无下游调用;不提供费用写入或资金命令'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/fleet/maintenance/HttpVehicleCareFileGateway.java',
'lastleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED',
'运维图片上传无远端幂等键,调用方保留请求结果;元数据与下载按平台/记录复合归属核对,禁止客户端自动重试'),
feign('lastleg-service/src/main/java/com/baiyue/lastleg/fleet/customer/FleetCustomerClient.java',
'lastleg-service', 'iam-service', ['REQUEST'], 'READ', 'SAFE_READ',
'外接登记读取权威有效客户与下单资格,内部服务令牌保护;不依据采购历史或创建客户主档'),
feign('lastleg-service/src/main/java/com/baiyue/lastleg/fleet/driver/FleetWarehouseClient.java',
'lastleg-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ',
'司机仓绑定候选只读权威仓库目录,使用内部服务令牌,不传用户JWT或修改仓库主档'),
feign('lastleg-service/src/main/java/com/baiyue/lastleg/client/FinanceBusinessEventClient.java',
'lastleg-service', 'finance-service', ['BACKGROUND'], 'WRITE', 'EVENT_ID', '费用及资金指令按eventId/hash直投对应Finance内部入口,严格DeliveryAck'),
http('common-security/src/main/java/com/baiyue/common/security/HttpSessionStateVerifier.java',
'common-security', 'auth-service', ['INFRASTRUCTURE'], 'READ', 'SAFE_READ', 'Servlet认证读取权威会话状态;内部令牌、总超时、拒绝重定向、失败关闭'),
http('gateway/src/main/java/com/baiyue/gateway/config/RedisTokenSessionWebFilter.java',
'gateway', 'auth-service', ['INFRASTRUCTURE'], 'READ', 'SAFE_READ', '统一入口非阻塞查询权威会话;内部令牌与超时,失败关闭'),
http('firstleg/src/main/java/com/baiyue/firstleg/lingxing/LingxingBrowserSessionReader.java',
'firstleg-service', 'external-lingxing-browser', ['EXTERNAL'], 'READ_WRITE', 'MIXED', 'CDP读取浏览器会话及执行登录/验证码;人工验证不可自动绕过'),
http('firstleg/src/main/java/com/baiyue/firstleg/lingxing/LingxingDirectClient.java',
'firstleg-service', 'external-lingxing', ['EXTERNAL'], 'READ_WRITE', 'MIXED', '领星SKU查询与新品维护写入;已维护状态防止重复提交,不假定外部幂等'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/DomesticPdaOperatorClient.java',
'firstleg-service', 'iam-service', ['REQUEST'], 'READ', 'SAFE_READ', '按作业仓与账号查询有效国内 PDA 操作人,内部服务令牌保护'),
feign('order/src/main/java/com/baiyue/order/client/LegacyImportPricingClient.java',
'order-service', 'firstleg-service', ['REQUEST'], 'READ', 'SAFE_READ', '历史订单导入按客户与始发仓只读匹配渠道'),
feign('order/src/main/java/com/baiyue/order/client/LegacyImportWarehouseClient.java',
'order-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ', '历史订单导入只读匹配仓库目录'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/transfer/gateway/HttpTransferMeasurementPhotoFileGateway.java',
'lastleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '转仓测量照片上传无幂等键,元数据与下载按客户、业务类型和转仓单校验归属'),
feign('lastleg-service/src/main/java/com/baiyue/lastleg/client/PrintPdfClient.java',
'lastleg-service', 'print-service', ['REQUEST'], 'READ', 'SAFE_READ', '根据已授权排车快照生成 BOL PDF,内部令牌保护,无业务状态写入'),
feign('auth/src/main/java/com/baiyue/auth/client/IamAuthorizationClient.java',
'auth-service', 'iam-service', ['REQUEST'], 'READ', 'SAFE_READ', 'POST 读取授权快照,不写 IAM'),
feign('auth/src/main/java/com/baiyue/auth/client/IamOnboardingClient.java',
'auth-service', 'iam-service', ['REQUEST'], 'WRITE', 'BUSINESS_KEY', '注册/补偿以 authUserId 收敛,不自动重试'),
feign('file/src/main/java/com/baiyue/file/client/FinanceExportProviderClient.java',
'file-service', 'finance-service', ['BACKGROUND'], 'READ', 'SAFE_READ', '导出 Worker 分批读取'),
feign('file/src/main/java/com/baiyue/file/client/FirstlegExportProviderClient.java',
'file-service', 'firstleg-service', ['BACKGROUND'], 'READ', 'SAFE_READ', '导出 Worker 分批读取'),
feign('file/src/main/java/com/baiyue/file/client/IamExportProviderClient.java',
'file-service', 'iam-service', ['BACKGROUND'], 'READ', 'SAFE_READ', '导出 Worker 分批读取'),
feign('file/src/main/java/com/baiyue/file/client/IamQualificationClient.java',
'file-service', 'iam-service', ['REQUEST'], 'WRITE', 'STATE_CONVERGENT', '资质登记/替换按客户与资质类型收敛,无通用幂等头'),
feign('file/src/main/java/com/baiyue/file/client/OrderExportProviderClient.java',
'file-service', 'order-service', ['BACKGROUND'], 'READ', 'SAFE_READ', '导出 Worker 分批读取'),
feign('file/src/main/java/com/baiyue/file/client/WarehouseExportProviderClient.java',
'file-service', 'warehouse-service', ['BACKGROUND'], 'READ', 'SAFE_READ', '导出 Worker 分批读取'),
feign('file/src/main/java/com/baiyue/file/client/WeightOcrClient.java',
'file-service', 'integration-service', ['REQUEST'], 'READ', 'NONE', '上传线程内调用 OCR;第三方调用不可假定免费幂等'),
feign('finance/src/main/java/com/baiyue/finance/client/FinanceFileClient.java',
'finance-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '元数据 GET 可重复,凭证上传无幂等键'),
feign('finance/src/main/java/com/baiyue/finance/client/FirstlegCostSnapshotClient.java',
'finance-service', 'firstleg-service', ['REQUEST'], 'READ', 'SAFE_READ', '读取整柜成本分摊快照'),
feign('finance/src/main/java/com/baiyue/finance/client/FirstlegFeeSourceClient.java',
'finance-service', 'firstleg-service', ['REQUEST', 'BACKGROUND'], 'READ_WRITE', 'MIXED',
'事件消费回读快照;平台作废命令携带 Idempotency-Key 与请求哈希'),
feign('finance/src/main/java/com/baiyue/finance/client/IamCustomerClient.java',
'finance-service', 'iam-service', ['REQUEST'], 'READ', 'SAFE_READ', '读取客户主档快照'),
feign('finance/src/main/java/com/baiyue/finance/client/WalletResultLastlegClient.java',
'finance-service', 'lastleg-service', ['BACKGROUND'], 'WRITE', 'EVENT_ID', '钱包结果 Outbox 按 eventId 回传海外业务'),
feign('finance/src/main/java/com/baiyue/finance/client/WarehouseSupplierClient.java',
'finance-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ', '读取并校验供应商快照'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/CarrierScheduleIntegrationClient.java',
'firstleg-service', 'integration-service', ['BACKGROUND'], 'READ', 'SAFE_READ', '船节点定时任务查询,不属于用户请求'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/LastlegEventClient.java',
'firstleg-service', 'lastleg-service', ['BACKGROUND'], 'WRITE', 'EVENT_ID', '装柜/船节点 Outbox 按 eventId 投递'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/FeePaymentVoucherFileClient.java',
'firstleg-service', 'file-service', ['REQUEST'], 'READ', 'SAFE_READ', '校验付款凭证元数据'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/InboundHoldFileClient.java',
'firstleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '扣货凭证上传无幂等键,元数据与下载可重复'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/FinanceFeeSourceEventClient.java',
'firstleg-service', 'finance-service', ['BACKGROUND'], 'WRITE', 'EVENT_ID', '费用 Outbox 按事件幂等键投递'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/IamCustomerSnapshotClient.java',
'firstleg-service', 'iam-service', ['REQUEST'], 'READ', 'SAFE_READ', '读取客户名称与状态快照'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/LoadingDocumentFileClient.java',
'firstleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '上传无幂等键,元数据/下载可重复'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/LoadingEvidenceFileClient.java',
'firstleg-service', 'file-service', ['REQUEST'], 'READ', 'SAFE_READ', '读取装柜证据元数据/内容'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/MeasurementImageClient.java',
'firstleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '图片上传/作废非安全重放,查询可重复'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/OceanBookingFileClient.java',
'firstleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '订舱附件上传无幂等键,元数据与下载可重复'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/OrderCargoClient.java',
'firstleg-service', 'order-service', ['REQUEST', 'BACKGROUND'], 'READ', 'SAFE_READ',
'在线测量/箱号/排柜读取;Order 审核 Outbox 创建 Firstleg 入库及箱号时也会后台回读订单货物'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/OrderFulfillmentSplitClient.java',
'firstleg-service', 'order-service', ['REQUEST'], 'WRITE', 'IDEMPOTENCY_KEY', 'PDA 结算拆单携带 idempotencyKey/operationId'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/OrderFulfillmentCompletionClient.java',
'firstleg-service', 'order-service', ['BACKGROUND'], 'WRITE', 'EVENT_ID', '海外派送完成事件按 eventId/payloadHash 幂等确认来源订单完成'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/PendingReviewOrderClient.java',
'firstleg-service', 'order-service', ['REQUEST'], 'READ', 'SAFE_READ', '智能排柜分页读取待审核订单投影'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/PriceBookFileClient.java',
'firstleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '价目文件上传无幂等键,读取可重复'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/PriceBookWarehouseClient.java',
'firstleg-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ', '读取仓库/渠道主数据'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/PrintableOrderInboundClient.java',
'firstleg-service', 'order-service', ['REQUEST'], 'WRITE', 'BUSINESS_KEY',
'首次打印按客户与订单预留稳定入仓码,重复调用复用已冻结快照'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/PrintPdfClient.java',
'firstleg-service', 'print-service', ['REQUEST'], 'READ', 'SAFE_READ', '无状态 PDF 渲染,POST 为计算型读取'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/TruckAppointmentFileClient.java',
'firstleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '附件上传无幂等键,元数据读取可重复'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/WarehouseMasterDataClient.java',
'firstleg-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ', '读取仓库主数据'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/WarehousePalletLocationClient.java',
'firstleg-service', 'warehouse-service', ['REQUEST'], 'READ_WRITE', 'MIXED',
'查询可重复;预占/选择释放/转移/结算使用业务幂等键,普通确认/释放按状态收敛'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/WarehousePartnerClient.java',
'firstleg-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ', '读取启用往来单位快照'),
feign('firstleg/src/main/java/com/baiyue/firstleg/client/WarehouseSupplierClient.java',
'firstleg-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ', '读取供应商快照'),
feign('firstleg/src/main/java/com/baiyue/firstleg/customs/client/CustomsFileClient.java',
'firstleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '报关文件上传无幂等键,读取可重复'),
feign('iam/src/main/java/com/baiyue/iam/client/AuthAccountClient.java',
'iam-service', 'auth-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '账号查询可重复,写操作按账号/命令业务键收敛'),
feign('iam/src/main/java/com/baiyue/iam/client/CustomerDimensionRuleClient.java',
'iam-service', 'firstleg-service', ['BACKGROUND'], 'WRITE', 'BUSINESS_KEY',
'IAM 持久化任务租约投递;初始化/补偿复用稳定 initializationKey,不在客户创建请求内调用'),
feign('iam/src/main/java/com/baiyue/iam/client/OverseasStorageFeeClient.java',
'iam-service', 'warehouse-service', ['REQUEST'], 'WRITE', 'BUSINESS_KEY', '初始化/补偿使用 initializationKey'),
feign('lastleg-service/src/main/java/com/baiyue/lastleg/client/FirstlegEventClient.java',
'lastleg-service', 'firstleg-service', ['BACKGROUND'], 'WRITE', 'EVENT_ID', '卸柜完成 Outbox 按 eventId 投递'),
feign('lastleg-service/src/main/java/com/baiyue/lastleg/client/DomesticWarehouseDirectoryClient.java',
'lastleg-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ', '读取国内共享仓库权威目录'),
feign('lastleg-service/src/main/java/com/baiyue/lastleg/masterdata/quote/client/DomesticPartnerWarehouseClient.java',
'lastleg-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ', '报价创建时读取国内合作仓快照'),
feign('warehouse-overseas-service/src/main/java/com/baiyue/warehouse/client/PrintPdfClient.java',
'warehouse-overseas-service', 'print-service', ['REQUEST'], 'READ', 'SAFE_READ', '按已授权托盘生成标签PDF,内部令牌保护,无业务状态写入'),
feign('warehouse-overseas-service/src/main/java/com/baiyue/warehouse/client/DomesticWarehouseDirectoryClient.java',
'warehouse-overseas-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ',
'海外库位、托盘和资源锁写入前读取国内共享收货仓权威目录'),
feign('order/src/main/java/com/baiyue/order/client/FirstlegColoadGroupClient.java',
'order-service', 'firstleg-service', ['REQUEST'], 'READ', 'SAFE_READ', '批量读取同柜不可拆组聚合'),
feign('order/src/main/java/com/baiyue/order/client/FinanceWalletClient.java',
'order-service', 'finance-service', ['REQUEST'], 'READ', 'SAFE_READ', '提交订单前读取客户钱包余额与有效授信'),
feign('order/src/main/java/com/baiyue/order/client/FirstlegInboundClient.java',
'order-service', 'firstleg-service', ['REQUEST', 'BACKGROUND'], 'READ_WRITE', 'BUSINESS_KEY',
'列表查询/缺失修复在线执行;审核建单由 Outbox 投递,按 orderId/inboundCode 收敛'),
feign('order/src/main/java/com/baiyue/order/client/FirstlegPricingClient.java',
'order-service', 'firstleg-service', ['REQUEST'], 'READ', 'SAFE_READ', 'POST 校验计价渠道,不写履约状态'),
feign('order/src/main/java/com/baiyue/order/client/FirstlegUnifiedOrderClient.java',
'order-service', 'firstleg-service', ['REQUEST'], 'READ', 'SAFE_READ', 'POST 查询统一订单投影'),
feign('order/src/main/java/com/baiyue/order/client/MerchantPricingCatalogClient.java',
'order-service', 'firstleg-service', ['REQUEST'], 'READ', 'SAFE_READ', '批量下单读取客户可用物流渠道'),
feign('order/src/main/java/com/baiyue/order/client/MerchantWarehouseCatalogClient.java',
'order-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ', '批量下单分页读取启用仓库'),
feign('order/src/main/java/com/baiyue/order/client/OrderBatchFileClient.java',
'order-service', 'file-service', ['REQUEST'], 'WRITE', 'NONE', '批量导入文件上传无通用幂等键'),
feign('order/src/main/java/com/baiyue/order/client/ProductImageClient.java',
'order-service', 'file-service', ['REQUEST'], 'READ', 'SAFE_READ', '读取商品图片元数据'),
feign('order/src/main/java/com/baiyue/order/client/TenantEligibilityClient.java',
'order-service', 'iam-service', ['REQUEST'], 'READ', 'SAFE_READ', '读取客户下单资格'),
feign('order/src/main/java/com/baiyue/order/client/WarehouseClient.java',
'order-service', 'warehouse-service', ['REQUEST'], 'READ', 'SAFE_READ', '读取仓库主数据'),
http('common-audit/src/main/java/com/baiyue/common/audit/HttpAuditSink.java',
'common-audit', 'audit-service', ['INFRASTRUCTURE'], 'WRITE', 'NONE', '同步审计投递失败当前仅记录告警'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/customervisit/gateway/HttpCustomerVisitFileGateway.java',
'lastleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '回访附件上传无幂等键,归属校验可重复'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/fleet/driver/HttpDriverFileGateway.java',
'lastleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED',
'内部服务令牌上传驾驶证,无上传幂等键;读取按平台公共作用域、司机业务键及文件ID核对类型/大小/归属,不自动重放上传'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/delivery/gateway/HttpDeliveryDocumentFileGateway.java',
'lastleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '派送资料上传无幂等键,元数据按客户/派送单/类别校验,当前与历史下载只读'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/exceptionorder/gateway/HttpExceptionEvidenceFileGateway.java',
'lastleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '异常处理证据上传无幂等键,归属校验可重复'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/gateway/HttpUnloadPhotoFileGateway.java',
'lastleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '上传无幂等键,元数据校验可重复'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/gateway/HttpDomesticLoadingEvidenceGateway.java',
'lastleg-service', 'file-service', ['REQUEST'], 'READ', 'SAFE_READ', '当前PDA会话校验来源柜后,通过内部服务令牌只读下载国内装柜照片'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/gateway/HttpWarehouseResourceGateway.java',
'lastleg-service', 'warehouse-overseas-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '查询可重复;写操作按 business/reservation key 或状态收敛'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/palletops/gateway/HttpPalletPhysicalGateway.java',
'lastleg-service', 'warehouse-overseas-service', ['REQUEST'], 'READ_WRITE', 'IDEMPOTENCY_KEY', '托盘变更/补偿使用 operationKey 与请求哈希'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/procurement/gateway/HttpProcurementFileGateway.java',
'lastleg-service', 'file-service', ['REQUEST'], 'WRITE', 'NONE', '采购凭证和签收文件上传无幂等键,禁止客户端自动重试'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/relabel/gateway/HttpRelabelDocumentFileGateway.java',
'lastleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '换标PDF上传无幂等键,按客户/业务类型/业务单归属下载只读,传输层不自动重试'),
http('lastleg-service/src/main/java/com/baiyue/lastleg/relabel/pda/gateway/HttpRelabelPhotoFileGateway.java',
'lastleg-service', 'file-service', ['REQUEST'], 'READ_WRITE', 'MIXED', '上传无幂等键,元数据校验可重复'),
http('integration-service/src/main/java/com/baiyue/integration/provider/EvergreenTrackingClient.java',
'integration-service', 'external-evergreen', ['EXTERNAL'], 'READ', 'SAFE_READ', '船司轨迹查询;遵守外部限流'),
http('integration-service/src/main/java/com/baiyue/integration/provider/HedeTrackingClient.java',
'integration-service', 'external-hede', ['EXTERNAL'], 'READ', 'SAFE_READ', '船司轨迹查询;遵守外部限流'),
http('integration-service/src/main/java/com/baiyue/integration/provider/MatsonTrackingClient.java',
'integration-service', 'external-matson', ['EXTERNAL'], 'READ', 'SAFE_READ', '船司轨迹查询;遵守外部限流'),
http('integration-service/src/main/java/com/baiyue/integration/provider/SmlTrackingClient.java',
'integration-service', 'external-sml', ['EXTERNAL'], 'READ', 'SAFE_READ', '船司轨迹查询;遵守外部限流'),
http('integration-service/src/main/java/com/baiyue/integration/provider/ZimTrackingClient.java',
'integration-service', 'external-zim', ['EXTERNAL'], 'READ', 'SAFE_READ', '令牌获取与轨迹查询不改变平台业务事实'),
http('integration-service/src/main/java/com/baiyue/integration/provider/ocr/BaiduMeterClient.java',
'integration-service', 'external-baidu-ocr', ['EXTERNAL'], 'READ', 'NONE', 'OCR 可能计费,不由 HTTP 层自动重试')
])
export const USER_ENTRIES = Object.freeze([
{ name: '认证 API', service: 'auth-service' },
{ name: 'IAM API', service: 'iam-service' },
{ name: '订单 API', service: 'order-service' },
{ name: '头程 API/PDA', service: 'firstleg-service' },
{ name: '财务 API', service: 'finance-service' },
{ name: '文件 API', service: 'file-service' },
{ name: '海外尾程 API/PDA', service: 'lastleg-service' },
{ name: '国内仓储 API', service: 'warehouse-service' },
{ name: '海外仓储 API', service: 'warehouse-overseas-service' }
])
export function graphEdges(context) {
return [...new Set(SYNCHRONOUS_CLIENTS
.filter(client => context === 'ALL' || client.contexts.includes(context))
.map(client => `${client.source}->${client.target}`))].sort()
}
export function stronglyConnectedComponents(edgeNames) {
const adjacency = new Map()
for (const edge of edgeNames) {
const [from, to] = edge.split('->')
if (!adjacency.has(from)) adjacency.set(from, new Set())
if (!adjacency.has(to)) adjacency.set(to, new Set())
adjacency.get(from).add(to)
}
let index = 0
const indexes = new Map()
const lowLinks = new Map()
const stack = []
const onStack = new Set()
const components = []
function connect(node) {
indexes.set(node, index)
lowLinks.set(node, index++)
stack.push(node)
onStack.add(node)
for (const target of adjacency.get(node)) {
if (!indexes.has(target)) {
connect(target)
lowLinks.set(node, Math.min(lowLinks.get(node), lowLinks.get(target)))
} else if (onStack.has(target)) lowLinks.set(node, Math.min(lowLinks.get(node), indexes.get(target)))
}
if (lowLinks.get(node) !== indexes.get(node)) return
const component = []
let current
do {
current = stack.pop()
onStack.delete(current)
component.push(current)
} while (current !== node)
components.push(component.sort())
}
for (const node of adjacency.keys()) if (!indexes.has(node)) connect(node)
return components.filter(component => component.length > 1)
.sort((left, right) => left.join().localeCompare(right.join()))
}
export function longestSimplePaths(entryService, edgeNames = graphEdges('REQUEST')) {
const adjacency = new Map()
for (const edge of edgeNames) {
const [from, to] = edge.split('->')
if (!adjacency.has(from)) adjacency.set(from, new Set())
adjacency.get(from).add(to)
}
let longest = []
function visit(node, path) {
const targets = [...(adjacency.get(node) ?? [])].sort()
let extended = false
for (const target of targets) {
if (path.includes(target)) continue
extended = true
visit(target, [...path, target])
}
if (extended) return
if (longest.length === 0 || path.length > longest[0].length) longest = [path]
else if (path.length === longest[0].length) longest.push(path)
}
visit(entryService, [entryService])
return longest.sort((left, right) => left.join('->').localeCompare(right.join('->')))
}