env('BUSINESS_MIRROR_DB_CONNECTION', 'business_mirror'), /* |-------------------------------------------------------------------------- | 自动跟随上游新增字段的数据集 |-------------------------------------------------------------------------- | | 格式:页面 key(section/page)=> 数据集 key。 | 登记之后,上游视图/表新增字段时(数据字典同步之后)会自动把新字段补进镜像表定义 | 并建列,对应页面也会自动多出这一列,不需要再改代码。 | 只跟随新增字段,不会删除或改写已有字段;名字里带 password/secret/token/cipher | 等敏感关键字的字段一律跳过。 */ 'auto_follow_columns' => [ 'store-management/store-accounts' => 'database_4.external_store_accounts.accounts_v1', ], // 钉钉应付申请流程只同步“应付申请流程”这一固定流程编码, // 页面从共享业务镜像读取,不在 HTTP 请求中直连上游。 'ding_payable_workflows' => [ 'dataset_key' => 'operations_replica.rpt.ding_payable_workflows', 'source_key' => 'operations_replica', 'process_code' => 'PROC-39DD70DE-DAB2-4A5F-B8F1-0B0B68BD0C88', 'target_table' => 'ding_payable_workflow_mirror', 'batch_size' => (int) env('DING_PAYABLE_WORKFLOW_MIRROR_BATCH_SIZE', 100), 'max_batches_per_run' => (int) env('DING_PAYABLE_WORKFLOW_MIRROR_MAX_BATCHES', 2), ], // 流程明细页按钉钉结构化表单同步:审批主表、费用明细、付款明细 // 分别读取并按业务键落镜像,禁止再把明细表与付款表铺平后逐行求和。 'ding_process_details' => [ 'source_key' => 'operations_replica', 'scope' => env('DING_PROCESS_DETAILS_SCOPE', 'personal_permission'), 'start_date' => env('DING_PROCESS_DETAILS_START_DATE', '2026-01-01'), 'batch_size' => (int) env('DING_PROCESS_DETAILS_BATCH_SIZE', 150), 'sync_interval_minutes' => (int) env('DING_PROCESS_DETAILS_SYNC_MINUTES', 5), 'incremental_overlap_hours' => (int) env('DING_PROCESS_DETAILS_OVERLAP_HOURS', 48), 'processes' => [ 'PROC-B290696F-EC2A-4F76-87BA-E0A12E10D09F' => [ 'kind' => 'daily', 'detail_table' => '收款费用明细', 'detail_amount_fields' => ['收款金额'], 'amount_total_fields' => ['收款合计'], 'payment_table' => '付款明细', 'payment_total_fields' => ['付款合计'], ], 'PROC-39DD70DE-DAB2-4A5F-B8F1-0B0B68BD0C88' => [ 'document_type' => '应付申请流程', 'detail_table' => '应付明细', 'detail_amount_fields' => ['付款金额'], 'payment_table' => '付款明细', 'payment_total_fields' => ['付款金额合计'], ], 'PROC-ACF09A14-B094-46B1-A9E2-8BB1F4E1FDCF' => [ 'document_type' => '线上代发业务报销', 'detail_table' => '收款费用明细', 'detail_amount_fields' => ['代发订单金额'], 'payment_table' => '付款明细', ], 'PROC-C5159B8D-F412-4DF8-981D-64EBB8D03EB6' => [ 'document_type' => '种菜核销/种菜报销', 'detail_table' => '收款费用明细', 'detail_amount_fields' => ['收款金额'], 'amount_total_fields' => ['收款合计'], 'payment_table' => '付款明细', 'payment_total_fields' => ['付款合计'], ], 'PROC-BBAC7187-9E59-4942-941A-59C7EAF0CEDA' => [ 'document_type' => '快递面单应付', 'detail_table' => '收款费用明细', 'detail_amount_fields' => ['扣款金额', '收款金额'], 'amount_total_fields' => ['面单金额合计'], 'payment_table' => '付款明细', 'payment_total_fields' => ['付款合计'], ], 'PROC-6407E98B-040A-4C96-AA7D-696650FC1A25' => [ 'document_type' => '固定资产报废或出售', 'detail_table' => '固定资产报废或出售明细', 'detail_amount_fields' => ['出售价格'], ], 'PROC-0EBE35D8-5A40-4746-B758-BA5EB8DE1BE3' => [ 'document_type' => '日常物品报销', 'detail_table' => '收款费用明细', 'detail_amount_fields' => ['收款金额'], 'amount_total_fields' => ['收款合计'], 'payment_table' => '付款明细', 'payment_total_fields' => ['付款合计'], ], 'PROC-17C65606-3F57-4905-8BB5-F5D313CD87D1' => [ 'document_type' => '样品流程', 'detail_table' => '样品明细', 'detail_amount_fields' => ['样品成本', '成本'], ], 'PROC-23F2509C-33DC-411A-9FA6-700830A75B37' => [ 'document_type' => '一次性采买', 'detail_table' => '采买基础信息', 'detail_amount_fields' => ['采购金额'], 'amount_total_fields' => ['采买总金额'], ], 'PROC-5AB333E3-4496-4DF3-A5C1-1FBFAB7C72C8' => [ 'document_type' => '板材流程', 'detail_table' => '收款费用明细', 'detail_amount_fields' => ['订单金额'], 'payment_table' => '付款明细', ], 'PROC-657E5EEA-DEAA-4DC5-AD8B-A679FE9AD361' => [ 'document_type' => '板材流程', 'detail_table' => '收款费用明细', 'detail_amount_fields' => ['收款金额'], 'amount_total_fields' => ['收款合计'], 'payment_total_fields' => ['付款合计'], ], 'PROC-C014F61F-F1F8-4F36-93F8-DF2A7EEAC457' => [ 'document_type' => '外贸发货费用报销', 'scalar_detail' => true, 'detail_amount_fields' => ['收款金额'], 'payment_total_fields' => ['付款合计'], ], 'PROC-1E002C79-C087-4630-B9CE-FAB6DF80FAC5' => [ 'document_type' => '工资流程', 'detail_table' => '工资明细表', 'detail_amount_fields' => ['付款金额'], 'amount_total_fields' => ['收款合计'], 'payment_total_fields' => ['付款合计'], ], 'PROC-2C1EFBA6-2369-461C-8CCD-05A3664CB8B5' => [ 'document_type' => '种菜充值', 'detail_table' => '收款费用明细', 'detail_amount_fields' => ['收款金额'], 'amount_total_fields' => ['收款合计'], 'payment_total_fields' => ['付款合计'], ], ], ], // 线上代发业务报销流程(钉钉 OA 审批):数据源为 operations_replica 的 // rpt.ding_Workflow 中固定流程编码。明细按“商品ID”关联到共享业务镜像的 // 商品目录(ops_jst_sku_map / ops_jst_sku)做匹配。页面从共享镜像读取, // 不在 HTTP 请求中直连上游。process_code 由环境变量注入,避免在代码中 // 硬编码审批模板编码;填入前不会同步任何数据。 'ding_online_daifa_price' => [ 'dataset_key' => 'operations_replica.rpt.ding_online_daifa_price', 'source_key' => 'operations_replica', 'process_code' => env('DING_ONLINE_DAIFA_PRICE_PROCESS_CODE', ''), 'target_table' => 'ding_online_daifa_price_mirror', 'extend_columns' => true, // 同步阶段按商品ID(钉钉表单“商品ID”即 shop_i_id)关联商品目录并写入 // product_name 列,页面只读镜像、不临时 JOIN 2500 万行的 ops_jst_sku_map。 'resolve_product_name' => true, // 钉钉表单字段名 -> 镜像宽表列。下方列名依据用户提供的演示数据校验, // 若实际审批模板字段名不同,仅需调整此映射即可,无需改动同步与页面代码。 'column_map' => [ 'payee_name' => '收款人全称', 'product_id' => '商品ID', 'daifa_trade_no' => '代发交易单号', 'shop_trade_no' => '店铺交易单号', 'shop_name' => '店铺名称', 'supplier_name' => '供应商名称', 'material_no' => '料号', 'ship_qty' => '订单发货数量', 'paid_amount' => '订单实付金额', 'daifa_amount' => '代发订单金额', 'price_diff' => '差价', ], // 宽表列类型,决定抽取时的强制转换;字符串列留空即可。 'column_types' => [ 'ship_qty' => 'int', 'paid_amount' => 'decimal', 'daifa_amount' => 'decimal', 'price_diff' => 'decimal', ], // 若审批模板把“一个商品一行”放在明细表格里,填写该表格的字段名, // 同步器会按明细行展开为多条镜像记录;留空则整张表单视为单行。 'detail_table' => env('DING_ONLINE_DAIFA_PRICE_DETAIL_TABLE', ''), // 收款人过滤(可选):默认不过滤,以便页面按收款人展示“刘萧代发”或 // “1688代发”标签。需要限定公司时可通过环境变量按全称精确匹配。 'row_filters' => [ 'payee_name' => env('DING_ONLINE_DAIFA_PRICE_PAYEE', ''), ], // 只同步指定审批状态的单据(默认只要“已完成/已通过”,与页面状态口径一致); // 未通过/已拒绝/撤回等整单暂不写入镜像。置空则不限状态。 'only_status' => env('DING_ONLINE_DAIFA_PRICE_ONLY_STATUS', 'COMPLETED'), 'batch_size' => (int) env('DING_ONLINE_DAIFA_PRICE_MIRROR_BATCH_SIZE', 100), 'max_batches_per_run' => (int) env('DING_ONLINE_DAIFA_PRICE_MIRROR_MAX_BATCHES', 2), ], // 只有生产刷新节点写镜像;开发环境和网页请求只读共享结果。 'refresh_enabled' => env( 'BUSINESS_MIRROR_REFRESH_ENABLED', env('APP_ENV', 'production') === 'production' ), // 店铺经营报表由生产刷新节点自动完成首次同步并持续增量;开发机只读。 'store_report' => [ 'enabled' => filter_var(env('STORE_REPORT_MIRROR_ENABLED', true), FILTER_VALIDATE_BOOL), 'source_key' => 'jiansun', 'bill_source_object' => 'dbo.jst_originalBillInfo', 'lifecycle_source_object' => 'dbo.fys_shopInfo_flow', 'batch_size' => (int) env('STORE_REPORT_MIRROR_BATCH_SIZE', 5000), 'max_batches_per_run' => (int) env('STORE_REPORT_MIRROR_MAX_BATCHES', 4), 'lifecycle_batch_size' => (int) env('STORE_REPORT_LIFECYCLE_BATCH_SIZE', 1000), 'lifecycle_max_batches_per_run' => (int) env('STORE_REPORT_LIFECYCLE_MAX_BATCHES', 5), 'daily_batch_size' => (int) env('STORE_REPORT_DAILY_BATCH_SIZE', 50000), 'daily_max_batches_per_run' => (int) env('STORE_REPORT_DAILY_MAX_BATCHES', 10), // 原始账单以 Id 追加为主;回看最近行覆盖迟到修正,不扫描 1400 万行更新时间。 'overlap_rows' => (int) env('STORE_REPORT_MIRROR_OVERLAP_ROWS', 50000), ], // 聚水潭进销存共享流水镜像:头表按 Id 区间小批读取全部仓库。 // 三方仓页面在 Repository 层继续固定南昌樵舍仓,进销存报表按全仓库汇总。 'third_party_warehouse_storage' => [ 'dataset_key' => 'jiansun.third-party-warehouse-storage', 'source_key' => 'jiansun', 'warehouse_id' => 15045364, 'warehouse_name' => '三方-南昌樵舍仓', 'owner_name' => '常州简尚家居有限公司', 'header_source_object' => 'dbo.jst_inoutWater', 'item_source_object' => 'dbo.jst_inoutWaterItem', 'inventory_source_object' => 'dbo.jst_inventoryInfo', 'header_scan_size' => (int) env('THIRD_PARTY_WAREHOUSE_HEADER_SCAN_SIZE', 10000), 'max_header_batches_per_run' => (int) env('THIRD_PARTY_WAREHOUSE_MAX_HEADER_BATCHES', 10), 'incremental_batch_size' => (int) env('THIRD_PARTY_WAREHOUSE_INCREMENTAL_BATCH_SIZE', 5000), 'incremental_overlap_hours' => (int) env('THIRD_PARTY_WAREHOUSE_INCREMENTAL_OVERLAP_HOURS', 48), 'inventory_batch_size' => (int) env('THIRD_PARTY_WAREHOUSE_INVENTORY_BATCH_SIZE', 2000), 'sync_lock_seconds' => (int) env('THIRD_PARTY_WAREHOUSE_SYNC_LOCK_SECONDS', 21600), 'generation_retention_hours' => (int) env('THIRD_PARTY_WAREHOUSE_GENERATION_RETENTION_HOURS', 48), 'stale_after_minutes' => (int) env('THIRD_PARTY_WAREHOUSE_STALE_MINUTES', 1560), ], 'product_prices' => [ 'dataset_key' => 'supplier-payables.product-prices', 'source_key' => 'operations_replica', 'source_object' => 'rpt.Bulk_Price_Limit', 'batch_size' => (int) env('PRODUCT_PRICE_MIRROR_BATCH_SIZE', 500), 'max_batches_per_run' => (int) env('PRODUCT_PRICE_MIRROR_MAX_BATCHES', 4), // 上游完成记录通常不再变化;仍回看 48 小时,覆盖迟到或修正数据。 'overlap_hours' => (int) env('PRODUCT_PRICE_MIRROR_OVERLAP_HOURS', 48), ], 'product_catalog' => [ 'dataset_key' => 'operations_replica.rpt.jst_sku', 'batch_size' => (int) env('PRODUCT_CATALOG_MIRROR_BATCH_SIZE', 1000), 'max_batches_per_run' => (int) env('PRODUCT_CATALOG_MIRROR_MAX_BATCHES', 5), 'stale_after_minutes' => (int) env('PRODUCT_CATALOG_MIRROR_STALE_MINUTES', 10), 'full_reconcile_hours' => (int) env('PRODUCT_CATALOG_MIRROR_FULL_RECONCILE_HOURS', 168), // 每周日凌晨 02:00-08:00 可启动到期校准;启动后按断点持续到完成。 'reconcile_weekday' => (int) env('PRODUCT_CATALOG_MIRROR_RECONCILE_WEEKDAY', 0), 'reconcile_start_hour' => (int) env('PRODUCT_CATALOG_MIRROR_RECONCILE_START_HOUR', 2), 'reconcile_window_hours' => (int) env('PRODUCT_CATALOG_MIRROR_RECONCILE_WINDOW_HOURS', 6), ], 'product_purchase_prices' => [ 'dataset_key' => 'product-inventory.purchase-order-prices', 'source_key' => 'jiansun', 'source_object' => 'dbo.jst_purchase + dbo.jst_purchaseItem', 'batch_size' => (int) env('PRODUCT_PURCHASE_PRICE_MIRROR_BATCH_SIZE', 1000), 'max_batches_per_run' => (int) env('PRODUCT_PURCHASE_PRICE_MIRROR_MAX_BATCHES', 5), 'overlap_hours' => (int) env('PRODUCT_PURCHASE_PRICE_MIRROR_OVERLAP_HOURS', 48), 'full_reconcile_hours' => (int) env('PRODUCT_PURCHASE_PRICE_MIRROR_FULL_RECONCILE_HOURS', 168), 'reconcile_weekday' => (int) env('PRODUCT_PURCHASE_PRICE_MIRROR_RECONCILE_WEEKDAY', 0), 'reconcile_start_hour' => (int) env('PRODUCT_PURCHASE_PRICE_MIRROR_RECONCILE_START_HOUR', 2), 'reconcile_window_hours' => (int) env('PRODUCT_PURCHASE_PRICE_MIRROR_RECONCILE_WINDOW_HOURS', 6), ], 'courier_information' => [ 'stale_after_minutes' => (int) env('COURIER_INFORMATION_MIRROR_STALE_MINUTES', 60), ], // 工作平台退货取件管理:客服取件单按天更新,允许比快递资料更长的同步间隔。 'return_pickup' => [ 'stale_after_minutes' => (int) env('RETURN_PICKUP_MIRROR_STALE_MINUTES', 180), ], // 工作平台采购价格按 SKU 补充到普通商品资料;页面只读取共享镜像。 'work_platform_prices' => [ 'dataset_key' => 'jiansun.dbo.pm_priceAdjustment', 'target_table' => 'js_pm_price_adjustment', ], // 普通商品资料变价明细:pm_priceAdjustment_log,按商品编码取最近一条 priceType=1(变价)。 'product_price_changes' => [ 'dataset_key' => 'jiansun.dbo.pm_priceAdjustment_log', 'target_table' => 'js_pm_price_adjustment_log', ], /* |-------------------------------------------------------------------------- | 上游原表镜像目录 |-------------------------------------------------------------------------- | | 页面不能再按“页码 + 筛选条件”临时生成一份快照。这里登记项目代码实际 | 使用的上游表/视图,由后台按表同步到 caiwu_business_mirror。首次全量 | 必须显式执行;日常任务只续传已完成首次全量的数据集。 | | watermark_column 为空时按稳定业务键追加,并依靠周期全量校准修正历史 | 更新和删除;存在可靠更新时间时使用重叠窗口增量同步。 */ 'table_sync' => [ 'batch_size' => (int) env('BUSINESS_MIRROR_TABLE_BATCH_SIZE', 500), // These wide SQL Server views time out when TOP/pagination is planned // together with every payload column. Select the bounded keys first, // then look up only those rows in the same read-only statement. 'key_first_datasets' => [ 'operations_replica.rpt.jst_Orders', 'operations_replica.rpt.jst_originalBillInfo', ], 'max_batches_per_run' => (int) env('BUSINESS_MIRROR_TABLE_MAX_BATCHES', 2), 'max_datasets_per_run' => (int) env('BUSINESS_MIRROR_MAX_DATASETS', 1), 'overlap_hours' => (int) env('BUSINESS_MIRROR_OVERLAP_HOURS', 48), 'full_reconcile_hours' => (int) env('BUSINESS_MIRROR_FULL_RECONCILE_HOURS', 168), 'dedicated_datasets' => [ 'operations_replica.rpt.jst_sku', ], ], 'datasets' => [ // 工作平台供应商管理(简尚版):列表和详情只读共享镜像。 // 供应商视图含关联资料变化,无可靠视图更新时间,按稳定键追加并周期全量校准。 'jiansun.dbo.js_supplier_View' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'js_supplier_View', 'target' => 'js_supplier_management', 'keys' => ['Id'], 'full_reconcile_hours' => 1, 'columns' => ['Id', 'guid', 'sourcefrom', 'coopersgn', 'scmcode', 'scmname', 'scmtype', 'tradebody', 'company', 'enterpriseType', 'creditcode', 'handlePerson', 'accountbankno', 'legalPerson', 'paycyclesgn', 'corpmobile', 'tradebtime', 'tradeetime', 'cooperbtime', 'cooperetime', 'undefined1', 'undefined2', 'dsper', 'reconciliter', 'levelname', 'linkerprovience', 'linkercity', 'linkerarea', 'linkeradd', 'memo', 'buyer', 'buymid', 'buytop', 'craftType', 'outline', 'capacity', 'freereason', 'area', 'stocker', 'region', 'sindou', 'follower', 'presc', 'strategy', 'updator', 'local_created', 'local_updated', 'send_date', 'endTimeA', 'endTimeB', 'finishTimeA', 'finishTimeB'], 'indexes' => [['scmcode', 'Id'], ['coopersgn', 'Id']], ], 'jiansun.dbo.js_supplier_contract_View' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'js_supplier_contract_View', 'target' => 'js_supplier_contracts', 'keys' => ['id'], 'full_reconcile_hours' => 1, 'columns' => ['id', 'ordernum', 'originname', 'title', 'tradebody', 'company', 'eSignDocTemplateId', 'type', 'tradebtime', 'tradeetime', 'sendTime', 'completeTime', 'state', 'createUser'], 'indexes' => [['tradebody', 'company']], ], 'jiansun.dbo.js_supplier_linkers' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'js_supplier_linkers', 'target' => 'js_supplier_contacts', 'keys' => ['Id'], 'watermark' => 'local_updated', 'full_reconcile_hours' => 24, 'columns' => ['Id', 'sourcefrom', 'scmname', 'linker', 'linkmobile', 'linkweixin', 'linkjob', 'memo', 'local_created', 'local_updated'], 'indexes' => [['scmname', 'Id']], ], 'jiansun.dbo.js_supplier_payinfo' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'js_supplier_payinfo', 'target' => 'js_supplier_payment_accounts', 'keys' => ['Id'], 'watermark' => 'local_updated', 'full_reconcile_hours' => 24, 'columns' => ['Id', 'sourcefrom', 'scmname', 'enable', 'accounttype', 'account', 'accountname', 'accountbank', 'memo', 'invoice', 'accountnature', 'creator', 'updator', 'local_created', 'local_updated'], 'indexes' => [['scmname', 'Id']], ], // 经营分析副本库:组织资料、订单、退款和聚水潭基础数据。 'operations_replica.rpt.fys_companyInfo' => ['source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'fys_companyInfo', 'target' => 'ops_fys_company_info', 'keys' => ['Id'], 'watermark' => 'updateTIme'], 'operations_replica.rpt.fys_shopInfo' => ['source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'fys_shopInfo', 'target' => 'ops_fys_shop_info', 'keys' => ['Id'], 'watermark' => 'updateTime'], 'operations_replica.rpt.fys_TrademarkInfo' => ['source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'fys_TrademarkInfo', 'target' => 'ops_fys_trademark_info', 'keys' => ['Id'], 'watermark' => 'updateTime'], // 店铺后台每天抓取的店铺→主体映射:店铺维度报表用它识别主体接替并生成新期间。 'operations_replica.rpt.crawl_shop_company' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'crawl_shop_company', 'target' => 'ops_crawl_shop_company', 'keys' => ['id'], 'watermark' => 'update_time', 'indexes' => [ ['shop_name', 'crawl_date', 'id'], ], ], 'operations_replica.rpt.jst_Orders' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_Orders', 'target' => 'ops_jst_orders', 'keys' => ['Id'], 'watermark' => 'updateTime', 'indexes' => [ ['o_id', 'Id'], ['order_date', 'o_id', 'Id'], // 账单明细按线上订单号 so_id 关联订单表;缺这个索引会让关联退化成百万行全表扫描。 // SQL Server 的历史 so_id 字段可能超过 MariaDB 联合索引上限; // 订单号关联使用前 64 个字符已覆盖实际单号格式,同时保留 Id 唯一定位。 ['so_id(64)', 'Id'], ], ], 'operations_replica.rpt.jst_OrderItem' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_OrderItem', 'target' => 'ops_jst_order_item', 'keys' => ['Id'], 'indexes' => [ ['o_id', 'Id'], // 订单售后费用明细支持按子订单号查询;没有这个索引会让 // outer_oi_id 的匹配退化成上百万行全表扫描(实测 70 秒)。 ['outer_oi_id(64)', 'Id'], ], ], 'operations_replica.rpt.jst_sku' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_sku', 'target' => 'ops_jst_sku', 'keys' => ['autoid'], 'watermark' => 'modified', 'indexes' => [ ['sku_type', 'autoid'], ['sku_type', 'i_id', 'autoid'], ['sku_type', 'sku_id', 'autoid'], ['sku_id', 'autoid'], ['sku_type', 'enabled', 'autoid'], ['sku_type', 'stock_disabled', 'autoid'], ], ], 'operations_replica.rpt.jst_warehouseInfo' => ['source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_warehouseInfo', 'target' => 'ops_jst_warehouse_info', 'keys' => ['Id'], 'watermark' => 'updateTime', 'indexes' => [['wms_co_id', 'Id']]], 'operations_replica.rpt.jst_skumap' => ['source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_skumap', 'target' => 'ops_jst_sku_map', 'keys' => ['shop_id', 'shop_i_id', 'shop_sku_id'], 'watermark' => 'modifiedTime'], // item_id 是 nvarchar(100),镜像中按宽表策略保存为 LONGTEXT,不能进入普通索引。 'operations_replica.rpt.ads_itemid_sales_cost_ratio_v2_di' => ['source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'ads_itemid_sales_cost_ratio_v2_di', 'target' => 'ops_item_sales_cost_ratio', 'keys' => ['stat_date', 'item_id'], 'watermark' => 'item_id_update', 'indexes' => [['stat_date', 'push_fee']]], 'operations_replica.rpt.jst_returnAndRefundInfo' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_returnAndRefundInfo', 'target' => 'ops_jst_return_refund_info', 'keys' => ['Id'], 'watermark' => 'updateTime', 'excluded_date_range' => ['column' => 'as_date', 'from' => '2025-01-01', 'to' => '2026-01-01'], 'indexes' => [ ['Id'], ['as_date', 'Id'], ['o_id', 'Id'], ['as_id', 'Id'], ['shop_id', 'outer_as_id(100)'], ['so_id(64)'], ['outer_as_id(64)'], ['as_date', 'Id', 'as_id', 'shop_site(300)'], ], ], 'operations_replica.rpt.jst_returnAndRefundItem' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_returnAndRefundItem', 'target' => 'ops_jst_return_refund_item', 'keys' => ['Id'], 'excluded_date_range' => [ 'column' => 'as_date', 'from' => '2025-01-01', 'to' => '2026-01-01', 'parent_dataset' => 'operations_replica.rpt.jst_returnAndRefundInfo', 'key' => 'as_id', ], // The replica can replace historical detail IDs. Append-only sync // cannot discover those changes; reconcile in bounded weekly runs. 'full_reconcile_hours' => 168, 'indexes' => [ ['as_id', 'Id'], ], ], 'operations_replica.rpt.jst_shopInfo' => ['source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_shopInfo', 'target' => 'ops_jst_shop_info', 'keys' => ['Id'], 'watermark' => 'updateTime', 'indexes' => [['shop_id', 'Id']]], // 淘系(天猫/淘宝)订单与售后:聚水潭单独存放在 qmcust 这套表里, // 与 jst_Orders / jst_OrderItem / jst_returnAndRefundInfo 分开。 // 订单售后费用明细等页面需要把两套来源合并展示。 'operations_replica.rpt.jst_qmcust_orderlist' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_qmcust_orderlist', 'target' => 'ops_jst_qmcust_orders', 'keys' => ['Id'], 'watermark' => 'local_updated', 'indexes' => [ ['o_id', 'Id'], ['order_date', 'o_id', 'Id'], ['so_id(64)', 'Id'], ['shop_name(128)', 'Id'], ], ], 'operations_replica.rpt.jst_qmcust_orderlist_item' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_qmcust_orderlist_item', 'target' => 'ops_jst_qmcust_order_items', 'keys' => ['Id'], 'watermark' => 'local_updated', 'indexes' => [ ['o_id', 'Id'], ['oi_id', 'Id'], ['outer_oi_id(64)', 'Id'], ], ], 'operations_replica.rpt.jst_qmcust_refundlist' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_qmcust_refundlist', 'target' => 'ops_jst_qmcust_refunds', 'keys' => ['as_id'], 'watermark' => 'local_updated', 'excluded_date_range' => ['column' => 'as_date', 'from' => '2025-01-01', 'to' => '2026-01-01'], 'indexes' => [ ['as_id'], ['o_id', 'as_id'], ['as_date', 'as_id'], ['so_id(64)'], ['outer_as_id(64)'], ], ], 'operations_replica.rpt.jst_qmcust_refundlist_item' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_qmcust_refundlist_item', 'target' => 'ops_jst_qmcust_refund_items', 'keys' => ['asi_id'], 'watermark' => 'local_updated', 'excluded_date_range' => [ 'column' => 'as_date', 'from' => '2025-01-01', 'to' => '2026-01-01', 'parent_dataset' => 'operations_replica.rpt.jst_qmcust_refundlist', 'key' => 'as_id', ], 'indexes' => [ ['as_id', 'asi_id'], ], ], // 聚水潭「商品利润 → 导出明细数据 → 订单售后费用数据」的原表。 // 列名是 undefined1..undefinedN,中文表头由 ..._schemas 表提供映射。 'operations_replica.rpt.jst_goods_profit_kpi_items_afs' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_goods_profit_kpi_items_afs', 'target' => 'ops_jst_goods_profit_kpi_items_afs', 'keys' => ['id'], 'watermark' => 'updatedAt', 'batch_size' => 2000, 'max_batches_per_run' => 4, // 160 多个 nvarchar 列,整行按 VARCHAR 建表会超过 InnoDB 行长度上限。 'wide_strings' => true, 'indexes' => [ ['undefined8', 'undefined7'], ['undefined1'], ['undefined2'], ['undefined10'], ], ], 'operations_replica.rpt.jst_goods_profit_kpi_items_afs_schemas' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_goods_profit_kpi_items_afs_schemas', 'target' => 'ops_jst_goods_profit_kpi_items_afs_schemas', 'keys' => ['id'], 'watermark' => 'id', ], 'operations_replica.rpt.jst_originalBillInfo' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'jst_originalBillInfo', 'target' => 'ops_jst_original_bill_info', 'keys' => ['Id'], 'watermark' => 'updateTime', 'columns' => [ 'Id', 'shop_id', 'channel', 'fee_time', 'del_flag', 'primary_key', 'createTime', 'updateTime', 'auto_id', 'fee_name', 'inout_type', 'oc_amount', 'p_auto_id', 'shop_i_id', 'shop_sku_id', 'sku_id', 'so_id', 'combine_type', 'amount', ], 'indexes' => [ ['Id'], ['shop_id', 'fee_time', 'Id'], ['fee_time', 'Id'], ['channel', 'fee_time', 'Id', 'inout_type', 'amount'], ['channel', 'shop_id', 'fee_time', 'Id', 'inout_type', 'amount', 'fee_name'], ], ], // JSDataMiddlePlatform 中台库:京东京准通账单流水。京东营销账户余额页按 // show_date 归属月份,并以 settle_datetime + id 确定月末最后一条余额。 'js_data_middle_platform.dbo.jd_jzt_finance_records' => [ 'source_key' => 'js_data_middle_platform', 'schema' => 'dbo', 'object' => 'jd_jzt_finance_records', 'target' => 'jsm_jd_jzt_finance_records', 'keys' => ['id'], 'watermark' => 'updated_at', 'columns' => [ 'id', 'data_month', 'shop_name', 'in_out_type', 'in_out_type_name', 'amount', 'balance_amount', 'settle_datetime', 'show_date', 'updated_at', ], 'indexes' => [ ['show_date', 'settle_datetime', 'id'], ['shop_name(128)', 'show_date', 'settle_datetime', 'id'], ], ], // 聚水潭聚工单:协同工单列表。只复制工单查询需要的非敏感字段, // 正式 API 从共享镜像关联“仓内未发”类型,不在请求中直连上游。 'operations_replica.rpt.work_order_main' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'work_order_main', 'target' => 'ops_work_order_main', 'keys' => ['id'], 'watermark' => 'update_time', 'columns' => [ 'id', 'work_type', 'order_no', 'title', 'status', 'create_user', 'expect_minute', 'submit_time', 'expect_end_time', 'end_time', 'score', 'update_user', 'description', 'is_deleted', 'create_time', 'update_time', ], 'indexes' => [ ['work_type', 'id'], ['work_type', 'create_time', 'id'], ['create_time', 'id'], ], ], 'operations_replica.rpt.work_order_sub' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'work_order_sub', 'target' => 'ops_work_order_sub', 'keys' => ['id'], 'watermark' => 'update_time', 'columns' => [ 'id', 'sub_order_no', 'main_order_no', 'title', 'assign_user', 'status', 'expect_minute', 'submit_time', 'expect_end_time', 'finish_time', 'content', 'notify_submit', 'notify_soon', 'notify_overdue', 'overdue_notify_count', 'is_deleted', 'create_time', 'update_time', 'taskid', ], 'indexes' => [ ['id'], ['main_order_no', 'id'], ], ], 'operations_replica.rpt.work_order_form_config' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'work_order_form_config', 'target' => 'ops_work_order_form_config', 'keys' => ['id'], 'watermark' => 'update_time', 'columns' => [ 'id', 'work_type', 'work_type_name', 'group_name', 'icon', 'icon_color', 'time_limit_options', 'is_enabled', 'form_fields', 'sort', 'remark', 'create_time', 'update_time', 'timeout_reminder_count', ], 'indexes' => [ ['work_type', 'id'], ['work_type_name', 'id'], ], ], 'operations_replica.rpt.work_order_form_value' => [ 'source_key' => 'operations_replica', 'schema' => 'rpt', 'object' => 'work_order_form_value', 'target' => 'ops_work_order_form_value', 'keys' => ['id'], 'watermark' => null, 'columns' => [ 'id', 'main_order_no', 'field_code', 'field_name', 'field_value', 'field_type', 'sort', 'is_deleted', 'create_time', ], 'indexes' => [ ['sort', 'id'], ['main_order_no', 'sort', 'id'], ], ], // 聚水潭聚工单:协同工单 > 打款工单 > 小额打款。 // 页面只读共享镜像;businessFieldList 保留上游表单原文,由固定 // Mirror Repository 解析页面明确使用的字段,不在 HTTP 请求直连上游。 'jiansun.dbo.jst_workOrderInfo' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'jst_workOrderInfo', 'target' => 'js_jst_work_order_info', 'keys' => ['Id'], 'watermark' => 'updateTime', 'columns' => [ 'Id', 'woNo', 'woTypeId', 'title', 'content', 'status', 'grade', 'urging', 'createby', 'executors', 'beginTime', 'endTime', 'completer', 'completeTime', 'updated', 'created', 'businessFieldList', 'createTime', 'updateTime', ], 'indexes' => [ ['woTypeId', 'woNo', 'Id'], ['created', 'Id'], ], ], 'jiansun.dbo.jst_small_payment_order_map' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'jst_small_payment_order_map', 'target' => 'js_jst_small_payment_order_map', 'keys' => ['woNo'], 'watermark' => 'updated_at', 'columns' => [ 'woNo', 'woTypeId', 'transaction_no', 'shop_name', 'payment_reason', 'title', 'status', 'work_order_create_time', 'work_order_update_time', 'parse_status', 'parse_error', 'updated_at', ], 'indexes' => [ ['woTypeId', 'work_order_create_time', 'woNo'], ['status', 'woNo'], ], ], // JianSun 旧业务库:拼多多货款、营销账单、供应商应付、板材、封边条和库存。 // 拼多多货款账单只复制平台原始账单中的固定渠道切片,避免为该页面 // 重复同步上游 1400 万行原表,也不依赖慢一天的经营分析副本。 'jiansun.dbo.jst_originalBillInfo.pinduoduo_receiving' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'jst_originalBillInfo', 'target' => 'js_jst_pdd_receiving_bill_rows', 'keys' => ['Id'], 'watermark' => 'updateTime', 'fixed_filters' => [ 'channel' => 'PinduoduoImport', ], 'columns' => [ 'Id', 'shop_id', 'channel', 'fee_time', 'del_flag', 'primary_key', 'createTime', 'updateTime', 'auto_id', 'fee_name', 'inout_type', 'oc_amount', 'p_auto_id', 'shop_i_id', 'shop_sku_id', 'sku_id', 'so_id', 'combine_type', 'amount', ], 'indexes' => [ ['Id'], ['fee_time', 'Id', 'inout_type', 'amount'], ['shop_id', 'fee_time', 'Id', 'inout_type', 'amount', 'fee_name'], ['fee_name'], ], ], // 聚水潭得物货款账户:复制主账单、退货退款和其他费用扣减渠道; // 保证金及其他账户域流水不混入店铺收款账户页面。 'jiansun.dbo.jst_originalBillInfo.dewu_receiving' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'jst_originalBillInfo', 'target' => 'js_jst_dewu_receiving_bill_rows', 'keys' => ['Id'], 'watermark' => 'updateTime', 'fixed_filters' => [ 'channel' => ['Dewu', 'DewuTK', 'DewuKJ'], ], 'columns' => [ 'Id', 'shop_id', 'channel', 'fee_time', 'del_flag', 'primary_key', 'createTime', 'updateTime', 'auto_id', 'fee_name', 'inout_type', 'oc_amount', 'p_auto_id', 'shop_i_id', 'shop_sku_id', 'sku_id', 'so_id', 'combine_type', 'amount', ], 'indexes' => [ ['Id'], ['fee_time', 'Id', 'inout_type', 'amount'], ['shop_id', 'fee_time', 'Id', 'inout_type', 'amount', 'fee_name'], ['fee_name'], ], ], 'jiansun.dbo.alipay_Bill_Detail' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'alipay_Bill_Detail', 'target' => 'js_alipay_bill_detail', 'keys' => ['Id'], 'watermark' => null, 'columns' => [ 'Id', 'accountNum', 'businessNum', 'merchantOrder', 'commodityName', 'happenTime', 'oppAccount', 'inAmount', 'outAmount', 'accountAmount', 'tradeChannel', 'businessType', 'remark', 'shopName', 'date', 'busiBillSource', 'busiDescription', 'busiNum', 'busiBasicNum', 'buyerRemark', 'storeNum', 'appId', 'account', 'bindingType', ], 'indexes' => [ ['happenTime', 'Id'], ], ], 'jiansun.dbo.tmall_spread_bills' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'tmall_spread_bills', 'target' => 'js_tmall_spread_bills', 'keys' => ['id']], 'jiansun.dbo.pdd_spread_bills' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pdd_spread_bills', 'target' => 'js_pdd_spread_bills', 'keys' => ['id'], 'watermark' => 'createTime'], 'jiansun.dbo.alibaba_bill' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'alibaba_bill', 'target' => 'js_alibaba_bill', 'keys' => ['id']], 'jiansun.dbo.jd_spreadBills' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'jd_spreadBills', 'target' => 'js_jd_spread_bills', 'keys' => ['id'], 'watermark' => 'updateTime'], 'jiansun.dbo.jd_costBills' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'jd_costBills', 'target' => 'js_jd_cost_bills', 'keys' => ['id'], 'watermark' => 'creatTime'], // 安装明细页面使用已整理的只读视图,避免在 HTTP 请求中临时 JOIN // 安装主表和明细表;视图中的安装字段与 Excel 模板字段保持稳定别名。 'jiansun.dbo.fys_Ticketing_install_view' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'fys_Ticketing_install_view', 'target' => 'js_fys_ticketing_install_view', 'keys' => ['Id'], 'watermark' => null, // 安装明细只保留 2026 年起的发货记录;空发货时间不进入镜像。 'minimum_datetime' => ['column' => 'ShipTIme', 'value' => '2026-01-01 00:00:00'], 'indexes' => [ ['SubmitTime', 'Id'], ], ], 'jiansun.dbo.fys_Ticketing_install_item' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'fys_Ticketing_install_item', 'target' => 'js_fys_ticketing_install_item', 'keys' => ['Id'], 'watermark' => 'modifyTime', // 主表与明细使用不同的关联字段,明细仅同步仍保留在安装主表中的发货记录。 'parent_minimum_datetime' => [ 'column' => 'ShipTIme', 'value' => '2026-01-01 00:00:00', 'parent_dataset' => 'jiansun.dbo.fys_Ticketing_install_view', 'child_key' => 'guid', 'parent_key' => 'SourceGuid', ], 'indexes' => [['guid', 'Id']], ], 'jiansun.dbo.finance_purchaseReturn' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'finance_purchaseReturn', 'target' => 'js_finance_purchase_return', 'keys' => ['id']], 'jiansun.dbo.finance_invoiceDeduction' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'finance_invoiceDeduction', 'target' => 'js_finance_invoice_deduction', 'keys' => ['id'], 'watermark' => 'createTime'], 'jiansun.dbo.fys_supplierPaymentSummary' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'fys_supplierPaymentSummary', 'target' => 'js_supplier_payment_summary', 'keys' => ['id'], 'watermark' => 'modifiedTime'], 'jiansun.dbo.finance_advanceLoans' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'finance_advanceLoans', 'target' => 'js_finance_advance_loans', 'keys' => ['id'], 'watermark' => 'createTime'], 'jiansun.dbo.pm_unOrderDetails' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pm_unOrderDetails', 'target' => 'js_pm_unorder_details', 'keys' => ['Id']], 'jiansun.dbo.finance_sampleDeduction' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'finance_sampleDeduction', 'target' => 'js_finance_sample_deduction', 'keys' => ['id'], 'watermark' => 'finishTime'], 'jiansun.dbo.fys_express_courier_settlement' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'fys_express_courier_settlement', 'target' => 'js_express_courier_settlement', 'keys' => ['Id'], 'watermark' => 'modify_time'], 'jiansun.dbo.jst_order_express_details' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'jst_order_express_details', 'target' => 'js_jst_order_express_details', 'keys' => ['id'], 'watermark' => 'updatedAt', 'indexes' => [['send_time', 'id'], ['inner_order_id', 'id'], ['id', 'logistic_id']], 'columns' => [ 'id', 'updatedAt', 'inner_order_id', 'so_id', 'logistic_id', 'logistic_company_name', 'logistic_status_name', 'platform_name', 'shop_name', 'warehouse_name', 'send_time', 'weight', 'f_weight', ], ], 'jiansun.dbo.Jst_SendData_View_extension' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'Jst_SendData_View_extension', 'target' => 'js_jst_send_data_view_extension', 'keys' => ['Id'], 'watermark' => null, 'indexes' => [['so_id', 'Id'], ['io_id', 'Id'], ['so_id', 'Id', 'io_id']], 'columns' => [ 'Id', 'io_id', 'qty', 'l', 'w', 'h', 'sku_ids', 'sku_name', 'so_id', 'shop_site', 'shop_name', 'shop_i_id', 'supplier_name', 'receiver_state', 'receiver_city', 'receiver_district', 'expressName', 'wareHoursName', 'volume', 'weight', ], ], // 只同步运费对账需要的出库字段,不复制收货电话、买家信息等敏感列。 'jiansun.dbo.jst_salesOutboundInfo' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'jst_salesOutboundInfo', 'target' => 'js_jst_sales_outbound_info', 'keys' => ['Id'], 'watermark' => 'updateTime', 'indexes' => [['io_id', 'Id'], ['io_id', 'Id', 'freight']], 'columns' => ['Id', 'io_id', 'modified', 'updateTime', 'f_weight', 'weight', 'f_freight', 'freight', 'pay_date', 'volume', 'f_volume'], ], 'jiansun.dbo.finance_boardDeduction' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'finance_boardDeduction', 'target' => 'js_finance_board_deduction', 'keys' => ['id']], 'jiansun.dbo.pm_plainPlateData' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pm_plainPlateData', 'target' => 'js_pm_plain_plate_data', 'keys' => ['Id'], 'watermark' => 'createTime'], 'jiansun.dbo.pm_boardPurchasePrice' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pm_boardPurchasePrice', 'target' => 'js_pm_board_purchase_price', 'keys' => ['id'], 'watermark' => 'updateTime'], 'jiansun.dbo.pm_boardPriceChangeImport' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pm_boardPriceChangeImport', 'target' => 'js_pm_board_price_change', 'keys' => ['id'], 'watermark' => 'createTime'], 'jiansun.dbo.pm_boardApplyDetail' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pm_boardApplyDetail', 'target' => 'js_pm_board_apply_detail', 'keys' => ['Id']], 'jiansun.dbo.pm_edgeBandData' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pm_edgeBandData', 'target' => 'js_pm_edge_band_data', 'keys' => ['id'], 'watermark' => 'createTime'], 'jiansun.dbo.pm_edgeBandApplyDetail' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pm_edgeBandApplyDetail', 'target' => 'js_pm_edge_band_apply_detail', 'keys' => ['Id']], 'jiansun.dbo.pm_edgeBandProfitInfo' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pm_edgeBandProfitInfo', 'target' => 'js_pm_edge_band_profit_info', 'keys' => ['id']], 'jiansun.dbo.finance_edgeBandDeductio' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'finance_edgeBandDeductio', 'target' => 'js_finance_edge_band_deduction', 'keys' => ['id']], 'jiansun.dbo.pm_averageUnitPrice' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pm_averageUnitPrice', 'target' => 'js_pm_average_unit_price', 'keys' => ['id']], 'jiansun.dbo.pm_boardInventoryDetail_snapshot' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pm_boardInventoryDetail_snapshot', 'target' => 'js_pm_board_inventory_snapshot', 'keys' => ['id']], 'jiansun.dbo.fys_supplierGoods_sttlement_purchase' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'fys_supplierGoods_sttlement_purchase', 'target' => 'js_supplier_goods_purchase', 'keys' => ['Id'], 'watermark' => 'createTime'], 'jiansun.dbo.fys_supplierGoods_sttlement_sale' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'fys_supplierGoods_sttlement_sale', 'target' => 'js_supplier_goods_sale', 'keys' => ['Id'], 'watermark' => 'createTime'], 'jiansun.dbo.pm_purchaseIn' => ['source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pm_purchaseIn', 'target' => 'js_pm_purchase_in', 'keys' => ['id'], 'watermark' => 'updateTime'], // 工作平台采购价格:skuCode 对应 ops_jst_sku.sku_id。源表没有可靠更新时间, // 以 Id 稳定追加,页面按 effectTime 取当前已生效的最新价格。 'jiansun.dbo.pm_priceAdjustment' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pm_priceAdjustment', 'target' => 'js_pm_price_adjustment', 'keys' => ['Id'], 'watermark' => null, 'columns' => ['Id', 'skuCode', 'purchasePrice', 'effectTime'], 'indexes' => [ ['skuCode', 'effectTime', 'Id'], ['effectTime', 'Id'], ], ], // 变价明细(采购价变价历史):skucode 对应 ops_jst_sku.sku_id;页面取最近一条 priceType=1。 'jiansun.dbo.pm_priceAdjustment_log' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'pm_priceAdjustment_log', 'target' => 'js_pm_price_adjustment_log', 'keys' => ['Id'], 'watermark' => null, 'columns' => ['Id', 'skucode', 'priceType', 'originalPrice', 'afterPrice', 'diffPrice', 'effectStartTime', 'effectEndTime', 'createTime'], 'indexes' => [ ['skucode', 'effectStartTime', 'Id'], ['Id'], ], ], // 工作平台 2.0:快递资料及其网点、打款账户。页面只读取共享镜像, // 首次使用前需由刷新节点显式执行对应数据集的 --full 同步。 'jiansun.dbo.wp_express' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'wp_express', 'target' => 'js_wp_express', 'keys' => ['Id'], 'watermark' => 'modified', 'indexes' => [ ['expcode'], ['status', 'Id'], ], ], 'jiansun.dbo.wp_express_expNet' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'wp_express_expNet', 'target' => 'js_wp_express_exp_net', 'keys' => ['id'], 'indexes' => [ ['expid', 'id'], ['status', 'id'], ], ], 'jiansun.dbo.wp_express_account' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'wp_express_account', 'target' => 'js_wp_express_account', 'keys' => ['Id'], 'indexes' => [ ['expcode', 'Id'], ['accountType', 'Id'], ], ], 'jiansun.dbo.wp_express_extension' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'wp_express_extension', 'target' => 'js_wp_express_extension', 'keys' => ['Id'], 'watermark' => 'modifyTime', ], // 工作平台 2.0:客服系统 → 退款数据 → 退货取件管理(主表 + 明细 + 实退快递单号映射)。 // 逆向物流运费核算与退件跟踪页面只读取共享镜像,不在请求中直连工作平台库。 'jiansun.dbo.ekf_ReturnPickupManagement' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'ekf_ReturnPickupManagement', 'target' => 'js_ekf_return_pickup_management', 'keys' => ['Id'], 'watermark' => 'updateTime', 'columns' => [ 'Id', 'orderId', 'urgencyLevel', 'expectedPickupTime', 'orderStatus', 'returnExpressNo', 'paymentMethod', 'pickupType', 'shopName', 'transactionNo', 'senderName', 'senderPhone', 'province', 'city', 'district', 'street', 'address', 'note', 'issueType', 'issueDescription', 'expressFollowStatus', 'expressFollowResult', 'expressFollowDescription', 'expressOrderTime', 'expressPickupTime', 'creator', 'createTime', 'updateTime', 'guid', 'totalReturnQuantity', 'express_company', 'extend', 'canceler', 'sourceFrom', ], 'indexes' => [ ['orderId', 'Id'], ['createTime', 'Id'], ['updateTime', 'Id'], ['express_company', 'createTime', 'Id'], ['transactionNo', 'Id'], ], ], 'jiansun.dbo.ekf_ReturnPickupManagement_Item' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'ekf_ReturnPickupManagement_Item', 'target' => 'js_ekf_return_pickup_management_item', 'keys' => ['id'], 'watermark' => 'updatedTime', 'columns' => [ 'id', 'mainTableId', 'returnProcode', 'returnQuantity', 'barcode', 'platformProductId', 'platformSkuId', 'warehouse', 'receiverName', 'receiverPhone', 'receiverAddress', 'actualReturnOrderNo', 'actualReturnQuantity', 'unverifiedQuantity', 'returnProgress', 'productName', 'length', 'width', 'height', 'volume', 'grossWeight', 'estimatedFreight', 'updatedTime', 'actualReturnProcode', ], 'indexes' => [ ['mainTableId', 'id'], ['barcode', 'id'], ['returnProcode', 'id'], ['updatedTime', 'id'], ], ], 'jiansun.dbo.ekf_ReturnPickupManagement_TruthReExpressNumber' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'ekf_ReturnPickupManagement_TruthReExpressNumber', 'target' => 'js_ekf_return_pickup_truth_express', 'keys' => ['Id'], 'watermark' => 'createTime', 'columns' => ['Id', 'mId', 'truthExpressNumber', 'createTime'], 'indexes' => [ ['mId', 'Id'], ['truthExpressNumber', 'Id'], ['createTime', 'Id'], ], ], // 工作平台仓库资料:退货取件明细的「发货仓」同时存在工作平台短码 // (wp_warehouse.code / wp_warehouseConfig.whCode,如 2852)和聚水潭 // wms_co_id(如 15038426)。短码名称只从工作平台仓库表解析;这两张表 // 都很小,页面与导出经共享镜像读取,不直连上游。 'jiansun.dbo.wp_warehouse' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'wp_warehouse', 'target' => 'js_wp_warehouse', 'keys' => ['id'], 'watermark' => 'modified', 'columns' => ['id', 'code', 'name', 'status', 'modified'], 'indexes' => [ ['code', 'id'], ], ], // wp_warehouseConfig 没有更新时间列,按主键追加并依靠周期全量校准。 'jiansun.dbo.wp_warehouseConfig' => [ 'source_key' => 'jiansun', 'schema' => 'dbo', 'object' => 'wp_warehouseConfig', 'target' => 'js_wp_warehouse_config', 'keys' => ['Id'], 'columns' => ['Id', 'moduleId', 'whCode', 'whName'], 'indexes' => [ ['whCode', 'Id'], ], ], ], ];