diff --git a/AGENTS.md b/AGENTS.md index 3d5428221..82e3decc3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -67,6 +67,8 @@ | Lastleg 内部模块化与依赖基线 | `lastleg-service/` | `lastleg-service/docs/lastleg-internal-modularization-baseline.md`、`lastleg-service/scripts/analyze-lastleg-dependencies.mjs`;只用于约束服务内部依赖,不改变服务和数据库边界 | | PDF 标签、审计、跨区双向事件 | `print/`、`audit-service/`、`event-bridge-service/` | 事件模型先读 `common-event-contract/AGENTS.md`;国内真实生产验收 `firstleg/.../TaillegRealProducerAcceptanceTest.java`、海外真实消费验收 `lastleg-service/.../TaillegRealConsumerAcceptanceTest.java`;可靠投递与 CN/OVERSEAS 目标路由读 `event-bridge-service/AGENTS.md` | +散货托盘码与跨区传递:`firstleg/` 的 `LoadingPalletLabelService.java` 生成冻结标签并调用 Print 输出 PDF,`LoadingCompletedOutboxService.java` 传递装柜快照;`lastleg-service/` 通过 `LastlegSourcePalletMapper.java` 保存来源托盘,`InboundPlanService.java` 和 `ContainerInboundPlanConversionCoordinator.java` 消费。标签与资源预留的细节继续读对应服务指引。 + ## 公共模块快速索引 | 关键词 | 模块与入口 | diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index 5b0b228c2..ff2909c5c 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -843,6 +843,7 @@ CREATE TABLE IF NOT EXISTS wh_warehouse ( id BIGINT UNSIGNED NOT NULL COMMENT '仓库ID(雪花ID)', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '平台公共仓库固定使用 tenant_id=0', warehouse_code VARCHAR(50) NOT NULL COMMENT '平台内唯一仓库编码', + internal_code VARCHAR(16) NULL COMMENT 'FBA内部编号,仅FBA仓可配置', warehouse_name VARCHAR(120) NOT NULL COMMENT '仓库名称', warehouse_type VARCHAR(32) NOT NULL DEFAULT 'DOMESTIC' COMMENT '公共仓库类型:DOMESTIC国内仓、FBA亚马逊仓、OVERSEAS普通海外仓、OVERSEAS_PARTNER海外合作仓', country_code CHAR(2) NOT NULL COMMENT '所在国家二字码', @@ -865,6 +866,20 @@ CREATE TABLE IF NOT EXISTS wh_warehouse ( KEY idx_wh_country (tenant_id, country_code, deleted) ) ENGINE=InnoDB COMMENT='平台公共仓库主数据表:统一归属平台作用域 tenant_id=0'; +SET @warehouse_internal_code_ddl = IF( + EXISTS( + SELECT 1 FROM information_schema.columns + WHERE table_schema = 'baiyue_warehouse' + AND table_name = 'wh_warehouse' + AND column_name = 'internal_code' + ), + 'SELECT 1', + 'ALTER TABLE wh_warehouse ADD COLUMN internal_code VARCHAR(16) NULL COMMENT ''FBA内部编号,仅FBA仓可配置'' AFTER warehouse_code' +); +PREPARE warehouse_internal_code_statement FROM @warehouse_internal_code_ddl; +EXECUTE warehouse_internal_code_statement; +DEALLOCATE PREPARE warehouse_internal_code_statement; + CREATE TABLE IF NOT EXISTS wh_warehouse_address ( id BIGINT UNSIGNED NOT NULL COMMENT '仓库地址ID', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '平台公共仓库地址固定使用 tenant_id=0', @@ -5309,6 +5324,29 @@ CREATE TABLE IF NOT EXISTS fl_loading_plan_item ( CONSTRAINT chk_loading_item_deleted CHECK (deleted IN (0, 1)) ) ENGINE=InnoDB COMMENT='智能装柜客户货物明细;客户归属仅在明细层'; +CREATE TABLE IF NOT EXISTS fl_loading_pallet_label ( + id BIGINT UNSIGNED NOT NULL COMMENT '散货托盘标签ID(雪花ID)', + loading_plan_id BIGINT UNSIGNED NOT NULL COMMENT '装柜计划ID', + loading_plan_item_id BIGINT UNSIGNED NOT NULL COMMENT '标签归属装柜明细ID', + account_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID快照', + inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入仓单ID快照', + inbound_code VARCHAR(40) NOT NULL COMMENT '入仓码快照', + container_no VARCHAR(64) NOT NULL COMMENT '真实集装箱号快照', + destination_warehouse_code VARCHAR(64) NOT NULL COMMENT 'FBA仓编码快照', + destination_warehouse_name VARCHAR(128) NULL COMMENT 'FBA仓名称快照', + pallet_index INT UNSIGNED NOT NULL COMMENT '当前柜当前FBA仓内从1开始的序号', + pallet_code VARCHAR(128) NOT NULL COMMENT '托盘码:集装箱号-FBA仓编码-三位序号', + created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '生成时间', + PRIMARY KEY (id), + UNIQUE KEY uk_loading_pallet_code (pallet_code), + UNIQUE KEY uk_loading_pallet_index (loading_plan_id,destination_warehouse_code,pallet_index), + KEY idx_loading_pallet_item (loading_plan_item_id,pallet_index), + KEY idx_loading_pallet_inbound (account_id,inbound_id), + CONSTRAINT fk_loading_pallet_plan FOREIGN KEY (loading_plan_id) REFERENCES fl_loading_plan(id), + CONSTRAINT fk_loading_pallet_item FOREIGN KEY (loading_plan_item_id) REFERENCES fl_loading_plan_item(id), + CONSTRAINT chk_loading_pallet_index CHECK (pallet_index BETWEEN 1 AND 999) +) ENGINE=InnoDB COMMENT='散货按柜号和FBA仓冻结的可打印托盘码'; + CREATE TABLE IF NOT EXISTS fl_container_document ( id BIGINT UNSIGNED NOT NULL COMMENT '货柜文件关联ID(雪花ID)', container_booking_id BIGINT UNSIGNED NOT NULL COMMENT '货柜预订ID', @@ -6395,8 +6433,8 @@ DELIMITER ; USE baiyue_warehouse; -- 正式平台公共仓库主数据:固定作业仓 + FBA 地址库。 --- 来源:C:\Users\BY-OY\Downloads\FBA地址表.xls,只读清洗后生成。 --- 接受 252 条,拒绝 54 条;拒绝清单见 master-data/fba-public-addresses.rejected.csv。 +-- 来源:用户提供的 FBA地址表.xls,只读整理后生成。 +-- 完整保留 314 条,拒绝 0 条;拒绝清单见 master-data/fba-public-addresses.rejected.csv。 -- 四个固定作业仓按通用占位地址写入;清单见 master-data/platform-fixed-warehouses.csv。 -- FBA 是目的地址主数据,不创建 RECEIVING、STORAGE、PICK_PACK、RETURN 等平台作业能力。 @@ -6720,6 +6758,7 @@ CREATE TEMPORARY TABLE tmp_wh_fba_public_master_data ( address_id_seed BIGINT UNSIGNED NOT NULL, warehouse_code VARCHAR(50) NOT NULL, warehouse_name VARCHAR(120) NOT NULL, + internal_code VARCHAR(16) NULL, state_province VARCHAR(100) NOT NULL, city VARCHAR(100) NOT NULL, postal_code VARCHAR(20) NOT NULL, @@ -6732,281 +6771,339 @@ CREATE TEMPORARY TABLE tmp_wh_fba_public_master_data ( ) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; INSERT INTO tmp_wh_fba_public_master_data - (warehouse_id_seed,address_id_seed,warehouse_code,warehouse_name,state_province,city,postal_code,timezone,address_line1,source_row) + (warehouse_id_seed,address_id_seed,warehouse_code,warehouse_name,internal_code,state_province,city,postal_code,timezone,address_line1,source_row) VALUES -(193000000000000001,193000000000100001,'ABE2','ABE2','PA','Breinigsville','18031','UTC-5','705 Boulder Drive',238), -(193000000000000002,193000000000100002,'ABE3','ABE3','PA','Breinigsville','18031','UTC-5','650 Boulder Drive',237), -(193000000000000003,193000000000100003,'ABE4','ABE4','PA','Easton','18045','UTC-5','1610 Van Buren Road',134), -(193000000000000004,193000000000100004,'ABE5','ABE5','PA','Harrisburg','17112','UTC-5','6455 Allentown Boulevard',231), -(193000000000000005,193000000000100005,'ABE8','ABE8','NJ','Florence','08518','UTC-5','401 Independence Road 08518-2200',125), -(193000000000000006,193000000000100006,'ABQ2','ABQ2','NM','LOS LUNAS','87031','UTC-7','6251 Pioneer Trail NW',99), -(193000000000000007,193000000000100007,'ACY2','ACY2','NJ','BURLINGTON','08016','UTC-5','1101 E PEARL ST',84), -(193000000000000008,193000000000100008,'AFW1','AFW1','TX','FORT WORTH','76131','UTC-6','1851 NE LOOP 820',141), -(193000000000000009,193000000000100009,'AFW5','AFW5','TX','BALCH SPRINGS','75180-1636','UTC-6','12374 LAKE JUNE RD',27), -(193000000000000010,193000000000100010,'AKR1','AKR1','OH','Canton','44705','UTC-5','4747 Rebar Ave NE',148), -(193000000000000011,193000000000100011,'ALB1','ALB1','NY','Castleton','12033-9634','UTC-5','1835 US Route 9',174), -(193000000000000012,193000000000100012,'AMA1','AMA1','TX','Amarillo','79108','UTC-6','8590 NE 24th Avenue',129), -(193000000000000013,193000000000100013,'ATL2N','ATL2N','GA','Carrollton','30117','UTC-5','3101 N. Highway 27',31), -(193000000000000014,193000000000100014,'ATL3','ATL3','GA','Pendergrass','30567','UTC-5','445 Valentine Industrial Parkway',147), -(193000000000000015,193000000000100015,'ATL6','ATL6','GA','East Point','30344','UTC-5','4200 North Commerce',202), -(193000000000000016,193000000000100016,'AVP1','AVP1','PA','Hazle Township','18202-9361','UTC-5','550 Oak Ridge Road',233), -(193000000000000017,193000000000100017,'AVP3','AVP3','PA','GOULDSBORO','18424-9492','UTC-5','298 1ST AVE',232), -(193000000000000018,193000000000100018,'BDL1','BDL1','CT','Windsor','06095','UTC-5','801 Day Hill Rd.',289), -(193000000000000019,193000000000100019,'BFI1','BFI1','WA','Sumner','98390','UTC-8','1800 140th Avenue E.',208), -(193000000000000020,193000000000100020,'BFI3','BFI3','WA','Dupont','98327-9607','UTC-8','2700 Center Drive',207), -(193000000000000021,193000000000100021,'BFI7','BFI7','WA','Sumner','98390','UTC-8','1901 140th Ave E',206), -(193000000000000022,193000000000100022,'BJC1','BJC1','CO','AURORA','80019','UTC-7','6300 N Powhaton Road',11), -(193000000000000023,193000000000100023,'BNA1','BNA1','TN','Lebanon','37090','UTC-6','14840 Central Pike Suite 190',221), -(193000000000000024,193000000000100024,'BNA2','BNA2','TN','Lebanon','37090','UTC-6','500 Duke DR',131), -(193000000000000025,193000000000100025,'BNA3','BNA3','TN','Murfreesboro','37127','UTC-6','2020 Joe B Jackson Pkwy',140), -(193000000000000026,193000000000100026,'BNA4','BNA4','TN','Nashville','37217','UTC-6','50 airways Blvd',220), -(193000000000000027,193000000000100027,'BNA6','BNA6','TN','CLARKSVILLE','37040-5502','UTC-6','3875 GUTHRIE HWY',110), -(193000000000000028,193000000000100028,'BOS1','BOS1','NH','Nashua','03063','UTC-5','10 State St.',243), -(193000000000000029,193000000000100029,'BOS2','BOS2','MA','Drive Stoughton','02072','UTC-5','1000 Tech Centre',193), -(193000000000000030,193000000000100030,'BOS7','BOS7','MA','Fall River','02720','UTC-5','1180 Innovation Way',192), -(193000000000000031,193000000000100031,'BWI1','BWI1','VA','Sterling','20166-2058','UTC-5','45121 Global Plaza',242), -(193000000000000032,193000000000100032,'BWI2','BWI2','MD','Baltimore','21224','UTC-5','2010 Broening Hwy',241), -(193000000000000033,193000000000100033,'BWI4','BWI4','VA','CLEARBROOK','22624','UTC-5','165 Business Blvd',102), -(193000000000000034,193000000000100034,'CAE1','CAE1','SC','West Columbia','29172','UTC-5','4400 12TH STREET EXT',225), -(193000000000000035,193000000000100035,'CHA1','CHA1','TN','Chattanooga','37416','UTC-5','7200 Discovery Drive',223), -(193000000000000036,193000000000100036,'CHA2','CHA2','TN','Charleston','37310','UTC-5','225 Infinity Dr NW',222), -(193000000000000037,193000000000100037,'CHO1','CHO1','VA','FISHERSVILLE','22939','UTC-5','32 TRADER RD',75), -(193000000000000038,193000000000100038,'CLT2','CLT2','NC','Charlotte','28214-8082','UTC-5','10240 Old Dowd Rd',191), -(193000000000000039,193000000000100039,'CLT3','CLT3','NC','CONCORD','28027','UTC-5','6500 Davidson Hwy',114), -(193000000000000040,193000000000100040,'CMH2','CMH2','OH','Groveport','43125-9016','UTC-5','6050 Gateway Court',240), -(193000000000000041,193000000000100041,'CMH3','CMH3','OH','Monroe','45050-1848','UTC-5','700 GATEWAY BLVD',181), -(193000000000000042,193000000000100042,'CVG1','CVG1','KY','Hebron','41048','UTC-5','1155 Worldwide Blvd',262), -(193000000000000043,193000000000100043,'CVG2','CVG2','KY','Hebron','41048','UTC-5','1600 Worldwide Blvd',261), -(193000000000000044,193000000000100044,'CVG3','CVG3','KY','Hebron','41048','UTC-5','3680 Langley Dr.',260), -(193000000000000045,193000000000100045,'CVG5','CVG5','KY','Hebron','41048','UTC-5','2285 Litton Lane',259), -(193000000000000046,193000000000100046,'DCA6','DCA6','MD','BALTIMORE','21219','UTC-5','6001 Bethlehem Blvd',135), -(193000000000000047,193000000000100047,'DEN2','DEN2','CO','Aurora','80019','UTC-7','22205 East 19th Ave',123), -(193000000000000048,193000000000100048,'DEN8','DEN8','CO','Aurora','80018','UTC-7','21000 E 13th Ave',120), -(193000000000000049,193000000000100049,'DET1','DET1','MI','Livonia','48150-1543','UTC-5','39000 Amrhein Road',189), -(193000000000000050,193000000000100050,'DET2','DET2','MI','Shelby Township','48317-1318','UTC-5','50500 Mound Rd',182), -(193000000000000051,193000000000100051,'DFW5S','DFW5S','TX','Lancaster','75146','UTC-6','2500 E Belt Line Rd,',143), -(193000000000000052,193000000000100052,'DFW6','DFW6','TX','Coppell','75019','UTC-6','940 W Bethel Road',219), -(193000000000000053,193000000000100053,'DFW8','DFW8','TX','DFW Airport','75261','UTC-6','2700 Regent Blvd',217), -(193000000000000054,193000000000100054,'EWR4','EWR4','NJ','Robbinsville','08691','UTC-5','50 New Canton Way',256), -(193000000000000055,193000000000100055,'EWR5','EWR5','NJ','Avenel','07001','UTC-5','301 Blair Rd.',255), -(193000000000000056,193000000000100056,'EWR7','EWR7','NJ','Avenel','07001','UTC-5','301 Blair Rd.',254), -(193000000000000057,193000000000100057,'EWR9','EWR9','NJ','Carteret','07008','UTC-5','8003 Industrial Parkway',253), -(193000000000000058,193000000000100058,'FAT2','FAT2','CA','VISALIA','93291-1882','UTC-8','3315 N KELSEYST',117), -(193000000000000059,193000000000100059,'FOE1','FOE1','KS','KANSAS CITY','66109-3665','UTC-6','9400 LEAVENWORTH RD',176), -(193000000000000060,193000000000100060,'FTW1','FTW1','TX','Dallas','75241','UTC-6','33333 Lyndon B Johnson FREEWAY',212), -(193000000000000061,193000000000100061,'FTW2','FTW2','TX','Coppell','75019','UTC-6','2701 West Bethel Road',211), -(193000000000000062,193000000000100062,'FTW3','FTW3','TX','Fort Worth','76177-2517','UTC-6','15201 Heritage Pkwy',89), -(193000000000000063,193000000000100063,'FTW5','FTW5','TX','Forney','75126','UTC-6','1475 AKRON WAY',121), -(193000000000000064,193000000000100064,'FWA4','FWA4','IN','FORT WAYNE','46809-9771','UTC-5','9798 Smith Road',171), -(193000000000000065,193000000000100065,'GEG2','GEG2','WA','SPOKANE','99216','UTC-8','18007 E Garland Ave',151), -(193000000000000066,193000000000100066,'GEU2','GEU2','AZ','Glendale','85307','UTC-7','15301 West Northern Avenue',67), -(193000000000000067,193000000000100067,'GEU3','GEU3','AZ','BUCKEYE','85396','UTC-7','18900 W McDowell Road',78), -(193000000000000068,193000000000100068,'GEU5','GEU5','AZ','GOODYEAR','85395','UTC-7','4660 North Cotton Lane',68), -(193000000000000069,193000000000100069,'GSO1','GSO1','NC','KERNERSVILLE','27284','UTC-5','1656 OLD GREENSBORO RD',164), -(193000000000000070,193000000000100070,'GSP1','GSP1','SC','Spartanburg','29303','UTC-5','402 John Dodd Rd',224), -(193000000000000071,193000000000100071,'GYR2','GYR2','AZ','GOODYEAR','85395-7672','UTC-7','17341 W MINNEZONA AVE',188), -(193000000000000072,193000000000100072,'GYR3','GYR3','AZ','PHOENIX','85043-2356','UTC-7','8181 W ROOSEVELT ST',187), -(193000000000000073,193000000000100073,'HGR6','HGR6','MD','HAGERSTOWN','21740-7301','UTC-5','55 West Oak Ridge Drive',80), -(193000000000000074,193000000000100074,'HIA1','HIA1','PA','MIDDLETOWN','17057','UTC-5','3327 E Harrisburg Pik',87), -(193000000000000075,193000000000100075,'HLI2','HLI2','CA','HOLLISTER','95023','UTC-8','600 Ernie Drive',44), -(193000000000000076,193000000000100076,'HOU1','HOU1','TX','Humble','77338','UTC-6','8120 Humble Westfield Rd',216), -(193000000000000077,193000000000100077,'HOU2','HOU2','TX','Houston','77038-2324','UTC-6','10550 Ella Blvd.',215), -(193000000000000078,193000000000100078,'HOU3','HOU3','TX','Brookshire','77423','UTC-6','31555 Highway 90 E',214), -(193000000000000079,193000000000100079,'HOU8','HOU8','TX','FRESNO','77545','UTC-6','2303 Hurricane Lane',154), -(193000000000000080,193000000000100080,'HSV1','HSV1','AL','Madison','35756','UTC-6','7817 Greenbrier Road',142), -(193000000000000081,193000000000100081,'HSV2','HSV2','AL','MADISON','35756','UTC-6','28869 Fanning Dr NW',126), -(193000000000000082,193000000000100082,'IAH3','IAH3','TX','Houston','77032','UTC-6','15525 Milner Road',155), -(193000000000000083,193000000000100083,'IAZ1','IAZ1','AZ','GOODYEAR','85395-4515','UTC-7','4660 N COTTON LN 85395-4515 - GOODYEAR, AZ - United States',3), -(193000000000000084,193000000000100084,'ICT2','ICT2','KS','PARK CITY','67219','UTC-6','7130 N BROADWAY AVE',136), -(193000000000000085,193000000000100085,'IGA3','IGA3','GA','MACON','31216-6427','UTC-5','7001 Skipper Rd 31216-6427 MACON, GA - United States',2), -(193000000000000086,193000000000100086,'IGQ2','IGQ2','IL','University park','60484','UTC-6','23257 S. Central Avenue',152), -(193000000000000087,193000000000100087,'ILG1','ILG1','DE','NEW CASTLE','19720','UTC-5','780 S. DuPont Highway',119), -(193000000000000088,193000000000100088,'IMO1','IMO1','MO','LIBERTY','64068-8933','UTC-6','2361 S Withers RD',10), -(193000000000000089,193000000000100089,'IMS1','IMS1','MS','OLIVE BRANCH','38654','UTC-6','IMS1-11505 Progress Way,38654-2510,OLIVE BRANCH,MS,US',6), -(193000000000000090,193000000000100090,'INC1','INC1','NC','FAYETTEVILLE','28303-2215','UTC-5','6309 Bragg Blvd 28303-2215 - FAYETTEVILLE, NC - United States',5), -(193000000000000091,193000000000100091,'IND2','IND2','IN','Plainfield','46168-7442','UTC-5','715 Airtech Pkwy',88), -(193000000000000092,193000000000100092,'IND4','IND4','IN','Indianapolis','46231','UTC-5','710 S. Girls School Rd',276), -(193000000000000093,193000000000100093,'IND5','IND5','IN','Plainfield','46168','UTC-5','800 Perry Road',275), -(193000000000000094,193000000000100094,'IND6','IND6','IN','Jeffersonville','47130','UTC-5','1453 E 10th St',274), -(193000000000000095,193000000000100095,'IND9','IND9','IN','GREENWOOD','46143-7830','UTC-5','1151 S GRAHAM RD',173), -(193000000000000096,193000000000100096,'ITX3','ITX3','TX','AMARILLO','79108-7749','UTC-6','ITX3-8590 NE 24th Ave,79108-7749,AMARILLO,TX,US',9), -(193000000000000097,193000000000100097,'IUSF','IUSF','TX','DALLAS','75241','UTC-6','3351 Balmorhea Dr',22), -(193000000000000098,193000000000100098,'IUSJ','IUSJ','CA','BEAUMONT','92223','UTC-8','36900 West 4th Street',69), -(193000000000000099,193000000000100099,'IUSP','IUSP','CA','HESPERIA,','92344','UTC-8','8140 Caliente Rd',74), -(193000000000000100,193000000000100100,'IUSQ','IUSQ','CA','REDLANDS','92374','UTC-8','2125 W San Bernardino Ave',70), -(193000000000000101,193000000000100101,'IUSR','IUSR','SC','COWPENS','29330','UTC-5','1120 Mt Olive Rd',40), -(193000000000000102,193000000000100102,'IUST','IUST','PA','GREENCASTLE','17225','UTC-5','3PL AWD (Greencastle, PA, US) 15651 Greenmount RdGREENCASTLE, PA 17225 United States',39), -(193000000000000103,193000000000100103,'IUSW','IUSW','CA','Hesperia','92344','UTC-8','8130 Caliente Rd 92344 - Hesperia, CA - United States',33), -(193000000000000104,193000000000100104,'IUTE','IUTE','AZ','GOODYEAR','85338','UTC-7','16155 W Elwood St',21), -(193000000000000105,193000000000100105,'IUTJ','IUTJ','CA','Fontana','92335','UTC-8','9253 Dreamland Drive 92335 - Fontana, CA - United',8), -(193000000000000106,193000000000100106,'IUTL','IUTL','CA','Moreno Valley','92551','UTC-8','24405 Krameria Ave 92551 - Moreno Valley, CA - United States',7), -(193000000000000107,193000000000100107,'IWA6','IWA6','WA','PASCO','99301-6161','UTC-8','1202 S Road 40 E 99301-6161 - PASCO, WA - United States',4), -(193000000000000108,193000000000100108,'JOT1','JOT1','CA','SAN BERNARDINO','92408','UTC-8','1494 S WATERMAN AVE',72), -(193000000000000109,193000000000100109,'JVL1','JVL1','WI','BELOIT','53511','UTC-6','1255 Gateway Blvd',150), -(193000000000000110,193000000000100110,'KRB4','KRB4','CA','PERRIS','92571-9722','UTC-8','4501 PATTERSON AVE',178), -(193000000000000111,193000000000100111,'KY1','KY1','KY','Shepherdsville','40165','UTC-5','120 Velocity Way.,',161), -(193000000000000112,193000000000100112,'LAN2','LAN2','MI','LANSING','48917','UTC-5','6500 W Mt Hope Hwy',100), -(193000000000000113,193000000000100113,'LAS1','LAS1','NV','HENDERSON','89044','UTC-8','12300 Bermuda Road',247), -(193000000000000114,193000000000100114,'LAS2','LAS2','NV','Las Vegas','89030','UTC-8','3837 Bay Lake Trail, Suite 111 North',246), -(193000000000000115,193000000000100115,'LAS6','LAS6','NV','Las Vegas','89115','UTC-8','4550 Nexus Way',132), -(193000000000000116,193000000000100116,'LAX2T','LAX2T','CA','CHINO','91708','UTC-8','6730 Kimball Ave',162), -(193000000000000117,193000000000100117,'LAX9','LAX9','CA','FONTANA','92337','UTC-8','11263 Oleander Ave',183), -(193000000000000118,193000000000100118,'LBE1','LBE1','PA','Greensburg','15605','UTC-5','165 Glen Fox Road',86), -(193000000000000119,193000000000100119,'LEX1','LEX1','KY','Lexington','40511','UTC-5','1850 Mercer RD',268), -(193000000000000120,193000000000100120,'LEX2','LEX2','KY','Lexington','40511','UTC-5','172 Trade St.',267), -(193000000000000121,193000000000100121,'LFT1','LFT1','LA','CARENCRO','70520-5976','UTC-6','3550 NE EVANGELINE TRWY',107), -(193000000000000122,193000000000100122,'LGB3','LGB3','CA','Eastvale','91752','UTC-8','4950 Goodman Way',291), -(193000000000000123,193000000000100123,'LGB4','LGB4','CA','Redlands','92374','UTC-8','27517 Pioneer Avenue',292), -(193000000000000124,193000000000100124,'LGB6','LGB6','CA','Riverside','92518-1513','UTC-8','20901 Krameria Ave',293), -(193000000000000125,193000000000100125,'LGB8','LGB8','CA','Rialto','92376','UTC-8','1568 N Linden Ave',294), -(193000000000000126,193000000000100126,'LIT2','LIT2','AR','NORTH LITTLE ROCK','72117','UTC-6','13001 HIGHWAY 70',106), -(193000000000000127,193000000000100127,'MCC1','MCC1','CA','RANCHO CORDOVA','95742','UTC-8','3300 Rancho Cordova Pkwy 95742 - RANCHO CORDOVA, CA - United States',32), -(193000000000000128,193000000000100128,'MCE1','MCE1','CA','TURLOCK','95380','UTC-8','FULKERTH RD',157), -(193000000000000129,193000000000100129,'MCI1','MCI1','KS','Lenexa','66219','UTC-6','113th St & Renner Blvd.',271), -(193000000000000130,193000000000100130,'MCI4','MCI4','MO','KANSAS CITY','64163','UTC-6','MCI4 - 10501 NW 136th Street',12), -(193000000000000131,193000000000100131,'MCO2','MCO2','FL','Deltona','32725-2610','UTC-5','2600 N Normandy Blvd',115), -(193000000000000132,193000000000100132,'MDT1','MDT1','PA','Carlisle','17015','UTC-5','2Ames Drive',230), -(193000000000000133,193000000000100133,'MDT4','MDT4','PA','York','17408','UTC-5','5125 Commerce Drive',128), -(193000000000000134,193000000000100134,'MDW2','MDW2','IL','Joliet','60433-3280','UTC-6','250 Emerald Drive',200), -(193000000000000135,193000000000100135,'MDW6','MDW6','IL','ROMEOVILLE','60446-6529','UTC-6','1125 W REMINGTON BLVD ROMEOVILLE',199), -(193000000000000136,193000000000100136,'MDW7','MDW7','IL','Monee','60449','UTC-6','6605 Monee Manhattan Road',198), -(193000000000000137,193000000000100137,'MDW8','MDW8','IL','Waukegan','60085','UTC-6','1750 Bridge Drive',197), -(193000000000000138,193000000000100138,'MDW9','MDW9','IL','Aurora','60502','UTC-6','2865 Duke Parkway',196), -(193000000000000139,193000000000100139,'MEM1','MEM1','TN','Memphis','38118','UTC-6','3292 E Holmes Rd',163), -(193000000000000140,193000000000100140,'MEM6','MEM6','MS','OLIVE BRANCH','38654','UTC-6','11505 Progress Way',118), -(193000000000000141,193000000000100141,'MGE3','MGE3','GA','Jefferson','30549-2010','UTC-5','808 Hog Mountain Road',201), -(193000000000000142,193000000000100142,'MIT2','MIT2','CA','SHAFTER','93263','UTC-8','5408 Express Avenue',77), -(193000000000000143,193000000000100143,'MKC4','MKC4','KS','Edgerton','66021-9588','UTC-6','19645 Waverly Rd',270), -(193000000000000144,193000000000100144,'MKC6','MKC6','KS','Kansas City','66102','UTC-6','6925 Riverview Avenue',269), -(193000000000000145,193000000000100145,'MKE1','MKE1','WI','Kenosha','53144','UTC-6','3501 120th Ave',203), -(193000000000000146,193000000000100146,'MQJ1','MQJ1','IN','GREENFIELD','46140','UTC-5','4412 W 300 RD N',94), -(193000000000000147,193000000000100147,'MSP1','MSP1','MN','Shakopee','55379','UTC-6','2601 4th Avenue East',190), -(193000000000000148,193000000000100148,'NJ3','NJ3','NJ','Pedricktown','08067','UTC-5','3 Sorbello Way',17), -(193000000000000149,193000000000100149,'OAK3','OAK3','CA','Patterson','95363-8876','UTC-8','255 Park Center Drive',299), -(193000000000000150,193000000000100150,'OAK4','OAK4','CA','Tracy','95304-9370','UTC-8','1555 N. Chrisman Rd',300), -(193000000000000151,193000000000100151,'OKC2','OKC2','OK','OKLAHOMA CITY','73159','UTC-6','8991 S PORTLAND AVENUE',133), -(193000000000000152,193000000000100152,'OLM1','OLM1','WA','OLYMPIA','98516','UTC-8','3300 HOGUM BAY RD NE 98516-3111 - OLYMPIA, WA - United States',19), -(193000000000000153,193000000000100153,'ONT2','ONT2','CA','San Bernardino','92408','UTC-8','1910 E Central Ave',303), -(193000000000000154,193000000000100154,'ONT6','ONT6','CA','Moreno Valley','92551-9561','UTC-8','24208 San Michele Rd',302), -(193000000000000155,193000000000100155,'ONT8','ONT8','CA','Moreno Valley','92551-9534','UTC-8','24300 Nandina Ave',301), -(193000000000000156,193000000000100156,'ONT9','ONT9','CA','Redlands','92374','UTC-8','2125 W. San Bernandino Ave',298), -(193000000000000157,193000000000100157,'ORD2','ORD2','IL','CHANNAHON','60410-8758','UTC-6','23714 W Amoco Rd',103), -(193000000000000158,193000000000100158,'ORD6','ORD6','IL','Wood Dale','60191','UTC-6','1250 N Mittel Blvd',195), -(193000000000000159,193000000000100159,'ORF2','ORF2','VA','CHESAPEAKE','23321-1425','UTC-5','ORF2 - 5045 PORTSMOUTH BLVD',113), -(193000000000000160,193000000000100160,'PBI3','PBI3','FL','Jacksonville','32206','UTC-5','21 Jump Street',81), -(193000000000000161,193000000000100161,'PDX7','PDX7','OR','Salem','97317','UTC-8','4775 Depot Ct SE',127), -(193000000000000162,193000000000100162,'PHL1','PHL1','DE','New Castle','19720','UTC-5','1 Centerpoint Blvd.',288), -(193000000000000163,193000000000100163,'PHL3','PHL3','DE','New Castle','19720','UTC-5','1600 Johnson Way',287), -(193000000000000164,193000000000100164,'PHL4','PHL4','PA','Carlisle','17015','UTC-5','21 Roadway Dr',236), -(193000000000000165,193000000000100165,'PHL5','PHL5','PA','Lewisberry','17339','UTC-5','500 McCarthy Dr',235), -(193000000000000166,193000000000100166,'PHL5S','PHL5S','PA','Greencastle','17225','UTC-5','1915 Ebberts Spg Ct, Greencastle, PA 17225',20), -(193000000000000167,193000000000100167,'PHL6','PHL6','PA','Carlisle','17015','UTC-5','675 Allen Rd.',234), -(193000000000000168,193000000000100168,'PHL7','PHL7','DE','Middletown','19709','UTC-5','560 Merrimac Ave',286), -(193000000000000169,193000000000100169,'PHL8','PHL8','DE','Middletown','19709','UTC-5','727 N Broad St',285), -(193000000000000170,193000000000100170,'PHX3','PHX3','AZ','Phoenix','85043','UTC-7','6835 West Buckeye Road',307), -(193000000000000171,193000000000100171,'PHX5','PHX5','AZ','Goodyear','85338','UTC-7','16920 W Commerce Drive',306), -(193000000000000172,193000000000100172,'PHX6','PHX6','AZ','Phoenix','85043','UTC-7','4750 West Mohave St',305), -(193000000000000173,193000000000100173,'PHX7','PHX7','AZ','Phoenix','85043','UTC-7','800 N 75th Ave',304), -(193000000000000174,193000000000100174,'PIT1','PIT1','PA','Pittsburgh','15205','UTC-5','2250 Roswell Drive',229), -(193000000000000175,193000000000100175,'PIT2','PIT2','PA','IMPERIAL','15126-1002','UTC-5','1200 Westport Rd',158), -(193000000000000176,193000000000100176,'POC1','POC1','CA','FONTANA','92336-1123','UTC-8','4121 LYTLE CREEK RD',46), -(193000000000000177,193000000000100177,'POC2','POC2','CA','ONTARIO','91761','UTC-8','4000 South Hamner Avenue',38), -(193000000000000178,193000000000100178,'POC3','POC3','CA','JURUPA VALLEY','92509','UTC-8','6120 Clinker Drive',45), -(193000000000000179,193000000000100179,'PPO4','PPO4','IN','MERRILLVILLE','46410','UTC-6','9850 Mississippi Street',49), -(193000000000000180,193000000000100180,'PSC2','PSC2','WA','PASCO','99301','UTC-8','1351 S Road 40 E',93), -(193000000000000181,193000000000100181,'PSP3','PSP3','CA','DESERT HOT SPRINGS','92240','UTC-8','64165 19th AVE',28), -(193000000000000182,193000000000100182,'QXY5','QXY5','CA','STOCKTON','95215','UTC-8','4532 NEWCASTLE RD',71), -(193000000000000183,193000000000100183,'QXY8','QXY8','CA','FRESNO','93725-1962','UTC-8','3611 S NORTHPOINTE DR',35), -(193000000000000184,193000000000100184,'QZZ7','QZZ7','AZ','MESA','85212-9608','UTC-7','8560 E ELLIOT RD',14), -(193000000000000185,193000000000100185,'RDU2','RDU2','NC','Smithfield','27577','UTC-5','2150 US HWY 70 Business West',146), -(193000000000000186,193000000000100186,'RDU4','RDU4','NC','FAYETTEVILLE','28303','UTC-5','6309 Bragg Blvd',95), -(193000000000000187,193000000000100187,'RFD2','RFD2','IL','Huntley','60142','UTC-6','11500 Freeman Road',145), -(193000000000000188,193000000000100188,'RFD4','RFD4','IL','HUNTLEY','60142','UTC-6','11400 Venture Court 60142-8075 - HUNTLEY, IL - United States',16), -(193000000000000189,193000000000100189,'RIC1','RIC1','VA','Petersburg','23803','UTC-5','5000 Commerce Way',210), -(193000000000000190,193000000000100190,'RIC2','RIC2','VA','Chester','23836','UTC-5','1901 Meadowville Technology Pkwy',209), -(193000000000000191,193000000000100191,'RMN3','RMN3','VA','Fredericksburg','22406','UTC-5','220 Centreport Parkway',144), -(193000000000000192,193000000000100192,'RNO1','RNO1','NV','Fernley','89408','UTC-8','1600 East Newlands RD',248), -(193000000000000193,193000000000100193,'RNO2','RNO2','NV','Reno','85906','UTC-8','8000 North Virginia Street',245), -(193000000000000194,193000000000100194,'RNO4','RNO4','NV','Reno','89506','UTC-8','8000 North Virginia Street',244), -(193000000000000195,193000000000100195,'RYY2','RYY2','GA','White','30184','UTC-5','1250 Cassville White Road,',73), -(193000000000000196,193000000000100196,'SAT1','SAT1','TX','Schertz','78154-1461','UTC-6','6000 Enterprise Avenue',218), -(193000000000000197,193000000000100197,'SAT4','SAT4','TX','SAN ANTONIO','78245','UTC-6','10384 W US HIGHWAY 90',149), -(193000000000000198,193000000000100198,'SAT6','SAT6','TX','SAN MARCOS','78666','UTC-6','1346 Fortuna Road 78666-0001 - SAN MARCOS, TX - United States',15), -(193000000000000199,193000000000100199,'SAV3','SAV3','GA','Macon','31216-6427','UTC-5','7001 Skipper Rd',98), -(193000000000000200,193000000000100200,'SBD1','SBD1','CA','BLOOMINGTON','92316-3819','UTC-8','3388 S Cactus Ave',185), -(193000000000000201,193000000000100201,'SBD2','SBD2','CA','SAN BERNARDINO','92408-2805','UTC-8','1494 S WATERMAN AVE',179), -(193000000000000202,193000000000100202,'SCK1','SCK1','CA','STOCKTON','95215','UTC-8','4532 NEWCASTLE RD',97), -(193000000000000203,193000000000100203,'SCK3','SCK3','CA','MANTECA','95336','UTC-8','3565 N AIRPORT WAY MANTECA',60), -(193000000000000204,193000000000100204,'SCK4','SCK4','CA','STOCKTON','95215-8354','UTC-8','6001 S AUSTIN RD',186), -(193000000000000205,193000000000100205,'SCK8','SCK8','CA','OAKLEY','94561-2677','UTC-8','4700 WILBUR AVE',104), -(193000000000000206,193000000000100206,'SDF1','SDF1','KY','Campbellsville','42718','UTC-5','1050 South Columbia AVE',266), -(193000000000000207,193000000000100207,'SDF2','SDF2','KY','Watterson Park','40218','UTC-5','4360 Robards Ln',265), -(193000000000000208,193000000000100208,'SDF4','SDF4','KY','Shepherdsville','40165','UTC-5','376 Zappos.com Blvd',264), -(193000000000000209,193000000000100209,'SDF6','SDF6','KY','Shepherdsville','40165','UTC-5','271 Omega Pkwy',263), -(193000000000000210,193000000000100210,'SDF7','SDF7','KY','Shepherdsville','40165','UTC-5','300 Omicron Court',258), -(193000000000000211,193000000000100211,'SDF8','SDF8','IN','Jeffersonville','47130','UTC-5','900 Patrol Rd',273), -(193000000000000212,193000000000100212,'SDF9','SDF9','KY','Shepherdsville','40165','UTC-5','100 W. Thomas P. Echols Lane',257), -(193000000000000213,193000000000100213,'SEA6','SEA6','WA','South Seattle','98144','UTC-8','2646 Rainier Ave.',205), -(193000000000000214,193000000000100214,'SEA8','SEA8','WA','Northeast Bellevue','98005','UTC-8','1475 124th Avenue',204), -(193000000000000215,193000000000100215,'SJC7','SJC7','CA','Tracy','95377-8906','UTC-8','188 Mountain House Parkway',295), -(193000000000000216,193000000000100216,'SLC2','SLC2','UT','West Jordan','84081','UTC-7','7148 W. Old Bingham Hwy',153), -(193000000000000217,193000000000100217,'SLC3','SLC3','UT','SALT LAKE CITY','84116-4413','UTC-7','355 N JOHN GLENN RD',13), -(193000000000000218,193000000000100218,'SMF3','SMF3','CA','Stockton','95206-8202','UTC-8','3923 S B ST',184), -(193000000000000219,193000000000100219,'SMF6','SMF6','CA','SACRAMENTO','95837-9109','UTC-8','4930 ALLBAUGH DR',105), -(193000000000000220,193000000000100220,'SNA4','SNA4','CA','Rialto','92376-3009','UTC-8','2496 W Walnut Ave',296), -(193000000000000221,193000000000100221,'STL3','STL3','MO','REPUBLIC','65738-2779','UTC-6','3200 E SAWYER RD',109), -(193000000000000222,193000000000100222,'STL4','STL4','IL','Edwardsville','62025-2815','UTC-6','3050 GATEWAY COMMERCE CENTER DR S',194), -(193000000000000223,193000000000100223,'SWF1','SWF1','NY','ROCK TAVERN','12575','UTC-5','635 INTERNATIONAL BLVD',122), -(193000000000000224,193000000000100224,'SWF2','SWF2','NY','Hopewell Junction','12533','UTC-5','76 Patriot Way Hopewell Junction',76), -(193000000000000225,193000000000100225,'TCY1','TCY1','CA','STOCKTON','95206','UTC-8','2690 East Arch Airport Road',41), -(193000000000000226,193000000000100226,'TCY2','TCY2','CA','STOCKTON','95215','UTC-8','6201 Newcastle Rd',43), -(193000000000000227,193000000000100227,'TEB3','TEB3','NJ','Logan Township','08085','UTC-5','2651 Oldmans Creek Rd',250), -(193000000000000228,193000000000100228,'TEB4','TEB4','NJ','PENNS GROVE','08069','UTC-5','747 COURSES LANDING RD',130), -(193000000000000229,193000000000100229,'TEB6','TEB6','NJ','Cranbury','08512','UTC-5','22 Hightstown Cranbury State Road',249), -(193000000000000230,193000000000100230,'TEB9','TEB9','NJ','Somerset','08873','UTC-5','601 Randolph Road',156), -(193000000000000231,193000000000100231,'TMB8','TMB8','FL','HOMESTEAD','33032-8597','UTC-5','27505 SW 132nd AVE',65), -(193000000000000232,193000000000100232,'TOL3','TOL3','OH','PERRYSBURG','43551','UTC-5','9240 Fremont Pike 43551-4210 - PERRYSBURG, OH - United States',18), -(193000000000000233,193000000000100233,'TPA1','TPA1','FL','Ruskin','33570','UTC-5','3350 Laurel Ridge Ave.',284), -(193000000000000234,193000000000100234,'TPA2','TPA2','FL','Lakeland','33811','UTC-5','1760 County Line Rd',283), -(193000000000000235,193000000000100235,'TPA3','TPA3','FL','Auburndale','33823','UTC-5','676 C. Fred Jones Boulevard',124), -(193000000000000236,193000000000100236,'TUL1','TUL1','KS','Coffeyville','67337','UTC-6','2654 North Highway 169',272), -(193000000000000237,193000000000100237,'VGT2','VGT2','NV','LAS VEGAS','89115-2013','UTC-8','6401 Howdy Wells Ave',172), -(193000000000000238,193000000000100238,'VUBA','VUBA','PA','Scranton','18512','UTC-5','1000 Keystone Industrial Park',228), -(193000000000000239,193000000000100239,'VUGA','VUGA','PA','Pittston','18643','UTC-5','508 Delaware Avenue West',227), -(193000000000000240,193000000000100240,'WBW2','WBW2','PA','OLYPHANT','18447','UTC-5','1300 Corporate Way',82), -(193000000000000241,193000000000100241,'XAV3','XAV3','GA','PORT WENTWORTH','31407','UTC-5','XAV3-120Crossgate Dr 31407-Port Wentworth, GA- United States',36), -(193000000000000242,193000000000100242,'XEW5','XEW5','NJ','Cinnaminson','08077-2015','UTC-5','995 Taylors Ln 08077-2015',37), -(193000000000000243,193000000000100243,'XIN5','XIN5','IN','Avon','46123-1700','UTC-5','8838 E COUNTY ROAD 100 S',25), -(193000000000000244,193000000000100244,'XLX1','XLX1','MD','HAGERSTOWN','21740','UTC-5','1115 Wesel Blvd HAGERSTOWN,MD 21740,USA',34), -(193000000000000245,193000000000100245,'XLX6','XLX6','NC','PINEVILLE','28134','UTC-5','12220 Carolina Logistics Drive PINEVILLE,NC 28134,USA',23), -(193000000000000246,193000000000100246,'XLX7','XLX7','CA','VICTORVILLE','92394','UTC-8','18580 Gateway Dr,Victorville,CA 92394,USA',63), -(193000000000000247,193000000000100247,'XPB2','XPB2','FL','APOPKA','32712','UTC-5','XPB2 - 4661 Apopka Logistics Pkwy 32712 - Apopka, FL - United States',26), -(193000000000000248,193000000000100248,'XRI3','XRI3','VA','Richmond','23234','UTC-5','4949 Commerce Rd, Richmond, VA 23234',24), -(193000000000000249,193000000000100249,'XUSB','XUSB','TX','Fort Worth','76155','UTC-6','14900 Frye Rd.',213), -(193000000000000250,193000000000100250,'XUSC','XUSC','PA','Carlisle','17013','UTC-5','40 Logistics Drive',226), -(193000000000000251,193000000000100251,'XUSD','XUSD','CA','Stockton','95206','UTC-8','1909 Zephyr St',297), -(193000000000000252,193000000000100252,'XUSE','XUSE','IN','Whitestown','46075','UTC-5','5100 S Indianapolis Rd',280); +(193000000000000001,193000000000100001,'ABE2','ABE2',NULL,'PA','Breinigsville','18031','UTC-5','705 Boulder Drive',246), +(193000000000000002,193000000000100002,'ABE3','ABE3',NULL,'PA','Breinigsville','18031','UTC-5','650 Boulder Drive',245), +(193000000000000003,193000000000100003,'ABE4','ABE4','126','PA','Easton','18045','UTC-5','1610 Van Buren Road',142), +(193000000000000004,193000000000100004,'ABE5','ABE5',NULL,'PA','Harrisburg','17112','UTC-5','6455 Allentown Boulevard',239), +(193000000000000005,193000000000100005,'ABE8','ABE8','39','NJ','Florence','08518','UTC-5','401 Independence Road 08518-2200',133), +(193000000000000253,193000000000100253,'ABE8-309','ABE8-309',NULL,'NJ','Florence','08518-2802','UTC-5','309 Cedar Lane',259), +(193000000000000254,193000000000100254,'ABE8-401','ABE8-401',NULL,'NJ','Florence','08518','UTC-5','401 Independence Road',260), +(193000000000000006,193000000000100006,'ABQ2','ABQ2','76','NM','LOS LUNAS','87031','UTC-7','6251 Pioneer Trail NW',107), +(193000000000000255,193000000000100255,'ABQ2-UPS','ABQ2-UPS',NULL,'AZ','GOODYEAR','85395','UTC-7','16601 W. SELLS DRIVE',104), +(193000000000000007,193000000000100007,'ACY2','ACY2','101','NJ','BURLINGTON','08016','UTC-5','1101 E PEARL ST',92), +(193000000000000008,193000000000100008,'AFW1','AFW1',NULL,'TX','FORT WORTH','76131','UTC-6','1851 NE LOOP 820',149), +(193000000000000009,193000000000100009,'AFW5','AFW5','181','TX','BALCH SPRINGS','75180-1636','UTC-6','12374 LAKE JUNE RD',35), +(193000000000000010,193000000000100010,'AKR1','AKR1','153','OH','Canton','44705','UTC-5','4747 Rebar Ave NE',156), +(193000000000000011,193000000000100011,'ALB1','ALB1','102','NY','Castleton','12033-9634','UTC-5','1835 US Route 9',182), +(193000000000000012,193000000000100012,'AMA1','AMA1','132','TX','Amarillo','79108','UTC-6','8590 NE 24th Avenue',137), +(193000000000000256,193000000000100256,'ATL1','ATL1','200','GA','Atlanta','30349','UTC-5','ATL1, 6055 S Fulton Pkwy, Atlanta, GA, 30349',2), +(193000000000000257,193000000000100257,'ATL1-WALMART','ATL1-WALMART',NULL,'GA','Atlanta','30349','UTC-5','6055 S Fulton Pkwy,',146), +(193000000000000013,193000000000100013,'ATL2N','ATL2N','157','GA','Carrollton','30117','UTC-5','3101 N. Highway 27',39), +(193000000000000014,193000000000100014,'ATL3','ATL3',NULL,'GA','Pendergrass','30567','UTC-5','445 Valentine Industrial Parkway',155), +(193000000000000015,193000000000100015,'ATL6','ATL6',NULL,'GA','East Point','30344','UTC-5','4200 North Commerce',210), +(193000000000000016,193000000000100016,'AVP1','AVP1','70','PA','Hazle Township','18202-9361','UTC-5','550 Oak Ridge Road',241), +(193000000000000017,193000000000100017,'AVP3','AVP3',NULL,'PA','GOULDSBORO','18424-9492','UTC-5','298 1ST AVE',240), +(193000000000000258,193000000000100258,'AZA4','AZA4','16','','','','','',72), +(193000000000000018,193000000000100018,'BDL1','BDL1',NULL,'CT','Windsor','06095','UTC-5','801 Day Hill Rd.',297), +(193000000000000019,193000000000100019,'BFI1','BFI1',NULL,'WA','Sumner','98390','UTC-8','1800 140th Avenue E.',216), +(193000000000000020,193000000000100020,'BFI3','BFI3','34','WA','Dupont','98327-9607','UTC-8','2700 Center Drive',215), +(193000000000000021,193000000000100021,'BFI7','BFI7',NULL,'WA','Sumner','98390','UTC-8','1901 140th Ave E',214), +(193000000000000022,193000000000100022,'BJC1','BJC1','186','CO','AURORA','80019','UTC-7','6300 N Powhaton Road',19), +(193000000000000023,193000000000100023,'BNA1','BNA1',NULL,'TN','Lebanon','37090','UTC-6','14840 Central Pike Suite 190',229), +(193000000000000024,193000000000100024,'BNA2','BNA2','37','TN','Lebanon','37090','UTC-6','500 Duke DR',139), +(193000000000000025,193000000000100025,'BNA3','BNA3',NULL,'TN','Murfreesboro','37127','UTC-6','2020 Joe B Jackson Pkwy',148), +(193000000000000026,193000000000100026,'BNA4','BNA4',NULL,'TN','Nashville','37217','UTC-6','50 airways Blvd',228), +(193000000000000027,193000000000100027,'BNA6','BNA6','99','TN','CLARKSVILLE','37040-5502','UTC-6','3875 GUTHRIE HWY',118), +(193000000000000028,193000000000100028,'BOS1','BOS1',NULL,'NH','Nashua','03063','UTC-5','10 State St.',251), +(193000000000000029,193000000000100029,'BOS2','BOS2',NULL,'MA','Drive Stoughton','02072','UTC-5','1000 Tech Centre',201), +(193000000000000030,193000000000100030,'BOS7','BOS7','103','MA','Fall River','02720','UTC-5','1180 Innovation Way',200), +(193000000000000031,193000000000100031,'BWI1','BWI1',NULL,'VA','Sterling','20166-2058','UTC-5','45121 Global Plaza',250), +(193000000000000032,193000000000100032,'BWI2','BWI2',NULL,'MD','Baltimore','21224','UTC-5','2010 Broening Hwy',249), +(193000000000000033,193000000000100033,'BWI4','BWI4','150','VA','CLEARBROOK','22624','UTC-5','165 Business Blvd',110), +(193000000000000034,193000000000100034,'CAE1','CAE1',NULL,'SC','West Columbia','29172','UTC-5','4400 12TH STREET EXT',233), +(193000000000000259,193000000000100259,'CEG2','CEG2','79','','','','','',64), +(193000000000000035,193000000000100035,'CHA1','CHA1',NULL,'TN','Chattanooga','37416','UTC-5','7200 Discovery Drive',231), +(193000000000000036,193000000000100036,'CHA2','CHA2','66','TN','Charleston','37310','UTC-5','225 Infinity Dr NW',230), +(193000000000000037,193000000000100037,'CHO1','CHO1','120','VA','FISHERSVILLE','22939','UTC-5','32 TRADER RD',83), +(193000000000000038,193000000000100038,'CLT2','CLT2','59','NC','Charlotte','28214-8082','UTC-5','10240 Old Dowd Rd',199), +(193000000000000039,193000000000100039,'CLT3','CLT3','104','NC','CONCORD','28027','UTC-5','6500 Davidson Hwy',122), +(193000000000000260,193000000000100260,'CMH1-11999','CMH1-11999',NULL,'OH','Etna','43062-7793','UTC-5','11999 National Road SW',247), +(193000000000000040,193000000000100040,'CMH2','CMH2','123','OH','Groveport','43125-9016','UTC-5','6050 Gateway Court',248), +(193000000000000041,193000000000100041,'CMH3','CMH3','32','OH','Monroe','45050-1848','UTC-5','700 GATEWAY BLVD',189), +(193000000000000042,193000000000100042,'CVG1','CVG1',NULL,'KY','Hebron','41048','UTC-5','1155 Worldwide Blvd',270), +(193000000000000043,193000000000100043,'CVG2','CVG2',NULL,'KY','Hebron','41048','UTC-5','1600 Worldwide Blvd',269), +(193000000000000044,193000000000100044,'CVG3','CVG3',NULL,'KY','Hebron','41048','UTC-5','3680 Langley Dr.',268), +(193000000000000045,193000000000100045,'CVG5','CVG5',NULL,'KY','Hebron','41048','UTC-5','2285 Litton Lane',267), +(193000000000000046,193000000000100046,'DCA6','DCA6','135','MD','BALTIMORE','21219','UTC-5','6001 Bethlehem Blvd',143), +(193000000000000047,193000000000100047,'DEN2','DEN2','107','CO','Aurora','80019','UTC-7','22205 East 19th Ave',131), +(193000000000000048,193000000000100048,'DEN8','DEN8','73','CO','Aurora','80018','UTC-7','21000 E 13th Ave',128), +(193000000000000049,193000000000100049,'DET1','DET1','118','MI','Livonia','48150-1543','UTC-5','39000 Amrhein Road',197), +(193000000000000050,193000000000100050,'DET2','DET2','136','MI','Shelby Township','48317-1318','UTC-5','50500 Mound Rd',190), +(193000000000000051,193000000000100051,'DFW5S','DFW5S',NULL,'TX','Lancaster','75146','UTC-6','2500 E Belt Line Rd,',151), +(193000000000000052,193000000000100052,'DFW6','DFW6','105','TX','Coppell','75019','UTC-6','940 W Bethel Road',227), +(193000000000000053,193000000000100053,'DFW8','DFW8',NULL,'TX','DFW Airport','75261','UTC-6','2700 Regent Blvd',225), +(193000000000000054,193000000000100054,'EWR4','EWR4',NULL,'NJ','Robbinsville','08691','UTC-5','50 New Canton Way',264), +(193000000000000055,193000000000100055,'EWR5','EWR5',NULL,'NJ','Avenel','07001','UTC-5','301 Blair Rd.',263), +(193000000000000056,193000000000100056,'EWR7','EWR7',NULL,'NJ','Avenel','07001','UTC-5','301 Blair Rd.',262), +(193000000000000057,193000000000100057,'EWR9','EWR9',NULL,'NJ','Carteret','07008','UTC-5','8003 Industrial Parkway',261), +(193000000000000058,193000000000100058,'FAT2','FAT2','43','CA','VISALIA','93291-1882','UTC-8','3315 N KELSEYST',125), +(193000000000000261,193000000000100261,'FEDEX','FEDEX','12','','','92337','','10767',55), +(193000000000000059,193000000000100059,'FOE1','FOE1','117','KS','KANSAS CITY','66109-3665','UTC-6','9400 LEAVENWORTH RD',184), +(193000000000000060,193000000000100060,'FTW1','FTW1','24','TX','Dallas','75241','UTC-6','33333 Lyndon B Johnson FREEWAY',220), +(193000000000000061,193000000000100061,'FTW2','FTW2',NULL,'TX','Coppell','75019','UTC-6','2701 West Bethel Road',219), +(193000000000000062,193000000000100062,'FTW3','FTW3',NULL,'TX','Fort Worth','76177-2517','UTC-6','15201 Heritage Pkwy',97), +(193000000000000063,193000000000100063,'FTW5','FTW5','48','TX','Forney','75126','UTC-6','1475 AKRON WAY',129), +(193000000000000064,193000000000100064,'FWA4','FWA4','58','IN','FORT WAYNE','46809-9771','UTC-5','9798 Smith Road',179), +(193000000000000065,193000000000100065,'GEG2','GEG2','108','WA','SPOKANE','99216','UTC-8','18007 E Garland Ave',159), +(193000000000000066,193000000000100066,'GEU2','GEU2','97','AZ','Glendale','85307','UTC-7','15301 West Northern Avenue',75), +(193000000000000067,193000000000100067,'GEU3','GEU3','81','AZ','BUCKEYE','85396','UTC-7','18900 W McDowell Road',86), +(193000000000000068,193000000000100068,'GEU5','GEU5','100','AZ','GOODYEAR','85395','UTC-7','4660 North Cotton Lane',76), +(193000000000000069,193000000000100069,'GSO1','GSO1','131','NC','KERNERSVILLE','27284','UTC-5','1656 OLD GREENSBORO RD',172), +(193000000000000070,193000000000100070,'GSP1','GSP1','90','SC','Spartanburg','29303','UTC-5','402 John Dodd Rd',232), +(193000000000000071,193000000000100071,'GYR2','GYR2','7','AZ','GOODYEAR','85395-7672','UTC-7','17341 W MINNEZONA AVE',196), +(193000000000000072,193000000000100072,'GYR3','GYR3','8','AZ','PHOENIX','85043-2356','UTC-7','8181 W ROOSEVELT ST',195), +(193000000000000262,193000000000100262,'HEA2','HEA2','77','','','18031','','650 BOULDER DR Suite A 18031-1536 - BREINIGSVILLE, PA - United States',65), +(193000000000000073,193000000000100073,'HGR6','HGR6','130','MD','HAGERSTOWN','21740-7301','UTC-5','55 West Oak Ridge Drive',88), +(193000000000000074,193000000000100074,'HIA1','HIA1','148','PA','MIDDLETOWN','17057','UTC-5','3327 E Harrisburg Pik',95), +(193000000000000075,193000000000100075,'HLI2','HLI2','137','CA','HOLLISTER','95023','UTC-8','600 Ernie Drive',52), +(193000000000000076,193000000000100076,'HOU1','HOU1',NULL,'TX','Humble','77338','UTC-6','8120 Humble Westfield Rd',224), +(193000000000000077,193000000000100077,'HOU2','HOU2',NULL,'TX','Houston','77038-2324','UTC-6','10550 Ella Blvd.',223), +(193000000000000078,193000000000100078,'HOU3','HOU3',NULL,'TX','Brookshire','77423','UTC-6','31555 Highway 90 E',222), +(193000000000000263,193000000000100263,'HOU7','HOU7','63','','','','','',67), +(193000000000000079,193000000000100079,'HOU8','HOU8','49','TX','FRESNO','77545','UTC-6','2303 Hurricane Lane',162), +(193000000000000080,193000000000100080,'HSV1','HSV1','80','AL','Madison','35756','UTC-6','7817 Greenbrier Road',150), +(193000000000000081,193000000000100081,'HSV2','HSV2',NULL,'AL','MADISON','35756','UTC-6','28869 Fanning Dr NW',134), +(193000000000000082,193000000000100082,'IAH3','IAH3','57','TX','Houston','77032','UTC-6','15525 Milner Road',163), +(193000000000000264,193000000000100264,'IAK3','IAK3','44','','','','','',70), +(193000000000000083,193000000000100083,'IAZ1','IAZ1','179','AZ','GOODYEAR','85395-4515','UTC-7','4660 N COTTON LN 85395-4515 - GOODYEAR, AZ - United States',11), +(193000000000000084,193000000000100084,'ICT2','ICT2','109','KS','PARK CITY','67219','UTC-6','7130 N BROADWAY AVE',144), +(193000000000000085,193000000000100085,'IGA3','IGA3','197','GA','MACON','31216-6427','UTC-5','7001 Skipper Rd 31216-6427 MACON, GA - United States',10), +(193000000000000086,193000000000100086,'IGQ2','IGQ2','110','IL','University park','60484','UTC-6','23257 S. Central Avenue',160), +(193000000000000087,193000000000100087,'ILG1','ILG1','35','DE','NEW CASTLE','19720','UTC-5','780 S. DuPont Highway',127), +(193000000000000265,193000000000100265,'IMI1','IMI1','199','MI','LANSING','48917-8539','UTC-5','6500 W Mt Hope Hwy 48917-8539 - LANSING, MI - United States',9), +(193000000000000088,193000000000100088,'IMO1','IMO1','178','MO','LIBERTY','64068-8933','UTC-6','2361 S Withers RD',18), +(193000000000000089,193000000000100089,'IMS1','IMS1','189','MS','OLIVE BRANCH','38654','UTC-6','IMS1-11505 Progress Way,38654-2510,OLIVE BRANCH,MS,US',14), +(193000000000000090,193000000000100090,'INC1','INC1','190','NC','FAYETTEVILLE','28303-2215','UTC-5','6309 Bragg Blvd 28303-2215 - FAYETTEVILLE, NC - United States',13), +(193000000000000266,193000000000100266,'IND1-AMAZON','IND1-AMAZON',NULL,'IN','Whitestown','46075','UTC-5','4255 Anson Blvd',287), +(193000000000000267,193000000000100267,'IND1-WALMART','IND1-WALMART',NULL,'IN','Avon','46123','UTC-5','9590 AllPoints Pkwy',176), +(193000000000000091,193000000000100091,'IND2','IND2','127','IN','Plainfield','46168-7442','UTC-5','715 Airtech Pkwy',96), +(193000000000000268,193000000000100268,'IND2-AMAZON','IND2-AMAZON',NULL,'IN','Plainfield','46168','UTC-5','715 Airtech Pkwy',286), +(193000000000000269,193000000000100269,'IND2-WALMART','IND2-WALMART',NULL,'IN','Avon','46123','UTC-5','9360 AllPoints Pkwy',177), +(193000000000000270,193000000000100270,'IND3','IND3','198','IN','Mccordsville','46055','UTC-5','5756 Enterprise Dr',6), +(193000000000000271,193000000000100271,'IND3-亚马逊','IND3-亚马逊',NULL,'IN','Pkwy Plainfield','46168','','717 Airtech Pkwy Plainfield IN 46168,USA',147), +(193000000000000272,193000000000100272,'IND3-沃尔玛','IND3-沃尔玛',NULL,'IN','Mccordsville','46055','UTC-5','5756 Enterprise Dr, Mccordsville, IN 46055',285), +(193000000000000092,193000000000100092,'IND4','IND4',NULL,'IN','Indianapolis','46231','UTC-5','710 S. Girls School Rd',284), +(193000000000000093,193000000000100093,'IND5','IND5','140','IN','Plainfield','46168','UTC-5','800 Perry Road',283), +(193000000000000094,193000000000100094,'IND6','IND6',NULL,'IN','Jeffersonville','47130','UTC-5','1453 E 10th St',282), +(193000000000000095,193000000000100095,'IND9','IND9','17','IN','GREENWOOD','46143-7830','UTC-5','1151 S GRAHAM RD',181), +(193000000000000273,193000000000100273,'IPA1','IPA1','194','PA','OLYPHANT','18447-2140','UTC-5','1300 Corporate Way',3), +(193000000000000096,193000000000100096,'ITX3','ITX3','187','TX','AMARILLO','79108-7749','UTC-6','ITX3-8590 NE 24th Ave,79108-7749,AMARILLO,TX,US',17), +(193000000000000097,193000000000100097,'IUSF','IUSF','169','TX','DALLAS','75241','UTC-6','3351 Balmorhea Dr',30), +(193000000000000098,193000000000100098,'IUSJ','IUSJ','98','CA','BEAUMONT','92223','UTC-8','36900 West 4th Street',77), +(193000000000000099,193000000000100099,'IUSP','IUSP','83','CA','HESPERIA,','92344','UTC-8','8140 Caliente Rd',82), +(193000000000000274,193000000000100274,'IUSP-AWD','IUSP-AWD','83','CA','HESPERIA','92344','UTC-8','8140 Caliente Rd',91), +(193000000000000100,193000000000100100,'IUSQ','IUSQ','95','CA','REDLANDS','92374','UTC-8','2125 W San Bernardino Ave',78), +(193000000000000101,193000000000100101,'IUSR','IUSR','158','SC','COWPENS','29330','UTC-5','1120 Mt Olive Rd',48), +(193000000000000102,193000000000100102,'IUST','IUST','149','PA','GREENCASTLE','17225','UTC-5','3PL AWD (Greencastle, PA, US) 15651 Greenmount RdGREENCASTLE, PA 17225 United States',47), +(193000000000000103,193000000000100103,'IUSW','IUSW','156','CA','Hesperia','92344','UTC-8','8130 Caliente Rd 92344 - Hesperia, CA - United States',41), +(193000000000000104,193000000000100104,'IUTE','IUTE','170','AZ','GOODYEAR','85338','UTC-7','16155 W Elwood St',29), +(193000000000000105,193000000000100105,'IUTJ','IUTJ','177','CA','Fontana','92335','UTC-8','9253 Dreamland Drive 92335 - Fontana, CA - United',16), +(193000000000000106,193000000000100106,'IUTL','IUTL','188','CA','Moreno Valley','92551','UTC-8','24405 Krameria Ave 92551 - Moreno Valley, CA - United States',15), +(193000000000000107,193000000000100107,'IWA6','IWA6','191','WA','PASCO','99301-6161','UTC-8','1202 S Road 40 E 99301-6161 - PASCO, WA - United States',12), +(193000000000000275,193000000000100275,'JAX3','JAX3','111','','','32210','','JAX3-32210',58), +(193000000000000276,193000000000100276,'JAX3-32210','JAX3-32210','111','FL','Jacksonville','32210-8686','UTC-5','13333 103rd Street',289), +(193000000000000277,193000000000100277,'JAX3-32221','JAX3-32221',NULL,'FL','Jacksonville','32221','UTC-5','13333 103rd Street',175), +(193000000000000108,193000000000100108,'JOT1','JOT1','93','CA','SAN BERNARDINO','92408','UTC-8','1494 S WATERMAN AVE',80), +(193000000000000109,193000000000100109,'JVL1','JVL1','125','WI','BELOIT','53511','UTC-6','1255 Gateway Blvd',158), +(193000000000000110,193000000000100110,'KRB4','KRB4',NULL,'CA','PERRIS','92571-9722','UTC-8','4501 PATTERSON AVE',186), +(193000000000000111,193000000000100111,'KY1','KY1','60','KY','Shepherdsville','40165','UTC-5','120 Velocity Way.,',169), +(193000000000000112,193000000000100112,'LAN2','LAN2','96','MI','LANSING','48917','UTC-5','6500 W Mt Hope Hwy',108), +(193000000000000278,193000000000100278,'LAN2-48917','LAN2-48917',NULL,'MI','LANSING','48917','UTC-5','6500 W Mt Hope Hwy',109), +(193000000000000113,193000000000100113,'LAS1','LAS1','5','NV','HENDERSON','89044','UTC-8','12300 Bermuda Road',255), +(193000000000000114,193000000000100114,'LAS2','LAS2',NULL,'NV','Las Vegas','89030','UTC-8','3837 Bay Lake Trail, Suite 111 North',254), +(193000000000000115,193000000000100115,'LAS6','LAS6','50','NV','Las Vegas','89115','UTC-8','4550 Nexus Way',140), +(193000000000000279,193000000000100279,'LAX1','LAX1','192','CA','Chino','91708','UTC-8','6750 Kimball Avenue, Chino,CA 91708,USA',8), +(193000000000000280,193000000000100280,'LAX1-WALMART','LAX1-WALMART',NULL,'CA','Chino','91708','UTC-8','6750 Kimball Avenue',185), +(193000000000000116,193000000000100116,'LAX2T','LAX2T','19','CA','CHINO','91708','UTC-8','6730 Kimball Ave',170), +(193000000000000281,193000000000100281,'LAX2T-WALMART','LAX2T-WALMART',NULL,'CA','Chino','91708','UTC-8','6720 Kimball Ave',188), +(193000000000000117,193000000000100117,'LAX9','LAX9','3','CA','FONTANA','92337','UTC-8','11263 Oleander Ave',191), +(193000000000000118,193000000000100118,'LBE1','LBE1','112','PA','Greensburg','15605','UTC-5','165 Glen Fox Road',94), +(193000000000000282,193000000000100282,'LBE1-UPS','LBE1-UPS',NULL,'PA','New Stanton','15672','UTC-5','165 GLENN FOX RD',93), +(193000000000000119,193000000000100119,'LEX1','LEX1',NULL,'KY','Lexington','40511','UTC-5','1850 Mercer RD',276), +(193000000000000120,193000000000100120,'LEX2','LEX2',NULL,'KY','Lexington','40511','UTC-5','172 Trade St.',275), +(193000000000000121,193000000000100121,'LFT1','LFT1','31','LA','CARENCRO','70520-5976','UTC-6','3550 NE EVANGELINE TRWY',115), +(193000000000000122,193000000000100122,'LGB3','LGB3',NULL,'CA','Eastvale','91752','UTC-8','4950 Goodman Way',299), +(193000000000000123,193000000000100123,'LGB4','LGB4','45','CA','Redlands','92374','UTC-8','27517 Pioneer Avenue',300), +(193000000000000124,193000000000100124,'LGB6','LGB6','26','CA','Riverside','92518-1513','UTC-8','20901 Krameria Ave',301), +(193000000000000125,193000000000100125,'LGB8','LGB8','2','CA','Rialto','92376','UTC-8','1568 N Linden Ave',302), +(193000000000000126,193000000000100126,'LIT2','LIT2','159','AR','NORTH LITTLE ROCK','72117','UTC-6','13001 HIGHWAY 70',114), +(193000000000000127,193000000000100127,'MCC1','MCC1','161','CA','RANCHO CORDOVA','95742','UTC-8','3300 Rancho Cordova Pkwy 95742 - RANCHO CORDOVA, CA - United States',40), +(193000000000000128,193000000000100128,'MCE1','MCE1','65','CA','TURLOCK','95380','UTC-8','FULKERTH RD',165), +(193000000000000129,193000000000100129,'MCI1','MCI1',NULL,'KS','Lenexa','66219','UTC-6','113th St & Renner Blvd.',279), +(193000000000000130,193000000000100130,'MCI4','MCI4','176','MO','KANSAS CITY','64163','UTC-6','MCI4 - 10501 NW 136th Street',20), +(193000000000000283,193000000000100283,'MCO1-WALMART','MCO1-WALMART',NULL,'FL','Davenport','33897','UTC-5','5100 NORTH RIDGE TRAIL',116), +(193000000000000131,193000000000100131,'MCO2','MCO2','106','FL','Deltona','32725-2610','UTC-5','2600 N Normandy Blvd',123), +(193000000000000132,193000000000100132,'MDT1','MDT1','121','PA','Carlisle','17015','UTC-5','2Ames Drive',238), +(193000000000000133,193000000000100133,'MDT4','MDT4','144','PA','York','17408','UTC-5','5125 Commerce Drive',136), +(193000000000000134,193000000000100134,'MDW2','MDW2','46','IL','Joliet','60433-3280','UTC-6','250 Emerald Drive',208), +(193000000000000284,193000000000100284,'MDW2-60433-3280','MDW2-60433-3280',NULL,'IL','Joliet','60433-3280','UTC-6','250 Emerald Drive',119), +(193000000000000135,193000000000100135,'MDW6','MDW6','143','IL','ROMEOVILLE','60446-6529','UTC-6','1125 W REMINGTON BLVD ROMEOVILLE',207), +(193000000000000136,193000000000100136,'MDW7','MDW7',NULL,'IL','Monee','60449','UTC-6','6605 Monee Manhattan Road',206), +(193000000000000137,193000000000100137,'MDW8','MDW8',NULL,'IL','Waukegan','60085','UTC-6','1750 Bridge Drive',205), +(193000000000000138,193000000000100138,'MDW9','MDW9','36','IL','Aurora','60502','UTC-6','2865 Duke Parkway',204), +(193000000000000139,193000000000100139,'MEM1','MEM1','85','TN','Memphis','38118','UTC-6','3292 E Holmes Rd',171), +(193000000000000285,193000000000100285,'MEM1S-WALMART','MEM1S-WALMART',NULL,'MS','OLIVE BRANCH','38654','UTC-6','9200 Alexander Road',183), +(193000000000000140,193000000000100140,'MEM6','MEM6','51','MS','OLIVE BRANCH','38654','UTC-6','11505 Progress Way',126), +(193000000000000141,193000000000100141,'MGE3','MGE3','133','GA','Jefferson','30549-2010','UTC-5','808 Hog Mountain Road',209), +(193000000000000286,193000000000100286,'MIA1-33054','MIA1-33054',NULL,'FL','Opa-Locka','33054','UTC-5','14000 NW 37th Avenue',174), +(193000000000000287,193000000000100287,'MIA1-33182','MIA1-33182',NULL,'FL','Miami','33182','UTC-5','1900 NW 132nd Place Doral',290), +(193000000000000142,193000000000100142,'MIT2','MIT2','82','CA','SHAFTER','93263','UTC-8','5408 Express Avenue',85), +(193000000000000143,193000000000100143,'MKC4','MKC4','67','KS','Edgerton','66021-9588','UTC-6','19645 Waverly Rd',278), +(193000000000000144,193000000000100144,'MKC6','MKC6',NULL,'KS','Kansas City','66102','UTC-6','6925 Riverview Avenue',277), +(193000000000000145,193000000000100145,'MKE1','MKE1',NULL,'WI','Kenosha','53144','UTC-6','3501 120th Ave',211), +(193000000000000146,193000000000100146,'MQJ1','MQJ1','88','IN','GREENFIELD','46140','UTC-5','4412 W 300 RD N',102), +(193000000000000288,193000000000100288,'MQY2','MQY2','193','TN','LEBANON','37090','UTC-6','MQY2 - 1301 Richard Petty Way 37090 - LEBANON, TN - United States',7), +(193000000000000147,193000000000100147,'MSP1','MSP1',NULL,'MN','Shakopee','55379','UTC-6','2601 4th Avenue East',198), +(193000000000000148,193000000000100148,'NJ3','NJ3','175','NJ','Pedricktown','08067','UTC-5','3 Sorbello Way',25), +(193000000000000289,193000000000100289,'NJ3-WALMART','NJ3-WALMART',NULL,'NJ','Pedricktown','08067','UTC-5','3 Sorbello Way',87), +(193000000000000290,193000000000100290,'NJ3T','NJ3T','195','NJ','Pedricktown','08067','UTC-5','7 Sorbello Rd',5), +(193000000000000149,193000000000100149,'OAK3','OAK3','41','CA','Patterson','95363-8876','UTC-8','255 Park Center Drive',307), +(193000000000000150,193000000000100150,'OAK4','OAK4',NULL,'CA','Tracy','95304-9370','UTC-8','1555 N. Chrisman Rd',308), +(193000000000000151,193000000000100151,'OKC2','OKC2','33','OK','OKLAHOMA CITY','73159','UTC-6','8991 S PORTLAND AVENUE',141), +(193000000000000152,193000000000100152,'OLM1','OLM1','172','WA','OLYMPIA','98516','UTC-8','3300 HOGUM BAY RD NE 98516-3111 - OLYMPIA, WA - United States',27), +(193000000000000153,193000000000100153,'ONT2','ONT2',NULL,'CA','San Bernardino','92408','UTC-8','1910 E Central Ave',311), +(193000000000000154,193000000000100154,'ONT6','ONT6',NULL,'CA','Moreno Valley','92551-9561','UTC-8','24208 San Michele Rd',310), +(193000000000000155,193000000000100155,'ONT8','ONT8','1','CA','Moreno Valley','92551-9534','UTC-8','24300 Nandina Ave',309), +(193000000000000156,193000000000100156,'ONT9','ONT9','25','CA','Redlands','92374','UTC-8','2125 W. San Bernandino Ave',306), +(193000000000000291,193000000000100291,'ORD1S-WALMART','ORD1S-WALMART',NULL,'IL','Joliet','60436','UTC-6','3501 Brandon Road',99), +(193000000000000157,193000000000100157,'ORD2','ORD2','21','IL','CHANNAHON','60410-8758','UTC-6','23714 W Amoco Rd',111), +(193000000000000158,193000000000100158,'ORD6','ORD6',NULL,'IL','Wood Dale','60191','UTC-6','1250 N Mittel Blvd',203), +(193000000000000159,193000000000100159,'ORF2','ORF2','38','VA','CHESAPEAKE','23321-1425','UTC-5','ORF2 - 5045 PORTSMOUTH BLVD',121), +(193000000000000292,193000000000100292,'ORF2-FEDEX','ORF2-FEDEX',NULL,'VA','CHESAPEAKE','23321-1425','UTC-5','ORF2 - 5045 PORTSMOUTH BLVD',167), +(193000000000000293,193000000000100293,'ORF2-UPS','ORF2-UPS',NULL,'VA','Richmond','23297','UTC-5','9603 Coach Road',124), +(193000000000000160,193000000000100160,'PBI3','PBI3','113','FL','Jacksonville','32206','UTC-5','21 Jump Street',89), +(193000000000000161,193000000000100161,'PDX7','PDX7','68','OR','Salem','97317','UTC-8','4775 Depot Ct SE',135), +(193000000000000162,193000000000100162,'PHL1','PHL1',NULL,'DE','New Castle','19720','UTC-5','1 Centerpoint Blvd.',296), +(193000000000000163,193000000000100163,'PHL3','PHL3',NULL,'DE','New Castle','19720','UTC-5','1600 Johnson Way',295), +(193000000000000164,193000000000100164,'PHL4','PHL4','52','PA','Carlisle','17015','UTC-5','21 Roadway Dr',244), +(193000000000000165,193000000000100165,'PHL5','PHL5',NULL,'PA','Lewisberry','17339','UTC-5','500 McCarthy Dr',243), +(193000000000000166,193000000000100166,'PHL5S','PHL5S','171','PA','Greencastle','17225','UTC-5','1915 Ebberts Spg Ct, Greencastle, PA 17225',28), +(193000000000000294,193000000000100294,'PHL5S-WALMART','PHL5S-WALMART',NULL,'PA','Greencastle','17225','UTC-5','1915 Ebberts Spg Ct',98), +(193000000000000167,193000000000100167,'PHL6','PHL6','69','PA','Carlisle','17015','UTC-5','675 Allen Rd.',242), +(193000000000000168,193000000000100168,'PHL7','PHL7',NULL,'DE','Middletown','19709','UTC-5','560 Merrimac Ave',294), +(193000000000000169,193000000000100169,'PHL8','PHL8',NULL,'DE','Middletown','19709','UTC-5','727 N Broad St',293), +(193000000000000170,193000000000100170,'PHX3','PHX3',NULL,'AZ','Phoenix','85043','UTC-7','6835 West Buckeye Road',315), +(193000000000000171,193000000000100171,'PHX5','PHX5','72','AZ','Goodyear','85338','UTC-7','16920 W Commerce Drive',314), +(193000000000000172,193000000000100172,'PHX6','PHX6',NULL,'AZ','Phoenix','85043','UTC-7','4750 West Mohave St',313), +(193000000000000173,193000000000100173,'PHX7','PHX7','74','AZ','Phoenix','85043','UTC-7','800 N 75th Ave',312), +(193000000000000174,193000000000100174,'PIT1','PIT1',NULL,'PA','Pittsburgh','15205','UTC-5','2250 Roswell Drive',237), +(193000000000000175,193000000000100175,'PIT2','PIT2','78','PA','IMPERIAL','15126-1002','UTC-5','1200 Westport Rd',166), +(193000000000000176,193000000000100176,'POC1','POC1','128','CA','FONTANA','92336-1123','UTC-8','4121 LYTLE CREEK RD',54), +(193000000000000177,193000000000100177,'POC2','POC2','151','CA','ONTARIO','91761','UTC-8','4000 South Hamner Avenue',46), +(193000000000000178,193000000000100178,'POC3','POC3','129','CA','JURUPA VALLEY','92509','UTC-8','6120 Clinker Drive',53), +(193000000000000179,193000000000100179,'PPO4','PPO4','122','IN','MERRILLVILLE','46410','UTC-6','9850 Mississippi Street',57), +(193000000000000180,193000000000100180,'PSC2','PSC2','75','WA','PASCO','99301','UTC-8','1351 S Road 40 E',101), +(193000000000000295,193000000000100295,'PSC2-UPS','PSC2-UPS',NULL,'OR','Portland','97242','UTC-8','9930 NE Alderwood Rd',100), +(193000000000000181,193000000000100181,'PSP3','PSP3','162','CA','DESERT HOT SPRINGS','92240','UTC-8','64165 19th AVE',36), +(193000000000000182,193000000000100182,'QXY5','QXY5','92','CA','STOCKTON','95215','UTC-8','4532 NEWCASTLE RD',79), +(193000000000000183,193000000000100183,'QXY8','QXY8','154','CA','FRESNO','93725-1962','UTC-8','3611 S NORTHPOINTE DR',43), +(193000000000000184,193000000000100184,'QZZ7','QZZ7','184','AZ','MESA','85212-9608','UTC-7','8560 E ELLIOT RD',22), +(193000000000000185,193000000000100185,'RDU2','RDU2','56','NC','Smithfield','27577','UTC-5','2150 US HWY 70 Business West',154), +(193000000000000186,193000000000100186,'RDU4','RDU4','145','NC','FAYETTEVILLE','28303','UTC-5','6309 Bragg Blvd',103), +(193000000000000187,193000000000100187,'RFD2','RFD2','71','IL','Huntley','60142','UTC-6','11500 Freeman Road',153), +(193000000000000188,193000000000100188,'RFD4','RFD4','174','IL','HUNTLEY','60142','UTC-6','11400 Venture Court 60142-8075 - HUNTLEY, IL - United States',24), +(193000000000000189,193000000000100189,'RIC1','RIC1','142','VA','Petersburg','23803','UTC-5','5000 Commerce Way',218), +(193000000000000190,193000000000100190,'RIC2','RIC2',NULL,'VA','Chester','23836','UTC-5','1901 Meadowville Technology Pkwy',217), +(193000000000000191,193000000000100191,'RMN3','RMN3','84','VA','Fredericksburg','22406','UTC-5','220 Centreport Parkway',152), +(193000000000000192,193000000000100192,'RNO1','RNO1',NULL,'NV','Fernley','89408','UTC-8','1600 East Newlands RD',256), +(193000000000000193,193000000000100193,'RNO2','RNO2',NULL,'NV','Reno','85906','UTC-8','8000 North Virginia Street',253), +(193000000000000194,193000000000100194,'RNO4','RNO4',NULL,'NV','Reno','89506','UTC-8','8000 North Virginia Street',252), +(193000000000000195,193000000000100195,'RYY2','RYY2','94','GA','White','30184','UTC-5','1250 Cassville White Road,',81), +(193000000000000196,193000000000100196,'SAT1','SAT1','23','TX','Schertz','78154-1461','UTC-6','6000 Enterprise Avenue',226), +(193000000000000197,193000000000100197,'SAT4','SAT4','61','TX','SAN ANTONIO','78245','UTC-6','10384 W US HIGHWAY 90',157), +(193000000000000198,193000000000100198,'SAT6','SAT6','183','TX','SAN MARCOS','78666','UTC-6','1346 Fortuna Road 78666-0001 - SAN MARCOS, TX - United States',23), +(193000000000000199,193000000000100199,'SAV3','SAV3','124','GA','Macon','31216-6427','UTC-5','7001 Skipper Rd',106), +(193000000000000200,193000000000100200,'SBD1','SBD1','4','CA','BLOOMINGTON','92316-3819','UTC-8','3388 S Cactus Ave',193), +(193000000000000201,193000000000100201,'SBD2','SBD2','15','CA','SAN BERNARDINO','92408-2805','UTC-8','1494 S WATERMAN AVE',187), +(193000000000000202,193000000000100202,'SCK1','SCK1','20','CA','STOCKTON','95215','UTC-8','4532 NEWCASTLE RD',105), +(193000000000000203,193000000000100203,'SCK3','SCK3','54','CA','MANTECA','95336','UTC-8','3565 N AIRPORT WAY MANTECA',68), +(193000000000000204,193000000000100204,'SCK4','SCK4','10','CA','STOCKTON','95215-8354','UTC-8','6001 S AUSTIN RD',194), +(193000000000000205,193000000000100205,'SCK8','SCK8','141','CA','OAKLEY','94561-2677','UTC-8','4700 WILBUR AVE',112), +(193000000000000206,193000000000100206,'SDF1','SDF1',NULL,'KY','Campbellsville','42718','UTC-5','1050 South Columbia AVE',274), +(193000000000000207,193000000000100207,'SDF2','SDF2',NULL,'KY','Watterson Park','40218','UTC-5','4360 Robards Ln',273), +(193000000000000208,193000000000100208,'SDF4','SDF4',NULL,'KY','Shepherdsville','40165','UTC-5','376 Zappos.com Blvd',272), +(193000000000000209,193000000000100209,'SDF6','SDF6',NULL,'KY','Shepherdsville','40165','UTC-5','271 Omega Pkwy',271), +(193000000000000210,193000000000100210,'SDF7','SDF7',NULL,'KY','Shepherdsville','40165','UTC-5','300 Omicron Court',266), +(193000000000000211,193000000000100211,'SDF8','SDF8',NULL,'IN','Jeffersonville','47130','UTC-5','900 Patrol Rd',281), +(193000000000000212,193000000000100212,'SDF9','SDF9',NULL,'KY','Shepherdsville','40165','UTC-5','100 W. Thomas P. Echols Lane',265), +(193000000000000213,193000000000100213,'SEA6','SEA6',NULL,'WA','South Seattle','98144','UTC-8','2646 Rainier Ave.',213), +(193000000000000214,193000000000100214,'SEA8','SEA8',NULL,'WA','Northeast Bellevue','98005','UTC-8','1475 124th Avenue',212), +(193000000000000215,193000000000100215,'SJC7','SJC7','30','CA','Tracy','95377-8906','UTC-8','188 Mountain House Parkway',303), +(193000000000000296,193000000000100296,'SLC1N','SLC1N','196','UT','Salt Lake City','84116','UTC-7','990 N 6550 W',4), +(193000000000000216,193000000000100216,'SLC2','SLC2','86','UT','West Jordan','84081','UTC-7','7148 W. Old Bingham Hwy',161), +(193000000000000217,193000000000100217,'SLC3','SLC3','185','UT','SALT LAKE CITY','84116-4413','UTC-7','355 N JOHN GLENN RD',21), +(193000000000000297,193000000000100297,'SMF1-AMAZON','SMF1-AMAZON',NULL,'CA','Sacramento','95835-9505','UTC-8','4900 W Elkhorn Blvd',298), +(193000000000000298,193000000000100298,'SMF1-WALMART','SMF1-WALMART',NULL,'CA','Sacramento','95837','UTC-8','7000 Powerline Rd',173), +(193000000000000218,193000000000100218,'SMF3','SMF3','9','CA','Stockton','95206-8202','UTC-8','3923 S B ST',192), +(193000000000000219,193000000000100219,'SMF6','SMF6','28','CA','SACRAMENTO','95837-9109','UTC-8','4930 ALLBAUGH DR',113), +(193000000000000299,193000000000100299,'SMF7','SMF7','53','','','','','',69), +(193000000000000220,193000000000100220,'SNA4','SNA4','18','CA','Rialto','92376-3009','UTC-8','2496 W Walnut Ave',304), +(193000000000000221,193000000000100221,'STL3','STL3','152','MO','REPUBLIC','65738-2779','UTC-6','3200 E SAWYER RD',117), +(193000000000000222,193000000000100222,'STL4','STL4','115','IL','Edwardsville','62025-2815','UTC-6','3050 GATEWAY COMMERCE CENTER DR S',202), +(193000000000000300,193000000000100300,'STL6','STL6','64','','','','','',66), +(193000000000000223,193000000000100223,'SWF1','SWF1','134','NY','ROCK TAVERN','12575','UTC-5','635 INTERNATIONAL BLVD',130), +(193000000000000224,193000000000100224,'SWF2','SWF2','62','NY','Hopewell Junction','12533','UTC-5','76 Patriot Way Hopewell Junction',84), +(193000000000000301,193000000000100301,'SWF2-10710','SWF2-10710',NULL,'NY','Yonkers','10710','UTC-5','557 Tuckahoe Road',145), +(193000000000000302,193000000000100302,'SWF2-12533','SWF2-12533',NULL,'NY','Hopewell Junction','12533-6159','UTC-5','76 Patriot Way',168), +(193000000000000225,193000000000100225,'TCY1','TCY1','139','CA','STOCKTON','95206','UTC-8','2690 East Arch Airport Road',49), +(193000000000000226,193000000000100226,'TCY2','TCY2','138','CA','STOCKTON','95215','UTC-8','6201 Newcastle Rd',51), +(193000000000000227,193000000000100227,'TEB3','TEB3','47','NJ','Logan Township','08085','UTC-5','2651 Oldmans Creek Rd',258), +(193000000000000228,193000000000100228,'TEB4','TEB4','55','NJ','PENNS GROVE','08069','UTC-5','747 COURSES LANDING RD',138), +(193000000000000229,193000000000100229,'TEB6','TEB6','114','NJ','Cranbury','08512','UTC-5','22 Hightstown Cranbury State Road',257), +(193000000000000230,193000000000100230,'TEB9','TEB9','40','NJ','Somerset','08873','UTC-5','601 Randolph Road',164), +(193000000000000231,193000000000100231,'TMB8','TMB8','116','FL','HOMESTEAD','33032-8597','UTC-5','27505 SW 132nd AVE',73), +(193000000000000303,193000000000100303,'TMB8-UPS','TMB8-UPS',NULL,'FL','Miami Gardens','33055','UTC-5','8675309 Jenny Lane',74), +(193000000000000232,193000000000100232,'TOL3','TOL3','173','OH','PERRYSBURG','43551','UTC-5','9240 Fremont Pike 43551-4210 - PERRYSBURG, OH - United States',26), +(193000000000000233,193000000000100233,'TPA1','TPA1',NULL,'FL','Ruskin','33570','UTC-5','3350 Laurel Ridge Ave.',292), +(193000000000000234,193000000000100234,'TPA2','TPA2','22','FL','Lakeland','33811','UTC-5','1760 County Line Rd',291), +(193000000000000235,193000000000100235,'TPA3','TPA3','146','FL','Auburndale','33823','UTC-5','676 C. Fred Jones Boulevard',132), +(193000000000000236,193000000000100236,'TUL1','TUL1',NULL,'KS','Coffeyville','67337','UTC-6','2654 North Highway 169',280), +(193000000000000304,193000000000100304,'UPS','UPS','11','','','92337','','10767',56), +(193000000000000237,193000000000100237,'VGT2','VGT2','6','NV','LAS VEGAS','89115-2013','UTC-8','6401 Howdy Wells Ave',180), +(193000000000000305,193000000000100305,'VGT2-FEDEX','VGT2-FEDEX',NULL,'NV','LAS VEGAS','89115-201','UTC-8','6401 Howdy Wells Ave',120), +(193000000000000306,193000000000100306,'VGT2-UPS','VGT2-UPS',NULL,'CA','March Air Reserve Base','92518','UTC-8','20701 Krameria Ave',178), +(193000000000000238,193000000000100238,'VUBA','VUBA',NULL,'PA','Scranton','18512','UTC-5','1000 Keystone Industrial Park',236), +(193000000000000239,193000000000100239,'VUGA','VUGA',NULL,'PA','Pittston','18643','UTC-5','508 Delaware Avenue West',235), +(193000000000000240,193000000000100240,'WBW2','WBW2','119','PA','OLYPHANT','18447','UTC-5','1300 Corporate Way',90), +(193000000000000241,193000000000100241,'XAV3','XAV3','180','GA','PORT WENTWORTH','31407','UTC-5','XAV3-120Crossgate Dr 31407-Port Wentworth, GA- United States',44), +(193000000000000307,193000000000100307,'XBN3','XBN3','91','','','','','',61), +(193000000000000308,193000000000100308,'XCH2','XCH2','87','','','','','',63), +(193000000000000242,193000000000100242,'XEW5','XEW5','163','NJ','Cinnaminson','08077-2015','UTC-5','995 Taylors Ln 08077-2015',45), +(193000000000000243,193000000000100243,'XIN5','XIN5','182','IN','Avon','46123-1700','UTC-5','8838 E COUNTY ROAD 100 S',33), +(193000000000000244,193000000000100244,'XLX1','XLX1','160','MD','HAGERSTOWN','21740','UTC-5','1115 Wesel Blvd HAGERSTOWN,MD 21740,USA',42), +(193000000000000245,193000000000100245,'XLX6','XLX6','166','NC','PINEVILLE','28134','UTC-5','12220 Carolina Logistics Drive PINEVILLE,NC 28134,USA',31), +(193000000000000246,193000000000100246,'XLX7','XLX7','27','CA','VICTORVILLE','92394','UTC-8','18580 Gateway Dr,Victorville,CA 92394,USA',71), +(193000000000000309,193000000000100309,'XMI3','XMI3','89','','','','','',62), +(193000000000000247,193000000000100247,'XPB2','XPB2','165','FL','APOPKA','32712','UTC-5','XPB2 - 4661 Apopka Logistics Pkwy 32712 - Apopka, FL - United States',34), +(193000000000000248,193000000000100248,'XRI3','XRI3','167','VA','Richmond','23234','UTC-5','4949 Commerce Rd, Richmond, VA 23234',32), +(193000000000000249,193000000000100249,'XUSB','XUSB',NULL,'TX','Fort Worth','76155','UTC-6','14900 Frye Rd.',221), +(193000000000000250,193000000000100250,'XUSC','XUSC',NULL,'PA','Carlisle','17013','UTC-5','40 Logistics Drive',234), +(193000000000000251,193000000000100251,'XUSD','XUSD',NULL,'CA','Stockton','95206','UTC-8','1909 Zephyr St',305), +(193000000000000252,193000000000100252,'XUSE','XUSE',NULL,'IN','Whitestown','46075','UTC-5','5100 S Indianapolis Rd',288), +(193000000000000310,193000000000100310,'洛杉矶仓一件代发','洛杉矶仓一件代发','CADF','CA','RANCHO CUCAMONGA','91730','UTC-8','10767 7TH STREET',60), +(193000000000000311,193000000000100311,'海外仓打托','海外仓打托','13','','','91730','','91730',50), +(193000000000000312,193000000000100312,'私人仓','私人仓','14','','','私人仓','','私人仓',59), +(193000000000000313,193000000000100313,'纽约仓','纽约仓',NULL,'NJ','New Jersey','08817','UTC-5','13、14号门75 Carter Dr Edison,',38), +(193000000000000314,193000000000100314,'纽约仓一件代发','纽约仓一件代发','NJDF','NJ','New Jersey','08817','UTC-5','Door13-14,75 Carter Dr Edison,',37); DROP PROCEDURE IF EXISTS assert_wh_fba_public_master_data_seed; DELIMITER // CREATE PROCEDURE assert_wh_fba_public_master_data_seed() BEGIN - IF (SELECT COUNT(*) FROM tmp_wh_fba_public_master_data) <> 252 THEN - SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'FBA公共主数据源数量不是252'; + IF (SELECT COUNT(*) FROM tmp_wh_fba_public_master_data) <> 314 THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'FBA公共主数据源数量不是314'; END IF; IF EXISTS ( SELECT 1 FROM tmp_wh_fba_public_master_data - WHERE warehouse_code <> UPPER(TRIM(warehouse_code)) - OR warehouse_code NOT REGEXP '^[A-Z0-9]{3,5}$' - OR TRIM(city) = '' - OR TRIM(state_province) = '' - OR TRIM(address_line1) = '' - OR TRIM(postal_code) = '' - OR TRIM(timezone) = '' + WHERE TRIM(warehouse_code) = '' + OR warehouse_code <> UPPER(TRIM(warehouse_code)) + OR (internal_code IS NOT NULL AND internal_code NOT REGEXP '^[A-Z0-9]{1,16}$') ) THEN - SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'FBA公共主数据存在未清洗或必填缺失记录'; + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'FBA公共主数据存在空编码或内部编号格式异常'; END IF; IF EXISTS ( @@ -7051,7 +7148,7 @@ CALL assert_wh_fba_public_master_data_seed(); DROP PROCEDURE IF EXISTS assert_wh_fba_public_master_data_seed; INSERT INTO wh_warehouse ( - id, tenant_id, warehouse_code, warehouse_name, warehouse_type, country_code, timezone, + id, tenant_id, warehouse_code, internal_code, warehouse_name, warehouse_type, country_code, timezone, contact_name, contact_phone, contact_email, status, remark, created_by, created_at, updated_by, updated_at, deleted, version ) @@ -7059,6 +7156,7 @@ SELECT source.warehouse_id_seed, 0, source.warehouse_code, + source.internal_code, source.warehouse_name, 'FBA', 'US', @@ -7076,6 +7174,7 @@ SELECT 0 FROM tmp_wh_fba_public_master_data source ON DUPLICATE KEY UPDATE + internal_code = VALUES(internal_code), warehouse_type = VALUES(warehouse_type), country_code = VALUES(country_code), timezone = VALUES(timezone), @@ -7131,7 +7230,7 @@ BEGIN WHERE warehouse.tenant_id = 0 AND warehouse.warehouse_type = 'FBA' AND warehouse.country_code = 'US' - AND warehouse.deleted = 0) <> 252 THEN + AND warehouse.deleted = 0) <> 314 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'FBA公共仓库写入数量校验失败'; END IF; @@ -7149,6 +7248,7 @@ BEGIN AND address.deleted = 0 WHERE warehouse.id IS NULL OR address.id IS NULL + OR NOT (warehouse.internal_code <=> source.internal_code) OR address.country_code <> 'US' OR address.state_province <> source.state_province OR address.city <> source.city diff --git a/deploy/sql/海外区域统一增量-MySQL8.sql b/deploy/sql/海外区域统一增量-MySQL8.sql index 81c076182..618bc85a2 100644 --- a/deploy/sql/海外区域统一增量-MySQL8.sql +++ b/deploy/sql/海外区域统一增量-MySQL8.sql @@ -112,6 +112,21 @@ CREATE DATABASE IF NOT EXISTS baiyue_lastleg DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE baiyue_lastleg; +CREATE TABLE IF NOT EXISTS ll_order_source_pallet ( + id BIGINT NOT NULL COMMENT '来源托盘快照ID', + customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', + order_id BIGINT NOT NULL COMMENT '尾程订单ID', + source_pallet_no VARCHAR(128) NOT NULL COMMENT '头程冻结托盘码', + sequence_no INT NOT NULL COMMENT '订单内稳定顺序', + source_event_id VARCHAR(128) NOT NULL COMMENT '来源装柜完成事件ID', + created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', + PRIMARY KEY(id), + UNIQUE KEY uk_ll_source_pallet_no(source_pallet_no), + UNIQUE KEY uk_ll_source_pallet_sequence(customer_id,order_id,sequence_no), + KEY idx_ll_source_pallet_order(customer_id,order_id), + CONSTRAINT fk_ll_source_pallet_order FOREIGN KEY(order_id) REFERENCES ll_order(id) +) ENGINE=InnoDB COMMENT='头程交接的不可变托盘码快照'; + CREATE TABLE IF NOT EXISTS ll_event_outbox ( id BIGINT NOT NULL COMMENT '事件主键ID', customer_id VARCHAR(128) NOT NULL COMMENT '客户租户ID', aggregate_type VARCHAR(64) NOT NULL COMMENT '聚合类型', aggregate_id VARCHAR(128) NOT NULL COMMENT '聚合标识', diff --git a/firstleg/AGENTS.md b/firstleg/AGENTS.md index b28569360..0b2f42efb 100644 --- a/firstleg/AGENTS.md +++ b/firstleg/AGENTS.md @@ -9,6 +9,8 @@ ## 模块入口 +散货托盘码:`service/LoadingPalletLabelService.java`、`mapper/LoadingPalletLabelMapper.java`、`controller/PlatformLoadingListController.java`,契约 `src/main/resources/openapi/loading-lists-v1.yaml` 的 `/pallet-labels/prepare` 与 `/pallet-labels/print`。仅在计划 `LOADING/COMPLETED` 且真实柜号有效时,为非一件代发的 FBA 明细按柜号、FBA 仓编码、三位序号生成冻结标签;重复生成须核对已有标签与明细一致,冲突直接拒绝。支持全部或按仓指定张数输出 100×100 mm PDF;装柜完成通过 `LoadingCompletedOutboxService.java` 传递来源托盘。 + | 目标 | 入口 | |---|---| | 内部模块化基线与依赖分析 | `docs/firstleg-internal-modularization-baseline.md`、`scripts/analyze-firstleg-dependencies.mjs`、`scripts/analyze-firstleg-dependencies.test.mjs`、`src/test/resources/architecture/firstleg-slice-dependencies.json`;只约束本服务内部包依赖,不改变部署单元或数据库边界 | diff --git a/firstleg/docs/terminal-drayage-mail.md b/firstleg/docs/terminal-drayage-mail.md index 59a202dcc..fa4e2a968 100644 --- a/firstleg/docs/terminal-drayage-mail.md +++ b/firstleg/docs/terminal-drayage-mail.md @@ -3,8 +3,8 @@ ## 行为 - 首次选择车队只保存车队;列表“发送邮件”提交当前版本和幂等键,向供应商资料中的单个邮箱发送提柜请求。 -- 更换为另一车队时,与车队变更在同一数据库事务中生成 `CANCEL_PICKUP`、`REQUEST_PICKUP` 两个任务。取消邮件使用原请求的收件地址快照;没有原请求时读取原车队当前资料,允许原车队已停用。新车队必须为 ACTIVE/TRUCKING。 -- 同一车队重复选择不发邮件、不改变版本。发送操作递增拖车版本,同版本的重复点击不会再次入队。 +- 更换为另一车队时,以该柜、原车队是否存在 `REQUEST_PICKUP` 邮件记录作为“是否已下发”的事实。已下发过时,与车队变更在同一数据库事务中依次生成原车队 `CANCEL_PICKUP`、新车队 `REQUEST_PICKUP` 两个任务,取消邮件使用原请求的收件地址快照;从未下发过时只生成新车队 `REQUEST_PICKUP`,不向原车队发送取消邮件。新车队必须为 ACTIVE/TRUCKING。 +- 同一车队重复选择不发邮件、不改变版本。列表“发送邮件”允许人工重复点击,每次使用最新版本都会新增一封提柜请求,便于测试或再次通知;同一个幂等键的请求不会重复入队。 - 同柜严格顺序投递,取消未成功时新请求等待。失败不自动重发,避免 SMTP 超时后重复通知;人工核对未收到后通过邮件记录重试。进程中断超过五分钟的发送任务转为失败待核对。 - `SENT` 表示 SMTP 已接受邮件,不代表车队已阅读或执行。前端入队后只提示待发送,不伪装为成功投递。邮件记录展示最近 100 封,展示收件人、冻结主题和正文、状态及失败信息。 - 邮件发送、重试复用 `platform:firstleg:terminal-drayage:fleet:edit`,记录查看复用列表权限。已提柜、已卸柜或已还柜不再开放新的提柜邮件动作。 @@ -26,8 +26,8 @@ Firstleg 增加 Spring Boot mail starter,仅用于 SMTP,不引入独立邮 | `TERMINAL_DRAYAGE_MAIL_ENABLED` | 默认 false,true 启用投递 | | `TERMINAL_DRAYAGE_MAIL_HOST` | SMTP 主机 | | `TERMINAL_DRAYAGE_MAIL_PORT` | 默认 587 | -| `TERMINAL_DRAYAGE_MAIL_USERNAME` / `TERMINAL_DRAYAGE_MAIL_PASSWORD` | SMTP 账号与凭据,仅环境注入 | -| `TERMINAL_DRAYAGE_MAIL_FROM` | 单个发件邮箱 | +| `TERMINAL_DRAYAGE_MAIL_USERNAME` | SMTP 登录账号,同时作为邮件发件地址;QQ 邮箱填写完整邮箱地址 | +| `TERMINAL_DRAYAGE_MAIL_PASSWORD` | SMTP 授权码,仅通过环境注入,不使用 QQ 登录密码 | | `TERMINAL_DRAYAGE_MAIL_SSL` | 默认 false,强制 STARTTLS;true 使用隐式 TLS,一般配合 465 端口 | | `TERMINAL_DRAYAGE_MAIL_SCAN_DELAY` | 默认 10000 毫秒 | diff --git a/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformFbaPricingController.java b/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformFbaPricingController.java index 1c02c042f..b4bcec533 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformFbaPricingController.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformFbaPricingController.java @@ -83,7 +83,8 @@ public class PlatformFbaPricingController { } @PutMapping("/published") - @PreAuthorize("hasAuthority('firstleg:fba-pricing:adjust')") + @PreAuthorize("hasAnyAuthority('firstleg:fba-pricing:adjust'," + + " 'firstleg:inbound:confirm-send-fee')") @BusinessAudit(event = "FBA_FEE_ADJUST", resourceType = "INBOUND", resourceId = "#inboundId", description = "调整初算或已发布入库费用,不回退待分柜状态") public ApiResponse adjustPublished( diff --git a/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformLoadingListController.java b/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformLoadingListController.java index ccfaa1ba3..31408a188 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformLoadingListController.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformLoadingListController.java @@ -13,8 +13,11 @@ import com.baiyue.firstleg.dto.LoadingListDtos.ConfirmPreloadRequest; import com.baiyue.firstleg.dto.LoadingListDtos.PreloadConfirmationResponse; import com.baiyue.firstleg.dto.LoadingListDtos.TransportUpdateRequest; import com.baiyue.firstleg.dto.LoadingListDtos.LifecycleResolution; +import com.baiyue.firstleg.dto.LoadingListDtos.PalletLabelManifest; +import com.baiyue.firstleg.dto.LoadingListDtos.PalletLabelPrintRequest; import com.baiyue.firstleg.service.FirstlegScopeGuard; import com.baiyue.firstleg.service.LoadingListService; +import com.baiyue.firstleg.service.LoadingPalletLabelService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; @@ -32,6 +35,7 @@ import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.ResponseEntity; /** 基于同一装柜计划聚合提供平台预装清单和已确认装柜清单。 */ @Tag(name = "平台预装与装柜清单", description = "预装单向推进和已确认装柜清单只读查询") @@ -41,6 +45,8 @@ import org.springframework.web.bind.annotation.RestController; public class PlatformLoadingListController { @Resource private LoadingListService service; + @Resource + private LoadingPalletLabelService palletLabels; @Operation(summary = "分页查询预装清单") @GetMapping("/loading-plans") @@ -118,4 +124,26 @@ public class PlatformLoadingListController { return ApiResponse.success(service.confirmedDetail(planId, warehouseId)); } + @Operation(summary = "生成并查询散货托盘码", description = "仅为散货按真实集装箱号与 FBA 仓稳定生成托盘码;一件代发不参与。") + @PostMapping("/loading-plans/{planId}/pallet-labels/prepare") + @PreAuthorize("hasAnyAuthority('platform:firstleg:preload:list','platform:firstleg:loading-list:list','platform:firstleg:container:list')") + public ApiResponse preparePalletLabels( + @AuthenticationPrincipal AuthenticatedUser user, @PathVariable @Positive long planId, + @RequestParam @Positive long warehouseId) { + FirstlegScopeGuard.platform(user); + return ApiResponse.success(palletLabels.prepare(planId, warehouseId)); + } + + @Operation(summary = "打印散货托盘码", description = "不传仓码与张数时打印全部;按仓打印时返回该仓从第 1 张开始的指定数量,用于补打。") + @PostMapping(value = "/loading-plans/{planId}/pallet-labels/print", produces = "application/pdf") + @PreAuthorize("hasAnyAuthority('platform:firstleg:preload:list','platform:firstleg:loading-list:list','platform:firstleg:container:list')") + public ResponseEntity printPalletLabels( + @AuthenticationPrincipal AuthenticatedUser user, @PathVariable @Positive long planId, + @RequestParam @Positive long warehouseId, + @RequestHeader(value = "X-Request-Id", required = false) String requestId, + @Valid @RequestBody PalletLabelPrintRequest request) { + FirstlegScopeGuard.platform(user); + return palletLabels.print(planId, warehouseId, request, requestId); + } + } diff --git a/firstleg/src/main/java/com/baiyue/firstleg/dto/LoadingListDtos.java b/firstleg/src/main/java/com/baiyue/firstleg/dto/LoadingListDtos.java index 91925fea7..86666ca92 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/dto/LoadingListDtos.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/dto/LoadingListDtos.java @@ -125,6 +125,37 @@ public final class LoadingListDtos { ) { } + public record PalletLabelPrintRequest( + @Size(max = 64) String destinationWarehouseCode, + @Min(1) @Max(999) Integer count + ) { + } + + public record PalletLabel( + Long labelId, Long itemId, Long accountId, Long inboundId, String inboundCode, + String containerNo, String destinationWarehouseCode, String destinationWarehouseName, + int palletIndex, String palletCode + ) { + } + + public record PalletLabelGroup( + String destinationWarehouseCode, String destinationWarehouseName, + int totalCount, List labels + ) { + public PalletLabelGroup { + labels = labels == null ? List.of() : List.copyOf(labels); + } + } + + public record PalletLabelManifest( + Long planId, String planNo, String containerNo, int totalCount, + List groups + ) { + public PalletLabelManifest { + groups = groups == null ? List.of() : List.copyOf(groups); + } + } + public record PreloadSummary( Long planId, Long containerBookingId, diff --git a/firstleg/src/main/java/com/baiyue/firstleg/mapper/LoadingPalletLabelMapper.java b/firstleg/src/main/java/com/baiyue/firstleg/mapper/LoadingPalletLabelMapper.java new file mode 100644 index 000000000..5c798ed19 --- /dev/null +++ b/firstleg/src/main/java/com/baiyue/firstleg/mapper/LoadingPalletLabelMapper.java @@ -0,0 +1,70 @@ +package com.baiyue.firstleg.mapper; + +import lombok.Getter; +import lombok.Setter; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface LoadingPalletLabelMapper { + @Select(""" + SELECT p.id AS plan_id,p.plan_no,p.plan_status,b.container_no,b.warehouse_id, + i.id AS item_id,i.account_id,i.inbound_id,i.inbound_code, + i.destination_warehouse_code,i.destination_warehouse_name, + COALESCE(NULLIF(i.pallet_count,0), + CEIL(COALESCE(NULLIF(o.pallet_count,0), + (SELECT COUNT(*) FROM fl_inbound_weight_result weight + WHERE weight.tenant_id=i.account_id AND weight.inbound_id=i.inbound_id + AND weight.deleted=0 AND weight.recognition_status='CONFIRMED'),0) + * i.package_count / NULLIF(o.total_package_count,0)),0) AS pallet_count, + COALESCE(o.fulfillment_type,'STANDARD') AS fulfillment_type, + o.destination_type,i.load_sequence + FROM fl_loading_plan p + JOIN fl_container_booking b ON b.id=p.container_booking_id AND b.record_status='ACTIVE' + JOIN fl_loading_plan_item i ON i.loading_plan_id=p.id AND i.deleted=0 + LEFT JOIN fl_inbound_order o ON o.id=i.inbound_id AND o.tenant_id=i.account_id AND o.deleted=0 + WHERE p.id=#{planId} + ORDER BY i.destination_warehouse_code,i.load_sequence,i.id + FOR UPDATE + """) + List lockSources(@Param("planId") long planId); + + @Select(""" + SELECT id AS label_id,loading_plan_id AS plan_id,loading_plan_item_id AS item_id, + account_id,inbound_id,inbound_code,container_no,destination_warehouse_code, + destination_warehouse_name,pallet_index,pallet_code + FROM fl_loading_pallet_label WHERE loading_plan_id=#{planId} + ORDER BY destination_warehouse_code,pallet_index,id + """) + List labels(@Param("planId") long planId); + + @Insert(""" + INSERT INTO fl_loading_pallet_label + (id,loading_plan_id,loading_plan_item_id,account_id,inbound_id,inbound_code, + container_no,destination_warehouse_code,destination_warehouse_name,pallet_index,pallet_code,created_at) + VALUES + (#{labelId},#{planId},#{itemId},#{accountId},#{inboundId},#{inboundCode}, + #{containerNo},#{destinationWarehouseCode},#{destinationWarehouseName},#{palletIndex},#{palletCode},CURRENT_TIMESTAMP(3)) + """) + int insert(LabelRow row); + + @Getter @Setter + class SourceRow { + private Long planId; private String planNo; private String planStatus; private String containerNo; + private Long warehouseId; private Long itemId; private Long accountId; private Long inboundId; + private String inboundCode; private String destinationWarehouseCode; private String destinationWarehouseName; + private Integer palletCount; private String fulfillmentType; private Integer loadSequence; + private String destinationType; + } + + @Getter @Setter + class LabelRow { + private Long labelId; private Long planId; private Long itemId; private Long accountId; private Long inboundId; + private String inboundCode; private String containerNo; private String destinationWarehouseCode; + private String destinationWarehouseName; private Integer palletIndex; private String palletCode; + } +} diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/LoadingCompletedOutboxService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/LoadingCompletedOutboxService.java index b787c70c8..1934f8a59 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/LoadingCompletedOutboxService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/LoadingCompletedOutboxService.java @@ -17,6 +17,7 @@ import com.baiyue.firstleg.mapper.LoadingCompletedEventMapper; import com.baiyue.firstleg.mapper.LoadingCompletedEventMapper.Row; import com.baiyue.firstleg.mapper.LoadingCompletedEventMapper.PalletRow; import com.baiyue.firstleg.mapper.LoadingCartonManifestMapper; +import com.baiyue.firstleg.mapper.LoadingPalletLabelMapper; import com.baiyue.firstleg.mapper.LoadingCartonManifestMapper.LabelRow; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; @@ -44,6 +45,8 @@ public class LoadingCompletedOutboxService { private static final long HANDOVER_VERSION = 2L; @Resource private LoadingCompletedEventMapper snapshotMapper; @Resource private LoadingCartonManifestMapper cartonManifestMapper; + @Resource private LoadingPalletLabelMapper palletLabelMapper; + @Resource private LoadingPalletLabelService palletLabelService; @Resource private InboundOutboxMapper outboxMapper; @Resource private ObjectMapper objectMapper; @@ -61,12 +64,15 @@ public class LoadingCompletedOutboxService { if (rows.isEmpty()) throw new BizException(ResultCode.CONFLICT, "装柜计划没有最终实装入仓单,不能生成尾程交接事件"); validateContainerIdentity(rows); validateCustomerSnapshots(rows); + palletLabelService.prepare(planId, rows.get(0).getWarehouseId()); Map> cartonMarks = cartonLabelPools(rows); List palletRows = palletRows(planId); + List standardLabels = palletLabelMapper.labels(planId); return rows.stream().collect(java.util.stream.Collectors.groupingBy(Row::getAccountId, java.util.TreeMap::new, java.util.stream.Collectors.toList())) .entrySet().stream().map(entry -> envelope(entry.getKey(), entry.getValue(), - palletRows.stream().filter(item -> entry.getKey().equals(item.getAccountId())).toList(), cartonMarks)) + palletRows.stream().filter(item -> entry.getKey().equals(item.getAccountId())).toList(), + standardLabels.stream().filter(item -> entry.getKey().equals(item.getAccountId())).toList(), cartonMarks)) .toList(); } @@ -91,13 +97,15 @@ public class LoadingCompletedOutboxService { } private EventEnvelope envelope(long accountId, List rows, List palletRows, + List standardLabels, Map> cartonMarks) { Row first = rows.get(0); Map> byInbound = rows.stream().collect(java.util.stream.Collectors.groupingBy( Row::getSourceInboundId, java.util.TreeMap::new, java.util.stream.Collectors.toList())); List orders = byInbound.values().stream() .map(value -> order(value, palletRows.stream() - .filter(item -> Objects.equals(item.getSourceInboundId(), value.get(0).getSourceInboundId())).toList(), cartonMarks)).toList(); + .filter(item -> Objects.equals(item.getSourceInboundId(), value.get(0).getSourceInboundId())).toList(), + standardLabels.stream().filter(item -> Objects.equals(item.getInboundId(), value.get(0).getSourceInboundId())).toList(), cartonMarks)).toList(); var payload = new FirstLegLoadingPlanCompletedV2(String.valueOf(first.getLoadingPlanId()), first.getPlanNo(), string(first.getContainerBookingId()), ContainerNumbers.requireCanonical(first.getContainerNo()), first.getCabinetNo(), @@ -114,6 +122,7 @@ public class LoadingCompletedOutboxService { } private FirstLegLoadingPlanCompletedV2.Order order(List values, List palletRows, + List standardLabels, Map> cartonMarks) { List sorted = values.stream().sorted(Comparator.comparing(Row::getSourceInboundDetailId)).toList(); Row first = sorted.get(0); @@ -129,15 +138,18 @@ public class LoadingCompletedOutboxService { String fulfillmentType = fulfillmentType(sorted); String orderType = dropship(fulfillmentType) ? "ONE_CLICK_DROPSHIP" : "FIRST_LEG"; List pallets = dropship(fulfillmentType) - ? palletSnapshots(sorted, palletRows) : List.of(); + ? palletSnapshots(sorted, palletRows) : standardLabels.stream() + .map(label -> new FirstLegLoadingPlanCompletedV2.PalletSnapshot(label.getPalletCode(), List.of())).toList(); if ("ONE_CLICK_DROPSHIP".equals(orderType) && pallets.isEmpty()) { throw new BizException(ResultCode.CONFLICT, "一键代发入仓单缺少托盘冻结快照"); } + Integer frozenPalletCount = dropship(fulfillmentType) || standardLabels.isEmpty() + ? actualPalletCount(palletRows) : Integer.valueOf(standardLabels.size()); return new FirstLegLoadingPlanCompletedV2.Order(string(first.getSourceInboundId()), string(first.getRootInboundId()), string(first.getSourceOrderId()), first.getSourceOrderNo(), string(first.getRootOrderId()), first.getInboundCode(), string(first.getDestinationWarehouseId()), first.getDestinationWarehouseCode(), first.getDestinationWarehouseName(), sumInt(sorted, Row::getPackageCount), - sumNullableInt(sorted, Row::getProductQuantity), actualPalletCount(palletRows), + sumNullableInt(sorted, Row::getProductQuantity), frozenPalletCount, sum(sorted, Row::getGrossWeightKg), sum(sorted, Row::getNetWeightKg), sum(sorted, Row::getVolumeCbm), sum(sorted, Row::getDimensionalWeightKg), items, string(first.getAccountId()), first.getCustomerName().trim(), orderType, pallets, diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/LoadingPalletLabelService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/LoadingPalletLabelService.java new file mode 100644 index 000000000..a9eafa154 --- /dev/null +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/LoadingPalletLabelService.java @@ -0,0 +1,147 @@ +package com.baiyue.firstleg.service; + +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.baiyue.common.core.api.ApiResponse; +import com.baiyue.common.core.api.ResultCode; +import com.baiyue.common.core.exception.BizException; +import com.baiyue.common.event.ContainerNumbers; +import com.baiyue.firstleg.client.PrintPdfClient; +import com.baiyue.firstleg.dto.LoadingListDtos.PalletLabel; +import com.baiyue.firstleg.dto.LoadingListDtos.PalletLabelGroup; +import com.baiyue.firstleg.dto.LoadingListDtos.PalletLabelManifest; +import com.baiyue.firstleg.dto.LoadingListDtos.PalletLabelPrintRequest; +import com.baiyue.firstleg.mapper.LoadingPalletLabelMapper; +import com.baiyue.firstleg.mapper.LoadingPalletLabelMapper.LabelRow; +import com.baiyue.firstleg.mapper.LoadingPalletLabelMapper.SourceRow; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import feign.FeignException; +import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.client.circuitbreaker.NoFallbackAvailableException; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; + +/** 散货托盘码是柜号与 FBA 仓维度的稳定业务标识;一件代发继续使用装箱打托事实。 */ +@Service +public class LoadingPalletLabelService { + private static final BigDecimal PAGE_MM = new BigDecimal("100"); + @Resource private LoadingPalletLabelMapper mapper; + @Resource private PrintPdfClient printClient; + @Resource private ObjectMapper objectMapper; + @Value("${baiyue.security.internal-service-token}") private String internalToken; + + @Transactional + public PalletLabelManifest prepare(long planId, long warehouseId) { + List sources = mapper.lockSources(planId); + if (sources.isEmpty()) throw new BizException(ResultCode.NOT_FOUND, "装柜计划不存在或没有有效明细"); + SourceRow first = sources.get(0); + if (!Objects.equals(first.getWarehouseId(), warehouseId)) throw new BizException(ResultCode.NOT_FOUND, "装柜计划不属于当前仓库"); + if (!List.of("LOADING", "COMPLETED").contains(first.getPlanStatus())) { + throw new BizException(ResultCode.CONFLICT, "请先确认预装清单,再生成散货托盘码"); + } + String containerNo; + try { containerNo = ContainerNumbers.requireCanonical(first.getContainerNo()); } + catch (IllegalArgumentException exception) { throw new BizException(ResultCode.CONFLICT, "请先补录有效集装箱号"); } + List standard = sources.stream().filter(row -> !"ONE_CLICK_DROPSHIP".equals(row.getFulfillmentType())) + .filter(row -> "FBA".equals(row.getDestinationType())) + .filter(row -> Objects.requireNonNullElse(row.getPalletCount(), 0) > 0).toList(); + if (standard.stream().anyMatch(row -> !StringUtils.hasText(row.getDestinationWarehouseCode()))) { + throw new BizException(ResultCode.CONFLICT, "散货明细缺少 FBA 仓编码,不能生成托盘码"); + } + List existing = mapper.labels(planId); + List expected = expected(first, standard, containerNo); + if (existing.isEmpty()) { + expected.forEach(row -> { if (mapper.insert(row) != 1) throw new BizException(ResultCode.CONFLICT, "托盘码生成失败,请刷新后重试"); }); + existing = mapper.labels(planId); + } + requireSame(expected, existing); + return manifest(first, existing); + } + + @Transactional + public ResponseEntity print(long planId, long warehouseId, PalletLabelPrintRequest request, String requestId) { + PalletLabelManifest manifest = prepare(planId, warehouseId); + String warehouseCode = normalize(request == null ? null : request.destinationWarehouseCode()); + Integer count = request == null ? null : request.count(); + if ((warehouseCode == null) != (count == null)) throw new BizException(ResultCode.BAD_REQUEST, "按仓打印时必须同时选择 FBA 仓和打印张数"); + List selected = warehouseCode == null ? manifest.groups().stream().flatMap(group -> group.labels().stream()).toList() + : manifest.groups().stream().filter(group -> group.destinationWarehouseCode().equalsIgnoreCase(warehouseCode)) + .flatMap(group -> group.labels().stream()).limit(count).toList(); + if (selected.isEmpty() || (count != null && selected.size() != count)) throw new BizException(ResultCode.BAD_REQUEST, "所选 FBA 仓或打印张数无效"); + List labels = selected.stream().map(label -> new PrintPdfClient.Label( + label.palletCode(), label.destinationWarehouseName(), "PALLET " + label.palletIndex(), + "CONTAINER " + label.containerNo(), label.palletCode(), null)).toList(); + String suffix = warehouseCode == null ? "全部" : warehouseCode + "-" + count + "张"; + var pdfRequest = new PrintPdfClient.InboundMarkPdfRequest("INBOUND_MARK_V1", + new PrintPdfClient.PageSpec(PAGE_MM, PAGE_MM), manifest.containerNo() + "-托盘码-" + suffix + ".pdf", labels); + try { return requirePdf(printClient.generateInboundMarks(internalToken, requestId, pdfRequest)); } + catch (FeignException | NoFallbackAvailableException exception) { throw new BizException(ResultCode.SERVICE_UNAVAILABLE, "打印服务暂不可用,请稍后重试"); } + } + + private List expected(SourceRow plan, List sources, String containerNo) { + Map indexes = new LinkedHashMap<>(); + List result = new ArrayList<>(); + for (SourceRow source : sources) { + String code = source.getDestinationWarehouseCode().trim().toUpperCase(Locale.ROOT); + for (int local = 0; local < source.getPalletCount(); local++) { + int index = indexes.merge(code, 1, Integer::sum); + if (index > 999) throw new BizException(ResultCode.CONFLICT, "单柜同一 FBA 仓托盘数不能超过 999"); + LabelRow row = new LabelRow(); row.setLabelId(IdWorker.getId()); row.setPlanId(plan.getPlanId()); + row.setItemId(source.getItemId()); row.setAccountId(source.getAccountId()); row.setInboundId(source.getInboundId()); + row.setInboundCode(source.getInboundCode()); row.setContainerNo(containerNo); + row.setDestinationWarehouseCode(code); row.setDestinationWarehouseName(source.getDestinationWarehouseName()); + row.setPalletIndex(index); row.setPalletCode(containerNo + "-" + code + "-" + String.format("%03d", index)); + if (row.getPalletCode().length() > 128) throw new BizException(ResultCode.CONFLICT, "托盘码长度超过系统限制"); + result.add(row); + } + } + return result; + } + + private void requireSame(List expected, List actual) { + List left = expected.stream().map(this::identity).toList(); + List right = actual.stream().map(this::identity).toList(); + if (!left.equals(right)) throw new BizException(ResultCode.CONFLICT, "已生成的托盘码与当前装柜明细不一致"); + } + private String identity(LabelRow row) { return row.getItemId()+"|"+row.getPalletCode(); } + + private PalletLabelManifest manifest(SourceRow plan, List rows) { + Map> grouped = rows.stream().collect(java.util.stream.Collectors.groupingBy( + LabelRow::getDestinationWarehouseCode, LinkedHashMap::new, java.util.stream.Collectors.toList())); + List groups = grouped.values().stream().map(values -> new PalletLabelGroup( + values.get(0).getDestinationWarehouseCode(), values.get(0).getDestinationWarehouseName(), values.size(), + values.stream().map(this::label).toList())).toList(); + String containerNo = rows.isEmpty() ? plan.getContainerNo() : rows.get(0).getContainerNo(); + return new PalletLabelManifest(plan.getPlanId(), plan.getPlanNo(), containerNo, rows.size(), groups); + } + private PalletLabel label(LabelRow row) { return new PalletLabel(row.getLabelId(), row.getItemId(), row.getAccountId(), row.getInboundId(), row.getInboundCode(), row.getContainerNo(), row.getDestinationWarehouseCode(), row.getDestinationWarehouseName(), row.getPalletIndex(), row.getPalletCode()); } + private static String normalize(String value) { return value == null || value.isBlank() ? null : value.trim(); } + + private ResponseEntity requirePdf(ResponseEntity response) { + byte[] body = response == null || response.getBody() == null ? new byte[0] : response.getBody(); + MediaType type = response == null ? null : response.getHeaders().getContentType(); + if (type == null || !MediaType.APPLICATION_PDF.isCompatibleWith(type) || body.length == 0) { + try { ApiResponse error = objectMapper.readValue(body, new TypeReference<>() { }); + if (error != null && !error.successful()) throw new BizException(ResultCode.of(error.code()), error.message()); + } catch (BizException exception) { throw exception; } catch (Exception ignored) { } + throw new BizException(ResultCode.SERVICE_UNAVAILABLE, "打印服务返回了无效响应"); + } + HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_PDF); + String disposition = response.getHeaders().getFirst(HttpHeaders.CONTENT_DISPOSITION); + if (StringUtils.hasText(disposition)) headers.set(HttpHeaders.CONTENT_DISPOSITION, disposition); + headers.setContentLength(body.length); return ResponseEntity.ok().headers(headers).body(body); + } +} diff --git a/firstleg/src/main/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailDispatcher.java b/firstleg/src/main/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailDispatcher.java index d44d0ed46..026a5fbc9 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailDispatcher.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailDispatcher.java @@ -20,11 +20,10 @@ public class TerminalDrayageMailDispatcher { @Value("${baiyue.terminal-drayage.mail.port:587}") private int port; @Value("${baiyue.terminal-drayage.mail.username}") private String username; @Value("${baiyue.terminal-drayage.mail.password}") private String password; - @Value("${baiyue.terminal-drayage.mail.from}") private String from; @Value("${baiyue.terminal-drayage.mail.ssl:false}") private boolean ssl; JavaMailSenderImpl sender() { - TerminalDrayageMailService.validateAddress(from); + TerminalDrayageMailService.validateAddress(username); var sender = new JavaMailSenderImpl(); sender.setHost(host); sender.setPort(port); sender.setUsername(username); sender.setPassword(password); sender.setDefaultEncoding("UTF-8"); @@ -47,7 +46,7 @@ public class TerminalDrayageMailDispatcher { if (mapper.claimMail(mail.id()) != 1) continue; try { var message = new SimpleMailMessage(); - message.setFrom(from); message.setTo(mail.recipient()); + message.setFrom(username); message.setTo(mail.recipient()); message.setSubject(mail.subject()); message.setText(mail.body()); sender().send(message); if (mapper.completeMail(mail.id()) != 1) log.warn("Terminal drayage mail completion requires review: {}", mail.id()); diff --git a/firstleg/src/main/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailService.java b/firstleg/src/main/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailService.java index afd2ede88..e4044bc83 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailService.java @@ -34,11 +34,12 @@ public class TerminalDrayageMailService { public void replaceFleet(long containerId, String containerNo, long oldSupplierId, long newSupplierId, long operatorId) { var next = contact(newSupplierId, true); - // 取消通知发往原请求的收件地址;尚未发过请求则读取原车队资料,允许原车队已停用。 + // 请求邮件记录就是当前车队是否已下发的事实;未下发过时不能向原车队发送无来源的取消通知。 MailTask previous = mapper.lastPickupMail(containerId, oldSupplierId); - var old = previous == null ? contact(oldSupplierId, false) - : new WarehouseSupplierClient.TruckingContact(oldSupplierId, previous.fleetName(), previous.recipient()); - enqueue(containerId, containerNo, oldSupplierId, old.name(), old.email(), "CANCEL_PICKUP", operatorId); + if (previous != null) { + enqueue(containerId, containerNo, oldSupplierId, previous.fleetName(), previous.recipient(), + "CANCEL_PICKUP", operatorId); + } enqueue(containerId, containerNo, newSupplierId, next.name(), next.email(), "REQUEST_PICKUP", operatorId); } diff --git a/firstleg/src/main/resources/application.yml b/firstleg/src/main/resources/application.yml index aa8f58cd5..6033ef4fa 100644 --- a/firstleg/src/main/resources/application.yml +++ b/firstleg/src/main/resources/application.yml @@ -37,7 +37,6 @@ baiyue: port: ${TERMINAL_DRAYAGE_MAIL_PORT:587} username: ${TERMINAL_DRAYAGE_MAIL_USERNAME:} password: ${TERMINAL_DRAYAGE_MAIL_PASSWORD:} - from: ${TERMINAL_DRAYAGE_MAIL_FROM:} ssl: ${TERMINAL_DRAYAGE_MAIL_SSL:false} scan-delay: ${TERMINAL_DRAYAGE_MAIL_SCAN_DELAY:10000} carrier-schedule: diff --git a/firstleg/src/main/resources/db/phase3-smart-loading-schema.sql b/firstleg/src/main/resources/db/phase3-smart-loading-schema.sql index 54dcd3305..25e445f75 100644 --- a/firstleg/src/main/resources/db/phase3-smart-loading-schema.sql +++ b/firstleg/src/main/resources/db/phase3-smart-loading-schema.sql @@ -354,6 +354,29 @@ CREATE TABLE IF NOT EXISTS fl_loading_plan_item ( CONSTRAINT chk_loading_item_deleted CHECK (deleted IN (0, 1)) ) ENGINE=InnoDB COMMENT='智能装柜客户货物明细;客户归属仅在明细层'; +CREATE TABLE IF NOT EXISTS fl_loading_pallet_label ( + id BIGINT UNSIGNED NOT NULL COMMENT '散货托盘标签ID(雪花ID)', + loading_plan_id BIGINT UNSIGNED NOT NULL COMMENT '装柜计划ID', + loading_plan_item_id BIGINT UNSIGNED NOT NULL COMMENT '标签归属装柜明细ID', + account_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID快照', + inbound_id BIGINT UNSIGNED NOT NULL COMMENT '入仓单ID快照', + inbound_code VARCHAR(40) NOT NULL COMMENT '入仓码快照', + container_no VARCHAR(64) NOT NULL COMMENT '真实集装箱号快照', + destination_warehouse_code VARCHAR(64) NOT NULL COMMENT 'FBA仓编码快照', + destination_warehouse_name VARCHAR(128) NULL COMMENT 'FBA仓名称快照', + pallet_index INT UNSIGNED NOT NULL COMMENT '当前柜当前FBA仓内从1开始的序号', + pallet_code VARCHAR(128) NOT NULL COMMENT '托盘码:集装箱号-FBA仓编码-三位序号', + created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '生成时间', + PRIMARY KEY (id), + UNIQUE KEY uk_loading_pallet_code (pallet_code), + UNIQUE KEY uk_loading_pallet_index (loading_plan_id,destination_warehouse_code,pallet_index), + KEY idx_loading_pallet_item (loading_plan_item_id,pallet_index), + KEY idx_loading_pallet_inbound (account_id,inbound_id), + CONSTRAINT fk_loading_pallet_plan FOREIGN KEY (loading_plan_id) REFERENCES fl_loading_plan(id), + CONSTRAINT fk_loading_pallet_item FOREIGN KEY (loading_plan_item_id) REFERENCES fl_loading_plan_item(id), + CONSTRAINT chk_loading_pallet_index CHECK (pallet_index BETWEEN 1 AND 999) +) ENGINE=InnoDB COMMENT='散货按柜号和FBA仓冻结的可打印托盘码'; + -- 柜次级简单文件仅承载目的港清关和提货单;PU资料作为数字码保存在货柜主表。 CREATE TABLE IF NOT EXISTS fl_container_document ( id BIGINT UNSIGNED NOT NULL COMMENT '货柜文件关联ID(雪花ID)', diff --git a/firstleg/src/main/resources/openapi/loading-lists-v1.yaml b/firstleg/src/main/resources/openapi/loading-lists-v1.yaml index 8dce29cbf..773d54235 100644 --- a/firstleg/src/main/resources/openapi/loading-lists-v1.yaml +++ b/firstleg/src/main/resources/openapi/loading-lists-v1.yaml @@ -74,6 +74,23 @@ paths: content: {application/json: {schema: {$ref: '#/components/schemas/ConfirmPreloadRequest'}}} responses: '200': {$ref: '#/components/responses/PreloadConfirmationResponse'} + /api/platform/v1/first-leg/loading-plans/{planId}/pallet-labels/prepare: + post: + summary: 生成并查询散货托盘码清单 + description: 预装确认且已有真实柜号后,按柜号-FBA仓编码-三位序号生成稳定清单;一件代发不参与。 + parameters: [{$ref: '#/components/parameters/PlanId'}, {$ref: '#/components/parameters/WarehouseId'}] + responses: + '200': {description: 按 FBA 仓分组的散货托盘码清单, content: {application/json: {schema: {type: object}}}} + /api/platform/v1/first-leg/loading-plans/{planId}/pallet-labels/print: + post: + summary: 打印散货托盘码 + description: 仓码和张数均为空时打印全部;均有值时打印该 FBA 仓从第1张开始的指定数量,用于补打。 + parameters: [{$ref: '#/components/parameters/PlanId'}, {$ref: '#/components/parameters/WarehouseId'}] + requestBody: + required: true + content: {application/json: {schema: {$ref: '#/components/schemas/PalletLabelPrintRequest'}}} + responses: + '200': {description: 100mm × 100mm 托盘码 PDF, content: {application/pdf: {schema: {type: string, format: binary}}}} /api/platform/v1/first-leg/loading-lists: get: summary: 分页查询装柜清单 @@ -430,3 +447,9 @@ components: voyageNo: {type: string, maxLength: 64, nullable: true, description: 航次} expectedVersion: {type: integer, format: int32, minimum: 0, description: 当前乐观锁版本} operationReason: {type: string, minLength: 1, maxLength: 500, nullable: true, description: 纠正已有真实集装箱号时必填;首次补录或保持当前柜号时可省略} + PalletLabelPrintRequest: + type: object + additionalProperties: false + properties: + destinationWarehouseCode: {type: string, maxLength: 64, nullable: true} + count: {type: integer, minimum: 1, maximum: 999, nullable: true} diff --git a/firstleg/src/main/resources/openapi/terminal-drayage-v1.yaml b/firstleg/src/main/resources/openapi/terminal-drayage-v1.yaml index e13196f78..97d86e172 100644 --- a/firstleg/src/main/resources/openapi/terminal-drayage-v1.yaml +++ b/firstleg/src/main/resources/openapi/terminal-drayage-v1.yaml @@ -55,7 +55,7 @@ paths: /api/platform/v1/terminal-drayages/{containerBookingId}/pickup-email: post: summary: 将当前车队提柜邮件加入发送队列 - description: 初次选择车队不发信;此命令携带版本和幂等键,发送成功是任务已入队,不表示已送达。首次更换车队自动原子入队取消和新提柜两封邮件。同一车队重复选择不发信。 + description: 初次选择车队不发信;此命令携带版本和幂等键,发送成功是任务已入队,不表示已送达。人工可使用最新版本重复发送提柜请求。更换车队时,原车队存在提柜请求邮件记录才原子入队取消邮件,并始终为新车队入队提柜请求;原车队从未下发时不发送取消邮件。同一车队重复选择不发信。 x-permission: platform:firstleg:terminal-drayage:fleet:edit parameters: [{$ref: '#/components/parameters/ContainerBookingId'}, {$ref: '#/components/parameters/IdempotencyKey'}] requestBody: {required: true, content: {application/json: {schema: {type: object, required: [expectedVersion], properties: {expectedVersion: {type: integer, minimum: 0}}}}}} diff --git a/firstleg/src/test/java/com/baiyue/firstleg/controller/FbaPricingContractTest.java b/firstleg/src/test/java/com/baiyue/firstleg/controller/FbaPricingContractTest.java index 10aa5422a..717cd6f6d 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/controller/FbaPricingContractTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/controller/FbaPricingContractTest.java @@ -23,6 +23,8 @@ class FbaPricingContractTest { + " 'firstleg:fba-pricing:confirm')"); assertPricingAuthority("send", "hasAnyAuthority('firstleg:inbound:confirm-send-fee'," + " 'firstleg:inbound:send-fee')"); + assertPricingAuthority("adjustPublished", "hasAnyAuthority('firstleg:fba-pricing:adjust'," + + " 'firstleg:inbound:confirm-send-fee')"); } @Test diff --git a/firstleg/src/test/java/com/baiyue/firstleg/controller/LoadingListControllerContractTest.java b/firstleg/src/test/java/com/baiyue/firstleg/controller/LoadingListControllerContractTest.java index aca53edea..4f52501c2 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/controller/LoadingListControllerContractTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/controller/LoadingListControllerContractTest.java @@ -75,6 +75,9 @@ class LoadingListControllerContractTest { .contains("PDA任务尚未领取且无任何物理作业事实") .contains("/loading-plans/{planId}/confirm") .contains("/loading-plans/{planId}/lifecycle") + .contains("/loading-plans/{planId}/pallet-labels/prepare") + .contains("/loading-plans/{planId}/pallet-labels/print") + .contains("柜号-FBA仓编码-三位序号") .contains("不得以错误文案或 A0404 猜测阶段") .contains("confirmationStatus") .contains("canConfirm") @@ -123,6 +126,8 @@ class LoadingListControllerContractTest { "/api/platform/v1/first-leg/loading-plans/{planId}/lifecycle", "/api/platform/v1/first-leg/loading-plans/{planId}/transport", "/api/platform/v1/first-leg/loading-plans/{planId}/confirm", + "/api/platform/v1/first-leg/loading-plans/{planId}/pallet-labels/prepare", + "/api/platform/v1/first-leg/loading-plans/{planId}/pallet-labels/print", "/api/platform/v1/first-leg/loading-lists", "/api/platform/v1/first-leg/loading-lists/{planId}"); Map components = stringMap(document.get("components")); @@ -132,7 +137,7 @@ class LoadingListControllerContractTest { "ConfirmedSummary", "LoadingItem", "OperationHistory", "PreloadDetail", "ConfirmedDetail", "TransportUpdateRequest", "PreloadReadiness", "ConfirmPreloadRequest", "PreloadConfirmation", "PreloadConfirmationEnvelope", - "LifecycleResolution", "LifecycleResolutionEnvelope"); + "LifecycleResolution", "LifecycleResolutionEnvelope", "PalletLabelPrintRequest"); assertThat(properties(schemas, "LifecycleResolution")).containsOnlyKeys( "planId", "containerBookingId", "warehouseId", "planNo", "planStatus", "detailResource", "requiredPermission"); diff --git a/firstleg/src/test/java/com/baiyue/firstleg/service/LoadingCompletedOutboxServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/service/LoadingCompletedOutboxServiceTest.java index 4edbe21e3..76adbe620 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/service/LoadingCompletedOutboxServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/service/LoadingCompletedOutboxServiceTest.java @@ -9,6 +9,7 @@ import com.baiyue.firstleg.mapper.LoadingCompletedEventMapper.Row; import com.baiyue.firstleg.mapper.LoadingCompletedEventMapper.PalletRow; import com.baiyue.firstleg.mapper.LoadingCartonManifestMapper; import com.baiyue.firstleg.mapper.LoadingCartonManifestMapper.LabelRow; +import com.baiyue.firstleg.mapper.LoadingPalletLabelMapper; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -30,14 +31,19 @@ class LoadingCompletedOutboxServiceTest { private final LoadingCompletedEventMapper snapshots = mock(LoadingCompletedEventMapper.class); private final InboundOutboxMapper outbox = mock(InboundOutboxMapper.class); private final LoadingCartonManifestMapper manifests = mock(LoadingCartonManifestMapper.class); + private final LoadingPalletLabelMapper palletLabels = mock(LoadingPalletLabelMapper.class); + private final LoadingPalletLabelService palletLabelService = mock(LoadingPalletLabelService.class); private final ObjectMapper mapper = new ObjectMapper().findAndRegisterModules(); private final LoadingCompletedOutboxService service = new LoadingCompletedOutboxService(); @BeforeEach void setup() { ReflectionTestUtils.setField(service,"snapshotMapper",snapshots); ReflectionTestUtils.setField(service,"cartonManifestMapper",manifests); + ReflectionTestUtils.setField(service,"palletLabelMapper",palletLabels); + ReflectionTestUtils.setField(service,"palletLabelService",palletLabelService); ReflectionTestUtils.setField(service,"outboxMapper",outbox); ReflectionTestUtils.setField(service,"objectMapper",mapper); + when(palletLabels.labels(anyLong())).thenReturn(List.of()); when(manifests.labelPool(anyLong(), anyLong())).thenAnswer(invocation -> List.of( label(101, "BOX-101"), label(102, "BOX-102"), label(202, "BOX-202"), label(302, "BOX-302"))); diff --git a/firstleg/src/test/java/com/baiyue/firstleg/service/LoadingPalletLabelServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/service/LoadingPalletLabelServiceTest.java new file mode 100644 index 000000000..46759a201 --- /dev/null +++ b/firstleg/src/test/java/com/baiyue/firstleg/service/LoadingPalletLabelServiceTest.java @@ -0,0 +1,46 @@ +package com.baiyue.firstleg.service; + +import com.baiyue.firstleg.mapper.LoadingPalletLabelMapper; +import org.junit.jupiter.api.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class LoadingPalletLabelServiceTest { + @Test + void generatesStableIndexesPerContainerAndFbaAndSkipsDropship() { + LoadingPalletLabelMapper mapper = mock(LoadingPalletLabelMapper.class); + LoadingPalletLabelService service = new LoadingPalletLabelService(); + ReflectionTestUtils.setField(service, "mapper", mapper); + List saved = new ArrayList<>(); + when(mapper.lockSources(10L)).thenReturn(List.of(source(3, "LAX9", 1, "STANDARD"), + source(1, "ONT8", 2, "STANDARD"), source(2, "ONT8", 1, "STANDARD"), + source(4, "ONT8", 4, "ONE_CLICK_DROPSHIP"))); + when(mapper.labels(10L)).thenAnswer(ignored -> List.copyOf(saved)); + when(mapper.insert(any())).thenAnswer(invocation -> { saved.add(invocation.getArgument(0)); return 1; }); + + var manifest = service.prepare(10L, 20L); + + assertThat(manifest.totalCount()).isEqualTo(4); + assertThat(manifest.groups()).extracting(group -> group.destinationWarehouseCode() + ":" + group.totalCount()) + .containsExactly("LAX9:1", "ONT8:3"); + assertThat(saved).extracting(LoadingPalletLabelMapper.LabelRow::getPalletCode) + .containsExactly("MSCU6639870-LAX9-001", "MSCU6639870-ONT8-001", + "MSCU6639870-ONT8-002", "MSCU6639870-ONT8-003"); + } + + private LoadingPalletLabelMapper.SourceRow source(long itemId, String destination, int pallets, String fulfillment) { + var row = new LoadingPalletLabelMapper.SourceRow(); row.setPlanId(10L); row.setPlanNo("LP-1"); + row.setPlanStatus("LOADING"); row.setContainerNo("MSCU6639870"); row.setWarehouseId(20L); + row.setItemId(itemId); row.setAccountId(100L); row.setInboundId(itemId + 1000); + row.setInboundCode("RK-" + itemId); row.setDestinationWarehouseCode(destination); + row.setDestinationWarehouseName(destination); row.setPalletCount(pallets); + row.setFulfillmentType(fulfillment); row.setDestinationType("FBA"); return row; + } +} diff --git a/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailDispatcherTest.java b/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailDispatcherTest.java index 50c12bebc..a58ffa97f 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailDispatcherTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailDispatcherTest.java @@ -7,6 +7,7 @@ import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.test.util.ReflectionTestUtils; import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; import static org.mockito.ArgumentMatchers.*; @@ -16,7 +17,7 @@ class TerminalDrayageMailDispatcherTest { TerminalDrayageMailDispatcher worker = spy(new TerminalDrayageMailDispatcher(mapper)); void setup() { - ReflectionTestUtils.setField(worker,"from","operations@example.com"); + ReflectionTestUtils.setField(worker,"username","operations@example.com"); doReturn(sender).when(worker).sender(); when(mapper.pendingMails()).thenReturn(List.of(new TerminalDrayageMapper.MailTask( 1L,11L,2L,"Fleet","fleet@example.com","REQUEST_PICKUP","Pickup","Body","PENDING",0,null,null,null))); @@ -27,8 +28,10 @@ class TerminalDrayageMailDispatcherTest { @Test void onlyClaimsOnceAndMarksSentAfterSmtpAccepted() { setup(); worker.dispatch(); var ordered = inOrder(mapper,sender); + var sent = org.mockito.ArgumentCaptor.forClass(SimpleMailMessage.class); ordered.verify(mapper).claimMail(1L); - ordered.verify(sender).send(any(SimpleMailMessage.class)); + ordered.verify(sender).send(sent.capture()); + assertThat(sent.getValue().getFrom()).isEqualTo("operations@example.com"); ordered.verify(mapper).completeMail(1L); when(mapper.claimMail(1L)).thenReturn(0); worker.dispatch(); diff --git a/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailServiceTest.java index e8863fdc7..156204c38 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageMailServiceTest.java @@ -27,6 +27,8 @@ class TerminalDrayageMailServiceTest { } @Test void replacementQueuesCancellationThenRequestWithSeparateFrozenRecipients() { + when(mapper.lastPickupMail(11L, 1L)).thenReturn(new TerminalDrayageMapper.MailTask( + 90L,11L,1L,"Old Fleet","old@example.com","REQUEST_PICKUP","subject","body","SENT",1,null,null,null)); service.replaceFleet(11L, "MSCU1234567", 1L, 2L, 7L); var order = inOrder(mapper); order.verify(mapper).insertMail(anyLong(), eq(11L), eq(1L), eq("Old Fleet"), eq("old@example.com"), @@ -35,6 +37,16 @@ class TerminalDrayageMailServiceTest { eq("REQUEST_PICKUP"), eq("Port pickup request - MSCU1234567"), contains("Please arrange"), eq(7L)); } + @Test void replacementWithoutPreviousPickupMailQueuesOnlyNewRequest() { + service.replaceFleet(11L, "MSCU1234567", 1L, 2L, 7L); + + verify(mapper, never()).insertMail(anyLong(), eq(11L), eq(1L), anyString(), anyString(), + eq("CANCEL_PICKUP"), anyString(), anyString(), eq(7L)); + verify(mapper).insertMail(anyLong(), eq(11L), eq(2L), eq("New Fleet"), eq("new@example.com"), + eq("REQUEST_PICKUP"), eq("Port pickup request - MSCU1234567"), contains("Please arrange"), eq(7L)); + verify(suppliers, never()).truckingContact("test-token", 1L, false); + } + @Test void cancellationUsesOriginalRecipientEvenIfSupplierEmailChanged() { when(mapper.lastPickupMail(11L, 1L)).thenReturn(new TerminalDrayageMapper.MailTask( 90L,11L,1L,"Frozen Fleet","original@example.com","REQUEST_PICKUP","subject","body","SENT",1,null,null,null)); diff --git a/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageServiceTest.java index babd5ddca..0520234e4 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/TerminalDrayageServiceTest.java @@ -374,18 +374,23 @@ class TerminalDrayageServiceTest { } @Test - void manualPickupEmailUsesLockedVersionAndRejectsStaleClick() { + void manualPickupEmailRejectsStaleClickAndAllowsRepeatWithLatestVersion() { Context context = context("ARRIVED_DESTINATION_PORT",null); when(mapper.lockContext(11L)).thenReturn(context); when(mapper.context(11L)).thenReturn(context); TerminalDrayageEntity row = row(3); when(mapper.lock(11L)).thenReturn(row); when(mapper.find(11L)).thenReturn(row); - when(mapper.updateAggregate(any(),anyInt(),anyLong(),anyString())).thenAnswer(invocation -> {row.setVersion(4);return 1;}); + when(mapper.updateAggregate(any(),anyInt(),anyLong(),anyString())).thenAnswer(invocation -> { + row.setVersion(invocation.getArgument(1, Integer.class) + 1); + return 1; + }); var request = new com.baiyue.firstleg.terminaldrayage.dto.TerminalDrayageDtos.EmailRequest(3); service.sendPickupEmail(11L,7L,"admin","mail-1",request); assertThatThrownBy(() -> service.sendPickupEmail(11L,7L,"admin","mail-2",request)).isInstanceOf(BizException.class); - verify(mails,times(1)).request(11L,"MSCU1234567",91L,7L); + service.sendPickupEmail(11L,7L,"admin","mail-3", + new com.baiyue.firstleg.terminaldrayage.dto.TerminalDrayageDtos.EmailRequest(4)); + verify(mails,times(2)).request(11L,"MSCU1234567",91L,7L); } private Context context(String node, LocalDateTime unloadedAt) { diff --git a/lastleg-service/AGENTS.md b/lastleg-service/AGENTS.md index f3d9c14d0..2bcd0a619 100644 --- a/lastleg-service/AGENTS.md +++ b/lastleg-service/AGENTS.md @@ -9,6 +9,8 @@ ## 快速索引 +头程来源托盘快照:`service/LoadingCompletedConsumer.java`、`mapper/LastlegSourcePalletMapper.java`;来源标签随装柜完成事件落入 `ll_order_source_pallet`,后续由 `inboundplan/service/InboundPlanService.java` 与 `ContainerInboundPlanConversionCoordinator.java` 传递给海外资源批量预留。排查标签跨区丢失时沿此链路核对,不能在尾程页面重新生成头程托盘码。 + | 功能 | 入口 | |---|---| | 内部模块化基线与依赖分析 | `docs/lastleg-internal-modularization-baseline.md`、`scripts/analyze-lastleg-dependencies.mjs`、`scripts/analyze-lastleg-dependencies.test.mjs`、`src/test/resources/architecture/lastleg-slice-dependencies.json`;只约束本服务内部包依赖,不改变部署单元或数据库边界 | diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/gateway/HttpWarehouseResourceGateway.java b/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/gateway/HttpWarehouseResourceGateway.java index 316de973b..86caa1c1c 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/gateway/HttpWarehouseResourceGateway.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/gateway/HttpWarehouseResourceGateway.java @@ -147,13 +147,20 @@ public class HttpWarehouseResourceGateway implements WarehouseResourceGateway { throw new ResponseStatusException(HttpStatus.CONFLICT, "Reserved pallet customer binding is invalid"); } - WarehousePalletData pallet = lookupPallet(palletCode).data(); - if (pallet.id() != palletId || pallet.warehouseId() != warehouseId || pallet.locationId() != locationId + WarehousePalletReference pallet; + try { + pallet = reference(lookupPallet(palletCode).data()); + } catch (ResponseStatusException exception) { + if (exception.getStatusCode().value() != 404) throw exception; + // 已生成计划可能保留早期展示码;确认过的资源绑定仍是唯一可信物理身份。 + pallet = resolvePallet(palletId); + } + if (pallet.palletId() != palletId || pallet.warehouseId() != warehouseId || pallet.locationId() != locationId || !"OCCUPIED".equals(pallet.status())) { throw new ResponseStatusException(HttpStatus.CONFLICT, "Scanned pallet does not match the reserved inbound plan resource"); } - return reference(pallet); + return pallet; } @Override diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/gateway/WarehouseResourceGateway.java b/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/gateway/WarehouseResourceGateway.java index 46869f502..1d1944f95 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/gateway/WarehouseResourceGateway.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/gateway/WarehouseResourceGateway.java @@ -58,7 +58,8 @@ public interface WarehouseResourceGateway { java.math.BigDecimal maxLoadKg, String status) { } record PalletBatchEnsure(long warehouseId, String batchKey, List items) { } record PalletBatchItemRequest(long customerId, String businessKey, String inboundPlanNo, - int sequenceNo, String palletType, String fbaWarehouseCode) { } + int sequenceNo, String palletType, String fbaWarehouseCode, + String palletCode) { } record PalletBatchCommand(long warehouseId, String batchKey, String commandKey) { } record PalletBatchCompensation(long warehouseId, String batchKey, String commandKey, String reason) { } record PalletBatchResponse(long batchId, String batchKey, String status, int attemptNo, diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/service/ContainerInboundPlanConversionCoordinator.java b/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/service/ContainerInboundPlanConversionCoordinator.java index b78c9b395..3f3767265 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/service/ContainerInboundPlanConversionCoordinator.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/service/ContainerInboundPlanConversionCoordinator.java @@ -117,7 +117,7 @@ public class ContainerInboundPlanConversionCoordinator { preparation.warehouseId(), command.getBatchKey(), preparation.items().stream().map(item -> new WarehouseResourceGateway.PalletBatchItemRequest(Long.parseLong(item.customerId()), item.businessKey(), item.planNo(), item.globalSequenceNo(), "STANDARD", - item.fbaWarehouseCode())).toList()); + item.fbaWarehouseCode(), item.palletCode())).toList()); WarehouseResourceGateway.PalletBatchResponse reservation; try { reservation = warehouse.ensurePalletBatch(ensure); @@ -207,10 +207,15 @@ public class ContainerInboundPlanConversionCoordinator { .flatMap(group -> group.orders().stream()).filter(item -> "READY".equals(item.readiness())).toList()) { long planId = IdWorker.getId(); String planNo = numbers.next("INBOUND_PLAN", order.destinationWarehouseCode(), planId); + List sourcePalletNos = plans.sourcePalletNos( + order.customerId(), Long.parseLong(order.orderId()), order.orderType()); + if (sourcePalletNos.size() != order.suggestedPalletCount()) { + throw new ResponseStatusException(HttpStatus.CONFLICT, "头程托盘码数量与柜级预览不一致"); + } for (int localSequence = 1; localSequence <= order.suggestedPalletCount(); localSequence++) { items.add(new PreparedItem(order.customerId(), Long.parseLong(order.orderId()), planId, planNo, localSequence, ++globalSequence, "CIP:" + generationId + ":" + globalSequence, - trimToNull(order.fbaWarehouseCode()))); + trimToNull(order.fbaWarehouseCode()), sourcePalletNos.get(localSequence - 1))); } } Preparation preparation = new Preparation(warehouseId, List.copyOf(items)); @@ -373,5 +378,5 @@ public class ContainerInboundPlanConversionCoordinator { public record Preparation(long warehouseId, List items) { } public record PreparedItem(String customerId, long orderId, long planId, String planNo, int localSequenceNo, int globalSequenceNo, String businessKey, - String fbaWarehouseCode) { } + String fbaWarehouseCode, String palletCode) { } } diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/service/InboundPlanService.java b/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/service/InboundPlanService.java index f28059c3a..7fe420dee 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/service/InboundPlanService.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/service/InboundPlanService.java @@ -27,6 +27,7 @@ import com.baiyue.lastleg.dropship.service.DropshipOrderService; import com.baiyue.common.event.ContainerNumbers; import com.baiyue.lastleg.entity.LastlegOrderCommandRecord; import com.baiyue.lastleg.mapper.LastlegOrderCommandRecordMapper; +import com.baiyue.lastleg.mapper.LastlegSourcePalletMapper; import com.baiyue.lastleg.inboundplan.pda.gateway.WarehouseResourceGateway; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -65,8 +66,16 @@ public class InboundPlanService { @Resource private DropshipOrderService dropshipOrders; @Resource private WarehouseResourceGateway warehouseGateway; @Resource private LastlegOrderCommandRecordMapper commandMapper; + @Resource private LastlegSourcePalletMapper sourcePalletMapper; @Resource private ObjectMapper objectMapper; + public List sourcePalletNos(String customerId, long orderId, String orderType) { + return "ONE_CLICK_DROPSHIP".equals(orderType) + ? dropshipOrders.palletSnapshots(customerId, orderId).stream() + .map(DropshipPalletSnapshot::sourcePalletNo).toList() + : sourcePalletMapper.palletNos(customerId, orderId); + } + @Transactional public InboundPlanResponse convertManual(ManualInboundPlanRequest request, String idempotencyKey, String operatorId) { @@ -393,6 +402,10 @@ public class InboundPlanService { PalletAllocator.Result allocation = wholePallets == null && manual == null ? PalletAllocator.allocate(orders.stream() .map(order -> new PalletAllocator.LineInput(order.orderId(), warehouseKey(order), volume(order), order.packageCount(), order.recommendedPalletCount())).toList()) : null; + if (allocation != null && sourcePalletNos != null && !sourcePalletNos.isEmpty() + && sourcePalletNos.size() != allocation.pallets().size()) { + throw new ResponseStatusException(HttpStatus.CONFLICT, "头程托盘码数量与尾程计划托盘数不一致"); + } if (wholePallets != null) validateWholePallets(orders, wholePallets); plan.setPalletCount(manual != null ? manual.palletCount() : wholePallets == null ? allocation.pallets().size() : wholePallets.size()); @@ -479,6 +492,7 @@ public class InboundPlanService { List pendingIndexes = new ArrayList<>(); List> snapshots = new ArrayList<>(); List> wholePallets = new ArrayList<>(); + List> standardPalletNos = new ArrayList<>(); for (int index = 0; index < refs.size(); index++) { InboundPlanOrderMapper.ContainerOrderRef ref = refs.get(index); InboundPlan existing = existingPlans.get(index); @@ -517,6 +531,11 @@ public class InboundPlanService { validateWholePallets(orders, sourcePallets); } wholePallets.add(sourcePallets); + List standardNos = "ONE_CLICK_DROPSHIP".equals(ref.orderType()) ? List.of() + : sourcePalletMapper.palletNos(ref.customerId(), ref.orderId()); + if (sourcePallets == null && standardNos.isEmpty()) throw new ResponseStatusException( + HttpStatus.CONFLICT, "散货订单缺少头程托盘码快照"); + standardPalletNos.add(standardNos); } requireSingleWarehouseId(warehouseIds); @@ -531,7 +550,7 @@ public class InboundPlanService { Map reserved = prepared == null ? Map.of() : prepared.pallets().stream().collect(Collectors.toMap(PreparedPallet::sequenceNo, PreparedPallet::reservation)); - created.put(refIndex, createPlan(ref.customerId(), ref.orderId(), snapshots.get(pendingIndex), List.of(), + created.put(refIndex, createPlan(ref.customerId(), ref.orderId(), snapshots.get(pendingIndex), standardPalletNos.get(pendingIndex), wholePallets.get(pendingIndex), null, null, prepared, reserved)); } List result = new ArrayList<>(refs.size()); diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegSourcePalletMapper.java b/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegSourcePalletMapper.java new file mode 100644 index 000000000..7304ff5bc --- /dev/null +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegSourcePalletMapper.java @@ -0,0 +1,27 @@ +package com.baiyue.lastleg.mapper; + +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface LastlegSourcePalletMapper { + @Insert(""" + INSERT INTO ll_order_source_pallet + (id,customer_id,order_id,source_pallet_no,sequence_no,source_event_id,created_at) + VALUES (#{id},#{customerId},#{orderId},#{palletNo},#{sequenceNo},#{eventId},CURRENT_TIMESTAMP(3)) + """) + int insert(@Param("id") long id, @Param("customerId") String customerId, + @Param("orderId") long orderId, @Param("palletNo") String palletNo, + @Param("sequenceNo") int sequenceNo, @Param("eventId") String eventId); + + @Select(""" + SELECT source_pallet_no FROM ll_order_source_pallet + WHERE customer_id=#{customerId} AND order_id=#{orderId} + ORDER BY sequence_no,id + """) + List palletNos(@Param("customerId") String customerId, @Param("orderId") long orderId); +} diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/service/LoadingCompletedConsumer.java b/lastleg-service/src/main/java/com/baiyue/lastleg/service/LoadingCompletedConsumer.java index 7bb8815c3..f83c4c8fe 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/service/LoadingCompletedConsumer.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/service/LoadingCompletedConsumer.java @@ -45,6 +45,7 @@ public class LoadingCompletedConsumer { @Resource private DropshipOrderService dropshipOrders; @Resource private InventoryCommandService inventory; @Resource private ContainerShippingGateMapper shippingGates; + @Resource private LastlegSourcePalletMapper sourcePallets; @Transactional(isolation = Isolation.READ_COMMITTED) public int consume(EventEnvelope envelope) { @@ -278,6 +279,20 @@ public class LoadingCompletedConsumer { Map> dropshipLabels = "ONE_CLICK_DROPSHIP".equals(orderType) && "OVERSEAS".equals(destinationType) ? dropshipReceivingLabels(source, rawSource) : Map.of(); + if ("FIRST_LEG".equals(orderType) && event.eventVersion() >= 2) { + List pallets = source.pallets() == null ? List.of() : source.pallets(); + Set palletNos = new HashSet<>(); + for (int palletIndex = 0; palletIndex < pallets.size(); palletIndex++) { + String palletNo = pallets.get(palletIndex).palletNo(); + if (palletNo == null || palletNo.isBlank() || palletNo.length() > 128 || !palletNos.add(palletNo)) { + throw new IllegalArgumentException("散货来源托盘码为空、重复或过长"); + } + sourcePallets.insert(IdWorker.getId(), customerId, order.getId(), palletNo.trim(), palletIndex + 1, event.eventId()); + } + if (!pallets.isEmpty() && order.getPalletCount() > 0 && pallets.size() != order.getPalletCount()) { + throw new IllegalArgumentException("散货来源托盘码数量与托盘数不一致"); + } + } for(var item:source.items()) { LastlegOrderDetail detail=new LastlegOrderDetail(); detail.setCustomerId(customerId); diff --git a/lastleg-service/src/main/resources/db/lastleg.sql b/lastleg-service/src/main/resources/db/lastleg.sql index 40d65e553..e9d059ee1 100644 --- a/lastleg-service/src/main/resources/db/lastleg.sql +++ b/lastleg-service/src/main/resources/db/lastleg.sql @@ -112,6 +112,22 @@ CREATE TABLE IF NOT EXISTS ll_order ( KEY idx_ll_order_container_progress(source_container_booking_id,estimated_warehouse_at,created_at,id) ) ENGINE=InnoDB COMMENT='尾程订单主表'; +CREATE TABLE IF NOT EXISTS ll_order_source_pallet ( + id BIGINT NOT NULL COMMENT '来源托盘快照ID', + customer_id VARCHAR(128) NOT NULL COMMENT '客户隔离键', + order_id BIGINT NOT NULL COMMENT '尾程订单ID', + source_pallet_no VARCHAR(128) NOT NULL COMMENT '头程冻结托盘码', + sequence_no INT NOT NULL COMMENT '订单内稳定顺序', + source_event_id VARCHAR(128) NOT NULL COMMENT '来源装柜完成事件ID', + created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', + PRIMARY KEY(id), + UNIQUE KEY uk_ll_source_pallet_no(source_pallet_no), + UNIQUE KEY uk_ll_source_pallet_sequence(customer_id,order_id,sequence_no), + KEY idx_ll_source_pallet_order(customer_id,order_id), + CONSTRAINT fk_ll_source_pallet_order FOREIGN KEY(order_id) REFERENCES ll_order(id) +) ENGINE=InnoDB COMMENT='头程交接的不可变托盘码快照'; + + SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_order' AND column_name='pallet_merge_batch_id'), 'SELECT 1', 'ALTER TABLE ll_order ADD COLUMN pallet_merge_batch_id VARCHAR(64) NULL COMMENT ''平台预标记合托分组号'' AFTER pallet_merge_flag')); PREPARE ll_order_merge_batch_ddl FROM @ddl; EXECUTE ll_order_merge_batch_ddl; DEALLOCATE PREPARE ll_order_merge_batch_ddl; SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_order' AND column_name='hold_chargeable'), 'SELECT 1', 'ALTER TABLE ll_order ADD COLUMN hold_chargeable TINYINT NOT NULL DEFAULT 0 COMMENT ''当前暂扣是否计费:0否1是'' AFTER detained')); diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/pda/gateway/HttpWarehouseResourceGatewayTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/pda/gateway/HttpWarehouseResourceGatewayTest.java index d472d8db7..354e31c66 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/pda/gateway/HttpWarehouseResourceGatewayTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/pda/gateway/HttpWarehouseResourceGatewayTest.java @@ -3,6 +3,7 @@ package com.baiyue.lastleg.inboundplan.pda.gateway; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; +import org.springframework.http.HttpStatus; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.client.RestClient; @@ -116,6 +117,23 @@ class HttpWarehouseResourceGatewayTest { server.verify(); } + @Test + void resolveReservedFallsBackToConfirmedPhysicalBindingForEarlierPlanDisplayCode() { + server.expect(requestTo("http://warehouse/internal/v1/warehouse-pallets/resolve/IP-ACY2-20260909-166786-P001")) + .andRespond(withStatus(HttpStatus.NOT_FOUND)); + server.expect(requestTo("http://warehouse/internal/v1/warehouse-pallets/resolve/id/31")) + .andRespond(withSuccess(""" + {"code":"200","data":{"palletId":31,"palletCode":"PLT-US-LAX-01-31", + "warehouseId":21,"locationId":41,"status":"OCCUPIED","version":3, + "reservable":false,"reservationBlockReason":"PALLET_NOT_IDLE"}} + """, MediaType.APPLICATION_JSON)); + + var result = gateway.resolveReservedPallet("IP-ACY2-20260909-166786-P001", "11", 21L, 31L, 41L, 51L); + + assertThat(result.palletId()).isEqualTo(31L); + server.verify(); + } + @Test void resolveReservedRejectsDifferentPhysicalBinding() { server.expect(requestTo("http://warehouse/internal/v1/warehouse-pallets/resolve/PAL-RESERVED")) @@ -221,7 +239,7 @@ class HttpWarehouseResourceGatewayTest { var result = gateway.ensurePalletBatch(new WarehouseResourceGateway.PalletBatchEnsure(31L, "BATCH-1", List.of(new WarehouseResourceGateway.PalletBatchItemRequest( - 100L, "CIP:1:1", "IP-21", 1, "STANDARD", "ONT8")))); + 100L, "CIP:1:1", "IP-21", 1, "STANDARD", "ONT8", "CONT-ONT8-001")))); assertThat(result.batchId()).isEqualTo(41L); assertThat(result.items().get(0).resourceLockId()).isEqualTo(71L); diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/service/ContainerInboundPlanConversionCoordinatorTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/service/ContainerInboundPlanConversionCoordinatorTest.java index c24c3f086..084121a52 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/service/ContainerInboundPlanConversionCoordinatorTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/service/ContainerInboundPlanConversionCoordinatorTest.java @@ -117,7 +117,7 @@ class ContainerInboundPlanConversionCoordinatorTest { @Test void reservationMustMatchEveryStableItemIdentity() throws Exception { var expected = new ContainerInboundPlanConversionCoordinator.PreparedItem( - "100", 11L, 21L, "IP-21", 1, 1, "CIP:1:1", "ONT8"); + "100", 11L, 21L, "IP-21", 1, 1, "CIP:1:1", "ONT8", "CONT-ONT8-001"); var preparation = new ContainerInboundPlanConversionCoordinator.Preparation(31L, List.of(expected)); var response = new WarehouseResourceGateway.PalletBatchResponse(41L, "BATCH-1", "RESERVED", 1, false, List.of(new WarehouseResourceGateway.PalletBatchItem( @@ -239,6 +239,8 @@ class ContainerInboundPlanConversionCoordinatorTest { when(plans.previewContainer(BOOKING_ID)).thenReturn(preview); when(numbers.next(eq("INBOUND_PLAN"), any(String.class), any(Long.class))) .thenReturn("IP-FBA", "IP-OVERSEAS"); + when(plans.sourcePalletNos("100", 11L, "ONE_CLICK_DROPSHIP")).thenReturn(List.of("MSCU6639870-ABE3-001")); + when(plans.sourcePalletNos("200", 12L, "ONE_CLICK_DROPSHIP")).thenReturn(List.of("MSCU6639870-US-LAX-01-001")); ContainerPlanConversionCommand command = ReflectionTestUtils.invokeMethod(coordinator, "prepareCommand", 1L, 2L, BOOKING_ID, "FIRST-KEY", request, @@ -291,7 +293,7 @@ class ContainerInboundPlanConversionCoordinatorTest { private void setOnePreparedItem(ContainerPlanConversionCommand command) throws Exception { var item = new ContainerInboundPlanConversionCoordinator.PreparedItem( - "100", 11L, 21L, "IP-21", 1, 1, "CIP:1:1", "ONT8"); + "100", 11L, 21L, "IP-21", 1, 1, "CIP:1:1", "ONT8", "CONT-ONT8-001"); command.setPreparationJson(objectMapper.writeValueAsString( new ContainerInboundPlanConversionCoordinator.Preparation(31L, List.of(item)))); } diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/service/InboundPlanServiceTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/service/InboundPlanServiceTest.java index bedaed021..dae2a0c2c 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/service/InboundPlanServiceTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/service/InboundPlanServiceTest.java @@ -18,6 +18,7 @@ import com.baiyue.lastleg.dropship.model.DropshipPalletSnapshot; import com.baiyue.lastleg.dropship.service.DropshipOrderService; import com.baiyue.lastleg.inboundplan.pda.gateway.WarehouseResourceGateway; import com.baiyue.lastleg.mapper.LastlegOrderCommandRecordMapper; +import com.baiyue.lastleg.mapper.LastlegSourcePalletMapper; import com.fasterxml.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -38,6 +39,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -55,6 +57,7 @@ class InboundPlanServiceTest { @Mock DropshipOrderService dropshipOrders; @Mock WarehouseResourceGateway warehouseGateway; @Mock LastlegOrderCommandRecordMapper commandMapper; + @Mock LastlegSourcePalletMapper sourcePalletMapper; private InboundPlanService service; @@ -70,11 +73,14 @@ class InboundPlanServiceTest { ReflectionTestUtils.setField(service, "dropshipOrders", dropshipOrders); ReflectionTestUtils.setField(service, "warehouseGateway", warehouseGateway); ReflectionTestUtils.setField(service, "commandMapper", commandMapper); + ReflectionTestUtils.setField(service, "sourcePalletMapper", sourcePalletMapper); ReflectionTestUtils.setField(service, "objectMapper", JsonMapper.builder().findAndAddModules().build()); ReflectionTestUtils.setField(service, "orderNoGenerator", new com.baiyue.lastleg.service.LastlegOrderNoGenerator()); org.mockito.Mockito.lenient().when(lineMapper.selectList(any())).thenReturn(List.of()); org.mockito.Mockito.lenient().when(palletMapper.selectList(any())).thenReturn(List.of()); org.mockito.Mockito.lenient().when(allocationMapper.selectList(any())).thenReturn(List.of()); + org.mockito.Mockito.lenient().when(sourcePalletMapper.palletNos(any(), anyLong())) + .thenAnswer(invocation -> List.of("MSCU6639870-WH-" + invocation.getArgument(1))); org.mockito.Mockito.lenient().when(orderMapper.findReceivingWarehouse(any(), any())).thenReturn( new InboundPlanOrderMapper.ReceivingWarehouseSnapshot( "193000000000200003", "US-LAX-01", "洛杉矶仓")); diff --git a/scripts/admin-test-env-modules/finance-full-fixtures-contract.test.mjs b/scripts/admin-test-env-modules/finance-full-fixtures-contract.test.mjs index 74e48d6cc..ab28ff460 100644 --- a/scripts/admin-test-env-modules/finance-full-fixtures-contract.test.mjs +++ b/scripts/admin-test-env-modules/finance-full-fixtures-contract.test.mjs @@ -17,6 +17,10 @@ test('finance fixture module is independently exported and marker isolated', () test('fixture covers weight, volume, manual order, and container allocation contracts', () => { for (const basis of ['WEIGHT_KG', 'VOLUME_CBM', 'MANUAL_ORDER_FEE', 'CONTAINER_SHARED']) assert.match(source, new RegExp(basis)) + assert.match(source, /chargeMode: pricingProfile\.chargeUnit/) + assert.match(source, /customer-rules\/versions\?tenantId=/) + assert.match(source, /taxMode: 'TAX_EXCLUDED'/) + assert.match(source, /inbound\?\.summary\?\.businessType \|\| profile\.businessType/) assert.match(source, /direction === 'PAYABLE' \? \{ settlementMode: 'ON_ACCOUNT' \}/) assert.match(source, /supplierId: id\(supplier\.id\), settlementMode: 'ON_ACCOUNT'/) assert.match(source, /request\(context, 'POST', '\/api\/platform\/finance\/v1\/cost-entries'/) @@ -123,6 +127,7 @@ function hookSet({ missing = false } = {}) { let automaticIndex = 0 return { loadPricingEvidence: async () => ({ activeVersionIds: ['PRICE-1'] }), + ensureCustomerChargeRule: async () => ({ id: 'RULE-CBM', chargeMode: 'CBM' }), createOrder: async (context, suffix) => ({ marker: `${context.marker}-${suffix}`, tenantId: '701', orderId: `O-${suffix}`, orderNo: `NO-${suffix}`, waybillId: suffix === 'AUTO1' ? 'WB-1' : null, inboundId: `I-${suffix}` }), measureOrder: async (context, resource) => ({ ...resource, measurementId: `M-${resource.orderId}`, actualWeightKg: 12.5, totalVolumeCbm: 0.072 }), @@ -153,7 +158,7 @@ test('run behavior emits consumer shape, both billing bases, distinct dates, sup await run(context) const fixture = context.createdResources.financeFullFixtures assert.equal(fixture.customerId, '701') - assert.equal(fixture.orders.length, 5) + assert.equal(fixture.orders.length, 6) assert.equal(fixture.orders[0].orderNo, 'NO-AUTO1') assert.equal(fixture.orders[0].waybillId, 'WB-1') assert.equal(fixture.orders[0].actualWeightKg, 12.5) diff --git a/scripts/admin-test-env-modules/finance-full-fixtures.mjs b/scripts/admin-test-env-modules/finance-full-fixtures.mjs index f5687b494..cea821aa6 100644 --- a/scripts/admin-test-env-modules/finance-full-fixtures.mjs +++ b/scripts/admin-test-env-modules/finance-full-fixtures.mjs @@ -55,8 +55,18 @@ async function createOrder(context, suffix, pricingProfile = null) { // The orders module discovers candidates independently. Reorder only those // real responses so its payload uses one exact active price-book row. globalThis.fetch = async (input, init = {}) => { - const response = await originalFetch(input, init) const url = String(input) + let effectiveInit = init + if ((init.method || 'GET') === 'POST' + && url.includes('/api/merchant/v1/first-leg/pricing/estimate') + && typeof init.body === 'string') { + const body = JSON.parse(init.body) + effectiveInit = { + ...init, + body: JSON.stringify({ ...body, chargeMode: pricingProfile.chargeUnit }) + } + } + const response = await originalFetch(input, effectiveInit) if ((init.method || 'GET') === 'GET' && (url.includes('/api/merchant/v1/warehouses?') || url.includes('/api/merchant/v1/first-leg/pricing/channels?'))) { const body = await response.clone().json().catch(() => null) @@ -99,7 +109,7 @@ async function measureOrder(context, resource) { if (context.financeFixtureHooks?.measureOrder) return context.financeFixtureHooks.measureOrder(context, resource) const originalMarker = context.marker const createdKeys = ['orders', 'inboundMeasurement', 'ocrInbound', 'testInbound'] - const contextKeys = ['inboundWeightOcr', 'ocrInbound', 'testInbound', 'createdInbound', 'allowAnyExistingPallet'] + const contextKeys = ['inboundWeightOcr', 'ocrInbound', 'testInbound', 'createdInbound', 'allowAnyExistingPallet', 'waitSplitVariant'] const createdSnapshot = new Map(createdKeys.map((key) => [key, { present: Object.hasOwn(context.createdResources, key), value: context.createdResources[key] }])) const contextSnapshot = new Map(contextKeys.map((key) => [key, { present: Object.hasOwn(context.context, key), value: context.context[key] }])) context.marker = resource.marker @@ -114,6 +124,13 @@ async function measureOrder(context, resource) { // Reuse that warehouse's real pallet master instead of requiring the bulk-data // generator's two fixed Yiwu pallet codes. context.context.allowAnyExistingPallet = true + context.context.waitSplitVariant = { + ...(context.context.waitSplitVariant || {}), + // The production pricing service chooses the dominant real billing basis. + // Keep the CBM sample's measured gross weight below its measured volume + // weight so the fixture proves the actual VOLUME_CBM path. + grossWeightPerPalletKg: resource.pricingProfile?.chargeUnit === 'CBM' ? 20 : 100, + } try { const measurement = await import(new URL('./inbound-measurement.mjs', import.meta.url)) await measurement.run(context) @@ -299,7 +316,8 @@ async function loadPricingEvidence(context) { if (matches.length !== 1) continue profiles.push({ versionId: id(version.id), rateId: id(rate.id), chargeUnit: rate.chargeUnit, originWarehouseId: id(rate.originWarehouseId), channelCode: rate.channelCode, - pricingTaxMode: rate.pricingTaxMode, destinationCode: rate.destinationCode }) + pricingTaxMode: rate.pricingTaxMode, destinationCode: rate.destinationCode, + businessType: rate.businessType || 'FBA' }) } } context.assert(MODULE, 'ACTIVE 价格簿包含 KG 与 CBM 可用真实组合', response, @@ -308,6 +326,57 @@ async function loadPricingEvidence(context) { return { activeVersionIds: active.map((item) => id(item.id)).filter(Boolean), profiles } } +async function ensureCustomerChargeRule(context, resource, profile) { + if (context.financeFixtureHooks?.ensureCustomerChargeRule) { + return context.financeFixtureHooks.ensureCustomerChargeRule(context, resource, profile) + } + if (!resource?.tenantId || profile?.pricingTaxMode !== 'TAX_EXCLUDED') return null + const tenantId = id(resource.tenantId) + const inboundResponse = await context.request('GET', + `/api/platform/inbounds/${encodeURIComponent(resource.inboundId)}?tenantId=${encodeURIComponent(tenantId)}`) + const inbound = context.apiSuccess(MODULE, '读取不包税入库计费业务类型', inboundResponse, + `inboundId=${resource.inboundId}`, OPTIONS) + const businessType = inbound?.summary?.businessType || profile.businessType + if (!businessType) { + blocker(context, '取得不包税入库计费业务类型', + `inboundId=${resource.inboundId} 未返回 businessType,不能创建猜测的客户计费规则`) + return null + } + const listPath = `/api/platform/v1/fba-pricing/customer-rules?tenantId=${encodeURIComponent(tenantId)}&customerId=${encodeURIComponent(tenantId)}` + const listResponse = await context.request('GET', listPath) + const listed = context.apiSuccess(MODULE, '查询不包税客户计费规则', listResponse, + `customerId=${tenantId}, businessType=${businessType}`, OPTIONS) + const applicable = rows(listed).filter((rule) => rule?.status === 'ACTIVE' + && rule?.businessType === businessType && rule?.taxMode === 'TAX_EXCLUDED') + let desired = applicable.find((rule) => rule?.chargeMode === profile.chargeUnit) + if (!desired) { + const effectiveFrom = new Date(Date.now() - 86_400_000).toISOString().slice(0, 19) + const body = { + ruleCode: `FIN_P1_${profile.chargeUnit}_${tenantId}`.slice(0, 50), customerId: tenantId, + customerName: String(inbound?.summary?.customerName || `财务P1验收客户-${tenantId}`).slice(0, 128), businessType, + chargeMode: profile.chargeUnit, taxMode: 'TAX_EXCLUDED', conversionFactor: 1, + roundingScale: 3, roundingMode: 'HALF_UP', currency: 'CNY', effectiveFrom, + effectiveTo: null, remark: `${context.marker}-VOLUME_CBM` + } + const createResponse = await request(context, 'POST', + `/api/platform/v1/fba-pricing/customer-rules/versions?tenantId=${encodeURIComponent(tenantId)}`, body) + desired = context.apiSuccess(MODULE, '创建不包税客户计费规则', createResponse, + `customerId=${tenantId}, chargeMode=${profile.chargeUnit}`, OPTIONS) + } + const needsDefault = applicable.length > 1 + || (applicable.length === 1 && id(applicable[0]?.id) !== id(desired?.id)) + if (desired?.id && needsDefault && desired.defaultRule !== true) { + const defaultResponse = await request(context, 'PUT', + `/api/platform/v1/fba-pricing/customer-rules/${encodeURIComponent(desired.id)}/default?tenantId=${encodeURIComponent(tenantId)}`) + context.apiSuccess(MODULE, '设置不包税客户唯一默认计费规则', defaultResponse, + `ruleId=${desired.id}, chargeMode=${profile.chargeUnit}`, OPTIONS) + } + context.assert(MODULE, '不包税自动计费具备客户计费方式', listResponse, + Boolean(desired?.id) && desired?.chargeMode === profile.chargeUnit, + `customerId=${tenantId}, chargeMode=${desired?.chargeMode || 'missing'}, ruleId=${id(desired?.id) || 'missing'}`, OPTIONS) + return desired || null +} + async function createMarkerContainer(context, resource) { if (context.financeFixtureHooks?.createMarkerContainer) return context.financeFixtureHooks.createMarkerContainer(context, resource) if (!resource) { @@ -387,12 +456,15 @@ export async function run(context) { const pricingEvidence = await loadPricingEvidence(context) const resources = [] const profiles = pricingEvidence.profiles || [] - for (const [index, suffix] of ['AUTO1', 'AUTO2', 'AUTO3', 'AUTO4', 'MANUAL'].entries()) { + for (const [index, suffix] of ['AUTO1', 'AUTO2', 'AUTO3', 'AUTO4', 'MANUAL', 'CONTAINER'].entries()) { const resource = await createOrder(context, suffix, profiles[index % profiles.length] || null) context.assert(MODULE, `创建 ${suffix} marker 隔离订单与入库单`, null, Boolean(resource), resource ? `orderId=${resource.orderId}, inboundId=${resource.inboundId}` : `marker=${context.marker}-${suffix} 未返回独立入库单`, OPTIONS) if (resource) resources.push(resource) } + for (const resource of resources.filter((item) => item.pricingProfile?.pricingTaxMode === 'TAX_EXCLUDED')) { + await ensureCustomerChargeRule(context, resource, resource.pricingProfile) + } const measured = [] for (const resource of resources) { const result = await measureOrder(context, resource) @@ -430,7 +502,7 @@ export async function run(context) { if (fee) fixtures.push(fee) } } - const manualResources = [measured.at(-1)].filter(Boolean) + const manualResources = [measured[4]].filter(Boolean) if (feeItems.PAYABLE && supplier?.id) { for (const [index, manualResource] of manualResources.entries()) { const fee = await createManualFee(context, manualResource, feeItems.PAYABLE, 'PAYABLE', 80 + index * 10, @@ -440,7 +512,11 @@ export async function run(context) { } } - const container = (measured[0] ? await createMarkerContainer(context, measured[0]) : null) + // A source whose fee has already been sent is intentionally frozen against + // loading-plan membership changes. Use a dedicated measured order for the + // container fixture so finance setup never conflicts with that invariant. + const containerResource = measured[5] + const container = (containerResource ? await createMarkerContainer(context, containerResource) : null) || context.createdResources?.phase3ContainerLoading const containerOwned = (container?.marker === context.marker || String(container?.marker || '').startsWith(`${context.marker}-`)) && container?.loadingPlanId && container?.containerBookingId diff --git a/warehouse-overseas-service/src/main/java/com/baiyue/warehouse/dto/WarehousePalletBatchRequests.java b/warehouse-overseas-service/src/main/java/com/baiyue/warehouse/dto/WarehousePalletBatchRequests.java index a15574a96..1cf904435 100644 --- a/warehouse-overseas-service/src/main/java/com/baiyue/warehouse/dto/WarehousePalletBatchRequests.java +++ b/warehouse-overseas-service/src/main/java/com/baiyue/warehouse/dto/WarehousePalletBatchRequests.java @@ -23,7 +23,8 @@ public final class WarehousePalletBatchRequests { @NotBlank @Size(max = 128) String inboundPlanNo, @Positive int sequenceNo, @NotBlank @Size(max = 32) String palletType, - @Size(max = 128) String fbaWarehouseCode + @Size(max = 128) String fbaWarehouseCode, + @NotBlank @Size(max = 128) String palletCode ) { } public record Confirm( diff --git a/warehouse-overseas-service/src/main/java/com/baiyue/warehouse/service/WarehousePalletBatchService.java b/warehouse-overseas-service/src/main/java/com/baiyue/warehouse/service/WarehousePalletBatchService.java index cf2548c28..e3be5e695 100644 --- a/warehouse-overseas-service/src/main/java/com/baiyue/warehouse/service/WarehousePalletBatchService.java +++ b/warehouse-overseas-service/src/main/java/com/baiyue/warehouse/service/WarehousePalletBatchService.java @@ -83,7 +83,7 @@ public class WarehousePalletBatchService { List created = new ArrayList<>(); for (WarehousePalletBatchRequests.Item requested : normalized.items()) { Long palletId = resources.createPallet(WarehouseResourceService.PUBLIC_RESOURCE_SCOPE, - normalized.warehouseId(), new PalletRequests.SaveRequest(null, requested.palletType(), null, + normalized.warehouseId(), new PalletRequests.SaveRequest(requested.palletCode(), requested.palletType(), null, requiredAutoCreatedPalletUnitPrice(), "IDLE", null, "Auto-created for inbound plan " + requested.inboundPlanNo(), requested.fbaWarehouseCode())); @@ -268,11 +268,13 @@ public class WarehousePalletBatchService { if (item.fbaWarehouseCode() != null) { requireMax(item.fbaWarehouseCode().trim(), 128, "FBA warehouse code is too long"); } + String palletCode = required(item.palletCode(), "Pallet code is required"); + requireMax(palletCode, 128, "Pallet code is too long"); if (!businessKeys.add(businessKey)) throw badRequest("Pallet business key must be unique"); if (!sequences.add(item.sequenceNo())) throw badRequest("Pallet sequence must be unique"); return new WarehousePalletBatchRequests.Item(item.customerId(), businessKey, inboundPlanNo, item.sequenceNo(), palletType, - trim(item.fbaWarehouseCode())); + trim(item.fbaWarehouseCode()), palletCode); }).sorted(Comparator.comparingInt(WarehousePalletBatchRequests.Item::sequenceNo)).toList(); return new WarehousePalletBatchRequests.EnsureReserved(request.warehouseId(), batchKey, normalized); } diff --git a/warehouse-overseas-service/src/main/resources/openapi/warehouse-pallet-batch-internal-v1.yaml b/warehouse-overseas-service/src/main/resources/openapi/warehouse-pallet-batch-internal-v1.yaml index 5b239e44c..970e25e8f 100644 --- a/warehouse-overseas-service/src/main/resources/openapi/warehouse-pallet-batch-internal-v1.yaml +++ b/warehouse-overseas-service/src/main/resources/openapi/warehouse-pallet-batch-internal-v1.yaml @@ -34,7 +34,7 @@ components: schemas: BatchItemRequest: type: object - required: [customerId, businessKey, inboundPlanNo, sequenceNo, palletType] + required: [customerId, businessKey, inboundPlanNo, sequenceNo, palletType, palletCode] properties: customerId: { type: string, pattern: '^[1-9][0-9]*$' } businessKey: { type: string, minLength: 1, maxLength: 100 } @@ -42,6 +42,7 @@ components: sequenceNo: { type: integer, minimum: 1 } palletType: { type: string, minLength: 1, maxLength: 32 } fbaWarehouseCode: { type: string, nullable: true, maxLength: 128 } + palletCode: { type: string, minLength: 1, maxLength: 128, description: 头程冻结并已打印的托盘码,海外实体托盘必须原样沿用 } EnsureReservedRequest: type: object required: [warehouseId, batchKey, items] diff --git a/warehouse-overseas-service/src/test/java/com/baiyue/warehouse/service/WarehousePalletBatchServiceTest.java b/warehouse-overseas-service/src/test/java/com/baiyue/warehouse/service/WarehousePalletBatchServiceTest.java index fca4795bf..eab208345 100644 --- a/warehouse-overseas-service/src/test/java/com/baiyue/warehouse/service/WarehousePalletBatchServiceTest.java +++ b/warehouse-overseas-service/src/test/java/com/baiyue/warehouse/service/WarehousePalletBatchServiceTest.java @@ -369,8 +369,8 @@ class WarehousePalletBatchServiceTest { private static WarehousePalletBatchRequests.EnsureReserved request() { return new WarehousePalletBatchRequests.EnsureReserved(WAREHOUSE, "container-1", List.of( - new WarehousePalletBatchRequests.Item(CUSTOMER_B, "container:plan-b:2", "PLAN-B", 2, "STANDARD", "ONT8"), - new WarehousePalletBatchRequests.Item(CUSTOMER_A, "container:plan-a:1", "PLAN-A", 1, "STANDARD", "LAX9"))); + new WarehousePalletBatchRequests.Item(CUSTOMER_B, "container:plan-b:2", "PLAN-B", 2, "STANDARD", "ONT8", "CONT-ONT8-001"), + new WarehousePalletBatchRequests.Item(CUSTOMER_A, "container:plan-a:1", "PLAN-A", 1, "STANDARD", "LAX9", "CONT-LAX9-001"))); } private static WarehousePalletBatchEntity batch(long id, String status, int attempt) { diff --git a/warehouse/scripts/warehouse-public-master-data-contract.test.mjs b/warehouse/scripts/warehouse-public-master-data-contract.test.mjs index 6dbb91c9e..4693fa5d4 100644 --- a/warehouse/scripts/warehouse-public-master-data-contract.test.mjs +++ b/warehouse/scripts/warehouse-public-master-data-contract.test.mjs @@ -9,6 +9,7 @@ const sqlPath = resolve(warehouseRoot, 'src/main/resources/db/warehouse-public-m const acceptedPath = resolve(warehouseRoot, 'src/main/resources/db/master-data/fba-public-addresses.accepted.csv') const rejectedPath = resolve(warehouseRoot, 'src/main/resources/db/master-data/fba-public-addresses.rejected.csv') const fixedWarehousePath = resolve(warehouseRoot, 'src/main/resources/db/master-data/platform-fixed-warehouses.csv') +const unifiedSqlPath = resolve(warehouseRoot, '..', 'deploy/sql/头程数据库统一增量-MySQL8.sql') function parseCsv(text) { const rows = [] @@ -49,25 +50,22 @@ function parseCsv(text) { } const sql = readFileSync(sqlPath, 'utf8') +const unifiedSql = readFileSync(unifiedSqlPath, 'utf8') const accepted = parseCsv(readFileSync(acceptedPath, 'utf8')) const rejected = parseCsv(readFileSync(rejectedPath, 'utf8')) const fixedWarehouses = parseCsv(readFileSync(fixedWarehousePath, 'utf8')) -assert.equal(accepted.length, 252) -assert.equal(rejected.length, 54) +assert.equal(accepted.length, 314) +assert.equal(rejected.length, 0) assert.equal(fixedWarehouses.length, 4) const codes = new Set() const warehouseIds = new Set() const addressIds = new Set() for (const row of accepted) { - assert.match(row.warehouse_code, /^[A-Z0-9]{3,5}$/) + assert.ok(row.warehouse_code.trim()) assert.equal(row.warehouse_code, row.warehouse_code.trim().toUpperCase()) - assert.ok(row.city.trim()) - assert.ok(row.state_province.trim()) - assert.ok(row.address_line1.trim()) - assert.ok(row.postal_code.trim()) - assert.ok(row.timezone.trim()) + if (row.source_internal_id) assert.match(row.source_internal_id, /^[A-Z0-9]{1,16}$/) assert.equal(row.country_code, 'US') assert.ok(!codes.has(row.warehouse_code), `duplicate code ${row.warehouse_code}`) assert.ok(!warehouseIds.has(row.warehouse_id_seed), `duplicate warehouse id ${row.warehouse_id_seed}`) @@ -75,10 +73,15 @@ for (const row of accepted) { codes.add(row.warehouse_code) warehouseIds.add(row.warehouse_id_seed) addressIds.add(row.address_id_seed) + const internalCode = row.source_internal_id ? `'${row.source_internal_id}'` : 'NULL' + const tuplePrefix = `(${row.warehouse_id_seed},${row.address_id_seed},'${row.warehouse_code}','${row.warehouse_name}',${internalCode},` + assert.ok(sql.includes(tuplePrefix), `standalone SQL missing ${row.warehouse_code}`) + assert.ok(unifiedSql.includes(tuplePrefix), `unified SQL missing ${row.warehouse_code}`) } -assert.ok(rejected.some((row) => row.reject_reason.includes('non_fba_business_node'))) -assert.equal(rejected.filter((row) => row.reject_reason.includes('timezone_pending_confirmation')).length, 1) +assert.ok(accepted.some((row) => row.warehouse_code === 'FEDEX' && row.city === '')) +assert.ok(accepted.some((row) => row.warehouse_code === '纽约仓一件代发' && row.source_internal_id === 'NJDF')) +assert.equal(accepted.filter((row) => row.source_internal_id === '83').length, 2) assert.deepEqual(fixedWarehouses.map((row) => row.warehouse_code), [ 'CN-YIWU-01', @@ -105,7 +108,9 @@ assert.match(sql, /FROM tmp_wh_fixed_platform_warehouse source[\s\S]+ON DUPLICAT assert.match(sql, /CREATE TEMPORARY TABLE tmp_wh_fba_public_master_data/) assert.match(sql, /JOIN wh_warehouse warehouse\s+ON warehouse\.tenant_id = 0\s+AND warehouse\.warehouse_code = source\.warehouse_code/s) -assert.match(sql, /ON DUPLICATE KEY UPDATE\s+warehouse_type = VALUES\(warehouse_type\),\s+country_code = VALUES\(country_code\),\s+timezone = VALUES\(timezone\),\s+updated_at = CURRENT_TIMESTAMP\(3\);/s) +assert.match(sql, /ON DUPLICATE KEY UPDATE\s+internal_code = VALUES\(internal_code\),\s+warehouse_type = VALUES\(warehouse_type\),\s+country_code = VALUES\(country_code\),\s+timezone = VALUES\(timezone\),\s+updated_at = CURRENT_TIMESTAMP\(3\);/s) +assert.match(sql, /internal_code VARCHAR\(16\) NULL/) +assert.match(sql, /source\.internal_code/) assert.doesNotMatch(sql, /status\s*=\s*VALUES\(status\)/) assert.doesNotMatch(sql, /contact_name\s*=\s*VALUES\(contact_name\)/) assert.doesNotMatch(sql, /contact_phone\s*=\s*VALUES\(contact_phone\)/) diff --git a/warehouse/src/main/java/com/baiyue/warehouse/dto/WarehouseRequests.java b/warehouse/src/main/java/com/baiyue/warehouse/dto/WarehouseRequests.java index 796b1020c..a519c92e3 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/dto/WarehouseRequests.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/dto/WarehouseRequests.java @@ -27,6 +27,8 @@ public final class WarehouseRequests { Long tenantId, @Schema(description = "Tenant-unique warehouse code / 租户内唯一仓库编码", example = "US-LAX-01", maxLength = 50, requiredMode = Schema.RequiredMode.REQUIRED) @NotBlank @Size(max = 50) String warehouseCode, + @Schema(description = "FBA internal code; only available for FBA warehouses / FBA 内部编号,仅 FBA 仓可填写", example = "154", maxLength = 16) + @Pattern(regexp = "[A-Za-z0-9]{1,16}") String internalCode, @Schema(description = "Warehouse name / 仓库名称", example = "Los Angeles Main Warehouse / 洛杉矶主仓", maxLength = 120, requiredMode = Schema.RequiredMode.REQUIRED) @NotBlank @Size(max = 120) String warehouseName, @Schema(description = "Warehouse type; defaults to DOMESTIC / 仓库类型,默认 DOMESTIC", example = "OVERSEAS_PARTNER", allowableValues = {"DOMESTIC", "FBA", "OVERSEAS", "OVERSEAS_PARTNER"}, defaultValue = "DOMESTIC") diff --git a/warehouse/src/main/java/com/baiyue/warehouse/dto/WarehouseSummaryResponse.java b/warehouse/src/main/java/com/baiyue/warehouse/dto/WarehouseSummaryResponse.java index 9c300aed9..972da8a64 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/dto/WarehouseSummaryResponse.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/dto/WarehouseSummaryResponse.java @@ -12,6 +12,7 @@ public record WarehouseSummaryResponse( @Schema(description = "Warehouse ID / 仓库 ID") Long id, @Schema(description = "Platform public scope ID, fixed to 0 / 平台公共作用域,固定为 0") Long tenantId, @Schema(description = "Warehouse code / 仓库编码") String warehouseCode, + @Schema(description = "FBA internal code / FBA 内部编号") String internalCode, @Schema(description = "Warehouse name / 仓库名称") String warehouseName, @Schema(description = "Warehouse type / 仓库类型", allowableValues = {"DOMESTIC", "FBA", "OVERSEAS", "OVERSEAS_PARTNER"}) String warehouseType, @Schema(description = "ISO two-letter country code / 国家二字码") String countryCode, @@ -27,7 +28,7 @@ public record WarehouseSummaryResponse( ) { public static WarehouseSummaryResponse of(WarehouseEntity warehouse, WarehouseAddressEntity address) { return new WarehouseSummaryResponse( - warehouse.getId(), warehouse.getTenantId(), warehouse.getWarehouseCode(), warehouse.getWarehouseName(), + warehouse.getId(), warehouse.getTenantId(), warehouse.getWarehouseCode(), warehouse.getInternalCode(), warehouse.getWarehouseName(), warehouse.getWarehouseType(), warehouse.getCountryCode(), warehouse.getTimezone(), warehouse.getContactName(), warehouse.getContactPhone(), warehouse.getContactEmail(), warehouse.getStatus(), warehouse.getRemark(), warehouse.getCreatedAt(), warehouse.getUpdatedAt(), diff --git a/warehouse/src/main/java/com/baiyue/warehouse/entity/WarehouseEntity.java b/warehouse/src/main/java/com/baiyue/warehouse/entity/WarehouseEntity.java index 03e447e25..358fa93d5 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/entity/WarehouseEntity.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/entity/WarehouseEntity.java @@ -25,6 +25,8 @@ public class WarehouseEntity extends BaseEntity { private Long tenantId; @Schema(description = "Warehouse code / 仓库编码", example = "US-LAX-01") private String warehouseCode; + @Schema(description = "FBA internal code / FBA 内部编号", example = "154") + private String internalCode; @Schema(description = "Warehouse name / 仓库名称", example = "Los Angeles Main Warehouse / 洛杉矶主仓") private String warehouseName; @Schema(description = "Warehouse type / 仓库类型", example = "OVERSEAS_PARTNER", diff --git a/warehouse/src/main/java/com/baiyue/warehouse/repository/WarehouseRepository.java b/warehouse/src/main/java/com/baiyue/warehouse/repository/WarehouseRepository.java index 304268c00..055df51b4 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/repository/WarehouseRepository.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/repository/WarehouseRepository.java @@ -86,7 +86,9 @@ public class WarehouseRepository { .and(StringUtils.hasText(keyword), condition -> { condition.like(WarehouseEntity::getWarehouseCode, keyword) .or() - .like(WarehouseEntity::getWarehouseName, keyword); + .like(WarehouseEntity::getWarehouseName, keyword) + .or() + .like(WarehouseEntity::getInternalCode, keyword); if (!addressMatches.isEmpty()) { condition.or().in(WarehouseEntity::getId, addressMatches); } diff --git a/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseApplicationService.java b/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseApplicationService.java index 0728ba84d..d6abc3986 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseApplicationService.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseApplicationService.java @@ -168,6 +168,7 @@ public class WarehouseApplicationService { WarehouseEntity warehouse = new WarehouseEntity(); warehouse.setTenantId(request.tenantId()); warehouse.setWarehouseCode(request.warehouseCode()); + warehouse.setInternalCode(request.internalCode()); warehouse.setWarehouseName(request.warehouseName()); warehouse.setWarehouseType(request.warehouseType()); warehouse.setCountryCode(request.countryCode()); diff --git a/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseImportService.java b/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseImportService.java index 4608f050b..df89bc425 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseImportService.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseImportService.java @@ -36,9 +36,9 @@ import java.util.Objects; public class WarehouseImportService { private static final int MAX_FILE_BYTES = 5 * 1024 * 1024; private static final int MAX_ROWS = 1000; - private static final String TEMPLATE_VERSION = "1"; + private static final String TEMPLATE_VERSION = "2"; private static final String[] HEADERS = { - "仓库编码*", "仓库名称", "仓库类型", "国家二字码", "省/州", "城市*", "区/县", + "仓库编码*", "内部编号", "仓库名称", "仓库类型", "国家二字码", "省/州", "城市*", "区/县", "详细地址*", "邮政编码", "时区", "状态", "联系人", "联系电话", "联系邮箱", "备注" }; @@ -56,7 +56,7 @@ public class WarehouseImportService { Row instruction = sheet.createRow(1); instruction.createCell(0).setCellValue("说明"); instruction.createCell(1).setCellValue( - "默认仅新增;仓库类型默认 DOMESTIC,可填 OVERSEAS_PARTNER 表示海外合作仓;状态默认 ACTIVE;DOMESTIC 默认 CN/UTC+8;FBA 名称可不填并默认使用编码,多时区州必须显式填写时区;更新不覆盖联系人和备注"); + "默认仅新增;仓库类型默认 DOMESTIC,可填 OVERSEAS_PARTNER 表示海外合作仓;内部编号仅 FBA 仓可填,允许字母或数字;状态默认 ACTIVE;DOMESTIC 默认 CN/UTC+8;FBA 名称可不填并默认使用编码,多时区州必须显式填写时区;更新不覆盖联系人和备注"); Row header = sheet.createRow(2); for (int i = 0; i < HEADERS.length; i++) { header.createCell(i).setCellValue(HEADERS[i]); @@ -109,7 +109,8 @@ public class WarehouseImportService { value(row, 3, formatter), value(row, 4, formatter), value(row, 5, formatter), value(row, 6, formatter), value(row, 7, formatter), value(row, 8, formatter), value(row, 9, formatter), value(row, 10, formatter), value(row, 11, formatter), - value(row, 12, formatter), value(row, 13, formatter), value(row, 14, formatter))); + value(row, 12, formatter), value(row, 13, formatter), value(row, 14, formatter), + value(row, 15, formatter))); } } catch (IOException | RuntimeException exception) { return failure(safeFileName, resolvedMode, rows.size(), "文件", "文件格式无法读取,请使用标准 XLSX 模板"); @@ -197,6 +198,13 @@ public class WarehouseImportService { private void validateRequired(ImportRow row, List rows, List errors) { required(row, errors, "仓库编码", row.code(), 50); + optionalLength(row, errors, "内部编号", row.internalCode(), 16); + if (!row.internalCode().isBlank() && !row.internalCode().matches("[A-Za-z0-9]{1,16}")) { + errors.add(new WarehouseImportError(row.row(), "内部编号", "只允许填写 1 至 16 位字母或数字")); + } + if (!row.internalCode().isBlank() && !"FBA".equalsIgnoreCase(row.type())) { + errors.add(new WarehouseImportError(row.row(), "内部编号", "仅 FBA 仓可以填写")); + } if (row.name().isBlank() && !"FBA".equalsIgnoreCase(row.type())) { errors.add(new WarehouseImportError(row.row(), "仓库名称", "不能为空;FBA 仓可不填并默认使用仓库编码")); } else { @@ -238,6 +246,7 @@ public class WarehouseImportService { private static boolean unchanged(WarehouseEntity existing, WarehouseAddressEntity address, WarehouseSaveNormalizer.NormalizedSaveRequest normalized) { return Objects.equals(existing.getWarehouseName(), normalized.warehouseName()) + && Objects.equals(existing.getInternalCode(), normalized.internalCode()) && Objects.equals(existing.getWarehouseType(), normalized.warehouseType()) && Objects.equals(existing.getCountryCode(), normalized.countryCode()) && Objects.equals(existing.getTimezone(), normalized.timezone()) @@ -315,7 +324,7 @@ public class WarehouseImportService { } } - private record ImportRow(int row, String code, String name, String type, String countryCode, String stateProvince, + private record ImportRow(int row, String code, String internalCode, String name, String type, String countryCode, String stateProvince, String city, String district, String addressLine, String postalCode, String timezone, String status, String contactName, String contactPhone, String contactEmail, String remark) { WarehouseRequests.SaveRequest toCreateRequest() { @@ -327,7 +336,8 @@ public class WarehouseImportService { String warehouseType = StringUtils.hasText(type) ? type.trim().toUpperCase(Locale.ROOT) : null; String resolvedCountry = StringUtils.hasText(countryCode) ? countryCode.trim().toUpperCase(Locale.ROOT) : null; String resolvedName = StringUtils.hasText(name) ? name : code; - return new WarehouseRequests.SaveRequest(WarehouseSaveNormalizer.PUBLIC_TENANT_ID, code, resolvedName, warehouseType, + return new WarehouseRequests.SaveRequest(WarehouseSaveNormalizer.PUBLIC_TENANT_ID, code, + WarehouseSaveNormalizer.trimToNull(internalCode), resolvedName, warehouseType, resolvedCountry, WarehouseSaveNormalizer.trimToNull(timezone), WarehouseSaveNormalizer.trimToNull(resolvedContactName), WarehouseSaveNormalizer.trimToNull(resolvedContactPhone), diff --git a/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseSaveNormalizer.java b/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseSaveNormalizer.java index 69d09eacf..a44ed1c40 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseSaveNormalizer.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseSaveNormalizer.java @@ -100,7 +100,16 @@ final class WarehouseSaveNormalizer { List capabilities = TYPE_FBA.equals(warehouseType) ? List.of() : request.capabilities(); - return new NormalizedSaveRequest(tenantId, request.warehouseCode().trim(), request.warehouseName().trim(), + String internalCode = trimToNull(request.internalCode()); + if (internalCode != null && !internalCode.matches("[A-Za-z0-9]{1,16}")) { + throw new BizException(ResultCode.VALIDATION_FAILED, + "Internal code must contain 1 to 16 letters or digits / 内部编号必须为 1 至 16 位字母或数字"); + } + if (internalCode != null && !TYPE_FBA.equals(warehouseType)) { + throw new BizException(ResultCode.VALIDATION_FAILED, + "Internal code is only available for FBA warehouses / 内部编号仅允许 FBA 仓填写"); + } + return new NormalizedSaveRequest(tenantId, request.warehouseCode().trim(), internalCode == null ? null : internalCode.toUpperCase(Locale.ROOT), request.warehouseName().trim(), warehouseType, countryCode, timezone, trimToNull(request.contactName()), trimToNull(request.contactPhone()), trimToNull(request.contactEmail()), status, trimToNull(request.remark()), normalizedAddress, capabilities); } @@ -149,6 +158,7 @@ final class WarehouseSaveNormalizer { record NormalizedSaveRequest( long tenantId, String warehouseCode, + String internalCode, String warehouseName, String warehouseType, String countryCode, diff --git a/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseSchemaReadinessService.java b/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseSchemaReadinessService.java index d6d41a8bf..5e782a8b6 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseSchemaReadinessService.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/service/WarehouseSchemaReadinessService.java @@ -14,7 +14,7 @@ import java.util.List; @Service public class WarehouseSchemaReadinessService { private static final List PROBES = List.of( - "SELECT id, tenant_id, warehouse_code, warehouse_name, warehouse_type, country_code, timezone, status, deleted FROM wh_warehouse LIMIT 0", + "SELECT id, tenant_id, warehouse_code, internal_code, warehouse_name, warehouse_type, country_code, timezone, status, deleted FROM wh_warehouse LIMIT 0", "SELECT id, tenant_id, warehouse_id, address_type, country_code, city, address_line1, deleted FROM wh_warehouse_address LIMIT 0", "SELECT id, tenant_id, warehouse_id, capability_code, capability_name, enabled, deleted FROM wh_service_capability LIMIT 0", "SELECT id, tenant_id, data_scope_id, partner_code, partner_name, partner_type, status, remark, deleted FROM wh_partner LIMIT 0", diff --git a/warehouse/src/main/resources/db/master-data/fba-public-addresses.accepted.csv b/warehouse/src/main/resources/db/master-data/fba-public-addresses.accepted.csv index 5f4846717..cebe3f970 100644 --- a/warehouse/src/main/resources/db/master-data/fba-public-addresses.accepted.csv +++ b/warehouse/src/main/resources/db/master-data/fba-public-addresses.accepted.csv @@ -1,253 +1,315 @@ source_row,warehouse_id_seed,address_id_seed,warehouse_code,warehouse_name,country_code,state_province,city,postal_code,timezone,address_line1,source_internal_id -238,193000000000000001,193000000000100001,ABE2,ABE2,US,PA,Breinigsville,18031,UTC-5,705 Boulder Drive, -237,193000000000000002,193000000000100002,ABE3,ABE3,US,PA,Breinigsville,18031,UTC-5,650 Boulder Drive, -134,193000000000000003,193000000000100003,ABE4,ABE4,US,PA,Easton,18045,UTC-5,1610 Van Buren Road,126 -231,193000000000000004,193000000000100004,ABE5,ABE5,US,PA,Harrisburg,17112,UTC-5,6455 Allentown Boulevard, -125,193000000000000005,193000000000100005,ABE8,ABE8,US,NJ,Florence,08518,UTC-5,401 Independence Road 08518-2200,39 -99,193000000000000006,193000000000100006,ABQ2,ABQ2,US,NM,LOS LUNAS,87031,UTC-7,6251 Pioneer Trail NW,76 -84,193000000000000007,193000000000100007,ACY2,ACY2,US,NJ,BURLINGTON,08016,UTC-5,1101 E PEARL ST,101 -141,193000000000000008,193000000000100008,AFW1,AFW1,US,TX,FORT WORTH,76131,UTC-6,1851 NE LOOP 820, -27,193000000000000009,193000000000100009,AFW5,AFW5,US,TX,BALCH SPRINGS,75180-1636,UTC-6,12374 LAKE JUNE RD,181 -148,193000000000000010,193000000000100010,AKR1,AKR1,US,OH,Canton,44705,UTC-5,4747 Rebar Ave NE,153 -174,193000000000000011,193000000000100011,ALB1,ALB1,US,NY,Castleton,12033-9634,UTC-5,1835 US Route 9,102 -129,193000000000000012,193000000000100012,AMA1,AMA1,US,TX,Amarillo,79108,UTC-6,8590 NE 24th Avenue,132 -31,193000000000000013,193000000000100013,ATL2N,ATL2N,US,GA,Carrollton,30117,UTC-5,3101 N. Highway 27,157 -147,193000000000000014,193000000000100014,ATL3,ATL3,US,GA,Pendergrass,30567,UTC-5,445 Valentine Industrial Parkway, -202,193000000000000015,193000000000100015,ATL6,ATL6,US,GA,East Point,30344,UTC-5,4200 North Commerce, -233,193000000000000016,193000000000100016,AVP1,AVP1,US,PA,Hazle Township,18202-9361,UTC-5,550 Oak Ridge Road,70 -232,193000000000000017,193000000000100017,AVP3,AVP3,US,PA,GOULDSBORO,18424-9492,UTC-5,298 1ST AVE, -289,193000000000000018,193000000000100018,BDL1,BDL1,US,CT,Windsor,06095,UTC-5,801 Day Hill Rd., -208,193000000000000019,193000000000100019,BFI1,BFI1,US,WA,Sumner,98390,UTC-8,1800 140th Avenue E., -207,193000000000000020,193000000000100020,BFI3,BFI3,US,WA,Dupont,98327-9607,UTC-8,2700 Center Drive,34 -206,193000000000000021,193000000000100021,BFI7,BFI7,US,WA,Sumner,98390,UTC-8,1901 140th Ave E, -11,193000000000000022,193000000000100022,BJC1,BJC1,US,CO,AURORA,80019,UTC-7,6300 N Powhaton Road,186 -221,193000000000000023,193000000000100023,BNA1,BNA1,US,TN,Lebanon,37090,UTC-6,14840 Central Pike Suite 190, -131,193000000000000024,193000000000100024,BNA2,BNA2,US,TN,Lebanon,37090,UTC-6,500 Duke DR,37 -140,193000000000000025,193000000000100025,BNA3,BNA3,US,TN,Murfreesboro,37127,UTC-6,2020 Joe B Jackson Pkwy, -220,193000000000000026,193000000000100026,BNA4,BNA4,US,TN,Nashville,37217,UTC-6,50 airways Blvd, -110,193000000000000027,193000000000100027,BNA6,BNA6,US,TN,CLARKSVILLE,37040-5502,UTC-6,3875 GUTHRIE HWY,99 -243,193000000000000028,193000000000100028,BOS1,BOS1,US,NH,Nashua,03063,UTC-5,10 State St., -193,193000000000000029,193000000000100029,BOS2,BOS2,US,MA,Drive Stoughton,02072,UTC-5,1000 Tech Centre, -192,193000000000000030,193000000000100030,BOS7,BOS7,US,MA,Fall River,02720,UTC-5,1180 Innovation Way,103 -242,193000000000000031,193000000000100031,BWI1,BWI1,US,VA,Sterling,20166-2058,UTC-5,45121 Global Plaza, -241,193000000000000032,193000000000100032,BWI2,BWI2,US,MD,Baltimore,21224,UTC-5,2010 Broening Hwy, -102,193000000000000033,193000000000100033,BWI4,BWI4,US,VA,CLEARBROOK,22624,UTC-5,165 Business Blvd,150 -225,193000000000000034,193000000000100034,CAE1,CAE1,US,SC,West Columbia,29172,UTC-5,4400 12TH STREET EXT, -223,193000000000000035,193000000000100035,CHA1,CHA1,US,TN,Chattanooga,37416,UTC-5,7200 Discovery Drive, -222,193000000000000036,193000000000100036,CHA2,CHA2,US,TN,Charleston,37310,UTC-5,225 Infinity Dr NW,66 -75,193000000000000037,193000000000100037,CHO1,CHO1,US,VA,FISHERSVILLE,22939,UTC-5,32 TRADER RD,120 -191,193000000000000038,193000000000100038,CLT2,CLT2,US,NC,Charlotte,28214-8082,UTC-5,10240 Old Dowd Rd,59 -114,193000000000000039,193000000000100039,CLT3,CLT3,US,NC,CONCORD,28027,UTC-5,6500 Davidson Hwy,104 -240,193000000000000040,193000000000100040,CMH2,CMH2,US,OH,Groveport,43125-9016,UTC-5,6050 Gateway Court,123 -181,193000000000000041,193000000000100041,CMH3,CMH3,US,OH,Monroe,45050-1848,UTC-5,700 GATEWAY BLVD,32 -262,193000000000000042,193000000000100042,CVG1,CVG1,US,KY,Hebron,41048,UTC-5,1155 Worldwide Blvd, -261,193000000000000043,193000000000100043,CVG2,CVG2,US,KY,Hebron,41048,UTC-5,1600 Worldwide Blvd, -260,193000000000000044,193000000000100044,CVG3,CVG3,US,KY,Hebron,41048,UTC-5,3680 Langley Dr., -259,193000000000000045,193000000000100045,CVG5,CVG5,US,KY,Hebron,41048,UTC-5,2285 Litton Lane, -135,193000000000000046,193000000000100046,DCA6,DCA6,US,MD,BALTIMORE,21219,UTC-5,6001 Bethlehem Blvd,135 -123,193000000000000047,193000000000100047,DEN2,DEN2,US,CO,Aurora,80019,UTC-7,22205 East 19th Ave,107 -120,193000000000000048,193000000000100048,DEN8,DEN8,US,CO,Aurora,80018,UTC-7,21000 E 13th Ave,73 -189,193000000000000049,193000000000100049,DET1,DET1,US,MI,Livonia,48150-1543,UTC-5,39000 Amrhein Road,118 -182,193000000000000050,193000000000100050,DET2,DET2,US,MI,Shelby Township,48317-1318,UTC-5,50500 Mound Rd,136 -143,193000000000000051,193000000000100051,DFW5S,DFW5S,US,TX,Lancaster,75146,UTC-6,"2500 E Belt Line Rd,", -219,193000000000000052,193000000000100052,DFW6,DFW6,US,TX,Coppell,75019,UTC-6,940 W Bethel Road,105 -217,193000000000000053,193000000000100053,DFW8,DFW8,US,TX,DFW Airport,75261,UTC-6,2700 Regent Blvd, -256,193000000000000054,193000000000100054,EWR4,EWR4,US,NJ,Robbinsville,08691,UTC-5,50 New Canton Way, -255,193000000000000055,193000000000100055,EWR5,EWR5,US,NJ,Avenel,07001,UTC-5,301 Blair Rd., -254,193000000000000056,193000000000100056,EWR7,EWR7,US,NJ,Avenel,07001,UTC-5,301 Blair Rd., -253,193000000000000057,193000000000100057,EWR9,EWR9,US,NJ,Carteret,07008,UTC-5,8003 Industrial Parkway, -117,193000000000000058,193000000000100058,FAT2,FAT2,US,CA,VISALIA,93291-1882,UTC-8,3315 N KELSEYST,43 -176,193000000000000059,193000000000100059,FOE1,FOE1,US,KS,KANSAS CITY,66109-3665,UTC-6,9400 LEAVENWORTH RD,117 -212,193000000000000060,193000000000100060,FTW1,FTW1,US,TX,Dallas,75241,UTC-6,33333 Lyndon B Johnson FREEWAY,24 -211,193000000000000061,193000000000100061,FTW2,FTW2,US,TX,Coppell,75019,UTC-6,2701 West Bethel Road, -89,193000000000000062,193000000000100062,FTW3,FTW3,US,TX,Fort Worth,76177-2517,UTC-6,15201 Heritage Pkwy, -121,193000000000000063,193000000000100063,FTW5,FTW5,US,TX,Forney,75126,UTC-6,1475 AKRON WAY,48 -171,193000000000000064,193000000000100064,FWA4,FWA4,US,IN,FORT WAYNE,46809-9771,UTC-5,9798 Smith Road,58 -151,193000000000000065,193000000000100065,GEG2,GEG2,US,WA,SPOKANE,99216,UTC-8,18007 E Garland Ave,108 -67,193000000000000066,193000000000100066,GEU2,GEU2,US,AZ,Glendale,85307,UTC-7,15301 West Northern Avenue,97 -78,193000000000000067,193000000000100067,GEU3,GEU3,US,AZ,BUCKEYE,85396,UTC-7,18900 W McDowell Road,81 -68,193000000000000068,193000000000100068,GEU5,GEU5,US,AZ,GOODYEAR,85395,UTC-7,4660 North Cotton Lane,100 -164,193000000000000069,193000000000100069,GSO1,GSO1,US,NC,KERNERSVILLE,27284,UTC-5,1656 OLD GREENSBORO RD,131 -224,193000000000000070,193000000000100070,GSP1,GSP1,US,SC,Spartanburg,29303,UTC-5,402 John Dodd Rd,90 -188,193000000000000071,193000000000100071,GYR2,GYR2,US,AZ,GOODYEAR,85395-7672,UTC-7,17341 W MINNEZONA AVE,7 -187,193000000000000072,193000000000100072,GYR3,GYR3,US,AZ,PHOENIX,85043-2356,UTC-7,8181 W ROOSEVELT ST,8 -80,193000000000000073,193000000000100073,HGR6,HGR6,US,MD,HAGERSTOWN,21740-7301,UTC-5,55 West Oak Ridge Drive,130 -87,193000000000000074,193000000000100074,HIA1,HIA1,US,PA,MIDDLETOWN,17057,UTC-5,3327 E Harrisburg Pik,148 -44,193000000000000075,193000000000100075,HLI2,HLI2,US,CA,HOLLISTER,95023,UTC-8,600 Ernie Drive,137 -216,193000000000000076,193000000000100076,HOU1,HOU1,US,TX,Humble,77338,UTC-6,8120 Humble Westfield Rd, -215,193000000000000077,193000000000100077,HOU2,HOU2,US,TX,Houston,77038-2324,UTC-6,10550 Ella Blvd., -214,193000000000000078,193000000000100078,HOU3,HOU3,US,TX,Brookshire,77423,UTC-6,31555 Highway 90 E, -154,193000000000000079,193000000000100079,HOU8,HOU8,US,TX,FRESNO,77545,UTC-6,2303 Hurricane Lane,49 -142,193000000000000080,193000000000100080,HSV1,HSV1,US,AL,Madison,35756,UTC-6,7817 Greenbrier Road,80 -126,193000000000000081,193000000000100081,HSV2,HSV2,US,AL,MADISON,35756,UTC-6,28869 Fanning Dr NW, -155,193000000000000082,193000000000100082,IAH3,IAH3,US,TX,Houston,77032,UTC-6,15525 Milner Road,57 -3,193000000000000083,193000000000100083,IAZ1,IAZ1,US,AZ,GOODYEAR,85395-4515,UTC-7,"4660 N COTTON LN 85395-4515 - GOODYEAR, AZ - United States",179 -136,193000000000000084,193000000000100084,ICT2,ICT2,US,KS,PARK CITY,67219,UTC-6,7130 N BROADWAY AVE,109 -2,193000000000000085,193000000000100085,IGA3,IGA3,US,GA,MACON,31216-6427,UTC-5,"7001 Skipper Rd 31216-6427 MACON, GA - United States", -152,193000000000000086,193000000000100086,IGQ2,IGQ2,US,IL,University park,60484,UTC-6,23257 S. Central Avenue,110 -119,193000000000000087,193000000000100087,ILG1,ILG1,US,DE,NEW CASTLE,19720,UTC-5,780 S. DuPont Highway,35 -10,193000000000000088,193000000000100088,IMO1,IMO1,US,MO,LIBERTY,64068-8933,UTC-6,2361 S Withers RD,178 -6,193000000000000089,193000000000100089,IMS1,IMS1,US,MS,OLIVE BRANCH,38654,UTC-6,IMS1-11505 Progress Way,38654-2510,OLIVE BRANCH,MS,US,189 -5,193000000000000090,193000000000100090,INC1,INC1,US,NC,FAYETTEVILLE,28303-2215,UTC-5,"6309 Bragg Blvd 28303-2215 - FAYETTEVILLE, NC - United States",190 -88,193000000000000091,193000000000100091,IND2,IND2,US,IN,Plainfield,46168-7442,UTC-5,715 Airtech Pkwy,127 -276,193000000000000092,193000000000100092,IND4,IND4,US,IN,Indianapolis,46231,UTC-5,710 S. Girls School Rd, -275,193000000000000093,193000000000100093,IND5,IND5,US,IN,Plainfield,46168,UTC-5,800 Perry Road,140 -274,193000000000000094,193000000000100094,IND6,IND6,US,IN,Jeffersonville,47130,UTC-5,1453 E 10th St, -173,193000000000000095,193000000000100095,IND9,IND9,US,IN,GREENWOOD,46143-7830,UTC-5,1151 S GRAHAM RD,17 -9,193000000000000096,193000000000100096,ITX3,ITX3,US,TX,AMARILLO,79108-7749,UTC-6,"ITX3-8590 NE 24th Ave,79108-7749,AMARILLO,TX,US",187 -22,193000000000000097,193000000000100097,IUSF,IUSF,US,TX,DALLAS,75241,UTC-6,3351 Balmorhea Dr,169 -69,193000000000000098,193000000000100098,IUSJ,IUSJ,US,CA,BEAUMONT,92223,UTC-8,36900 West 4th Street,98 -74,193000000000000099,193000000000100099,IUSP,IUSP,US,CA,"HESPERIA,",92344,UTC-8,8140 Caliente Rd,83 -70,193000000000000100,193000000000100100,IUSQ,IUSQ,US,CA,REDLANDS,92374,UTC-8,2125 W San Bernardino Ave,95 -40,193000000000000101,193000000000100101,IUSR,IUSR,US,SC,COWPENS,29330,UTC-5,1120 Mt Olive Rd,158 -39,193000000000000102,193000000000100102,IUST,IUST,US,PA,GREENCASTLE,17225,UTC-5,"3PL AWD (Greencastle, PA, US) 15651 Greenmount RdGREENCASTLE, PA 17225 United States",149 -33,193000000000000103,193000000000100103,IUSW,IUSW,US,CA,Hesperia,92344,UTC-8,"8130 Caliente Rd 92344 - Hesperia, CA - United States",156 -21,193000000000000104,193000000000100104,IUTE,IUTE,US,AZ,GOODYEAR,85338,UTC-7,16155 W Elwood St,170 -8,193000000000000105,193000000000100105,IUTJ,IUTJ,US,CA,Fontana,92335,UTC-8,"9253 Dreamland Drive 92335 - Fontana, CA - United",177 -7,193000000000000106,193000000000100106,IUTL,IUTL,US,CA,Moreno Valley,92551,UTC-8,"24405 Krameria Ave 92551 - Moreno Valley, CA - United States",188 -4,193000000000000107,193000000000100107,IWA6,IWA6,US,WA,PASCO,99301-6161,UTC-8,"1202 S Road 40 E 99301-6161 - PASCO, WA - United States",191 -72,193000000000000108,193000000000100108,JOT1,JOT1,US,CA,SAN BERNARDINO,92408,UTC-8,1494 S WATERMAN AVE,93 -150,193000000000000109,193000000000100109,JVL1,JVL1,US,WI,BELOIT,53511,UTC-6,1255 Gateway Blvd,125 -178,193000000000000110,193000000000100110,KRB4,KRB4,US,CA,PERRIS,92571-9722,UTC-8,4501 PATTERSON AVE, -161,193000000000000111,193000000000100111,KY1,KY1,US,KY,Shepherdsville,40165,UTC-5,"120 Velocity Way.,",60 -100,193000000000000112,193000000000100112,LAN2,LAN2,US,MI,LANSING,48917,UTC-5,6500 W Mt Hope Hwy,96 -247,193000000000000113,193000000000100113,LAS1,LAS1,US,NV,HENDERSON,89044,UTC-8,12300 Bermuda Road,5 -246,193000000000000114,193000000000100114,LAS2,LAS2,US,NV,Las Vegas,89030,UTC-8,"3837 Bay Lake Trail, Suite 111 North", -132,193000000000000115,193000000000100115,LAS6,LAS6,US,NV,Las Vegas,89115,UTC-8,4550 Nexus Way,50 -162,193000000000000116,193000000000100116,LAX2T,LAX2T,US,CA,CHINO,91708,UTC-8,6730 Kimball Ave,19 -183,193000000000000117,193000000000100117,LAX9,LAX9,US,CA,FONTANA,92337,UTC-8,11263 Oleander Ave,3 -86,193000000000000118,193000000000100118,LBE1,LBE1,US,PA,Greensburg,15605,UTC-5,165 Glen Fox Road,112 -268,193000000000000119,193000000000100119,LEX1,LEX1,US,KY,Lexington,40511,UTC-5,1850 Mercer RD, -267,193000000000000120,193000000000100120,LEX2,LEX2,US,KY,Lexington,40511,UTC-5,172 Trade St., -107,193000000000000121,193000000000100121,LFT1,LFT1,US,LA,CARENCRO,70520-5976,UTC-6,3550 NE EVANGELINE TRWY,31 -291,193000000000000122,193000000000100122,LGB3,LGB3,US,CA,Eastvale,91752,UTC-8,4950 Goodman Way, -292,193000000000000123,193000000000100123,LGB4,LGB4,US,CA,Redlands,92374,UTC-8,27517 Pioneer Avenue,45 -293,193000000000000124,193000000000100124,LGB6,LGB6,US,CA,Riverside,92518-1513,UTC-8,20901 Krameria Ave,26 -294,193000000000000125,193000000000100125,LGB8,LGB8,US,CA,Rialto,92376,UTC-8,1568 N Linden Ave,2 -106,193000000000000126,193000000000100126,LIT2,LIT2,US,AR,NORTH LITTLE ROCK,72117,UTC-6,13001 HIGHWAY 70,159 -32,193000000000000127,193000000000100127,MCC1,MCC1,US,CA,RANCHO CORDOVA,95742,UTC-8,"3300 Rancho Cordova Pkwy 95742 - RANCHO CORDOVA, CA - United States",161 -157,193000000000000128,193000000000100128,MCE1,MCE1,US,CA,TURLOCK,95380,UTC-8,FULKERTH RD,65 -271,193000000000000129,193000000000100129,MCI1,MCI1,US,KS,Lenexa,66219,UTC-6,113th St & Renner Blvd., -12,193000000000000130,193000000000100130,MCI4,MCI4,US,MO,KANSAS CITY,64163,UTC-6,MCI4 - 10501 NW 136th Street,176 -115,193000000000000131,193000000000100131,MCO2,MCO2,US,FL,Deltona,32725-2610,UTC-5,2600 N Normandy Blvd,106 -230,193000000000000132,193000000000100132,MDT1,MDT1,US,PA,Carlisle,17015,UTC-5,2Ames Drive,121 -128,193000000000000133,193000000000100133,MDT4,MDT4,US,PA,York,17408,UTC-5,5125 Commerce Drive,144 -200,193000000000000134,193000000000100134,MDW2,MDW2,US,IL,Joliet,60433-3280,UTC-6,250 Emerald Drive,46 -199,193000000000000135,193000000000100135,MDW6,MDW6,US,IL,ROMEOVILLE,60446-6529,UTC-6,1125 W REMINGTON BLVD ROMEOVILLE,143 -198,193000000000000136,193000000000100136,MDW7,MDW7,US,IL,Monee,60449,UTC-6,6605 Monee Manhattan Road, -197,193000000000000137,193000000000100137,MDW8,MDW8,US,IL,Waukegan,60085,UTC-6,1750 Bridge Drive, -196,193000000000000138,193000000000100138,MDW9,MDW9,US,IL,Aurora,60502,UTC-6,2865 Duke Parkway,36 -163,193000000000000139,193000000000100139,MEM1,MEM1,US,TN,Memphis,38118,UTC-6,3292 E Holmes Rd,85 -118,193000000000000140,193000000000100140,MEM6,MEM6,US,MS,OLIVE BRANCH,38654,UTC-6,11505 Progress Way,51 -201,193000000000000141,193000000000100141,MGE3,MGE3,US,GA,Jefferson,30549-2010,UTC-5,808 Hog Mountain Road,133 -77,193000000000000142,193000000000100142,MIT2,MIT2,US,CA,SHAFTER,93263,UTC-8,5408 Express Avenue,82 -270,193000000000000143,193000000000100143,MKC4,MKC4,US,KS,Edgerton,66021-9588,UTC-6,19645 Waverly Rd,67 -269,193000000000000144,193000000000100144,MKC6,MKC6,US,KS,Kansas City,66102,UTC-6,6925 Riverview Avenue, -203,193000000000000145,193000000000100145,MKE1,MKE1,US,WI,Kenosha,53144,UTC-6,3501 120th Ave, -94,193000000000000146,193000000000100146,MQJ1,MQJ1,US,IN,GREENFIELD,46140,UTC-5,4412 W 300 RD N,88 -190,193000000000000147,193000000000100147,MSP1,MSP1,US,MN,Shakopee,55379,UTC-6,2601 4th Avenue East, -17,193000000000000148,193000000000100148,NJ3,NJ3,US,NJ,Pedricktown,08067,UTC-5,3 Sorbello Way,175 -299,193000000000000149,193000000000100149,OAK3,OAK3,US,CA,Patterson,95363-8876,UTC-8,255 Park Center Drive,41 -300,193000000000000150,193000000000100150,OAK4,OAK4,US,CA,Tracy,95304-9370,UTC-8,1555 N. Chrisman Rd, -133,193000000000000151,193000000000100151,OKC2,OKC2,US,OK,OKLAHOMA CITY,73159,UTC-6,8991 S PORTLAND AVENUE,33 -19,193000000000000152,193000000000100152,OLM1,OLM1,US,WA,OLYMPIA,98516,UTC-8,"3300 HOGUM BAY RD NE 98516-3111 - OLYMPIA, WA - United States",172 -303,193000000000000153,193000000000100153,ONT2,ONT2,US,CA,San Bernardino,92408,UTC-8,1910 E Central Ave, -302,193000000000000154,193000000000100154,ONT6,ONT6,US,CA,Moreno Valley,92551-9561,UTC-8,24208 San Michele Rd, -301,193000000000000155,193000000000100155,ONT8,ONT8,US,CA,Moreno Valley,92551-9534,UTC-8,24300 Nandina Ave,1 -298,193000000000000156,193000000000100156,ONT9,ONT9,US,CA,Redlands,92374,UTC-8,2125 W. San Bernandino Ave,25 -103,193000000000000157,193000000000100157,ORD2,ORD2,US,IL,CHANNAHON,60410-8758,UTC-6,23714 W Amoco Rd,21 -195,193000000000000158,193000000000100158,ORD6,ORD6,US,IL,Wood Dale,60191,UTC-6,1250 N Mittel Blvd, -113,193000000000000159,193000000000100159,ORF2,ORF2,US,VA,CHESAPEAKE,23321-1425,UTC-5,ORF2 - 5045 PORTSMOUTH BLVD,38 -81,193000000000000160,193000000000100160,PBI3,PBI3,US,FL,Jacksonville,32206,UTC-5,21 Jump Street,113 -127,193000000000000161,193000000000100161,PDX7,PDX7,US,OR,Salem,97317,UTC-8,4775 Depot Ct SE,68 -288,193000000000000162,193000000000100162,PHL1,PHL1,US,DE,New Castle,19720,UTC-5,1 Centerpoint Blvd., -287,193000000000000163,193000000000100163,PHL3,PHL3,US,DE,New Castle,19720,UTC-5,1600 Johnson Way, -236,193000000000000164,193000000000100164,PHL4,PHL4,US,PA,Carlisle,17015,UTC-5,21 Roadway Dr,52 -235,193000000000000165,193000000000100165,PHL5,PHL5,US,PA,Lewisberry,17339,UTC-5,500 McCarthy Dr, -20,193000000000000166,193000000000100166,PHL5S,PHL5S,US,PA,Greencastle,17225,UTC-5,"1915 Ebberts Spg Ct, Greencastle, PA 17225",171 -234,193000000000000167,193000000000100167,PHL6,PHL6,US,PA,Carlisle,17015,UTC-5,675 Allen Rd.,69 -286,193000000000000168,193000000000100168,PHL7,PHL7,US,DE,Middletown,19709,UTC-5,560 Merrimac Ave, -285,193000000000000169,193000000000100169,PHL8,PHL8,US,DE,Middletown,19709,UTC-5,727 N Broad St, -307,193000000000000170,193000000000100170,PHX3,PHX3,US,AZ,Phoenix,85043,UTC-7,6835 West Buckeye Road, -306,193000000000000171,193000000000100171,PHX5,PHX5,US,AZ,Goodyear,85338,UTC-7,16920 W Commerce Drive,72 -305,193000000000000172,193000000000100172,PHX6,PHX6,US,AZ,Phoenix,85043,UTC-7,4750 West Mohave St, -304,193000000000000173,193000000000100173,PHX7,PHX7,US,AZ,Phoenix,85043,UTC-7,800 N 75th Ave,74 -229,193000000000000174,193000000000100174,PIT1,PIT1,US,PA,Pittsburgh,15205,UTC-5,2250 Roswell Drive, -158,193000000000000175,193000000000100175,PIT2,PIT2,US,PA,IMPERIAL,15126-1002,UTC-5,1200 Westport Rd,78 -46,193000000000000176,193000000000100176,POC1,POC1,US,CA,FONTANA,92336-1123,UTC-8,4121 LYTLE CREEK RD,128 -38,193000000000000177,193000000000100177,POC2,POC2,US,CA,ONTARIO,91761,UTC-8,4000 South Hamner Avenue,151 -45,193000000000000178,193000000000100178,POC3,POC3,US,CA,JURUPA VALLEY,92509,UTC-8,6120 Clinker Drive,129 -49,193000000000000179,193000000000100179,PPO4,PPO4,US,IN,MERRILLVILLE,46410,UTC-6,9850 Mississippi Street,122 -93,193000000000000180,193000000000100180,PSC2,PSC2,US,WA,PASCO,99301,UTC-8,1351 S Road 40 E,75 -28,193000000000000181,193000000000100181,PSP3,PSP3,US,CA,DESERT HOT SPRINGS,92240,UTC-8,64165 19th AVE,162 -71,193000000000000182,193000000000100182,QXY5,QXY5,US,CA,STOCKTON,95215,UTC-8,4532 NEWCASTLE RD,92 -35,193000000000000183,193000000000100183,QXY8,QXY8,US,CA,FRESNO,93725-1962,UTC-8,3611 S NORTHPOINTE DR,154 -14,193000000000000184,193000000000100184,QZZ7,QZZ7,US,AZ,MESA,85212-9608,UTC-7,8560 E ELLIOT RD,184 -146,193000000000000185,193000000000100185,RDU2,RDU2,US,NC,Smithfield,27577,UTC-5,2150 US HWY 70 Business West,56 -95,193000000000000186,193000000000100186,RDU4,RDU4,US,NC,FAYETTEVILLE,28303,UTC-5,6309 Bragg Blvd,145 -145,193000000000000187,193000000000100187,RFD2,RFD2,US,IL,Huntley,60142,UTC-6,11500 Freeman Road,71 -16,193000000000000188,193000000000100188,RFD4,RFD4,US,IL,HUNTLEY,60142,UTC-6,"11400 Venture Court 60142-8075 - HUNTLEY, IL - United States",174 -210,193000000000000189,193000000000100189,RIC1,RIC1,US,VA,Petersburg,23803,UTC-5,5000 Commerce Way,142 -209,193000000000000190,193000000000100190,RIC2,RIC2,US,VA,Chester,23836,UTC-5,1901 Meadowville Technology Pkwy, -144,193000000000000191,193000000000100191,RMN3,RMN3,US,VA,Fredericksburg,22406,UTC-5,220 Centreport Parkway,84 -248,193000000000000192,193000000000100192,RNO1,RNO1,US,NV,Fernley,89408,UTC-8,1600 East Newlands RD, -245,193000000000000193,193000000000100193,RNO2,RNO2,US,NV,Reno,85906,UTC-8,8000 North Virginia Street, -244,193000000000000194,193000000000100194,RNO4,RNO4,US,NV,Reno,89506,UTC-8,8000 North Virginia Street, -73,193000000000000195,193000000000100195,RYY2,RYY2,US,GA,White,30184,UTC-5,"1250 Cassville White Road,",94 -218,193000000000000196,193000000000100196,SAT1,SAT1,US,TX,Schertz,78154-1461,UTC-6,6000 Enterprise Avenue,23 -149,193000000000000197,193000000000100197,SAT4,SAT4,US,TX,SAN ANTONIO,78245,UTC-6,10384 W US HIGHWAY 90,61 -15,193000000000000198,193000000000100198,SAT6,SAT6,US,TX,SAN MARCOS,78666,UTC-6,"1346 Fortuna Road 78666-0001 - SAN MARCOS, TX - United States",183 -98,193000000000000199,193000000000100199,SAV3,SAV3,US,GA,Macon,31216-6427,UTC-5,7001 Skipper Rd,124 -185,193000000000000200,193000000000100200,SBD1,SBD1,US,CA,BLOOMINGTON,92316-3819,UTC-8,3388 S Cactus Ave,4 -179,193000000000000201,193000000000100201,SBD2,SBD2,US,CA,SAN BERNARDINO,92408-2805,UTC-8,1494 S WATERMAN AVE,15 -97,193000000000000202,193000000000100202,SCK1,SCK1,US,CA,STOCKTON,95215,UTC-8,4532 NEWCASTLE RD,20 -60,193000000000000203,193000000000100203,SCK3,SCK3,US,CA,MANTECA,95336,UTC-8,3565 N AIRPORT WAY MANTECA,54 -186,193000000000000204,193000000000100204,SCK4,SCK4,US,CA,STOCKTON,95215-8354,UTC-8,6001 S AUSTIN RD,10 -104,193000000000000205,193000000000100205,SCK8,SCK8,US,CA,OAKLEY,94561-2677,UTC-8,4700 WILBUR AVE,141 -266,193000000000000206,193000000000100206,SDF1,SDF1,US,KY,Campbellsville,42718,UTC-5,1050 South Columbia AVE, -265,193000000000000207,193000000000100207,SDF2,SDF2,US,KY,Watterson Park,40218,UTC-5,4360 Robards Ln, -264,193000000000000208,193000000000100208,SDF4,SDF4,US,KY,Shepherdsville,40165,UTC-5,376 Zappos.com Blvd, -263,193000000000000209,193000000000100209,SDF6,SDF6,US,KY,Shepherdsville,40165,UTC-5,271 Omega Pkwy, -258,193000000000000210,193000000000100210,SDF7,SDF7,US,KY,Shepherdsville,40165,UTC-5,300 Omicron Court, -273,193000000000000211,193000000000100211,SDF8,SDF8,US,IN,Jeffersonville,47130,UTC-5,900 Patrol Rd, -257,193000000000000212,193000000000100212,SDF9,SDF9,US,KY,Shepherdsville,40165,UTC-5,100 W. Thomas P. Echols Lane, -205,193000000000000213,193000000000100213,SEA6,SEA6,US,WA,South Seattle,98144,UTC-8,2646 Rainier Ave., -204,193000000000000214,193000000000100214,SEA8,SEA8,US,WA,Northeast Bellevue,98005,UTC-8,1475 124th Avenue, -295,193000000000000215,193000000000100215,SJC7,SJC7,US,CA,Tracy,95377-8906,UTC-8,188 Mountain House Parkway,30 -153,193000000000000216,193000000000100216,SLC2,SLC2,US,UT,West Jordan,84081,UTC-7,7148 W. Old Bingham Hwy,86 -13,193000000000000217,193000000000100217,SLC3,SLC3,US,UT,SALT LAKE CITY,84116-4413,UTC-7,355 N JOHN GLENN RD,185 -184,193000000000000218,193000000000100218,SMF3,SMF3,US,CA,Stockton,95206-8202,UTC-8,3923 S B ST,9 -105,193000000000000219,193000000000100219,SMF6,SMF6,US,CA,SACRAMENTO,95837-9109,UTC-8,4930 ALLBAUGH DR,28 -296,193000000000000220,193000000000100220,SNA4,SNA4,US,CA,Rialto,92376-3009,UTC-8,2496 W Walnut Ave,18 -109,193000000000000221,193000000000100221,STL3,STL3,US,MO,REPUBLIC,65738-2779,UTC-6,3200 E SAWYER RD,152 -194,193000000000000222,193000000000100222,STL4,STL4,US,IL,Edwardsville,62025-2815,UTC-6,3050 GATEWAY COMMERCE CENTER DR S,115 -122,193000000000000223,193000000000100223,SWF1,SWF1,US,NY,ROCK TAVERN,12575,UTC-5,635 INTERNATIONAL BLVD,134 -76,193000000000000224,193000000000100224,SWF2,SWF2,US,NY,Hopewell Junction,12533,UTC-5,76 Patriot Way Hopewell Junction,62 -41,193000000000000225,193000000000100225,TCY1,TCY1,US,CA,STOCKTON,95206,UTC-8,2690 East Arch Airport Road,139 -43,193000000000000226,193000000000100226,TCY2,TCY2,US,CA,STOCKTON,95215,UTC-8,6201 Newcastle Rd,138 -250,193000000000000227,193000000000100227,TEB3,TEB3,US,NJ,Logan Township,08085,UTC-5,2651 Oldmans Creek Rd,47 -130,193000000000000228,193000000000100228,TEB4,TEB4,US,NJ,PENNS GROVE,08069,UTC-5,747 COURSES LANDING RD,55 -249,193000000000000229,193000000000100229,TEB6,TEB6,US,NJ,Cranbury,08512,UTC-5,22 Hightstown Cranbury State Road,114 -156,193000000000000230,193000000000100230,TEB9,TEB9,US,NJ,Somerset,08873,UTC-5,601 Randolph Road,40 -65,193000000000000231,193000000000100231,TMB8,TMB8,US,FL,HOMESTEAD,33032-8597,UTC-5,27505 SW 132nd AVE,116 -18,193000000000000232,193000000000100232,TOL3,TOL3,US,OH,PERRYSBURG,43551,UTC-5,"9240 Fremont Pike 43551-4210 - PERRYSBURG, OH - United States",173 -284,193000000000000233,193000000000100233,TPA1,TPA1,US,FL,Ruskin,33570,UTC-5,3350 Laurel Ridge Ave., -283,193000000000000234,193000000000100234,TPA2,TPA2,US,FL,Lakeland,33811,UTC-5,1760 County Line Rd,22 -124,193000000000000235,193000000000100235,TPA3,TPA3,US,FL,Auburndale,33823,UTC-5,676 C. Fred Jones Boulevard,146 -272,193000000000000236,193000000000100236,TUL1,TUL1,US,KS,Coffeyville,67337,UTC-6,2654 North Highway 169, -172,193000000000000237,193000000000100237,VGT2,VGT2,US,NV,LAS VEGAS,89115-2013,UTC-8,6401 Howdy Wells Ave,6 -228,193000000000000238,193000000000100238,VUBA,VUBA,US,PA,Scranton,18512,UTC-5,1000 Keystone Industrial Park, -227,193000000000000239,193000000000100239,VUGA,VUGA,US,PA,Pittston,18643,UTC-5,508 Delaware Avenue West, -82,193000000000000240,193000000000100240,WBW2,WBW2,US,PA,OLYPHANT,18447,UTC-5,1300 Corporate Way,119 -36,193000000000000241,193000000000100241,XAV3,XAV3,US,GA,PORT WENTWORTH,31407,UTC-5,"XAV3-120Crossgate Dr 31407-Port Wentworth, GA- United States",180 -37,193000000000000242,193000000000100242,XEW5,XEW5,US,NJ,Cinnaminson,08077-2015,UTC-5,995 Taylors Ln 08077-2015,163 -25,193000000000000243,193000000000100243,XIN5,XIN5,US,IN,Avon,46123-1700,UTC-5,8838 E COUNTY ROAD 100 S,182 -34,193000000000000244,193000000000100244,XLX1,XLX1,US,MD,HAGERSTOWN,21740,UTC-5,"1115 Wesel Blvd HAGERSTOWN,MD 21740,USA",160 -23,193000000000000245,193000000000100245,XLX6,XLX6,US,NC,PINEVILLE,28134,UTC-5,"12220 Carolina Logistics Drive PINEVILLE,NC 28134,USA",166 -63,193000000000000246,193000000000100246,XLX7,XLX7,US,CA,VICTORVILLE,92394,UTC-8,"18580 Gateway Dr,Victorville,CA 92394,USA",27 -26,193000000000000247,193000000000100247,XPB2,XPB2,US,FL,APOPKA,32712,UTC-5,"XPB2 - 4661 Apopka Logistics Pkwy 32712 - Apopka, FL - United States",165 -24,193000000000000248,193000000000100248,XRI3,XRI3,US,VA,Richmond,23234,UTC-5,"4949 Commerce Rd, Richmond, VA 23234",167 -213,193000000000000249,193000000000100249,XUSB,XUSB,US,TX,Fort Worth,76155,UTC-6,14900 Frye Rd., -226,193000000000000250,193000000000100250,XUSC,XUSC,US,PA,Carlisle,17013,UTC-5,40 Logistics Drive, -297,193000000000000251,193000000000100251,XUSD,XUSD,US,CA,Stockton,95206,UTC-8,1909 Zephyr St, -280,193000000000000252,193000000000100252,XUSE,XUSE,US,IN,Whitestown,46075,UTC-5,5100 S Indianapolis Rd, +246,193000000000000001,193000000000100001,ABE2,ABE2,US,PA,Breinigsville,18031,UTC-5,705 Boulder Drive, +245,193000000000000002,193000000000100002,ABE3,ABE3,US,PA,Breinigsville,18031,UTC-5,650 Boulder Drive, +142,193000000000000003,193000000000100003,ABE4,ABE4,US,PA,Easton,18045,UTC-5,1610 Van Buren Road,126 +239,193000000000000004,193000000000100004,ABE5,ABE5,US,PA,Harrisburg,17112,UTC-5,6455 Allentown Boulevard, +133,193000000000000005,193000000000100005,ABE8,ABE8,US,NJ,Florence,08518,UTC-5,401 Independence Road 08518-2200,39 +259,193000000000000253,193000000000100253,ABE8-309,ABE8-309,US,NJ,Florence,08518-2802,UTC-5,309 Cedar Lane, +260,193000000000000254,193000000000100254,ABE8-401,ABE8-401,US,NJ,Florence,08518,UTC-5,401 Independence Road, +107,193000000000000006,193000000000100006,ABQ2,ABQ2,US,NM,LOS LUNAS,87031,UTC-7,6251 Pioneer Trail NW,76 +104,193000000000000255,193000000000100255,ABQ2-UPS,ABQ2-UPS,US,AZ,GOODYEAR,85395,UTC-7,16601 W. SELLS DRIVE, +92,193000000000000007,193000000000100007,ACY2,ACY2,US,NJ,BURLINGTON,08016,UTC-5,1101 E PEARL ST,101 +149,193000000000000008,193000000000100008,AFW1,AFW1,US,TX,FORT WORTH,76131,UTC-6,1851 NE LOOP 820, +35,193000000000000009,193000000000100009,AFW5,AFW5,US,TX,BALCH SPRINGS,75180-1636,UTC-6,12374 LAKE JUNE RD,181 +156,193000000000000010,193000000000100010,AKR1,AKR1,US,OH,Canton,44705,UTC-5,4747 Rebar Ave NE,153 +182,193000000000000011,193000000000100011,ALB1,ALB1,US,NY,Castleton,12033-9634,UTC-5,1835 US Route 9,102 +137,193000000000000012,193000000000100012,AMA1,AMA1,US,TX,Amarillo,79108,UTC-6,8590 NE 24th Avenue,132 +2,193000000000000256,193000000000100256,ATL1,ATL1,US,GA,Atlanta,30349,UTC-5,"ATL1, 6055 S Fulton Pkwy, Atlanta, GA, 30349",200 +146,193000000000000257,193000000000100257,ATL1-WALMART,ATL1-WALMART,US,GA,Atlanta,30349,UTC-5,"6055 S Fulton Pkwy,", +39,193000000000000013,193000000000100013,ATL2N,ATL2N,US,GA,Carrollton,30117,UTC-5,3101 N. Highway 27,157 +155,193000000000000014,193000000000100014,ATL3,ATL3,US,GA,Pendergrass,30567,UTC-5,445 Valentine Industrial Parkway, +210,193000000000000015,193000000000100015,ATL6,ATL6,US,GA,East Point,30344,UTC-5,4200 North Commerce, +241,193000000000000016,193000000000100016,AVP1,AVP1,US,PA,Hazle Township,18202-9361,UTC-5,550 Oak Ridge Road,70 +240,193000000000000017,193000000000100017,AVP3,AVP3,US,PA,GOULDSBORO,18424-9492,UTC-5,298 1ST AVE, +72,193000000000000258,193000000000100258,AZA4,AZA4,US,,,,,,16 +297,193000000000000018,193000000000100018,BDL1,BDL1,US,CT,Windsor,06095,UTC-5,801 Day Hill Rd., +216,193000000000000019,193000000000100019,BFI1,BFI1,US,WA,Sumner,98390,UTC-8,1800 140th Avenue E., +215,193000000000000020,193000000000100020,BFI3,BFI3,US,WA,Dupont,98327-9607,UTC-8,2700 Center Drive,34 +214,193000000000000021,193000000000100021,BFI7,BFI7,US,WA,Sumner,98390,UTC-8,1901 140th Ave E, +19,193000000000000022,193000000000100022,BJC1,BJC1,US,CO,AURORA,80019,UTC-7,6300 N Powhaton Road,186 +229,193000000000000023,193000000000100023,BNA1,BNA1,US,TN,Lebanon,37090,UTC-6,14840 Central Pike Suite 190, +139,193000000000000024,193000000000100024,BNA2,BNA2,US,TN,Lebanon,37090,UTC-6,500 Duke DR,37 +148,193000000000000025,193000000000100025,BNA3,BNA3,US,TN,Murfreesboro,37127,UTC-6,2020 Joe B Jackson Pkwy, +228,193000000000000026,193000000000100026,BNA4,BNA4,US,TN,Nashville,37217,UTC-6,50 airways Blvd, +118,193000000000000027,193000000000100027,BNA6,BNA6,US,TN,CLARKSVILLE,37040-5502,UTC-6,3875 GUTHRIE HWY,99 +251,193000000000000028,193000000000100028,BOS1,BOS1,US,NH,Nashua,03063,UTC-5,10 State St., +201,193000000000000029,193000000000100029,BOS2,BOS2,US,MA,Drive Stoughton,02072,UTC-5,1000 Tech Centre, +200,193000000000000030,193000000000100030,BOS7,BOS7,US,MA,Fall River,02720,UTC-5,1180 Innovation Way,103 +250,193000000000000031,193000000000100031,BWI1,BWI1,US,VA,Sterling,20166-2058,UTC-5,45121 Global Plaza, +249,193000000000000032,193000000000100032,BWI2,BWI2,US,MD,Baltimore,21224,UTC-5,2010 Broening Hwy, +110,193000000000000033,193000000000100033,BWI4,BWI4,US,VA,CLEARBROOK,22624,UTC-5,165 Business Blvd,150 +233,193000000000000034,193000000000100034,CAE1,CAE1,US,SC,West Columbia,29172,UTC-5,4400 12TH STREET EXT, +64,193000000000000259,193000000000100259,CEG2,CEG2,US,,,,,,79 +231,193000000000000035,193000000000100035,CHA1,CHA1,US,TN,Chattanooga,37416,UTC-5,7200 Discovery Drive, +230,193000000000000036,193000000000100036,CHA2,CHA2,US,TN,Charleston,37310,UTC-5,225 Infinity Dr NW,66 +83,193000000000000037,193000000000100037,CHO1,CHO1,US,VA,FISHERSVILLE,22939,UTC-5,32 TRADER RD,120 +199,193000000000000038,193000000000100038,CLT2,CLT2,US,NC,Charlotte,28214-8082,UTC-5,10240 Old Dowd Rd,59 +122,193000000000000039,193000000000100039,CLT3,CLT3,US,NC,CONCORD,28027,UTC-5,6500 Davidson Hwy,104 +247,193000000000000260,193000000000100260,CMH1-11999,CMH1-11999,US,OH,Etna,43062-7793,UTC-5,11999 National Road SW, +248,193000000000000040,193000000000100040,CMH2,CMH2,US,OH,Groveport,43125-9016,UTC-5,6050 Gateway Court,123 +189,193000000000000041,193000000000100041,CMH3,CMH3,US,OH,Monroe,45050-1848,UTC-5,700 GATEWAY BLVD,32 +270,193000000000000042,193000000000100042,CVG1,CVG1,US,KY,Hebron,41048,UTC-5,1155 Worldwide Blvd, +269,193000000000000043,193000000000100043,CVG2,CVG2,US,KY,Hebron,41048,UTC-5,1600 Worldwide Blvd, +268,193000000000000044,193000000000100044,CVG3,CVG3,US,KY,Hebron,41048,UTC-5,3680 Langley Dr., +267,193000000000000045,193000000000100045,CVG5,CVG5,US,KY,Hebron,41048,UTC-5,2285 Litton Lane, +143,193000000000000046,193000000000100046,DCA6,DCA6,US,MD,BALTIMORE,21219,UTC-5,6001 Bethlehem Blvd,135 +131,193000000000000047,193000000000100047,DEN2,DEN2,US,CO,Aurora,80019,UTC-7,22205 East 19th Ave,107 +128,193000000000000048,193000000000100048,DEN8,DEN8,US,CO,Aurora,80018,UTC-7,21000 E 13th Ave,73 +197,193000000000000049,193000000000100049,DET1,DET1,US,MI,Livonia,48150-1543,UTC-5,39000 Amrhein Road,118 +190,193000000000000050,193000000000100050,DET2,DET2,US,MI,Shelby Township,48317-1318,UTC-5,50500 Mound Rd,136 +151,193000000000000051,193000000000100051,DFW5S,DFW5S,US,TX,Lancaster,75146,UTC-6,"2500 E Belt Line Rd,", +227,193000000000000052,193000000000100052,DFW6,DFW6,US,TX,Coppell,75019,UTC-6,940 W Bethel Road,105 +225,193000000000000053,193000000000100053,DFW8,DFW8,US,TX,DFW Airport,75261,UTC-6,2700 Regent Blvd, +264,193000000000000054,193000000000100054,EWR4,EWR4,US,NJ,Robbinsville,08691,UTC-5,50 New Canton Way, +263,193000000000000055,193000000000100055,EWR5,EWR5,US,NJ,Avenel,07001,UTC-5,301 Blair Rd., +262,193000000000000056,193000000000100056,EWR7,EWR7,US,NJ,Avenel,07001,UTC-5,301 Blair Rd., +261,193000000000000057,193000000000100057,EWR9,EWR9,US,NJ,Carteret,07008,UTC-5,8003 Industrial Parkway, +125,193000000000000058,193000000000100058,FAT2,FAT2,US,CA,VISALIA,93291-1882,UTC-8,3315 N KELSEYST,43 +55,193000000000000261,193000000000100261,FEDEX,FEDEX,US,,,92337,,10767,12 +184,193000000000000059,193000000000100059,FOE1,FOE1,US,KS,KANSAS CITY,66109-3665,UTC-6,9400 LEAVENWORTH RD,117 +220,193000000000000060,193000000000100060,FTW1,FTW1,US,TX,Dallas,75241,UTC-6,33333 Lyndon B Johnson FREEWAY,24 +219,193000000000000061,193000000000100061,FTW2,FTW2,US,TX,Coppell,75019,UTC-6,2701 West Bethel Road, +97,193000000000000062,193000000000100062,FTW3,FTW3,US,TX,Fort Worth,76177-2517,UTC-6,15201 Heritage Pkwy, +129,193000000000000063,193000000000100063,FTW5,FTW5,US,TX,Forney,75126,UTC-6,1475 AKRON WAY,48 +179,193000000000000064,193000000000100064,FWA4,FWA4,US,IN,FORT WAYNE,46809-9771,UTC-5,9798 Smith Road,58 +159,193000000000000065,193000000000100065,GEG2,GEG2,US,WA,SPOKANE,99216,UTC-8,18007 E Garland Ave,108 +75,193000000000000066,193000000000100066,GEU2,GEU2,US,AZ,Glendale,85307,UTC-7,15301 West Northern Avenue,97 +86,193000000000000067,193000000000100067,GEU3,GEU3,US,AZ,BUCKEYE,85396,UTC-7,18900 W McDowell Road,81 +76,193000000000000068,193000000000100068,GEU5,GEU5,US,AZ,GOODYEAR,85395,UTC-7,4660 North Cotton Lane,100 +172,193000000000000069,193000000000100069,GSO1,GSO1,US,NC,KERNERSVILLE,27284,UTC-5,1656 OLD GREENSBORO RD,131 +232,193000000000000070,193000000000100070,GSP1,GSP1,US,SC,Spartanburg,29303,UTC-5,402 John Dodd Rd,90 +196,193000000000000071,193000000000100071,GYR2,GYR2,US,AZ,GOODYEAR,85395-7672,UTC-7,17341 W MINNEZONA AVE,7 +195,193000000000000072,193000000000100072,GYR3,GYR3,US,AZ,PHOENIX,85043-2356,UTC-7,8181 W ROOSEVELT ST,8 +65,193000000000000262,193000000000100262,HEA2,HEA2,US,,,18031,,"650 BOULDER DR Suite A 18031-1536 - BREINIGSVILLE, PA - United States",77 +88,193000000000000073,193000000000100073,HGR6,HGR6,US,MD,HAGERSTOWN,21740-7301,UTC-5,55 West Oak Ridge Drive,130 +95,193000000000000074,193000000000100074,HIA1,HIA1,US,PA,MIDDLETOWN,17057,UTC-5,3327 E Harrisburg Pik,148 +52,193000000000000075,193000000000100075,HLI2,HLI2,US,CA,HOLLISTER,95023,UTC-8,600 Ernie Drive,137 +224,193000000000000076,193000000000100076,HOU1,HOU1,US,TX,Humble,77338,UTC-6,8120 Humble Westfield Rd, +223,193000000000000077,193000000000100077,HOU2,HOU2,US,TX,Houston,77038-2324,UTC-6,10550 Ella Blvd., +222,193000000000000078,193000000000100078,HOU3,HOU3,US,TX,Brookshire,77423,UTC-6,31555 Highway 90 E, +67,193000000000000263,193000000000100263,HOU7,HOU7,US,,,,,,63 +162,193000000000000079,193000000000100079,HOU8,HOU8,US,TX,FRESNO,77545,UTC-6,2303 Hurricane Lane,49 +150,193000000000000080,193000000000100080,HSV1,HSV1,US,AL,Madison,35756,UTC-6,7817 Greenbrier Road,80 +134,193000000000000081,193000000000100081,HSV2,HSV2,US,AL,MADISON,35756,UTC-6,28869 Fanning Dr NW, +163,193000000000000082,193000000000100082,IAH3,IAH3,US,TX,Houston,77032,UTC-6,15525 Milner Road,57 +70,193000000000000264,193000000000100264,IAK3,IAK3,US,,,,,,44 +11,193000000000000083,193000000000100083,IAZ1,IAZ1,US,AZ,GOODYEAR,85395-4515,UTC-7,"4660 N COTTON LN 85395-4515 - GOODYEAR, AZ - United States",179 +144,193000000000000084,193000000000100084,ICT2,ICT2,US,KS,PARK CITY,67219,UTC-6,7130 N BROADWAY AVE,109 +10,193000000000000085,193000000000100085,IGA3,IGA3,US,GA,MACON,31216-6427,UTC-5,"7001 Skipper Rd 31216-6427 MACON, GA - United States",197 +160,193000000000000086,193000000000100086,IGQ2,IGQ2,US,IL,University park,60484,UTC-6,23257 S. Central Avenue,110 +127,193000000000000087,193000000000100087,ILG1,ILG1,US,DE,NEW CASTLE,19720,UTC-5,780 S. DuPont Highway,35 +9,193000000000000265,193000000000100265,IMI1,IMI1,US,MI,LANSING,48917-8539,UTC-5,"6500 W Mt Hope Hwy 48917-8539 - LANSING, MI - United States",199 +18,193000000000000088,193000000000100088,IMO1,IMO1,US,MO,LIBERTY,64068-8933,UTC-6,2361 S Withers RD,178 +14,193000000000000089,193000000000100089,IMS1,IMS1,US,MS,OLIVE BRANCH,38654,UTC-6,IMS1-11505 Progress Way,38654-2510,OLIVE BRANCH,MS,US,189 +13,193000000000000090,193000000000100090,INC1,INC1,US,NC,FAYETTEVILLE,28303-2215,UTC-5,"6309 Bragg Blvd 28303-2215 - FAYETTEVILLE, NC - United States",190 +287,193000000000000266,193000000000100266,IND1-AMAZON,IND1-AMAZON,US,IN,Whitestown,46075,UTC-5,4255 Anson Blvd, +176,193000000000000267,193000000000100267,IND1-WALMART,IND1-WALMART,US,IN,Avon,46123,UTC-5,9590 AllPoints Pkwy, +96,193000000000000091,193000000000100091,IND2,IND2,US,IN,Plainfield,46168-7442,UTC-5,715 Airtech Pkwy,127 +286,193000000000000268,193000000000100268,IND2-AMAZON,IND2-AMAZON,US,IN,Plainfield,46168,UTC-5,715 Airtech Pkwy, +177,193000000000000269,193000000000100269,IND2-WALMART,IND2-WALMART,US,IN,Avon,46123,UTC-5,9360 AllPoints Pkwy, +6,193000000000000270,193000000000100270,IND3,IND3,US,IN,Mccordsville,46055,UTC-5,5756 Enterprise Dr,198 +147,193000000000000271,193000000000100271,IND3-亚马逊,IND3-亚马逊,US,IN,Pkwy Plainfield,46168,,"717 Airtech Pkwy Plainfield IN 46168,USA", +285,193000000000000272,193000000000100272,IND3-沃尔玛,IND3-沃尔玛,US,IN,Mccordsville,46055,UTC-5,"5756 Enterprise Dr, Mccordsville, IN 46055", +284,193000000000000092,193000000000100092,IND4,IND4,US,IN,Indianapolis,46231,UTC-5,710 S. Girls School Rd, +283,193000000000000093,193000000000100093,IND5,IND5,US,IN,Plainfield,46168,UTC-5,800 Perry Road,140 +282,193000000000000094,193000000000100094,IND6,IND6,US,IN,Jeffersonville,47130,UTC-5,1453 E 10th St, +181,193000000000000095,193000000000100095,IND9,IND9,US,IN,GREENWOOD,46143-7830,UTC-5,1151 S GRAHAM RD,17 +3,193000000000000273,193000000000100273,IPA1,IPA1,US,PA,OLYPHANT,18447-2140,UTC-5,1300 Corporate Way,194 +17,193000000000000096,193000000000100096,ITX3,ITX3,US,TX,AMARILLO,79108-7749,UTC-6,"ITX3-8590 NE 24th Ave,79108-7749,AMARILLO,TX,US",187 +30,193000000000000097,193000000000100097,IUSF,IUSF,US,TX,DALLAS,75241,UTC-6,3351 Balmorhea Dr,169 +77,193000000000000098,193000000000100098,IUSJ,IUSJ,US,CA,BEAUMONT,92223,UTC-8,36900 West 4th Street,98 +82,193000000000000099,193000000000100099,IUSP,IUSP,US,CA,"HESPERIA,",92344,UTC-8,8140 Caliente Rd,83 +91,193000000000000274,193000000000100274,IUSP-AWD,IUSP-AWD,US,CA,HESPERIA,92344,UTC-8,8140 Caliente Rd,83 +78,193000000000000100,193000000000100100,IUSQ,IUSQ,US,CA,REDLANDS,92374,UTC-8,2125 W San Bernardino Ave,95 +48,193000000000000101,193000000000100101,IUSR,IUSR,US,SC,COWPENS,29330,UTC-5,1120 Mt Olive Rd,158 +47,193000000000000102,193000000000100102,IUST,IUST,US,PA,GREENCASTLE,17225,UTC-5,"3PL AWD (Greencastle, PA, US) 15651 Greenmount RdGREENCASTLE, PA 17225 United States",149 +41,193000000000000103,193000000000100103,IUSW,IUSW,US,CA,Hesperia,92344,UTC-8,"8130 Caliente Rd 92344 - Hesperia, CA - United States",156 +29,193000000000000104,193000000000100104,IUTE,IUTE,US,AZ,GOODYEAR,85338,UTC-7,16155 W Elwood St,170 +16,193000000000000105,193000000000100105,IUTJ,IUTJ,US,CA,Fontana,92335,UTC-8,"9253 Dreamland Drive 92335 - Fontana, CA - United",177 +15,193000000000000106,193000000000100106,IUTL,IUTL,US,CA,Moreno Valley,92551,UTC-8,"24405 Krameria Ave 92551 - Moreno Valley, CA - United States",188 +12,193000000000000107,193000000000100107,IWA6,IWA6,US,WA,PASCO,99301-6161,UTC-8,"1202 S Road 40 E 99301-6161 - PASCO, WA - United States",191 +58,193000000000000275,193000000000100275,JAX3,JAX3,US,,,32210,,JAX3-32210,111 +289,193000000000000276,193000000000100276,JAX3-32210,JAX3-32210,US,FL,Jacksonville,32210-8686,UTC-5,13333 103rd Street,111 +175,193000000000000277,193000000000100277,JAX3-32221,JAX3-32221,US,FL,Jacksonville,32221,UTC-5,13333 103rd Street, +80,193000000000000108,193000000000100108,JOT1,JOT1,US,CA,SAN BERNARDINO,92408,UTC-8,1494 S WATERMAN AVE,93 +158,193000000000000109,193000000000100109,JVL1,JVL1,US,WI,BELOIT,53511,UTC-6,1255 Gateway Blvd,125 +186,193000000000000110,193000000000100110,KRB4,KRB4,US,CA,PERRIS,92571-9722,UTC-8,4501 PATTERSON AVE, +169,193000000000000111,193000000000100111,KY1,KY1,US,KY,Shepherdsville,40165,UTC-5,"120 Velocity Way.,",60 +108,193000000000000112,193000000000100112,LAN2,LAN2,US,MI,LANSING,48917,UTC-5,6500 W Mt Hope Hwy,96 +109,193000000000000278,193000000000100278,LAN2-48917,LAN2-48917,US,MI,LANSING,48917,UTC-5,6500 W Mt Hope Hwy, +255,193000000000000113,193000000000100113,LAS1,LAS1,US,NV,HENDERSON,89044,UTC-8,12300 Bermuda Road,5 +254,193000000000000114,193000000000100114,LAS2,LAS2,US,NV,Las Vegas,89030,UTC-8,"3837 Bay Lake Trail, Suite 111 North", +140,193000000000000115,193000000000100115,LAS6,LAS6,US,NV,Las Vegas,89115,UTC-8,4550 Nexus Way,50 +8,193000000000000279,193000000000100279,LAX1,LAX1,US,CA,Chino,91708,UTC-8,"6750 Kimball Avenue, Chino,CA 91708,USA",192 +185,193000000000000280,193000000000100280,LAX1-WALMART,LAX1-WALMART,US,CA,Chino,91708,UTC-8,6750 Kimball Avenue, +170,193000000000000116,193000000000100116,LAX2T,LAX2T,US,CA,CHINO,91708,UTC-8,6730 Kimball Ave,19 +188,193000000000000281,193000000000100281,LAX2T-WALMART,LAX2T-WALMART,US,CA,Chino,91708,UTC-8,6720 Kimball Ave, +191,193000000000000117,193000000000100117,LAX9,LAX9,US,CA,FONTANA,92337,UTC-8,11263 Oleander Ave,3 +94,193000000000000118,193000000000100118,LBE1,LBE1,US,PA,Greensburg,15605,UTC-5,165 Glen Fox Road,112 +93,193000000000000282,193000000000100282,LBE1-UPS,LBE1-UPS,US,PA,New Stanton,15672,UTC-5,165 GLENN FOX RD, +276,193000000000000119,193000000000100119,LEX1,LEX1,US,KY,Lexington,40511,UTC-5,1850 Mercer RD, +275,193000000000000120,193000000000100120,LEX2,LEX2,US,KY,Lexington,40511,UTC-5,172 Trade St., +115,193000000000000121,193000000000100121,LFT1,LFT1,US,LA,CARENCRO,70520-5976,UTC-6,3550 NE EVANGELINE TRWY,31 +299,193000000000000122,193000000000100122,LGB3,LGB3,US,CA,Eastvale,91752,UTC-8,4950 Goodman Way, +300,193000000000000123,193000000000100123,LGB4,LGB4,US,CA,Redlands,92374,UTC-8,27517 Pioneer Avenue,45 +301,193000000000000124,193000000000100124,LGB6,LGB6,US,CA,Riverside,92518-1513,UTC-8,20901 Krameria Ave,26 +302,193000000000000125,193000000000100125,LGB8,LGB8,US,CA,Rialto,92376,UTC-8,1568 N Linden Ave,2 +114,193000000000000126,193000000000100126,LIT2,LIT2,US,AR,NORTH LITTLE ROCK,72117,UTC-6,13001 HIGHWAY 70,159 +40,193000000000000127,193000000000100127,MCC1,MCC1,US,CA,RANCHO CORDOVA,95742,UTC-8,"3300 Rancho Cordova Pkwy 95742 - RANCHO CORDOVA, CA - United States",161 +165,193000000000000128,193000000000100128,MCE1,MCE1,US,CA,TURLOCK,95380,UTC-8,FULKERTH RD,65 +279,193000000000000129,193000000000100129,MCI1,MCI1,US,KS,Lenexa,66219,UTC-6,113th St & Renner Blvd., +20,193000000000000130,193000000000100130,MCI4,MCI4,US,MO,KANSAS CITY,64163,UTC-6,MCI4 - 10501 NW 136th Street,176 +116,193000000000000283,193000000000100283,MCO1-WALMART,MCO1-WALMART,US,FL,Davenport,33897,UTC-5,5100 NORTH RIDGE TRAIL, +123,193000000000000131,193000000000100131,MCO2,MCO2,US,FL,Deltona,32725-2610,UTC-5,2600 N Normandy Blvd,106 +238,193000000000000132,193000000000100132,MDT1,MDT1,US,PA,Carlisle,17015,UTC-5,2Ames Drive,121 +136,193000000000000133,193000000000100133,MDT4,MDT4,US,PA,York,17408,UTC-5,5125 Commerce Drive,144 +208,193000000000000134,193000000000100134,MDW2,MDW2,US,IL,Joliet,60433-3280,UTC-6,250 Emerald Drive,46 +119,193000000000000284,193000000000100284,MDW2-60433-3280,MDW2-60433-3280,US,IL,Joliet,60433-3280,UTC-6,250 Emerald Drive, +207,193000000000000135,193000000000100135,MDW6,MDW6,US,IL,ROMEOVILLE,60446-6529,UTC-6,1125 W REMINGTON BLVD ROMEOVILLE,143 +206,193000000000000136,193000000000100136,MDW7,MDW7,US,IL,Monee,60449,UTC-6,6605 Monee Manhattan Road, +205,193000000000000137,193000000000100137,MDW8,MDW8,US,IL,Waukegan,60085,UTC-6,1750 Bridge Drive, +204,193000000000000138,193000000000100138,MDW9,MDW9,US,IL,Aurora,60502,UTC-6,2865 Duke Parkway,36 +171,193000000000000139,193000000000100139,MEM1,MEM1,US,TN,Memphis,38118,UTC-6,3292 E Holmes Rd,85 +183,193000000000000285,193000000000100285,MEM1S-WALMART,MEM1S-WALMART,US,MS,OLIVE BRANCH,38654,UTC-6,9200 Alexander Road, +126,193000000000000140,193000000000100140,MEM6,MEM6,US,MS,OLIVE BRANCH,38654,UTC-6,11505 Progress Way,51 +209,193000000000000141,193000000000100141,MGE3,MGE3,US,GA,Jefferson,30549-2010,UTC-5,808 Hog Mountain Road,133 +174,193000000000000286,193000000000100286,MIA1-33054,MIA1-33054,US,FL,Opa-Locka,33054,UTC-5,14000 NW 37th Avenue, +290,193000000000000287,193000000000100287,MIA1-33182,MIA1-33182,US,FL,Miami,33182,UTC-5,1900 NW 132nd Place Doral, +85,193000000000000142,193000000000100142,MIT2,MIT2,US,CA,SHAFTER,93263,UTC-8,5408 Express Avenue,82 +278,193000000000000143,193000000000100143,MKC4,MKC4,US,KS,Edgerton,66021-9588,UTC-6,19645 Waverly Rd,67 +277,193000000000000144,193000000000100144,MKC6,MKC6,US,KS,Kansas City,66102,UTC-6,6925 Riverview Avenue, +211,193000000000000145,193000000000100145,MKE1,MKE1,US,WI,Kenosha,53144,UTC-6,3501 120th Ave, +102,193000000000000146,193000000000100146,MQJ1,MQJ1,US,IN,GREENFIELD,46140,UTC-5,4412 W 300 RD N,88 +7,193000000000000288,193000000000100288,MQY2,MQY2,US,TN,LEBANON,37090,UTC-6,"MQY2 - 1301 Richard Petty Way 37090 - LEBANON, TN - United States",193 +198,193000000000000147,193000000000100147,MSP1,MSP1,US,MN,Shakopee,55379,UTC-6,2601 4th Avenue East, +25,193000000000000148,193000000000100148,NJ3,NJ3,US,NJ,Pedricktown,08067,UTC-5,3 Sorbello Way,175 +87,193000000000000289,193000000000100289,NJ3-WALMART,NJ3-WALMART,US,NJ,Pedricktown,08067,UTC-5,3 Sorbello Way, +5,193000000000000290,193000000000100290,NJ3T,NJ3T,US,NJ,Pedricktown,08067,UTC-5,7 Sorbello Rd,195 +307,193000000000000149,193000000000100149,OAK3,OAK3,US,CA,Patterson,95363-8876,UTC-8,255 Park Center Drive,41 +308,193000000000000150,193000000000100150,OAK4,OAK4,US,CA,Tracy,95304-9370,UTC-8,1555 N. Chrisman Rd, +141,193000000000000151,193000000000100151,OKC2,OKC2,US,OK,OKLAHOMA CITY,73159,UTC-6,8991 S PORTLAND AVENUE,33 +27,193000000000000152,193000000000100152,OLM1,OLM1,US,WA,OLYMPIA,98516,UTC-8,"3300 HOGUM BAY RD NE 98516-3111 - OLYMPIA, WA - United States",172 +311,193000000000000153,193000000000100153,ONT2,ONT2,US,CA,San Bernardino,92408,UTC-8,1910 E Central Ave, +310,193000000000000154,193000000000100154,ONT6,ONT6,US,CA,Moreno Valley,92551-9561,UTC-8,24208 San Michele Rd, +309,193000000000000155,193000000000100155,ONT8,ONT8,US,CA,Moreno Valley,92551-9534,UTC-8,24300 Nandina Ave,1 +306,193000000000000156,193000000000100156,ONT9,ONT9,US,CA,Redlands,92374,UTC-8,2125 W. San Bernandino Ave,25 +99,193000000000000291,193000000000100291,ORD1S-WALMART,ORD1S-WALMART,US,IL,Joliet,60436,UTC-6,3501 Brandon Road, +111,193000000000000157,193000000000100157,ORD2,ORD2,US,IL,CHANNAHON,60410-8758,UTC-6,23714 W Amoco Rd,21 +203,193000000000000158,193000000000100158,ORD6,ORD6,US,IL,Wood Dale,60191,UTC-6,1250 N Mittel Blvd, +121,193000000000000159,193000000000100159,ORF2,ORF2,US,VA,CHESAPEAKE,23321-1425,UTC-5,ORF2 - 5045 PORTSMOUTH BLVD,38 +167,193000000000000292,193000000000100292,ORF2-FEDEX,ORF2-FEDEX,US,VA,CHESAPEAKE,23321-1425,UTC-5,ORF2 - 5045 PORTSMOUTH BLVD, +124,193000000000000293,193000000000100293,ORF2-UPS,ORF2-UPS,US,VA,Richmond,23297,UTC-5,9603 Coach Road, +89,193000000000000160,193000000000100160,PBI3,PBI3,US,FL,Jacksonville,32206,UTC-5,21 Jump Street,113 +135,193000000000000161,193000000000100161,PDX7,PDX7,US,OR,Salem,97317,UTC-8,4775 Depot Ct SE,68 +296,193000000000000162,193000000000100162,PHL1,PHL1,US,DE,New Castle,19720,UTC-5,1 Centerpoint Blvd., +295,193000000000000163,193000000000100163,PHL3,PHL3,US,DE,New Castle,19720,UTC-5,1600 Johnson Way, +244,193000000000000164,193000000000100164,PHL4,PHL4,US,PA,Carlisle,17015,UTC-5,21 Roadway Dr,52 +243,193000000000000165,193000000000100165,PHL5,PHL5,US,PA,Lewisberry,17339,UTC-5,500 McCarthy Dr, +28,193000000000000166,193000000000100166,PHL5S,PHL5S,US,PA,Greencastle,17225,UTC-5,"1915 Ebberts Spg Ct, Greencastle, PA 17225",171 +98,193000000000000294,193000000000100294,PHL5S-WALMART,PHL5S-WALMART,US,PA,Greencastle,17225,UTC-5,1915 Ebberts Spg Ct, +242,193000000000000167,193000000000100167,PHL6,PHL6,US,PA,Carlisle,17015,UTC-5,675 Allen Rd.,69 +294,193000000000000168,193000000000100168,PHL7,PHL7,US,DE,Middletown,19709,UTC-5,560 Merrimac Ave, +293,193000000000000169,193000000000100169,PHL8,PHL8,US,DE,Middletown,19709,UTC-5,727 N Broad St, +315,193000000000000170,193000000000100170,PHX3,PHX3,US,AZ,Phoenix,85043,UTC-7,6835 West Buckeye Road, +314,193000000000000171,193000000000100171,PHX5,PHX5,US,AZ,Goodyear,85338,UTC-7,16920 W Commerce Drive,72 +313,193000000000000172,193000000000100172,PHX6,PHX6,US,AZ,Phoenix,85043,UTC-7,4750 West Mohave St, +312,193000000000000173,193000000000100173,PHX7,PHX7,US,AZ,Phoenix,85043,UTC-7,800 N 75th Ave,74 +237,193000000000000174,193000000000100174,PIT1,PIT1,US,PA,Pittsburgh,15205,UTC-5,2250 Roswell Drive, +166,193000000000000175,193000000000100175,PIT2,PIT2,US,PA,IMPERIAL,15126-1002,UTC-5,1200 Westport Rd,78 +54,193000000000000176,193000000000100176,POC1,POC1,US,CA,FONTANA,92336-1123,UTC-8,4121 LYTLE CREEK RD,128 +46,193000000000000177,193000000000100177,POC2,POC2,US,CA,ONTARIO,91761,UTC-8,4000 South Hamner Avenue,151 +53,193000000000000178,193000000000100178,POC3,POC3,US,CA,JURUPA VALLEY,92509,UTC-8,6120 Clinker Drive,129 +57,193000000000000179,193000000000100179,PPO4,PPO4,US,IN,MERRILLVILLE,46410,UTC-6,9850 Mississippi Street,122 +101,193000000000000180,193000000000100180,PSC2,PSC2,US,WA,PASCO,99301,UTC-8,1351 S Road 40 E,75 +100,193000000000000295,193000000000100295,PSC2-UPS,PSC2-UPS,US,OR,Portland,97242,UTC-8,9930 NE Alderwood Rd, +36,193000000000000181,193000000000100181,PSP3,PSP3,US,CA,DESERT HOT SPRINGS,92240,UTC-8,64165 19th AVE,162 +79,193000000000000182,193000000000100182,QXY5,QXY5,US,CA,STOCKTON,95215,UTC-8,4532 NEWCASTLE RD,92 +43,193000000000000183,193000000000100183,QXY8,QXY8,US,CA,FRESNO,93725-1962,UTC-8,3611 S NORTHPOINTE DR,154 +22,193000000000000184,193000000000100184,QZZ7,QZZ7,US,AZ,MESA,85212-9608,UTC-7,8560 E ELLIOT RD,184 +154,193000000000000185,193000000000100185,RDU2,RDU2,US,NC,Smithfield,27577,UTC-5,2150 US HWY 70 Business West,56 +103,193000000000000186,193000000000100186,RDU4,RDU4,US,NC,FAYETTEVILLE,28303,UTC-5,6309 Bragg Blvd,145 +153,193000000000000187,193000000000100187,RFD2,RFD2,US,IL,Huntley,60142,UTC-6,11500 Freeman Road,71 +24,193000000000000188,193000000000100188,RFD4,RFD4,US,IL,HUNTLEY,60142,UTC-6,"11400 Venture Court 60142-8075 - HUNTLEY, IL - United States",174 +218,193000000000000189,193000000000100189,RIC1,RIC1,US,VA,Petersburg,23803,UTC-5,5000 Commerce Way,142 +217,193000000000000190,193000000000100190,RIC2,RIC2,US,VA,Chester,23836,UTC-5,1901 Meadowville Technology Pkwy, +152,193000000000000191,193000000000100191,RMN3,RMN3,US,VA,Fredericksburg,22406,UTC-5,220 Centreport Parkway,84 +256,193000000000000192,193000000000100192,RNO1,RNO1,US,NV,Fernley,89408,UTC-8,1600 East Newlands RD, +253,193000000000000193,193000000000100193,RNO2,RNO2,US,NV,Reno,85906,UTC-8,8000 North Virginia Street, +252,193000000000000194,193000000000100194,RNO4,RNO4,US,NV,Reno,89506,UTC-8,8000 North Virginia Street, +81,193000000000000195,193000000000100195,RYY2,RYY2,US,GA,White,30184,UTC-5,"1250 Cassville White Road,",94 +226,193000000000000196,193000000000100196,SAT1,SAT1,US,TX,Schertz,78154-1461,UTC-6,6000 Enterprise Avenue,23 +157,193000000000000197,193000000000100197,SAT4,SAT4,US,TX,SAN ANTONIO,78245,UTC-6,10384 W US HIGHWAY 90,61 +23,193000000000000198,193000000000100198,SAT6,SAT6,US,TX,SAN MARCOS,78666,UTC-6,"1346 Fortuna Road 78666-0001 - SAN MARCOS, TX - United States",183 +106,193000000000000199,193000000000100199,SAV3,SAV3,US,GA,Macon,31216-6427,UTC-5,7001 Skipper Rd,124 +193,193000000000000200,193000000000100200,SBD1,SBD1,US,CA,BLOOMINGTON,92316-3819,UTC-8,3388 S Cactus Ave,4 +187,193000000000000201,193000000000100201,SBD2,SBD2,US,CA,SAN BERNARDINO,92408-2805,UTC-8,1494 S WATERMAN AVE,15 +105,193000000000000202,193000000000100202,SCK1,SCK1,US,CA,STOCKTON,95215,UTC-8,4532 NEWCASTLE RD,20 +68,193000000000000203,193000000000100203,SCK3,SCK3,US,CA,MANTECA,95336,UTC-8,3565 N AIRPORT WAY MANTECA,54 +194,193000000000000204,193000000000100204,SCK4,SCK4,US,CA,STOCKTON,95215-8354,UTC-8,6001 S AUSTIN RD,10 +112,193000000000000205,193000000000100205,SCK8,SCK8,US,CA,OAKLEY,94561-2677,UTC-8,4700 WILBUR AVE,141 +274,193000000000000206,193000000000100206,SDF1,SDF1,US,KY,Campbellsville,42718,UTC-5,1050 South Columbia AVE, +273,193000000000000207,193000000000100207,SDF2,SDF2,US,KY,Watterson Park,40218,UTC-5,4360 Robards Ln, +272,193000000000000208,193000000000100208,SDF4,SDF4,US,KY,Shepherdsville,40165,UTC-5,376 Zappos.com Blvd, +271,193000000000000209,193000000000100209,SDF6,SDF6,US,KY,Shepherdsville,40165,UTC-5,271 Omega Pkwy, +266,193000000000000210,193000000000100210,SDF7,SDF7,US,KY,Shepherdsville,40165,UTC-5,300 Omicron Court, +281,193000000000000211,193000000000100211,SDF8,SDF8,US,IN,Jeffersonville,47130,UTC-5,900 Patrol Rd, +265,193000000000000212,193000000000100212,SDF9,SDF9,US,KY,Shepherdsville,40165,UTC-5,100 W. Thomas P. Echols Lane, +213,193000000000000213,193000000000100213,SEA6,SEA6,US,WA,South Seattle,98144,UTC-8,2646 Rainier Ave., +212,193000000000000214,193000000000100214,SEA8,SEA8,US,WA,Northeast Bellevue,98005,UTC-8,1475 124th Avenue, +303,193000000000000215,193000000000100215,SJC7,SJC7,US,CA,Tracy,95377-8906,UTC-8,188 Mountain House Parkway,30 +4,193000000000000296,193000000000100296,SLC1N,SLC1N,US,UT,Salt Lake City,84116,UTC-7,990 N 6550 W,196 +161,193000000000000216,193000000000100216,SLC2,SLC2,US,UT,West Jordan,84081,UTC-7,7148 W. Old Bingham Hwy,86 +21,193000000000000217,193000000000100217,SLC3,SLC3,US,UT,SALT LAKE CITY,84116-4413,UTC-7,355 N JOHN GLENN RD,185 +298,193000000000000297,193000000000100297,SMF1-AMAZON,SMF1-AMAZON,US,CA,Sacramento,95835-9505,UTC-8,4900 W Elkhorn Blvd, +173,193000000000000298,193000000000100298,SMF1-WALMART,SMF1-WALMART,US,CA,Sacramento,95837,UTC-8,7000 Powerline Rd, +192,193000000000000218,193000000000100218,SMF3,SMF3,US,CA,Stockton,95206-8202,UTC-8,3923 S B ST,9 +113,193000000000000219,193000000000100219,SMF6,SMF6,US,CA,SACRAMENTO,95837-9109,UTC-8,4930 ALLBAUGH DR,28 +69,193000000000000299,193000000000100299,SMF7,SMF7,US,,,,,,53 +304,193000000000000220,193000000000100220,SNA4,SNA4,US,CA,Rialto,92376-3009,UTC-8,2496 W Walnut Ave,18 +117,193000000000000221,193000000000100221,STL3,STL3,US,MO,REPUBLIC,65738-2779,UTC-6,3200 E SAWYER RD,152 +202,193000000000000222,193000000000100222,STL4,STL4,US,IL,Edwardsville,62025-2815,UTC-6,3050 GATEWAY COMMERCE CENTER DR S,115 +66,193000000000000300,193000000000100300,STL6,STL6,US,,,,,,64 +130,193000000000000223,193000000000100223,SWF1,SWF1,US,NY,ROCK TAVERN,12575,UTC-5,635 INTERNATIONAL BLVD,134 +84,193000000000000224,193000000000100224,SWF2,SWF2,US,NY,Hopewell Junction,12533,UTC-5,76 Patriot Way Hopewell Junction,62 +145,193000000000000301,193000000000100301,SWF2-10710,SWF2-10710,US,NY,Yonkers,10710,UTC-5,557 Tuckahoe Road, +168,193000000000000302,193000000000100302,SWF2-12533,SWF2-12533,US,NY,Hopewell Junction,12533-6159,UTC-5,76 Patriot Way, +49,193000000000000225,193000000000100225,TCY1,TCY1,US,CA,STOCKTON,95206,UTC-8,2690 East Arch Airport Road,139 +51,193000000000000226,193000000000100226,TCY2,TCY2,US,CA,STOCKTON,95215,UTC-8,6201 Newcastle Rd,138 +258,193000000000000227,193000000000100227,TEB3,TEB3,US,NJ,Logan Township,08085,UTC-5,2651 Oldmans Creek Rd,47 +138,193000000000000228,193000000000100228,TEB4,TEB4,US,NJ,PENNS GROVE,08069,UTC-5,747 COURSES LANDING RD,55 +257,193000000000000229,193000000000100229,TEB6,TEB6,US,NJ,Cranbury,08512,UTC-5,22 Hightstown Cranbury State Road,114 +164,193000000000000230,193000000000100230,TEB9,TEB9,US,NJ,Somerset,08873,UTC-5,601 Randolph Road,40 +73,193000000000000231,193000000000100231,TMB8,TMB8,US,FL,HOMESTEAD,33032-8597,UTC-5,27505 SW 132nd AVE,116 +74,193000000000000303,193000000000100303,TMB8-UPS,TMB8-UPS,US,FL,Miami Gardens,33055,UTC-5,8675309 Jenny Lane, +26,193000000000000232,193000000000100232,TOL3,TOL3,US,OH,PERRYSBURG,43551,UTC-5,"9240 Fremont Pike 43551-4210 - PERRYSBURG, OH - United States",173 +292,193000000000000233,193000000000100233,TPA1,TPA1,US,FL,Ruskin,33570,UTC-5,3350 Laurel Ridge Ave., +291,193000000000000234,193000000000100234,TPA2,TPA2,US,FL,Lakeland,33811,UTC-5,1760 County Line Rd,22 +132,193000000000000235,193000000000100235,TPA3,TPA3,US,FL,Auburndale,33823,UTC-5,676 C. Fred Jones Boulevard,146 +280,193000000000000236,193000000000100236,TUL1,TUL1,US,KS,Coffeyville,67337,UTC-6,2654 North Highway 169, +56,193000000000000304,193000000000100304,UPS,UPS,US,,,92337,,10767,11 +180,193000000000000237,193000000000100237,VGT2,VGT2,US,NV,LAS VEGAS,89115-2013,UTC-8,6401 Howdy Wells Ave,6 +120,193000000000000305,193000000000100305,VGT2-FEDEX,VGT2-FEDEX,US,NV,LAS VEGAS,89115-201,UTC-8,6401 Howdy Wells Ave, +178,193000000000000306,193000000000100306,VGT2-UPS,VGT2-UPS,US,CA,March Air Reserve Base,92518,UTC-8,20701 Krameria Ave, +236,193000000000000238,193000000000100238,VUBA,VUBA,US,PA,Scranton,18512,UTC-5,1000 Keystone Industrial Park, +235,193000000000000239,193000000000100239,VUGA,VUGA,US,PA,Pittston,18643,UTC-5,508 Delaware Avenue West, +90,193000000000000240,193000000000100240,WBW2,WBW2,US,PA,OLYPHANT,18447,UTC-5,1300 Corporate Way,119 +44,193000000000000241,193000000000100241,XAV3,XAV3,US,GA,PORT WENTWORTH,31407,UTC-5,"XAV3-120Crossgate Dr 31407-Port Wentworth, GA- United States",180 +61,193000000000000307,193000000000100307,XBN3,XBN3,US,,,,,,91 +63,193000000000000308,193000000000100308,XCH2,XCH2,US,,,,,,87 +45,193000000000000242,193000000000100242,XEW5,XEW5,US,NJ,Cinnaminson,08077-2015,UTC-5,995 Taylors Ln 08077-2015,163 +33,193000000000000243,193000000000100243,XIN5,XIN5,US,IN,Avon,46123-1700,UTC-5,8838 E COUNTY ROAD 100 S,182 +42,193000000000000244,193000000000100244,XLX1,XLX1,US,MD,HAGERSTOWN,21740,UTC-5,"1115 Wesel Blvd HAGERSTOWN,MD 21740,USA",160 +31,193000000000000245,193000000000100245,XLX6,XLX6,US,NC,PINEVILLE,28134,UTC-5,"12220 Carolina Logistics Drive PINEVILLE,NC 28134,USA",166 +71,193000000000000246,193000000000100246,XLX7,XLX7,US,CA,VICTORVILLE,92394,UTC-8,"18580 Gateway Dr,Victorville,CA 92394,USA",27 +62,193000000000000309,193000000000100309,XMI3,XMI3,US,,,,,,89 +34,193000000000000247,193000000000100247,XPB2,XPB2,US,FL,APOPKA,32712,UTC-5,"XPB2 - 4661 Apopka Logistics Pkwy 32712 - Apopka, FL - United States",165 +32,193000000000000248,193000000000100248,XRI3,XRI3,US,VA,Richmond,23234,UTC-5,"4949 Commerce Rd, Richmond, VA 23234",167 +221,193000000000000249,193000000000100249,XUSB,XUSB,US,TX,Fort Worth,76155,UTC-6,14900 Frye Rd., +234,193000000000000250,193000000000100250,XUSC,XUSC,US,PA,Carlisle,17013,UTC-5,40 Logistics Drive, +305,193000000000000251,193000000000100251,XUSD,XUSD,US,CA,Stockton,95206,UTC-8,1909 Zephyr St, +288,193000000000000252,193000000000100252,XUSE,XUSE,US,IN,Whitestown,46075,UTC-5,5100 S Indianapolis Rd, +60,193000000000000310,193000000000100310,洛杉矶仓一件代发,洛杉矶仓一件代发,US,CA,RANCHO CUCAMONGA,91730,UTC-8,10767 7TH STREET,CADF +50,193000000000000311,193000000000100311,海外仓打托,海外仓打托,US,,,91730,,91730,13 +59,193000000000000312,193000000000100312,私人仓,私人仓,US,,,私人仓,,私人仓,14 +38,193000000000000313,193000000000100313,纽约仓,纽约仓,US,NJ,New Jersey,08817,UTC-5,"13、14号门75 Carter Dr Edison,", +37,193000000000000314,193000000000100314,纽约仓一件代发,纽约仓一件代发,US,NJ,New Jersey,08817,UTC-5,"Door13-14,75 Carter Dr Edison,",NJDF diff --git a/warehouse/src/main/resources/db/master-data/fba-public-addresses.rejected.csv b/warehouse/src/main/resources/db/master-data/fba-public-addresses.rejected.csv index 8b7ab239a..1e3f5df45 100644 --- a/warehouse/src/main/resources/db/master-data/fba-public-addresses.rejected.csv +++ b/warehouse/src/main/resources/db/master-data/fba-public-addresses.rejected.csv @@ -1,55 +1 @@ source_row,warehouse_code,reject_reason,country_code,state_province,city,postal_code,timezone,address_line1,source_internal_id -29,纽约仓一件代发,invalid_fba_code|non_fba_business_node,US,NJ,New Jersey,08817,UTC-5,"Door13-14,75 Carter Dr Edison,",NJDF -30,纽约仓,invalid_fba_code|non_fba_business_node,US,NJ,New Jersey,08817,UTC-5,"13、14号门75 Carter Dr Edison,", -42,海外仓打托,missing_city|missing_state|invalid_fba_code|non_fba_business_node,US,,,91730,,91730,13 -47,FEDEX,missing_city|missing_state|non_fba_business_node,US,,,92337,,10767,12 -48,UPS,missing_city|missing_state|non_fba_business_node,US,,,92337,,10767,11 -50,JAX3,missing_city|missing_state,US,,,32210,,JAX3-32210,111 -51,私人仓,missing_city|missing_state|invalid_fba_code|non_fba_business_node,US,,,私人仓,,私人仓,14 -52,洛杉矶仓一件代发,invalid_fba_code|non_fba_business_node,US,CA,RANCHO CUCAMONGA,91730,UTC-8,10767 7TH STREET,CADF -53,XBN3,missing_city|missing_state|missing_address|missing_postal_code,US,,,,,,91 -54,XMI3,missing_city|missing_state|missing_address|missing_postal_code,US,,,,,,89 -55,XCH2,missing_city|missing_state|missing_address|missing_postal_code,US,,,,,,87 -56,CEG2,missing_city|missing_state|missing_address|missing_postal_code,US,,,,,,79 -57,HEA2,missing_city|missing_state,US,,,18031,,"650 BOULDER DR Suite A 18031-1536 - BREINIGSVILLE, PA - United States",77 -58,STL6,missing_city|missing_state|missing_address|missing_postal_code,US,,,,,,64 -59,HOU7,missing_city|missing_state|missing_address|missing_postal_code,US,,,,,,63 -61,SMF7,missing_city|missing_state|missing_address|missing_postal_code,US,,,,,,53 -62,IAK3,missing_city|missing_state|missing_address|missing_postal_code,US,,,,,,44 -64,AZA4,missing_city|missing_state|missing_address|missing_postal_code,US,,,,,,16 -66,TMB8-UPS,invalid_fba_code|non_fba_business_node,US,FL,Miami Gardens,33055,UTC-5,8675309 Jenny Lane, -79,NJ3-WALMART,invalid_fba_code|non_fba_business_node,US,NJ,Pedricktown,08067,UTC-5,3 Sorbello Way, -83,IUSP-AWD,invalid_fba_code,US,CA,HESPERIA,92344,UTC-8,8140 Caliente Rd,83 -85,LBE1-UPS,invalid_fba_code|non_fba_business_node,US,PA,New Stanton,15672,UTC-5,165 GLENN FOX RD, -90,PHL5S-WALMART,invalid_fba_code|non_fba_business_node,US,PA,Greencastle,17225,UTC-5,1915 Ebberts Spg Ct, -91,ORD1S-WALMART,invalid_fba_code|non_fba_business_node,US,IL,Joliet,60436,UTC-6,3501 Brandon Road, -92,PSC2-UPS,invalid_fba_code|non_fba_business_node,US,OR,Portland,97242,UTC-8,9930 NE Alderwood Rd, -96,ABQ2-UPS,invalid_fba_code|non_fba_business_node,US,AZ,GOODYEAR,85395,UTC-7,16601 W. SELLS DRIVE, -101,LAN2-48917,invalid_fba_code,US,MI,LANSING,48917,UTC-5,6500 W Mt Hope Hwy, -108,MCO1-WALMART,invalid_fba_code|non_fba_business_node,US,FL,Davenport,33897,UTC-5,5100 NORTH RIDGE TRAIL, -111,MDW2-60433-3280,invalid_fba_code,US,IL,Joliet,60433-3280,UTC-6,250 Emerald Drive, -112,VGT2-FEDEX,invalid_fba_code|non_fba_business_node,US,NV,LAS VEGAS,89115-201,UTC-8,6401 Howdy Wells Ave, -116,ORF2-UPS,invalid_fba_code|non_fba_business_node,US,VA,Richmond,23297,UTC-5,9603 Coach Road, -137,SWF2-10710,invalid_fba_code,US,NY,Yonkers,10710,UTC-5,557 Tuckahoe Road, -138,ATL1-WALMART,invalid_fba_code|non_fba_business_node,US,GA,Atlanta,30349,UTC-5,"6055 S Fulton Pkwy,", -139,IND3-亚马逊,invalid_fba_code|timezone_pending_confirmation,US,IN,Pkwy Plainfield,46168,,"717 Airtech Pkwy Plainfield IN 46168,USA", -159,ORF2-FEDEX,invalid_fba_code|non_fba_business_node,US,VA,CHESAPEAKE,23321-1425,UTC-5,ORF2 - 5045 PORTSMOUTH BLVD, -160,SWF2-12533,invalid_fba_code,US,NY,Hopewell Junction,12533-6159,UTC-5,76 Patriot Way, -165,SMF1-WALMART,invalid_fba_code|non_fba_business_node,US,CA,Sacramento,95837,UTC-8,7000 Powerline Rd, -166,MIA1-33054,invalid_fba_code,US,FL,Opa-Locka,33054,UTC-5,14000 NW 37th Avenue, -167,JAX3-32221,invalid_fba_code,US,FL,Jacksonville,32221,UTC-5,13333 103rd Street, -168,IND1-WALMART,invalid_fba_code|non_fba_business_node,US,IN,Avon,46123,UTC-5,9590 AllPoints Pkwy, -169,IND2-WALMART,invalid_fba_code|non_fba_business_node,US,IN,Avon,46123,UTC-5,9360 AllPoints Pkwy, -170,VGT2-UPS,invalid_fba_code|non_fba_business_node,US,CA,March Air Reserve Base,92518,UTC-8,20701 Krameria Ave, -175,MEM1S-WALMART,invalid_fba_code|non_fba_business_node,US,MS,OLIVE BRANCH,38654,UTC-6,9200 Alexander Road, -177,LAX1-WALMART,invalid_fba_code|non_fba_business_node,US,CA,Chino,91708,UTC-8,6750 Kimball Avenue, -180,LAX2T-WALMART,invalid_fba_code|non_fba_business_node,US,CA,Chino,91708,UTC-8,6720 Kimball Ave, -239,CMH1-11999,invalid_fba_code,US,OH,Etna,43062-7793,UTC-5,11999 National Road SW, -251,ABE8-309,invalid_fba_code,US,NJ,Florence,08518-2802,UTC-5,309 Cedar Lane, -252,ABE8-401,invalid_fba_code,US,NJ,Florence,08518,UTC-5,401 Independence Road, -277,IND3-沃尔玛,invalid_fba_code,US,IN,Mccordsville,46055,UTC-5,"5756 Enterprise Dr, Mccordsville, IN 46055", -278,IND2-AMAZON,invalid_fba_code,US,IN,Plainfield,46168,UTC-5,715 Airtech Pkwy, -279,IND1-AMAZON,invalid_fba_code,US,IN,Whitestown,46075,UTC-5,4255 Anson Blvd, -281,JAX3-32210,invalid_fba_code,US,FL,Jacksonville,32210-8686,UTC-5,13333 103rd Street,111 -282,MIA1-33182,invalid_fba_code,US,FL,Miami,33182,UTC-5,1900 NW 132nd Place Doral, -290,SMF1-AMAZON,invalid_fba_code,US,CA,Sacramento,95835-9505,UTC-8,4900 W Elkhorn Blvd, diff --git a/warehouse/src/main/resources/db/warehouse-public-master-data.md b/warehouse/src/main/resources/db/warehouse-public-master-data.md index 9bc06831e..8f694134e 100644 --- a/warehouse/src/main/resources/db/warehouse-public-master-data.md +++ b/warehouse/src/main/resources/db/warehouse-public-master-data.md @@ -11,13 +11,13 @@ ## 清洗规则 -- 读取 `C:\Users\BY-OY\Downloads\FBA地址表.xls`,原始文件只读。 +- 读取用户提供的 `FBA地址表.xls`,原始文件只读。 - 对核心字段去首尾空格。 -- FBA 编码转大写,接受 `^[A-Z0-9]{3,5}$`。 +- FBA 编码去首尾空格并转大写,全部保留,包括带渠道、邮编后缀和中文业务名称的编码。 - 邮编按文本保存,保留 `31216-6427` 这类后缀。 -- 城市、州、详细地址、邮编任一缺失则拒绝。 -- 带 `UPS`、`FEDEX`、`WALMART`、`一件代发`、`私人仓`、`纽约仓`、`洛杉矶仓`、`海外仓打托` 等非 FBA 业务节点语义的记录拒绝。 -- 多时区州必须按城市映射时区;无法可靠判断时列入拒绝清单的 `timezone_pending_confirmation`,不使用州级默认值。 +- 内部编号按文本保存,允许数字或字母,可为空、可重复;重复值代表来源表中的同组映射,不强制改写。 +- 城市、州、详细地址、邮编或时区缺失时保留空值,等待后续业务维护,不因此排除仓库。 +- `UPS`、`FEDEX`、`WALMART`、`一件代发`、`私人仓`、`纽约仓`、`洛杉矶仓`、`海外仓打托` 等来源记录全部保留。 - 数据库存储固定 UTC 偏移量(如 `UTC+8`、`UTC-8`),当前仅作为维护和展示字段使用。 ## 固定仓规则 @@ -38,8 +38,8 @@ ## 当前结果 -- Excel 数据行:306。 -- 接受:252。 -- 拒绝:54。 -- 时区待确认:1,且该行同时存在无效编码和异常城市文本。 +- Excel 数据行:314。 +- 接受:314。 +- 拒绝:0。 +- 其中 15 条缺城市或州,9 条缺详细地址或邮编,116 条缺内部编号;均按来源原值保留。 - 固定仓:4,分别为义乌、东莞、洛杉矶、纽约。 diff --git a/warehouse/src/main/resources/db/warehouse-public-master-data.sql b/warehouse/src/main/resources/db/warehouse-public-master-data.sql index e14c622a6..7751b86ca 100644 --- a/warehouse/src/main/resources/db/warehouse-public-master-data.sql +++ b/warehouse/src/main/resources/db/warehouse-public-master-data.sql @@ -2,8 +2,8 @@ SET NAMES utf8mb4; USE baiyue_warehouse; -- 正式平台公共仓库主数据:固定作业仓 + FBA 地址库。 --- 来源:C:\Users\BY-OY\Downloads\FBA地址表.xls,只读清洗后生成。 --- 接受 252 条,拒绝 54 条;拒绝清单见 master-data/fba-public-addresses.rejected.csv。 +-- 来源:用户提供的 FBA地址表.xls,只读整理后生成。 +-- 完整保留 314 条,拒绝 0 条;拒绝清单见 master-data/fba-public-addresses.rejected.csv。 -- 四个固定作业仓按通用占位地址写入;清单见 master-data/platform-fixed-warehouses.csv。 -- FBA 是目的地址主数据,不创建 RECEIVING、STORAGE、PICK_PACK、RETURN 等平台作业能力。 @@ -190,6 +190,7 @@ CREATE TEMPORARY TABLE tmp_wh_fba_public_master_data ( address_id_seed BIGINT UNSIGNED NOT NULL, warehouse_code VARCHAR(50) NOT NULL, warehouse_name VARCHAR(120) NOT NULL, + internal_code VARCHAR(16) NULL, state_province VARCHAR(100) NOT NULL, city VARCHAR(100) NOT NULL, postal_code VARCHAR(20) NOT NULL, @@ -202,281 +203,339 @@ CREATE TEMPORARY TABLE tmp_wh_fba_public_master_data ( ) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; INSERT INTO tmp_wh_fba_public_master_data - (warehouse_id_seed,address_id_seed,warehouse_code,warehouse_name,state_province,city,postal_code,timezone,address_line1,source_row) + (warehouse_id_seed,address_id_seed,warehouse_code,warehouse_name,internal_code,state_province,city,postal_code,timezone,address_line1,source_row) VALUES -(193000000000000001,193000000000100001,'ABE2','ABE2','PA','Breinigsville','18031','UTC-5','705 Boulder Drive',238), -(193000000000000002,193000000000100002,'ABE3','ABE3','PA','Breinigsville','18031','UTC-5','650 Boulder Drive',237), -(193000000000000003,193000000000100003,'ABE4','ABE4','PA','Easton','18045','UTC-5','1610 Van Buren Road',134), -(193000000000000004,193000000000100004,'ABE5','ABE5','PA','Harrisburg','17112','UTC-5','6455 Allentown Boulevard',231), -(193000000000000005,193000000000100005,'ABE8','ABE8','NJ','Florence','08518','UTC-5','401 Independence Road 08518-2200',125), -(193000000000000006,193000000000100006,'ABQ2','ABQ2','NM','LOS LUNAS','87031','UTC-7','6251 Pioneer Trail NW',99), -(193000000000000007,193000000000100007,'ACY2','ACY2','NJ','BURLINGTON','08016','UTC-5','1101 E PEARL ST',84), -(193000000000000008,193000000000100008,'AFW1','AFW1','TX','FORT WORTH','76131','UTC-6','1851 NE LOOP 820',141), -(193000000000000009,193000000000100009,'AFW5','AFW5','TX','BALCH SPRINGS','75180-1636','UTC-6','12374 LAKE JUNE RD',27), -(193000000000000010,193000000000100010,'AKR1','AKR1','OH','Canton','44705','UTC-5','4747 Rebar Ave NE',148), -(193000000000000011,193000000000100011,'ALB1','ALB1','NY','Castleton','12033-9634','UTC-5','1835 US Route 9',174), -(193000000000000012,193000000000100012,'AMA1','AMA1','TX','Amarillo','79108','UTC-6','8590 NE 24th Avenue',129), -(193000000000000013,193000000000100013,'ATL2N','ATL2N','GA','Carrollton','30117','UTC-5','3101 N. Highway 27',31), -(193000000000000014,193000000000100014,'ATL3','ATL3','GA','Pendergrass','30567','UTC-5','445 Valentine Industrial Parkway',147), -(193000000000000015,193000000000100015,'ATL6','ATL6','GA','East Point','30344','UTC-5','4200 North Commerce',202), -(193000000000000016,193000000000100016,'AVP1','AVP1','PA','Hazle Township','18202-9361','UTC-5','550 Oak Ridge Road',233), -(193000000000000017,193000000000100017,'AVP3','AVP3','PA','GOULDSBORO','18424-9492','UTC-5','298 1ST AVE',232), -(193000000000000018,193000000000100018,'BDL1','BDL1','CT','Windsor','06095','UTC-5','801 Day Hill Rd.',289), -(193000000000000019,193000000000100019,'BFI1','BFI1','WA','Sumner','98390','UTC-8','1800 140th Avenue E.',208), -(193000000000000020,193000000000100020,'BFI3','BFI3','WA','Dupont','98327-9607','UTC-8','2700 Center Drive',207), -(193000000000000021,193000000000100021,'BFI7','BFI7','WA','Sumner','98390','UTC-8','1901 140th Ave E',206), -(193000000000000022,193000000000100022,'BJC1','BJC1','CO','AURORA','80019','UTC-7','6300 N Powhaton Road',11), -(193000000000000023,193000000000100023,'BNA1','BNA1','TN','Lebanon','37090','UTC-6','14840 Central Pike Suite 190',221), -(193000000000000024,193000000000100024,'BNA2','BNA2','TN','Lebanon','37090','UTC-6','500 Duke DR',131), -(193000000000000025,193000000000100025,'BNA3','BNA3','TN','Murfreesboro','37127','UTC-6','2020 Joe B Jackson Pkwy',140), -(193000000000000026,193000000000100026,'BNA4','BNA4','TN','Nashville','37217','UTC-6','50 airways Blvd',220), -(193000000000000027,193000000000100027,'BNA6','BNA6','TN','CLARKSVILLE','37040-5502','UTC-6','3875 GUTHRIE HWY',110), -(193000000000000028,193000000000100028,'BOS1','BOS1','NH','Nashua','03063','UTC-5','10 State St.',243), -(193000000000000029,193000000000100029,'BOS2','BOS2','MA','Drive Stoughton','02072','UTC-5','1000 Tech Centre',193), -(193000000000000030,193000000000100030,'BOS7','BOS7','MA','Fall River','02720','UTC-5','1180 Innovation Way',192), -(193000000000000031,193000000000100031,'BWI1','BWI1','VA','Sterling','20166-2058','UTC-5','45121 Global Plaza',242), -(193000000000000032,193000000000100032,'BWI2','BWI2','MD','Baltimore','21224','UTC-5','2010 Broening Hwy',241), -(193000000000000033,193000000000100033,'BWI4','BWI4','VA','CLEARBROOK','22624','UTC-5','165 Business Blvd',102), -(193000000000000034,193000000000100034,'CAE1','CAE1','SC','West Columbia','29172','UTC-5','4400 12TH STREET EXT',225), -(193000000000000035,193000000000100035,'CHA1','CHA1','TN','Chattanooga','37416','UTC-5','7200 Discovery Drive',223), -(193000000000000036,193000000000100036,'CHA2','CHA2','TN','Charleston','37310','UTC-5','225 Infinity Dr NW',222), -(193000000000000037,193000000000100037,'CHO1','CHO1','VA','FISHERSVILLE','22939','UTC-5','32 TRADER RD',75), -(193000000000000038,193000000000100038,'CLT2','CLT2','NC','Charlotte','28214-8082','UTC-5','10240 Old Dowd Rd',191), -(193000000000000039,193000000000100039,'CLT3','CLT3','NC','CONCORD','28027','UTC-5','6500 Davidson Hwy',114), -(193000000000000040,193000000000100040,'CMH2','CMH2','OH','Groveport','43125-9016','UTC-5','6050 Gateway Court',240), -(193000000000000041,193000000000100041,'CMH3','CMH3','OH','Monroe','45050-1848','UTC-5','700 GATEWAY BLVD',181), -(193000000000000042,193000000000100042,'CVG1','CVG1','KY','Hebron','41048','UTC-5','1155 Worldwide Blvd',262), -(193000000000000043,193000000000100043,'CVG2','CVG2','KY','Hebron','41048','UTC-5','1600 Worldwide Blvd',261), -(193000000000000044,193000000000100044,'CVG3','CVG3','KY','Hebron','41048','UTC-5','3680 Langley Dr.',260), -(193000000000000045,193000000000100045,'CVG5','CVG5','KY','Hebron','41048','UTC-5','2285 Litton Lane',259), -(193000000000000046,193000000000100046,'DCA6','DCA6','MD','BALTIMORE','21219','UTC-5','6001 Bethlehem Blvd',135), -(193000000000000047,193000000000100047,'DEN2','DEN2','CO','Aurora','80019','UTC-7','22205 East 19th Ave',123), -(193000000000000048,193000000000100048,'DEN8','DEN8','CO','Aurora','80018','UTC-7','21000 E 13th Ave',120), -(193000000000000049,193000000000100049,'DET1','DET1','MI','Livonia','48150-1543','UTC-5','39000 Amrhein Road',189), -(193000000000000050,193000000000100050,'DET2','DET2','MI','Shelby Township','48317-1318','UTC-5','50500 Mound Rd',182), -(193000000000000051,193000000000100051,'DFW5S','DFW5S','TX','Lancaster','75146','UTC-6','2500 E Belt Line Rd,',143), -(193000000000000052,193000000000100052,'DFW6','DFW6','TX','Coppell','75019','UTC-6','940 W Bethel Road',219), -(193000000000000053,193000000000100053,'DFW8','DFW8','TX','DFW Airport','75261','UTC-6','2700 Regent Blvd',217), -(193000000000000054,193000000000100054,'EWR4','EWR4','NJ','Robbinsville','08691','UTC-5','50 New Canton Way',256), -(193000000000000055,193000000000100055,'EWR5','EWR5','NJ','Avenel','07001','UTC-5','301 Blair Rd.',255), -(193000000000000056,193000000000100056,'EWR7','EWR7','NJ','Avenel','07001','UTC-5','301 Blair Rd.',254), -(193000000000000057,193000000000100057,'EWR9','EWR9','NJ','Carteret','07008','UTC-5','8003 Industrial Parkway',253), -(193000000000000058,193000000000100058,'FAT2','FAT2','CA','VISALIA','93291-1882','UTC-8','3315 N KELSEYST',117), -(193000000000000059,193000000000100059,'FOE1','FOE1','KS','KANSAS CITY','66109-3665','UTC-6','9400 LEAVENWORTH RD',176), -(193000000000000060,193000000000100060,'FTW1','FTW1','TX','Dallas','75241','UTC-6','33333 Lyndon B Johnson FREEWAY',212), -(193000000000000061,193000000000100061,'FTW2','FTW2','TX','Coppell','75019','UTC-6','2701 West Bethel Road',211), -(193000000000000062,193000000000100062,'FTW3','FTW3','TX','Fort Worth','76177-2517','UTC-6','15201 Heritage Pkwy',89), -(193000000000000063,193000000000100063,'FTW5','FTW5','TX','Forney','75126','UTC-6','1475 AKRON WAY',121), -(193000000000000064,193000000000100064,'FWA4','FWA4','IN','FORT WAYNE','46809-9771','UTC-5','9798 Smith Road',171), -(193000000000000065,193000000000100065,'GEG2','GEG2','WA','SPOKANE','99216','UTC-8','18007 E Garland Ave',151), -(193000000000000066,193000000000100066,'GEU2','GEU2','AZ','Glendale','85307','UTC-7','15301 West Northern Avenue',67), -(193000000000000067,193000000000100067,'GEU3','GEU3','AZ','BUCKEYE','85396','UTC-7','18900 W McDowell Road',78), -(193000000000000068,193000000000100068,'GEU5','GEU5','AZ','GOODYEAR','85395','UTC-7','4660 North Cotton Lane',68), -(193000000000000069,193000000000100069,'GSO1','GSO1','NC','KERNERSVILLE','27284','UTC-5','1656 OLD GREENSBORO RD',164), -(193000000000000070,193000000000100070,'GSP1','GSP1','SC','Spartanburg','29303','UTC-5','402 John Dodd Rd',224), -(193000000000000071,193000000000100071,'GYR2','GYR2','AZ','GOODYEAR','85395-7672','UTC-7','17341 W MINNEZONA AVE',188), -(193000000000000072,193000000000100072,'GYR3','GYR3','AZ','PHOENIX','85043-2356','UTC-7','8181 W ROOSEVELT ST',187), -(193000000000000073,193000000000100073,'HGR6','HGR6','MD','HAGERSTOWN','21740-7301','UTC-5','55 West Oak Ridge Drive',80), -(193000000000000074,193000000000100074,'HIA1','HIA1','PA','MIDDLETOWN','17057','UTC-5','3327 E Harrisburg Pik',87), -(193000000000000075,193000000000100075,'HLI2','HLI2','CA','HOLLISTER','95023','UTC-8','600 Ernie Drive',44), -(193000000000000076,193000000000100076,'HOU1','HOU1','TX','Humble','77338','UTC-6','8120 Humble Westfield Rd',216), -(193000000000000077,193000000000100077,'HOU2','HOU2','TX','Houston','77038-2324','UTC-6','10550 Ella Blvd.',215), -(193000000000000078,193000000000100078,'HOU3','HOU3','TX','Brookshire','77423','UTC-6','31555 Highway 90 E',214), -(193000000000000079,193000000000100079,'HOU8','HOU8','TX','FRESNO','77545','UTC-6','2303 Hurricane Lane',154), -(193000000000000080,193000000000100080,'HSV1','HSV1','AL','Madison','35756','UTC-6','7817 Greenbrier Road',142), -(193000000000000081,193000000000100081,'HSV2','HSV2','AL','MADISON','35756','UTC-6','28869 Fanning Dr NW',126), -(193000000000000082,193000000000100082,'IAH3','IAH3','TX','Houston','77032','UTC-6','15525 Milner Road',155), -(193000000000000083,193000000000100083,'IAZ1','IAZ1','AZ','GOODYEAR','85395-4515','UTC-7','4660 N COTTON LN 85395-4515 - GOODYEAR, AZ - United States',3), -(193000000000000084,193000000000100084,'ICT2','ICT2','KS','PARK CITY','67219','UTC-6','7130 N BROADWAY AVE',136), -(193000000000000085,193000000000100085,'IGA3','IGA3','GA','MACON','31216-6427','UTC-5','7001 Skipper Rd 31216-6427 MACON, GA - United States',2), -(193000000000000086,193000000000100086,'IGQ2','IGQ2','IL','University park','60484','UTC-6','23257 S. Central Avenue',152), -(193000000000000087,193000000000100087,'ILG1','ILG1','DE','NEW CASTLE','19720','UTC-5','780 S. DuPont Highway',119), -(193000000000000088,193000000000100088,'IMO1','IMO1','MO','LIBERTY','64068-8933','UTC-6','2361 S Withers RD',10), -(193000000000000089,193000000000100089,'IMS1','IMS1','MS','OLIVE BRANCH','38654','UTC-6','IMS1-11505 Progress Way,38654-2510,OLIVE BRANCH,MS,US',6), -(193000000000000090,193000000000100090,'INC1','INC1','NC','FAYETTEVILLE','28303-2215','UTC-5','6309 Bragg Blvd 28303-2215 - FAYETTEVILLE, NC - United States',5), -(193000000000000091,193000000000100091,'IND2','IND2','IN','Plainfield','46168-7442','UTC-5','715 Airtech Pkwy',88), -(193000000000000092,193000000000100092,'IND4','IND4','IN','Indianapolis','46231','UTC-5','710 S. Girls School Rd',276), -(193000000000000093,193000000000100093,'IND5','IND5','IN','Plainfield','46168','UTC-5','800 Perry Road',275), -(193000000000000094,193000000000100094,'IND6','IND6','IN','Jeffersonville','47130','UTC-5','1453 E 10th St',274), -(193000000000000095,193000000000100095,'IND9','IND9','IN','GREENWOOD','46143-7830','UTC-5','1151 S GRAHAM RD',173), -(193000000000000096,193000000000100096,'ITX3','ITX3','TX','AMARILLO','79108-7749','UTC-6','ITX3-8590 NE 24th Ave,79108-7749,AMARILLO,TX,US',9), -(193000000000000097,193000000000100097,'IUSF','IUSF','TX','DALLAS','75241','UTC-6','3351 Balmorhea Dr',22), -(193000000000000098,193000000000100098,'IUSJ','IUSJ','CA','BEAUMONT','92223','UTC-8','36900 West 4th Street',69), -(193000000000000099,193000000000100099,'IUSP','IUSP','CA','HESPERIA,','92344','UTC-8','8140 Caliente Rd',74), -(193000000000000100,193000000000100100,'IUSQ','IUSQ','CA','REDLANDS','92374','UTC-8','2125 W San Bernardino Ave',70), -(193000000000000101,193000000000100101,'IUSR','IUSR','SC','COWPENS','29330','UTC-5','1120 Mt Olive Rd',40), -(193000000000000102,193000000000100102,'IUST','IUST','PA','GREENCASTLE','17225','UTC-5','3PL AWD (Greencastle, PA, US) 15651 Greenmount RdGREENCASTLE, PA 17225 United States',39), -(193000000000000103,193000000000100103,'IUSW','IUSW','CA','Hesperia','92344','UTC-8','8130 Caliente Rd 92344 - Hesperia, CA - United States',33), -(193000000000000104,193000000000100104,'IUTE','IUTE','AZ','GOODYEAR','85338','UTC-7','16155 W Elwood St',21), -(193000000000000105,193000000000100105,'IUTJ','IUTJ','CA','Fontana','92335','UTC-8','9253 Dreamland Drive 92335 - Fontana, CA - United',8), -(193000000000000106,193000000000100106,'IUTL','IUTL','CA','Moreno Valley','92551','UTC-8','24405 Krameria Ave 92551 - Moreno Valley, CA - United States',7), -(193000000000000107,193000000000100107,'IWA6','IWA6','WA','PASCO','99301-6161','UTC-8','1202 S Road 40 E 99301-6161 - PASCO, WA - United States',4), -(193000000000000108,193000000000100108,'JOT1','JOT1','CA','SAN BERNARDINO','92408','UTC-8','1494 S WATERMAN AVE',72), -(193000000000000109,193000000000100109,'JVL1','JVL1','WI','BELOIT','53511','UTC-6','1255 Gateway Blvd',150), -(193000000000000110,193000000000100110,'KRB4','KRB4','CA','PERRIS','92571-9722','UTC-8','4501 PATTERSON AVE',178), -(193000000000000111,193000000000100111,'KY1','KY1','KY','Shepherdsville','40165','UTC-5','120 Velocity Way.,',161), -(193000000000000112,193000000000100112,'LAN2','LAN2','MI','LANSING','48917','UTC-5','6500 W Mt Hope Hwy',100), -(193000000000000113,193000000000100113,'LAS1','LAS1','NV','HENDERSON','89044','UTC-8','12300 Bermuda Road',247), -(193000000000000114,193000000000100114,'LAS2','LAS2','NV','Las Vegas','89030','UTC-8','3837 Bay Lake Trail, Suite 111 North',246), -(193000000000000115,193000000000100115,'LAS6','LAS6','NV','Las Vegas','89115','UTC-8','4550 Nexus Way',132), -(193000000000000116,193000000000100116,'LAX2T','LAX2T','CA','CHINO','91708','UTC-8','6730 Kimball Ave',162), -(193000000000000117,193000000000100117,'LAX9','LAX9','CA','FONTANA','92337','UTC-8','11263 Oleander Ave',183), -(193000000000000118,193000000000100118,'LBE1','LBE1','PA','Greensburg','15605','UTC-5','165 Glen Fox Road',86), -(193000000000000119,193000000000100119,'LEX1','LEX1','KY','Lexington','40511','UTC-5','1850 Mercer RD',268), -(193000000000000120,193000000000100120,'LEX2','LEX2','KY','Lexington','40511','UTC-5','172 Trade St.',267), -(193000000000000121,193000000000100121,'LFT1','LFT1','LA','CARENCRO','70520-5976','UTC-6','3550 NE EVANGELINE TRWY',107), -(193000000000000122,193000000000100122,'LGB3','LGB3','CA','Eastvale','91752','UTC-8','4950 Goodman Way',291), -(193000000000000123,193000000000100123,'LGB4','LGB4','CA','Redlands','92374','UTC-8','27517 Pioneer Avenue',292), -(193000000000000124,193000000000100124,'LGB6','LGB6','CA','Riverside','92518-1513','UTC-8','20901 Krameria Ave',293), -(193000000000000125,193000000000100125,'LGB8','LGB8','CA','Rialto','92376','UTC-8','1568 N Linden Ave',294), -(193000000000000126,193000000000100126,'LIT2','LIT2','AR','NORTH LITTLE ROCK','72117','UTC-6','13001 HIGHWAY 70',106), -(193000000000000127,193000000000100127,'MCC1','MCC1','CA','RANCHO CORDOVA','95742','UTC-8','3300 Rancho Cordova Pkwy 95742 - RANCHO CORDOVA, CA - United States',32), -(193000000000000128,193000000000100128,'MCE1','MCE1','CA','TURLOCK','95380','UTC-8','FULKERTH RD',157), -(193000000000000129,193000000000100129,'MCI1','MCI1','KS','Lenexa','66219','UTC-6','113th St & Renner Blvd.',271), -(193000000000000130,193000000000100130,'MCI4','MCI4','MO','KANSAS CITY','64163','UTC-6','MCI4 - 10501 NW 136th Street',12), -(193000000000000131,193000000000100131,'MCO2','MCO2','FL','Deltona','32725-2610','UTC-5','2600 N Normandy Blvd',115), -(193000000000000132,193000000000100132,'MDT1','MDT1','PA','Carlisle','17015','UTC-5','2Ames Drive',230), -(193000000000000133,193000000000100133,'MDT4','MDT4','PA','York','17408','UTC-5','5125 Commerce Drive',128), -(193000000000000134,193000000000100134,'MDW2','MDW2','IL','Joliet','60433-3280','UTC-6','250 Emerald Drive',200), -(193000000000000135,193000000000100135,'MDW6','MDW6','IL','ROMEOVILLE','60446-6529','UTC-6','1125 W REMINGTON BLVD ROMEOVILLE',199), -(193000000000000136,193000000000100136,'MDW7','MDW7','IL','Monee','60449','UTC-6','6605 Monee Manhattan Road',198), -(193000000000000137,193000000000100137,'MDW8','MDW8','IL','Waukegan','60085','UTC-6','1750 Bridge Drive',197), -(193000000000000138,193000000000100138,'MDW9','MDW9','IL','Aurora','60502','UTC-6','2865 Duke Parkway',196), -(193000000000000139,193000000000100139,'MEM1','MEM1','TN','Memphis','38118','UTC-6','3292 E Holmes Rd',163), -(193000000000000140,193000000000100140,'MEM6','MEM6','MS','OLIVE BRANCH','38654','UTC-6','11505 Progress Way',118), -(193000000000000141,193000000000100141,'MGE3','MGE3','GA','Jefferson','30549-2010','UTC-5','808 Hog Mountain Road',201), -(193000000000000142,193000000000100142,'MIT2','MIT2','CA','SHAFTER','93263','UTC-8','5408 Express Avenue',77), -(193000000000000143,193000000000100143,'MKC4','MKC4','KS','Edgerton','66021-9588','UTC-6','19645 Waverly Rd',270), -(193000000000000144,193000000000100144,'MKC6','MKC6','KS','Kansas City','66102','UTC-6','6925 Riverview Avenue',269), -(193000000000000145,193000000000100145,'MKE1','MKE1','WI','Kenosha','53144','UTC-6','3501 120th Ave',203), -(193000000000000146,193000000000100146,'MQJ1','MQJ1','IN','GREENFIELD','46140','UTC-5','4412 W 300 RD N',94), -(193000000000000147,193000000000100147,'MSP1','MSP1','MN','Shakopee','55379','UTC-6','2601 4th Avenue East',190), -(193000000000000148,193000000000100148,'NJ3','NJ3','NJ','Pedricktown','08067','UTC-5','3 Sorbello Way',17), -(193000000000000149,193000000000100149,'OAK3','OAK3','CA','Patterson','95363-8876','UTC-8','255 Park Center Drive',299), -(193000000000000150,193000000000100150,'OAK4','OAK4','CA','Tracy','95304-9370','UTC-8','1555 N. Chrisman Rd',300), -(193000000000000151,193000000000100151,'OKC2','OKC2','OK','OKLAHOMA CITY','73159','UTC-6','8991 S PORTLAND AVENUE',133), -(193000000000000152,193000000000100152,'OLM1','OLM1','WA','OLYMPIA','98516','UTC-8','3300 HOGUM BAY RD NE 98516-3111 - OLYMPIA, WA - United States',19), -(193000000000000153,193000000000100153,'ONT2','ONT2','CA','San Bernardino','92408','UTC-8','1910 E Central Ave',303), -(193000000000000154,193000000000100154,'ONT6','ONT6','CA','Moreno Valley','92551-9561','UTC-8','24208 San Michele Rd',302), -(193000000000000155,193000000000100155,'ONT8','ONT8','CA','Moreno Valley','92551-9534','UTC-8','24300 Nandina Ave',301), -(193000000000000156,193000000000100156,'ONT9','ONT9','CA','Redlands','92374','UTC-8','2125 W. San Bernandino Ave',298), -(193000000000000157,193000000000100157,'ORD2','ORD2','IL','CHANNAHON','60410-8758','UTC-6','23714 W Amoco Rd',103), -(193000000000000158,193000000000100158,'ORD6','ORD6','IL','Wood Dale','60191','UTC-6','1250 N Mittel Blvd',195), -(193000000000000159,193000000000100159,'ORF2','ORF2','VA','CHESAPEAKE','23321-1425','UTC-5','ORF2 - 5045 PORTSMOUTH BLVD',113), -(193000000000000160,193000000000100160,'PBI3','PBI3','FL','Jacksonville','32206','UTC-5','21 Jump Street',81), -(193000000000000161,193000000000100161,'PDX7','PDX7','OR','Salem','97317','UTC-8','4775 Depot Ct SE',127), -(193000000000000162,193000000000100162,'PHL1','PHL1','DE','New Castle','19720','UTC-5','1 Centerpoint Blvd.',288), -(193000000000000163,193000000000100163,'PHL3','PHL3','DE','New Castle','19720','UTC-5','1600 Johnson Way',287), -(193000000000000164,193000000000100164,'PHL4','PHL4','PA','Carlisle','17015','UTC-5','21 Roadway Dr',236), -(193000000000000165,193000000000100165,'PHL5','PHL5','PA','Lewisberry','17339','UTC-5','500 McCarthy Dr',235), -(193000000000000166,193000000000100166,'PHL5S','PHL5S','PA','Greencastle','17225','UTC-5','1915 Ebberts Spg Ct, Greencastle, PA 17225',20), -(193000000000000167,193000000000100167,'PHL6','PHL6','PA','Carlisle','17015','UTC-5','675 Allen Rd.',234), -(193000000000000168,193000000000100168,'PHL7','PHL7','DE','Middletown','19709','UTC-5','560 Merrimac Ave',286), -(193000000000000169,193000000000100169,'PHL8','PHL8','DE','Middletown','19709','UTC-5','727 N Broad St',285), -(193000000000000170,193000000000100170,'PHX3','PHX3','AZ','Phoenix','85043','UTC-7','6835 West Buckeye Road',307), -(193000000000000171,193000000000100171,'PHX5','PHX5','AZ','Goodyear','85338','UTC-7','16920 W Commerce Drive',306), -(193000000000000172,193000000000100172,'PHX6','PHX6','AZ','Phoenix','85043','UTC-7','4750 West Mohave St',305), -(193000000000000173,193000000000100173,'PHX7','PHX7','AZ','Phoenix','85043','UTC-7','800 N 75th Ave',304), -(193000000000000174,193000000000100174,'PIT1','PIT1','PA','Pittsburgh','15205','UTC-5','2250 Roswell Drive',229), -(193000000000000175,193000000000100175,'PIT2','PIT2','PA','IMPERIAL','15126-1002','UTC-5','1200 Westport Rd',158), -(193000000000000176,193000000000100176,'POC1','POC1','CA','FONTANA','92336-1123','UTC-8','4121 LYTLE CREEK RD',46), -(193000000000000177,193000000000100177,'POC2','POC2','CA','ONTARIO','91761','UTC-8','4000 South Hamner Avenue',38), -(193000000000000178,193000000000100178,'POC3','POC3','CA','JURUPA VALLEY','92509','UTC-8','6120 Clinker Drive',45), -(193000000000000179,193000000000100179,'PPO4','PPO4','IN','MERRILLVILLE','46410','UTC-6','9850 Mississippi Street',49), -(193000000000000180,193000000000100180,'PSC2','PSC2','WA','PASCO','99301','UTC-8','1351 S Road 40 E',93), -(193000000000000181,193000000000100181,'PSP3','PSP3','CA','DESERT HOT SPRINGS','92240','UTC-8','64165 19th AVE',28), -(193000000000000182,193000000000100182,'QXY5','QXY5','CA','STOCKTON','95215','UTC-8','4532 NEWCASTLE RD',71), -(193000000000000183,193000000000100183,'QXY8','QXY8','CA','FRESNO','93725-1962','UTC-8','3611 S NORTHPOINTE DR',35), -(193000000000000184,193000000000100184,'QZZ7','QZZ7','AZ','MESA','85212-9608','UTC-7','8560 E ELLIOT RD',14), -(193000000000000185,193000000000100185,'RDU2','RDU2','NC','Smithfield','27577','UTC-5','2150 US HWY 70 Business West',146), -(193000000000000186,193000000000100186,'RDU4','RDU4','NC','FAYETTEVILLE','28303','UTC-5','6309 Bragg Blvd',95), -(193000000000000187,193000000000100187,'RFD2','RFD2','IL','Huntley','60142','UTC-6','11500 Freeman Road',145), -(193000000000000188,193000000000100188,'RFD4','RFD4','IL','HUNTLEY','60142','UTC-6','11400 Venture Court 60142-8075 - HUNTLEY, IL - United States',16), -(193000000000000189,193000000000100189,'RIC1','RIC1','VA','Petersburg','23803','UTC-5','5000 Commerce Way',210), -(193000000000000190,193000000000100190,'RIC2','RIC2','VA','Chester','23836','UTC-5','1901 Meadowville Technology Pkwy',209), -(193000000000000191,193000000000100191,'RMN3','RMN3','VA','Fredericksburg','22406','UTC-5','220 Centreport Parkway',144), -(193000000000000192,193000000000100192,'RNO1','RNO1','NV','Fernley','89408','UTC-8','1600 East Newlands RD',248), -(193000000000000193,193000000000100193,'RNO2','RNO2','NV','Reno','85906','UTC-8','8000 North Virginia Street',245), -(193000000000000194,193000000000100194,'RNO4','RNO4','NV','Reno','89506','UTC-8','8000 North Virginia Street',244), -(193000000000000195,193000000000100195,'RYY2','RYY2','GA','White','30184','UTC-5','1250 Cassville White Road,',73), -(193000000000000196,193000000000100196,'SAT1','SAT1','TX','Schertz','78154-1461','UTC-6','6000 Enterprise Avenue',218), -(193000000000000197,193000000000100197,'SAT4','SAT4','TX','SAN ANTONIO','78245','UTC-6','10384 W US HIGHWAY 90',149), -(193000000000000198,193000000000100198,'SAT6','SAT6','TX','SAN MARCOS','78666','UTC-6','1346 Fortuna Road 78666-0001 - SAN MARCOS, TX - United States',15), -(193000000000000199,193000000000100199,'SAV3','SAV3','GA','Macon','31216-6427','UTC-5','7001 Skipper Rd',98), -(193000000000000200,193000000000100200,'SBD1','SBD1','CA','BLOOMINGTON','92316-3819','UTC-8','3388 S Cactus Ave',185), -(193000000000000201,193000000000100201,'SBD2','SBD2','CA','SAN BERNARDINO','92408-2805','UTC-8','1494 S WATERMAN AVE',179), -(193000000000000202,193000000000100202,'SCK1','SCK1','CA','STOCKTON','95215','UTC-8','4532 NEWCASTLE RD',97), -(193000000000000203,193000000000100203,'SCK3','SCK3','CA','MANTECA','95336','UTC-8','3565 N AIRPORT WAY MANTECA',60), -(193000000000000204,193000000000100204,'SCK4','SCK4','CA','STOCKTON','95215-8354','UTC-8','6001 S AUSTIN RD',186), -(193000000000000205,193000000000100205,'SCK8','SCK8','CA','OAKLEY','94561-2677','UTC-8','4700 WILBUR AVE',104), -(193000000000000206,193000000000100206,'SDF1','SDF1','KY','Campbellsville','42718','UTC-5','1050 South Columbia AVE',266), -(193000000000000207,193000000000100207,'SDF2','SDF2','KY','Watterson Park','40218','UTC-5','4360 Robards Ln',265), -(193000000000000208,193000000000100208,'SDF4','SDF4','KY','Shepherdsville','40165','UTC-5','376 Zappos.com Blvd',264), -(193000000000000209,193000000000100209,'SDF6','SDF6','KY','Shepherdsville','40165','UTC-5','271 Omega Pkwy',263), -(193000000000000210,193000000000100210,'SDF7','SDF7','KY','Shepherdsville','40165','UTC-5','300 Omicron Court',258), -(193000000000000211,193000000000100211,'SDF8','SDF8','IN','Jeffersonville','47130','UTC-5','900 Patrol Rd',273), -(193000000000000212,193000000000100212,'SDF9','SDF9','KY','Shepherdsville','40165','UTC-5','100 W. Thomas P. Echols Lane',257), -(193000000000000213,193000000000100213,'SEA6','SEA6','WA','South Seattle','98144','UTC-8','2646 Rainier Ave.',205), -(193000000000000214,193000000000100214,'SEA8','SEA8','WA','Northeast Bellevue','98005','UTC-8','1475 124th Avenue',204), -(193000000000000215,193000000000100215,'SJC7','SJC7','CA','Tracy','95377-8906','UTC-8','188 Mountain House Parkway',295), -(193000000000000216,193000000000100216,'SLC2','SLC2','UT','West Jordan','84081','UTC-7','7148 W. Old Bingham Hwy',153), -(193000000000000217,193000000000100217,'SLC3','SLC3','UT','SALT LAKE CITY','84116-4413','UTC-7','355 N JOHN GLENN RD',13), -(193000000000000218,193000000000100218,'SMF3','SMF3','CA','Stockton','95206-8202','UTC-8','3923 S B ST',184), -(193000000000000219,193000000000100219,'SMF6','SMF6','CA','SACRAMENTO','95837-9109','UTC-8','4930 ALLBAUGH DR',105), -(193000000000000220,193000000000100220,'SNA4','SNA4','CA','Rialto','92376-3009','UTC-8','2496 W Walnut Ave',296), -(193000000000000221,193000000000100221,'STL3','STL3','MO','REPUBLIC','65738-2779','UTC-6','3200 E SAWYER RD',109), -(193000000000000222,193000000000100222,'STL4','STL4','IL','Edwardsville','62025-2815','UTC-6','3050 GATEWAY COMMERCE CENTER DR S',194), -(193000000000000223,193000000000100223,'SWF1','SWF1','NY','ROCK TAVERN','12575','UTC-5','635 INTERNATIONAL BLVD',122), -(193000000000000224,193000000000100224,'SWF2','SWF2','NY','Hopewell Junction','12533','UTC-5','76 Patriot Way Hopewell Junction',76), -(193000000000000225,193000000000100225,'TCY1','TCY1','CA','STOCKTON','95206','UTC-8','2690 East Arch Airport Road',41), -(193000000000000226,193000000000100226,'TCY2','TCY2','CA','STOCKTON','95215','UTC-8','6201 Newcastle Rd',43), -(193000000000000227,193000000000100227,'TEB3','TEB3','NJ','Logan Township','08085','UTC-5','2651 Oldmans Creek Rd',250), -(193000000000000228,193000000000100228,'TEB4','TEB4','NJ','PENNS GROVE','08069','UTC-5','747 COURSES LANDING RD',130), -(193000000000000229,193000000000100229,'TEB6','TEB6','NJ','Cranbury','08512','UTC-5','22 Hightstown Cranbury State Road',249), -(193000000000000230,193000000000100230,'TEB9','TEB9','NJ','Somerset','08873','UTC-5','601 Randolph Road',156), -(193000000000000231,193000000000100231,'TMB8','TMB8','FL','HOMESTEAD','33032-8597','UTC-5','27505 SW 132nd AVE',65), -(193000000000000232,193000000000100232,'TOL3','TOL3','OH','PERRYSBURG','43551','UTC-5','9240 Fremont Pike 43551-4210 - PERRYSBURG, OH - United States',18), -(193000000000000233,193000000000100233,'TPA1','TPA1','FL','Ruskin','33570','UTC-5','3350 Laurel Ridge Ave.',284), -(193000000000000234,193000000000100234,'TPA2','TPA2','FL','Lakeland','33811','UTC-5','1760 County Line Rd',283), -(193000000000000235,193000000000100235,'TPA3','TPA3','FL','Auburndale','33823','UTC-5','676 C. Fred Jones Boulevard',124), -(193000000000000236,193000000000100236,'TUL1','TUL1','KS','Coffeyville','67337','UTC-6','2654 North Highway 169',272), -(193000000000000237,193000000000100237,'VGT2','VGT2','NV','LAS VEGAS','89115-2013','UTC-8','6401 Howdy Wells Ave',172), -(193000000000000238,193000000000100238,'VUBA','VUBA','PA','Scranton','18512','UTC-5','1000 Keystone Industrial Park',228), -(193000000000000239,193000000000100239,'VUGA','VUGA','PA','Pittston','18643','UTC-5','508 Delaware Avenue West',227), -(193000000000000240,193000000000100240,'WBW2','WBW2','PA','OLYPHANT','18447','UTC-5','1300 Corporate Way',82), -(193000000000000241,193000000000100241,'XAV3','XAV3','GA','PORT WENTWORTH','31407','UTC-5','XAV3-120Crossgate Dr 31407-Port Wentworth, GA- United States',36), -(193000000000000242,193000000000100242,'XEW5','XEW5','NJ','Cinnaminson','08077-2015','UTC-5','995 Taylors Ln 08077-2015',37), -(193000000000000243,193000000000100243,'XIN5','XIN5','IN','Avon','46123-1700','UTC-5','8838 E COUNTY ROAD 100 S',25), -(193000000000000244,193000000000100244,'XLX1','XLX1','MD','HAGERSTOWN','21740','UTC-5','1115 Wesel Blvd HAGERSTOWN,MD 21740,USA',34), -(193000000000000245,193000000000100245,'XLX6','XLX6','NC','PINEVILLE','28134','UTC-5','12220 Carolina Logistics Drive PINEVILLE,NC 28134,USA',23), -(193000000000000246,193000000000100246,'XLX7','XLX7','CA','VICTORVILLE','92394','UTC-8','18580 Gateway Dr,Victorville,CA 92394,USA',63), -(193000000000000247,193000000000100247,'XPB2','XPB2','FL','APOPKA','32712','UTC-5','XPB2 - 4661 Apopka Logistics Pkwy 32712 - Apopka, FL - United States',26), -(193000000000000248,193000000000100248,'XRI3','XRI3','VA','Richmond','23234','UTC-5','4949 Commerce Rd, Richmond, VA 23234',24), -(193000000000000249,193000000000100249,'XUSB','XUSB','TX','Fort Worth','76155','UTC-6','14900 Frye Rd.',213), -(193000000000000250,193000000000100250,'XUSC','XUSC','PA','Carlisle','17013','UTC-5','40 Logistics Drive',226), -(193000000000000251,193000000000100251,'XUSD','XUSD','CA','Stockton','95206','UTC-8','1909 Zephyr St',297), -(193000000000000252,193000000000100252,'XUSE','XUSE','IN','Whitestown','46075','UTC-5','5100 S Indianapolis Rd',280); +(193000000000000001,193000000000100001,'ABE2','ABE2',NULL,'PA','Breinigsville','18031','UTC-5','705 Boulder Drive',246), +(193000000000000002,193000000000100002,'ABE3','ABE3',NULL,'PA','Breinigsville','18031','UTC-5','650 Boulder Drive',245), +(193000000000000003,193000000000100003,'ABE4','ABE4','126','PA','Easton','18045','UTC-5','1610 Van Buren Road',142), +(193000000000000004,193000000000100004,'ABE5','ABE5',NULL,'PA','Harrisburg','17112','UTC-5','6455 Allentown Boulevard',239), +(193000000000000005,193000000000100005,'ABE8','ABE8','39','NJ','Florence','08518','UTC-5','401 Independence Road 08518-2200',133), +(193000000000000253,193000000000100253,'ABE8-309','ABE8-309',NULL,'NJ','Florence','08518-2802','UTC-5','309 Cedar Lane',259), +(193000000000000254,193000000000100254,'ABE8-401','ABE8-401',NULL,'NJ','Florence','08518','UTC-5','401 Independence Road',260), +(193000000000000006,193000000000100006,'ABQ2','ABQ2','76','NM','LOS LUNAS','87031','UTC-7','6251 Pioneer Trail NW',107), +(193000000000000255,193000000000100255,'ABQ2-UPS','ABQ2-UPS',NULL,'AZ','GOODYEAR','85395','UTC-7','16601 W. SELLS DRIVE',104), +(193000000000000007,193000000000100007,'ACY2','ACY2','101','NJ','BURLINGTON','08016','UTC-5','1101 E PEARL ST',92), +(193000000000000008,193000000000100008,'AFW1','AFW1',NULL,'TX','FORT WORTH','76131','UTC-6','1851 NE LOOP 820',149), +(193000000000000009,193000000000100009,'AFW5','AFW5','181','TX','BALCH SPRINGS','75180-1636','UTC-6','12374 LAKE JUNE RD',35), +(193000000000000010,193000000000100010,'AKR1','AKR1','153','OH','Canton','44705','UTC-5','4747 Rebar Ave NE',156), +(193000000000000011,193000000000100011,'ALB1','ALB1','102','NY','Castleton','12033-9634','UTC-5','1835 US Route 9',182), +(193000000000000012,193000000000100012,'AMA1','AMA1','132','TX','Amarillo','79108','UTC-6','8590 NE 24th Avenue',137), +(193000000000000256,193000000000100256,'ATL1','ATL1','200','GA','Atlanta','30349','UTC-5','ATL1, 6055 S Fulton Pkwy, Atlanta, GA, 30349',2), +(193000000000000257,193000000000100257,'ATL1-WALMART','ATL1-WALMART',NULL,'GA','Atlanta','30349','UTC-5','6055 S Fulton Pkwy,',146), +(193000000000000013,193000000000100013,'ATL2N','ATL2N','157','GA','Carrollton','30117','UTC-5','3101 N. Highway 27',39), +(193000000000000014,193000000000100014,'ATL3','ATL3',NULL,'GA','Pendergrass','30567','UTC-5','445 Valentine Industrial Parkway',155), +(193000000000000015,193000000000100015,'ATL6','ATL6',NULL,'GA','East Point','30344','UTC-5','4200 North Commerce',210), +(193000000000000016,193000000000100016,'AVP1','AVP1','70','PA','Hazle Township','18202-9361','UTC-5','550 Oak Ridge Road',241), +(193000000000000017,193000000000100017,'AVP3','AVP3',NULL,'PA','GOULDSBORO','18424-9492','UTC-5','298 1ST AVE',240), +(193000000000000258,193000000000100258,'AZA4','AZA4','16','','','','','',72), +(193000000000000018,193000000000100018,'BDL1','BDL1',NULL,'CT','Windsor','06095','UTC-5','801 Day Hill Rd.',297), +(193000000000000019,193000000000100019,'BFI1','BFI1',NULL,'WA','Sumner','98390','UTC-8','1800 140th Avenue E.',216), +(193000000000000020,193000000000100020,'BFI3','BFI3','34','WA','Dupont','98327-9607','UTC-8','2700 Center Drive',215), +(193000000000000021,193000000000100021,'BFI7','BFI7',NULL,'WA','Sumner','98390','UTC-8','1901 140th Ave E',214), +(193000000000000022,193000000000100022,'BJC1','BJC1','186','CO','AURORA','80019','UTC-7','6300 N Powhaton Road',19), +(193000000000000023,193000000000100023,'BNA1','BNA1',NULL,'TN','Lebanon','37090','UTC-6','14840 Central Pike Suite 190',229), +(193000000000000024,193000000000100024,'BNA2','BNA2','37','TN','Lebanon','37090','UTC-6','500 Duke DR',139), +(193000000000000025,193000000000100025,'BNA3','BNA3',NULL,'TN','Murfreesboro','37127','UTC-6','2020 Joe B Jackson Pkwy',148), +(193000000000000026,193000000000100026,'BNA4','BNA4',NULL,'TN','Nashville','37217','UTC-6','50 airways Blvd',228), +(193000000000000027,193000000000100027,'BNA6','BNA6','99','TN','CLARKSVILLE','37040-5502','UTC-6','3875 GUTHRIE HWY',118), +(193000000000000028,193000000000100028,'BOS1','BOS1',NULL,'NH','Nashua','03063','UTC-5','10 State St.',251), +(193000000000000029,193000000000100029,'BOS2','BOS2',NULL,'MA','Drive Stoughton','02072','UTC-5','1000 Tech Centre',201), +(193000000000000030,193000000000100030,'BOS7','BOS7','103','MA','Fall River','02720','UTC-5','1180 Innovation Way',200), +(193000000000000031,193000000000100031,'BWI1','BWI1',NULL,'VA','Sterling','20166-2058','UTC-5','45121 Global Plaza',250), +(193000000000000032,193000000000100032,'BWI2','BWI2',NULL,'MD','Baltimore','21224','UTC-5','2010 Broening Hwy',249), +(193000000000000033,193000000000100033,'BWI4','BWI4','150','VA','CLEARBROOK','22624','UTC-5','165 Business Blvd',110), +(193000000000000034,193000000000100034,'CAE1','CAE1',NULL,'SC','West Columbia','29172','UTC-5','4400 12TH STREET EXT',233), +(193000000000000259,193000000000100259,'CEG2','CEG2','79','','','','','',64), +(193000000000000035,193000000000100035,'CHA1','CHA1',NULL,'TN','Chattanooga','37416','UTC-5','7200 Discovery Drive',231), +(193000000000000036,193000000000100036,'CHA2','CHA2','66','TN','Charleston','37310','UTC-5','225 Infinity Dr NW',230), +(193000000000000037,193000000000100037,'CHO1','CHO1','120','VA','FISHERSVILLE','22939','UTC-5','32 TRADER RD',83), +(193000000000000038,193000000000100038,'CLT2','CLT2','59','NC','Charlotte','28214-8082','UTC-5','10240 Old Dowd Rd',199), +(193000000000000039,193000000000100039,'CLT3','CLT3','104','NC','CONCORD','28027','UTC-5','6500 Davidson Hwy',122), +(193000000000000260,193000000000100260,'CMH1-11999','CMH1-11999',NULL,'OH','Etna','43062-7793','UTC-5','11999 National Road SW',247), +(193000000000000040,193000000000100040,'CMH2','CMH2','123','OH','Groveport','43125-9016','UTC-5','6050 Gateway Court',248), +(193000000000000041,193000000000100041,'CMH3','CMH3','32','OH','Monroe','45050-1848','UTC-5','700 GATEWAY BLVD',189), +(193000000000000042,193000000000100042,'CVG1','CVG1',NULL,'KY','Hebron','41048','UTC-5','1155 Worldwide Blvd',270), +(193000000000000043,193000000000100043,'CVG2','CVG2',NULL,'KY','Hebron','41048','UTC-5','1600 Worldwide Blvd',269), +(193000000000000044,193000000000100044,'CVG3','CVG3',NULL,'KY','Hebron','41048','UTC-5','3680 Langley Dr.',268), +(193000000000000045,193000000000100045,'CVG5','CVG5',NULL,'KY','Hebron','41048','UTC-5','2285 Litton Lane',267), +(193000000000000046,193000000000100046,'DCA6','DCA6','135','MD','BALTIMORE','21219','UTC-5','6001 Bethlehem Blvd',143), +(193000000000000047,193000000000100047,'DEN2','DEN2','107','CO','Aurora','80019','UTC-7','22205 East 19th Ave',131), +(193000000000000048,193000000000100048,'DEN8','DEN8','73','CO','Aurora','80018','UTC-7','21000 E 13th Ave',128), +(193000000000000049,193000000000100049,'DET1','DET1','118','MI','Livonia','48150-1543','UTC-5','39000 Amrhein Road',197), +(193000000000000050,193000000000100050,'DET2','DET2','136','MI','Shelby Township','48317-1318','UTC-5','50500 Mound Rd',190), +(193000000000000051,193000000000100051,'DFW5S','DFW5S',NULL,'TX','Lancaster','75146','UTC-6','2500 E Belt Line Rd,',151), +(193000000000000052,193000000000100052,'DFW6','DFW6','105','TX','Coppell','75019','UTC-6','940 W Bethel Road',227), +(193000000000000053,193000000000100053,'DFW8','DFW8',NULL,'TX','DFW Airport','75261','UTC-6','2700 Regent Blvd',225), +(193000000000000054,193000000000100054,'EWR4','EWR4',NULL,'NJ','Robbinsville','08691','UTC-5','50 New Canton Way',264), +(193000000000000055,193000000000100055,'EWR5','EWR5',NULL,'NJ','Avenel','07001','UTC-5','301 Blair Rd.',263), +(193000000000000056,193000000000100056,'EWR7','EWR7',NULL,'NJ','Avenel','07001','UTC-5','301 Blair Rd.',262), +(193000000000000057,193000000000100057,'EWR9','EWR9',NULL,'NJ','Carteret','07008','UTC-5','8003 Industrial Parkway',261), +(193000000000000058,193000000000100058,'FAT2','FAT2','43','CA','VISALIA','93291-1882','UTC-8','3315 N KELSEYST',125), +(193000000000000261,193000000000100261,'FEDEX','FEDEX','12','','','92337','','10767',55), +(193000000000000059,193000000000100059,'FOE1','FOE1','117','KS','KANSAS CITY','66109-3665','UTC-6','9400 LEAVENWORTH RD',184), +(193000000000000060,193000000000100060,'FTW1','FTW1','24','TX','Dallas','75241','UTC-6','33333 Lyndon B Johnson FREEWAY',220), +(193000000000000061,193000000000100061,'FTW2','FTW2',NULL,'TX','Coppell','75019','UTC-6','2701 West Bethel Road',219), +(193000000000000062,193000000000100062,'FTW3','FTW3',NULL,'TX','Fort Worth','76177-2517','UTC-6','15201 Heritage Pkwy',97), +(193000000000000063,193000000000100063,'FTW5','FTW5','48','TX','Forney','75126','UTC-6','1475 AKRON WAY',129), +(193000000000000064,193000000000100064,'FWA4','FWA4','58','IN','FORT WAYNE','46809-9771','UTC-5','9798 Smith Road',179), +(193000000000000065,193000000000100065,'GEG2','GEG2','108','WA','SPOKANE','99216','UTC-8','18007 E Garland Ave',159), +(193000000000000066,193000000000100066,'GEU2','GEU2','97','AZ','Glendale','85307','UTC-7','15301 West Northern Avenue',75), +(193000000000000067,193000000000100067,'GEU3','GEU3','81','AZ','BUCKEYE','85396','UTC-7','18900 W McDowell Road',86), +(193000000000000068,193000000000100068,'GEU5','GEU5','100','AZ','GOODYEAR','85395','UTC-7','4660 North Cotton Lane',76), +(193000000000000069,193000000000100069,'GSO1','GSO1','131','NC','KERNERSVILLE','27284','UTC-5','1656 OLD GREENSBORO RD',172), +(193000000000000070,193000000000100070,'GSP1','GSP1','90','SC','Spartanburg','29303','UTC-5','402 John Dodd Rd',232), +(193000000000000071,193000000000100071,'GYR2','GYR2','7','AZ','GOODYEAR','85395-7672','UTC-7','17341 W MINNEZONA AVE',196), +(193000000000000072,193000000000100072,'GYR3','GYR3','8','AZ','PHOENIX','85043-2356','UTC-7','8181 W ROOSEVELT ST',195), +(193000000000000262,193000000000100262,'HEA2','HEA2','77','','','18031','','650 BOULDER DR Suite A 18031-1536 - BREINIGSVILLE, PA - United States',65), +(193000000000000073,193000000000100073,'HGR6','HGR6','130','MD','HAGERSTOWN','21740-7301','UTC-5','55 West Oak Ridge Drive',88), +(193000000000000074,193000000000100074,'HIA1','HIA1','148','PA','MIDDLETOWN','17057','UTC-5','3327 E Harrisburg Pik',95), +(193000000000000075,193000000000100075,'HLI2','HLI2','137','CA','HOLLISTER','95023','UTC-8','600 Ernie Drive',52), +(193000000000000076,193000000000100076,'HOU1','HOU1',NULL,'TX','Humble','77338','UTC-6','8120 Humble Westfield Rd',224), +(193000000000000077,193000000000100077,'HOU2','HOU2',NULL,'TX','Houston','77038-2324','UTC-6','10550 Ella Blvd.',223), +(193000000000000078,193000000000100078,'HOU3','HOU3',NULL,'TX','Brookshire','77423','UTC-6','31555 Highway 90 E',222), +(193000000000000263,193000000000100263,'HOU7','HOU7','63','','','','','',67), +(193000000000000079,193000000000100079,'HOU8','HOU8','49','TX','FRESNO','77545','UTC-6','2303 Hurricane Lane',162), +(193000000000000080,193000000000100080,'HSV1','HSV1','80','AL','Madison','35756','UTC-6','7817 Greenbrier Road',150), +(193000000000000081,193000000000100081,'HSV2','HSV2',NULL,'AL','MADISON','35756','UTC-6','28869 Fanning Dr NW',134), +(193000000000000082,193000000000100082,'IAH3','IAH3','57','TX','Houston','77032','UTC-6','15525 Milner Road',163), +(193000000000000264,193000000000100264,'IAK3','IAK3','44','','','','','',70), +(193000000000000083,193000000000100083,'IAZ1','IAZ1','179','AZ','GOODYEAR','85395-4515','UTC-7','4660 N COTTON LN 85395-4515 - GOODYEAR, AZ - United States',11), +(193000000000000084,193000000000100084,'ICT2','ICT2','109','KS','PARK CITY','67219','UTC-6','7130 N BROADWAY AVE',144), +(193000000000000085,193000000000100085,'IGA3','IGA3','197','GA','MACON','31216-6427','UTC-5','7001 Skipper Rd 31216-6427 MACON, GA - United States',10), +(193000000000000086,193000000000100086,'IGQ2','IGQ2','110','IL','University park','60484','UTC-6','23257 S. Central Avenue',160), +(193000000000000087,193000000000100087,'ILG1','ILG1','35','DE','NEW CASTLE','19720','UTC-5','780 S. DuPont Highway',127), +(193000000000000265,193000000000100265,'IMI1','IMI1','199','MI','LANSING','48917-8539','UTC-5','6500 W Mt Hope Hwy 48917-8539 - LANSING, MI - United States',9), +(193000000000000088,193000000000100088,'IMO1','IMO1','178','MO','LIBERTY','64068-8933','UTC-6','2361 S Withers RD',18), +(193000000000000089,193000000000100089,'IMS1','IMS1','189','MS','OLIVE BRANCH','38654','UTC-6','IMS1-11505 Progress Way,38654-2510,OLIVE BRANCH,MS,US',14), +(193000000000000090,193000000000100090,'INC1','INC1','190','NC','FAYETTEVILLE','28303-2215','UTC-5','6309 Bragg Blvd 28303-2215 - FAYETTEVILLE, NC - United States',13), +(193000000000000266,193000000000100266,'IND1-AMAZON','IND1-AMAZON',NULL,'IN','Whitestown','46075','UTC-5','4255 Anson Blvd',287), +(193000000000000267,193000000000100267,'IND1-WALMART','IND1-WALMART',NULL,'IN','Avon','46123','UTC-5','9590 AllPoints Pkwy',176), +(193000000000000091,193000000000100091,'IND2','IND2','127','IN','Plainfield','46168-7442','UTC-5','715 Airtech Pkwy',96), +(193000000000000268,193000000000100268,'IND2-AMAZON','IND2-AMAZON',NULL,'IN','Plainfield','46168','UTC-5','715 Airtech Pkwy',286), +(193000000000000269,193000000000100269,'IND2-WALMART','IND2-WALMART',NULL,'IN','Avon','46123','UTC-5','9360 AllPoints Pkwy',177), +(193000000000000270,193000000000100270,'IND3','IND3','198','IN','Mccordsville','46055','UTC-5','5756 Enterprise Dr',6), +(193000000000000271,193000000000100271,'IND3-亚马逊','IND3-亚马逊',NULL,'IN','Pkwy Plainfield','46168','','717 Airtech Pkwy Plainfield IN 46168,USA',147), +(193000000000000272,193000000000100272,'IND3-沃尔玛','IND3-沃尔玛',NULL,'IN','Mccordsville','46055','UTC-5','5756 Enterprise Dr, Mccordsville, IN 46055',285), +(193000000000000092,193000000000100092,'IND4','IND4',NULL,'IN','Indianapolis','46231','UTC-5','710 S. Girls School Rd',284), +(193000000000000093,193000000000100093,'IND5','IND5','140','IN','Plainfield','46168','UTC-5','800 Perry Road',283), +(193000000000000094,193000000000100094,'IND6','IND6',NULL,'IN','Jeffersonville','47130','UTC-5','1453 E 10th St',282), +(193000000000000095,193000000000100095,'IND9','IND9','17','IN','GREENWOOD','46143-7830','UTC-5','1151 S GRAHAM RD',181), +(193000000000000273,193000000000100273,'IPA1','IPA1','194','PA','OLYPHANT','18447-2140','UTC-5','1300 Corporate Way',3), +(193000000000000096,193000000000100096,'ITX3','ITX3','187','TX','AMARILLO','79108-7749','UTC-6','ITX3-8590 NE 24th Ave,79108-7749,AMARILLO,TX,US',17), +(193000000000000097,193000000000100097,'IUSF','IUSF','169','TX','DALLAS','75241','UTC-6','3351 Balmorhea Dr',30), +(193000000000000098,193000000000100098,'IUSJ','IUSJ','98','CA','BEAUMONT','92223','UTC-8','36900 West 4th Street',77), +(193000000000000099,193000000000100099,'IUSP','IUSP','83','CA','HESPERIA,','92344','UTC-8','8140 Caliente Rd',82), +(193000000000000274,193000000000100274,'IUSP-AWD','IUSP-AWD','83','CA','HESPERIA','92344','UTC-8','8140 Caliente Rd',91), +(193000000000000100,193000000000100100,'IUSQ','IUSQ','95','CA','REDLANDS','92374','UTC-8','2125 W San Bernardino Ave',78), +(193000000000000101,193000000000100101,'IUSR','IUSR','158','SC','COWPENS','29330','UTC-5','1120 Mt Olive Rd',48), +(193000000000000102,193000000000100102,'IUST','IUST','149','PA','GREENCASTLE','17225','UTC-5','3PL AWD (Greencastle, PA, US) 15651 Greenmount RdGREENCASTLE, PA 17225 United States',47), +(193000000000000103,193000000000100103,'IUSW','IUSW','156','CA','Hesperia','92344','UTC-8','8130 Caliente Rd 92344 - Hesperia, CA - United States',41), +(193000000000000104,193000000000100104,'IUTE','IUTE','170','AZ','GOODYEAR','85338','UTC-7','16155 W Elwood St',29), +(193000000000000105,193000000000100105,'IUTJ','IUTJ','177','CA','Fontana','92335','UTC-8','9253 Dreamland Drive 92335 - Fontana, CA - United',16), +(193000000000000106,193000000000100106,'IUTL','IUTL','188','CA','Moreno Valley','92551','UTC-8','24405 Krameria Ave 92551 - Moreno Valley, CA - United States',15), +(193000000000000107,193000000000100107,'IWA6','IWA6','191','WA','PASCO','99301-6161','UTC-8','1202 S Road 40 E 99301-6161 - PASCO, WA - United States',12), +(193000000000000275,193000000000100275,'JAX3','JAX3','111','','','32210','','JAX3-32210',58), +(193000000000000276,193000000000100276,'JAX3-32210','JAX3-32210','111','FL','Jacksonville','32210-8686','UTC-5','13333 103rd Street',289), +(193000000000000277,193000000000100277,'JAX3-32221','JAX3-32221',NULL,'FL','Jacksonville','32221','UTC-5','13333 103rd Street',175), +(193000000000000108,193000000000100108,'JOT1','JOT1','93','CA','SAN BERNARDINO','92408','UTC-8','1494 S WATERMAN AVE',80), +(193000000000000109,193000000000100109,'JVL1','JVL1','125','WI','BELOIT','53511','UTC-6','1255 Gateway Blvd',158), +(193000000000000110,193000000000100110,'KRB4','KRB4',NULL,'CA','PERRIS','92571-9722','UTC-8','4501 PATTERSON AVE',186), +(193000000000000111,193000000000100111,'KY1','KY1','60','KY','Shepherdsville','40165','UTC-5','120 Velocity Way.,',169), +(193000000000000112,193000000000100112,'LAN2','LAN2','96','MI','LANSING','48917','UTC-5','6500 W Mt Hope Hwy',108), +(193000000000000278,193000000000100278,'LAN2-48917','LAN2-48917',NULL,'MI','LANSING','48917','UTC-5','6500 W Mt Hope Hwy',109), +(193000000000000113,193000000000100113,'LAS1','LAS1','5','NV','HENDERSON','89044','UTC-8','12300 Bermuda Road',255), +(193000000000000114,193000000000100114,'LAS2','LAS2',NULL,'NV','Las Vegas','89030','UTC-8','3837 Bay Lake Trail, Suite 111 North',254), +(193000000000000115,193000000000100115,'LAS6','LAS6','50','NV','Las Vegas','89115','UTC-8','4550 Nexus Way',140), +(193000000000000279,193000000000100279,'LAX1','LAX1','192','CA','Chino','91708','UTC-8','6750 Kimball Avenue, Chino,CA 91708,USA',8), +(193000000000000280,193000000000100280,'LAX1-WALMART','LAX1-WALMART',NULL,'CA','Chino','91708','UTC-8','6750 Kimball Avenue',185), +(193000000000000116,193000000000100116,'LAX2T','LAX2T','19','CA','CHINO','91708','UTC-8','6730 Kimball Ave',170), +(193000000000000281,193000000000100281,'LAX2T-WALMART','LAX2T-WALMART',NULL,'CA','Chino','91708','UTC-8','6720 Kimball Ave',188), +(193000000000000117,193000000000100117,'LAX9','LAX9','3','CA','FONTANA','92337','UTC-8','11263 Oleander Ave',191), +(193000000000000118,193000000000100118,'LBE1','LBE1','112','PA','Greensburg','15605','UTC-5','165 Glen Fox Road',94), +(193000000000000282,193000000000100282,'LBE1-UPS','LBE1-UPS',NULL,'PA','New Stanton','15672','UTC-5','165 GLENN FOX RD',93), +(193000000000000119,193000000000100119,'LEX1','LEX1',NULL,'KY','Lexington','40511','UTC-5','1850 Mercer RD',276), +(193000000000000120,193000000000100120,'LEX2','LEX2',NULL,'KY','Lexington','40511','UTC-5','172 Trade St.',275), +(193000000000000121,193000000000100121,'LFT1','LFT1','31','LA','CARENCRO','70520-5976','UTC-6','3550 NE EVANGELINE TRWY',115), +(193000000000000122,193000000000100122,'LGB3','LGB3',NULL,'CA','Eastvale','91752','UTC-8','4950 Goodman Way',299), +(193000000000000123,193000000000100123,'LGB4','LGB4','45','CA','Redlands','92374','UTC-8','27517 Pioneer Avenue',300), +(193000000000000124,193000000000100124,'LGB6','LGB6','26','CA','Riverside','92518-1513','UTC-8','20901 Krameria Ave',301), +(193000000000000125,193000000000100125,'LGB8','LGB8','2','CA','Rialto','92376','UTC-8','1568 N Linden Ave',302), +(193000000000000126,193000000000100126,'LIT2','LIT2','159','AR','NORTH LITTLE ROCK','72117','UTC-6','13001 HIGHWAY 70',114), +(193000000000000127,193000000000100127,'MCC1','MCC1','161','CA','RANCHO CORDOVA','95742','UTC-8','3300 Rancho Cordova Pkwy 95742 - RANCHO CORDOVA, CA - United States',40), +(193000000000000128,193000000000100128,'MCE1','MCE1','65','CA','TURLOCK','95380','UTC-8','FULKERTH RD',165), +(193000000000000129,193000000000100129,'MCI1','MCI1',NULL,'KS','Lenexa','66219','UTC-6','113th St & Renner Blvd.',279), +(193000000000000130,193000000000100130,'MCI4','MCI4','176','MO','KANSAS CITY','64163','UTC-6','MCI4 - 10501 NW 136th Street',20), +(193000000000000283,193000000000100283,'MCO1-WALMART','MCO1-WALMART',NULL,'FL','Davenport','33897','UTC-5','5100 NORTH RIDGE TRAIL',116), +(193000000000000131,193000000000100131,'MCO2','MCO2','106','FL','Deltona','32725-2610','UTC-5','2600 N Normandy Blvd',123), +(193000000000000132,193000000000100132,'MDT1','MDT1','121','PA','Carlisle','17015','UTC-5','2Ames Drive',238), +(193000000000000133,193000000000100133,'MDT4','MDT4','144','PA','York','17408','UTC-5','5125 Commerce Drive',136), +(193000000000000134,193000000000100134,'MDW2','MDW2','46','IL','Joliet','60433-3280','UTC-6','250 Emerald Drive',208), +(193000000000000284,193000000000100284,'MDW2-60433-3280','MDW2-60433-3280',NULL,'IL','Joliet','60433-3280','UTC-6','250 Emerald Drive',119), +(193000000000000135,193000000000100135,'MDW6','MDW6','143','IL','ROMEOVILLE','60446-6529','UTC-6','1125 W REMINGTON BLVD ROMEOVILLE',207), +(193000000000000136,193000000000100136,'MDW7','MDW7',NULL,'IL','Monee','60449','UTC-6','6605 Monee Manhattan Road',206), +(193000000000000137,193000000000100137,'MDW8','MDW8',NULL,'IL','Waukegan','60085','UTC-6','1750 Bridge Drive',205), +(193000000000000138,193000000000100138,'MDW9','MDW9','36','IL','Aurora','60502','UTC-6','2865 Duke Parkway',204), +(193000000000000139,193000000000100139,'MEM1','MEM1','85','TN','Memphis','38118','UTC-6','3292 E Holmes Rd',171), +(193000000000000285,193000000000100285,'MEM1S-WALMART','MEM1S-WALMART',NULL,'MS','OLIVE BRANCH','38654','UTC-6','9200 Alexander Road',183), +(193000000000000140,193000000000100140,'MEM6','MEM6','51','MS','OLIVE BRANCH','38654','UTC-6','11505 Progress Way',126), +(193000000000000141,193000000000100141,'MGE3','MGE3','133','GA','Jefferson','30549-2010','UTC-5','808 Hog Mountain Road',209), +(193000000000000286,193000000000100286,'MIA1-33054','MIA1-33054',NULL,'FL','Opa-Locka','33054','UTC-5','14000 NW 37th Avenue',174), +(193000000000000287,193000000000100287,'MIA1-33182','MIA1-33182',NULL,'FL','Miami','33182','UTC-5','1900 NW 132nd Place Doral',290), +(193000000000000142,193000000000100142,'MIT2','MIT2','82','CA','SHAFTER','93263','UTC-8','5408 Express Avenue',85), +(193000000000000143,193000000000100143,'MKC4','MKC4','67','KS','Edgerton','66021-9588','UTC-6','19645 Waverly Rd',278), +(193000000000000144,193000000000100144,'MKC6','MKC6',NULL,'KS','Kansas City','66102','UTC-6','6925 Riverview Avenue',277), +(193000000000000145,193000000000100145,'MKE1','MKE1',NULL,'WI','Kenosha','53144','UTC-6','3501 120th Ave',211), +(193000000000000146,193000000000100146,'MQJ1','MQJ1','88','IN','GREENFIELD','46140','UTC-5','4412 W 300 RD N',102), +(193000000000000288,193000000000100288,'MQY2','MQY2','193','TN','LEBANON','37090','UTC-6','MQY2 - 1301 Richard Petty Way 37090 - LEBANON, TN - United States',7), +(193000000000000147,193000000000100147,'MSP1','MSP1',NULL,'MN','Shakopee','55379','UTC-6','2601 4th Avenue East',198), +(193000000000000148,193000000000100148,'NJ3','NJ3','175','NJ','Pedricktown','08067','UTC-5','3 Sorbello Way',25), +(193000000000000289,193000000000100289,'NJ3-WALMART','NJ3-WALMART',NULL,'NJ','Pedricktown','08067','UTC-5','3 Sorbello Way',87), +(193000000000000290,193000000000100290,'NJ3T','NJ3T','195','NJ','Pedricktown','08067','UTC-5','7 Sorbello Rd',5), +(193000000000000149,193000000000100149,'OAK3','OAK3','41','CA','Patterson','95363-8876','UTC-8','255 Park Center Drive',307), +(193000000000000150,193000000000100150,'OAK4','OAK4',NULL,'CA','Tracy','95304-9370','UTC-8','1555 N. Chrisman Rd',308), +(193000000000000151,193000000000100151,'OKC2','OKC2','33','OK','OKLAHOMA CITY','73159','UTC-6','8991 S PORTLAND AVENUE',141), +(193000000000000152,193000000000100152,'OLM1','OLM1','172','WA','OLYMPIA','98516','UTC-8','3300 HOGUM BAY RD NE 98516-3111 - OLYMPIA, WA - United States',27), +(193000000000000153,193000000000100153,'ONT2','ONT2',NULL,'CA','San Bernardino','92408','UTC-8','1910 E Central Ave',311), +(193000000000000154,193000000000100154,'ONT6','ONT6',NULL,'CA','Moreno Valley','92551-9561','UTC-8','24208 San Michele Rd',310), +(193000000000000155,193000000000100155,'ONT8','ONT8','1','CA','Moreno Valley','92551-9534','UTC-8','24300 Nandina Ave',309), +(193000000000000156,193000000000100156,'ONT9','ONT9','25','CA','Redlands','92374','UTC-8','2125 W. San Bernandino Ave',306), +(193000000000000291,193000000000100291,'ORD1S-WALMART','ORD1S-WALMART',NULL,'IL','Joliet','60436','UTC-6','3501 Brandon Road',99), +(193000000000000157,193000000000100157,'ORD2','ORD2','21','IL','CHANNAHON','60410-8758','UTC-6','23714 W Amoco Rd',111), +(193000000000000158,193000000000100158,'ORD6','ORD6',NULL,'IL','Wood Dale','60191','UTC-6','1250 N Mittel Blvd',203), +(193000000000000159,193000000000100159,'ORF2','ORF2','38','VA','CHESAPEAKE','23321-1425','UTC-5','ORF2 - 5045 PORTSMOUTH BLVD',121), +(193000000000000292,193000000000100292,'ORF2-FEDEX','ORF2-FEDEX',NULL,'VA','CHESAPEAKE','23321-1425','UTC-5','ORF2 - 5045 PORTSMOUTH BLVD',167), +(193000000000000293,193000000000100293,'ORF2-UPS','ORF2-UPS',NULL,'VA','Richmond','23297','UTC-5','9603 Coach Road',124), +(193000000000000160,193000000000100160,'PBI3','PBI3','113','FL','Jacksonville','32206','UTC-5','21 Jump Street',89), +(193000000000000161,193000000000100161,'PDX7','PDX7','68','OR','Salem','97317','UTC-8','4775 Depot Ct SE',135), +(193000000000000162,193000000000100162,'PHL1','PHL1',NULL,'DE','New Castle','19720','UTC-5','1 Centerpoint Blvd.',296), +(193000000000000163,193000000000100163,'PHL3','PHL3',NULL,'DE','New Castle','19720','UTC-5','1600 Johnson Way',295), +(193000000000000164,193000000000100164,'PHL4','PHL4','52','PA','Carlisle','17015','UTC-5','21 Roadway Dr',244), +(193000000000000165,193000000000100165,'PHL5','PHL5',NULL,'PA','Lewisberry','17339','UTC-5','500 McCarthy Dr',243), +(193000000000000166,193000000000100166,'PHL5S','PHL5S','171','PA','Greencastle','17225','UTC-5','1915 Ebberts Spg Ct, Greencastle, PA 17225',28), +(193000000000000294,193000000000100294,'PHL5S-WALMART','PHL5S-WALMART',NULL,'PA','Greencastle','17225','UTC-5','1915 Ebberts Spg Ct',98), +(193000000000000167,193000000000100167,'PHL6','PHL6','69','PA','Carlisle','17015','UTC-5','675 Allen Rd.',242), +(193000000000000168,193000000000100168,'PHL7','PHL7',NULL,'DE','Middletown','19709','UTC-5','560 Merrimac Ave',294), +(193000000000000169,193000000000100169,'PHL8','PHL8',NULL,'DE','Middletown','19709','UTC-5','727 N Broad St',293), +(193000000000000170,193000000000100170,'PHX3','PHX3',NULL,'AZ','Phoenix','85043','UTC-7','6835 West Buckeye Road',315), +(193000000000000171,193000000000100171,'PHX5','PHX5','72','AZ','Goodyear','85338','UTC-7','16920 W Commerce Drive',314), +(193000000000000172,193000000000100172,'PHX6','PHX6',NULL,'AZ','Phoenix','85043','UTC-7','4750 West Mohave St',313), +(193000000000000173,193000000000100173,'PHX7','PHX7','74','AZ','Phoenix','85043','UTC-7','800 N 75th Ave',312), +(193000000000000174,193000000000100174,'PIT1','PIT1',NULL,'PA','Pittsburgh','15205','UTC-5','2250 Roswell Drive',237), +(193000000000000175,193000000000100175,'PIT2','PIT2','78','PA','IMPERIAL','15126-1002','UTC-5','1200 Westport Rd',166), +(193000000000000176,193000000000100176,'POC1','POC1','128','CA','FONTANA','92336-1123','UTC-8','4121 LYTLE CREEK RD',54), +(193000000000000177,193000000000100177,'POC2','POC2','151','CA','ONTARIO','91761','UTC-8','4000 South Hamner Avenue',46), +(193000000000000178,193000000000100178,'POC3','POC3','129','CA','JURUPA VALLEY','92509','UTC-8','6120 Clinker Drive',53), +(193000000000000179,193000000000100179,'PPO4','PPO4','122','IN','MERRILLVILLE','46410','UTC-6','9850 Mississippi Street',57), +(193000000000000180,193000000000100180,'PSC2','PSC2','75','WA','PASCO','99301','UTC-8','1351 S Road 40 E',101), +(193000000000000295,193000000000100295,'PSC2-UPS','PSC2-UPS',NULL,'OR','Portland','97242','UTC-8','9930 NE Alderwood Rd',100), +(193000000000000181,193000000000100181,'PSP3','PSP3','162','CA','DESERT HOT SPRINGS','92240','UTC-8','64165 19th AVE',36), +(193000000000000182,193000000000100182,'QXY5','QXY5','92','CA','STOCKTON','95215','UTC-8','4532 NEWCASTLE RD',79), +(193000000000000183,193000000000100183,'QXY8','QXY8','154','CA','FRESNO','93725-1962','UTC-8','3611 S NORTHPOINTE DR',43), +(193000000000000184,193000000000100184,'QZZ7','QZZ7','184','AZ','MESA','85212-9608','UTC-7','8560 E ELLIOT RD',22), +(193000000000000185,193000000000100185,'RDU2','RDU2','56','NC','Smithfield','27577','UTC-5','2150 US HWY 70 Business West',154), +(193000000000000186,193000000000100186,'RDU4','RDU4','145','NC','FAYETTEVILLE','28303','UTC-5','6309 Bragg Blvd',103), +(193000000000000187,193000000000100187,'RFD2','RFD2','71','IL','Huntley','60142','UTC-6','11500 Freeman Road',153), +(193000000000000188,193000000000100188,'RFD4','RFD4','174','IL','HUNTLEY','60142','UTC-6','11400 Venture Court 60142-8075 - HUNTLEY, IL - United States',24), +(193000000000000189,193000000000100189,'RIC1','RIC1','142','VA','Petersburg','23803','UTC-5','5000 Commerce Way',218), +(193000000000000190,193000000000100190,'RIC2','RIC2',NULL,'VA','Chester','23836','UTC-5','1901 Meadowville Technology Pkwy',217), +(193000000000000191,193000000000100191,'RMN3','RMN3','84','VA','Fredericksburg','22406','UTC-5','220 Centreport Parkway',152), +(193000000000000192,193000000000100192,'RNO1','RNO1',NULL,'NV','Fernley','89408','UTC-8','1600 East Newlands RD',256), +(193000000000000193,193000000000100193,'RNO2','RNO2',NULL,'NV','Reno','85906','UTC-8','8000 North Virginia Street',253), +(193000000000000194,193000000000100194,'RNO4','RNO4',NULL,'NV','Reno','89506','UTC-8','8000 North Virginia Street',252), +(193000000000000195,193000000000100195,'RYY2','RYY2','94','GA','White','30184','UTC-5','1250 Cassville White Road,',81), +(193000000000000196,193000000000100196,'SAT1','SAT1','23','TX','Schertz','78154-1461','UTC-6','6000 Enterprise Avenue',226), +(193000000000000197,193000000000100197,'SAT4','SAT4','61','TX','SAN ANTONIO','78245','UTC-6','10384 W US HIGHWAY 90',157), +(193000000000000198,193000000000100198,'SAT6','SAT6','183','TX','SAN MARCOS','78666','UTC-6','1346 Fortuna Road 78666-0001 - SAN MARCOS, TX - United States',23), +(193000000000000199,193000000000100199,'SAV3','SAV3','124','GA','Macon','31216-6427','UTC-5','7001 Skipper Rd',106), +(193000000000000200,193000000000100200,'SBD1','SBD1','4','CA','BLOOMINGTON','92316-3819','UTC-8','3388 S Cactus Ave',193), +(193000000000000201,193000000000100201,'SBD2','SBD2','15','CA','SAN BERNARDINO','92408-2805','UTC-8','1494 S WATERMAN AVE',187), +(193000000000000202,193000000000100202,'SCK1','SCK1','20','CA','STOCKTON','95215','UTC-8','4532 NEWCASTLE RD',105), +(193000000000000203,193000000000100203,'SCK3','SCK3','54','CA','MANTECA','95336','UTC-8','3565 N AIRPORT WAY MANTECA',68), +(193000000000000204,193000000000100204,'SCK4','SCK4','10','CA','STOCKTON','95215-8354','UTC-8','6001 S AUSTIN RD',194), +(193000000000000205,193000000000100205,'SCK8','SCK8','141','CA','OAKLEY','94561-2677','UTC-8','4700 WILBUR AVE',112), +(193000000000000206,193000000000100206,'SDF1','SDF1',NULL,'KY','Campbellsville','42718','UTC-5','1050 South Columbia AVE',274), +(193000000000000207,193000000000100207,'SDF2','SDF2',NULL,'KY','Watterson Park','40218','UTC-5','4360 Robards Ln',273), +(193000000000000208,193000000000100208,'SDF4','SDF4',NULL,'KY','Shepherdsville','40165','UTC-5','376 Zappos.com Blvd',272), +(193000000000000209,193000000000100209,'SDF6','SDF6',NULL,'KY','Shepherdsville','40165','UTC-5','271 Omega Pkwy',271), +(193000000000000210,193000000000100210,'SDF7','SDF7',NULL,'KY','Shepherdsville','40165','UTC-5','300 Omicron Court',266), +(193000000000000211,193000000000100211,'SDF8','SDF8',NULL,'IN','Jeffersonville','47130','UTC-5','900 Patrol Rd',281), +(193000000000000212,193000000000100212,'SDF9','SDF9',NULL,'KY','Shepherdsville','40165','UTC-5','100 W. Thomas P. Echols Lane',265), +(193000000000000213,193000000000100213,'SEA6','SEA6',NULL,'WA','South Seattle','98144','UTC-8','2646 Rainier Ave.',213), +(193000000000000214,193000000000100214,'SEA8','SEA8',NULL,'WA','Northeast Bellevue','98005','UTC-8','1475 124th Avenue',212), +(193000000000000215,193000000000100215,'SJC7','SJC7','30','CA','Tracy','95377-8906','UTC-8','188 Mountain House Parkway',303), +(193000000000000296,193000000000100296,'SLC1N','SLC1N','196','UT','Salt Lake City','84116','UTC-7','990 N 6550 W',4), +(193000000000000216,193000000000100216,'SLC2','SLC2','86','UT','West Jordan','84081','UTC-7','7148 W. Old Bingham Hwy',161), +(193000000000000217,193000000000100217,'SLC3','SLC3','185','UT','SALT LAKE CITY','84116-4413','UTC-7','355 N JOHN GLENN RD',21), +(193000000000000297,193000000000100297,'SMF1-AMAZON','SMF1-AMAZON',NULL,'CA','Sacramento','95835-9505','UTC-8','4900 W Elkhorn Blvd',298), +(193000000000000298,193000000000100298,'SMF1-WALMART','SMF1-WALMART',NULL,'CA','Sacramento','95837','UTC-8','7000 Powerline Rd',173), +(193000000000000218,193000000000100218,'SMF3','SMF3','9','CA','Stockton','95206-8202','UTC-8','3923 S B ST',192), +(193000000000000219,193000000000100219,'SMF6','SMF6','28','CA','SACRAMENTO','95837-9109','UTC-8','4930 ALLBAUGH DR',113), +(193000000000000299,193000000000100299,'SMF7','SMF7','53','','','','','',69), +(193000000000000220,193000000000100220,'SNA4','SNA4','18','CA','Rialto','92376-3009','UTC-8','2496 W Walnut Ave',304), +(193000000000000221,193000000000100221,'STL3','STL3','152','MO','REPUBLIC','65738-2779','UTC-6','3200 E SAWYER RD',117), +(193000000000000222,193000000000100222,'STL4','STL4','115','IL','Edwardsville','62025-2815','UTC-6','3050 GATEWAY COMMERCE CENTER DR S',202), +(193000000000000300,193000000000100300,'STL6','STL6','64','','','','','',66), +(193000000000000223,193000000000100223,'SWF1','SWF1','134','NY','ROCK TAVERN','12575','UTC-5','635 INTERNATIONAL BLVD',130), +(193000000000000224,193000000000100224,'SWF2','SWF2','62','NY','Hopewell Junction','12533','UTC-5','76 Patriot Way Hopewell Junction',84), +(193000000000000301,193000000000100301,'SWF2-10710','SWF2-10710',NULL,'NY','Yonkers','10710','UTC-5','557 Tuckahoe Road',145), +(193000000000000302,193000000000100302,'SWF2-12533','SWF2-12533',NULL,'NY','Hopewell Junction','12533-6159','UTC-5','76 Patriot Way',168), +(193000000000000225,193000000000100225,'TCY1','TCY1','139','CA','STOCKTON','95206','UTC-8','2690 East Arch Airport Road',49), +(193000000000000226,193000000000100226,'TCY2','TCY2','138','CA','STOCKTON','95215','UTC-8','6201 Newcastle Rd',51), +(193000000000000227,193000000000100227,'TEB3','TEB3','47','NJ','Logan Township','08085','UTC-5','2651 Oldmans Creek Rd',258), +(193000000000000228,193000000000100228,'TEB4','TEB4','55','NJ','PENNS GROVE','08069','UTC-5','747 COURSES LANDING RD',138), +(193000000000000229,193000000000100229,'TEB6','TEB6','114','NJ','Cranbury','08512','UTC-5','22 Hightstown Cranbury State Road',257), +(193000000000000230,193000000000100230,'TEB9','TEB9','40','NJ','Somerset','08873','UTC-5','601 Randolph Road',164), +(193000000000000231,193000000000100231,'TMB8','TMB8','116','FL','HOMESTEAD','33032-8597','UTC-5','27505 SW 132nd AVE',73), +(193000000000000303,193000000000100303,'TMB8-UPS','TMB8-UPS',NULL,'FL','Miami Gardens','33055','UTC-5','8675309 Jenny Lane',74), +(193000000000000232,193000000000100232,'TOL3','TOL3','173','OH','PERRYSBURG','43551','UTC-5','9240 Fremont Pike 43551-4210 - PERRYSBURG, OH - United States',26), +(193000000000000233,193000000000100233,'TPA1','TPA1',NULL,'FL','Ruskin','33570','UTC-5','3350 Laurel Ridge Ave.',292), +(193000000000000234,193000000000100234,'TPA2','TPA2','22','FL','Lakeland','33811','UTC-5','1760 County Line Rd',291), +(193000000000000235,193000000000100235,'TPA3','TPA3','146','FL','Auburndale','33823','UTC-5','676 C. Fred Jones Boulevard',132), +(193000000000000236,193000000000100236,'TUL1','TUL1',NULL,'KS','Coffeyville','67337','UTC-6','2654 North Highway 169',280), +(193000000000000304,193000000000100304,'UPS','UPS','11','','','92337','','10767',56), +(193000000000000237,193000000000100237,'VGT2','VGT2','6','NV','LAS VEGAS','89115-2013','UTC-8','6401 Howdy Wells Ave',180), +(193000000000000305,193000000000100305,'VGT2-FEDEX','VGT2-FEDEX',NULL,'NV','LAS VEGAS','89115-201','UTC-8','6401 Howdy Wells Ave',120), +(193000000000000306,193000000000100306,'VGT2-UPS','VGT2-UPS',NULL,'CA','March Air Reserve Base','92518','UTC-8','20701 Krameria Ave',178), +(193000000000000238,193000000000100238,'VUBA','VUBA',NULL,'PA','Scranton','18512','UTC-5','1000 Keystone Industrial Park',236), +(193000000000000239,193000000000100239,'VUGA','VUGA',NULL,'PA','Pittston','18643','UTC-5','508 Delaware Avenue West',235), +(193000000000000240,193000000000100240,'WBW2','WBW2','119','PA','OLYPHANT','18447','UTC-5','1300 Corporate Way',90), +(193000000000000241,193000000000100241,'XAV3','XAV3','180','GA','PORT WENTWORTH','31407','UTC-5','XAV3-120Crossgate Dr 31407-Port Wentworth, GA- United States',44), +(193000000000000307,193000000000100307,'XBN3','XBN3','91','','','','','',61), +(193000000000000308,193000000000100308,'XCH2','XCH2','87','','','','','',63), +(193000000000000242,193000000000100242,'XEW5','XEW5','163','NJ','Cinnaminson','08077-2015','UTC-5','995 Taylors Ln 08077-2015',45), +(193000000000000243,193000000000100243,'XIN5','XIN5','182','IN','Avon','46123-1700','UTC-5','8838 E COUNTY ROAD 100 S',33), +(193000000000000244,193000000000100244,'XLX1','XLX1','160','MD','HAGERSTOWN','21740','UTC-5','1115 Wesel Blvd HAGERSTOWN,MD 21740,USA',42), +(193000000000000245,193000000000100245,'XLX6','XLX6','166','NC','PINEVILLE','28134','UTC-5','12220 Carolina Logistics Drive PINEVILLE,NC 28134,USA',31), +(193000000000000246,193000000000100246,'XLX7','XLX7','27','CA','VICTORVILLE','92394','UTC-8','18580 Gateway Dr,Victorville,CA 92394,USA',71), +(193000000000000309,193000000000100309,'XMI3','XMI3','89','','','','','',62), +(193000000000000247,193000000000100247,'XPB2','XPB2','165','FL','APOPKA','32712','UTC-5','XPB2 - 4661 Apopka Logistics Pkwy 32712 - Apopka, FL - United States',34), +(193000000000000248,193000000000100248,'XRI3','XRI3','167','VA','Richmond','23234','UTC-5','4949 Commerce Rd, Richmond, VA 23234',32), +(193000000000000249,193000000000100249,'XUSB','XUSB',NULL,'TX','Fort Worth','76155','UTC-6','14900 Frye Rd.',221), +(193000000000000250,193000000000100250,'XUSC','XUSC',NULL,'PA','Carlisle','17013','UTC-5','40 Logistics Drive',234), +(193000000000000251,193000000000100251,'XUSD','XUSD',NULL,'CA','Stockton','95206','UTC-8','1909 Zephyr St',305), +(193000000000000252,193000000000100252,'XUSE','XUSE',NULL,'IN','Whitestown','46075','UTC-5','5100 S Indianapolis Rd',288), +(193000000000000310,193000000000100310,'洛杉矶仓一件代发','洛杉矶仓一件代发','CADF','CA','RANCHO CUCAMONGA','91730','UTC-8','10767 7TH STREET',60), +(193000000000000311,193000000000100311,'海外仓打托','海外仓打托','13','','','91730','','91730',50), +(193000000000000312,193000000000100312,'私人仓','私人仓','14','','','私人仓','','私人仓',59), +(193000000000000313,193000000000100313,'纽约仓','纽约仓',NULL,'NJ','New Jersey','08817','UTC-5','13、14号门75 Carter Dr Edison,',38), +(193000000000000314,193000000000100314,'纽约仓一件代发','纽约仓一件代发','NJDF','NJ','New Jersey','08817','UTC-5','Door13-14,75 Carter Dr Edison,',37); DROP PROCEDURE IF EXISTS assert_wh_fba_public_master_data_seed; DELIMITER // CREATE PROCEDURE assert_wh_fba_public_master_data_seed() BEGIN - IF (SELECT COUNT(*) FROM tmp_wh_fba_public_master_data) <> 252 THEN - SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'FBA公共主数据源数量不是252'; + IF (SELECT COUNT(*) FROM tmp_wh_fba_public_master_data) <> 314 THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'FBA公共主数据源数量不是314'; END IF; IF EXISTS ( SELECT 1 FROM tmp_wh_fba_public_master_data - WHERE warehouse_code <> UPPER(TRIM(warehouse_code)) - OR warehouse_code NOT REGEXP '^[A-Z0-9]{3,5}$' - OR TRIM(city) = '' - OR TRIM(state_province) = '' - OR TRIM(address_line1) = '' - OR TRIM(postal_code) = '' - OR TRIM(timezone) = '' + WHERE TRIM(warehouse_code) = '' + OR warehouse_code <> UPPER(TRIM(warehouse_code)) + OR (internal_code IS NOT NULL AND internal_code NOT REGEXP '^[A-Z0-9]{1,16}$') ) THEN - SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'FBA公共主数据存在未清洗或必填缺失记录'; + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'FBA公共主数据存在空编码或内部编号格式异常'; END IF; IF EXISTS ( @@ -521,7 +580,7 @@ CALL assert_wh_fba_public_master_data_seed(); DROP PROCEDURE IF EXISTS assert_wh_fba_public_master_data_seed; INSERT INTO wh_warehouse ( - id, tenant_id, warehouse_code, warehouse_name, warehouse_type, country_code, timezone, + id, tenant_id, warehouse_code, internal_code, warehouse_name, warehouse_type, country_code, timezone, contact_name, contact_phone, contact_email, status, remark, created_by, created_at, updated_by, updated_at, deleted, version ) @@ -529,6 +588,7 @@ SELECT source.warehouse_id_seed, 0, source.warehouse_code, + source.internal_code, source.warehouse_name, 'FBA', 'US', @@ -546,6 +606,7 @@ SELECT 0 FROM tmp_wh_fba_public_master_data source ON DUPLICATE KEY UPDATE + internal_code = VALUES(internal_code), warehouse_type = VALUES(warehouse_type), country_code = VALUES(country_code), timezone = VALUES(timezone), @@ -601,7 +662,7 @@ BEGIN WHERE warehouse.tenant_id = 0 AND warehouse.warehouse_type = 'FBA' AND warehouse.country_code = 'US' - AND warehouse.deleted = 0) <> 252 THEN + AND warehouse.deleted = 0) <> 314 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'FBA公共仓库写入数量校验失败'; END IF; @@ -619,6 +680,7 @@ BEGIN AND address.deleted = 0 WHERE warehouse.id IS NULL OR address.id IS NULL + OR NOT (warehouse.internal_code <=> source.internal_code) OR address.country_code <> 'US' OR address.state_province <> source.state_province OR address.city <> source.city diff --git a/warehouse/src/main/resources/db/warehouse.sql b/warehouse/src/main/resources/db/warehouse.sql index d61950cf9..64b360798 100644 --- a/warehouse/src/main/resources/db/warehouse.sql +++ b/warehouse/src/main/resources/db/warehouse.sql @@ -7,6 +7,7 @@ CREATE TABLE IF NOT EXISTS wh_warehouse ( id BIGINT UNSIGNED NOT NULL COMMENT '仓库ID(雪花ID)', tenant_id BIGINT UNSIGNED NOT NULL COMMENT '平台公共仓库固定使用 tenant_id=0', warehouse_code VARCHAR(50) NOT NULL COMMENT '平台内唯一仓库编码', + internal_code VARCHAR(16) NULL COMMENT 'FBA内部编号,仅FBA仓可配置', warehouse_name VARCHAR(120) NOT NULL COMMENT '仓库名称', warehouse_type VARCHAR(32) NOT NULL DEFAULT 'DOMESTIC' COMMENT '公共仓库类型:DOMESTIC国内仓、FBA亚马逊仓、OVERSEAS普通海外仓、OVERSEAS_PARTNER海外合作仓', country_code CHAR(2) NOT NULL COMMENT '所在国家二字码', diff --git a/warehouse/src/test/java/com/baiyue/warehouse/repository/WarehouseSchemaContractTest.java b/warehouse/src/test/java/com/baiyue/warehouse/repository/WarehouseSchemaContractTest.java index 340ed1ccf..238c26a13 100644 --- a/warehouse/src/test/java/com/baiyue/warehouse/repository/WarehouseSchemaContractTest.java +++ b/warehouse/src/test/java/com/baiyue/warehouse/repository/WarehouseSchemaContractTest.java @@ -12,7 +12,7 @@ class WarehouseSchemaContractTest { @Test void shouldHandleCase01() throws IOException { String sql = read("warehouse.sql"); - assertColumns(sql, "wh_warehouse", "warehouse_code", "warehouse_name", "warehouse_type", "country_code", + assertColumns(sql, "wh_warehouse", "warehouse_code", "internal_code", "warehouse_name", "warehouse_type", "country_code", "timezone", "contact_name", "contact_phone", "contact_email", "status", "remark"); assertColumns(sql, "wh_warehouse_address", "warehouse_id", "address_type", "country_code", "state_province", "city", "district", "postal_code", "address_line1", "address_line2", "latitude", "longitude"); diff --git a/warehouse/src/test/java/com/baiyue/warehouse/service/WarehouseApplicationServiceTest.java b/warehouse/src/test/java/com/baiyue/warehouse/service/WarehouseApplicationServiceTest.java index e22cc4b92..9df80d160 100644 --- a/warehouse/src/test/java/com/baiyue/warehouse/service/WarehouseApplicationServiceTest.java +++ b/warehouse/src/test/java/com/baiyue/warehouse/service/WarehouseApplicationServiceTest.java @@ -61,7 +61,7 @@ class WarehouseApplicationServiceTest { @Test void createsDomesticWarehouseWithPlatformDefaults() { - WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "CN-SZX-01", "深圳作业仓", + WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "CN-SZX-01", null, "深圳作业仓", null, null, null, "张三", "13800138000", null, null, null, new WarehouseRequests.AddressRequest(null, null, "广东省", "深圳市", "南山区", "518000", "前海路 1 号", null, null, null), @@ -86,7 +86,7 @@ class WarehouseApplicationServiceTest { @Test void fbaWarehouseUsesConfirmedStateTimezoneAndDoesNotCreateCapabilities() { - WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "FBA-LAX9", "LAX9", + WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "FBA-LAX9", "154", "LAX9", "FBA", "US", null, null, null, null, null, null, new WarehouseRequests.AddressRequest(null, "US", "CA", "Redlands", null, "92374", "Amazon Fulfillment Center", null, null, null), @@ -99,13 +99,28 @@ class WarehouseApplicationServiceTest { verify(repository, never()).insertCapability(any()); assertThat(warehouse.getValue().getTenantId()).isZero(); assertThat(warehouse.getValue().getWarehouseType()).isEqualTo("FBA"); + assertThat(warehouse.getValue().getInternalCode()).isEqualTo("154"); assertThat(warehouse.getValue().getTimezone()).isEqualTo("UTC-8"); assertThat(warehouse.getValue().getStatus()).isEqualTo("ACTIVE"); } + @Test + void rejectsInternalCodeForNonFbaWarehouse() { + WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "CN-SZX-01", "154", "深圳作业仓", + "DOMESTIC", "CN", "UTC+8", null, null, null, null, null, + new WarehouseRequests.AddressRequest(null, "CN", "广东省", "深圳市", null, + "518000", "前海路 1 号", null, null, null), + null); + + assertThatThrownBy(() -> service.create(request)).isInstanceOf(BizException.class) + .extracting(exception -> ((BizException) exception).getResultCode()) + .isEqualTo(ResultCode.VALIDATION_FAILED); + verify(repository, never()).insertWarehouse(any()); + } + @Test void fbaWarehouseInMultiTimezoneStateRequiresExplicitTimezone() { - WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "FBA-DFW", "DFW", + WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "FBA-DFW", null, "DFW", "FBA", "US", null, null, null, null, null, null, new WarehouseRequests.AddressRequest(null, "US", "TX", "Dallas", null, "75201", "Amazon", null, null, null), @@ -119,7 +134,7 @@ class WarehouseApplicationServiceTest { @Test void createsOverseasPartnerWarehouseAsPlatformPublicMasterData() { - WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "US-PARTNER-LAX", "洛杉矶合作仓", + WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "US-PARTNER-LAX", null, "洛杉矶合作仓", "OVERSEAS_PARTNER", "US", "UTC-8", "Alex", "+1-213-555-0100", null, null, null, new WarehouseRequests.AddressRequest(null, "US", "CA", "Los Angeles", null, "90001", "123 Partner Ave", null, null, null), diff --git a/warehouse/src/test/java/com/baiyue/warehouse/service/WarehouseImportServiceTest.java b/warehouse/src/test/java/com/baiyue/warehouse/service/WarehouseImportServiceTest.java index 1e0837d5a..7c6c75aa3 100644 --- a/warehouse/src/test/java/com/baiyue/warehouse/service/WarehouseImportServiceTest.java +++ b/warehouse/src/test/java/com/baiyue/warehouse/service/WarehouseImportServiceTest.java @@ -46,8 +46,8 @@ class WarehouseImportServiceTest { @DisplayName("默认 CREATE_ONLY 只新增新仓库并返回预检分类") void shouldCreateOnlyNewWarehousesByDefault() throws Exception { byte[] file = withRows(service.template(), new String[][] { - {"CN-SZX-01", "深圳作业仓", "", "", "广东省", "深圳市", "南山区", "前海路 1 号", "518000", "", "", "张三", "13800138000", "", ""}, - {"FBA-LAX9", "", "FBA", "US", "CA", "Redlands", "", "Amazon FC", "92374", "", "", "", "", "", ""} + {"CN-SZX-01", "", "深圳作业仓", "", "", "广东省", "深圳市", "南山区", "前海路 1 号", "518000", "", "", "张三", "13800138000", "", ""}, + {"FBA-LAX9", "154", "", "FBA", "US", "CA", "Redlands", "", "Amazon FC", "92374", "", "", "", "", "", ""} }); WarehouseImportResult result = service.importFile(0L, "warehouses.xlsx", file, null); @@ -61,6 +61,7 @@ class WarehouseImportServiceTest { verify(warehouseService, org.mockito.Mockito.times(2)).create(captor.capture()); assertThat(captor.getAllValues().get(0).tenantId()).isZero(); assertThat(captor.getAllValues().get(1).warehouseType()).isEqualTo("FBA"); + assertThat(captor.getAllValues().get(1).internalCode()).isEqualTo("154"); assertThat(captor.getAllValues().get(1).warehouseName()).isEqualTo("FBA-LAX9"); } @@ -68,7 +69,7 @@ class WarehouseImportServiceTest { @DisplayName("海外合作仓类型可通过批量导入进入公共仓库主数据") void shouldImportOverseasPartnerWarehouse() throws Exception { byte[] file = withRows(service.template(), new String[][] { - {"US-PARTNER-LAX", "洛杉矶合作仓", "OVERSEAS_PARTNER", "US", "CA", "Los Angeles", "", "123 Partner Ave", "90001", "UTC-8", "", "", "", "", ""} + {"US-PARTNER-LAX", "", "洛杉矶合作仓", "OVERSEAS_PARTNER", "US", "CA", "Los Angeles", "", "123 Partner Ave", "90001", "UTC-8", "", "", "", "", ""} }); WarehouseImportResult result = service.importFile(0L, "warehouses.xlsx", file, null); @@ -84,8 +85,8 @@ class WarehouseImportServiceTest { @DisplayName("任一行错误时整批零写入") void shouldRejectWholeBatchWhenAnyRowInvalid() throws Exception { byte[] file = withRows(service.template(), new String[][] { - {"FBA-DFW", "DFW", "FBA", "US", "TX", "Dallas", "", "Amazon FC", "75201", "", "", "", "", "", ""}, - {"CN-SZX-01", "深圳作业仓", "", "", "广东省", "深圳市", "", "前海路 1 号", "", "", "", "", "", "", ""} + {"FBA-DFW", "155", "DFW", "FBA", "US", "TX", "Dallas", "", "Amazon FC", "75201", "", "", "", "", "", ""}, + {"CN-SZX-01", "", "深圳作业仓", "", "", "广东省", "深圳市", "", "前海路 1 号", "", "", "", "", "", "", ""} }); WarehouseImportResult result = service.importFile(0L, "warehouses.xlsx", file, null); @@ -122,7 +123,7 @@ class WarehouseImportServiceTest { when(repository.findByCode(0L, "CN-SZX-01")).thenReturn(existing); when(repository.findAddresses(0L, 9L)).thenReturn(java.util.List.of(address)); byte[] file = withRows(service.template(), new String[][] { - {"CN-SZX-01", "深圳作业仓", "", "", "广东省", "深圳市", "", "新地址", "", "", "ACTIVE", "新联系人", "新电话", "new@example.com", "新备注"} + {"CN-SZX-01", "", "深圳作业仓", "", "", "广东省", "深圳市", "", "新地址", "", "", "ACTIVE", "新联系人", "新电话", "new@example.com", "新备注"} }); WarehouseImportResult result = service.importFile(0L, "warehouses.xlsx", file, ImportMode.UPSERT); @@ -141,8 +142,8 @@ class WarehouseImportServiceTest { @DisplayName("dryRun 只返回预检分类和计数,不写入仓库") void shouldOnlyPreviewWhenDryRun() throws Exception { byte[] file = withRows(service.template(), new String[][] { - {"CN-SZX-01", "深圳作业仓", "", "", "广东省", "深圳市", "南山区", "前海路 1 号", "518000", "", "", "张三", "13800138000", "", ""}, - {"FBA-LAX9", "LAX9", "FBA", "US", "CA", "Redlands", "", "Amazon FC", "92374", "", "", "", "", "", ""} + {"CN-SZX-01", "", "深圳作业仓", "", "", "广东省", "深圳市", "南山区", "前海路 1 号", "518000", "", "", "张三", "13800138000", "", ""}, + {"FBA-LAX9", "154", "LAX9", "FBA", "US", "CA", "Redlands", "", "Amazon FC", "92374", "", "", "", "", "", ""} }); WarehouseImportResult result = service.importFile(0L, "warehouses.xlsx", file, null, true); @@ -175,7 +176,7 @@ class WarehouseImportServiceTest { when(repository.findByCode(0L, "CN-SZX-01")).thenReturn(existing); when(repository.findAddresses(0L, 9L)).thenReturn(java.util.List.of(address)); byte[] file = withRows(service.template(), new String[][] { - {"CN-SZX-01", "深圳作业仓", "", "", "广东省", "深圳市", "", "新地址", "", "", "", "", "", "", ""} + {"CN-SZX-01", "", "深圳作业仓", "", "", "广东省", "深圳市", "", "新地址", "", "", "", "", "", "", ""} }); WarehouseImportResult result = service.importFile(0L, "warehouses.xlsx", file, ImportMode.CREATE_ONLY);