From 5e756b5a69bcd957f8eafc5f99a4f6413691d6dd Mon Sep 17 00:00:00 2001
From: wangzhibo <wangzhibo@shsening.com>
Date: 星期三, 19 八月 2026 09:31:51 +0800
Subject: [PATCH] add maps

---
 src/modules/maps/components/map-board.vue     |  137 +++++
 src/modules/maps/components/track-toolbar.vue |  110 ++++
 build/cool/eps.d.ts                           |   87 +++
 /dev/null                                     |   84 ---
 src/modules/maps/views/site.vue               |  296 +++++++++++
 src/modules/maps/hooks/use-track.ts           |   97 +++
 src/modules/maps/config.ts                    |   29 +
 src/modules/maps/hooks/use-map.ts             |   92 +++
 src/modules/maps/views/vehicle.vue            |  285 +++++++++++
 build/cool/eps.json                           |    2 
 src/modules/maps/views/sorter.vue             |  267 ++++++++++
 11 files changed, 1,401 insertions(+), 85 deletions(-)

diff --git a/build/cool/eps.d.ts b/build/cool/eps.d.ts
index 59a1301..5fde816 100644
--- a/build/cool/eps.d.ts
+++ b/build/cool/eps.d.ts
@@ -4972,6 +4972,20 @@
 
 	type json = any;
 
+	type DictKey =
+		| "upgradeType"
+		| "complainType"
+		| "feedbackType"
+		| "ratedpayload"
+		| "iottype"
+		| "brand"
+		| "occupation"
+		| "sitetype"
+		| "datachanel"
+		| "vehicletype"
+		| "businesstype"
+		| "appointmentslot";
+
 	interface PagePagination {
 		size: number;
 		page: number;
@@ -7067,6 +7081,78 @@
 			list: boolean;
 			page: boolean;
 			add: boolean;
+		};
+
+		request: Request;
+	}
+
+	interface MapsLive {
+		/**
+		 * 鍦ㄧ嚎杞﹁締浣嶇疆
+		 */
+		vehicleOnline(data?: any): Promise<any>;
+
+		/**
+		 * 杞﹁締鍙告満琛屼负娑堟伅
+		 */
+		vehicleEvents(data?: any): Promise<any>;
+
+		/**
+		 * 鍦ㄧ嚎鍒嗘嫞鍛樹綅缃�
+		 */
+		sorterOnline(data?: any): Promise<any>;
+
+		/**
+		 * 鍒嗘嫞鍛樺仴搴蜂笌鍛婅
+		 */
+		sorterHealth(data?: any): Promise<any>;
+
+		/**
+		 * 杞﹁締鍘嗗彶杞ㄨ抗
+		 */
+		vehicleTrack(data?: any): Promise<any>;
+
+		/**
+		 * 鍒嗘嫞鍛樺巻鍙茶建杩�
+		 */
+		sorterTrack(data?: any): Promise<any>;
+
+		/**
+		 * 绔欑偣绉伴噸鍘嗗彶
+		 */
+		siteWeight(data?: any): Promise<any>;
+
+		/**
+		 * 绔欑偣鍦板浘鐐逛綅
+		 */
+		sites(data?: any): Promise<any>;
+
+		/**
+		 * 鏉冮檺鏍囪瘑
+		 */
+		permission: {
+			vehicleOnline: string;
+			vehicleEvents: string;
+			sorterOnline: string;
+			sorterHealth: string;
+			vehicleTrack: string;
+			sorterTrack: string;
+			siteWeight: string;
+			sites: string;
+		};
+
+		/**
+		 * 鏉冮檺鐘舵��
+		 */
+		_permission: {
+			vehicleOnline: boolean;
+			vehicleEvents: boolean;
+			sorterOnline: boolean;
+			sorterHealth: boolean;
+			vehicleTrack: boolean;
+			sorterTrack: boolean;
+			siteWeight: boolean;
+			sites: boolean;
 		};
 
 		request: Request;
@@ -9217,6 +9303,7 @@
 			type: GoodsType;
 		};
 		info: { banner: InfoBanner };
+		maps: { live: MapsLive };
 		market: { coupon: { info: MarketCouponInfo; user: MarketCouponUser } };
 		monitor: { capturetask: MonitorCapturetask; ys7: MonitorYs7 };
 		operation: { traderecord: OperationTraderecord; wastesale: OperationWastesale };
