{
  "mode": "window",
  "window": {
    "start": "2025-07-01T00:00:00+08:00",
    "end": "2026-01-29T23:00:00+08:00",
    "segments": 1
  },
  "windows": [
    {
      "mode": "window",
      "window": {
        "start": "2025-07-01T00:00:00+08:00",
        "end": "2026-01-29T23:00:00+08:00",
        "label": "segment_1",
        "granularity": "window"
      },
      "api_to_ods": {
        "window_split_unit": "none",
        "window_compensation_hours": 0,
        "start": "2025-07-01T00:00:00+08:00",
        "end": "2026-01-29T23:00:00+08:00",
        "cutoff": null,
        "window_days": 212,
        "window_hours": 0,
        "page_size": 200,
        "chunk_size": 500,
        "sample_limit": 50,
        "compare_content": true,
        "content_sample_limit": 50,
        "store_id": 2790685415443269,
        "base_url": "https://pc.ficoo.vip/apiprod/admin/v1/",
        "results": [
          {
            "task_code": "ODS_ASSISTANT_ACCOUNT",
            "table": "billiards_ods.assistant_accounts_master",
            "endpoint": "/PersonnelManagement/SearchAssistantInfo",
            "pk_columns": [
              "id"
            ],
            "records": 138,
            "records_with_pk": 138,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 2,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_SETTLEMENT_RECORDS",
            "table": "billiards_ods.settlement_records",
            "endpoint": "/Site/GetAllOrderSettleList",
            "pk_columns": [
              "id"
            ],
            "records": 21517,
            "records_with_pk": 21517,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 1414,
            "mismatch_samples": [
              {
                "id": 3049693993911621,
                "content_hash": "9f772f6b67992140c11a3edfd4280daf41943b81deee248567e57eef496b677a"
              },
              {
                "id": 3049687290709893,
                "content_hash": "8184f3c5939bac17cc1ca3c7bab38e9d41845a02f7c35254751af88c1732f798"
              },
              {
                "id": 3049677155829061,
                "content_hash": "0f3f46d2fe7bc58599b820f185d9427ef3ac5bb33ee6d48069663891d2226bd1"
              },
              {
                "id": 3049675185374533,
                "content_hash": "008bb915b905c95a4450199feaacc7d42522e4d56eae17696e96d94d34a3ddc0"
              },
              {
                "id": 3049667688630149,
                "content_hash": "3ab493d8f6e5f303f271f6d861a13efa79769984e42fd68cd532c594b85c7920"
              },
              {
                "id": 3049666963637573,
                "content_hash": "252cd7ace58aa07331331b52832fe56a5f444ba664cad0950d6d8af6b10807ac"
              },
              {
                "id": 3049659193771333,
                "content_hash": "b8da694790a7d29a6a366cde1dc48cb5432debda36d978c7137a4138ac2eb67e"
              },
              {
                "id": 3049652151338309,
                "content_hash": "cd81f391cf96431eb7680e08c3ead92d4fe09f4dfef15c100704c5aa58836ede"
              },
              {
                "id": 3049651460162885,
                "content_hash": "ad9968864c822f87790c548162a318ed676b5768195d106911621d03f4dad87c"
              },
              {
                "id": 3049650087413637,
                "content_hash": "613c5a822e133cf0841b893ae00699cdaee11a05ec79dfddf7619198f82abe3f"
              },
              {
                "id": 3049648237200709,
                "content_hash": "d900582e6c326729dab1400a7fb6524f547291904e8d50926148f4a1f9e06481"
              },
              {
                "id": 3049643525916357,
                "content_hash": "3884a413e857cb9ef4acbf2aa1851ab510b0f25c7c4bc1148df45425b59f5d7e"
              },
              {
                "id": 3049641004762821,
                "content_hash": "ed493cbfd955d6c94af43baddd92dcc1b23c29f760a9ace8e84bcea69fa098c0"
              },
              {
                "id": 3049630673766149,
                "content_hash": "6dfb5ebb77b3ddc150e4dfc3ad5bdbabd66b48276fa11b049a87adbe93ddf16a"
              },
              {
                "id": 3049624218273669,
                "content_hash": "3dea2089a02bd2452e1ffd962be3140db095412365e9d828b80abe3a7d77f101"
              },
              {
                "id": 3049616331622277,
                "content_hash": "6b3fc091c526c98098b01dba9da6988fff2fc971382f21b5a0b20878301851f3"
              },
              {
                "id": 3049611097736901,
                "content_hash": "95710f0b572ed137621eb1aca919bb975c4ae3c34a74e53b6c08fdf6c6d237e4"
              },
              {
                "id": 3049610645292741,
                "content_hash": "b40ecd1415b8f8bf47ff14f5125219d674cc18c90287590e2ff11bcdf4cca481"
              },
              {
                "id": 3049609302263685,
                "content_hash": "c5ad8c316857bbea598641392514dedf8a77d7f0d03d342fb404726803dfae33"
              },
              {
                "id": 3049604443588485,
                "content_hash": "f70cec0f75df0e066bced00870ee0b0bc4a9f38c2e323b2cb097cfcf99c3ab8e"
              },
              {
                "id": 3049585745823493,
                "content_hash": "b076d76ec229408c8ed5b80b166f9f367706c19465d7122178d70773cb2856bb"
              },
              {
                "id": 3049577520187141,
                "content_hash": "151a87959c8d7f491936405de9ec17901b10537cafd45d1aeeeab274805ede88"
              },
              {
                "id": 3049572749264773,
                "content_hash": "bc27c5a83bfc85b5600d938a94b6c4ca365cba5f6a721c5a0f718a1094d782cb"
              },
              {
                "id": 3049570033305349,
                "content_hash": "ff62cd72a46cfa2d63a604623246de7086dc4e52df3bf8eb959dfa17bccc58a6"
              },
              {
                "id": 3049564231485189,
                "content_hash": "5b7a6bac1199df4d095e107e93042ae741192efa826c8dee6370e2e41bd05a02"
              },
              {
                "id": 3049556197147973,
                "content_hash": "f46ccebbf9343ca244caef29557e2e94d624422fab224e8a1e527b75f49b3b40"
              },
              {
                "id": 3049555436045637,
                "content_hash": "e4b208436d0450fef16f7f348702602ce94a4d537399852e28d6e8e0b1a77356"
              },
              {
                "id": 3049525102298437,
                "content_hash": "e029fd231746cbc833e3e1802e9776a89e47022c685f4744d001ddee94c2fc56"
              },
              {
                "id": 3049505399539461,
                "content_hash": "f24d1429bf16c65bcf54a89841e60de5d76e85cc297960da2e40e0f89091b485"
              },
              {
                "id": 3049489313564421,
                "content_hash": "bf028f166f7016c79716874bf63d8e803c3657bb8bfe482a2c38247635d8c537"
              },
              {
                "id": 3049480004437765,
                "content_hash": "99dc95af93980d6cc2cbda0da7aaead3659ac40cc1581c3f8eee87fcc5418669"
              },
              {
                "id": 3049444425041669,
                "content_hash": "af1df14fb6715e8cd22b427d1229051616be3ef457cdda242b78c5050933faf1"
              },
              {
                "id": 3049435269187333,
                "content_hash": "10bdf29c85c7cb4ef888f86a71949e29c3ce713a68075be26f9442d85ff5f9eb"
              },
              {
                "id": 3049409664124229,
                "content_hash": "ed5116f2ad3b2777a9d512762f8e35ac6ba66070fe05de831e80702868d0a921"
              },
              {
                "id": 3049376012338885,
                "content_hash": "60e5336194019bd96bbb6ab52089955ac5bd21addf8bc85b00b6f3da0994d0ef"
              },
              {
                "id": 3049350366070085,
                "content_hash": "a2fed47f7f10ff89090da0ee99ffb54171a6cc0c85f59dc193cf8c7d69048e0f"
              },
              {
                "id": 3049316448290117,
                "content_hash": "662679c4bce27211bd86afe1bb77288b57cfc0270d23dbce907d2ae61254fdce"
              },
              {
                "id": 3049314064533253,
                "content_hash": "0828ce614791e159be4a156d8e8c3b218c7dbdf1f3b0c021bf02c9ba4ce6a058"
              },
              {
                "id": 3049310935221957,
                "content_hash": "b737bf9195579231d9ded3391f87541c09c18d0244b61a3a93ca6062f89b1813"
              },
              {
                "id": 3048861492757829,
                "content_hash": "63352d296478a6bbe733a9d964c4387dcd8d70cfc6215fc7a154a8e4321441ab"
              },
              {
                "id": 3048840159921477,
                "content_hash": "1f5cd39953ed5660d8481e112e8eedc6d498d793738bda206dd9819af4b3acd7"
              },
              {
                "id": 3048839651444613,
                "content_hash": "c907465b29f37a9f77c3855bf5294eae62488d3b5981b6f7b7df73f4554083c1"
              },
              {
                "id": 3048760090445701,
                "content_hash": "cf6a6b582d379eaf2f995734bbe2dc98761c3141240645ae60266787ade7114b"
              },
              {
                "id": 3048755614156485,
                "content_hash": "d3534c26f95d6aca9b445b47ea8c62cadd8b756ce4a471ac462d5471fefd5ae4"
              },
              {
                "id": 3048747724457285,
                "content_hash": "374b83cee63f0ff4eecec744e1a3403b1c5026d0cc195c98a7573945e873841f"
              },
              {
                "id": 3048744895448965,
                "content_hash": "497c9cee85f5a8e5692baa06fbf9988d6e425768c65ddf0265d889e9beaaa6e4"
              },
              {
                "id": 3048738683684613,
                "content_hash": "b13776a1fa555a23477aa4cbb35e196c6cc93b5b6d3aa1ff5d2b7ef429cf93a7"
              },
              {
                "id": 3048699584055045,
                "content_hash": "d045c0d63bfc2386b4e8bc1589d57fb93ee31f1d9abaaa71a074ea228a362941"
              },
              {
                "id": 3048697132844805,
                "content_hash": "03fa89e4812877afea0015d0b09fe5caae8025d40ff1a78cbca38a5b74483b86"
              },
              {
                "id": 3048672071059205,
                "content_hash": "6cff23966cc3356a2f486777f8d1b29d280c4ce98312c78314a798ad2e38b2e9"
              }
            ],
            "pages": 109,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_TABLE_USE",
            "table": "billiards_ods.table_fee_transactions",
            "endpoint": "/Site/GetSiteTableOrderDetails",
            "pk_columns": [
              "id"
            ],
            "records": 10104,
            "records_with_pk": 10104,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 51,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_ASSISTANT_LEDGER",
            "table": "billiards_ods.assistant_service_records",
            "endpoint": "/AssistantPerformance/GetOrderAssistantDetails",
            "pk_columns": [
              "id"
            ],
            "records": 4529,
            "records_with_pk": 4529,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 25,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_ASSISTANT_ABOLISH",
            "table": "billiards_ods.assistant_cancellation_records",
            "endpoint": "/AssistantPerformance/GetAbolitionAssistant",
            "pk_columns": [
              "id"
            ],
            "records": 84,
            "records_with_pk": 84,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 2,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_STORE_GOODS_SALES",
            "table": "billiards_ods.store_goods_sales_records",
            "endpoint": "/TenantGoods/GetGoodsSalesList",
            "pk_columns": [
              "id"
            ],
            "records": 0,
            "records_with_pk": 0,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 1,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_PAYMENT",
            "table": "billiards_ods.payment_transactions",
            "endpoint": "/PayLog/GetPayLogListPage",
            "pk_columns": [
              "id"
            ],
            "records": 11908,
            "records_with_pk": 11908,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 60,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_REFUND",
            "table": "billiards_ods.refund_transactions",
            "endpoint": "/Order/GetRefundPayLogList",
            "pk_columns": [
              "id"
            ],
            "records": 39,
            "records_with_pk": 39,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 1,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_PLATFORM_COUPON",
            "table": "billiards_ods.platform_coupon_redemption_records",
            "endpoint": "/Promotion/GetOfflineCouponConsumePageList",
            "pk_columns": [
              "id"
            ],
            "records": 17277,
            "records_with_pk": 17277,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 87,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_MEMBER",
            "table": "billiards_ods.member_profiles",
            "endpoint": "/MemberProfile/GetTenantMemberList",
            "pk_columns": [
              "id"
            ],
            "records": 556,
            "records_with_pk": 556,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 3,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_MEMBER_CARD",
            "table": "billiards_ods.member_stored_value_cards",
            "endpoint": "/MemberProfile/GetTenantMemberCardList",
            "pk_columns": [
              "id"
            ],
            "records": 945,
            "records_with_pk": 945,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 5,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_MEMBER_BALANCE",
            "table": "billiards_ods.member_balance_changes",
            "endpoint": "/MemberProfile/GetMemberCardBalanceChange",
            "pk_columns": [
              "id"
            ],
            "records": 2501,
            "records_with_pk": 2501,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 13,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_RECHARGE_SETTLE",
            "table": "billiards_ods.recharge_settlements",
            "endpoint": "/Site/GetRechargeSettleList",
            "pk_columns": [
              "id"
            ],
            "records": 414,
            "records_with_pk": 414,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 4,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_GROUP_PACKAGE",
            "table": "billiards_ods.group_buy_packages",
            "endpoint": "/PackageCoupon/QueryPackageCouponList",
            "pk_columns": [
              "id"
            ],
            "records": 18,
            "records_with_pk": 18,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 1,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_GROUP_BUY_REDEMPTION",
            "table": "billiards_ods.group_buy_redemption_records",
            "endpoint": "/Site/GetSiteTableUseDetails",
            "pk_columns": [
              "id"
            ],
            "records": 8230,
            "records_with_pk": 8230,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 42,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_INVENTORY_STOCK",
            "table": "billiards_ods.goods_stock_summary",
            "endpoint": "/TenantGoods/GetGoodsStockReport",
            "pk_columns": [
              "sitegoodsid"
            ],
            "records": 172,
            "records_with_pk": 172,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 1,
            "mismatch_samples": [
              {
                "sitegoodsid": 2794695801917573,
                "content_hash": "3a668d320cf4ff80b913277ddcd574cbd97cd6cbf59bfa3435253c92a6b52508"
              }
            ],
            "pages": 1,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_INVENTORY_CHANGE",
            "table": "billiards_ods.goods_stock_movements",
            "endpoint": "/GoodsStockManage/QueryGoodsOutboundReceipt",
            "pk_columns": [
              "sitegoodsstockid"
            ],
            "records": 28811,
            "records_with_pk": 28811,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 145,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_TABLES",
            "table": "billiards_ods.site_tables_master",
            "endpoint": "/Table/GetSiteTables",
            "pk_columns": [
              "id"
            ],
            "records": 74,
            "records_with_pk": 74,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 1,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_GOODS_CATEGORY",
            "table": "billiards_ods.stock_goods_category_tree",
            "endpoint": "/TenantGoodsCategory/QueryPrimarySecondaryCategory",
            "pk_columns": [
              "id"
            ],
            "records": 9,
            "records_with_pk": 9,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 1,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_STORE_GOODS",
            "table": "billiards_ods.store_goods_master",
            "endpoint": "/TenantGoods/GetGoodsInventoryList",
            "pk_columns": [
              "id"
            ],
            "records": 172,
            "records_with_pk": 172,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 1,
            "mismatch_samples": [
              {
                "id": 2794695801917573,
                "content_hash": "e274058282aaec4d786710db076b6225620fc74de08763643510828c34a485a2"
              }
            ],
            "pages": 1,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_TABLE_FEE_DISCOUNT",
            "table": "billiards_ods.table_fee_discount_records",
            "endpoint": "/Site/GetTaiFeeAdjustList",
            "pk_columns": [
              "id"
            ],
            "records": 1782,
            "records_with_pk": 1782,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 9,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_TENANT_GOODS",
            "table": "billiards_ods.tenant_goods_master",
            "endpoint": "/TenantGoods/QueryTenantGoods",
            "pk_columns": [
              "id"
            ],
            "records": 173,
            "records_with_pk": 173,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 1,
            "skipped_missing_pk": 0,
            "errors": 0,
            "error_detail": null,
            "compare_content": true,
            "content_hash_supported": true
          },
          {
            "task_code": "ODS_SETTLEMENT_TICKET",
            "table": "billiards_ods.settlement_ticket_details",
            "endpoint": "/Order/GetOrderSettleTicketNew",
            "pk_columns": [
              "ordersettleid"
            ],
            "records": 22176,
            "records_with_pk": 0,
            "missing": 0,
            "missing_samples": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "pages": 113,
            "skipped_missing_pk": 22176,
            "errors": 0,
            "error_detail": null,
            "source_endpoint": "/PayLog/GetPayLogListPage"
          }
        ],
        "total_missing": 0,
        "total_mismatch": 1416,
        "total_errors": 0,
        "generated_at": "2026-01-31T05:40:58.602950+08:00"
      },
      "ods_to_dwd": {
        "tables": [
          {
            "dwd_table": "billiards_dwd.dwd_settlement_head",
            "ods_table": "billiards_ods.settlement_records",
            "windowed": false,
            "window_col": null,
            "count": {
              "dwd": 23366,
              "ods": 23712,
              "diff": -346
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "mismatch_error": "join_keys_or_compare_cols_unavailable"
          },
          {
            "dwd_table": "billiards_dwd.dwd_settlement_head_ex",
            "ods_table": "billiards_ods.settlement_records",
            "windowed": false,
            "window_col": null,
            "count": {
              "dwd": 23366,
              "ods": 23712,
              "diff": -346
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "mismatch_error": "join_keys_or_compare_cols_unavailable"
          },
          {
            "dwd_table": "billiards_dwd.dwd_table_fee_log",
            "ods_table": "billiards_ods.table_fee_transactions",
            "windowed": true,
            "window_col": null,
            "count": {
              "dwd": null,
              "ods": null,
              "diff": null
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "error": "AttributeError: 'tuple' object has no attribute 'items'"
          },
          {
            "dwd_table": "billiards_dwd.dwd_table_fee_log_ex",
            "ods_table": "billiards_ods.table_fee_transactions",
            "windowed": true,
            "window_col": null,
            "count": {
              "dwd": null,
              "ods": null,
              "diff": null
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "error": "AttributeError: 'tuple' object has no attribute 'items'"
          },
          {
            "dwd_table": "billiards_dwd.dwd_table_fee_adjust",
            "ods_table": "billiards_ods.table_fee_discount_records",
            "windowed": false,
            "window_col": null,
            "count": {
              "dwd": 2849,
              "ods": 2943,
              "diff": -94
            },
            "amounts": [
              {
                "column": "ledger_amount",
                "dwd_sum": 329604.44,
                "ods_sum": 348842.08,
                "diff": -19237.640000000014
              }
            ],
            "mismatch": 0,
            "mismatch_samples": [],
            "mismatch_error": null
          },
          {
            "dwd_table": "billiards_dwd.dwd_table_fee_adjust_ex",
            "ods_table": "billiards_ods.table_fee_discount_records",
            "windowed": true,
            "window_col": null,
            "count": {
              "dwd": null,
              "ods": null,
              "diff": null
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "error": "AttributeError: 'tuple' object has no attribute 'items'"
          },
          {
            "dwd_table": "billiards_dwd.dwd_store_goods_sale",
            "ods_table": "billiards_ods.store_goods_sales_records",
            "windowed": true,
            "window_col": null,
            "count": {
              "dwd": null,
              "ods": null,
              "diff": null
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "error": "AttributeError: 'tuple' object has no attribute 'items'"
          },
          {
            "dwd_table": "billiards_dwd.dwd_store_goods_sale_ex",
            "ods_table": "billiards_ods.store_goods_sales_records",
            "windowed": false,
            "window_col": null,
            "count": {
              "dwd": 17563,
              "ods": 17563,
              "diff": 0
            },
            "amounts": [
              {
                "column": "coupon_deduct_money",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              },
              {
                "column": "discount_money",
                "dwd_sum": 21673.2,
                "ods_sum": 21673.2,
                "diff": 0.0
              },
              {
                "column": "member_discount_amount",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              },
              {
                "column": "option_coupon_deduct_money",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              },
              {
                "column": "option_member_discount_money",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              },
              {
                "column": "point_discount_money",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              },
              {
                "column": "point_discount_money_cost",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              },
              {
                "column": "push_money",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              }
            ],
            "mismatch": 0,
            "mismatch_samples": [],
            "mismatch_error": null
          },
          {
            "dwd_table": "billiards_dwd.dwd_assistant_service_log",
            "ods_table": "billiards_ods.assistant_service_records",
            "windowed": true,
            "window_col": null,
            "count": {
              "dwd": null,
              "ods": null,
              "diff": null
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "error": "AttributeError: 'tuple' object has no attribute 'items'"
          },
          {
            "dwd_table": "billiards_dwd.dwd_assistant_service_log_ex",
            "ods_table": "billiards_ods.assistant_service_records",
            "windowed": true,
            "window_col": null,
            "count": {
              "dwd": null,
              "ods": null,
              "diff": null
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "error": "AttributeError: 'tuple' object has no attribute 'items'"
          },
          {
            "dwd_table": "billiards_dwd.dwd_assistant_trash_event",
            "ods_table": "billiards_ods.assistant_cancellation_records",
            "windowed": false,
            "window_col": null,
            "count": {
              "dwd": 98,
              "ods": 100,
              "diff": -2
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "mismatch_error": "join_keys_or_compare_cols_unavailable"
          },
          {
            "dwd_table": "billiards_dwd.dwd_assistant_trash_event_ex",
            "ods_table": "billiards_ods.assistant_cancellation_records",
            "windowed": false,
            "window_col": null,
            "count": {
              "dwd": 98,
              "ods": 100,
              "diff": -2
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "mismatch_error": "join_keys_or_compare_cols_unavailable"
          },
          {
            "dwd_table": "billiards_dwd.dwd_member_balance_change",
            "ods_table": "billiards_ods.member_balance_changes",
            "windowed": false,
            "window_col": null,
            "count": {
              "dwd": 4745,
              "ods": 4858,
              "diff": -113
            },
            "amounts": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "mismatch_error": null
          },
          {
            "dwd_table": "billiards_dwd.dwd_member_balance_change_ex",
            "ods_table": "billiards_ods.member_balance_changes",
            "windowed": false,
            "window_col": null,
            "count": {
              "dwd": 4745,
              "ods": 4858,
              "diff": -113
            },
            "amounts": [
              {
                "column": "refund_amount",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              }
            ],
            "mismatch": 0,
            "mismatch_samples": [],
            "mismatch_error": null
          },
          {
            "dwd_table": "billiards_dwd.dwd_groupbuy_redemption",
            "ods_table": "billiards_ods.group_buy_redemption_records",
            "windowed": true,
            "window_col": null,
            "count": {
              "dwd": null,
              "ods": null,
              "diff": null
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "error": "AttributeError: 'tuple' object has no attribute 'items'"
          },
          {
            "dwd_table": "billiards_dwd.dwd_groupbuy_redemption_ex",
            "ods_table": "billiards_ods.group_buy_redemption_records",
            "windowed": false,
            "window_col": null,
            "count": {
              "dwd": 11427,
              "ods": 11735,
              "diff": -308
            },
            "amounts": [
              {
                "column": "assistant_promotion_money",
                "dwd_sum": 7544.8,
                "ods_sum": 7544.8,
                "diff": 0.0
              },
              {
                "column": "assistant_service_promotion_money",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              },
              {
                "column": "goods_promotion_money",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              },
              {
                "column": "recharge_promotion_money",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              },
              {
                "column": "reward_promotion_money",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              },
              {
                "column": "table_service_promotion_money",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              }
            ],
            "mismatch": 0,
            "mismatch_samples": [],
            "mismatch_error": null
          },
          {
            "dwd_table": "billiards_dwd.dwd_platform_coupon_redemption",
            "ods_table": "billiards_ods.platform_coupon_redemption_records",
            "windowed": true,
            "window_col": null,
            "count": {
              "dwd": null,
              "ods": null,
              "diff": null
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "error": "AttributeError: 'tuple' object has no attribute 'items'"
          },
          {
            "dwd_table": "billiards_dwd.dwd_platform_coupon_redemption_ex",
            "ods_table": "billiards_ods.platform_coupon_redemption_records",
            "windowed": false,
            "window_col": null,
            "count": {
              "dwd": 16977,
              "ods": 17277,
              "diff": -300
            },
            "amounts": [],
            "mismatch": 0,
            "mismatch_samples": [],
            "mismatch_error": null
          },
          {
            "dwd_table": "billiards_dwd.dwd_recharge_order",
            "ods_table": "billiards_ods.recharge_settlements",
            "windowed": false,
            "window_col": null,
            "count": {
              "dwd": 455,
              "ods": 462,
              "diff": -7
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "mismatch_error": "join_keys_or_compare_cols_unavailable"
          },
          {
            "dwd_table": "billiards_dwd.dwd_recharge_order_ex",
            "ods_table": "billiards_ods.recharge_settlements",
            "windowed": false,
            "window_col": null,
            "count": {
              "dwd": 455,
              "ods": 462,
              "diff": -7
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "mismatch_error": "join_keys_or_compare_cols_unavailable"
          },
          {
            "dwd_table": "billiards_dwd.dwd_payment",
            "ods_table": "billiards_ods.payment_transactions",
            "windowed": true,
            "window_col": null,
            "count": {
              "dwd": null,
              "ods": null,
              "diff": null
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "error": "AttributeError: 'tuple' object has no attribute 'items'"
          },
          {
            "dwd_table": "billiards_dwd.dwd_refund",
            "ods_table": "billiards_ods.refund_transactions",
            "windowed": true,
            "window_col": null,
            "count": {
              "dwd": null,
              "ods": null,
              "diff": null
            },
            "amounts": [],
            "mismatch": null,
            "mismatch_samples": [],
            "error": "AttributeError: 'tuple' object has no attribute 'items'"
          },
          {
            "dwd_table": "billiards_dwd.dwd_refund_ex",
            "ods_table": "billiards_ods.refund_transactions",
            "windowed": false,
            "window_col": null,
            "count": {
              "dwd": 45,
              "ods": 46,
              "diff": -1
            },
            "amounts": [
              {
                "column": "balance_frozen_amount",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              },
              {
                "column": "card_frozen_amount",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              },
              {
                "column": "refund_amount",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              },
              {
                "column": "round_amount",
                "dwd_sum": 0.0,
                "ods_sum": 0.0,
                "diff": 0.0
              }
            ],
            "mismatch": 0,
            "mismatch_samples": [],
            "mismatch_error": null
          }
        ],
        "total_count_diff": -1639,
        "total_mismatch": 118581
      },
      "generated_at": "2026-01-31T05:41:18.992643+08:00"
    }
  ],
  "api_to_ods": {
    "total_missing": 0,
    "total_mismatch": 1416,
    "total_errors": 0
  },
  "total_missing": 0,
  "total_mismatch": 1416,
  "total_errors": 0,
  "generated_at": "2026-01-31T05:41:18.992668+08:00",
  "backfill_result": {
    "total_missing": 190,
    "total_mismatch": 1416,
    "backfilled": 1416,
    "errors": 0,
    "details": [
      {
        "task_code": "ODS_SETTLEMENT_RECORDS",
        "missing": 10,
        "mismatch": 1414,
        "backfilled": 1414,
        "error": null
      },
      {
        "task_code": "ODS_ASSISTANT_LEDGER",
        "missing": 1,
        "mismatch": 0,
        "backfilled": 0,
        "error": null
      },
      {
        "task_code": "ODS_INVENTORY_STOCK",
        "missing": 0,
        "mismatch": 1,
        "backfilled": 1,
        "error": null
      },
      {
        "task_code": "ODS_INVENTORY_CHANGE",
        "missing": 179,
        "mismatch": 0,
        "backfilled": 0,
        "error": null
      },
      {
        "task_code": "ODS_STORE_GOODS",
        "missing": 0,
        "mismatch": 1,
        "backfilled": 1,
        "error": null
      }
    ]
  },
  "post_check": {
    "mode": "window",
    "window": {
      "start": "2025-07-01T00:00:00+08:00",
      "end": "2026-01-29T23:00:00+08:00",
      "segments": 1
    },
    "windows": [
      {
        "mode": "window",
        "window": {
          "start": "2025-07-01T00:00:00+08:00",
          "end": "2026-01-29T23:00:00+08:00",
          "label": "segment_1",
          "granularity": "window"
        },
        "api_to_ods": {
          "window_split_unit": "none",
          "window_compensation_hours": 0,
          "start": "2025-07-01T00:00:00+08:00",
          "end": "2026-01-29T23:00:00+08:00",
          "cutoff": null,
          "window_days": 212,
          "window_hours": 0,
          "page_size": 200,
          "chunk_size": 500,
          "sample_limit": 50,
          "compare_content": true,
          "content_sample_limit": 50,
          "store_id": 2790685415443269,
          "base_url": "https://pc.ficoo.vip/apiprod/admin/v1/",
          "results": [
            {
              "task_code": "ODS_ASSISTANT_ACCOUNT",
              "table": "billiards_ods.assistant_accounts_master",
              "endpoint": "/PersonnelManagement/SearchAssistantInfo",
              "pk_columns": [
                "id"
              ],
              "records": 138,
              "records_with_pk": 138,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 2,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_SETTLEMENT_RECORDS",
              "table": "billiards_ods.settlement_records",
              "endpoint": "/Site/GetAllOrderSettleList",
              "pk_columns": [
                "id"
              ],
              "records": 21517,
              "records_with_pk": 21517,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 109,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_TABLE_USE",
              "table": "billiards_ods.table_fee_transactions",
              "endpoint": "/Site/GetSiteTableOrderDetails",
              "pk_columns": [
                "id"
              ],
              "records": 10104,
              "records_with_pk": 10104,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 51,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_ASSISTANT_LEDGER",
              "table": "billiards_ods.assistant_service_records",
              "endpoint": "/AssistantPerformance/GetOrderAssistantDetails",
              "pk_columns": [
                "id"
              ],
              "records": 4529,
              "records_with_pk": 4529,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 25,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_ASSISTANT_ABOLISH",
              "table": "billiards_ods.assistant_cancellation_records",
              "endpoint": "/AssistantPerformance/GetAbolitionAssistant",
              "pk_columns": [
                "id"
              ],
              "records": 84,
              "records_with_pk": 84,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 2,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_STORE_GOODS_SALES",
              "table": "billiards_ods.store_goods_sales_records",
              "endpoint": "/TenantGoods/GetGoodsSalesList",
              "pk_columns": [
                "id"
              ],
              "records": 0,
              "records_with_pk": 0,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 1,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_PAYMENT",
              "table": "billiards_ods.payment_transactions",
              "endpoint": "/PayLog/GetPayLogListPage",
              "pk_columns": [
                "id"
              ],
              "records": 11908,
              "records_with_pk": 11908,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 60,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_REFUND",
              "table": "billiards_ods.refund_transactions",
              "endpoint": "/Order/GetRefundPayLogList",
              "pk_columns": [
                "id"
              ],
              "records": 39,
              "records_with_pk": 39,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 1,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_PLATFORM_COUPON",
              "table": "billiards_ods.platform_coupon_redemption_records",
              "endpoint": "/Promotion/GetOfflineCouponConsumePageList",
              "pk_columns": [
                "id"
              ],
              "records": 17277,
              "records_with_pk": 17277,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 87,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_MEMBER",
              "table": "billiards_ods.member_profiles",
              "endpoint": "/MemberProfile/GetTenantMemberList",
              "pk_columns": [
                "id"
              ],
              "records": 556,
              "records_with_pk": 556,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 3,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_MEMBER_CARD",
              "table": "billiards_ods.member_stored_value_cards",
              "endpoint": "/MemberProfile/GetTenantMemberCardList",
              "pk_columns": [
                "id"
              ],
              "records": 945,
              "records_with_pk": 945,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 5,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_MEMBER_BALANCE",
              "table": "billiards_ods.member_balance_changes",
              "endpoint": "/MemberProfile/GetMemberCardBalanceChange",
              "pk_columns": [
                "id"
              ],
              "records": 2501,
              "records_with_pk": 2501,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 13,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_RECHARGE_SETTLE",
              "table": "billiards_ods.recharge_settlements",
              "endpoint": "/Site/GetRechargeSettleList",
              "pk_columns": [
                "id"
              ],
              "records": 414,
              "records_with_pk": 414,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 4,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_GROUP_PACKAGE",
              "table": "billiards_ods.group_buy_packages",
              "endpoint": "/PackageCoupon/QueryPackageCouponList",
              "pk_columns": [
                "id"
              ],
              "records": 18,
              "records_with_pk": 18,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 1,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_GROUP_BUY_REDEMPTION",
              "table": "billiards_ods.group_buy_redemption_records",
              "endpoint": "/Site/GetSiteTableUseDetails",
              "pk_columns": [
                "id"
              ],
              "records": 8230,
              "records_with_pk": 8230,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 42,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_INVENTORY_STOCK",
              "table": "billiards_ods.goods_stock_summary",
              "endpoint": "/TenantGoods/GetGoodsStockReport",
              "pk_columns": [
                "sitegoodsid"
              ],
              "records": 172,
              "records_with_pk": 172,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 1,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_INVENTORY_CHANGE",
              "table": "billiards_ods.goods_stock_movements",
              "endpoint": "/GoodsStockManage/QueryGoodsOutboundReceipt",
              "pk_columns": [
                "sitegoodsstockid"
              ],
              "records": 28811,
              "records_with_pk": 28811,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 145,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_TABLES",
              "table": "billiards_ods.site_tables_master",
              "endpoint": "/Table/GetSiteTables",
              "pk_columns": [
                "id"
              ],
              "records": 74,
              "records_with_pk": 74,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 1,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_GOODS_CATEGORY",
              "table": "billiards_ods.stock_goods_category_tree",
              "endpoint": "/TenantGoodsCategory/QueryPrimarySecondaryCategory",
              "pk_columns": [
                "id"
              ],
              "records": 9,
              "records_with_pk": 9,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 1,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_STORE_GOODS",
              "table": "billiards_ods.store_goods_master",
              "endpoint": "/TenantGoods/GetGoodsInventoryList",
              "pk_columns": [
                "id"
              ],
              "records": 172,
              "records_with_pk": 172,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 1,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_TABLE_FEE_DISCOUNT",
              "table": "billiards_ods.table_fee_discount_records",
              "endpoint": "/Site/GetTaiFeeAdjustList",
              "pk_columns": [
                "id"
              ],
              "records": 1782,
              "records_with_pk": 1782,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 9,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_TENANT_GOODS",
              "table": "billiards_ods.tenant_goods_master",
              "endpoint": "/TenantGoods/QueryTenantGoods",
              "pk_columns": [
                "id"
              ],
              "records": 173,
              "records_with_pk": 173,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 1,
              "skipped_missing_pk": 0,
              "errors": 0,
              "error_detail": null,
              "compare_content": true,
              "content_hash_supported": true
            },
            {
              "task_code": "ODS_SETTLEMENT_TICKET",
              "table": "billiards_ods.settlement_ticket_details",
              "endpoint": "/Order/GetOrderSettleTicketNew",
              "pk_columns": [
                "ordersettleid"
              ],
              "records": 22176,
              "records_with_pk": 0,
              "missing": 0,
              "missing_samples": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "pages": 113,
              "skipped_missing_pk": 22176,
              "errors": 0,
              "error_detail": null,
              "source_endpoint": "/PayLog/GetPayLogListPage"
            }
          ],
          "total_missing": 0,
          "total_mismatch": 0,
          "total_errors": 0,
          "generated_at": "2026-01-31T06:00:58.194488+08:00"
        },
        "ods_to_dwd": {
          "tables": [
            {
              "dwd_table": "billiards_dwd.dwd_settlement_head",
              "ods_table": "billiards_ods.settlement_records",
              "windowed": false,
              "window_col": null,
              "count": {
                "dwd": 23366,
                "ods": 23712,
                "diff": -346
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "mismatch_error": "join_keys_or_compare_cols_unavailable"
            },
            {
              "dwd_table": "billiards_dwd.dwd_settlement_head_ex",
              "ods_table": "billiards_ods.settlement_records",
              "windowed": false,
              "window_col": null,
              "count": {
                "dwd": 23366,
                "ods": 23712,
                "diff": -346
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "mismatch_error": "join_keys_or_compare_cols_unavailable"
            },
            {
              "dwd_table": "billiards_dwd.dwd_table_fee_log",
              "ods_table": "billiards_ods.table_fee_transactions",
              "windowed": true,
              "window_col": null,
              "count": {
                "dwd": null,
                "ods": null,
                "diff": null
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "error": "AttributeError: 'tuple' object has no attribute 'items'"
            },
            {
              "dwd_table": "billiards_dwd.dwd_table_fee_log_ex",
              "ods_table": "billiards_ods.table_fee_transactions",
              "windowed": true,
              "window_col": null,
              "count": {
                "dwd": null,
                "ods": null,
                "diff": null
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "error": "AttributeError: 'tuple' object has no attribute 'items'"
            },
            {
              "dwd_table": "billiards_dwd.dwd_table_fee_adjust",
              "ods_table": "billiards_ods.table_fee_discount_records",
              "windowed": false,
              "window_col": null,
              "count": {
                "dwd": 2849,
                "ods": 2943,
                "diff": -94
              },
              "amounts": [
                {
                  "column": "ledger_amount",
                  "dwd_sum": 329604.44,
                  "ods_sum": 348842.08,
                  "diff": -19237.640000000014
                }
              ],
              "mismatch": 0,
              "mismatch_samples": [],
              "mismatch_error": null
            },
            {
              "dwd_table": "billiards_dwd.dwd_table_fee_adjust_ex",
              "ods_table": "billiards_ods.table_fee_discount_records",
              "windowed": true,
              "window_col": null,
              "count": {
                "dwd": null,
                "ods": null,
                "diff": null
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "error": "AttributeError: 'tuple' object has no attribute 'items'"
            },
            {
              "dwd_table": "billiards_dwd.dwd_store_goods_sale",
              "ods_table": "billiards_ods.store_goods_sales_records",
              "windowed": true,
              "window_col": null,
              "count": {
                "dwd": null,
                "ods": null,
                "diff": null
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "error": "AttributeError: 'tuple' object has no attribute 'items'"
            },
            {
              "dwd_table": "billiards_dwd.dwd_store_goods_sale_ex",
              "ods_table": "billiards_ods.store_goods_sales_records",
              "windowed": false,
              "window_col": null,
              "count": {
                "dwd": 17563,
                "ods": 17563,
                "diff": 0
              },
              "amounts": [
                {
                  "column": "coupon_deduct_money",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                },
                {
                  "column": "discount_money",
                  "dwd_sum": 21673.2,
                  "ods_sum": 21673.2,
                  "diff": 0.0
                },
                {
                  "column": "member_discount_amount",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                },
                {
                  "column": "option_coupon_deduct_money",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                },
                {
                  "column": "option_member_discount_money",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                },
                {
                  "column": "point_discount_money",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                },
                {
                  "column": "point_discount_money_cost",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                },
                {
                  "column": "push_money",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                }
              ],
              "mismatch": 0,
              "mismatch_samples": [],
              "mismatch_error": null
            },
            {
              "dwd_table": "billiards_dwd.dwd_assistant_service_log",
              "ods_table": "billiards_ods.assistant_service_records",
              "windowed": true,
              "window_col": null,
              "count": {
                "dwd": null,
                "ods": null,
                "diff": null
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "error": "AttributeError: 'tuple' object has no attribute 'items'"
            },
            {
              "dwd_table": "billiards_dwd.dwd_assistant_service_log_ex",
              "ods_table": "billiards_ods.assistant_service_records",
              "windowed": true,
              "window_col": null,
              "count": {
                "dwd": null,
                "ods": null,
                "diff": null
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "error": "AttributeError: 'tuple' object has no attribute 'items'"
            },
            {
              "dwd_table": "billiards_dwd.dwd_assistant_trash_event",
              "ods_table": "billiards_ods.assistant_cancellation_records",
              "windowed": false,
              "window_col": null,
              "count": {
                "dwd": 98,
                "ods": 100,
                "diff": -2
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "mismatch_error": "join_keys_or_compare_cols_unavailable"
            },
            {
              "dwd_table": "billiards_dwd.dwd_assistant_trash_event_ex",
              "ods_table": "billiards_ods.assistant_cancellation_records",
              "windowed": false,
              "window_col": null,
              "count": {
                "dwd": 98,
                "ods": 100,
                "diff": -2
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "mismatch_error": "join_keys_or_compare_cols_unavailable"
            },
            {
              "dwd_table": "billiards_dwd.dwd_member_balance_change",
              "ods_table": "billiards_ods.member_balance_changes",
              "windowed": false,
              "window_col": null,
              "count": {
                "dwd": 4745,
                "ods": 4858,
                "diff": -113
              },
              "amounts": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "mismatch_error": null
            },
            {
              "dwd_table": "billiards_dwd.dwd_member_balance_change_ex",
              "ods_table": "billiards_ods.member_balance_changes",
              "windowed": false,
              "window_col": null,
              "count": {
                "dwd": 4745,
                "ods": 4858,
                "diff": -113
              },
              "amounts": [
                {
                  "column": "refund_amount",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                }
              ],
              "mismatch": 0,
              "mismatch_samples": [],
              "mismatch_error": null
            },
            {
              "dwd_table": "billiards_dwd.dwd_groupbuy_redemption",
              "ods_table": "billiards_ods.group_buy_redemption_records",
              "windowed": true,
              "window_col": null,
              "count": {
                "dwd": null,
                "ods": null,
                "diff": null
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "error": "AttributeError: 'tuple' object has no attribute 'items'"
            },
            {
              "dwd_table": "billiards_dwd.dwd_groupbuy_redemption_ex",
              "ods_table": "billiards_ods.group_buy_redemption_records",
              "windowed": false,
              "window_col": null,
              "count": {
                "dwd": 11427,
                "ods": 11735,
                "diff": -308
              },
              "amounts": [
                {
                  "column": "assistant_promotion_money",
                  "dwd_sum": 7544.8,
                  "ods_sum": 7544.8,
                  "diff": 0.0
                },
                {
                  "column": "assistant_service_promotion_money",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                },
                {
                  "column": "goods_promotion_money",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                },
                {
                  "column": "recharge_promotion_money",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                },
                {
                  "column": "reward_promotion_money",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                },
                {
                  "column": "table_service_promotion_money",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                }
              ],
              "mismatch": 0,
              "mismatch_samples": [],
              "mismatch_error": null
            },
            {
              "dwd_table": "billiards_dwd.dwd_platform_coupon_redemption",
              "ods_table": "billiards_ods.platform_coupon_redemption_records",
              "windowed": true,
              "window_col": null,
              "count": {
                "dwd": null,
                "ods": null,
                "diff": null
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "error": "AttributeError: 'tuple' object has no attribute 'items'"
            },
            {
              "dwd_table": "billiards_dwd.dwd_platform_coupon_redemption_ex",
              "ods_table": "billiards_ods.platform_coupon_redemption_records",
              "windowed": false,
              "window_col": null,
              "count": {
                "dwd": 16977,
                "ods": 17277,
                "diff": -300
              },
              "amounts": [],
              "mismatch": 0,
              "mismatch_samples": [],
              "mismatch_error": null
            },
            {
              "dwd_table": "billiards_dwd.dwd_recharge_order",
              "ods_table": "billiards_ods.recharge_settlements",
              "windowed": false,
              "window_col": null,
              "count": {
                "dwd": 455,
                "ods": 462,
                "diff": -7
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "mismatch_error": "join_keys_or_compare_cols_unavailable"
            },
            {
              "dwd_table": "billiards_dwd.dwd_recharge_order_ex",
              "ods_table": "billiards_ods.recharge_settlements",
              "windowed": false,
              "window_col": null,
              "count": {
                "dwd": 455,
                "ods": 462,
                "diff": -7
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "mismatch_error": "join_keys_or_compare_cols_unavailable"
            },
            {
              "dwd_table": "billiards_dwd.dwd_payment",
              "ods_table": "billiards_ods.payment_transactions",
              "windowed": true,
              "window_col": null,
              "count": {
                "dwd": null,
                "ods": null,
                "diff": null
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "error": "AttributeError: 'tuple' object has no attribute 'items'"
            },
            {
              "dwd_table": "billiards_dwd.dwd_refund",
              "ods_table": "billiards_ods.refund_transactions",
              "windowed": true,
              "window_col": null,
              "count": {
                "dwd": null,
                "ods": null,
                "diff": null
              },
              "amounts": [],
              "mismatch": null,
              "mismatch_samples": [],
              "error": "AttributeError: 'tuple' object has no attribute 'items'"
            },
            {
              "dwd_table": "billiards_dwd.dwd_refund_ex",
              "ods_table": "billiards_ods.refund_transactions",
              "windowed": false,
              "window_col": null,
              "count": {
                "dwd": 45,
                "ods": 46,
                "diff": -1
              },
              "amounts": [
                {
                  "column": "balance_frozen_amount",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                },
                {
                  "column": "card_frozen_amount",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                },
                {
                  "column": "refund_amount",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                },
                {
                  "column": "round_amount",
                  "dwd_sum": 0.0,
                  "ods_sum": 0.0,
                  "diff": 0.0
                }
              ],
              "mismatch": 0,
              "mismatch_samples": [],
              "mismatch_error": null
            }
          ],
          "total_count_diff": -1639,
          "total_mismatch": 118581
        },
        "generated_at": "2026-01-31T06:01:15.314372+08:00"
      }
    ],
    "api_to_ods": {
      "total_missing": 0,
      "total_mismatch": 0,
      "total_errors": 0
    },
    "total_missing": 0,
    "total_mismatch": 0,
    "total_errors": 0,
    "generated_at": "2026-01-31T06:01:15.314392+08:00"
  }
}
