[INFO] cloning repository https://github.com/xizhends-dot/new-xizhends-saas-erp
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/xizhends-dot/new-xizhends-saas-erp" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fxizhends-dot%2Fnew-xizhends-saas-erp", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fxizhends-dot%2Fnew-xizhends-saas-erp'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 32a70605737119b064524301ca262a29acb85dae
[INFO] checking xizhends-dot/new-xizhends-saas-erp against try#d8be25549d5418405531341b4be6d8538fc3c42e for pr-156160
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fxizhends-dot%2Fnew-xizhends-saas-erp" "/workspace/builds/worker-4-tc2/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-4-tc2/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/xizhends-dot/new-xizhends-saas-erp
[INFO] finished tweaking git repo https://github.com/xizhends-dot/new-xizhends-saas-erp
[INFO] tweaked toml for git repo https://github.com/xizhends-dot/new-xizhends-saas-erp written to /workspace/builds/worker-4-tc2/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/xizhends-dot/new-xizhends-saas-erp on toolchain d8be25549d5418405531341b4be6d8538fc3c42e
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+d8be25549d5418405531341b4be6d8538fc3c42e" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/xizhends-dot/new-xizhends-saas-erp already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+d8be25549d5418405531341b4be6d8538fc3c42e" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:3a6becf2bc8dde7f3fa57ede90e4f284e72d296796fc446bbb1e2c7cc0530151" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] c79425c0cd88768a5b1941f45154236131830995944dd4a5dd600a09d7ab9b8a
[INFO] running `Command { std: "docker" "start" "c79425c0cd88768a5b1941f45154236131830995944dd4a5dd600a09d7ab9b8a", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "c79425c0cd88768a5b1941f45154236131830995944dd4a5dd600a09d7ab9b8a" "/opt/rustwide/cargo-home/bin/cargo" "+d8be25549d5418405531341b4be6d8538fc3c42e" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "c79425c0cd88768a5b1941f45154236131830995944dd4a5dd600a09d7ab9b8a", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-w" "/opt/rustwide/workdir" "--user" "0:0" "c79425c0cd88768a5b1941f45154236131830995944dd4a5dd600a09d7ab9b8a" "/opt/rustwide/cargo-home/bin/cargo" "+d8be25549d5418405531341b4be6d8538fc3c42e" "check" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]     Checking memchr v2.8.1
[INFO] [stderr]    Compiling libc v0.2.186
[INFO] [stderr]    Compiling num-traits v0.2.19
[INFO] [stderr]    Compiling const-oid v0.9.6
[INFO] [stderr]    Compiling zerocopy v0.8.52
[INFO] [stderr]    Compiling ahash v0.8.12
[INFO] [stderr]    Compiling syn v2.0.117
[INFO] [stderr]    Compiling smallvec v1.15.1
[INFO] [stderr]    Compiling subtle v2.6.1
[INFO] [stderr]     Checking digest v0.10.7
[INFO] [stderr]    Compiling libm v0.2.16
[INFO] [stderr]    Compiling serde_core v1.0.228
[INFO] [stderr]     Checking log v0.4.32
[INFO] [stderr]     Checking futures-sink v0.3.32
[INFO] [stderr]    Compiling zeroize v1.8.2
[INFO] [stderr]    Compiling rustix v1.1.4
[INFO] [stderr]    Compiling num-bigint-dig v0.8.6
[INFO] [stderr]    Compiling base64ct v1.8.3
[INFO] [stderr]    Compiling getrandom v0.3.4
[INFO] [stderr]     Checking ppv-lite86 v0.2.21
[INFO] [stderr]    Compiling siphasher v1.0.3
[INFO] [stderr]     Checking bitflags v2.13.0
[INFO] [stderr]     Checking pem-rfc7468 v0.7.0
[INFO] [stderr]     Checking tracing-core v0.1.36
[INFO] [stderr]     Checking regex-syntax v0.8.11
[INFO] [stderr]    Compiling spin v0.9.8
[INFO] [stderr]    Compiling phf_shared v0.11.3
[INFO] [stderr]    Compiling form_urlencoded v1.2.2
[INFO] [stderr]     Checking aho-corasick v1.1.4
[INFO] [stderr]     Checking futures-util v0.3.32
[INFO] [stderr]    Compiling der v0.7.10
[INFO] [stderr]    Compiling tinyvec v1.11.0
[INFO] [stderr]    Compiling lazy_static v1.5.0
[INFO] [stderr]     Checking futures-channel v0.3.32
[INFO] [stderr]    Compiling unicode_categories v0.1.1
[INFO] [stderr]    Compiling nom v7.1.3
[INFO] [stderr]    Compiling unicode-normalization v0.1.25
[INFO] [stderr]     Checking num-integer v0.1.46
[INFO] [stderr]     Checking serde_json v1.0.150
[INFO] [stderr]     Checking spki v0.7.3
[INFO] [stderr]     Checking getrandom v0.2.17
[INFO] [stderr]     Checking socket2 v0.6.4
[INFO] [stderr]     Checking mio v1.2.1
[INFO] [stderr]     Checking rand_core v0.6.4
[INFO] [stderr]    Compiling parking_lot_core v0.9.12
[INFO] [stderr]     Checking rand_chacha v0.3.1
[INFO] [stderr]    Compiling num-iter v0.1.45
[INFO] [stderr]    Compiling pkcs8 v0.10.2
[INFO] [stderr]    Compiling parking_lot v0.12.5
[INFO] [stderr]    Compiling signature v2.2.0
[INFO] [stderr]     Checking rand v0.8.6
[INFO] [stderr]    Compiling pkcs1 v0.7.5
[INFO] [stderr]    Compiling tokio v1.52.3
[INFO] [stderr]    Compiling futures-intrusive v0.5.0
[INFO] [stderr]     Checking hashbrown v0.14.5
[INFO] [stderr]    Compiling atoi v2.0.0
[INFO] [stderr]    Compiling chrono v0.4.45
[INFO] [stderr]    Compiling parse-zoneinfo v0.3.1
[INFO] [stderr]    Compiling phf v0.11.3
[INFO] [stderr]     Checking regex-automata v0.4.14
[INFO] [stderr]    Compiling sha2 v0.10.9
[INFO] [stderr]    Compiling hmac v0.12.1
[INFO] [stderr]    Compiling linux-raw-sys v0.12.1
[INFO] [stderr]    Compiling ucd-trie v0.1.7
[INFO] [stderr]    Compiling byteorder v1.5.0
[INFO] [stderr]    Compiling unicode-bidi v0.3.18
[INFO] [stderr]    Compiling sqlformat v0.2.6
[INFO] [stderr]    Compiling syn v1.0.109
[INFO] [stderr]    Compiling unicode-properties v0.1.4
[INFO] [stderr]    Compiling event-listener v2.5.3
[INFO] [stderr]    Compiling hex v0.4.3
[INFO] [stderr]    Compiling pest v2.8.6
[INFO] [stderr]    Compiling hkdf v0.12.4
[INFO] [stderr]    Compiling getrandom v0.4.2
[INFO] [stderr]    Compiling sha1 v0.10.6
[INFO] [stderr]     Checking bstr v1.12.1
[INFO] [stderr]    Compiling stringprep v0.1.5
[INFO] [stderr]    Compiling md-5 v0.10.6
[INFO] [stderr]     Checking crossbeam-epoch v0.9.18
[INFO] [stderr]    Compiling fastrand v2.4.1
[INFO] [stderr]    Compiling unicode-segmentation v1.13.3
[INFO] [stderr]     Checking crc-catalog v2.5.0
[INFO] [stderr]    Compiling dotenvy v0.15.7
[INFO] [stderr]    Compiling base64 v0.21.7
[INFO] [stderr]    Compiling whoami v1.6.1
[INFO] [stderr]    Compiling heck v0.4.1
[INFO] [stderr]     Checking crossbeam-deque v0.8.6
[INFO] [stderr]     Checking indexmap v2.14.0
[INFO] [stderr]     Checking crc v3.4.0
[INFO] [stderr]     Checking globset v0.4.18
[INFO] [stderr]    Compiling synstructure v0.13.2
[INFO] [stderr]    Compiling pest_meta v2.8.6
[INFO] [stderr]     Checking hashlink v0.8.4
[INFO] [stderr]     Checking rand_core v0.9.5
[INFO] [stderr]     Checking crossbeam-queue v0.3.12
[INFO] [stderr]    Compiling tempfile v3.27.0
[INFO] [stderr]    Compiling phf_generator v0.11.3
[INFO] [stderr]     Checking ignore v0.4.26
[INFO] [stderr]    Compiling phf_codegen v0.11.3
[INFO] [stderr]     Checking http-body-util v0.1.3
[INFO] [stderr]    Compiling chrono-tz-build v0.3.0
[INFO] [stderr]     Checking rsa v0.9.10
[INFO] [stderr]    Compiling pest_generator v2.8.6
[INFO] [stderr]     Checking deunicode v1.6.2
[INFO] [stderr]     Checking slug v0.1.6
[INFO] [stderr]     Checking regex v1.12.4
[INFO] [stderr]     Checking password-hash v0.5.0
[INFO] [stderr]     Checking globwalk v0.9.1
[INFO] [stderr]    Compiling chrono-tz v0.9.0
[INFO] [stderr]     Checking wait-timeout v0.2.1
[INFO] [stderr]     Checking blake2 v0.10.6
[INFO] [stderr]     Checking humansize v2.1.3
[INFO] [stderr]     Checking serde_path_to_error v0.1.20
[INFO] [stderr]     Checking matchit v0.7.3
[INFO] [stderr]     Checking rand_chacha v0.9.0
[INFO] [stderr]     Checking argon2 v0.5.3
[INFO] [stderr]     Checking rand_xorshift v0.4.0
[INFO] [stderr]    Compiling zerofrom-derive v0.1.7
[INFO] [stderr]    Compiling yoke-derive v0.8.2
[INFO] [stderr]    Compiling zerovec-derive v0.11.3
[INFO] [stderr]    Compiling displaydoc v0.2.6
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling tracing-attributes v0.1.31
[INFO] [stderr]    Compiling tokio-macros v2.7.0
[INFO] [stderr]    Compiling thiserror-impl v1.0.69
[INFO] [stderr]    Compiling async-trait v0.1.89
[INFO] [stderr]    Compiling pest_derive v2.8.6
[INFO] [stderr]     Checking rand v0.9.4
[INFO] [stderr]     Checking rusty-fork v0.3.1
[INFO] [stderr]     Checking dashmap v5.5.3
[INFO] [stderr]    Compiling tokio-stream v0.1.18
[INFO] [stderr]     Checking proptest v1.11.0
[INFO] [stderr]    Compiling zerofrom v0.1.8
[INFO] [stderr]    Compiling thiserror v1.0.69
[INFO] [stderr]    Compiling yoke v0.8.3
[INFO] [stderr]     Checking tracing v0.1.44
[INFO] [stderr]    Compiling zerovec v0.11.6
[INFO] [stderr]    Compiling zerotrie v0.2.4
[INFO] [stderr]     Checking axum-core v0.4.5
[INFO] [stderr]    Compiling tinystr v0.8.3
[INFO] [stderr]    Compiling potential_utf v0.1.5
[INFO] [stderr]    Compiling icu_collections v2.2.0
[INFO] [stderr]    Compiling icu_locale_core v2.2.0
[INFO] [stderr]     Checking serde v1.0.228
[INFO] [stderr]     Checking icu_provider v2.2.0
[INFO] [stderr]     Checking icu_properties v2.2.0
[INFO] [stderr]     Checking icu_normalizer v2.2.0
[INFO] [stderr]     Checking either v1.16.0
[INFO] [stderr]     Checking serde_urlencoded v0.7.1
[INFO] [stderr]    Compiling idna_adapter v1.2.2
[INFO] [stderr]    Compiling idna v1.1.0
[INFO] [stderr]     Checking hyper v1.10.1
[INFO] [stderr]     Checking tower v0.5.3
[INFO] [stderr]    Compiling url v2.5.8
[INFO] [stderr]    Compiling sqlx-core v0.7.4
[INFO] [stderr]     Checking hyper-util v0.1.20
[INFO] [stderr]     Checking axum v0.7.9
[INFO] [stderr]     Checking tera v1.20.1
[INFO] [stderr]     Checking sqlx-mysql v0.7.4
[INFO] [stderr]    Compiling sqlx-macros-core v0.7.4
[INFO] [stderr]    Compiling sqlx-macros v0.7.4
[INFO] [stderr]     Checking sqlx v0.7.4
[INFO] [stderr]     Checking order-system-rewrite v0.1.0 (/opt/rustwide/workdir)
[INFO] [stdout] warning: unused imports: `LogisticsStep`, `PlatformOAuth`, and `TokenSet`
[INFO] [stdout]   --> src/integrations/mod.rs:17:30
[INFO] [stdout]    |
[INFO] [stdout] 17 |     Carrier, CarrierTracker, LogisticsStep, LogisticsTrace, MailAccount, MailFolder, MailGateway,
[INFO] [stdout]    |                              ^^^^^^^^^^^^^
[INFO] [stdout] 18 |     PlatformOAuth, ProductInfo, PurchaseProvider, ReplyResult, SyncReport, TokenSet, TrackResult,
[INFO] [stdout]    |     ^^^^^^^^^^^^^                                                          ^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused imports: `LogisticsStep`, `PlatformOAuth`, and `TokenSet`
[INFO] [stdout]   --> src/integrations/mod.rs:17:30
[INFO] [stdout]    |
[INFO] [stdout] 17 |     Carrier, CarrierTracker, LogisticsStep, LogisticsTrace, MailAccount, MailFolder, MailGateway,
[INFO] [stdout]    |                              ^^^^^^^^^^^^^
[INFO] [stdout] 18 |     PlatformOAuth, ProductInfo, PurchaseProvider, ReplyResult, SyncReport, TokenSet, TrackResult,
[INFO] [stdout]    |     ^^^^^^^^^^^^^                                                          ^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated associated function `chrono::NaiveDateTime::from_timestamp_opt`: use `DateTime::from_timestamp` instead
[INFO] [stdout]    --> src/jobs/update_jpship_logistics.rs:727:45
[INFO] [stdout]     |
[INFO] [stdout] 727 |             .prop_map(|secs| NaiveDateTime::from_timestamp_opt(secs, 0).expect("范围内必有效"))
[INFO] [stdout]     |                                             ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated associated function `chrono::NaiveDateTime::from_timestamp_opt`: use `DateTime::from_timestamp` instead
[INFO] [stdout]    --> src/integrations/rakuten_rms.rs:469:42
[INFO] [stdout]     |
[INFO] [stdout] 469 |         if let Some(dt) = NaiveDateTime::from_timestamp_opt(ts, 0) {
[INFO] [stdout]     |                                          ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(deprecated)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated associated function `chrono::NaiveDateTime::from_timestamp_opt`: use `DateTime::from_timestamp` instead
[INFO] [stdout]    --> src/jobs/update_jpship_logistics.rs:261:20
[INFO] [stdout]     |
[INFO] [stdout] 261 |     NaiveDateTime::from_timestamp_opt(secs, 0)
[INFO] [stdout]     |                    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated associated function `chrono::NaiveDateTime::from_timestamp_opt`: use `DateTime::from_timestamp` instead
[INFO] [stdout]    --> src/jobs/update_jpship_logistics.rs:262:43
[INFO] [stdout]     |
[INFO] [stdout] 262 |         .unwrap_or_else(|| NaiveDateTime::from_timestamp_opt(0, 0).expect("epoch 必然有效"))
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated associated function `chrono::NaiveDateTime::from_timestamp_opt`: use `DateTime::from_timestamp` instead
[INFO] [stdout]    --> src/integrations/rakuten_rms.rs:469:42
[INFO] [stdout]     |
[INFO] [stdout] 469 |         if let Some(dt) = NaiveDateTime::from_timestamp_opt(ts, 0) {
[INFO] [stdout]     |                                          ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated associated function `chrono::NaiveDateTime::from_timestamp_opt`: use `DateTime::from_timestamp` instead
[INFO] [stdout]    --> src/jobs/update_jpship_logistics.rs:261:20
[INFO] [stdout]     |
[INFO] [stdout] 261 |     NaiveDateTime::from_timestamp_opt(secs, 0)
[INFO] [stdout]     |                    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated associated function `chrono::NaiveDateTime::from_timestamp_opt`: use `DateTime::from_timestamp` instead
[INFO] [stdout]    --> src/jobs/update_jpship_logistics.rs:262:43
[INFO] [stdout]     |
[INFO] [stdout] 262 |         .unwrap_or_else(|| NaiveDateTime::from_timestamp_opt(0, 0).expect("epoch 必然有效"))
[INFO] [stdout]     |                                           ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: use of deprecated associated function `chrono::NaiveDateTime::from_timestamp_opt`: use `DateTime::from_timestamp` instead
[INFO] [stdout]    --> src/jobs/update_jpship_logistics.rs:797:38
[INFO] [stdout]     |
[INFO] [stdout] 797 |             let now = NaiveDateTime::from_timestamp_opt(1_700_000_000, 0).unwrap();
[INFO] [stdout]     |                                      ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: static `TENANT_MIGRATOR` is never used
[INFO] [stdout]   --> src/db/migrate.rs:36:12
[INFO] [stdout]    |
[INFO] [stdout] 36 | pub static TENANT_MIGRATOR: Migrator = sqlx::migrate!("migrations/tenant");
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `init_tenant_db` is never used
[INFO] [stdout]   --> src/db/migrate.rs:59:14
[INFO] [stdout]    |
[INFO] [stdout] 59 | pub async fn init_tenant_db(pool: &MySqlPool) -> Result<(), AppError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `LEGACY_ORDER_KEY` is never used
[INFO] [stdout]    --> src/db/migrate.rs:226:11
[INFO] [stdout]     |
[INFO] [stdout] 226 | pub const LEGACY_ORDER_KEY: &str = "ID";
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `legacy_table_name` is never used
[INFO] [stdout]    --> src/db/migrate.rs:232:8
[INFO] [stdout]     |
[INFO] [stdout] 232 | pub fn legacy_table_name(platform: Platform) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `legacy_archive_table_name` is never used
[INFO] [stdout]    --> src/db/migrate.rs:240:8
[INFO] [stdout]     |
[INFO] [stdout] 240 | pub fn legacy_archive_table_name(platform: Platform, year: i32) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `LegacySource` is never used
[INFO] [stdout]    --> src/db/migrate.rs:249:10
[INFO] [stdout]     |
[INFO] [stdout] 249 | pub enum LegacySource {
[INFO] [stdout]     |          ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `table_name` and `platform` are never used
[INFO] [stdout]    --> src/db/migrate.rs:258:12
[INFO] [stdout]     |
[INFO] [stdout] 256 | impl LegacySource {
[INFO] [stdout]     | ----------------- methods in this implementation
[INFO] [stdout] 257 |     /// 该数据源对应的旧库物理表名（纯函数）。
[INFO] [stdout] 258 |     pub fn table_name(&self) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 266 |     pub fn platform(&self) -> Platform {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `LegacyRow` is never constructed
[INFO] [stdout]    --> src/db/migrate.rs:284:12
[INFO] [stdout]     |
[INFO] [stdout] 284 | pub struct LegacyRow {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/db/migrate.rs:290:12
[INFO] [stdout]     |
[INFO] [stdout] 288 | impl LegacyRow {
[INFO] [stdout]     | -------------- associated items in this implementation
[INFO] [stdout] 289 |     /// 构造空行。
[INFO] [stdout] 290 |     pub fn new() -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 297 |     pub fn insert(&mut self, column: impl Into<String>, value: Option<String>) {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 302 |     pub fn get(&self, column: &str) -> Option<&str> {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 307 |     pub fn contains(&self, column: &str) -> bool {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 312 |     pub fn len(&self) -> usize {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 317 |     pub fn is_empty(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 322 |     pub fn column_names(&self) -> impl Iterator<Item = &str> {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 331 |     pub fn from_mysql_row(row: &MySqlRow) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `cell_to_string` is never used
[INFO] [stdout]    --> src/db/migrate.rs:347:4
[INFO] [stdout]     |
[INFO] [stdout] 347 | fn cell_to_string(row: &MySqlRow, idx: usize) -> Option<String> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `LegacyBatch` is never constructed
[INFO] [stdout]    --> src/db/migrate.rs:377:12
[INFO] [stdout]     |
[INFO] [stdout] 377 | pub struct LegacyBatch {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `len` and `is_empty` are never used
[INFO] [stdout]    --> src/db/migrate.rs:385:12
[INFO] [stdout]     |
[INFO] [stdout] 383 | impl LegacyBatch {
[INFO] [stdout]     | ---------------- methods in this implementation
[INFO] [stdout] 384 |     /// 本批行数。
[INFO] [stdout] 385 |     pub fn len(&self) -> usize {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 390 |     pub fn is_empty(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `LegacyExtractor` is never constructed
[INFO] [stdout]    --> src/db/migrate.rs:415:12
[INFO] [stdout]     |
[INFO] [stdout] 415 | pub struct LegacyExtractor {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `source`, `count`, `extract`, `extract_platform`, and `extract_archive` are never used
[INFO] [stdout]    --> src/db/migrate.rs:425:12
[INFO] [stdout]     |
[INFO] [stdout] 420 | impl LegacyExtractor {
[INFO] [stdout]     | -------------------- associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 425 |     pub fn new(source: sqlx::MySqlPool) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 430 |     pub fn source(&self) -> &sqlx::MySqlPool {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 437 |     pub async fn count(&self, src: LegacySource) -> Result<i64, AppError> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 452 |     pub async fn extract(
[INFO] [stdout]     |                  ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 485 |     pub async fn extract_platform(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 496 |     pub async fn extract_archive(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ParsedLog` is never constructed
[INFO] [stdout]    --> src/db/migrate.rs:686:12
[INFO] [stdout]     |
[INFO] [stdout] 686 | pub struct ParsedLog {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `NormalizedRecord` is never constructed
[INFO] [stdout]    --> src/db/migrate.rs:699:12
[INFO] [stdout]     |
[INFO] [stdout] 699 | pub struct NormalizedRecord {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `legacy_row_to_raw` is never used
[INFO] [stdout]    --> src/db/migrate.rs:725:8
[INFO] [stdout]     |
[INFO] [stdout] 725 | pub fn legacy_row_to_raw(row: &LegacyRow) -> RawRecord {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_beizhu_log` is never used
[INFO] [stdout]    --> src/db/migrate.rs:745:8
[INFO] [stdout]     |
[INFO] [stdout] 745 | pub fn parse_beizhu_log(raw: &str) -> (Vec<ParsedLog>, Vec<String>) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_log_entry` is never used
[INFO] [stdout]    --> src/db/migrate.rs:762:4
[INFO] [stdout]     |
[INFO] [stdout] 762 | fn parse_log_entry(entry: &str) -> Option<ParsedLog> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_legacy_dt` is never used
[INFO] [stdout]    --> src/db/migrate.rs:783:4
[INFO] [stdout]     |
[INFO] [stdout] 783 | fn parse_legacy_dt(s: &str) -> Option<NaiveDateTime> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_i32` is never used
[INFO] [stdout]    --> src/db/migrate.rs:799:4
[INFO] [stdout]     |
[INFO] [stdout] 799 | fn parse_i32(s: &str) -> i32 {
[INFO] [stdout]     |    ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `raw_get` is never used
[INFO] [stdout]    --> src/db/migrate.rs:804:4
[INFO] [stdout]     |
[INFO] [stdout] 804 | fn raw_get<'a>(raw: &'a RawRecord, key: &str) -> &'a str {
[INFO] [stdout]     |    ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `non_empty_opt` is never used
[INFO] [stdout]    --> src/db/migrate.rs:809:4
[INFO] [stdout]     |
[INFO] [stdout] 809 | fn non_empty_opt(s: &str) -> Option<String> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_row` is never used
[INFO] [stdout]    --> src/db/migrate.rs:828:8
[INFO] [stdout]     |
[INFO] [stdout] 828 | pub fn normalize_row(platform: Platform, row: &LegacyRow) -> NormalizedRecord {
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MIGRATION_OPERATOR` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1262:11
[INFO] [stdout]      |
[INFO] [stdout] 1262 | pub const MIGRATION_OPERATOR: &str = "迁移";
[INFO] [stdout]      |           ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SOURCE_BACKFILL_ACTION` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1265:11
[INFO] [stdout]      |
[INFO] [stdout] 1265 | pub const SOURCE_BACKFILL_ACTION: &str = "货源回填";
[INFO] [stdout]      |           ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MigrationAuditLog` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1274:12
[INFO] [stdout]      |
[INFO] [stdout] 1274 | pub struct MigrationAuditLog {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `source_backfill` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1291:12
[INFO] [stdout]      |
[INFO] [stdout] 1287 | impl MigrationAuditLog {
[INFO] [stdout]      | ---------------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 1291 |     pub fn source_backfill(old_beizhu: &str, resolved: SourceType) -> Self {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SourceBackfill` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1309:12
[INFO] [stdout]      |
[INFO] [stdout] 1309 | pub struct SourceBackfill {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `strip_source_semantics` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1327:8
[INFO] [stdout]      |
[INFO] [stdout] 1327 | pub fn strip_source_semantics(beizhu: &str) -> (String, bool) {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `backfill_source` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1353:8
[INFO] [stdout]      |
[INFO] [stdout] 1353 | pub fn backfill_source(
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `write_source_backfill_log` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1387:14
[INFO] [stdout]      |
[INFO] [stdout] 1387 | pub async fn write_source_backfill_log(
[INFO] [stdout]      |              ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MIGRATION_BATCH_SIZE` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1669:11
[INFO] [stdout]      |
[INFO] [stdout] 1669 | pub const MIGRATION_BATCH_SIZE: usize = 500;
[INFO] [stdout]      |           ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DEFAULT_FAILURE_SAMPLE_LIMIT` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1672:11
[INFO] [stdout]      |
[INFO] [stdout] 1672 | pub const DEFAULT_FAILURE_SAMPLE_LIMIT: usize = 20;
[INFO] [stdout]      |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SourceRatioRange` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1676:12
[INFO] [stdout]      |
[INFO] [stdout] 1676 | pub struct SourceRatioRange {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `any`, and `contains` are never used
[INFO] [stdout]     --> src/db/migrate.rs:1682:18
[INFO] [stdout]      |
[INFO] [stdout] 1681 | impl SourceRatioRange {
[INFO] [stdout]      | --------------------- associated items in this implementation
[INFO] [stdout] 1682 |     pub const fn new(min_basis_points: u16, max_basis_points: u16) -> Self {
[INFO] [stdout]      |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout] 1689 |     pub const fn any() -> Self {
[INFO] [stdout]      |                  ^^^
[INFO] [stdout] ...
[INFO] [stdout] 1693 |     fn contains(&self, basis_points: u16) -> bool {
[INFO] [stdout]      |        ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SourceDistributionPolicy` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1703:12
[INFO] [stdout]      |
[INFO] [stdout] 1703 | pub struct SourceDistributionPolicy {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `allow_any` and `range_for` are never used
[INFO] [stdout]     --> src/db/migrate.rs:1710:18
[INFO] [stdout]      |
[INFO] [stdout] 1709 | impl SourceDistributionPolicy {
[INFO] [stdout]      | ----------------------------- associated items in this implementation
[INFO] [stdout] 1710 |     pub const fn allow_any() -> Self {
[INFO] [stdout]      |                  ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1718 |     fn range_for(&self, source_type: SourceType) -> SourceRatioRange {
[INFO] [stdout]      |        ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `MigrationAmountField` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1729:10
[INFO] [stdout]      |
[INFO] [stdout] 1729 | pub enum MigrationAmountField {
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `DEFAULT`, `label`, `legacy_column`, and `normalized_value` are never used
[INFO] [stdout]     --> src/db/migrate.rs:1739:15
[INFO] [stdout]      |
[INFO] [stdout] 1738 | impl MigrationAmountField {
[INFO] [stdout]      | ------------------------- associated items in this implementation
[INFO] [stdout] 1739 |     pub const DEFAULT: [MigrationAmountField; 6] = [
[INFO] [stdout]      |               ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1748 |     fn label(&self) -> &'static str {
[INFO] [stdout]      |        ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1759 |     fn legacy_column(&self) -> &'static str {
[INFO] [stdout]      |        ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1770 |     fn normalized_value<'a>(&self, record: &'a NormalizedRecord) -> &'a str {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MigrationBatchValidationConfig` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1792:12
[INFO] [stdout]      |
[INFO] [stdout] 1792 | pub struct MigrationBatchValidationConfig {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MigrationBatchContext` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1812:12
[INFO] [stdout]      |
[INFO] [stdout] 1812 | pub struct MigrationBatchContext {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `from_batch` and `batch_id` are never used
[INFO] [stdout]     --> src/db/migrate.rs:1818:12
[INFO] [stdout]      |
[INFO] [stdout] 1817 | impl MigrationBatchContext {
[INFO] [stdout]      | -------------------------- associated items in this implementation
[INFO] [stdout] 1818 |     pub fn from_batch(batch: &LegacyBatch) -> Self {
[INFO] [stdout]      |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1825 |     pub fn batch_id(&self) -> String {
[INFO] [stdout]      |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `MigrationValidationKind` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1832:10
[INFO] [stdout]      |
[INFO] [stdout] 1832 | pub enum MigrationValidationKind {
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `as_str` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1841:12
[INFO] [stdout]      |
[INFO] [stdout] 1840 | impl MigrationValidationKind {
[INFO] [stdout]      | ---------------------------- method in this implementation
[INFO] [stdout] 1841 |     pub fn as_str(&self) -> &'static str {
[INFO] [stdout]      |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MigrationFailureSample` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1854:12
[INFO] [stdout]      |
[INFO] [stdout] 1854 | pub struct MigrationFailureSample {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MigrationBatchFailure` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1868:12
[INFO] [stdout]      |
[INFO] [stdout] 1868 | pub struct MigrationBatchFailure {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `is_empty`, `push`, and `mark_rolled_back` are never used
[INFO] [stdout]     --> src/db/migrate.rs:1876:12
[INFO] [stdout]      |
[INFO] [stdout] 1875 | impl MigrationBatchFailure {
[INFO] [stdout]      | -------------------------- associated items in this implementation
[INFO] [stdout] 1876 |     pub fn new(batch_id: impl Into<String>) -> Self {
[INFO] [stdout]      |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 1885 |     pub fn is_empty(&self) -> bool {
[INFO] [stdout]      |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1889 |     fn push(&mut self, sample: MigrationFailureSample, limit: usize) {
[INFO] [stdout]      |        ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1896 |     fn mark_rolled_back(mut self) -> Self {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SourceDistributionCount` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1904:12
[INFO] [stdout]      |
[INFO] [stdout] 1904 | pub struct SourceDistributionCount {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `total` and `count` are never used
[INFO] [stdout]     --> src/db/migrate.rs:1911:12
[INFO] [stdout]      |
[INFO] [stdout] 1910 | impl SourceDistributionCount {
[INFO] [stdout]      | ---------------------------- methods in this implementation
[INFO] [stdout] 1911 |     pub fn total(&self) -> usize {
[INFO] [stdout]      |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 1915 |     pub fn count(&self, source_type: SourceType) -> usize {
[INFO] [stdout]      |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MigrationBatchValidationSummary` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1926:12
[INFO] [stdout]      |
[INFO] [stdout] 1926 | pub struct MigrationBatchValidationSummary {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MigrationForeignKeyRef` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1935:12
[INFO] [stdout]      |
[INFO] [stdout] 1935 | pub struct MigrationForeignKeyRef {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MigrationForeignKeySnapshot` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1944:12
[INFO] [stdout]      |
[INFO] [stdout] 1944 | pub struct MigrationForeignKeySnapshot {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `LoadedMigrationRecord` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1952:12
[INFO] [stdout]      |
[INFO] [stdout] 1952 | pub struct LoadedMigrationRecord {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `from_loaded_records` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1960:12
[INFO] [stdout]      |
[INFO] [stdout] 1959 | impl MigrationForeignKeySnapshot {
[INFO] [stdout]      | -------------------------------- associated function in this implementation
[INFO] [stdout] 1960 |     pub fn from_loaded_records(records: &[LoadedMigrationRecord]) -> Self {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MigrationBatchSuccess` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1973:12
[INFO] [stdout]      |
[INFO] [stdout] 1973 | pub struct MigrationBatchSuccess {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `MigrationBatchRunError` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1990:10
[INFO] [stdout]      |
[INFO] [stdout] 1990 | pub enum MigrationBatchRunError {
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_legacy_batch` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2000:8
[INFO] [stdout]      |
[INFO] [stdout] 2000 | pub fn normalize_legacy_batch(batch: &LegacyBatch) -> Vec<NormalizedRecord> {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_migration_batch` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2010:8
[INFO] [stdout]      |
[INFO] [stdout] 2010 | pub fn validate_migration_batch(
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `migrate_legacy_batch` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2105:14
[INFO] [stdout]      |
[INFO] [stdout] 2105 | pub async fn migrate_legacy_batch(
[INFO] [stdout]      |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `LoadedBatch` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:2183:8
[INFO] [stdout]      |
[INFO] [stdout] 2183 | struct LoadedBatch {
[INFO] [stdout]      |        ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_normalized_records_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2191:10
[INFO] [stdout]      |
[INFO] [stdout] 2191 | async fn insert_normalized_records_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_order_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2291:10
[INFO] [stdout]      |
[INFO] [stdout] 2291 | async fn insert_order_tx(tx: &mut Transaction<'_, MySql>, order: &Order) -> Result<i64, AppError> {
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_order_item_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2328:10
[INFO] [stdout]      |
[INFO] [stdout] 2328 | async fn insert_order_item_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_purchase_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2361:10
[INFO] [stdout]      |
[INFO] [stdout] 2361 | async fn insert_purchase_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_domestic_shipment_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2388:10
[INFO] [stdout]      |
[INFO] [stdout] 2388 | async fn insert_domestic_shipment_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_intl_shipment_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2412:10
[INFO] [stdout]      |
[INFO] [stdout] 2412 | async fn insert_intl_shipment_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_parsed_log_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2437:10
[INFO] [stdout]      |
[INFO] [stdout] 2437 | async fn insert_parsed_log_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_legacy_log_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2461:10
[INFO] [stdout]      |
[INFO] [stdout] 2461 | async fn insert_legacy_log_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `write_source_backfill_log_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2483:10
[INFO] [stdout]      |
[INFO] [stdout] 2483 | async fn write_source_backfill_log_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_amounts` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2508:4
[INFO] [stdout]      |
[INFO] [stdout] 2508 | fn validate_amounts(
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_required_fields` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2588:4
[INFO] [stdout]      |
[INFO] [stdout] 2588 | fn validate_required_fields(
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_source_distribution` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2638:4
[INFO] [stdout]      |
[INFO] [stdout] 2638 | fn validate_source_distribution(
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `validate_foreign_keys` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2679:4
[INFO] [stdout]      |
[INFO] [stdout] 2679 | fn validate_foreign_keys(
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `source_distribution` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2795:4
[INFO] [stdout]      |
[INFO] [stdout] 2795 | fn source_distribution(records: &[NormalizedRecord]) -> SourceDistributionCount {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `make_failure_sample` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2807:4
[INFO] [stdout]      |
[INFO] [stdout] 2807 | fn make_failure_sample(
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_decimal_minor_units` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2836:4
[INFO] [stdout]      |
[INFO] [stdout] 2836 | fn parse_decimal_minor_units(raw: &str, scale: u32) -> Result<i128, String> {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `format_minor_units` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2894:4
[INFO] [stdout]      |
[INFO] [stdout] 2894 | fn format_minor_units(value: i128, scale: u32) -> String {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `format_basis_points` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2903:4
[INFO] [stdout]      |
[INFO] [stdout] 2903 | fn format_basis_points(value: u16) -> String {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `master` is never used
[INFO] [stdout]    --> src/db/pool.rs:178:12
[INFO] [stdout]     |
[INFO] [stdout] 166 | impl TenantPoolManager {
[INFO] [stdout]     | ---------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 178 |     pub fn master(&self) -> &MySqlPool {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variant `MigrationBatchFailed` is never constructed
[INFO] [stdout]   --> src/error.rs:65:5
[INFO] [stdout]    |
[INFO] [stdout] 25 | pub enum AppError {
[INFO] [stdout]    |          -------- variant in this enum
[INFO] [stdout] ...
[INFO] [stdout] 65 |     MigrationBatchFailed { batch_id: String },
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `AppError` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AnnouncementActionResponse` is never constructed
[INFO] [stdout]   --> src/handlers/admin/announcements.rs:44:12
[INFO] [stdout]    |
[INFO] [stdout] 44 | pub struct AnnouncementActionResponse {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TenantActionResponse` is never constructed
[INFO] [stdout]    --> src/handlers/admin/tenants.rs:100:12
[INFO] [stdout]     |
[INFO] [stdout] 100 | pub struct TenantActionResponse {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ProductInfo` is never constructed
[INFO] [stdout]   --> src/integrations/traits.rs:49:12
[INFO] [stdout]    |
[INFO] [stdout] 49 | pub struct ProductInfo {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `fetch_product` is never used
[INFO] [stdout]   --> src/integrations/traits.rs:70:14
[INFO] [stdout]    |
[INFO] [stdout] 65 | pub trait PurchaseProvider: Send + Sync {
[INFO] [stdout]    |           ---------------- method in this trait
[INFO] [stdout] ...
[INFO] [stdout] 70 |     async fn fetch_product(&self, item_id: &str) -> Result<ProductInfo, AppError>;
[INFO] [stdout]    |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TokenSet` is never constructed
[INFO] [stdout]   --> src/integrations/traits.rs:79:12
[INFO] [stdout]    |
[INFO] [stdout] 79 | pub struct TokenSet {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: trait `PlatformOAuth` is never used
[INFO] [stdout]   --> src/integrations/traits.rs:94:11
[INFO] [stdout]    |
[INFO] [stdout] 94 | pub trait PlatformOAuth: Send + Sync {
[INFO] [stdout]    |           ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: trait `ImapTransport` is never used
[INFO] [stdout]   --> src/integrations/mail.rs:32:11
[INFO] [stdout]    |
[INFO] [stdout] 32 | pub trait ImapTransport: Send + Sync {
[INFO] [stdout]    |           ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: trait `SmtpTransport` is never used
[INFO] [stdout]   --> src/integrations/mail.rs:58:11
[INFO] [stdout]    |
[INFO] [stdout] 58 | pub trait SmtpTransport: Send + Sync {
[INFO] [stdout]    |           ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `StoredMessage` is never constructed
[INFO] [stdout]   --> src/integrations/mail.rs:65:12
[INFO] [stdout]    |
[INFO] [stdout] 65 | pub struct StoredMessage {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: trait `MailStore` is never used
[INFO] [stdout]   --> src/integrations/mail.rs:84:11
[INFO] [stdout]    |
[INFO] [stdout] 84 | pub trait MailStore: Send + Sync {
[INFO] [stdout]    |           ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MailGatewayImpl` is never constructed
[INFO] [stdout]   --> src/integrations/mail.rs:97:12
[INFO] [stdout]    |
[INFO] [stdout] 97 | pub struct MailGatewayImpl<I, S, D>
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `new` is never used
[INFO] [stdout]    --> src/integrations/mail.rs:115:12
[INFO] [stdout]     |
[INFO] [stdout] 108 | / impl<I, S, D> MailGatewayImpl<I, S, D>
[INFO] [stdout] 109 | | where
[INFO] [stdout] 110 | |     I: ImapTransport,
[INFO] [stdout] 111 | |     S: SmtpTransport,
[INFO] [stdout] 112 | |     D: MailStore,
[INFO] [stdout]     | |_________________- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 115 |       pub fn new(imap: I, smtp: S, store: D) -> Self {
[INFO] [stdout]     |              ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `cap_to_recent` is never used
[INFO] [stdout]    --> src/integrations/mail.rs:121:4
[INFO] [stdout]     |
[INFO] [stdout] 121 | fn cap_to_recent(mut uids: Vec<u32>, limit: u32) -> Vec<u32> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `build_raw_reply` is never used
[INFO] [stdout]    --> src/integrations/mail.rs:132:4
[INFO] [stdout]     |
[INFO] [stdout] 132 | fn build_raw_reply(account: &MailAccount, to: &str, body: &str, message_id: &str) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RAKUTEN_AUTH_ENDPOINT` is never used
[INFO] [stdout]   --> src/integrations/oauth_rakuten.rs:31:11
[INFO] [stdout]    |
[INFO] [stdout] 31 | pub const RAKUTEN_AUTH_ENDPOINT: &str = "https://api.rms.rakuten.co.jp/engine/auth/request";
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RAKUTEN_TOKEN_ENDPOINT` is never used
[INFO] [stdout]   --> src/integrations/oauth_rakuten.rs:33:11
[INFO] [stdout]    |
[INFO] [stdout] 33 | pub const RAKUTEN_TOKEN_ENDPOINT: &str = "https://api.rms.rakuten.co.jp/engine/auth/token";
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `esa_auth_header` is never used
[INFO] [stdout]   --> src/integrations/oauth_rakuten.rs:38:8
[INFO] [stdout]    |
[INFO] [stdout] 38 | pub fn esa_auth_header(client_id: &str, client_secret: &str) -> (String, String) {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RakutenOAuth` is never constructed
[INFO] [stdout]   --> src/integrations/oauth_rakuten.rs:50:12
[INFO] [stdout]    |
[INFO] [stdout] 50 | pub struct RakutenOAuth {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `with_endpoints`, `with_scope`, and `token_headers` are never used
[INFO] [stdout]   --> src/integrations/oauth_rakuten.rs:62:12
[INFO] [stdout]    |
[INFO] [stdout] 60 | impl RakutenOAuth {
[INFO] [stdout]    | ----------------- associated items in this implementation
[INFO] [stdout] 61 |     /// 用应用凭证 + 注入的令牌 HTTP 构造，端点取乐天默认值。
[INFO] [stdout] 62 |     pub fn new(
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 80 |     pub fn with_endpoints(
[INFO] [stdout]    |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 91 |     pub fn with_scope(mut self, scope: impl Into<String>) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 96 |     fn token_headers(&self) -> Vec<(String, String)> {
[INFO] [stdout]    |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `WOWMA_AUTH_ENDPOINT` is never used
[INFO] [stdout]   --> src/integrations/oauth_wowma.rs:27:11
[INFO] [stdout]    |
[INFO] [stdout] 27 | pub const WOWMA_AUTH_ENDPOINT: &str = "https://api.manager.wowma.jp/wmshopapi/oauth/authorize";
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `WOWMA_TOKEN_ENDPOINT` is never used
[INFO] [stdout]   --> src/integrations/oauth_wowma.rs:29:11
[INFO] [stdout]    |
[INFO] [stdout] 29 | pub const WOWMA_TOKEN_ENDPOINT: &str = "https://api.manager.wowma.jp/wmshopapi/oauth/token";
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `WowmaOAuth` is never constructed
[INFO] [stdout]   --> src/integrations/oauth_wowma.rs:34:12
[INFO] [stdout]    |
[INFO] [stdout] 34 | pub struct WowmaOAuth {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `with_endpoints`, `with_scope`, and `token_headers` are never used
[INFO] [stdout]   --> src/integrations/oauth_wowma.rs:46:12
[INFO] [stdout]    |
[INFO] [stdout] 44 | impl WowmaOAuth {
[INFO] [stdout]    | --------------- associated items in this implementation
[INFO] [stdout] 45 |     /// 用应用凭证 + 注入的令牌 HTTP 构造，端点取 Wowma 默认值。
[INFO] [stdout] 46 |     pub fn new(
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 64 |     pub fn with_endpoints(
[INFO] [stdout]    |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 75 |     pub fn with_scope(mut self, scope: impl Into<String>) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 80 |     fn token_headers(&self) -> Vec<(String, String)> {
[INFO] [stdout]    |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `YAHOO_AUTH_ENDPOINT` is never used
[INFO] [stdout]   --> src/integrations/oauth_yahoo.rs:28:11
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub const YAHOO_AUTH_ENDPOINT: &str = "https://auth.login.yahoo.co.jp/yconnect/v2/authorization";
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `YAHOO_TOKEN_ENDPOINT` is never used
[INFO] [stdout]   --> src/integrations/oauth_yahoo.rs:30:11
[INFO] [stdout]    |
[INFO] [stdout] 30 | pub const YAHOO_TOKEN_ENDPOINT: &str = "https://auth.login.yahoo.co.jp/yconnect/v2/token";
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `YAHOO_DEFAULT_SCOPE` is never used
[INFO] [stdout]   --> src/integrations/oauth_yahoo.rs:32:11
[INFO] [stdout]    |
[INFO] [stdout] 32 | pub const YAHOO_DEFAULT_SCOPE: &str = "openid";
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: trait `TokenHttp` is never used
[INFO] [stdout]   --> src/integrations/oauth_yahoo.rs:47:11
[INFO] [stdout]    |
[INFO] [stdout] 47 | pub trait TokenHttp: Send + Sync {
[INFO] [stdout]    |           ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `form_urlencode` is never used
[INFO] [stdout]   --> src/integrations/oauth_yahoo.rs:65:8
[INFO] [stdout]    |
[INFO] [stdout] 65 | pub fn form_urlencode(value: &str) -> String {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `base64_encode` is never used
[INFO] [stdout]   --> src/integrations/oauth_yahoo.rs:86:8
[INFO] [stdout]    |
[INFO] [stdout] 86 | pub fn base64_encode(input: &[u8]) -> String {
[INFO] [stdout]    |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `basic_auth_header` is never used
[INFO] [stdout]    --> src/integrations/oauth_yahoo.rs:111:8
[INFO] [stdout]     |
[INFO] [stdout] 111 | pub fn basic_auth_header(client_id: &str, client_secret: &str) -> (String, String) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_token_json` is never used
[INFO] [stdout]    --> src/integrations/oauth_yahoo.rs:126:8
[INFO] [stdout]     |
[INFO] [stdout] 126 | pub fn parse_token_json(provider: &str, raw: &str) -> Result<TokenSet, AppError> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `YahooOAuth` is never constructed
[INFO] [stdout]    --> src/integrations/oauth_yahoo.rs:175:12
[INFO] [stdout]     |
[INFO] [stdout] 175 | pub struct YahooOAuth {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `with_endpoints`, and `with_scope` are never used
[INFO] [stdout]    --> src/integrations/oauth_yahoo.rs:187:12
[INFO] [stdout]     |
[INFO] [stdout] 185 | impl YahooOAuth {
[INFO] [stdout]     | --------------- associated items in this implementation
[INFO] [stdout] 186 |     /// 用应用凭证 + 注入的令牌 HTTP 构造，端点取 Yahoo 默认值。
[INFO] [stdout] 187 |     pub fn new(
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 205 |     pub fn with_endpoints(
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 216 |     pub fn with_scope(mut self, scope: impl Into<String>) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PROVIDER_NAME` is never used
[INFO] [stdout]   --> src/integrations/purchase_1688.rs:34:11
[INFO] [stdout]    |
[INFO] [stdout] 34 | pub const PROVIDER_NAME: &str = "1688";
[INFO] [stdout]    |           ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DEFAULT_MAX_ATTEMPTS` is never used
[INFO] [stdout]   --> src/integrations/purchase_1688.rs:38:11
[INFO] [stdout]    |
[INFO] [stdout] 38 | pub const DEFAULT_MAX_ATTEMPTS: usize = 3;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SIGNED_KEYWORDS` is never used
[INFO] [stdout]   --> src/integrations/purchase_1688.rs:42:7
[INFO] [stdout]    |
[INFO] [stdout] 42 | const SIGNED_KEYWORDS: &[&str] = &[
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `STATUS_SIGNED` is never used
[INFO] [stdout]   --> src/integrations/purchase_1688.rs:56:7
[INFO] [stdout]    |
[INFO] [stdout] 56 | const STATUS_SIGNED: &str = "已签收";
[INFO] [stdout]    |       ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `STATUS_IN_TRANSIT` is never used
[INFO] [stdout]   --> src/integrations/purchase_1688.rs:58:7
[INFO] [stdout]    |
[INFO] [stdout] 58 | const STATUS_IN_TRANSIT: &str = "运输中";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Credential` is never constructed
[INFO] [stdout]   --> src/integrations/purchase_1688.rs:70:12
[INFO] [stdout]    |
[INFO] [stdout] 70 | pub struct Credential {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated functions `new`, `parse`, and `parse_many` are never used
[INFO] [stdout]    --> src/integrations/purchase_1688.rs:83:12
[INFO] [stdout]     |
[INFO] [stdout]  81 | impl Credential {
[INFO] [stdout]     | --------------- associated functions in this implementation
[INFO] [stdout]  82 |     /// 显式构造一组凭证。
[INFO] [stdout]  83 |     pub fn new(
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 102 |     pub fn parse(line: &str) -> Result<Self, AppError> {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 130 |     pub fn parse_many(text: &str) -> Result<Vec<Credential>, AppError> {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RawLogistics` is never constructed
[INFO] [stdout]    --> src/integrations/purchase_1688.rs:145:12
[INFO] [stdout]     |
[INFO] [stdout] 145 | pub struct RawLogistics {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: trait `Logistics1688Api` is never used
[INFO] [stdout]    --> src/integrations/purchase_1688.rs:160:11
[INFO] [stdout]     |
[INFO] [stdout] 160 | pub trait Logistics1688Api: Send + Sync {
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `determine_signed_status` is never used
[INFO] [stdout]    --> src/integrations/purchase_1688.rs:181:8
[INFO] [stdout]     |
[INFO] [stdout] 181 | pub fn determine_signed_status(raw_status: &str, steps: &[LogisticsStep]) -> (String, bool) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Purchase1688` is never constructed
[INFO] [stdout]    --> src/integrations/purchase_1688.rs:205:12
[INFO] [stdout]     |
[INFO] [stdout] 205 | pub struct Purchase1688<T: Logistics1688Api> {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `with_max_attempts`, `current_index`, and `advance` are never used
[INFO] [stdout]    --> src/integrations/purchase_1688.rs:217:12
[INFO] [stdout]     |
[INFO] [stdout] 213 | impl<T: Logistics1688Api> Purchase1688<T> {
[INFO] [stdout]     | ----------------------------------------- associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 217 |     pub fn new(credentials: Vec<Credential>, transport: T) -> Result<Self, AppError> {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 222 |     pub fn with_max_attempts(
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 239 |     fn current_index(&self) -> usize {
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 244 |     fn advance(&self) {
[INFO] [stdout]     |        ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SEARCH_ORDER_ENDPOINT` is never used
[INFO] [stdout]   --> src/integrations/rakuten_rms.rs:20:11
[INFO] [stdout]    |
[INFO] [stdout] 20 | pub const SEARCH_ORDER_ENDPOINT: &str = "https://api.rms.rakuten.co.jp/es/2.0/order/searchOrder/";
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GET_ORDER_ENDPOINT` is never used
[INFO] [stdout]   --> src/integrations/rakuten_rms.rs:21:11
[INFO] [stdout]    |
[INFO] [stdout] 21 | pub const GET_ORDER_ENDPOINT: &str = "https://api.rms.rakuten.co.jp/es/2.0/order/getOrder/";
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `payload` is never used
[INFO] [stdout]   --> src/integrations/rakuten_rms.rs:77:12
[INFO] [stdout]    |
[INFO] [stdout] 76 | impl RakutenSearchOrderRequest {
[INFO] [stdout]    | ------------------------------ method in this implementation
[INFO] [stdout] 77 |     pub fn payload(&self) -> JsonValue {
[INFO] [stdout]    |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `payload` is never used
[INFO] [stdout]    --> src/integrations/rakuten_rms.rs:108:12
[INFO] [stdout]     |
[INFO] [stdout] 100 | impl RakutenGetOrderRequest {
[INFO] [stdout]     | --------------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 108 |     pub fn payload(&self) -> JsonValue {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `from_json` is never used
[INFO] [stdout]    --> src/integrations/rakuten_rms.rs:123:12
[INFO] [stdout]     |
[INFO] [stdout] 122 | impl RakutenSearchOrderResponse {
[INFO] [stdout]     | ------------------------------- associated function in this implementation
[INFO] [stdout] 123 |     pub fn from_json(value: &JsonValue) -> Result<Self, AppError> {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `from_json` is never used
[INFO] [stdout]    --> src/integrations/rakuten_rms.rs:154:12
[INFO] [stdout]     |
[INFO] [stdout] 153 | impl RakutenGetOrderResponse {
[INFO] [stdout]     | ---------------------------- associated function in this implementation
[INFO] [stdout] 154 |     pub fn from_json(value: &JsonValue) -> Result<Self, AppError> {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `esa_authorization_header` is never used
[INFO] [stdout]    --> src/integrations/rakuten_rms.rs:218:8
[INFO] [stdout]     |
[INFO] [stdout] 218 | pub fn esa_authorization_header(credentials: &RakutenRmsCredentials) -> (String, String) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `json_text_opt` is never used
[INFO] [stdout]    --> src/integrations/rakuten_rms.rs:404:4
[INFO] [stdout]     |
[INFO] [stdout] 404 | fn json_text_opt(value: &JsonValue) -> Option<String> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `json_usize` is never used
[INFO] [stdout]    --> src/integrations/rakuten_rms.rs:422:4
[INFO] [stdout]     |
[INFO] [stdout] 422 | fn json_usize(value: &JsonValue) -> Option<usize> {
[INFO] [stdout]     |    ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DEFAULT_PREFIX_MAP` is never used
[INFO] [stdout]   --> src/integrations/ship_jp.rs:27:7
[INFO] [stdout]    |
[INFO] [stdout] 27 | const DEFAULT_PREFIX_MAP: &[(&str, Carrier)] = &[
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RawTrack` is never constructed
[INFO] [stdout]   --> src/integrations/ship_jp.rs:90:12
[INFO] [stdout]    |
[INFO] [stdout] 90 | pub struct RawTrack {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: trait `CarrierQuery` is never used
[INFO] [stdout]    --> src/integrations/ship_jp.rs:102:11
[INFO] [stdout]     |
[INFO] [stdout] 102 | pub trait CarrierQuery: Send + Sync {
[INFO] [stdout]     |           ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `JpCarrierTracker` is never constructed
[INFO] [stdout]    --> src/integrations/ship_jp.rs:111:12
[INFO] [stdout]     |
[INFO] [stdout] 111 | pub struct JpCarrierTracker<Q: CarrierQuery> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated functions `new` and `with_prefix_map` are never used
[INFO] [stdout]    --> src/integrations/ship_jp.rs:120:12
[INFO] [stdout]     |
[INFO] [stdout] 118 | impl<Q: CarrierQuery> JpCarrierTracker<Q> {
[INFO] [stdout]     | ----------------------------------------- associated functions in this implementation
[INFO] [stdout] 119 |     /// 使用内置默认前缀映射（取自 old `setting.ini`）构造。
[INFO] [stdout] 120 |     pub fn new(query: Q) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 131 |     pub fn with_prefix_map(query: Q, mut prefix_map: Vec<(String, Carrier)>) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `strip_whitespace` is never used
[INFO] [stdout]    --> src/integrations/ship_jp.rs:138:4
[INFO] [stdout]     |
[INFO] [stdout] 138 | fn strip_whitespace(s: &str) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_completed` is never used
[INFO] [stdout]    --> src/integrations/ship_jp.rs:145:4
[INFO] [stdout]     |
[INFO] [stdout] 145 | fn is_completed(status: &str) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_status` is never used
[INFO] [stdout]    --> src/integrations/ship_jp.rs:155:4
[INFO] [stdout]     |
[INFO] [stdout] 155 | fn normalize_status(raw: &str) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `preview`, `with_keep_months`, and `with_root` are never used
[INFO] [stdout]    --> src/jobs/cleanup_old_images.rs:194:12
[INFO] [stdout]     |
[INFO] [stdout] 182 | impl CleanupOldImagesJob {
[INFO] [stdout]     | ------------------------ associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 194 |     pub fn preview(store: std::sync::Arc<dyn DirStore>) -> Self {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 202 |     pub fn with_keep_months(mut self, keep_months: u32) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 208 |     pub fn with_root(mut self, root: impl Into<String>) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `with_retention_days` is never used
[INFO] [stdout]   --> src/jobs/daily_maintain.rs:99:12
[INFO] [stdout]    |
[INFO] [stdout] 89 | impl DailyMaintainJob {
[INFO] [stdout]    | --------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 99 |     pub fn with_retention_days(mut self, retention_days: i64) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `batch_count` is never used
[INFO] [stdout]   --> src/jobs/order_archive.rs:54:8
[INFO] [stdout]    |
[INFO] [stdout] 54 | pub fn batch_count(total: i64, batch_size: i64) -> i64 {
[INFO] [stdout]    |        ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `item_code_field_for` is never used
[INFO] [stdout]   --> src/jobs/order_monitor.rs:55:8
[INFO] [stdout]    |
[INFO] [stdout] 55 | pub fn item_code_field_for(platform: Platform) -> &'static str {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_valid_caigou_link` is never used
[INFO] [stdout]    --> src/jobs/order_monitor.rs:112:8
[INFO] [stdout]     |
[INFO] [stdout] 112 | pub fn is_valid_caigou_link(raw: &str) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `InMemoryCursorStore` is never constructed
[INFO] [stdout]    --> src/jobs/order_monitor.rs:133:12
[INFO] [stdout]     |
[INFO] [stdout] 133 | pub struct InMemoryCursorStore {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `new` is never used
[INFO] [stdout]    --> src/jobs/order_monitor.rs:139:12
[INFO] [stdout]     |
[INFO] [stdout] 137 | impl InMemoryCursorStore {
[INFO] [stdout]     | ------------------------ associated function in this implementation
[INFO] [stdout] 138 |     /// 以初始游标值构造。
[INFO] [stdout] 139 |     pub fn new(initial: i64) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `path` is never used
[INFO] [stdout]    --> src/jobs/order_monitor.rs:171:12
[INFO] [stdout]     |
[INFO] [stdout] 164 | impl FileCursorStore {
[INFO] [stdout]     | -------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 171 |     pub fn path(&self) -> &Path {
[INFO] [stdout]     |            ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `NoopLock` is never constructed
[INFO] [stdout]    --> src/jobs/scheduler.rs:130:12
[INFO] [stdout]     |
[INFO] [stdout] 130 | pub struct NoopLock;
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `InMemoryLock` is never constructed
[INFO] [stdout]    --> src/jobs/scheduler.rs:145:12
[INFO] [stdout]     |
[INFO] [stdout] 145 | pub struct InMemoryLock {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `run_all_once` is never used
[INFO] [stdout]    --> src/jobs/scheduler.rs:376:18
[INFO] [stdout]     |
[INFO] [stdout] 352 | impl JobScheduler {
[INFO] [stdout]     | ----------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 376 |     pub async fn run_all_once(&self) -> Vec<JobOutcome> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `parse` is never used
[INFO] [stdout]    --> src/jobs/update_1688_logistics.rs:113:12
[INFO] [stdout]     |
[INFO] [stdout] 109 | impl Options {
[INFO] [stdout]     | ------------ associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 113 |     pub fn parse<I, S>(args: I) -> Result<Self, AppError>
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `total` is never used
[INFO] [stdout]    --> src/jobs/update_1688_logistics.rs:377:12
[INFO] [stdout]     |
[INFO] [stdout] 375 | impl BatchOutcome {
[INFO] [stdout]     | ----------------- method in this implementation
[INFO] [stdout] 376 |     /// 已尝试处理的总条数。
[INFO] [stdout] 377 |     pub fn total(&self) -> usize {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `with_options` is never used
[INFO] [stdout]    --> src/jobs/update_1688_logistics.rs:486:12
[INFO] [stdout]     |
[INFO] [stdout] 476 | impl<P: PurchaseProvider> Update1688LogisticsJob<P> {
[INFO] [stdout]     | --------------------------------------------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 486 |     pub fn with_options(provider: P, options: Options) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `first_write_only` is never used
[INFO] [stdout]    --> src/jobs/update_jpship_logistics.rs:222:8
[INFO] [stdout]     |
[INFO] [stdout] 222 | pub fn first_write_only(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `with_parts` is never used
[INFO] [stdout]    --> src/jobs/update_jpship_logistics.rs:310:12
[INFO] [stdout]     |
[INFO] [stdout] 298 | impl UpdateJpshipLogisticsJob {
[INFO] [stdout]     | ----------------------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 310 |     pub fn with_parts(
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `with_limits` is never used
[INFO] [stdout]    --> src/jobs/zhutu_downloader.rs:175:12
[INFO] [stdout]     |
[INFO] [stdout] 160 | impl ZhutuDownloaderJob {
[INFO] [stdout]     | ----------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 175 |     pub fn with_limits(mut self, day_limit: i64, count_limit: i64) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SOURCE_SEMANTICS` is never used
[INFO] [stdout]   --> src/models/order.rs:33:11
[INFO] [stdout]    |
[INFO] [stdout] 33 | pub const SOURCE_SEMANTICS: [&str; 2] = ["精品", "日本库存"];
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `ALL`, `display_name`, and `sort_order` are never used
[INFO] [stdout]   --> src/models/platform.rs:30:15
[INFO] [stdout]    |
[INFO] [stdout] 28 | impl Platform {
[INFO] [stdout]    | ------------- associated items in this implementation
[INFO] [stdout] 29 |     /// 所有平台，按侧栏排序（见设计 3.8 名称序：Yahoo购物/乐天/Wowma/Mercari/Qoo10/雅虎拍卖）。
[INFO] [stdout] 30 |     pub const ALL: [Platform; 6] = [
[INFO] [stdout]    |               ^^^
[INFO] [stdout] ...
[INFO] [stdout] 52 |     pub fn display_name(&self) -> &'static str {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 64 |     pub fn sort_order(&self) -> u8 {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Store` is never constructed
[INFO] [stdout]   --> src/models/store.rs:17:12
[INFO] [stdout]    |
[INFO] [stdout] 17 | pub struct Store {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `visible_stores` is never used
[INFO] [stdout]    --> src/models/user.rs:263:12
[INFO] [stdout]     |
[INFO] [stdout] 250 | impl Principal {
[INFO] [stdout]     | -------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 263 |     pub fn visible_stores(&self, all: &[Store], hidden: &HashSet<String>) -> Vec<Store> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `ensure_same_tenant` is never used
[INFO] [stdout]    --> src/models/user.rs:348:12
[INFO] [stdout]     |
[INFO] [stdout] 291 | impl Principal {
[INFO] [stdout]     | -------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 348 |     pub fn ensure_same_tenant(&self, row_tenant_id: TenantId) -> Result<(), AppError> {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `order_id`, `platform`, and `purchase_status` are never read
[INFO] [stdout]    --> src/repository/order_repo.rs:295:9
[INFO] [stdout]     |
[INFO] [stdout] 291 | pub struct PendingIntlItem {
[INFO] [stdout]     |            --------------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 295 |     pub order_id: i64,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout] 296 |     /// 平台代码。
[INFO] [stdout] 297 |     pub platform: String,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout] 298 |     /// 采购流程状态。
[INFO] [stdout] 299 |     pub purchase_status: PurchaseStatus,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `PendingIntlItem` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple fields are never read
[INFO] [stdout]   --> src/repository/session_repo.rs:72:9
[INFO] [stdout]    |
[INFO] [stdout] 71 | pub struct Session {
[INFO] [stdout]    |            ------- fields in this struct
[INFO] [stdout] 72 |     pub id: i64,
[INFO] [stdout]    |         ^^
[INFO] [stdout] ...
[INFO] [stdout] 76 |     pub token: String,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout] 77 |     pub created_at: NaiveDateTime,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout] 78 |     pub last_seen_at: NaiveDateTime,
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout] 79 |     pub expires_at: NaiveDateTime,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout] 80 |     pub ip: Option<String>,
[INFO] [stdout]    |         ^^
[INFO] [stdout] 81 |     pub user_agent: Option<String>,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Session` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `is_expired` is never used
[INFO] [stdout]   --> src/repository/session_repo.rs:90:12
[INFO] [stdout]    |
[INFO] [stdout] 84 | impl Session {
[INFO] [stdout]    | ------------ method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 90 |     pub fn is_expired(&self, now: NaiveDateTime) -> bool {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `find_by_token` is never used
[INFO] [stdout]    --> src/repository/session_repo.rs:166:14
[INFO] [stdout]     |
[INFO] [stdout] 166 | pub async fn find_by_token(master: &MySqlPool, token: &str) -> Result<Option<Session>, AppError> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `revoke_all_for_principal` is never used
[INFO] [stdout]    --> src/repository/session_repo.rs:239:14
[INFO] [stdout]     |
[INFO] [stdout] 239 | pub async fn revoke_all_for_principal(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RakutenSyncCheckReport` is never constructed
[INFO] [stdout]   --> src/repository/store_repo.rs:53:12
[INFO] [stdout]    |
[INFO] [stdout] 53 | pub struct RakutenSyncCheckReport {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `STORE_BASE_COLUMNS` is never used
[INFO] [stdout]   --> src/repository/store_repo.rs:79:7
[INFO] [stdout]    |
[INFO] [stdout] 79 | const STORE_BASE_COLUMNS: &str = "`id`, `platform`, `dpqz`, `dpquancheng`, `is_hidden`";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `list_stores` is never used
[INFO] [stdout]   --> src/repository/store_repo.rs:86:14
[INFO] [stdout]    |
[INFO] [stdout] 86 | pub async fn list_stores(pool: &MySqlPool) -> Result<Vec<Store>, AppError> {
[INFO] [stdout]    |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `record_sync_report` is never used
[INFO] [stdout]    --> src/repository/store_repo.rs:193:14
[INFO] [stdout]     |
[INFO] [stdout] 193 | pub async fn record_sync_report(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `rakuten_sync_check` is never used
[INFO] [stdout]    --> src/repository/store_repo.rs:236:14
[INFO] [stdout]     |
[INFO] [stdout] 236 | pub async fn rakuten_sync_check(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `token`, `principal_kind`, `principal_id`, and `tenant_id` are never read
[INFO] [stdout]    --> src/services/auth_service.rs:113:9
[INFO] [stdout]     |
[INFO] [stdout] 112 | pub struct LoginOutcome {
[INFO] [stdout]     |            ------------ fields in this struct
[INFO] [stdout] 113 |     pub token: String,
[INFO] [stdout]     |         ^^^^^
[INFO] [stdout] 114 |     pub set_cookie: String,
[INFO] [stdout] 115 |     pub principal_kind: PrincipalKind,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^
[INFO] [stdout] 116 |     pub principal_id: i64,
[INFO] [stdout]     |         ^^^^^^^^^^^^
[INFO] [stdout] 117 |     pub tenant_id: Option<i64>,
[INFO] [stdout]     |         ^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `LoginOutcome` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `preview_csv_import` is never used
[INFO] [stdout]    --> src/services/import/mod.rs:129:8
[INFO] [stdout]     |
[INFO] [stdout] 129 | pub fn preview_csv_import(platform: Platform, csv_text: &str) -> ImportPreview {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ImportedItem` is never constructed
[INFO] [stdout]   --> src/services/order_service.rs:56:12
[INFO] [stdout]    |
[INFO] [stdout] 56 | pub struct ImportedItem {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `has_purchasable_link` is never used
[INFO] [stdout]   --> src/services/order_service.rs:71:12
[INFO] [stdout]    |
[INFO] [stdout] 67 | impl ImportedItem {
[INFO] [stdout]    | ----------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 71 |     pub fn has_purchasable_link(&self) -> bool {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `JpStockIndex` is never constructed
[INFO] [stdout]   --> src/services/order_service.rs:84:12
[INFO] [stdout]    |
[INFO] [stdout] 84 | pub struct JpStockIndex {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `from_ids`, and `has_available` are never used
[INFO] [stdout]    --> src/services/order_service.rs:90:12
[INFO] [stdout]     |
[INFO] [stdout]  88 | impl JpStockIndex {
[INFO] [stdout]     | ----------------- associated items in this implementation
[INFO] [stdout]  89 |     /// 空索引（无任何现货）。
[INFO] [stdout]  90 |     pub fn new() -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  97 |     pub fn from_ids<I, S>(ids: I) -> Self
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 108 |     pub fn has_available(&self, id: &str) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `predict_source` is never used
[INFO] [stdout]    --> src/services/order_service.rs:122:8
[INFO] [stdout]     |
[INFO] [stdout] 122 | pub fn predict_source(item: &ImportedItem, jp_stock: &JpStockIndex) -> SourceType {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `log_source_decision` is never used
[INFO] [stdout]    --> src/services/order_service.rs:137:14
[INFO] [stdout]     |
[INFO] [stdout] 137 | pub async fn log_source_decision(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `FulfillmentQueue` is never used
[INFO] [stdout]    --> src/services/order_service.rs:176:10
[INFO] [stdout]     |
[INFO] [stdout] 176 | pub enum FulfillmentQueue {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `route_of` is never used
[INFO] [stdout]    --> src/services/order_service.rs:190:8
[INFO] [stdout]     |
[INFO] [stdout] 190 | pub fn route_of(source_type: SourceType) -> Option<FulfillmentQueue> {
[INFO] [stdout]     |        ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `route_to_purchase_queue` is never used
[INFO] [stdout]    --> src/services/order_service.rs:201:8
[INFO] [stdout]     |
[INFO] [stdout] 201 | pub fn route_to_purchase_queue(items: &[OrderItem]) -> Vec<&OrderItem> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `route_to_jp_shipment_queue` is never used
[INFO] [stdout]    --> src/services/order_service.rs:211:8
[INFO] [stdout]     |
[INFO] [stdout] 211 | pub fn route_to_jp_shipment_queue(items: &[OrderItem]) -> Vec<&OrderItem> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resolve_caigou_user` is never used
[INFO] [stdout]   --> src/services/purchase_service.rs:96:8
[INFO] [stdout]    |
[INFO] [stdout] 96 | pub fn resolve_caigou_user(
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DEFAULT_PROFIT_DEDUCTION` is never used
[INFO] [stdout]   --> src/services/stats_service.rs:36:11
[INFO] [stdout]    |
[INFO] [stdout] 36 | pub const DEFAULT_PROFIT_DEDUCTION: f64 = 70.0;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DEFAULT_EXCHANGE_RATE` is never used
[INFO] [stdout]   --> src/services/stats_service.rs:39:11
[INFO] [stdout]    |
[INFO] [stdout] 39 | pub const DEFAULT_EXCHANGE_RATE: f64 = 0.0480;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DEFAULT_SHIPPING` is never used
[INFO] [stdout]   --> src/services/stats_service.rs:42:11
[INFO] [stdout]    |
[INFO] [stdout] 42 | pub const DEFAULT_SHIPPING: f64 = 40.0;
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ProfitInput` is never constructed
[INFO] [stdout]   --> src/services/stats_service.rs:55:12
[INFO] [stdout]    |
[INFO] [stdout] 55 | pub struct ProfitInput {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ProfitResult` is never constructed
[INFO] [stdout]   --> src/services/stats_service.rs:67:12
[INFO] [stdout]    |
[INFO] [stdout] 67 | pub struct ProfitResult {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `calculate_profit` is never used
[INFO] [stdout]   --> src/services/stats_service.rs:94:8
[INFO] [stdout]    |
[INFO] [stdout] 94 | pub fn calculate_profit(input: &ProfitInput) -> ProfitResult {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `share_postage` is never used
[INFO] [stdout]    --> src/services/stats_service.rs:127:8
[INFO] [stdout]     |
[INFO] [stdout] 127 | pub fn share_postage(
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `share_shipping` is never used
[INFO] [stdout]    --> src/services/stats_service.rs:149:8
[INFO] [stdout]     |
[INFO] [stdout] 149 | pub fn share_shipping(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SuggestedPrice` is never constructed
[INFO] [stdout]    --> src/services/stats_service.rs:167:12
[INFO] [stdout]     |
[INFO] [stdout] 167 | pub struct SuggestedPrice {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `calculate_suggested_price` is never used
[INFO] [stdout]    --> src/services/stats_service.rs:182:8
[INFO] [stdout]     |
[INFO] [stdout] 182 | pub fn calculate_suggested_price(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `participates_in_profit` is never used
[INFO] [stdout]    --> src/services/stats_service.rs:222:8
[INFO] [stdout]     |
[INFO] [stdout] 222 | pub fn participates_in_profit(status: PurchaseStatus) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `profit_status_labels` is never used
[INFO] [stdout]    --> src/services/stats_service.rs:227:8
[INFO] [stdout]     |
[INFO] [stdout] 227 | pub fn profit_status_labels() -> Vec<&'static str> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_decimal` is never used
[INFO] [stdout]    --> src/services/stats_service.rs:236:4
[INFO] [stdout]     |
[INFO] [stdout] 236 | fn parse_decimal(s: &str) -> f64 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CaigouUserStat` is never constructed
[INFO] [stdout]    --> src/services/stats_service.rs:253:12
[INFO] [stdout]     |
[INFO] [stdout] 253 | pub struct CaigouUserStat {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `caigou_stats` is never used
[INFO] [stdout]    --> src/services/stats_service.rs:272:14
[INFO] [stdout]     |
[INFO] [stdout] 272 | pub async fn caigou_stats(
[INFO] [stdout]     |              ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CaigouAmountSummary` is never constructed
[INFO] [stdout]    --> src/services/stats_service.rs:311:12
[INFO] [stdout]     |
[INFO] [stdout] 311 | pub struct CaigouAmountSummary {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `summarize_caigou_amount` is never used
[INFO] [stdout]    --> src/services/stats_service.rs:323:8
[INFO] [stdout]     |
[INFO] [stdout] 323 | pub fn summarize_caigou_amount(stats: &[CaigouUserStat]) -> CaigouAmountSummary {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ProfitReportParams` is never constructed
[INFO] [stdout]    --> src/services/stats_service.rs:394:12
[INFO] [stdout]     |
[INFO] [stdout] 394 | pub struct ProfitReportParams {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ProfitReport` is never constructed
[INFO] [stdout]    --> src/services/stats_service.rs:424:12
[INFO] [stdout]     |
[INFO] [stdout] 424 | pub struct ProfitReport {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ProfitOrderRow` is never constructed
[INFO] [stdout]    --> src/services/stats_service.rs:441:8
[INFO] [stdout]     |
[INFO] [stdout] 441 | struct ProfitOrderRow {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `profit_report` is never used
[INFO] [stdout]    --> src/services/stats_service.rs:464:14
[INFO] [stdout]     |
[INFO] [stdout] 464 | pub async fn profit_report(
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `aggregate_profit_rows` is never used
[INFO] [stdout]    --> src/services/stats_service.rs:504:4
[INFO] [stdout]     |
[INFO] [stdout] 504 | fn aggregate_profit_rows(rows: &[ProfitOrderRow], params: &ProfitReportParams) -> ProfitReport {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DEFAULT_TEMPLATE_GLOB` is never used
[INFO] [stdout]   --> src/state.rs:30:7
[INFO] [stdout]    |
[INFO] [stdout] 30 | const DEFAULT_TEMPLATE_GLOB: &str = "src/templates/**/*.html";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `new` is never used
[INFO] [stdout]   --> src/state.rs:60:18
[INFO] [stdout]    |
[INFO] [stdout] 53 | impl AppState {
[INFO] [stdout]    | ------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 60 |     pub async fn new(config: AppConfig) -> Result<Self, AppError> {
[INFO] [stdout]    |                  ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `build_master_pool` is never used
[INFO] [stdout]    --> src/state.rs:111:10
[INFO] [stdout]     |
[INFO] [stdout] 111 | async fn build_master_pool(config: &AppConfig) -> Result<MySqlPool, AppError> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load_templates` is never used
[INFO] [stdout]    --> src/state.rs:127:4
[INFO] [stdout]     |
[INFO] [stdout] 127 | fn load_templates(glob: &str) -> Tera {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `init_tenant_db` is never used
[INFO] [stdout]   --> src/db/migrate.rs:59:14
[INFO] [stdout]    |
[INFO] [stdout] 59 | pub async fn init_tenant_db(pool: &MySqlPool) -> Result<(), AppError> {
[INFO] [stdout]    |              ^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `from_mysql_row` is never used
[INFO] [stdout]    --> src/db/migrate.rs:331:12
[INFO] [stdout]     |
[INFO] [stdout] 288 | impl LegacyRow {
[INFO] [stdout]     | -------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 331 |     pub fn from_mysql_row(row: &MySqlRow) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `cell_to_string` is never used
[INFO] [stdout]    --> src/db/migrate.rs:347:4
[INFO] [stdout]     |
[INFO] [stdout] 347 | fn cell_to_string(row: &MySqlRow, idx: usize) -> Option<String> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `LegacyExtractor` is never constructed
[INFO] [stdout]    --> src/db/migrate.rs:415:12
[INFO] [stdout]     |
[INFO] [stdout] 415 | pub struct LegacyExtractor {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `source`, `count`, `extract`, `extract_platform`, and `extract_archive` are never used
[INFO] [stdout]    --> src/db/migrate.rs:425:12
[INFO] [stdout]     |
[INFO] [stdout] 420 | impl LegacyExtractor {
[INFO] [stdout]     | -------------------- associated items in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 425 |     pub fn new(source: sqlx::MySqlPool) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 430 |     pub fn source(&self) -> &sqlx::MySqlPool {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 437 |     pub async fn count(&self, src: LegacySource) -> Result<i64, AppError> {
[INFO] [stdout]     |                  ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 452 |     pub async fn extract(
[INFO] [stdout]     |                  ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 485 |     pub async fn extract_platform(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 496 |     pub async fn extract_archive(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `write_source_backfill_log` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1387:14
[INFO] [stdout]      |
[INFO] [stdout] 1387 | pub async fn write_source_backfill_log(
[INFO] [stdout]      |              ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `as_str` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1841:12
[INFO] [stdout]      |
[INFO] [stdout] 1840 | impl MigrationValidationKind {
[INFO] [stdout]      | ---------------------------- method in this implementation
[INFO] [stdout] 1841 |     pub fn as_str(&self) -> &'static str {
[INFO] [stdout]      |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `mark_rolled_back` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1896:8
[INFO] [stdout]      |
[INFO] [stdout] 1875 | impl MigrationBatchFailure {
[INFO] [stdout]      | -------------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 1896 |     fn mark_rolled_back(mut self) -> Self {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `LoadedMigrationRecord` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1952:12
[INFO] [stdout]      |
[INFO] [stdout] 1952 | pub struct LoadedMigrationRecord {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `from_loaded_records` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1960:12
[INFO] [stdout]      |
[INFO] [stdout] 1959 | impl MigrationForeignKeySnapshot {
[INFO] [stdout]      | -------------------------------- associated function in this implementation
[INFO] [stdout] 1960 |     pub fn from_loaded_records(records: &[LoadedMigrationRecord]) -> Self {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `MigrationBatchSuccess` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:1973:12
[INFO] [stdout]      |
[INFO] [stdout] 1973 | pub struct MigrationBatchSuccess {
[INFO] [stdout]      |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `MigrationBatchRunError` is never used
[INFO] [stdout]     --> src/db/migrate.rs:1990:10
[INFO] [stdout]      |
[INFO] [stdout] 1990 | pub enum MigrationBatchRunError {
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `migrate_legacy_batch` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2105:14
[INFO] [stdout]      |
[INFO] [stdout] 2105 | pub async fn migrate_legacy_batch(
[INFO] [stdout]      |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `LoadedBatch` is never constructed
[INFO] [stdout]     --> src/db/migrate.rs:2183:8
[INFO] [stdout]      |
[INFO] [stdout] 2183 | struct LoadedBatch {
[INFO] [stdout]      |        ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_normalized_records_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2191:10
[INFO] [stdout]      |
[INFO] [stdout] 2191 | async fn insert_normalized_records_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_order_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2291:10
[INFO] [stdout]      |
[INFO] [stdout] 2291 | async fn insert_order_tx(tx: &mut Transaction<'_, MySql>, order: &Order) -> Result<i64, AppError> {
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_order_item_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2328:10
[INFO] [stdout]      |
[INFO] [stdout] 2328 | async fn insert_order_item_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_purchase_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2361:10
[INFO] [stdout]      |
[INFO] [stdout] 2361 | async fn insert_purchase_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_domestic_shipment_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2388:10
[INFO] [stdout]      |
[INFO] [stdout] 2388 | async fn insert_domestic_shipment_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_intl_shipment_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2412:10
[INFO] [stdout]      |
[INFO] [stdout] 2412 | async fn insert_intl_shipment_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_parsed_log_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2437:10
[INFO] [stdout]      |
[INFO] [stdout] 2437 | async fn insert_parsed_log_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `insert_legacy_log_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2461:10
[INFO] [stdout]      |
[INFO] [stdout] 2461 | async fn insert_legacy_log_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `write_source_backfill_log_tx` is never used
[INFO] [stdout]     --> src/db/migrate.rs:2483:10
[INFO] [stdout]      |
[INFO] [stdout] 2483 | async fn write_source_backfill_log_tx(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `master` is never used
[INFO] [stdout]    --> src/db/pool.rs:178:12
[INFO] [stdout]     |
[INFO] [stdout] 166 | impl TenantPoolManager {
[INFO] [stdout]     | ---------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 178 |     pub fn master(&self) -> &MySqlPool {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `with_endpoints` is never used
[INFO] [stdout]   --> src/integrations/oauth_rakuten.rs:80:12
[INFO] [stdout]    |
[INFO] [stdout] 60 | impl RakutenOAuth {
[INFO] [stdout]    | ----------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 80 |     pub fn with_endpoints(
[INFO] [stdout]    |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `with_endpoints` is never used
[INFO] [stdout]   --> src/integrations/oauth_wowma.rs:64:12
[INFO] [stdout]    |
[INFO] [stdout] 44 | impl WowmaOAuth {
[INFO] [stdout]    | --------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 64 |     pub fn with_endpoints(
[INFO] [stdout]    |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `with_endpoints` and `with_scope` are never used
[INFO] [stdout]    --> src/integrations/oauth_yahoo.rs:205:12
[INFO] [stdout]     |
[INFO] [stdout] 185 | impl YahooOAuth {
[INFO] [stdout]     | --------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 205 |     pub fn with_endpoints(
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 216 |     pub fn with_scope(mut self, scope: impl Into<String>) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SEARCH_ORDER_ENDPOINT` is never used
[INFO] [stdout]   --> src/integrations/rakuten_rms.rs:20:11
[INFO] [stdout]    |
[INFO] [stdout] 20 | pub const SEARCH_ORDER_ENDPOINT: &str = "https://api.rms.rakuten.co.jp/es/2.0/order/searchOrder/";
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `GET_ORDER_ENDPOINT` is never used
[INFO] [stdout]   --> src/integrations/rakuten_rms.rs:21:11
[INFO] [stdout]    |
[INFO] [stdout] 21 | pub const GET_ORDER_ENDPOINT: &str = "https://api.rms.rakuten.co.jp/es/2.0/order/getOrder/";
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `from_json` is never used
[INFO] [stdout]    --> src/integrations/rakuten_rms.rs:123:12
[INFO] [stdout]     |
[INFO] [stdout] 122 | impl RakutenSearchOrderResponse {
[INFO] [stdout]     | ------------------------------- associated function in this implementation
[INFO] [stdout] 123 |     pub fn from_json(value: &JsonValue) -> Result<Self, AppError> {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `from_json` is never used
[INFO] [stdout]    --> src/integrations/rakuten_rms.rs:154:12
[INFO] [stdout]     |
[INFO] [stdout] 153 | impl RakutenGetOrderResponse {
[INFO] [stdout]     | ---------------------------- associated function in this implementation
[INFO] [stdout] 154 |     pub fn from_json(value: &JsonValue) -> Result<Self, AppError> {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `json_text_opt` is never used
[INFO] [stdout]    --> src/integrations/rakuten_rms.rs:404:4
[INFO] [stdout]     |
[INFO] [stdout] 404 | fn json_text_opt(value: &JsonValue) -> Option<String> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `json_usize` is never used
[INFO] [stdout]    --> src/integrations/rakuten_rms.rs:422:4
[INFO] [stdout]     |
[INFO] [stdout] 422 | fn json_usize(value: &JsonValue) -> Option<usize> {
[INFO] [stdout]     |    ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `with_root` is never used
[INFO] [stdout]    --> src/jobs/cleanup_old_images.rs:208:12
[INFO] [stdout]     |
[INFO] [stdout] 182 | impl CleanupOldImagesJob {
[INFO] [stdout]     | ------------------------ method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 208 |     pub fn with_root(mut self, root: impl Into<String>) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `with_retention_days` is never used
[INFO] [stdout]   --> src/jobs/daily_maintain.rs:99:12
[INFO] [stdout]    |
[INFO] [stdout] 89 | impl DailyMaintainJob {
[INFO] [stdout]    | --------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 99 |     pub fn with_retention_days(mut self, retention_days: i64) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `path` is never used
[INFO] [stdout]    --> src/jobs/order_monitor.rs:171:12
[INFO] [stdout]     |
[INFO] [stdout] 164 | impl FileCursorStore {
[INFO] [stdout]     | -------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 171 |     pub fn path(&self) -> &Path {
[INFO] [stdout]     |            ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `with_options` is never used
[INFO] [stdout]    --> src/jobs/update_1688_logistics.rs:486:12
[INFO] [stdout]     |
[INFO] [stdout] 476 | impl<P: PurchaseProvider> Update1688LogisticsJob<P> {
[INFO] [stdout]     | --------------------------------------------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 486 |     pub fn with_options(provider: P, options: Options) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `with_parts` is never used
[INFO] [stdout]    --> src/jobs/update_jpship_logistics.rs:310:12
[INFO] [stdout]     |
[INFO] [stdout] 298 | impl UpdateJpshipLogisticsJob {
[INFO] [stdout]     | ----------------------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 310 |     pub fn with_parts(
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `with_limits` is never used
[INFO] [stdout]    --> src/jobs/zhutu_downloader.rs:175:12
[INFO] [stdout]     |
[INFO] [stdout] 160 | impl ZhutuDownloaderJob {
[INFO] [stdout]     | ----------------------- method in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 175 |     pub fn with_limits(mut self, day_limit: i64, count_limit: i64) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `order_id`, `platform`, and `purchase_status` are never read
[INFO] [stdout]    --> src/repository/order_repo.rs:295:9
[INFO] [stdout]     |
[INFO] [stdout] 291 | pub struct PendingIntlItem {
[INFO] [stdout]     |            --------------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 295 |     pub order_id: i64,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout] 296 |     /// 平台代码。
[INFO] [stdout] 297 |     pub platform: String,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout] 298 |     /// 采购流程状态。
[INFO] [stdout] 299 |     pub purchase_status: PurchaseStatus,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `PendingIntlItem` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `id`, `token`, `created_at`, `last_seen_at`, `ip`, and `user_agent` are never read
[INFO] [stdout]   --> src/repository/session_repo.rs:72:9
[INFO] [stdout]    |
[INFO] [stdout] 71 | pub struct Session {
[INFO] [stdout]    |            ------- fields in this struct
[INFO] [stdout] 72 |     pub id: i64,
[INFO] [stdout]    |         ^^
[INFO] [stdout] ...
[INFO] [stdout] 76 |     pub token: String,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout] 77 |     pub created_at: NaiveDateTime,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout] 78 |     pub last_seen_at: NaiveDateTime,
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout] 79 |     pub expires_at: NaiveDateTime,
[INFO] [stdout] 80 |     pub ip: Option<String>,
[INFO] [stdout]    |         ^^
[INFO] [stdout] 81 |     pub user_agent: Option<String>,
[INFO] [stdout]    |         ^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `Session` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `RakutenSyncCheckReport` is never constructed
[INFO] [stdout]   --> src/repository/store_repo.rs:53:12
[INFO] [stdout]    |
[INFO] [stdout] 53 | pub struct RakutenSyncCheckReport {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `STORE_BASE_COLUMNS` is never used
[INFO] [stdout]   --> src/repository/store_repo.rs:79:7
[INFO] [stdout]    |
[INFO] [stdout] 79 | const STORE_BASE_COLUMNS: &str = "`id`, `platform`, `dpqz`, `dpquancheng`, `is_hidden`";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `list_stores` is never used
[INFO] [stdout]   --> src/repository/store_repo.rs:86:14
[INFO] [stdout]    |
[INFO] [stdout] 86 | pub async fn list_stores(pool: &MySqlPool) -> Result<Vec<Store>, AppError> {
[INFO] [stdout]    |              ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `record_sync_report` is never used
[INFO] [stdout]    --> src/repository/store_repo.rs:193:14
[INFO] [stdout]     |
[INFO] [stdout] 193 | pub async fn record_sync_report(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `rakuten_sync_check` is never used
[INFO] [stdout]    --> src/repository/store_repo.rs:236:14
[INFO] [stdout]     |
[INFO] [stdout] 236 | pub async fn rakuten_sync_check(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `token`, `principal_kind`, `principal_id`, and `tenant_id` are never read
[INFO] [stdout]    --> src/services/auth_service.rs:113:9
[INFO] [stdout]     |
[INFO] [stdout] 112 | pub struct LoginOutcome {
[INFO] [stdout]     |            ------------ fields in this struct
[INFO] [stdout] 113 |     pub token: String,
[INFO] [stdout]     |         ^^^^^
[INFO] [stdout] 114 |     pub set_cookie: String,
[INFO] [stdout] 115 |     pub principal_kind: PrincipalKind,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^
[INFO] [stdout] 116 |     pub principal_id: i64,
[INFO] [stdout]     |         ^^^^^^^^^^^^
[INFO] [stdout] 117 |     pub tenant_id: Option<i64>,
[INFO] [stdout]     |         ^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `LoginOutcome` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `log_source_decision` is never used
[INFO] [stdout]    --> src/services/order_service.rs:137:14
[INFO] [stdout]     |
[INFO] [stdout] 137 | pub async fn log_source_decision(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `caigou_stats` is never used
[INFO] [stdout]    --> src/services/stats_service.rs:272:14
[INFO] [stdout]     |
[INFO] [stdout] 272 | pub async fn caigou_stats(
[INFO] [stdout]     |              ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `date_start`, `date_end`, and `platform` are never read
[INFO] [stdout]    --> src/services/stats_service.rs:396:9
[INFO] [stdout]     |
[INFO] [stdout] 394 | pub struct ProfitReportParams {
[INFO] [stdout]     |            ------------------ fields in this struct
[INFO] [stdout] 395 |     /// 起始日期（按 `orders.order_date` 的日期，`YYYY-MM-DD`）。
[INFO] [stdout] 396 |     pub date_start: String,
[INFO] [stdout]     |         ^^^^^^^^^^
[INFO] [stdout] 397 |     /// 结束日期（`YYYY-MM-DD`）。
[INFO] [stdout] 398 |     pub date_end: String,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout] 399 |     /// 平台过滤（`orders.platform`），`None` 为全部平台。
[INFO] [stdout] 400 |     pub platform: Option<String>,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `ProfitReportParams` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `profit_report` is never used
[INFO] [stdout]    --> src/services/stats_service.rs:464:14
[INFO] [stdout]     |
[INFO] [stdout] 464 | pub async fn profit_report(
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DEFAULT_TEMPLATE_GLOB` is never used
[INFO] [stdout]   --> src/state.rs:30:7
[INFO] [stdout]    |
[INFO] [stdout] 30 | const DEFAULT_TEMPLATE_GLOB: &str = "src/templates/**/*.html";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `new` is never used
[INFO] [stdout]   --> src/state.rs:60:18
[INFO] [stdout]    |
[INFO] [stdout] 53 | impl AppState {
[INFO] [stdout]    | ------------- associated function in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 60 |     pub async fn new(config: AppConfig) -> Result<Self, AppError> {
[INFO] [stdout]    |                  ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `build_master_pool` is never used
[INFO] [stdout]    --> src/state.rs:111:10
[INFO] [stdout]     |
[INFO] [stdout] 111 | async fn build_master_pool(config: &AppConfig) -> Result<MySqlPool, AppError> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 23s
[INFO] running `Command { std: "docker" "inspect" "c79425c0cd88768a5b1941f45154236131830995944dd4a5dd600a09d7ab9b8a", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "c79425c0cd88768a5b1941f45154236131830995944dd4a5dd600a09d7ab9b8a", kill_on_drop: false }`
[INFO] [stdout] c79425c0cd88768a5b1941f45154236131830995944dd4a5dd600a09d7ab9b8a