diff --git a/build/cool/eps.json b/build/cool/eps.json
index 15f11ec..02e9d6a 100644
--- a/build/cool/eps.json
+++ b/build/cool/eps.json
@@ -1 +1 @@
-[{"prefix":"/admin/app/complain","name":"AppComplainEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-鏈鐞� 1-宸插鐞�","nullable":false,"defaultValue":0,"source":"a.status"},{"propertyName":"type","type":"number","length":"","comment":"绫诲瀷","nullable":false,"source":"a.type"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"contact","type":"string","length":"","comment":"鑱旂郴鏂瑰紡","nullable":false,"source":"a.contact"},{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"b.nickName"},{"propertyName":"handlerName","type":"string","length":"","comment":"濮撳悕","nullable":true,"source":"c.name"}]}},{"prefix":"/admin/app/feedback","name":"AppFeedbackEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-鏈鐞� 1-宸插鐞�","nullable":false,"defaultValue":0,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"contact","type":"string","length":"","comment":"鑱旂郴鏂瑰紡","nullable":false,"source":"a.contact"},{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"b.nickName"},{"propertyName":"handlerName","type":"string","length":"","comment":"濮撳悕","nullable":true,"source":"c.name"}]}},{"prefix":"/admin/app/goods","name":"AppGoodsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-绂佺敤 1-鍚敤","nullable":false,"defaultValue":1,"source":"a.status"},{"propertyName":"type","type":"number","length":"","comment":"绫诲瀷 0-澶� 1-鏈� 2-骞� 3-姘镐箙","nullable":false,"defaultValue":0,"source":"a.type"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"title","type":"string","length":"","comment":"鏍囬","nullable":false,"source":"a.title"}]}},{"prefix":"/admin/app/version","name":"AppVersionEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-绂佺敤 1-鍚敤","nullable":false,"defaultValue":1,"source":"a.status"},{"propertyName":"type","type":"number","length":"","comment":"绫诲瀷","nullable":false,"defaultValue":0,"source":"a.type"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"version","type":"string","length":"","comment":"鐗堟湰鍙�","nullable":false,"source":"a.version"}]}},{"prefix":"/admin/base/coding","name":"","api":[{"method":"get","path":"/getModuleTree"},{"method":"post","path":"/createCode"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/comm","name":"","api":[{"method":"post","path":"/personUpdate"},{"method":"get","path":"/uploadMode"},{"method":"get","path":"/permmenu"},{"method":"get","path":"/program"},{"method":"get","path":"/person"},{"method":"post","path":"/upload"},{"method":"post","path":"/logout"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/open","name":"","api":[{"method":"get","path":"/refreshToken"},{"method":"get","path":"/captcha"},{"method":"post","path":"/login"},{"method":"get","path":"/html"},{"method":"get","path":"/eps"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/department","name":"BaseSysDepartmentEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/order"},{"method":"post","path":"/list"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/log","name":"BaseSysLogEntity","api":[{"method":"post","path":"/setKeep"},{"method":"get","path":"/getKeep"},{"method":"post","path":"/clear"},{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"濮撳悕","nullable":true,"source":"b.name"},{"propertyName":"action","type":"string","length":"","comment":"琛屼负","nullable":false,"source":"a.action"},{"propertyName":"ip","type":"string","length":"","comment":"ip","nullable":true,"source":"a.ip"}]}},{"prefix":"/admin/base/sys/menu","name":"BaseSysMenuEntity","api":[{"method":"post","path":"/create"},{"method":"post","path":"/export"},{"method":"post","path":"/import"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/parse"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/param","name":"BaseSysParamEntity","api":[{"method":"get","path":"/stringbykey"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/html"},{"method":"get","path":"/info"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"dataType","type":"number","length":"","comment":"鏁版嵁绫诲瀷 0-瀛楃涓� 1-瀵屾枃鏈� 2-鏂囦欢 ","nullable":false,"defaultValue":0,"source":"a.dataType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"keyName","type":"string","length":"","comment":"閿�","nullable":false,"source":"a.keyName"}]}},{"prefix":"/admin/base/sys/role","name":"BaseSysRoleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"label","type":"string","length":"50","comment":"瑙掕壊鏍囩","nullable":true,"source":"a.label"}]}},{"prefix":"/admin/base/sys/user","name":"BaseSysUserEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/move"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/basicdata/buyer","name":"BasicdataBuyerEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"bigint","length":"","comment":"閮ㄩ棬ID","nullable":true,"source":"a.departmentId"},{"propertyName":"name","type":"string","length":"200","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"contact","type":"string","length":"50","comment":"鑱旂郴浜�","nullable":true,"source":"a.contact"}],"fieldLike":[{"propertyName":"name","type":"string","length":"200","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"address","type":"string","length":"255","comment":"鍦板潃","nullable":true,"source":"a.address"}],"keyWordLikeFields":[]}},{"prefix":"/admin/basicdata/driver","name":"BasicdataDriverEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"bigint","length":"","comment":"鎵�灞炲崟浣�","nullable":true,"source":"a.departmentId"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["婵�娲�","绂佺敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessId","type":"string","length":"64","comment":"韬唤璇佸彿","nullable":false,"source":"a.businessId"},{"propertyName":"phone","type":"string","length":"32","comment":"鎵嬫満鍙�","nullable":true,"source":"a.phone"},{"propertyName":"licenseNo","type":"string","length":"64","comment":"椹鹃┒璇佸彿","nullable":true,"source":"a.licenseNo"}]}},{"prefix":"/admin/basicdata/iot","name":"BasicdataIotEntity","api":[{"method":"post","path":"/getYsDevices"},{"method":"post","path":"/getSitelist"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"iotTypeCode","type":"string","length":"","comment":"缁堢绫诲瀷","nullable":false,"source":"a.iotTypeCode"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"iotName","type":"string","length":"","comment":"缁堢鍚嶇О","nullable":false,"source":"a.iotName"},{"propertyName":"iotCode","type":"string","length":"","comment":"缁堢缂栫爜","nullable":false,"source":"a.iotCode"}]}},{"prefix":"/admin/basicdata/site","name":"BasicdataSiteEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/basicdata/sorter","name":"BasicdataSorterEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["鍦ㄨ亴","绂昏亴","绂佺敤"],"source":"a.status"},{"propertyName":"departmentId","type":"bigint","length":"","comment":"鎵�灞炲崟浣�","nullable":true,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessName","type":"string","length":"64","comment":"濮撳悕","nullable":false,"source":"a.businessName"},{"propertyName":"businessId","type":"string","length":"32","comment":"韬唤璇佸彿","nullable":true,"source":"a.businessId"},{"propertyName":"phone","type":"string","length":"32","comment":"鎵嬫満鍙�","nullable":false,"source":"a.phone"}]}},{"prefix":"/admin/basicdata/vehicle","name":"BasicdataVehicleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"vehicleType","type":"string","length":"","comment":"杞﹀瀷","nullable":false,"defaultValue":"鍘㈠紡璐ц溅","dict":"vehicletype","source":"a.vehicleType"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["鍚敤","绂佺敤"],"source":"a.status"},{"propertyName":"departmentId","type":"bigint","length":"","comment":"鎵�灞炲崟浣�","nullable":true,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessId","type":"string","length":"32","comment":"杞︾墝鍙�","nullable":false,"source":"a.businessId"},{"propertyName":"defaultDriver","type":"bigint","length":"","comment":"榛樿鍙告満","nullable":true,"source":"a.defaultDriver"}]}},{"prefix":"/admin/basicdata/wastetype","name":"BasicdataWastetypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"isRecyclable","type":"number","length":"","comment":"鏄惁鍙洖鏀�","nullable":false,"defaultValue":0,"dict":["鍚�","鏄�"],"source":"a.isRecyclable"},{"propertyName":"status","type":"number","length":"","comment":"鏄惁鍚敤","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"code","type":"string","length":"","comment":"浠g爜","nullable":false,"source":"a.code"}]}},{"prefix":"/admin/count/home","name":"","api":[{"method":"post","path":"/goodsCategory"},{"method":"post","path":"/orderSummary"},{"method":"post","path":"/userSummary"},{"method":"post","path":"/orderChart"},{"method":"post","path":"/userChart"},{"method":"post","path":"/goodsRank"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/cs/msg","name":"CsMsgEntity","api":[{"method":"get","path":"/unreadCount"},{"method":"post","path":"/read"},{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/cs/session","name":"CsSessionEntity","api":[{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/demo/goods","name":"DemoGoodsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[{"propertyName":"title","type":"string","length":"50","comment":"鏍囬","nullable":false,"source":"a.title"}],"keyWordLikeFields":[{"propertyName":"description","type":"string","length":"","comment":"鎻忚堪","nullable":true,"source":"a.description"}]}},{"prefix":"/admin/demo/tenant","name":"DemoGoodsEntity","api":[{"method":"post","path":"/noTenant"},{"method":"post","path":"/noUse"},{"method":"post","path":"/use"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/dict/info","name":"DictInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/types"},{"method":"post","path":"/data"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/dict/type","name":"DictTypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/goods/comment","name":"GoodsCommentEntity","api":[{"method":"post","path":"/page"}],"search":{"fieldEq":[{"propertyName":"goodsId","type":"number","length":"","comment":"鍟嗗搧ID","nullable":false,"source":"a.goodsId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"content","type":"string","length":"","comment":"鍐呭","nullable":false,"source":"a.content"},{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"b.nickName"}]}},{"prefix":"/admin/goods/info","name":"GoodsInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-涓嬫灦 1-涓婃灦","nullable":false,"defaultValue":0,"source":"a.status"},{"propertyName":"typeId","type":"number","length":"","comment":"绫诲瀷ID","nullable":false,"source":"a.typeId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"title","type":"string","length":"","comment":"鏍囬","nullable":false,"source":"a.title"},{"propertyName":"subTitle","type":"string","length":"","comment":"鍓爣棰�","nullable":true,"source":"a.subTitle"}]}},{"prefix":"/admin/goods/searchKeyword","name":"GoodsSearchKeywordEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"}]}},{"prefix":"/admin/goods/spec","name":"GoodsSpecEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/goods/type","name":"GoodsTypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"parentId","type":"number","length":"","comment":"鐖禝D","nullable":true,"source":"a.parentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"}]}},{"prefix":"/admin/info/banner","name":"InfoBannerEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 1:鍚敤 2:绂佺敤","nullable":false,"defaultValue":1,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/market/coupon/info","name":"MarketCouponInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-绂佺敤 1-鍚敤","nullable":false,"defaultValue":0,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"title","type":"string","length":"","comment":"鏍囬","nullable":false,"source":"a.title"}]}},{"prefix":"/admin/market/coupon/user","name":"MarketCouponUserEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-鏈娇鐢� 1-宸蹭娇鐢�","nullable":false,"defaultValue":0,"source":"a.status"},{"propertyName":"couponId","type":"number","length":"","comment":"浼樻儬鍒窱D","nullable":false,"source":"a.couponId"},{"propertyName":"userId","type":"string","length":"","comment":"鐢ㄦ埛ID","nullable":false,"source":"a.userId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"b.nickName"}]}},{"prefix":"/admin/monitor/capturetask","name":"PushCaptureTaskEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"string","length":"","comment":"鎶撴媿鐘舵��","nullable":false,"defaultValue":"PENDING","dict":["PENDING","SUCCESS","FAILED"],"source":"a.status"},{"propertyName":"captureDate","type":"string","length":"","comment":"浠诲姟鎵ц鏃ユ湡","nullable":true,"source":"a.captureDate"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"deviceSerial","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.deviceSerial"},{"propertyName":"captureTaskId","type":"string","length":"","comment":"鎶撳浘浠诲姟ID(钀ょ煶杩斿洖)","nullable":true,"source":"a.captureTaskId"}]}},{"prefix":"/admin/monitor/ys7","name":"","api":[{"method":"post","path":"/getToken"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/operation/traderecord","name":"OperationTradeRecordEntity","api":[{"method":"post","path":"/import"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"transactionType","type":"string","length":"","comment":"浜ゆ槗绫诲瀷","nullable":true,"source":"a.transactionType"},{"propertyName":"incomeType","type":"string","length":"","comment":"鏀舵敮绫诲瀷","nullable":false,"defaultValue":"鏀跺叆","dict":["鏀跺叆","鏀嚭","鍏朵粬"],"source":"a.incomeType"},{"propertyName":"payMethod","type":"string","length":"","comment":"鏀粯鏂瑰紡","nullable":true,"source":"a.payMethod"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"goodsName","type":"string","length":"","comment":"鍟嗗搧鍚嶇О","nullable":true,"source":"a.goodsName"},{"propertyName":"opponent","type":"string","length":"","comment":"浜ゆ槗瀵规柟","nullable":true,"source":"a.opponent"}]}},{"prefix":"/admin/operation/wastesale","name":"OperationWastesaleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"bigint","length":"","comment":"閮ㄩ棬ID","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/order/info","name":"OrderInfoEntity","api":[{"method":"post","path":"/refundHandle"},{"method":"get","path":"/logistics"},{"method":"post","path":"/deliver"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"}],"search":{"fieldEq":[{"propertyName":"status","type":"tinyint","length":"","comment":"鐘舵�� 0-寰呬粯娆� 1-寰呭彂璐� 2-寰呮敹璐� 3-寰呰瘎浠� 4-浜ゆ槗瀹屾垚 5-閫�娆句腑 6-宸查��娆� 7-宸插叧闂�","nullable":false,"defaultValue":0,"source":"a.status"},{"propertyName":"payType","type":"number","length":"","comment":"鏀粯鏂瑰紡 0-寰呮敮浠� 1-寰俊 2-鏀粯瀹� 3-纰崇Н鍒�","nullable":false,"defaultValue":0,"source":"a.payType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"title","type":"string","length":"","comment":"鏍囬","nullable":true,"source":"a.title"},{"propertyName":"orderNum","type":"string","length":"","comment":"璁㈠崟鍙�","nullable":true,"source":"a.orderNum"},{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"b.nickName"}]}},{"prefix":"/admin/plugin/info","name":"PluginInfoEntity","api":[{"method":"post","path":"/install"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/push/auditlog","name":"PushAuditlogEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"deviceNo","type":"string","length":"","comment":"瀹㈡埛绔疘D","nullable":false,"source":"a.deviceNo"},{"propertyName":"pushType","type":"string","length":"","comment":"鎺ㄩ�佺被鍨�","nullable":false,"defaultValue":"weight","dict":["weight","health_gps","vehicle_gps","driver_anomaly","others"],"source":"a.pushType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"errorMessage","type":"text","length":"","comment":"閿欒杩斿洖淇℃伅","nullable":true,"source":"a.errorMessage"}]}},{"prefix":"/admin/push/cameragps","name":"PushCameraGpsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"string","length":"","comment":"瀹氫綅绮惧害","nullable":false,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"sn","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.sn"}]}},{"prefix":"/admin/push/devicealarm","name":"PushDevicealarmEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"devSerial","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.devSerial"},{"propertyName":"departmentName","type":"string","length":"","comment":"閮ㄩ棬鍚嶇О","nullable":false,"source":"c.name"}]}},{"prefix":"/admin/push/deviceonoff","name":"PushDeviceOnoffEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"deviceId","type":"string","length":"","comment":"璁惧ID","nullable":false,"source":"a.deviceId"},{"propertyName":"subSerial","type":"string","length":"","comment":"瀛愬簭鍒楀彿","nullable":true,"source":"a.subSerial"},{"propertyName":"deviceName","type":"string","length":"","comment":"璁惧鍚嶇О","nullable":true,"source":"a.deviceName"}]}},{"prefix":"/admin/push/siteweight","name":"PushSiteweightEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"deviceNo","type":"string","length":"","comment":"璁惧鍙�","nullable":false,"source":"a.deviceNo"},{"propertyName":"siteType","type":"string","length":"","comment":"绔欑偣绫诲瀷","nullable":false,"defaultValue":"鏀堕泦鐐�","dict":"sitetype","source":"d.siteType"}],"fieldLike":[{"propertyName":"deviceNo","type":"string","length":"","comment":"璁惧鍙�","nullable":false,"source":"a.deviceNo"}],"keyWordLikeFields":[]}},{"prefix":"/admin/push/sorteralarm","name":"PushSorterAlarmEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"number","length":"","comment":"鎵�灞炲崟浣�","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/push/sorterattendance","name":"PushSorterAttendanceEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"number","length":"","comment":"鎵�灞炲崟浣�","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/push/sortergps","name":"PushSorterGpsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"number","length":"","comment":"鎵�灞炲崟浣�","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/push/sorterhealth","name":"PushSorterHealthEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"number","length":"","comment":"鎵�灞炲崟浣�","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/push/vehiclegps","name":"PushVehicleGpsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"string","length":"","comment":"瀹氫綅绮惧害","nullable":false,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"sn","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.sn"},{"propertyName":"vehicleNo","type":"string","length":"","comment":"杞︾墝鍙�","nullable":true,"source":"a.vehicleNo"}]}},{"prefix":"/admin/push/weight","name":"PushWeightEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"deviceNo","type":"string","length":"","comment":"璁惧鍙�","nullable":false,"source":"a.deviceNo"},{"propertyName":"garbageType","type":"string","length":"","comment":"鍨冨溇绫诲瀷","nullable":false,"source":"a.garbageType"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/recycle/data","name":"RecycleDataEntity","api":[{"method":"post","path":"/restore"},{"method":"get","path":"/info"},{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"userName","type":"string","length":"","comment":"濮撳悕","nullable":true,"source":"b.name"},{"propertyName":"url","type":"string","length":"","comment":"璇锋眰鐨勬帴鍙�","nullable":true,"source":"a.url"}]}},{"prefix":"/admin/report/dailydepartment","name":"ReportDailyDepartmentEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"date","type":"date","length":"","comment":"鏃ユ湡","nullable":false,"source":"a.date"},{"propertyName":"departmentId","type":"number","length":"","comment":"閮ㄩ棬ID","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"departmentName","type":"string","length":"","comment":"閮ㄩ棬鍚嶇О","nullable":false,"source":"a.departmentName"}]}},{"prefix":"/admin/report/dailysite","name":"ReportDailysiteEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"date","type":"date","length":"","comment":"鏃ユ湡","nullable":false,"source":"a.date"},{"propertyName":"siteId","type":"number","length":"","comment":"绔欑偣ID","nullable":false,"source":"a.siteId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"siteName","type":"string","length":"","comment":"绔欑偣鍚嶇О","nullable":false,"source":"a.siteName"}]}},{"prefix":"/admin/report/dailysorter","name":"ReportDailySorterEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"date","type":"date","length":"","comment":"鏃ユ湡","nullable":false,"source":"a.date"},{"propertyName":"businessId","type":"string","length":"32","comment":"韬唤璇佸彿","nullable":false,"source":"a.businessId"},{"propertyName":"attendanceStatus","type":"string","length":"","comment":"鑰冨嫟鐘舵��","nullable":false,"defaultValue":"缂哄崱","dict":["姝e父","杩熷埌","鏃╅��","缂哄崱","鏃峰伐"],"source":"a.attendanceStatus"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessName","type":"string","length":"64","comment":"濮撳悕","nullable":true,"source":"a.businessName"},{"propertyName":"businessId","type":"string","length":"32","comment":"韬唤璇佸彿","nullable":false,"source":"a.businessId"}]}},{"prefix":"/admin/report/dailyvehicle","name":"ReportDailyVehicleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"date","type":"date","length":"","comment":"鏃ユ湡","nullable":false,"source":"a.date"},{"propertyName":"vehicleNo","type":"string","length":"32","comment":"杞︾墝鍙�","nullable":false,"source":"a.vehicleNo"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"vehicleNo","type":"string","length":"32","comment":"杞︾墝鍙�","nullable":false,"source":"a.vehicleNo"}]}},{"prefix":"/admin/report/joblog","name":"ReportJoblogEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"dataDate","type":"date","length":"","comment":"鏁版嵁鐩爣鏃ユ湡","nullable":false,"source":"a.dataDate"},{"propertyName":"status","type":"enum","length":"","comment":"鐘舵��: 鏈紑濮�, 杩愯涓�, 鎴愬姛, 澶辫触","nullable":false,"defaultValue":"INIT","source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"jobName","type":"string","length":"","comment":"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)","nullable":false,"source":"a.jobName"}]}},{"prefix":"/admin/report/screen","name":"","api":[{"method":"post","path":"/query"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/shop/recycleappointment","name":"RecycleAppointmentEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"string","length":"","comment":"鐘舵��","nullable":false,"defaultValue":"鏂板","dict":["鏂板","寰呭鏍�","寰呮帴鍗�","宸茬‘璁�","宸叉帴鍗�","涓婇棬涓�","宸插畬鎴�","宸插彇娑�","鏈煡"],"source":"a.status"},{"propertyName":"departmentId","type":"number","length":"","comment":"瀛︽牎ID","nullable":true,"source":"a.departmentId"},{"propertyName":"sorterId","type":"string","length":"","comment":"鍒嗘嫞鍛業D","nullable":true,"defaultValue":0,"source":"a.sorterId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"appointmentNo","type":"string","length":"","comment":"棰勭害缂栧彿","nullable":false,"source":"a.appointmentNo"},{"propertyName":"contactName","type":"string","length":"","comment":"鑱旂郴浜�","nullable":false,"source":"a.contactName"},{"propertyName":"contactPhone","type":"string","length":"","comment":"鑱旂郴鐢佃瘽","nullable":false,"source":"a.contactPhone"}]}},{"prefix":"/admin/shop/recycleappointmentlog","name":"RecycleAppointmentLogEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"appointmentId","type":"number","length":"","comment":"棰勭害ID","nullable":false,"source":"a.appointmentId"},{"propertyName":"action","type":"string","length":"","comment":"鎿嶄綔绫诲瀷","nullable":false,"dict":["鍒涘缓棰勭害","瀹℃牳閫氳繃","鍒嗛厤浜哄憳","纭","鎺ュ崟","鍒拌揪","寮�濮嬪洖鏀�","瀹屾垚","鍙栨秷","鏀规湡"],"source":"a.action"},{"propertyName":"operatorType","type":"string","length":"","comment":"鎿嶄綔浜虹被鍨�","nullable":false,"source":"a.operatorType"},{"propertyName":"operatorId","type":"number","length":"","comment":"鎿嶄綔浜篒D","nullable":false,"source":"a.operatorId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/shop/recycleitem","name":"RecycleItemEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"itemId","type":"string","length":"","comment":"鍒嗙被ID","nullable":false,"source":"a.itemId"},{"propertyName":"category","type":"string","length":"","comment":"搴熷搧绫诲埆缂栫爜","nullable":false,"source":"a.category"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["鍚敤","绂佺敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/shop/recycleorder","name":"RecycleOrderEntity","api":[{"method":"post","path":"/saveWithSummary"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"orderType","type":"string","length":"","comment":"璁㈠崟绫诲瀷","nullable":false,"defaultValue":"鐜板満","dict":["鐜板満","棰勭害","澶у睆","娲诲姩","鎵撳崱"],"source":"a.orderType"},{"propertyName":"status","type":"string","length":"","comment":"鐘舵��","nullable":false,"defaultValue":"宸插畬鎴�","dict":["寰呭鐞�","杩涜涓�","宸插畬鎴�","宸插彇娑�"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"orderNo","type":"string","length":"","comment":"璁㈠崟缂栧彿","nullable":false,"source":"a.orderNo"}]}},{"prefix":"/admin/shop/recycleorderitem","name":"RecycleOrderItemEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"orderNo","type":"string","length":"","comment":"璁㈠崟NO","nullable":false,"source":"a.orderNo"},{"propertyName":"itemId","type":"string","length":"","comment":"鍨冨溇鍒嗙被ID","nullable":false,"source":"a.itemId"}],"fieldLike":[{"propertyName":"itemName","type":"string","length":"","comment":"鍨冨溇鍒嗙被鍚嶇О","nullable":false,"source":"a.itemName"}],"keyWordLikeFields":[]}},{"prefix":"/admin/shop/transaction","name":"RecycleTransactionEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"remark","type":"string","length":"","comment":"澶囨敞","nullable":true,"source":"a.remark"}]}},{"prefix":"/admin/space/info","name":"SpaceInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"type","type":"string","length":"","comment":"绫诲瀷","nullable":false,"source":"a.type"},{"propertyName":"classifyId","type":"number","length":"","comment":"鍒嗙被ID","nullable":true,"source":"a.classifyId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/space/type","name":"SpaceTypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/task/info","name":"TaskInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/start"},{"method":"post","path":"/once"},{"method":"post","path":"/stop"},{"method":"get","path":"/info"},{"method":"post","path":"/page"},{"method":"get","path":"/log"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-鍋滄 1-杩愯","nullable":false,"defaultValue":1,"source":"a.status"},{"propertyName":"type","type":"number","length":"","comment":"鐘舵�� 0-绯荤粺 1-鐢ㄦ埛","nullable":false,"defaultValue":0,"source":"a.type"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/user/address","name":"UserAddressEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/user/info","name":"UserInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":1,"dict":["绂佺敤","姝e父","宸叉敞閿�"],"source":"a.status"},{"propertyName":"gender","type":"number","length":"","comment":"鎬у埆","nullable":false,"defaultValue":0,"dict":["鏈煡","鐢�","濂�"],"source":"a.gender"},{"propertyName":"loginType","type":"number","length":"","comment":"鐧诲綍鏂瑰紡","nullable":false,"defaultValue":0,"dict":["灏忕▼搴�","鍏紬鍙�","H5"],"source":"a.loginType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"a.nickName"},{"propertyName":"phone","type":"string","length":"","comment":"鎵嬫満鍙�","nullable":true,"source":"a.phone"}]}}]
\ No newline at end of file
+[{"prefix":"/admin/app/complain","name":"AppComplainEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-鏈鐞� 1-宸插鐞�","nullable":false,"defaultValue":0,"source":"a.status"},{"propertyName":"type","type":"number","length":"","comment":"绫诲瀷","nullable":false,"source":"a.type"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"contact","type":"string","length":"","comment":"鑱旂郴鏂瑰紡","nullable":false,"source":"a.contact"},{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"b.nickName"},{"propertyName":"handlerName","type":"string","length":"","comment":"濮撳悕","nullable":true,"source":"c.name"}]}},{"prefix":"/admin/app/feedback","name":"AppFeedbackEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-鏈鐞� 1-宸插鐞�","nullable":false,"defaultValue":0,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"contact","type":"string","length":"","comment":"鑱旂郴鏂瑰紡","nullable":false,"source":"a.contact"},{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"b.nickName"},{"propertyName":"handlerName","type":"string","length":"","comment":"濮撳悕","nullable":true,"source":"c.name"}]}},{"prefix":"/admin/app/goods","name":"AppGoodsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-绂佺敤 1-鍚敤","nullable":false,"defaultValue":1,"source":"a.status"},{"propertyName":"type","type":"number","length":"","comment":"绫诲瀷 0-澶� 1-鏈� 2-骞� 3-姘镐箙","nullable":false,"defaultValue":0,"source":"a.type"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"title","type":"string","length":"","comment":"鏍囬","nullable":false,"source":"a.title"}]}},{"prefix":"/admin/app/version","name":"AppVersionEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-绂佺敤 1-鍚敤","nullable":false,"defaultValue":1,"source":"a.status"},{"propertyName":"type","type":"number","length":"","comment":"绫诲瀷","nullable":false,"defaultValue":0,"source":"a.type"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"version","type":"string","length":"","comment":"鐗堟湰鍙�","nullable":false,"source":"a.version"}]}},{"prefix":"/admin/base/coding","name":"","api":[{"method":"get","path":"/getModuleTree"},{"method":"post","path":"/createCode"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/comm","name":"","api":[{"method":"post","path":"/personUpdate"},{"method":"get","path":"/uploadMode"},{"method":"get","path":"/permmenu"},{"method":"get","path":"/program"},{"method":"get","path":"/person"},{"method":"post","path":"/upload"},{"method":"post","path":"/logout"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/open","name":"","api":[{"method":"get","path":"/refreshToken"},{"method":"get","path":"/captcha"},{"method":"post","path":"/login"},{"method":"get","path":"/html"},{"method":"get","path":"/eps"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/department","name":"BaseSysDepartmentEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/order"},{"method":"post","path":"/list"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/log","name":"BaseSysLogEntity","api":[{"method":"post","path":"/setKeep"},{"method":"get","path":"/getKeep"},{"method":"post","path":"/clear"},{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"濮撳悕","nullable":true,"source":"b.name"},{"propertyName":"action","type":"string","length":"","comment":"琛屼负","nullable":false,"source":"a.action"},{"propertyName":"ip","type":"string","length":"","comment":"ip","nullable":true,"source":"a.ip"}]}},{"prefix":"/admin/base/sys/menu","name":"BaseSysMenuEntity","api":[{"method":"post","path":"/create"},{"method":"post","path":"/export"},{"method":"post","path":"/import"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/parse"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/base/sys/param","name":"BaseSysParamEntity","api":[{"method":"get","path":"/stringbykey"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/html"},{"method":"get","path":"/info"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"dataType","type":"number","length":"","comment":"鏁版嵁绫诲瀷 0-瀛楃涓� 1-瀵屾枃鏈� 2-鏂囦欢 ","nullable":false,"defaultValue":0,"source":"a.dataType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"keyName","type":"string","length":"","comment":"閿�","nullable":false,"source":"a.keyName"}]}},{"prefix":"/admin/base/sys/role","name":"BaseSysRoleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"label","type":"string","length":"50","comment":"瑙掕壊鏍囩","nullable":true,"source":"a.label"}]}},{"prefix":"/admin/base/sys/user","name":"BaseSysUserEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/move"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/basicdata/buyer","name":"BasicdataBuyerEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"bigint","length":"","comment":"閮ㄩ棬ID","nullable":true,"source":"a.departmentId"},{"propertyName":"name","type":"string","length":"200","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"contact","type":"string","length":"50","comment":"鑱旂郴浜�","nullable":true,"source":"a.contact"}],"fieldLike":[{"propertyName":"name","type":"string","length":"200","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"address","type":"string","length":"255","comment":"鍦板潃","nullable":true,"source":"a.address"}],"keyWordLikeFields":[]}},{"prefix":"/admin/basicdata/driver","name":"BasicdataDriverEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"bigint","length":"","comment":"鎵�灞炲崟浣�","nullable":true,"source":"a.departmentId"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["婵�娲�","绂佺敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessId","type":"string","length":"64","comment":"韬唤璇佸彿","nullable":false,"source":"a.businessId"},{"propertyName":"phone","type":"string","length":"32","comment":"鎵嬫満鍙�","nullable":true,"source":"a.phone"},{"propertyName":"licenseNo","type":"string","length":"64","comment":"椹鹃┒璇佸彿","nullable":true,"source":"a.licenseNo"}]}},{"prefix":"/admin/basicdata/iot","name":"BasicdataIotEntity","api":[{"method":"post","path":"/getYsDevices"},{"method":"post","path":"/getSitelist"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"iotTypeCode","type":"string","length":"","comment":"缁堢绫诲瀷","nullable":false,"source":"a.iotTypeCode"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"iotName","type":"string","length":"","comment":"缁堢鍚嶇О","nullable":false,"source":"a.iotName"},{"propertyName":"iotCode","type":"string","length":"","comment":"缁堢缂栫爜","nullable":false,"source":"a.iotCode"}]}},{"prefix":"/admin/basicdata/site","name":"BasicdataSiteEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/basicdata/sorter","name":"BasicdataSorterEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["鍦ㄨ亴","绂昏亴","绂佺敤"],"source":"a.status"},{"propertyName":"departmentId","type":"bigint","length":"","comment":"鎵�灞炲崟浣�","nullable":true,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessName","type":"string","length":"64","comment":"濮撳悕","nullable":false,"source":"a.businessName"},{"propertyName":"businessId","type":"string","length":"32","comment":"韬唤璇佸彿","nullable":true,"source":"a.businessId"},{"propertyName":"phone","type":"string","length":"32","comment":"鎵嬫満鍙�","nullable":false,"source":"a.phone"}]}},{"prefix":"/admin/basicdata/vehicle","name":"BasicdataVehicleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"vehicleType","type":"string","length":"","comment":"杞﹀瀷","nullable":false,"defaultValue":"鍘㈠紡璐ц溅","dict":"vehicletype","source":"a.vehicleType"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["鍚敤","绂佺敤"],"source":"a.status"},{"propertyName":"departmentId","type":"bigint","length":"","comment":"鎵�灞炲崟浣�","nullable":true,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessId","type":"string","length":"32","comment":"杞︾墝鍙�","nullable":false,"source":"a.businessId"},{"propertyName":"defaultDriver","type":"bigint","length":"","comment":"榛樿鍙告満","nullable":true,"source":"a.defaultDriver"}]}},{"prefix":"/admin/basicdata/wastetype","name":"BasicdataWastetypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"isRecyclable","type":"number","length":"","comment":"鏄惁鍙洖鏀�","nullable":false,"defaultValue":0,"dict":["鍚�","鏄�"],"source":"a.isRecyclable"},{"propertyName":"status","type":"number","length":"","comment":"鏄惁鍚敤","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"},{"propertyName":"code","type":"string","length":"","comment":"浠g爜","nullable":false,"source":"a.code"}]}},{"prefix":"/admin/count/home","name":"","api":[{"method":"post","path":"/goodsCategory"},{"method":"post","path":"/orderSummary"},{"method":"post","path":"/userSummary"},{"method":"post","path":"/orderChart"},{"method":"post","path":"/userChart"},{"method":"post","path":"/goodsRank"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/cs/msg","name":"CsMsgEntity","api":[{"method":"get","path":"/unreadCount"},{"method":"post","path":"/read"},{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/cs/session","name":"CsSessionEntity","api":[{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/demo/goods","name":"DemoGoodsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":1,"dict":["绂佺敤","鍚敤"],"source":"a.status"}],"fieldLike":[{"propertyName":"title","type":"string","length":"50","comment":"鏍囬","nullable":false,"source":"a.title"}],"keyWordLikeFields":[{"propertyName":"description","type":"string","length":"","comment":"鎻忚堪","nullable":true,"source":"a.description"}]}},{"prefix":"/admin/demo/tenant","name":"DemoGoodsEntity","api":[{"method":"post","path":"/noTenant"},{"method":"post","path":"/noUse"},{"method":"post","path":"/use"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/dict/info","name":"DictInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/types"},{"method":"post","path":"/data"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/dict/type","name":"DictTypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/goods/comment","name":"GoodsCommentEntity","api":[{"method":"post","path":"/page"}],"search":{"fieldEq":[{"propertyName":"goodsId","type":"number","length":"","comment":"鍟嗗搧ID","nullable":false,"source":"a.goodsId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"content","type":"string","length":"","comment":"鍐呭","nullable":false,"source":"a.content"},{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"b.nickName"}]}},{"prefix":"/admin/goods/info","name":"GoodsInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-涓嬫灦 1-涓婃灦","nullable":false,"defaultValue":0,"source":"a.status"},{"propertyName":"typeId","type":"number","length":"","comment":"绫诲瀷ID","nullable":false,"source":"a.typeId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"title","type":"string","length":"","comment":"鏍囬","nullable":false,"source":"a.title"},{"propertyName":"subTitle","type":"string","length":"","comment":"鍓爣棰�","nullable":true,"source":"a.subTitle"}]}},{"prefix":"/admin/goods/searchKeyword","name":"GoodsSearchKeywordEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"}]}},{"prefix":"/admin/goods/spec","name":"GoodsSpecEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/goods/type","name":"GoodsTypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"parentId","type":"number","length":"","comment":"鐖禝D","nullable":true,"source":"a.parentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"name","type":"string","length":"","comment":"鍚嶇О","nullable":false,"source":"a.name"}]}},{"prefix":"/admin/info/banner","name":"InfoBannerEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 1:鍚敤 2:绂佺敤","nullable":false,"defaultValue":1,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/maps/live","name":"","api":[{"method":"post","path":"/vehicleOnline"},{"method":"post","path":"/vehicleEvents"},{"method":"post","path":"/sorterOnline"},{"method":"post","path":"/sorterHealth"},{"method":"post","path":"/vehicleTrack"},{"method":"post","path":"/sorterTrack"},{"method":"post","path":"/siteWeight"},{"method":"post","path":"/sites"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/market/coupon/info","name":"MarketCouponInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-绂佺敤 1-鍚敤","nullable":false,"defaultValue":0,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"title","type":"string","length":"","comment":"鏍囬","nullable":false,"source":"a.title"}]}},{"prefix":"/admin/market/coupon/user","name":"MarketCouponUserEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-鏈娇鐢� 1-宸蹭娇鐢�","nullable":false,"defaultValue":0,"source":"a.status"},{"propertyName":"couponId","type":"number","length":"","comment":"浼樻儬鍒窱D","nullable":false,"source":"a.couponId"},{"propertyName":"userId","type":"string","length":"","comment":"鐢ㄦ埛ID","nullable":false,"source":"a.userId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"b.nickName"}]}},{"prefix":"/admin/monitor/capturetask","name":"PushCaptureTaskEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"string","length":"","comment":"鎶撴媿鐘舵��","nullable":false,"defaultValue":"PENDING","dict":["PENDING","SUCCESS","FAILED"],"source":"a.status"},{"propertyName":"captureDate","type":"string","length":"","comment":"浠诲姟鎵ц鏃ユ湡","nullable":true,"source":"a.captureDate"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"deviceSerial","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.deviceSerial"},{"propertyName":"captureTaskId","type":"string","length":"","comment":"鎶撳浘浠诲姟ID(钀ょ煶杩斿洖)","nullable":true,"source":"a.captureTaskId"}]}},{"prefix":"/admin/monitor/ys7","name":"","api":[{"method":"post","path":"/getToken"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/operation/traderecord","name":"OperationTradeRecordEntity","api":[{"method":"post","path":"/import"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"transactionType","type":"string","length":"","comment":"浜ゆ槗绫诲瀷","nullable":true,"source":"a.transactionType"},{"propertyName":"incomeType","type":"string","length":"","comment":"鏀舵敮绫诲瀷","nullable":false,"defaultValue":"鏀跺叆","dict":["鏀跺叆","鏀嚭","鍏朵粬"],"source":"a.incomeType"},{"propertyName":"payMethod","type":"string","length":"","comment":"鏀粯鏂瑰紡","nullable":true,"source":"a.payMethod"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"goodsName","type":"string","length":"","comment":"鍟嗗搧鍚嶇О","nullable":true,"source":"a.goodsName"},{"propertyName":"opponent","type":"string","length":"","comment":"浜ゆ槗瀵规柟","nullable":true,"source":"a.opponent"}]}},{"prefix":"/admin/operation/wastesale","name":"OperationWastesaleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"bigint","length":"","comment":"閮ㄩ棬ID","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/order/info","name":"OrderInfoEntity","api":[{"method":"post","path":"/refundHandle"},{"method":"get","path":"/logistics"},{"method":"post","path":"/deliver"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"}],"search":{"fieldEq":[{"propertyName":"status","type":"tinyint","length":"","comment":"鐘舵�� 0-寰呬粯娆� 1-寰呭彂璐� 2-寰呮敹璐� 3-寰呰瘎浠� 4-浜ゆ槗瀹屾垚 5-閫�娆句腑 6-宸查��娆� 7-宸插叧闂�","nullable":false,"defaultValue":0,"source":"a.status"},{"propertyName":"payType","type":"number","length":"","comment":"鏀粯鏂瑰紡 0-寰呮敮浠� 1-寰俊 2-鏀粯瀹� 3-纰崇Н鍒�","nullable":false,"defaultValue":0,"source":"a.payType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"title","type":"string","length":"","comment":"鏍囬","nullable":true,"source":"a.title"},{"propertyName":"orderNum","type":"string","length":"","comment":"璁㈠崟鍙�","nullable":true,"source":"a.orderNum"},{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"b.nickName"}]}},{"prefix":"/admin/plugin/info","name":"PluginInfoEntity","api":[{"method":"post","path":"/install"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/push/auditlog","name":"PushAuditlogEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"deviceNo","type":"string","length":"","comment":"瀹㈡埛绔疘D","nullable":false,"source":"a.deviceNo"},{"propertyName":"pushType","type":"string","length":"","comment":"鎺ㄩ�佺被鍨�","nullable":false,"defaultValue":"weight","dict":["weight","health_gps","vehicle_gps","driver_anomaly","others"],"source":"a.pushType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"errorMessage","type":"text","length":"","comment":"閿欒杩斿洖淇℃伅","nullable":true,"source":"a.errorMessage"}]}},{"prefix":"/admin/push/cameragps","name":"PushCameraGpsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"string","length":"","comment":"瀹氫綅绮惧害","nullable":false,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"sn","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.sn"}]}},{"prefix":"/admin/push/devicealarm","name":"PushDevicealarmEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"devSerial","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.devSerial"},{"propertyName":"departmentName","type":"string","length":"","comment":"閮ㄩ棬鍚嶇О","nullable":false,"source":"c.name"}]}},{"prefix":"/admin/push/deviceonoff","name":"PushDeviceOnoffEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"deviceId","type":"string","length":"","comment":"璁惧ID","nullable":false,"source":"a.deviceId"},{"propertyName":"subSerial","type":"string","length":"","comment":"瀛愬簭鍒楀彿","nullable":true,"source":"a.subSerial"},{"propertyName":"deviceName","type":"string","length":"","comment":"璁惧鍚嶇О","nullable":true,"source":"a.deviceName"}]}},{"prefix":"/admin/push/siteweight","name":"PushSiteweightEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"deviceNo","type":"string","length":"","comment":"璁惧鍙�","nullable":false,"source":"a.deviceNo"},{"propertyName":"siteType","type":"string","length":"","comment":"绔欑偣绫诲瀷","nullable":false,"defaultValue":"鏀堕泦鐐�","dict":"sitetype","source":"d.siteType"}],"fieldLike":[{"propertyName":"deviceNo","type":"string","length":"","comment":"璁惧鍙�","nullable":false,"source":"a.deviceNo"}],"keyWordLikeFields":[]}},{"prefix":"/admin/push/sorteralarm","name":"PushSorterAlarmEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"number","length":"","comment":"鎵�灞炲崟浣�","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/push/sorterattendance","name":"PushSorterAttendanceEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"number","length":"","comment":"鎵�灞炲崟浣�","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/push/sortergps","name":"PushSorterGpsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"number","length":"","comment":"鎵�灞炲崟浣�","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/push/sorterhealth","name":"PushSorterHealthEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"departmentId","type":"number","length":"","comment":"鎵�灞炲崟浣�","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/push/vehiclegps","name":"PushVehicleGpsEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"string","length":"","comment":"瀹氫綅绮惧害","nullable":false,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"sn","type":"string","length":"","comment":"璁惧搴忓垪鍙�","nullable":false,"source":"a.sn"},{"propertyName":"vehicleNo","type":"string","length":"","comment":"杞︾墝鍙�","nullable":true,"source":"a.vehicleNo"}]}},{"prefix":"/admin/push/weight","name":"PushWeightEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"deviceNo","type":"string","length":"","comment":"璁惧鍙�","nullable":false,"source":"a.deviceNo"},{"propertyName":"garbageType","type":"string","length":"","comment":"鍨冨溇绫诲瀷","nullable":false,"source":"a.garbageType"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/recycle/data","name":"RecycleDataEntity","api":[{"method":"post","path":"/restore"},{"method":"get","path":"/info"},{"method":"post","path":"/page"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"userName","type":"string","length":"","comment":"濮撳悕","nullable":true,"source":"b.name"},{"propertyName":"url","type":"string","length":"","comment":"璇锋眰鐨勬帴鍙�","nullable":true,"source":"a.url"}]}},{"prefix":"/admin/report/dailydepartment","name":"ReportDailyDepartmentEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"date","type":"date","length":"","comment":"鏃ユ湡","nullable":false,"source":"a.date"},{"propertyName":"departmentId","type":"number","length":"","comment":"閮ㄩ棬ID","nullable":false,"source":"a.departmentId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"departmentName","type":"string","length":"","comment":"閮ㄩ棬鍚嶇О","nullable":false,"source":"a.departmentName"}]}},{"prefix":"/admin/report/dailysite","name":"ReportDailysiteEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"date","type":"date","length":"","comment":"鏃ユ湡","nullable":false,"source":"a.date"},{"propertyName":"siteId","type":"number","length":"","comment":"绔欑偣ID","nullable":false,"source":"a.siteId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"siteName","type":"string","length":"","comment":"绔欑偣鍚嶇О","nullable":false,"source":"a.siteName"}]}},{"prefix":"/admin/report/dailysorter","name":"ReportDailySorterEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"date","type":"date","length":"","comment":"鏃ユ湡","nullable":false,"source":"a.date"},{"propertyName":"businessId","type":"string","length":"32","comment":"韬唤璇佸彿","nullable":false,"source":"a.businessId"},{"propertyName":"attendanceStatus","type":"string","length":"","comment":"鑰冨嫟鐘舵��","nullable":false,"defaultValue":"缂哄崱","dict":["姝e父","杩熷埌","鏃╅��","缂哄崱","鏃峰伐"],"source":"a.attendanceStatus"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"businessName","type":"string","length":"64","comment":"濮撳悕","nullable":true,"source":"a.businessName"},{"propertyName":"businessId","type":"string","length":"32","comment":"韬唤璇佸彿","nullable":false,"source":"a.businessId"}]}},{"prefix":"/admin/report/dailyvehicle","name":"ReportDailyVehicleEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"date","type":"date","length":"","comment":"鏃ユ湡","nullable":false,"source":"a.date"},{"propertyName":"vehicleNo","type":"string","length":"32","comment":"杞︾墝鍙�","nullable":false,"source":"a.vehicleNo"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"vehicleNo","type":"string","length":"32","comment":"杞︾墝鍙�","nullable":false,"source":"a.vehicleNo"}]}},{"prefix":"/admin/report/joblog","name":"ReportJoblogEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"dataDate","type":"date","length":"","comment":"鏁版嵁鐩爣鏃ユ湡","nullable":false,"source":"a.dataDate"},{"propertyName":"status","type":"enum","length":"","comment":"鐘舵��: 鏈紑濮�, 杩愯涓�, 鎴愬姛, 澶辫触","nullable":false,"defaultValue":"INIT","source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"jobName","type":"string","length":"","comment":"浠诲姟绫诲瀷: SITE_DAILY(绔欑偣鏃ユ眹鎬�), DEPT_DAILY(閮ㄩ棬鏃ユ眹鎬�)","nullable":false,"source":"a.jobName"}]}},{"prefix":"/admin/report/screen","name":"","api":[{"method":"post","path":"/query"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/shop/recycleappointment","name":"RecycleAppointmentEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"string","length":"","comment":"鐘舵��","nullable":false,"defaultValue":"鏂板","dict":["鏂板","寰呭鏍�","寰呮帴鍗�","宸茬‘璁�","宸叉帴鍗�","涓婇棬涓�","宸插畬鎴�","宸插彇娑�","鏈煡"],"source":"a.status"},{"propertyName":"departmentId","type":"number","length":"","comment":"瀛︽牎ID","nullable":true,"source":"a.departmentId"},{"propertyName":"sorterId","type":"string","length":"","comment":"鍒嗘嫞鍛業D","nullable":true,"defaultValue":0,"source":"a.sorterId"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"appointmentNo","type":"string","length":"","comment":"棰勭害缂栧彿","nullable":false,"source":"a.appointmentNo"},{"propertyName":"contactName","type":"string","length":"","comment":"鑱旂郴浜�","nullable":false,"source":"a.contactName"},{"propertyName":"contactPhone","type":"string","length":"","comment":"鑱旂郴鐢佃瘽","nullable":false,"source":"a.contactPhone"}]}},{"prefix":"/admin/shop/recycleappointmentlog","name":"RecycleAppointmentLogEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"appointmentId","type":"number","length":"","comment":"棰勭害ID","nullable":false,"source":"a.appointmentId"},{"propertyName":"action","type":"string","length":"","comment":"鎿嶄綔绫诲瀷","nullable":false,"dict":["鍒涘缓棰勭害","瀹℃牳閫氳繃","鍒嗛厤浜哄憳","纭","鎺ュ崟","鍒拌揪","寮�濮嬪洖鏀�","瀹屾垚","鍙栨秷","鏀规湡"],"source":"a.action"},{"propertyName":"operatorType","type":"string","length":"","comment":"鎿嶄綔浜虹被鍨�","nullable":false,"source":"a.operatorType"},{"propertyName":"operatorId","type":"number","length":"","comment":"鎿嶄綔浜篒D","nullable":false,"source":"a.operatorId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/shop/recycleitem","name":"RecycleItemEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"itemId","type":"string","length":"","comment":"鍒嗙被ID","nullable":false,"source":"a.itemId"},{"propertyName":"category","type":"string","length":"","comment":"搴熷搧绫诲埆缂栫爜","nullable":false,"source":"a.category"},{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":0,"dict":["鍚敤","绂佺敤"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/shop/recycleorder","name":"RecycleOrderEntity","api":[{"method":"post","path":"/saveWithSummary"},{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"orderType","type":"string","length":"","comment":"璁㈠崟绫诲瀷","nullable":false,"defaultValue":"鐜板満","dict":["鐜板満","棰勭害","澶у睆","娲诲姩","鎵撳崱"],"source":"a.orderType"},{"propertyName":"status","type":"string","length":"","comment":"鐘舵��","nullable":false,"defaultValue":"宸插畬鎴�","dict":["寰呭鐞�","杩涜涓�","宸插畬鎴�","宸插彇娑�"],"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"orderNo","type":"string","length":"","comment":"璁㈠崟缂栧彿","nullable":false,"source":"a.orderNo"}]}},{"prefix":"/admin/shop/recycleorderitem","name":"RecycleOrderItemEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"orderNo","type":"string","length":"","comment":"璁㈠崟NO","nullable":false,"source":"a.orderNo"},{"propertyName":"itemId","type":"string","length":"","comment":"鍨冨溇鍒嗙被ID","nullable":false,"source":"a.itemId"}],"fieldLike":[{"propertyName":"itemName","type":"string","length":"","comment":"鍨冨溇鍒嗙被鍚嶇О","nullable":false,"source":"a.itemName"}],"keyWordLikeFields":[]}},{"prefix":"/admin/shop/transaction","name":"RecycleTransactionEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"remark","type":"string","length":"","comment":"澶囨敞","nullable":true,"source":"a.remark"}]}},{"prefix":"/admin/space/info","name":"SpaceInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"type","type":"string","length":"","comment":"绫诲瀷","nullable":false,"source":"a.type"},{"propertyName":"classifyId","type":"number","length":"","comment":"鍒嗙被ID","nullable":true,"source":"a.classifyId"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/space/type","name":"SpaceTypeEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/task/info","name":"TaskInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"post","path":"/start"},{"method":"post","path":"/once"},{"method":"post","path":"/stop"},{"method":"get","path":"/info"},{"method":"post","path":"/page"},{"method":"get","path":"/log"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵�� 0-鍋滄 1-杩愯","nullable":false,"defaultValue":1,"source":"a.status"},{"propertyName":"type","type":"number","length":"","comment":"鐘舵�� 0-绯荤粺 1-鐢ㄦ埛","nullable":false,"defaultValue":0,"source":"a.type"}],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/user/address","name":"UserAddressEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/user/info","name":"UserInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"鐘舵��","nullable":false,"defaultValue":1,"dict":["绂佺敤","姝e父","宸叉敞閿�"],"source":"a.status"},{"propertyName":"gender","type":"number","length":"","comment":"鎬у埆","nullable":false,"defaultValue":0,"dict":["鏈煡","鐢�","濂�"],"source":"a.gender"},{"propertyName":"loginType","type":"number","length":"","comment":"鐧诲綍鏂瑰紡","nullable":false,"defaultValue":0,"dict":["灏忕▼搴�","鍏紬鍙�","H5"],"source":"a.loginType"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"nickName","type":"string","length":"","comment":"鏄电О","nullable":true,"source":"a.nickName"},{"propertyName":"phone","type":"string","length":"","comment":"鎵嬫満鍙�","nullable":true,"source":"a.phone"}]}}]
\ No newline at end of file
diff --git a/src/modules/maps/components/map-board.vue b/src/modules/maps/components/map-board.vue
new file mode 100644
index 0000000..68b7a76
--- /dev/null
+++ b/src/modules/maps/components/map-board.vue
@@ -0,0 +1,137 @@
+<template>
+	<div class="map-board">
+		<aside class="map-board__side">
+			<div class="map-board__side-head">
+				<slot name="side-head" />
+			</div>
+			<div class="map-board__side-body">
+				<slot name="side" />
+			</div>
+		</aside>
+		<div class="map-board__map">
+			<slot name="map" />
+			<div v-if="$slots.legend" class="map-board__legend">
+				<slot name="legend" />
+			</div>
+		</div>
+		<aside v-if="open" class="map-board__panel">
+			<div class="map-board__panel-head">
+				<div>
+					<div class="map-board__panel-title">{{ title }}</div>
+					<div v-if="sub" class="map-board__panel-sub">{{ sub }}</div>
+				</div>
+				<el-button text @click="$emit('close')">鍏抽棴</el-button>
+			</div>
+			<div class="map-board__panel-body">
+				<slot name="panel" />
+			</div>
+		</aside>
+	</div>
+</template>
+
+<script lang="ts" setup>
+defineProps<{
+	open?: boolean;
+	title?: string;
+	sub?: string;
+}>();
+
+defineEmits(['close']);
+</script>
+
+<style lang="scss" scoped>
+.map-board {
+	display: flex;
+	height: 100%;
+	min-height: calc(100vh - 140px);
+	background: var(--el-bg-color-page);
+	gap: 10px;
+
+	&__side {
+		width: 260px;
+		flex-shrink: 0;
+		display: flex;
+		flex-direction: column;
+		border: 1px solid var(--el-border-color-extra-light);
+		border-radius: 10px;
+		background: var(--el-bg-color);
+		overflow: hidden;
+	}
+
+	&__side-head {
+		padding: 12px;
+		border-bottom: 1px solid var(--el-border-color-extra-light);
+	}
+
+	&__side-body {
+		flex: 1;
+		overflow: auto;
+	}
+
+	&__map {
+		flex: 1;
+		min-width: 0;
+		position: relative;
+		border-radius: 10px;
+		overflow: hidden;
+		border: 1px solid var(--el-border-color-extra-light);
+	}
+
+	&__legend {
+		position: absolute;
+		left: 12px;
+		bottom: 12px;
+		z-index: 20;
+		padding: 8px 10px;
+		border-radius: 8px;
+		background: rgba(255, 255, 255, 0.92);
+		box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
+		font-size: 12px;
+	}
+
+	&__panel {
+		width: 420px;
+		flex-shrink: 0;
+		display: flex;
+		flex-direction: column;
+		border: 1px solid var(--el-border-color-extra-light);
+		border-radius: 10px;
+		background: var(--el-bg-color);
+		overflow: hidden;
+	}
+
+	&__panel-head {
+		display: flex;
+		align-items: flex-start;
+		justify-content: space-between;
+		gap: 8px;
+		padding: 12px 14px;
+		border-bottom: 1px solid var(--el-border-color-extra-light);
+	}
+
+	&__panel-title {
+		font-size: 16px;
+		font-weight: 700;
+		color: var(--el-text-color-primary);
+	}
+
+	&__panel-sub {
+		margin-top: 4px;
+		font-size: 12px;
+		color: var(--el-text-color-secondary);
+	}
+
+	&__panel-body {
+		flex: 1;
+		min-height: 0;
+		overflow: auto;
+		padding: 0 12px 12px;
+	}
+}
+
+:deep(.tdt-container),
+:deep(.mapDiv) {
+	width: 100%;
+	height: 100%;
+}
+</style>
diff --git a/src/modules/maps/components/track-toolbar.vue b/src/modules/maps/components/track-toolbar.vue
new file mode 100644
index 0000000..d6fe8b1
--- /dev/null
+++ b/src/modules/maps/components/track-toolbar.vue
@@ -0,0 +1,110 @@
+<template>
+	<div class="track-bar">
+		<el-popover v-model:visible="open" placement="bottom-start" :width="340" trigger="click">
+			<template #reference>
+				<el-button :icon="Setting" circle size="small" />
+			</template>
+			<div class="track-bar__form">
+				<div class="track-bar__label">鏌ヨ鏃舵</div>
+				<el-date-picker
+					v-model="range"
+					type="datetimerange"
+					start-placeholder="寮�濮嬫椂闂�"
+					end-placeholder="缁撴潫鏃堕棿"
+					format="YYYY-MM-DD HH:mm"
+					value-format="YYYY-MM-DD HH:mm:ss"
+					size="small"
+				/>
+				<div class="track-bar__actions">
+					<el-button size="small" @click="open = false">鍙栨秷</el-button>
+					<el-button type="primary" size="small" @click="confirm">鏌ヨ杞ㄨ抗</el-button>
+				</div>
+			</div>
+		</el-popover>
+		<el-button size="small" :disabled="!hasTrack" @click="$emit(playing ? 'pause' : 'play')">
+			{{ playing ? '鏆傚仠' : '鎾斁' }}
+		</el-button>
+		<el-button size="small" :disabled="!hasTrack" @click="$emit('stop')">鍋滄</el-button>
+		<span class="track-bar__speed">{{ speed }}x</span>
+		<el-slider v-model="speedModel" :min="1" :max="30" :step="1" class="track-bar__slider" />
+		<el-progress :percentage="progress" :stroke-width="6" class="track-bar__progress" />
+	</div>
+</template>
+
+<script lang="ts" setup>
+import { computed, ref, watch } from 'vue';
+import { Setting } from '@element-plus/icons-vue';
+
+const props = defineProps<{
+	playing?: boolean;
+	speed?: number;
+	progress?: number;
+	hasTrack?: boolean;
+	startTime?: string;
+	endTime?: string;
+}>();
+
+const emit = defineEmits(['update:speed', 'play', 'pause', 'stop', 'query']);
+
+const open = ref(false);
+const range = ref<[string, string] | null>(null);
+const speedModel = computed({
+	get: () => props.speed || 5,
+	set: v => emit('update:speed', v)
+});
+
+watch(
+	() => [props.startTime, props.endTime],
+	() => {
+		if (props.startTime && props.endTime) range.value = [props.startTime, props.endTime];
+	},
+	{ immediate: true }
+);
+
+function confirm() {
+	if (!range.value) return;
+	emit('query', range.value);
+	open.value = false;
+}
+</script>
+
+<style lang="scss" scoped>
+.track-bar {
+	display: flex;
+	align-items: center;
+	gap: 8px;
+	padding: 8px 0 4px;
+
+	&__slider {
+		width: 96px;
+	}
+
+	&__speed {
+		font-size: 12px;
+		color: var(--el-text-color-secondary);
+		min-width: 28px;
+	}
+
+	&__progress {
+		flex: 1;
+		min-width: 80px;
+	}
+
+	&__form {
+		display: flex;
+		flex-direction: column;
+		gap: 8px;
+	}
+
+	&__label {
+		font-size: 12px;
+		color: var(--el-text-color-secondary);
+	}
+
+	&__actions {
+		display: flex;
+		justify-content: flex-end;
+		gap: 8px;
+	}
+}
+</style>
diff --git a/src/modules/maps/config.ts b/src/modules/maps/config.ts
new file mode 100644
index 0000000..5951dc7
--- /dev/null
+++ b/src/modules/maps/config.ts
@@ -0,0 +1,29 @@
+import { type ModuleConfig } from '/@/cool';
+
+export default (): ModuleConfig => {
+	return {
+		label: '鍦板浘鐩戞帶',
+		description: '绔欑偣銆佸垎鎷e憳銆佽溅杈嗗疄鏃朵綅缃笌鍘嗗彶杞ㄨ抗',
+		order: 8,
+		views: [
+			{
+				path: '/maps/site',
+				name: 'maps-site',
+				meta: { label: '绔欑偣鍦板浘' },
+				component: () => import('./views/site.vue')
+			},
+			{
+				path: '/maps/sorter',
+				name: 'maps-sorter',
+				meta: { label: '鍒嗘嫞鍛樹綅缃�' },
+				component: () => import('./views/sorter.vue')
+			},
+			{
+				path: '/maps/vehicle',
+				name: 'maps-vehicle',
+				meta: { label: '杞﹁締浣嶇疆' },
+				component: () => import('./views/vehicle.vue')
+			}
+		]
+	};
+};
diff --git a/src/modules/maps/hooks/use-map.ts b/src/modules/maps/hooks/use-map.ts
new file mode 100644
index 0000000..5f91ca5
--- /dev/null
+++ b/src/modules/maps/hooks/use-map.ts
@@ -0,0 +1,92 @@
+import type { LngLat } from 'vue-tianditu2';
+import { useCool } from '/@/cool';
+
+export const MAP_TK = '51915011aa0997aa2ddd7e38504fa8bc';
+export const MAP_LOAD = { v: '4.0', tk: MAP_TK };
+export const DEFAULT_CENTER: LngLat = [121.280637, 32.125178];
+
+export function pinIcon(color: string) {
+	const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="28" height="40" viewBox="0 0 28 40"><path fill="${color}" stroke="#fff" stroke-width="1.5" d="M14 1C7.4 1 2 6.4 2 13c0 8.8 12 25 12 25s12-16.2 12-25C26 6.4 20.6 1 14 1z"/><circle cx="14" cy="13" r="5" fill="#fff"/></svg>`;
+	return {
+		iconUrl: 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg),
+		iconSize: [28, 40] as [number, number],
+		iconAnchor: [14, 40] as [number, number]
+	};
+}
+
+export const SITE_ICONS = {
+	鏀堕泦鐐�: pinIcon('#16a34a'),
+	鍘嬬缉绔�: pinIcon('#f59e0b'),
+	default: pinIcon('#3b82f6')
+};
+
+export function siteIcon(type: string) {
+	if (type === '鍘嬬缉绔�') return SITE_ICONS.鍘嬬缉绔�;
+	if (type === '鏀堕泦鐐�') return SITE_ICONS.鏀堕泦鐐�;
+	return SITE_ICONS.default;
+}
+
+export const SORTER_ICON = pinIcon('#2563eb');
+export const VEHICLE_ICON = pinIcon('#7c3aed');
+export const PLAY_ICON = pinIcon('#ef4444');
+
+export function useMapsApi() {
+	const { service } = useCool();
+
+	function call(name: string, data?: Record<string, any>) {
+		const api = (service as any).maps?.live?.[name];
+		if (typeof api === 'function') {
+			return api.call((service as any).maps.live, data);
+		}
+		return service.request({
+			url: `admin/maps/live/${name}`,
+			method: 'POST',
+			data
+		});
+	}
+
+	return {
+		sites: () => call('sites'),
+		siteWeight: (data: { businessId: string; startTime: string; endTime: string }) => call('siteWeight', data),
+		sorterOnline: () => call('sorterOnline'),
+		sorterTrack: (data: { idCard: string; startTime: string; endTime: string }) => call('sorterTrack', data),
+		sorterHealth: (idCard: string) => call('sorterHealth', { idCard }),
+		vehicleOnline: () => call('vehicleOnline'),
+		vehicleTrack: (data: { vehicleNo: string; startTime: string; endTime: string }) => call('vehicleTrack', data),
+		vehicleEvents: (vehicleNo: string) => call('vehicleEvents', { vehicleNo })
+	};
+}
+
+export async function fetchYsToken(service: any) {
+	const res = await service.base.sys.param.stringbykey({ key: 'ys7.accessToken' });
+	return (res as string) || '';
+}
+
+export function formatTime(v: any) {
+	if (!v) return '-';
+	const d = new Date(v);
+	if (Number.isNaN(d.getTime())) return String(v);
+	const p = (n: number) => String(n).padStart(2, '0');
+	return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;
+}
+
+export function dayRange(offsetEnd = 0, offsetStart = 0) {
+	const end = new Date();
+	end.setHours(23, 59, 59, 999);
+	if (offsetEnd) end.setTime(end.getTime() + offsetEnd);
+	const start = new Date();
+	start.setHours(0, 0, 0, 0);
+	if (offsetStart) start.setTime(start.getTime() + offsetStart);
+	return { start, end };
+}
+
+export function lastHours(hours = 1) {
+	const end = new Date();
+	const start = new Date(end.getTime() - hours * 3600 * 1000);
+	return { start, end };
+}
+
+export function toStamp(v: any) {
+	const t = new Date(v).getTime();
+	return Number.isFinite(t) ? t : 0;
+}
diff --git a/src/modules/maps/hooks/use-track.ts b/src/modules/maps/hooks/use-track.ts
new file mode 100644
index 0000000..0ce5628
--- /dev/null
+++ b/src/modules/maps/hooks/use-track.ts
@@ -0,0 +1,97 @@
+import { onBeforeUnmount, ref, type Ref } from 'vue';
+import type { LngLat } from 'vue-tianditu2';
+import { toStamp } from '../hooks/use-map';
+
+export type TrackPoint = { longitude: number; latitude: number; time?: any; speed?: number };
+
+export function useTrackPlayback(points: Ref<TrackPoint[]>) {
+	const playing = ref(false);
+	const speed = ref(5);
+	const progress = ref(0);
+	const playPos = ref<LngLat | null>(null);
+	let raf = 0;
+	let startedAt = 0;
+	let elapsed = 0;
+
+	function path(): LngLat[] {
+		return points.value
+			.filter(p => Number(p.longitude) && Number(p.latitude))
+			.map(p => [Number(p.longitude), Number(p.latitude)] as LngLat);
+	}
+
+	function duration() {
+		const list = points.value;
+		if (list.length < 2) return 8000;
+		const t0 = toStamp(list[0].time);
+		const t1 = toStamp(list[list.length - 1].time);
+		const real = t1 > t0 ? t1 - t0 : list.length * 2000;
+		return Math.max(real, 4000);
+	}
+
+	function at(ratio: number): LngLat | null {
+		const list = path();
+		if (!list.length) return null;
+		if (list.length === 1) return list[0];
+		const times = points.value.map((p, i) => toStamp(p.time) || i * 1000);
+		const t0 = times[0];
+		const t1 = times[times.length - 1];
+		const span = Math.max(t1 - t0, 1);
+		const target = t0 + span * ratio;
+		let i = 0;
+		while (i < times.length - 1 && times[i + 1] < target) i += 1;
+		const a = list[i];
+		const b = list[Math.min(i + 1, list.length - 1)];
+		const seg = Math.max(times[Math.min(i + 1, times.length - 1)] - times[i], 1);
+		const k = Math.min(Math.max((target - times[i]) / seg, 0), 1);
+		return [a[0] + (b[0] - a[0]) * k, a[1] + (b[1] - a[1]) * k];
+	}
+
+	function tick(now: number) {
+		if (!playing.value) return;
+		const total = duration() / Math.max(speed.value, 1);
+		elapsed += now - startedAt;
+		startedAt = now;
+		const ratio = Math.min(elapsed / total, 1);
+		progress.value = Math.round(ratio * 100);
+		playPos.value = at(ratio);
+		if (ratio >= 1) {
+			playing.value = false;
+			return;
+		}
+		raf = requestAnimationFrame(tick);
+	}
+
+	function play() {
+		if (!points.value.length) return;
+		if (progress.value >= 100) {
+			progress.value = 0;
+			elapsed = 0;
+		}
+		playing.value = true;
+		startedAt = performance.now();
+		raf = requestAnimationFrame(tick);
+	}
+
+	function pause() {
+		playing.value = false;
+		cancelAnimationFrame(raf);
+	}
+
+	function stop() {
+		pause();
+		elapsed = 0;
+		progress.value = 0;
+		playPos.value = points.value.length
+			? [Number(points.value[0].longitude), Number(points.value[0].latitude)]
+			: null;
+	}
+
+	function reset() {
+		stop();
+		playPos.value = null;
+	}
+
+	onBeforeUnmount(pause);
+
+	return { playing, speed, progress, playPos, path, play, pause, stop, reset };
+}
diff --git a/src/modules/maps/views/layers.vue b/src/modules/maps/views/layers.vue
deleted file mode 100644
index 5bcbe23..0000000
--- a/src/modules/maps/views/layers.vue
+++ /dev/null
@@ -1,84 +0,0 @@
-<!--App.vue-->
-<template>
-    <div :class="state.copyright ? '' : 'hide-copyright'" class="mapDiv">
-        <tdt-map :center="state.center" :controls="state.controls" :zoom="state.zoom" :loadConfig="loadConfig">
-            <tdt-control :visible="state.visible" position="topright">
-            </tdt-control>
-        </tdt-map>
-    </div>
-</template>
-
-<script lang="ts" setup>
-import { reactive } from "vue";
-import { TdtMap, type LngLat } from "vue-tianditu2";
-
-const loadConfig = { v: "4.0", tk: "51915011aa0997aa2ddd7e38504fa8bc" };
-const state = reactive({
-    center: [121.280637, 32.125178] as LngLat,
-    zoom: 12,
-    visible: true,
-    copyright: false,
-    controls: [
-        "Zoom",
-        "Scale",
-        {
-            name: "MapType",
-            position: "topright",
-            mapTypes: [
-                {
-                    title: "鍦板浘", //鍦板浘鎺т欢涓婃墍瑕佹樉绀虹殑鍥惧眰鍚嶇О
-                    icon: "https://api.tianditu.gov.cn/v4.0/image/map/maptype/vector.png", //鍦板浘鎺т欢涓婃墍瑕佹樉绀虹殑鍥惧眰鍥炬爣锛堥粯璁ゅ浘鏍囧ぇ灏� 80x80锛�
-                    layer: "TMAP_NORMAL_MAP" //鍦板浘绫诲瀷锛屽湪鍘熷ぉ鍦板浘api涓互window.TMAP_NORMAL_MAP琛ㄧず锛屾澶勪负瀛楃涓�
-                },
-                {
-                    title: "鍗槦",
-                    icon: " https://api.tianditu.gov.cn/v4.0/image/map/maptype/satellite.png",
-                    layer: "TMAP_SATELLITE_MAP"
-                },
-                {
-                    title: "鍗槦娣峰悎",
-                    icon: "https://api.tianditu.gov.cn/v4.0/image/map/maptype/satellitepoi.png",
-                    layer: "TMAP_HYBRID_MAP"
-                }
-                // {
-                //   title: "鍦板舰",
-                //   icon: "https://api.tianditu.gov.cn/v4.0/image/map/maptype/terrain.png",
-                //   layer: "TMAP_TERRAIN_MAP"
-                // },
-                // {
-                //   title: "鍦板舰娣峰悎",
-                //   icon: "https://api.tianditu.gov.cn/v4.0/image/map/maptype/terrainpoi.png",
-                //   layer: "TMAP_TERRAIN_HYBRID_MAP"
-                // }
-            ]
-        },
-        {
-            name: "OverviewMap",
-            isOpen: true,
-            anchor: "bottomright"
-        },
-        {
-            name: "Copyright",
-            id: "custom",
-            content: `<div style="height:40px"><button class="demo-button">鑷畾涔夌殑鐗堟潈鎺т欢</button></div>`,
-            position: "bottomleft",
-            bounds: [
-                [113.52791, 23.21989],
-                [113.03352, 23.03045]
-            ]
-        }
-    ]
-});
-</script>
-
-<style>
-.mapDiv {
-    width: 100%;
-    height: 100%;
-    padding: 0%;
-}
-
-.hide-copyright :deep(.tdt-control-copyright.tdt-control > div:not(.tdt-control-copyright)) {
-    display: none;
-}
-</style>
\ No newline at end of file
diff --git a/src/modules/maps/views/site.vue b/src/modules/maps/views/site.vue
new file mode 100644
index 0000000..4a0bd59
--- /dev/null
+++ b/src/modules/maps/views/site.vue
@@ -0,0 +1,296 @@
+<template>
+	<map-board :open="!!current" :title="current?.businessName" :sub="current?.siteType" @close="current = null">
+		<template #side-head>
+			<el-input v-model="keyword" placeholder="鎼滅储绔欑偣" clearable size="small" />
+			<div class="filters">
+				<el-checkbox-group v-model="types" size="small">
+					<el-checkbox value="鏀堕泦鐐�" label="鏀堕泦鐐�">鏀堕泦鐐�</el-checkbox>
+					<el-checkbox value="鍘嬬缉绔�" label="鍘嬬缉绔�">鍘嬬缉绔�</el-checkbox>
+				</el-checkbox-group>
+			</div>
+		</template>
+		<template #side>
+			<div
+				v-for="item in visibleSites"
+				:key="item.id"
+				class="list-item"
+				:class="{ 'is-active': current?.id === item.id }"
+				@click="select(item)"
+			>
+				<i :style="{ background: item.siteType === '鍘嬬缉绔�' ? '#f59e0b' : '#16a34a' }" />
+				<div>
+					<div class="list-item__name">{{ item.businessName }}</div>
+					<div class="list-item__meta">{{ item.siteType }} 路 {{ item.address || '鏃犲湴鍧�' }}</div>
+				</div>
+			</div>
+			<el-empty v-if="!visibleSites.length" description="鏆傛棤绔欑偣" :image-size="64" />
+		</template>
+		<template #legend>
+			<div class="legend"><i style="background:#16a34a" />鏀堕泦鐐�</div>
+			<div class="legend"><i style="background:#f59e0b" />鍘嬬缉绔�</div>
+		</template>
+		<template #map>
+			<div class="mapDiv">
+				<tdt-map :center="center" :zoom="zoom" :controls="controls" :loadConfig="MAP_LOAD">
+					<tdt-marker
+						v-for="item in visibleSites"
+						:key="item.id"
+						:position="pos(item)"
+						:icon="siteIcon(item.siteType)"
+						:title="item.businessName"
+						@click="select(item)"
+					/>
+				</tdt-map>
+			</div>
+		</template>
+		<template #panel>
+			<el-tabs v-model="tab">
+				<el-tab-pane label="鍩烘湰灞炴��" name="info">
+					<el-descriptions :column="1" border size="small">
+						<el-descriptions-item label="绔欑偣缂栫爜">{{ current?.businessId }}</el-descriptions-item>
+						<el-descriptions-item label="鍚嶇О">{{ current?.businessName }}</el-descriptions-item>
+						<el-descriptions-item label="绫诲瀷">{{ current?.siteType }}</el-descriptions-item>
+						<el-descriptions-item label="鍦板潃">{{ current?.address || '-' }}</el-descriptions-item>
+						<el-descriptions-item label="璐熻矗浜�">{{ current?.leader || '-' }}</el-descriptions-item>
+						<el-descriptions-item label="缁忕含搴�">{{ current?.longitude }}, {{ current?.latitude }}</el-descriptions-item>
+						<el-descriptions-item label="澶囨敞">{{ current?.remark || '-' }}</el-descriptions-item>
+					</el-descriptions>
+					<cl-image v-if="current?.photo" :src="current.photo" style="margin-top: 10px; width: 100%" />
+				</el-tab-pane>
+				<el-tab-pane label="瀹炴椂鐩戞帶" name="live">
+					<el-empty v-if="!cameras.length" description="璇ョ珯鐐规病鏈夊叧鑱旂洃鎺�" :image-size="72" />
+					<div v-for="dev in cameras" :key="dev.id" class="cam">
+						<div class="cam__name">{{ dev.iotName || dev.iotCode }}</div>
+						<ezuikit-player
+							v-if="ysToken"
+							:key="'p_' + dev.id + '_' + ysToken"
+							:container-id="'site_player_' + dev.id"
+							:access-token="ysToken"
+							:url="`ezopen://open.ys7.com/${dev.iotCode}/1.hd.live`"
+						/>
+					</div>
+				</el-tab-pane>
+				<el-tab-pane label="绉伴噸鍘嗗彶" name="weight">
+					<div class="weight-tools">
+						<span>榛樿褰撳ぉ</span>
+						<el-popover v-model:visible="weightOpen" placement="bottom-end" :width="340" trigger="click">
+							<template #reference>
+								<el-button :icon="Setting" circle size="small" />
+							</template>
+							<div class="weight-form">
+								<el-date-picker
+									v-model="weightRange"
+									type="datetimerange"
+									start-placeholder="寮�濮嬫椂闂�"
+									end-placeholder="缁撴潫鏃堕棿"
+									format="YYYY-MM-DD HH:mm"
+									value-format="YYYY-MM-DD HH:mm:ss"
+									size="small"
+								/>
+								<div class="weight-form__actions">
+									<el-button size="small" @click="weightOpen = false">鍙栨秷</el-button>
+									<el-button type="primary" size="small" @click="queryWeight()">鏌ヨ</el-button>
+								</div>
+							</div>
+						</el-popover>
+					</div>
+					<el-table :data="weights" size="small" height="360" stripe>
+						<el-table-column prop="uploadTime" label="鏃堕棿" min-width="150">
+							<template #default="{ row }">{{ formatTime(row.uploadTime) }}</template>
+						</el-table-column>
+						<el-table-column prop="garbageName" label="绉嶇被" min-width="90">
+							<template #default="{ row }">{{ row.garbageName || row.garbageType }}</template>
+						</el-table-column>
+						<el-table-column prop="weight" label="閲嶉噺kg" width="80" />
+						<el-table-column prop="deviceNo" label="璁惧" min-width="90" />
+					</el-table>
+				</el-tab-pane>
+			</el-tabs>
+		</template>
+	</map-board>
+</template>
+
+<script lang="ts" setup>
+defineOptions({ name: 'maps-layers' });
+
+import { computed, onMounted, ref } from 'vue';
+import { Setting } from '@element-plus/icons-vue';
+import { TdtMap, TdtMarker, type LngLat } from 'vue-tianditu2';
+import { useCool } from '/@/cool';
+import EzuikitPlayer from '../../ezuikit/components/ezuikit-player.vue';
+import MapBoard from '../components/map-board.vue';
+import {
+	DEFAULT_CENTER,
+	MAP_LOAD,
+	siteIcon,
+	fetchYsToken,
+	formatTime,
+	useMapsApi
+} from '../hooks/use-map';
+
+const { service } = useCool();
+const api = useMapsApi();
+
+const sites = ref<any[]>([]);
+const keyword = ref('');
+const types = ref(['鏀堕泦鐐�', '鍘嬬缉绔�']);
+const current = ref<any>(null);
+const center = ref<LngLat>(DEFAULT_CENTER);
+const zoom = ref(12);
+const tab = ref('info');
+const cameras = ref<any[]>([]);
+const ysToken = ref('');
+const weights = ref<any[]>([]);
+const weightOpen = ref(false);
+const weightRange = ref<[string, string] | null>(null);
+
+const controls = ['Zoom', 'Scale', { name: 'MapType', position: 'topright' }];
+
+const visibleSites = computed(() =>
+	sites.value.filter(e => {
+		if (!types.value.includes(e.siteType)) return false;
+		if (!keyword.value) return true;
+		const k = keyword.value.toLowerCase();
+		return [e.businessName, e.businessId, e.address].some(v => String(v || '').toLowerCase().includes(k));
+	})
+);
+
+function pos(item: any): LngLat {
+	return [Number(item.longitude), Number(item.latitude)];
+}
+
+function todayRange() {
+	const d = new Date();
+	const p = (n: number) => String(n).padStart(2, '0');
+	const day = `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;
+	return [`${day} 00:00:00`, `${day} 23:59:59`] as [string, string];
+}
+
+async function select(item: any) {
+	current.value = item;
+	center.value = pos(item);
+	zoom.value = 16;
+	tab.value = 'info';
+	cameras.value = [];
+	weights.value = [];
+	weightRange.value = todayRange();
+	if (!ysToken.value) {
+		try {
+			ysToken.value = await fetchYsToken(service);
+		} catch {}
+	}
+	try {
+		cameras.value = (await service.basicdata.iot.getYsDevices({ businessId: item.businessId })) || [];
+	} catch {
+		cameras.value = [];
+	}
+	await queryWeight();
+}
+
+async function queryWeight() {
+	if (!current.value) return;
+	weightOpen.value = false;
+	const range = weightRange.value || todayRange();
+	weights.value = (await api.siteWeight({
+		businessId: current.value.businessId,
+		startTime: range[0],
+		endTime: range[1]
+	})) || [];
+}
+
+onMounted(async () => {
+	sites.value = (await api.sites()) || [];
+	const first = visibleSites.value[0];
+	if (first) {
+		center.value = pos(first);
+		zoom.value = 13;
+	}
+});
+</script>
+
+<style lang="scss" scoped>
+.filters {
+	margin-top: 8px;
+}
+
+.list-item {
+	display: flex;
+	gap: 8px;
+	padding: 10px 12px;
+	cursor: pointer;
+	border-bottom: 1px solid var(--el-border-color-extra-light);
+
+	i {
+		width: 8px;
+		height: 8px;
+		margin-top: 6px;
+		border-radius: 50%;
+		flex-shrink: 0;
+	}
+
+	&:hover,
+	&.is-active {
+		background: var(--el-color-primary-light-9);
+	}
+
+	&__name {
+		font-size: 13px;
+		font-weight: 600;
+	}
+
+	&__meta {
+		margin-top: 2px;
+		font-size: 12px;
+		color: var(--el-text-color-secondary);
+	}
+}
+
+.legend {
+	display: flex;
+	align-items: center;
+	gap: 6px;
+	margin: 2px 0;
+
+	i {
+		width: 8px;
+		height: 8px;
+		border-radius: 50%;
+	}
+}
+
+.cam {
+	margin-bottom: 12px;
+
+	&__name {
+		margin-bottom: 6px;
+		font-size: 13px;
+		color: var(--el-text-color-regular);
+	}
+}
+
+.weight-tools {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	margin: 8px 0;
+	font-size: 12px;
+	color: var(--el-text-color-secondary);
+}
+
+.weight-form {
+	display: flex;
+	flex-direction: column;
+	gap: 8px;
+
+	&__actions {
+		display: flex;
+		justify-content: flex-end;
+		gap: 8px;
+	}
+}
+
+.mapDiv {
+	width: 100%;
+	height: 100%;
+}
+</style>
diff --git a/src/modules/maps/views/sorter.vue b/src/modules/maps/views/sorter.vue
new file mode 100644
index 0000000..1b1f845
--- /dev/null
+++ b/src/modules/maps/views/sorter.vue
@@ -0,0 +1,267 @@
+<template>
+	<map-board :open="!!current" :title="current?.name" :sub="current?.idCard" @close="close">
+		<template #side-head>
+			<el-input v-model="keyword" placeholder="鎼滅储鍒嗘嫞鍛�" clearable size="small" />
+			<div class="hint">鏈�杩� 15 鍒嗛挓鏈� GPS 瑙嗕负鍦ㄧ嚎 路 {{ list.length }} 浜�</div>
+		</template>
+		<template #side>
+			<div
+				v-for="item in visibleList"
+				:key="item.idCard"
+				class="list-item"
+				:class="{ 'is-active': current?.idCard === item.idCard }"
+				@click="select(item)"
+			>
+				<i />
+				<div>
+					<div class="list-item__name">{{ item.name || item.idCard }}</div>
+					<div class="list-item__meta">{{ formatTime(item.uploadTime) }} 路 {{ item.speed || 0 }} km/h</div>
+				</div>
+			</div>
+			<el-empty v-if="!visibleList.length" description="褰撳墠娌℃湁鍦ㄧ嚎鍒嗘嫞鍛�" :image-size="64" />
+		</template>
+		<template #legend>
+			<div class="legend"><i style="background:#2563eb" />鍦ㄧ嚎鍒嗘嫞鍛�</div>
+			<div class="legend"><i style="background:#ef4444" />杞ㄨ抗鍥炴斁</div>
+		</template>
+		<template #map>
+			<div class="mapDiv">
+				<tdt-map :center="center" :zoom="zoom" :controls="controls" :loadConfig="MAP_LOAD">
+					<tdt-marker
+						v-for="item in visibleList"
+						:key="item.idCard"
+						:position="pos(item)"
+						:icon="SORTER_ICON"
+						:title="item.name"
+						@click="select(item)"
+					/>
+					<tdt-polyline v-if="trackPath.length" :path="trackPath" color="#16a34a" :weight="4" :opacity="0.85" />
+					<tdt-marker v-if="playPos" :position="playPos" :icon="PLAY_ICON" title="鍥炴斁浣嶇疆" />
+				</tdt-map>
+			</div>
+		</template>
+		<template #panel>
+			<el-tabs v-model="tab">
+				<el-tab-pane label="鍩烘湰淇℃伅" name="info">
+					<el-descriptions :column="1" border size="small">
+						<el-descriptions-item label="濮撳悕">{{ current?.name }}</el-descriptions-item>
+						<el-descriptions-item label="韬唤璇�">{{ current?.idCard }}</el-descriptions-item>
+						<el-descriptions-item label="鎵嬫満">{{ current?.phone || '-' }}</el-descriptions-item>
+						<el-descriptions-item label="宸ヤ綔绔欑偣">{{ current?.workSiteId || '-' }}</el-descriptions-item>
+						<el-descriptions-item label="褰撳墠閫熷害">{{ current?.speed || 0 }} km/h</el-descriptions-item>
+						<el-descriptions-item label="瀹氫綅鏃堕棿">{{ formatTime(current?.uploadTime) }}</el-descriptions-item>
+					</el-descriptions>
+				</el-tab-pane>
+				<el-tab-pane label="鍋ュ悍涓婃姤" name="health">
+					<el-table :data="health.recent" size="small" height="220" stripe>
+						<el-table-column label="鏃堕棿" min-width="140">
+							<template #default="{ row }">{{ formatTime(row.uploadTime) }}</template>
+						</el-table-column>
+						<el-table-column prop="temperature" label="浣撴俯" width="64" />
+						<el-table-column prop="heartRate" label="蹇冪巼" width="64" />
+						<el-table-column label="琛�鍘�" width="80">
+							<template #default="{ row }">{{ row.bloodPressureHigh || '-' }}/{{ row.bloodPressureLow || '-' }}</template>
+						</el-table-column>
+						<el-table-column prop="bloodOxygen" label="琛�姘�" width="64" />
+						<el-table-column prop="dataType" label="绫诲瀷" width="64" />
+					</el-table>
+					<div class="block-title">寮傚父涓婃姤</div>
+					<el-table :data="health.abnormal" size="small" height="160" stripe>
+						<el-table-column label="鏃堕棿" min-width="140">
+							<template #default="{ row }">{{ formatTime(row.uploadTime) }}</template>
+						</el-table-column>
+						<el-table-column prop="temperature" label="浣撴俯" width="64" />
+						<el-table-column prop="heartRate" label="蹇冪巼" width="64" />
+						<el-table-column prop="dataType" label="绫诲瀷" width="64" />
+					</el-table>
+					<div class="block-title">鍋ュ悍鍛婅</div>
+					<el-table :data="health.alarms" size="small" height="160" stripe>
+						<el-table-column label="鏃堕棿" min-width="140">
+							<template #default="{ row }">{{ formatTime(row.uploadTime) }}</template>
+						</el-table-column>
+						<el-table-column prop="alarmType" label="绫诲瀷" min-width="80" />
+						<el-table-column prop="alarmLevel" label="绾у埆" width="70" />
+						<el-table-column prop="content" label="鍐呭" min-width="120" show-overflow-tooltip />
+					</el-table>
+				</el-tab-pane>
+				<el-tab-pane label="鍘嗗彶杞ㄨ抗" name="track">
+					<track-toolbar
+						v-model:speed="speed"
+						:playing="playing"
+						:progress="progress"
+						:has-track="trackPoints.length > 1"
+						:start-time="trackStart"
+						:end-time="trackEnd"
+						@play="play"
+						@pause="pause"
+						@stop="stop"
+						@query="onQueryTrack"
+					/>
+					<div class="hint">榛樿鏈�杩� 1 灏忔椂锛屽洖鏀鹃粯璁� 5 鍊嶉��</div>
+				</el-tab-pane>
+			</el-tabs>
+		</template>
+	</map-board>
+</template>
+
+<script lang="ts" setup>
+defineOptions({ name: 'maps-sorter' });
+
+import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
+import { TdtMap, TdtMarker, TdtPolyline, type LngLat } from 'vue-tianditu2';
+import MapBoard from '../components/map-board.vue';
+import TrackToolbar from '../components/track-toolbar.vue';
+import { DEFAULT_CENTER, MAP_LOAD, PLAY_ICON, SORTER_ICON, formatTime, lastHours, useMapsApi } from '../hooks/use-map';
+import { useTrackPlayback, type TrackPoint } from '../hooks/use-track';
+
+const api = useMapsApi();
+const list = ref<any[]>([]);
+const keyword = ref('');
+const current = ref<any>(null);
+const center = ref<LngLat>(DEFAULT_CENTER);
+const zoom = ref(12);
+const tab = ref('info');
+const health = ref<{ recent: any[]; abnormal: any[]; alarms: any[] }>({ recent: [], abnormal: [], alarms: [] });
+const trackPoints = ref<TrackPoint[]>([]);
+const trackStart = ref('');
+const trackEnd = ref('');
+const { playing, speed, progress, playPos, path, play, pause, stop, reset } = useTrackPlayback(trackPoints);
+const trackPath = computed(() => path());
+const controls = ['Zoom', 'Scale', { name: 'MapType', position: 'topright' }];
+let timer: number;
+
+const visibleList = computed(() => {
+	if (!keyword.value) return list.value;
+	const k = keyword.value.toLowerCase();
+	return list.value.filter(e => [e.name, e.idCard, e.phone].some(v => String(v || '').toLowerCase().includes(k)));
+});
+
+function pos(item: any): LngLat {
+	return [Number(item.longitude), Number(item.latitude)];
+}
+
+function fmt(d: Date) {
+	const p = (n: number) => String(n).padStart(2, '0');
+	return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;
+}
+
+async function loadOnline() {
+	list.value = (await api.sorterOnline()) || [];
+	if (!current.value && list.value[0]) {
+		center.value = pos(list.value[0]);
+		zoom.value = 13;
+	}
+}
+
+async function select(item: any) {
+	current.value = item;
+	center.value = pos(item);
+	zoom.value = 16;
+	tab.value = 'info';
+	reset();
+	const { start, end } = lastHours(1);
+	trackStart.value = fmt(start);
+	trackEnd.value = fmt(end);
+	const [h, track] = await Promise.all([
+		api.sorterHealth(item.idCard),
+		api.sorterTrack({ idCard: item.idCard, startTime: trackStart.value, endTime: trackEnd.value })
+	]);
+	health.value = h || { recent: [], abnormal: [], alarms: [] };
+	trackPoints.value = track || [];
+	if (trackPoints.value.length) {
+		playPos.value = pos(trackPoints.value[0] as any);
+	}
+}
+
+async function onQueryTrack(range: [string, string]) {
+	if (!current.value) return;
+	trackStart.value = range[0];
+	trackEnd.value = range[1];
+	reset();
+	trackPoints.value = (await api.sorterTrack({
+		idCard: current.value.idCard,
+		startTime: range[0],
+		endTime: range[1]
+	})) || [];
+}
+
+function close() {
+	current.value = null;
+	reset();
+	trackPoints.value = [];
+}
+
+onMounted(async () => {
+	await loadOnline();
+	timer = window.setInterval(loadOnline, 30000);
+});
+
+onBeforeUnmount(() => clearInterval(timer));
+</script>
+
+<style lang="scss" scoped>
+.hint {
+	margin-top: 8px;
+	font-size: 12px;
+	color: var(--el-text-color-secondary);
+	line-height: 1.4;
+}
+
+.list-item {
+	display: flex;
+	gap: 8px;
+	padding: 10px 12px;
+	cursor: pointer;
+	border-bottom: 1px solid var(--el-border-color-extra-light);
+
+	i {
+		width: 8px;
+		height: 8px;
+		margin-top: 6px;
+		border-radius: 50%;
+		background: #22c55e;
+		flex-shrink: 0;
+	}
+
+	&:hover,
+	&.is-active {
+		background: var(--el-color-primary-light-9);
+	}
+
+	&__name {
+		font-size: 13px;
+		font-weight: 600;
+	}
+
+	&__meta {
+		margin-top: 2px;
+		font-size: 12px;
+		color: var(--el-text-color-secondary);
+	}
+}
+
+.legend {
+	display: flex;
+	align-items: center;
+	gap: 6px;
+	margin: 2px 0;
+	font-size: 12px;
+
+	i {
+		width: 8px;
+		height: 8px;
+		border-radius: 50%;
+	}
+}
+
+.block-title {
+	margin: 12px 0 6px;
+	font-size: 13px;
+	font-weight: 600;
+}
+
+.mapDiv {
+	width: 100%;
+	height: 100%;
+}
+</style>
diff --git a/src/modules/maps/views/vehicle.vue b/src/modules/maps/views/vehicle.vue
new file mode 100644
index 0000000..458484b
--- /dev/null
+++ b/src/modules/maps/views/vehicle.vue
@@ -0,0 +1,285 @@
+<template>
+	<map-board :open="!!current" :title="current?.vehicleNo" :sub="current?.vehicleType" @close="close">
+		<template #side-head>
+			<el-input v-model="keyword" placeholder="鎼滅储杞︾墝" clearable size="small" />
+			<div class="hint">鏈�杩� 15 鍒嗛挓鏈� GPS 瑙嗕负鍦ㄧ嚎 路 {{ list.length }} 杈�</div>
+		</template>
+		<template #side>
+			<div
+				v-for="item in visibleList"
+				:key="item.vehicleNo"
+				class="list-item"
+				:class="{ 'is-active': current?.vehicleNo === item.vehicleNo }"
+				@click="select(item)"
+			>
+				<i />
+				<div>
+					<div class="list-item__name">{{ item.vehicleNo }}</div>
+					<div class="list-item__meta">{{ formatTime(item.gpsTime) }} 路 {{ item.speed || 0 }} km/h</div>
+				</div>
+			</div>
+			<el-empty v-if="!visibleList.length" description="褰撳墠娌℃湁鍦ㄧ嚎杞﹁締" :image-size="64" />
+		</template>
+		<template #legend>
+			<div class="legend"><i style="background:#7c3aed" />鍦ㄧ嚎杞﹁締</div>
+			<div class="legend"><i style="background:#ef4444" />杞ㄨ抗鍥炴斁</div>
+		</template>
+		<template #map>
+			<div class="mapDiv">
+				<tdt-map :center="center" :zoom="zoom" :controls="controls" :loadConfig="MAP_LOAD">
+					<tdt-marker
+						v-for="item in visibleList"
+						:key="item.vehicleNo"
+						:position="pos(item)"
+						:icon="VEHICLE_ICON"
+						:title="item.vehicleNo"
+						@click="select(item)"
+					/>
+					<tdt-polyline v-if="trackPath.length" :path="trackPath" color="#7c3aed" :weight="4" :opacity="0.85" />
+					<tdt-marker v-if="playPos" :position="playPos" :icon="PLAY_ICON" title="鍥炴斁浣嶇疆" />
+				</tdt-map>
+			</div>
+		</template>
+		<template #panel>
+			<el-tabs v-model="tab">
+				<el-tab-pane label="鍩烘湰淇℃伅" name="info">
+					<el-descriptions :column="1" border size="small">
+						<el-descriptions-item label="杞︾墝">{{ current?.vehicleNo }}</el-descriptions-item>
+						<el-descriptions-item label="杞﹀瀷">{{ current?.vehicleType || '-' }}</el-descriptions-item>
+						<el-descriptions-item label="杞介噸">{{ current?.capacityTon || '-' }} 鍚�</el-descriptions-item>
+						<el-descriptions-item label="璁惧鍙�">{{ current?.sn || '-' }}</el-descriptions-item>
+						<el-descriptions-item label="褰撳墠閫熷害">{{ current?.speed || 0 }} km/h</el-descriptions-item>
+						<el-descriptions-item label="瀹氫綅鏃堕棿">{{ formatTime(current?.gpsTime) }}</el-descriptions-item>
+					</el-descriptions>
+				</el-tab-pane>
+				<el-tab-pane label="鍙告満琛屼负" name="event">
+					<el-table :data="events" size="small" height="280" stripe>
+						<el-table-column label="鏃堕棿" min-width="140">
+							<template #default="{ row }">{{ formatTime(row.alarmTime || row.createTime) }}</template>
+						</el-table-column>
+						<el-table-column prop="alarmType" label="绫诲瀷" min-width="90" />
+						<el-table-column prop="describe" label="鎻忚堪" min-width="120" show-overflow-tooltip />
+						<el-table-column prop="deviceName" label="璁惧" min-width="90" show-overflow-tooltip />
+					</el-table>
+				</el-tab-pane>
+				<el-tab-pane label="杞﹁浇鐩戞帶" name="live">
+					<el-empty v-if="!cameras.length" description="璇ヨ溅杈嗘病鏈夊叧鑱旇溅杞芥憚鍍忓ご" :image-size="72" />
+					<div v-for="dev in cameras" :key="dev.id" class="cam">
+						<div class="cam__name">{{ dev.iotName || dev.iotCode }}</div>
+						<ezuikit-player
+							v-if="ysToken"
+							:key="'v_' + dev.id + '_' + ysToken"
+							:container-id="'vehicle_player_' + dev.id"
+							:access-token="ysToken"
+							:url="`ezopen://open.ys7.com/${dev.iotCode}/1.hd.live`"
+						/>
+					</div>
+				</el-tab-pane>
+				<el-tab-pane label="鍘嗗彶杞ㄨ抗" name="track">
+					<track-toolbar
+						v-model:speed="speed"
+						:playing="playing"
+						:progress="progress"
+						:has-track="trackPoints.length > 1"
+						:start-time="trackStart"
+						:end-time="trackEnd"
+						@play="play"
+						@pause="pause"
+						@stop="stop"
+						@query="onQueryTrack"
+					/>
+					<div class="hint">榛樿鏈�杩� 1 灏忔椂锛屽洖鏀鹃粯璁� 5 鍊嶉��</div>
+				</el-tab-pane>
+			</el-tabs>
+		</template>
+	</map-board>
+</template>
+
+<script lang="ts" setup>
+defineOptions({ name: 'maps-vehicle' });
+
+import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
+import { TdtMap, TdtMarker, TdtPolyline, type LngLat } from 'vue-tianditu2';
+import { useCool } from '/@/cool';
+import EzuikitPlayer from '../../ezuikit/components/ezuikit-player.vue';
+import MapBoard from '../components/map-board.vue';
+import TrackToolbar from '../components/track-toolbar.vue';
+import {
+	DEFAULT_CENTER,
+	MAP_LOAD,
+	PLAY_ICON,
+	VEHICLE_ICON,
+	fetchYsToken,
+	formatTime,
+	lastHours,
+	useMapsApi
+} from '../hooks/use-map';
+import { useTrackPlayback, type TrackPoint } from '../hooks/use-track';
+
+const { service } = useCool();
+const api = useMapsApi();
+const list = ref<any[]>([]);
+const keyword = ref('');
+const current = ref<any>(null);
+const center = ref<LngLat>(DEFAULT_CENTER);
+const zoom = ref(12);
+const tab = ref('info');
+const events = ref<any[]>([]);
+const cameras = ref<any[]>([]);
+const ysToken = ref('');
+const trackPoints = ref<TrackPoint[]>([]);
+const trackStart = ref('');
+const trackEnd = ref('');
+const { playing, speed, progress, playPos, path, play, pause, stop, reset } = useTrackPlayback(trackPoints);
+const trackPath = computed(() => path());
+const controls = ['Zoom', 'Scale', { name: 'MapType', position: 'topright' }];
+let timer: number;
+
+const visibleList = computed(() => {
+	if (!keyword.value) return list.value;
+	const k = keyword.value.toLowerCase();
+	return list.value.filter(e => String(e.vehicleNo || '').toLowerCase().includes(k));
+});
+
+function pos(item: any): LngLat {
+	return [Number(item.longitude), Number(item.latitude)];
+}
+
+function fmt(d: Date) {
+	const p = (n: number) => String(n).padStart(2, '0');
+	return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;
+}
+
+async function loadOnline() {
+	list.value = (await api.vehicleOnline()) || [];
+	if (!current.value && list.value[0]) {
+		center.value = pos(list.value[0]);
+		zoom.value = 13;
+	}
+}
+
+async function select(item: any) {
+	current.value = item;
+	center.value = pos(item);
+	zoom.value = 16;
+	tab.value = 'info';
+	reset();
+	cameras.value = [];
+	events.value = [];
+	const { start, end } = lastHours(1);
+	trackStart.value = fmt(start);
+	trackEnd.value = fmt(end);
+	if (!ysToken.value) {
+		try {
+			ysToken.value = await fetchYsToken(service);
+		} catch {}
+	}
+	const [ev, cam, track] = await Promise.all([
+		api.vehicleEvents(item.vehicleNo),
+		service.basicdata.iot.getYsDevices({ businessId: item.vehicleNo }).catch(() => []),
+		api.vehicleTrack({ vehicleNo: item.vehicleNo, startTime: trackStart.value, endTime: trackEnd.value })
+	]);
+	events.value = ev || [];
+	cameras.value = cam || [];
+	trackPoints.value = track || [];
+	if (trackPoints.value.length) {
+		playPos.value = [Number(trackPoints.value[0].longitude), Number(trackPoints.value[0].latitude)];
+	}
+}
+
+async function onQueryTrack(range: [string, string]) {
+	if (!current.value) return;
+	trackStart.value = range[0];
+	trackEnd.value = range[1];
+	reset();
+	trackPoints.value = (await api.vehicleTrack({
+		vehicleNo: current.value.vehicleNo,
+		startTime: range[0],
+		endTime: range[1]
+	})) || [];
+}
+
+function close() {
+	current.value = null;
+	reset();
+	trackPoints.value = [];
+}
+
+onMounted(async () => {
+	await loadOnline();
+	timer = window.setInterval(loadOnline, 30000);
+});
+
+onBeforeUnmount(() => clearInterval(timer));
+</script>
+
+<style lang="scss" scoped>
+.hint {
+	margin-top: 8px;
+	font-size: 12px;
+	color: var(--el-text-color-secondary);
+	line-height: 1.4;
+}
+
+.list-item {
+	display: flex;
+	gap: 8px;
+	padding: 10px 12px;
+	cursor: pointer;
+	border-bottom: 1px solid var(--el-border-color-extra-light);
+
+	i {
+		width: 8px;
+		height: 8px;
+		margin-top: 6px;
+		border-radius: 50%;
+		background: #7c3aed;
+		flex-shrink: 0;
+	}
+
+	&:hover,
+	&.is-active {
+		background: var(--el-color-primary-light-9);
+	}
+
+	&__name {
+		font-size: 13px;
+		font-weight: 600;
+	}
+
+	&__meta {
+		margin-top: 2px;
+		font-size: 12px;
+		color: var(--el-text-color-secondary);
+	}
+}
+
+.legend {
+	display: flex;
+	align-items: center;
+	gap: 6px;
+	margin: 2px 0;
+	font-size: 12px;
+
+	i {
+		width: 8px;
+		height: 8px;
+		border-radius: 50%;
+	}
+}
+
+.cam {
+	margin-bottom: 12px;
+
+	&__name {
+		margin-bottom: 6px;
+		font-size: 13px;
+		color: var(--el-text-color-regular);
+	}
+}
+
+.mapDiv {
+	width: 100%;
+	height: 100%;
+}
+</style>

--
Gitblit v1.9.1