CaiWuXiTong/config/upstream_mirrors.php
limeng a9c85b2a9f 线上代发价格:接入钉钉流程(全部已完成)+ 标签 + 商品编码 + 明细展开与SQL分页
- 按流程状态=已完成同步全部记录(去掉收款人过滤)
- 明细表「收款费用明细」JSON 解码并按行展开为多行
- 新增「标签」列:收款人=宁波顾家望业家居有限公司→刘萧代发,其余→1688代发
- 「料号」列改为「商品编码」(值留空)
- 仓库改为数据库层分页 + SQL 聚合,避免大数据量拖垮页面

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 18:38:35 +08:00

523 lines
30 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
return [
'connection' => env('BUSINESS_MIRROR_DB_CONNECTION', 'business_mirror'),
// 钉钉应付申请流程只同步“应付申请流程”这一固定流程编码,
// 页面从共享业务镜像读取,不在 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),
],
// 线上代发业务报销流程(钉钉 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', ''),
// 收款人过滤(可选):默认不过滤,获取全部符合状态的记录。若只想看某个
// 收款人,把 env DING_ONLINE_DAIFA_PRICE_PAYEE 设为该公司全称即可;
// 收款人全称是钉钉表单顶层字段,同步器会并入每条明细行按值精确匹配。
'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),
],
'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),
],
// 普通商品资料的“变价前价格 / 变价后价格 / 差额 / 变价时间”来自
// JianSun 旧业务库的商品价格记录表。页面按商品编码取最近一条有效记录,
// 不改动普通商品自身的采购价与成本价口径。
'product_price_changes' => [
'dataset_key' => 'jiansun.dbo.op_priceRecord',
'target_table' => 'js_op_price_record',
],
// 工作平台采购价格按 SKU 补充到普通商品资料;页面只读取共享镜像。
'work_platform_prices' => [
'dataset_key' => 'jiansun.dbo.pm_priceAdjustment',
'target_table' => 'js_pm_price_adjustment',
],
'courier_information' => [
'stale_after_minutes' => (int) env('COURIER_INFORMATION_MIRROR_STALE_MINUTES', 60),
],
/*
|--------------------------------------------------------------------------
| 上游原表镜像目录
|--------------------------------------------------------------------------
|
| 页面不能再按“页码 + 筛选条件”临时生成一份快照。这里登记项目代码实际
| 使用的上游表/视图,由后台按表同步到 caiwu_business_mirror。首次全量
| 必须显式执行;日常任务只续传已完成首次全量的数据集。
|
| watermark_column 为空时按稳定业务键追加,并依靠周期全量校准修正历史
| 更新和删除;存在可靠更新时间时使用重叠窗口增量同步。
*/
'table_sync' => [
'batch_size' => (int) env('BUSINESS_MIRROR_TABLE_BATCH_SIZE', 500),
'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',
'jiansun.dbo.op_priceRecord',
],
],
'datasets' => [
// 经营分析副本库:组织资料、订单、退款和聚水潭基础数据。
'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.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'],
],
],
'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'],
],
],
'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_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',
'indexes' => [
['as_date', 'Id'],
['o_id', 'Id'],
['as_id', 'Id'],
],
],
'operations_replica.rpt.jst_returnAndRefundItem' => [
'source_key' => 'operations_replica',
'schema' => 'rpt',
'object' => 'jst_returnAndRefundItem',
'target' => 'ops_jst_return_refund_item',
'keys' => ['Id'],
'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'],
'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'],
],
],
// 聚水潭聚工单:协同工单列表。只复制工单查询需要的非敏感字段,
// 正式 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'],
['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'],
],
],
'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'],
],
],
// 聚水潭聚工单:协同工单 > 打款工单 > 小额打款。
// 页面只读共享镜像;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 旧业务库:营销账单、供应商应付、板材、封边条和库存。
'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,
'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',
'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.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'],
// 普通商品资料的变价记录:barCode 对应 jst_sku.sku_id,页面按商品编码
// 取最近一条未删除记录;差额由上游 diffPrice 直接提供,不在页面计算。
'jiansun.dbo.op_priceRecord' => [
'source_key' => 'jiansun',
'schema' => 'dbo',
'object' => 'op_priceRecord',
'target' => 'js_op_price_record',
'keys' => ['Id'],
// updateTime 在上游对全部有效(delete=0)记录均为 NULL,不能用作
// 增量水位线,否则增量同步永远捞不到任何有效行。createTime 始终有值,
// 与 Id 单调一致,作为增量水位线最稳妥。
'watermark' => 'createTime',
'columns' => [
'Id', 'barCode', 'oldBarCode', 'originalPrice', 'afterPrice',
'diffPrice', 'effectStartTime', 'effectEndTime', 'createTime',
'updateTime', 'delete',
],
// barCode 在源库是 varchar(100),镜像按 TEXT 保存,索引必须写前缀
// 长度。商品编码远短于 64 字符,前缀索引即可命中页面查找。
// createTime 索引支撑增量水位线区间扫描。
'indexes' => [
['barCode(64)', 'effectStartTime', 'Id'],
['createTime', 'Id'],
],
],
// 工作平台采购价格:skuCode 对应 ops_jst_sku.sku_id。源表只有
// effectTime,没有可靠的修改时间,因此按 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(64)', 'effectTime', 'Id'],
['effectTime', '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',
],
],
];