From 656e2507b9aa388afa4c3346927b1b94ab70a0b2 Mon Sep 17 00:00:00 2001
From: wangzhibo <wangzhibo@shsening.com>
Date: 星期日, 16 八月 2026 14:45:08 +0800
Subject: [PATCH] add 监控大屏

---
 build/cool/eps.d.ts                               |  268 +++++++
 src/modules/report/views/screen/overview.vue      |  190 +++++
 src/modules/report/views/screen/carbon.vue        |  177 +++++
 src/modules/report/components/panel-card.vue      |   70 ++
 build/cool/eps.json                               |    2 
 src/modules/report/config.ts                      |   20 
 src/modules/report/views/screen/participation.vue |  253 +++++++
 src/modules/report/views/screen/index.vue         |   44 +
 src/modules/report/views/screen/resource.vue      |  160 ++++
 src/modules/report/data/screen.ts                 |  107 +++
 src/modules/report/components/kpi-card.vue        |   70 ++
 src/modules/report/views/screen/operation.vue     |  307 +++++++++
 src/modules/report/hooks/use-screen.ts            |  120 +++
 src/modules/report/components/screen-shell.vue    |  226 ++++++
 14 files changed, 1,995 insertions(+), 19 deletions(-)

diff --git a/build/cool/eps.d.ts b/build/cool/eps.d.ts
index 617a3a1..59a1301 100644
--- a/build/cool/eps.d.ts
+++ b/build/cool/eps.d.ts
@@ -1901,7 +1901,7 @@
 		/**
 		 * 鐢ㄦ埛ID
 		 */
-		userId?: number;
+		userId?: string;
 
 		/**
 		 * 浼樻儬鍒窱D
@@ -2147,7 +2147,7 @@
 		/**
 		 * 缁忔墜浜篒D
 		 */
-		handlerId?: BigInt;
+		handlerId?: string;
 
 		/**
 		 * 鏀惰喘鏂逛唬鐮�
@@ -2204,7 +2204,7 @@
 		/**
 		 * 鐢ㄦ埛ID
 		 */
-		userId?: number;
+		userId?: string;
 
 		/**
 		 * 鏍囬
@@ -2212,7 +2212,7 @@
 		title?: string;
 
 		/**
-		 * 鏀粯鏂瑰紡 0-寰呮敮浠� 1-寰俊 2-鏀粯瀹�
+		 * 鏀粯鏂瑰紡 0-寰呮敮浠� 1-寰俊 2-鏀粯瀹� 3-纰崇Н鍒�
 		 */
 		payType?: number;
 
@@ -3062,6 +3062,16 @@
 		bloodOxygen?: number;
 
 		/**
+		 * 姝ユ暟
+		 */
+		stepCount?: number;
+
+		/**
+		 * 鏁版嵁绫诲瀷
+		 */
+		dataType?: string;
+
+		/**
 		 * 鍒涘缓鏃堕棿
 		 */
 		createTime?: string;
@@ -3805,6 +3815,158 @@
 		 * sw62_007浼扮畻閿�鍞
 		 */
 		estimatedSalesSw62007?: number;
+
+		/**
+		 * 鍒涘缓鏃堕棿
+		 */
+		createTime?: string;
+
+		/**
+		 * 鏇存柊鏃堕棿
+		 */
+		updateTime?: string;
+
+		/**
+		 * 閮ㄩ棬鍚嶇О
+		 */
+		departmentName?: string;
+
+		/**
+		 * 浠绘剰閿��
+		 */
+		[key: string]: any;
+	}
+
+	interface ReportDailySorterEntity {
+		/**
+		 * ID
+		 */
+		id?: number;
+
+		/**
+		 * 鏃ユ湡
+		 */
+		date?: Date;
+
+		/**
+		 * 韬唤璇佸彿
+		 */
+		businessId?: string;
+
+		/**
+		 * 濮撳悕
+		 */
+		businessName?: string;
+
+		/**
+		 * 鎵�灞炲崟浣岻D
+		 */
+		departmentId?: BigInt;
+
+		/**
+		 * 鎵�灞炲崟浣嶅悕绉�
+		 */
+		departmentName?: string;
+
+		/**
+		 * 宸ヤ綔绔欑偣ID
+		 */
+		workSiteId?: string;
+
+		/**
+		 * 宸ヤ綔绔欑偣鍚嶇О
+		 */
+		workSiteName?: string;
+
+		/**
+		 * 绛惧埌鏃堕棿
+		 */
+		checkInTime?: Date;
+
+		/**
+		 * 绛鹃��鏃堕棿
+		 */
+		checkOutTime?: Date;
+
+		/**
+		 * 宸ヤ綔鏃堕暱(灏忔椂)
+		 */
+		workHours?: number;
+
+		/**
+		 * 鑰冨嫟鐘舵��
+		 */
+		attendanceStatus?: string;
+
+		/**
+		 * GPS鏁版嵁鐐规暟閲�
+		 */
+		gpsPointCount?: number;
+
+		/**
+		 * 宸ヤ綔杞ㄨ抗閲岀▼(km)
+		 */
+		totalKm?: number;
+
+		/**
+		 * 绉诲姩鏃堕暱(鍒嗛挓)
+		 */
+		minutesMoving?: number;
+
+		/**
+		 * 鍥炴敹璁㈠崟鏁�
+		 */
+		orderCount?: number;
+
+		/**
+		 * 瀹屾垚璁㈠崟鏁�
+		 */
+		completedOrderCount?: number;
+
+		/**
+		 * 棰勭害涓婇棬璁㈠崟鏁�
+		 */
+		appointmentOrderCount?: number;
+
+		/**
+		 * 鍙戞斁纰崇Н鍒�
+		 */
+		totalCarbonPoint?: number;
+
+		/**
+		 * 鍋ュ悍鏁版嵁鏁伴噺
+		 */
+		healthDataCount?: number;
+
+		/**
+		 * 鍋ュ悍寮傚父鏁伴噺
+		 */
+		healthAbnormalCount?: number;
+
+		/**
+		 * 鍋ュ悍鍛婅鎬绘暟
+		 */
+		alarmCount?: number;
+
+		/**
+		 * 涓�鑸憡璀︽鏁�
+		 */
+		generalAlarmCount?: number;
+
+		/**
+		 * 涓瓑鍛婅娆℃暟
+		 */
+		mediumAlarmCount?: number;
+
+		/**
+		 * 涓ラ噸鍛婅娆℃暟
+		 */
+		seriousAlarmCount?: number;
+
+		/**
+		 * 鏈鐞嗗憡璀︽鏁�
+		 */
+		unhandledAlarmCount?: number;
 
 		/**
 		 * 鍒涘缓鏃堕棿
@@ -4810,20 +4972,6 @@
 
 	type json = any;
 
-	type DictKey =
-		| "upgradeType"
-		| "complainType"
-		| "feedbackType"
-		| "ratedpayload"
-		| "iottype"
-		| "brand"
-		| "occupation"
-		| "sitetype"
-		| "datachanel"
-		| "vehicletype"
-		| "businesstype"
-		| "appointmentslot";
-
 	interface PagePagination {
 		size: number;
 		page: number;
@@ -5075,6 +5223,11 @@
 	interface ReportDailysitePageResponse {
 		pagination: PagePagination;
 		list: ReportDailysiteEntity[];
+	}
+
+	interface ReportDailysorterPageResponse {
+		pagination: PagePagination;
+		list: ReportDailySorterEntity[];
 	}
 
 	interface ReportDailyvehiclePageResponse {
@@ -8155,6 +8308,64 @@
 		request: Request;
 	}
 
+	interface ReportDailysorter {
+		/**
+		 * 鍒犻櫎
+		 */
+		delete(data?: any): Promise<any>;
+
+		/**
+		 * 淇敼
+		 */
+		update(data?: any): Promise<any>;
+
+		/**
+		 * 鍗曚釜淇℃伅
+		 */
+		info(data?: any): Promise<ReportDailySorterEntity>;
+
+		/**
+		 * 鍒楄〃鏌ヨ
+		 */
+		list(data?: any): Promise<ReportDailySorterEntity[]>;
+
+		/**
+		 * 鍒嗛〉鏌ヨ
+		 */
+		page(data?: any): Promise<ReportDailysorterPageResponse>;
+
+		/**
+		 * 鏂板
+		 */
+		add(data?: any): Promise<any>;
+
+		/**
+		 * 鏉冮檺鏍囪瘑
+		 */
+		permission: {
+			delete: string;
+			update: string;
+			info: string;
+			list: string;
+			page: string;
+			add: string;
+		};
+
+		/**
+		 * 鏉冮檺鐘舵��
+		 */
+		_permission: {
+			delete: boolean;
+			update: boolean;
+			info: boolean;
+			list: boolean;
+			page: boolean;
+			add: boolean;
+		};
+
+		request: Request;
+	}
+
 	interface ReportDailyvehicle {
 		/**
 		 * 鍒犻櫎
@@ -8267,6 +8478,25 @@
 			page: boolean;
 			add: boolean;
 		};
+
+		request: Request;
+	}
+
+	interface ReportScreen {
+		/**
+		 * 椹鹃┒鑸辨眹鎬�
+		 */
+		query(data?: any): Promise<any>;
+
+		/**
+		 * 鏉冮檺鏍囪瘑
+		 */
+		permission: { query: string };
+
+		/**
+		 * 鏉冮檺鐘舵��
+		 */
+		_permission: { query: boolean };
 
 		request: Request;
 	}
@@ -9009,8 +9239,10 @@
 		report: {
 			dailydepartment: ReportDailydepartment;
 			dailysite: ReportDailysite;
+			dailysorter: ReportDailysorter;
 			dailyvehicle: ReportDailyvehicle;
 			joblog: ReportJoblog;
+			screen: ReportScreen;
 		};
 		shop: {
 			recycleappointment: ShopRecycleappointment;
diff --git a/build/cool/eps.json b/build/cool/eps.json
index 2e245af..15f11ec 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":"number","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-鏀粯瀹�","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/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/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/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/report/components/kpi-card.vue b/src/modules/report/components/kpi-card.vue
new file mode 100644
index 0000000..b011f78
--- /dev/null
+++ b/src/modules/report/components/kpi-card.vue
@@ -0,0 +1,70 @@
+<template>
+	<div class="kpi-card" :class="{ 'is-alert': alert }">
+		<div class="kpi-card__label">{{ label }}</div>
+		<div class="kpi-card__value">
+			<cl-number :value="numeric" :fixed="fixed" type="amount" :suffix="suffix" />
+		</div>
+		<div v-if="hint" class="kpi-card__hint">{{ hint }}</div>
+	</div>
+</template>
+
+<script lang="ts" setup>
+import { computed } from 'vue';
+
+const props = defineProps<{
+	label: string;
+	value: number | string;
+	suffix?: string;
+	fixed?: number;
+	hint?: string;
+	alert?: boolean;
+}>();
+
+const numeric = computed(() => Number(props.value) || 0);
+</script>
+
+<style lang="scss" scoped>
+.kpi-card {
+	padding: 14px 16px;
+	border-radius: 12px;
+	border: 1px solid var(--el-border-color-extra-light);
+	background: var(--el-bg-color);
+	color: var(--el-text-color-primary);
+	min-height: 96px;
+
+	&__label {
+		font-size: 13px;
+		color: var(--el-text-color-secondary);
+	}
+
+	&__value {
+		margin-top: 8px;
+		font-size: 26px;
+		font-weight: 700;
+		line-height: 1.2;
+		color: var(--el-text-color-primary);
+
+		:deep(.cl-number__suffix) {
+			margin-left: 4px;
+			font-size: 13px;
+			font-weight: 500;
+			color: var(--el-text-color-secondary);
+		}
+	}
+
+	&__hint {
+		margin-top: 8px;
+		font-size: 12px;
+		color: var(--el-text-color-secondary);
+	}
+
+	&.is-alert {
+		border-color: var(--el-color-danger-light-5);
+		background: var(--el-color-danger-light-9);
+
+		.kpi-card__value {
+			color: var(--el-color-danger);
+		}
+	}
+}
+</style>
diff --git a/src/modules/report/components/panel-card.vue b/src/modules/report/components/panel-card.vue
new file mode 100644
index 0000000..f101f2c
--- /dev/null
+++ b/src/modules/report/components/panel-card.vue
@@ -0,0 +1,70 @@
+<template>
+	<div class="panel-card">
+		<div class="panel-card__header">
+			<div class="panel-card__title">
+				<span>{{ title }}</span>
+				<span v-if="sub" class="panel-card__sub">{{ sub }}</span>
+			</div>
+			<div class="panel-card__extra">
+				<slot name="extra" />
+			</div>
+		</div>
+		<div class="panel-card__body">
+			<slot />
+		</div>
+	</div>
+</template>
+
+<script lang="ts" setup>
+defineProps<{
+	title: string;
+	sub?: string;
+}>();
+</script>
+
+<style lang="scss" scoped>
+.panel-card {
+	display: flex;
+	flex-direction: column;
+	height: 100%;
+	min-height: 280px;
+	border-radius: 12px;
+	border: 1px solid var(--el-border-color-extra-light);
+	background: var(--el-bg-color);
+	color: var(--el-text-color-primary);
+
+	&__header {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		gap: 12px;
+		padding: 12px 16px 0;
+		min-height: 48px;
+	}
+
+	&__title {
+		display: flex;
+		align-items: baseline;
+		gap: 8px;
+		font-size: 15px;
+		font-weight: 600;
+		color: var(--el-text-color-primary);
+
+		> span:first-child {
+			color: var(--el-text-color-primary);
+		}
+	}
+
+	&__sub {
+		font-size: 12px;
+		font-weight: 400;
+		color: var(--el-text-color-secondary);
+	}
+
+	&__body {
+		flex: 1;
+		min-height: 0;
+		padding: 8px 8px 12px;
+	}
+}
+</style>
diff --git a/src/modules/report/components/screen-shell.vue b/src/modules/report/components/screen-shell.vue
new file mode 100644
index 0000000..0196816
--- /dev/null
+++ b/src/modules/report/components/screen-shell.vue
@@ -0,0 +1,226 @@
+<template>
+	<div ref="rootRef" class="green-screen" :class="{ 'is-fullscreen': isFullscreen }">
+		<header class="green-screen__header">
+			<div class="brand">
+				<div class="brand__mark" />
+				<div>
+					<div class="brand__title">鏍″洯缁胯壊杩愯惀椹鹃┒鑸�</div>
+					<div class="brand__sub">{{ current?.audience }}瑙嗚 路 {{ current?.label }}</div>
+				</div>
+			</div>
+
+			<nav class="nav">
+				<button
+					v-for="item in SCREEN_NAV"
+					:key="item.key"
+					class="nav__item"
+					:class="{ 'is-active': item.key === currentKey }"
+					type="button"
+					@click="go(item.path)"
+				>
+					<span class="nav__index">{{ item.index }}</span>
+					<span>{{ item.label }}</span>
+				</button>
+			</nav>
+
+			<div class="tools">
+				<el-tag v-if="loadError" type="danger" effect="plain" size="small">{{ loadError }}</el-tag>
+				<el-tag v-else-if="unavailable.length" type="warning" effect="plain" size="small">
+					閮ㄥ垎鎸囨爣寰呰ˉ鏁�
+				</el-tag>
+				<el-tag v-else type="success" effect="plain" size="small">瀹炴椂鏁版嵁</el-tag>
+				<cl-select-button v-model="timeRange" :options="TIME_RANGE_OPTIONS" small />
+				<el-button :icon="Refresh" circle :loading="loading" @click="reload" />
+				<el-button :icon="isFullscreen ? Close : FullScreen" circle @click="toggleFullscreen" />
+			</div>
+		</header>
+
+		<section v-loading="loading" class="green-screen__body">
+			<slot />
+			<el-collapse v-if="unavailable.length" class="missing">
+				<el-collapse-item title="褰撳墠鎷夸笉鍒版垨鍙e緞寰呯‘璁ょ殑鎸囨爣" name="1">
+					<ul>
+						<li v-for="item in unavailable" :key="item">{{ item }}</li>
+					</ul>
+				</el-collapse-item>
+			</el-collapse>
+		</section>
+	</div>
+</template>
+
+<script lang="ts" setup>
+import { computed, onMounted, onUnmounted, ref } from 'vue';
+import { useRoute, useRouter } from 'vue-router';
+import { Close, FullScreen, Refresh } from '@element-plus/icons-vue';
+import { SCREEN_NAV, TIME_RANGE_OPTIONS, type ScreenKey } from '../data/screen';
+import { provideScreenTime, useScreenData } from '../hooks/use-screen';
+
+const route = useRoute();
+const router = useRouter();
+const timeRange = provideScreenTime();
+const { data, loading, loadError, reload } = useScreenData();
+const rootRef = ref<HTMLElement>();
+const isFullscreen = ref(false);
+
+const unavailable = computed(() => data.value.unavailable || []);
+
+const currentKey = computed<ScreenKey>(() => {
+	const page = String(route.params.page || 'overview') as ScreenKey;
+	return SCREEN_NAV.some(e => e.key === page) ? page : 'overview';
+});
+
+const current = computed(() => SCREEN_NAV.find(e => e.key === currentKey.value));
+
+function go(path: string) {
+	if (path !== route.path) router.push(path);
+}
+
+function syncFullscreen() {
+	isFullscreen.value = document.fullscreenElement === rootRef.value;
+}
+
+async function toggleFullscreen() {
+	const el = rootRef.value;
+	if (!el) return;
+
+	if (document.fullscreenElement === el) {
+		await document.exitFullscreen();
+	} else if (document.fullscreenElement) {
+		await document.exitFullscreen();
+		await el.requestFullscreen();
+	} else {
+		await el.requestFullscreen();
+	}
+}
+
+onMounted(() => {
+	document.addEventListener('fullscreenchange', syncFullscreen);
+});
+
+onUnmounted(() => {
+	document.removeEventListener('fullscreenchange', syncFullscreen);
+});
+</script>
+
+<style lang="scss" scoped>
+.green-screen {
+	display: flex;
+	flex-direction: column;
+	height: 100%;
+	min-height: calc(100vh - 118px);
+	background: linear-gradient(180deg, var(--el-bg-color-page) 0%, var(--el-fill-color-lighter) 100%);
+	color: var(--el-text-color-primary);
+
+	&.is-fullscreen {
+		padding: 12px;
+		min-height: 100vh;
+		background: #07111f;
+
+		.green-screen__header,
+		.brand__title {
+			color: #e5e7eb;
+		}
+
+		.brand__sub {
+			color: #94a3b8;
+		}
+	}
+
+	&__header {
+		display: flex;
+		align-items: center;
+		gap: 16px;
+		padding: 8px 4px 12px;
+		flex-shrink: 0;
+	}
+
+	&__body {
+		flex: 1;
+		min-height: 0;
+		overflow: auto;
+		padding-bottom: 8px;
+	}
+}
+
+.brand {
+	display: flex;
+	align-items: center;
+	gap: 10px;
+	min-width: 220px;
+
+	&__mark {
+		width: 12px;
+		height: 36px;
+		border-radius: 6px;
+		background: linear-gradient(180deg, #22c55e, #16a34a);
+	}
+
+	&__title {
+		font-size: 18px;
+		font-weight: 700;
+		letter-spacing: 0.5px;
+		line-height: 1.2;
+	}
+
+	&__sub {
+		margin-top: 2px;
+		font-size: 12px;
+		color: var(--el-text-color-secondary);
+	}
+}
+
+.nav {
+	display: flex;
+	flex: 1;
+	gap: 8px;
+	overflow-x: auto;
+
+	&__item {
+		display: flex;
+		align-items: center;
+		gap: 6px;
+		height: 36px;
+		padding: 0 12px;
+		border: 1px solid var(--el-border-color-extra-light);
+		border-radius: 999px;
+		background: var(--el-bg-color);
+		color: var(--el-text-color-regular);
+		white-space: nowrap;
+		cursor: pointer;
+		transition: all 0.2s ease;
+
+		&:hover,
+		&.is-active {
+			border-color: var(--el-color-primary-light-5);
+			color: var(--el-color-primary);
+			background: var(--el-color-primary-light-9);
+		}
+	}
+
+	&__index {
+		font-size: 11px;
+		font-weight: 700;
+		opacity: 0.7;
+	}
+}
+
+.tools {
+	display: flex;
+	align-items: center;
+	gap: 10px;
+	flex-shrink: 0;
+}
+
+.missing {
+	margin: 8px 0 0;
+	border: none;
+
+	ul {
+		margin: 0;
+		padding-left: 18px;
+		line-height: 1.8;
+		color: var(--el-text-color-regular);
+		font-size: 13px;
+	}
+}
+</style>
diff --git a/src/modules/report/config.ts b/src/modules/report/config.ts
new file mode 100644
index 0000000..a3177e3
--- /dev/null
+++ b/src/modules/report/config.ts
@@ -0,0 +1,20 @@
+import { type ModuleConfig } from '/@/cool';
+
+export default (): ModuleConfig => {
+	return {
+		label: '缁胯壊鏍″洯椹鹃┒鑸�',
+		description: '瀛︽牎绠$悊灞備笌杩愯惀鍏徃瑙嗚鐨勭豢鑹茶繍钀ュぇ灞�',
+		order: 10,
+		views: [
+			{
+				path: '/report/screen/:page?',
+				name: 'report-screen',
+				meta: {
+					label: '缁胯壊鏍″洯椹鹃┒鑸�',
+					keepAlive: true
+				},
+				component: () => import('./views/screen/index.vue')
+			}
+		]
+	};
+};
diff --git a/src/modules/report/data/screen.ts b/src/modules/report/data/screen.ts
new file mode 100644
index 0000000..a419dee
--- /dev/null
+++ b/src/modules/report/data/screen.ts
@@ -0,0 +1,107 @@
+export type TimeRange = 'today' | 'week' | 'month' | 'quarter' | 'year';
+export type ScreenKey = 'overview' | 'resource' | 'carbon' | 'participation' | 'operation';
+export type RankMetric = 'weight' | 'people' | 'pointPerCapita' | 'weightPerCapita' | 'carbon';
+
+export const SCREEN_NAV: { key: ScreenKey; path: string; index: string; label: string; audience: string }[] = [
+	{ key: 'overview', path: '/report/screen/overview', index: '01', label: '缁胯壊鏍″洯鎬昏', audience: '鏍¢瀵�' },
+	{ key: 'resource', path: '/report/screen/resource', index: '02', label: '鍨冨溇璧勬簮鍖栧垎鏋�', audience: '鍚庡嫟 / 鐜繚' },
+	{ key: 'carbon', path: '/report/screen/carbon', index: '03', label: '纰冲噺鎺掍笌缁胯壊璐$尞', audience: '鍙岀⒊ / ESG' },
+	{ key: 'participation', path: '/report/screen/participation', index: '04', label: '甯堢敓鍙備笌涓庣⒊绉垎', audience: '瀛﹀伐 / 鍥㈠' },
+	{ key: 'operation', path: '/report/screen/operation', index: '05', label: '鍥炴敹杩愯惀鐩戞帶', audience: '杩愯惀鍏徃' }
+];
+
+export const TIME_RANGE_OPTIONS: { label: string; value: TimeRange }[] = [
+	{ label: '浠婃棩', value: 'today' },
+	{ label: '鏈懆', value: 'week' },
+	{ label: '鏈湀', value: 'month' },
+	{ label: '鏈搴�', value: 'quarter' },
+	{ label: '鏈勾搴�', value: 'year' }
+];
+
+export interface ScreenData {
+	range: TimeRange | string;
+	axis: string[];
+	kpis: Record<string, number>;
+	wasteMix: { name: string; code?: string; weight: number; value: number; count: number; color: string }[];
+	recycleItems: { name: string; weight: number; value: number; carbon: number; color: string }[];
+	trend: { weight: number[]; value: number[]; carbon: number[] };
+	yearCarbon: number[];
+	deptRank: any[];
+	classRank: any[];
+	majorRank: any[];
+	pointFlow: { issued: number; transfer: number; donate: number; mall: number; balance: number };
+	participateTrend: number[];
+	deliverTrend: number[];
+	ordersByType: { axis: string[]; 鐜板満鍥炴敹: number[]; 棰勭害涓婇棬: number[]; 澶у睆鎶曢��: number[]; 娲诲姩鍥炴敹: number[] };
+	appointmentFlow: { name: string; value: number }[];
+	sorterStatus: { name: string; value: number; color: string }[];
+	vehicles: { no: string; km: number; idle: number; overspeed: number; status: string }[];
+	sites: { name: string; weight: number; online: boolean }[];
+	unavailable?: string[];
+}
+
+export function emptyScreen(range: TimeRange = 'month'): ScreenData {
+	return {
+		range,
+		axis: [],
+		kpis: {
+			todayWeightKg: 0,
+			periodWeightTon: 0,
+			resourceRate: 0,
+			periodValue: 0,
+			periodCarbonTon: 0,
+			totalWeightTon: 0,
+			totalParticipants: 0,
+			totalPoints: 0,
+			recyclableTon: 0,
+			bulkTon: 0,
+			elecTon: 0,
+			fabricTon: 0,
+			yearCarbonTon: 0,
+			monthCarbonTon: 0,
+			totalCarbonTon: 0,
+			greenActions: 0,
+			newParticipants: 0,
+			participateRate: 0,
+			pointsIssued: 0,
+			pointsConsumed: 0,
+			pointsBalance: 0,
+			sorterOnline: 0,
+			sorterTotal: 0,
+			vehicleOnline: 0,
+			vehicleTotal: 0,
+			siteOnline: 0,
+			siteTotal: 0,
+			todayOrders: 0,
+			todayAppointments: 0,
+			pendingAppointments: 0,
+			alerts: 0,
+			healthAlerts: 0
+		},
+		wasteMix: [],
+		recycleItems: [],
+		trend: { weight: [], value: [], carbon: [] },
+		yearCarbon: Array.from({ length: 12 }, () => 0),
+		deptRank: [],
+		classRank: [],
+		majorRank: [],
+		pointFlow: { issued: 0, transfer: 0, donate: 0, mall: 0, balance: 0 },
+		participateTrend: [],
+		deliverTrend: [],
+		ordersByType: { axis: [], 鐜板満鍥炴敹: [], 棰勭害涓婇棬: [], 澶у睆鎶曢��: [], 娲诲姩鍥炴敹: [] },
+		appointmentFlow: [
+			{ name: '棰勭害', value: 0 },
+			{ name: '鎺ュ崟', value: 0 },
+			{ name: '瀹屾垚', value: 0 }
+		],
+		sorterStatus: [
+			{ name: '宸ヤ綔涓�', value: 0, color: '#22c55e' },
+			{ name: '浼戞伅', value: 0, color: '#f59e0b' },
+			{ name: '寮傚父', value: 0, color: '#ef4444' },
+			{ name: '绂荤嚎', value: 0, color: '#94a3b8' }
+		],
+		vehicles: [],
+		sites: [],
+		unavailable: []
+	};
+}
diff --git a/src/modules/report/hooks/use-screen.ts b/src/modules/report/hooks/use-screen.ts
new file mode 100644
index 0000000..0ea549a
--- /dev/null
+++ b/src/modules/report/hooks/use-screen.ts
@@ -0,0 +1,120 @@
+import { computed, ref, watch } from 'vue';
+import { useDark } from '@vueuse/core';
+import { useTheme } from '/#/theme';
+import { useCool } from '/@/cool';
+import { emptyScreen, type ScreenData, type TimeRange } from '../data/screen';
+
+const sharedTimeRange = ref<TimeRange>('month');
+const screenData = ref<ScreenData>(emptyScreen());
+const loading = ref(false);
+const loadError = ref('');
+
+export function provideScreenTime() {
+	return sharedTimeRange;
+}
+
+export function useScreenTime() {
+	return sharedTimeRange;
+}
+
+export function useScreenData() {
+	return {
+		timeRange: sharedTimeRange,
+		data: screenData,
+		loading,
+		loadError,
+		reload: () => loadImpl()
+	};
+}
+
+let inited = false;
+let loadImpl: () => Promise<void> = async () => {};
+
+export function useScreenLoader() {
+	const { service } = useCool();
+
+	async function load() {
+		loading.value = true;
+		loadError.value = '';
+		try {
+			const payload = { range: sharedTimeRange.value };
+			const screen = service.report?.screen;
+			const res: ScreenData = screen?.query
+				? await screen.query(payload)
+				: await service.request({
+						url: 'admin/report/screen/query',
+						method: 'POST',
+						data: payload
+				  });
+			const fallback = emptyScreen(sharedTimeRange.value);
+			screenData.value = {
+				...fallback,
+				...(res || {}),
+				kpis: { ...fallback.kpis, ...(res?.kpis || {}) },
+				trend: { ...fallback.trend, ...(res?.trend || {}) },
+				pointFlow: { ...fallback.pointFlow, ...(res?.pointFlow || {}) },
+				ordersByType: { ...fallback.ordersByType, ...(res?.ordersByType || {}) }
+			};
+		} catch (e: any) {
+			screenData.value = emptyScreen(sharedTimeRange.value);
+			loadError.value = e?.message || '椹鹃┒鑸辨帴鍙h皟鐢ㄥけ璐�';
+		} finally {
+			loading.value = false;
+		}
+	}
+
+	loadImpl = load;
+
+	if (!inited) {
+		inited = true;
+		watch(sharedTimeRange, () => load());
+	}
+
+	load();
+
+	return { load, loading, loadError };
+}
+
+export function useChartTheme() {
+	const isDark = useDark();
+	const theme = useTheme();
+
+	const textColor = computed(() => (isDark.value ? '#e5e7eb' : '#334155'));
+	const mutedColor = computed(() => (isDark.value ? '#94a3b8' : '#64748b'));
+	const splitColor = computed(() => (isDark.value ? '#334155' : '#e2e8f0'));
+	const tooltipBg = computed(() => (isDark.value ? '#0f172a' : '#ffffff'));
+	const primary = computed(() => theme.color || '#16a34a');
+
+	function baseGrid() {
+		return { containLabel: true, left: 12, right: 16, top: 28, bottom: 8 };
+	}
+
+	function axisStyle() {
+		return {
+			axisLine: { show: false },
+			axisTick: { show: false },
+			splitLine: { show: false },
+			axisLabel: { color: mutedColor.value }
+		};
+	}
+
+	function tooltip() {
+		return {
+			backgroundColor: tooltipBg.value,
+			borderColor: splitColor.value,
+			textStyle: { color: textColor.value }
+		};
+	}
+
+	return {
+		isDark,
+		textColor,
+		mutedColor,
+		splitColor,
+		tooltipBg,
+		primary,
+		baseGrid,
+		axisStyle,
+		tooltip
+	};
+}
diff --git a/src/modules/report/views/screen/carbon.vue b/src/modules/report/views/screen/carbon.vue
new file mode 100644
index 0000000..0d2b026
--- /dev/null
+++ b/src/modules/report/views/screen/carbon.vue
@@ -0,0 +1,177 @@
+<template>
+	<div class="screen-page">
+			<el-row :gutter="10" class="kpi-row">
+				<el-col v-for="item in kpis" :key="item.label" :lg="4" :sm="12" :xs="24">
+					<kpi-card v-bind="item" />
+				</el-col>
+			</el-row>
+
+			<el-row :gutter="10" class="mid-row">
+				<el-col :lg="14" :xs="24">
+					<panel-card title="纰冲噺鎺掕秼鍔�" sub="浠婃棩鐪嬭繎 7 鏃ワ紱骞磋鍥炬寜鏈堬紝鍏朵綑鎸夋棩">
+						<v-chart :option="trendOption" autoresize class="chart" />
+					</panel-card>
+				</el-col>
+				<el-col :lg="10" :xs="24">
+					<panel-card title="纰冲噺鎺掓潵婧�" sub="鎸夊彲鍥炴敹瀛愮被鎷嗗垎">
+						<v-chart :option="sourceOption" autoresize class="chart" />
+					</panel-card>
+				</el-col>
+			</el-row>
+
+			<el-row :gutter="10">
+				<el-col :lg="16" :xs="24">
+					<panel-card title="鏈勾搴︽湀搴︾⒊鍑忔帓" sub="鏃ヨ〃 carbonTotal 鍗曚綅 kgCO鈧俥锛屽睍绀烘椂 梅1000 涓哄惃">
+						<v-chart :option="yearOption" autoresize class="chart" />
+					</panel-card>
+				</el-col>
+				<el-col :lg="8" :xs="24">
+					<panel-card title="鍙e緞璇存槑" sub="澶у睆鍙睍绀� KPI锛屼笉鐩存帴缁戣〃">
+						<ul class="note">
+							<li>纰冲噺鎺� = 危 鍒嗙被閲嶉噺 脳 纰冲噺鍥犳暟 脳 鏂瑰悜</li>
+							<li>鍥犳暟鏉ヨ嚜鍨冨溇绉嶇被 carbonFactor</li>
+							<li>鏃ヨ〃瀛楁鍗曚綅涓� kgCO鈧俥锛屽ぇ灞忓惃鏁板凡闄や互 1000</li>
+							<li>鏈〉缁欏鏍″弻纰炽�丒SG銆佺豢鑹叉暀鑲叉眹鎶ワ紝涓嶅睍绀哄垎鎷g偣鏄庣粏</li>
+						</ul>
+					</panel-card>
+				</el-col>
+			</el-row>
+		</div>
+</template>
+
+<script lang="ts" setup>
+defineOptions({
+	name: 'report-screen-carbon'
+});
+
+import { computed } from 'vue';
+import KpiCard from '../../components/kpi-card.vue';
+import PanelCard from '../../components/panel-card.vue';
+import { useChartTheme, useScreenData } from '../../hooks/use-screen';
+
+const { data, timeRange } = useScreenData();
+const { textColor, mutedColor, splitColor, primary, baseGrid, axisStyle, tooltip } = useChartTheme();
+
+const kpis = computed(() => [
+	{ label: '绱纰冲噺鎺�', value: data.value.kpis.totalCarbonTon, suffix: '鍚–O鈧俥', fixed: 1 },
+	{ label: '鏈勾搴︾⒊鍑忔帓', value: data.value.kpis.yearCarbonTon, suffix: '鍚–O鈧俥', fixed: 1 },
+	{ label: '鏈尯闂寸⒊鍑忔帓', value: data.value.kpis.periodCarbonTon, suffix: '鍚–O鈧俥', fixed: 2 },
+	{ label: '绱璧勬簮鍥炴敹', value: data.value.kpis.totalWeightTon, suffix: '鍚�', fixed: 1 },
+	{ label: '绱鍙備笌甯堢敓', value: data.value.kpis.totalParticipants, suffix: '浜�', fixed: 0 },
+	{ label: '绱鐜繚琛屼负', value: data.value.kpis.greenActions, suffix: '娆�', fixed: 0 }
+]);
+
+const trendOption = computed(() => {
+	const isYear = timeRange.value === 'year';
+	return {
+		grid: baseGrid(),
+		tooltip: { trigger: 'axis', ...tooltip() },
+		xAxis: {
+			type: 'category',
+			data: isYear ? Array.from({ length: 12 }, (_, i) => `${i + 1}鏈坄) : data.value.axis,
+			...axisStyle()
+		},
+		yAxis: {
+			type: 'value',
+			name: '鍚–O鈧俥',
+			nameTextStyle: { color: mutedColor.value },
+			splitLine: { lineStyle: { color: splitColor.value, type: 'dashed' } },
+			axisLabel: { color: mutedColor.value },
+			axisLine: { show: false },
+			axisTick: { show: false }
+		},
+		series: [
+			{
+				type: 'line',
+				smooth: true,
+				showSymbol: true,
+				symbolSize: 8,
+				data: isYear ? data.value.yearCarbon : data.value.trend.carbon.map(v => Number((v / 1000).toFixed(3))),
+				itemStyle: { color: primary.value },
+				areaStyle: { color: primary.value, opacity: 0.12 }
+			}
+		]
+	};
+});
+
+const yearOption = computed(() => ({
+	grid: baseGrid(),
+	tooltip: { trigger: 'axis', ...tooltip() },
+	xAxis: {
+		type: 'category',
+		data: Array.from({ length: 12 }, (_, i) => `${i + 1}鏈坄),
+		...axisStyle()
+	},
+	yAxis: {
+		type: 'value',
+		name: '鍚–O鈧俥',
+		nameTextStyle: { color: mutedColor.value },
+		splitLine: { lineStyle: { color: splitColor.value, type: 'dashed' } },
+		axisLabel: { color: mutedColor.value },
+		axisLine: { show: false },
+		axisTick: { show: false }
+	},
+	series: [
+		{
+			type: 'bar',
+			barWidth: 16,
+			data: data.value.yearCarbon,
+			itemStyle: { color: primary.value, borderRadius: [6, 6, 0, 0] }
+		}
+	]
+}));
+
+const sourceOption = computed(() => ({
+	tooltip: { trigger: 'item', formatter: '{b}<br/>{c} kgCO鈧俥 ({d}%)', ...tooltip() },
+	legend: { bottom: 0, textStyle: { color: mutedColor.value } },
+	series: [
+		{
+			type: 'pie',
+			radius: ['36%', '60%'],
+			center: ['50%', '46%'],
+			padAngle: 3,
+			itemStyle: { borderRadius: 6 },
+			label: { color: textColor.value, formatter: '{b}\n{d}%' },
+			data: data.value.recycleItems.map(e => ({
+				name: e.name + '鍥炴敹',
+				value: e.carbon,
+				itemStyle: { color: e.color }
+			}))
+		}
+	]
+}));
+</script>
+
+<style lang="scss" scoped>
+.screen-page {
+	.kpi-row,
+	.mid-row {
+		margin-bottom: 10px;
+	}
+
+	.kpi-row {
+		:deep(.el-col) {
+			margin-bottom: 10px;
+		}
+	}
+
+	.mid-row {
+		:deep(.panel-card) {
+			min-height: 360px;
+		}
+	}
+
+	.chart {
+		height: 300px;
+		width: 100%;
+	}
+
+	.note {
+		margin: 8px 12px 12px;
+		padding-left: 18px;
+		color: var(--el-text-color-regular);
+		line-height: 1.9;
+		font-size: 13px;
+	}
+}
+</style>
diff --git a/src/modules/report/views/screen/index.vue b/src/modules/report/views/screen/index.vue
new file mode 100644
index 0000000..f56eea8
--- /dev/null
+++ b/src/modules/report/views/screen/index.vue
@@ -0,0 +1,44 @@
+<template>
+	<screen-shell>
+		<component :is="pageMap[currentKey]" />
+	</screen-shell>
+</template>
+
+<script lang="ts" setup>
+defineOptions({
+	name: 'report-screen'
+});
+
+import { computed } from 'vue';
+import { useRoute, useRouter } from 'vue-router';
+import ScreenShell from '../../components/screen-shell.vue';
+import Overview from './overview.vue';
+import Resource from './resource.vue';
+import Carbon from './carbon.vue';
+import Participation from './participation.vue';
+import Operation from './operation.vue';
+import { SCREEN_NAV, type ScreenKey } from '../../data/screen';
+import { useScreenLoader } from '../../hooks/use-screen';
+
+useScreenLoader();
+
+const route = useRoute();
+const router = useRouter();
+
+const pageMap = {
+	overview: Overview,
+	resource: Resource,
+	carbon: Carbon,
+	participation: Participation,
+	operation: Operation
+};
+
+const currentKey = computed<ScreenKey>(() => {
+	const page = String(route.params.page || 'overview') as ScreenKey;
+	return SCREEN_NAV.some(e => e.key === page) ? page : 'overview';
+});
+
+if (!route.params.page) {
+	router.replace('/report/screen/overview');
+}
+</script>
diff --git a/src/modules/report/views/screen/operation.vue b/src/modules/report/views/screen/operation.vue
new file mode 100644
index 0000000..e9c9cbc
--- /dev/null
+++ b/src/modules/report/views/screen/operation.vue
@@ -0,0 +1,307 @@
+<template>
+	<div class="screen-page">
+		<el-row :gutter="10" class="kpi-row">
+			<el-col :lg="3" :sm="8" :xs="12">
+				<kpi-card label="鍦ㄧ嚎鍒嗘嫞鍛�" :value="data.kpis.sorterOnline"
+					:hint="`${data.kpis.sorterOnline} / ${data.kpis.sorterTotal}`" />
+			</el-col>
+			<el-col :lg="3" :sm="8" :xs="12">
+				<kpi-card label="鍦ㄧ嚎杞﹁締" :value="data.kpis.vehicleOnline"
+					:hint="`${data.kpis.vehicleOnline} / ${data.kpis.vehicleTotal}`" />
+			</el-col>
+			<el-col :lg="3" :sm="8" :xs="12">
+				<kpi-card label="鍦ㄧ嚎鍒嗘嫞鐐�" :value="data.kpis.siteOnline"
+					:hint="`${data.kpis.siteOnline} / ${data.kpis.siteTotal}锛屾寜绔欑偣鍚敤`" />
+			</el-col>
+			<el-col :lg="3" :sm="8" :xs="12">
+				<kpi-card label="浠婃棩鍥炴敹璁㈠崟" :value="data.kpis.todayOrders" :hint="``" />
+			</el-col>
+			<el-col :lg="4" :sm="8" :xs="12">
+				<kpi-card label="浠婃棩棰勭害 / 寰呭鐞�" :value="data.kpis.todayAppointments"
+					:hint="`寰呭鐞� ${data.kpis.pendingAppointments}`" />
+			</el-col>
+			<el-col :lg="4" :sm="8" :xs="12">
+				<kpi-card label="寮傚父鍛婅" :value="data.kpis.alerts" alert
+					:hint="`鍋ュ悍寮傚父 ${data.kpis.healthAlerts}锛屼笉灞曠ず闅愮浣撳緛`" />
+			</el-col>
+			<el-col :lg="4" :sm="8" :xs="12">
+				<kpi-card label="杞﹁締瀹夊叏浜嬩欢" :value="safetyCount" hint="瓒呴�� / 鎬ュ埞绛夛紝鏉ヨ嚜杞﹁締鏃ユ眹鎬�" />
+			</el-col>
+		</el-row>
+
+		<el-row :gutter="10" class="mid-row">
+			<el-col :lg="14" :xs="24">
+				<panel-card title="璁㈠崟瓒嬪娍" sub="鐜板満 / 棰勭害 / 澶у睆 / 娲诲姩锛屾寜澶╁姣�">
+					<v-chart :option="orderOption" autoresize class="chart" />
+				</panel-card>
+			</el-col>
+			<el-col :lg="10" :xs="24">
+				<panel-card title="棰勭害璁㈠崟婕忔枟" sub="鏂板/寰呭鏍� 鈫� 宸茬‘璁�/宸叉帴鍗� 鈫� 宸插畬鎴�">
+					<div class="funnel">
+						<div v-for="(item, index) in data.appointmentFlow" :key="item.name" class="funnel__item">
+							<div class="funnel__name">{{ item.name }}</div>
+							<div class="funnel__bar">
+								<i :style="{ width: funnelWidth(item.value) }" />
+							</div>
+							<div class="funnel__value">{{ item.value }}</div>
+							<span v-if="index < data.appointmentFlow.length - 1" class="funnel__next">鈫�</span>
+						</div>
+					</div>
+					<p class="funnel__tip">棰勭害 鈫� 鎺ュ崟 鈫� 瀹屾垚</p>
+				</panel-card>
+			</el-col>
+		</el-row>
+
+		<el-row :gutter="10">
+			<el-col :lg="8" :xs="24">
+				<panel-card title="鍒嗘嫞鍛樼姸鎬�" sub="鏉ヨ嚜鍒嗘嫞鍛樻棩琛紝鍙眹鎬荤姸鎬侊紝涓嶅睍绀轰綋寰佹槑缁�">
+					<div class="status-list">
+						<div v-for="item in data.sorterStatus" :key="item.name" class="status-list__item">
+							<i :style="{ background: item.color }" />
+							<span>{{ item.name }}</span>
+							<strong>{{ item.value }}</strong>
+						</div>
+					</div>
+				</panel-card>
+			</el-col>
+			<el-col :lg="8" :xs="24">
+				<panel-card title="杞﹁締杩愯" sub="鍏徃棰嗗鐪嬭繍鍔涗笌瀹夊叏锛屼笉杩涙牎棰嗗棣栭〉">
+					<div class="table table--vehicle">
+						<div class="table__head">
+							<span>杞︾墝</span>
+							<span>閲岀▼km</span>
+							<span>鎬犻�熷垎</span>
+							<span>瓒呴��</span>
+							<span>鐘舵��</span>
+						</div>
+						<div v-for="item in data.vehicles" :key="item.no" class="table__row">
+							<span>{{ item.no }}</span>
+							<span>{{ item.km }}</span>
+							<span>{{ item.idle }}</span>
+							<span>{{ item.overspeed }}</span>
+							<span :class="item.status === '鍦ㄧ嚎' ? 'is-on' : 'is-off'">{{ item.status }}</span>
+						</div>
+					</div>
+				</panel-card>
+			</el-col>
+			<el-col :lg="8" :xs="24">
+				<panel-card title="鍒嗘嫞鐐瑰悶鍚�" sub="杩愯惀缁村害鎵嶄笅閽诲埌鐐逛綅">
+					<div class="table table--site">
+						<div class="table__head">
+							<span>鏀堕泦鐐�</span>
+							<span>浠婃棩kg</span>
+							<span>鍦ㄧ嚎</span>
+						</div>
+						<div v-for="item in data.sites" :key="item.name" class="table__row">
+							<span>{{ item.name }}</span>
+							<span>{{ item.weight }}</span>
+							<span :class="item.online ? 'is-on' : 'is-off'">{{ item.online ? '鍦ㄧ嚎' : '绂荤嚎' }}</span>
+						</div>
+					</div>
+				</panel-card>
+			</el-col>
+		</el-row>
+	</div>
+</template>
+
+<script lang="ts" setup>
+defineOptions({
+	name: 'report-screen-operation'
+});
+
+import { computed } from 'vue';
+import KpiCard from '../../components/kpi-card.vue';
+import PanelCard from '../../components/panel-card.vue';
+import { useChartTheme, useScreenData } from '../../hooks/use-screen';
+
+const { data } = useScreenData();
+const { mutedColor, splitColor, tooltip } = useChartTheme();
+
+const safetyCount = computed(() => data.value.vehicles.reduce((s, e) => s + e.overspeed, 0));
+
+function funnelWidth(value: number) {
+	const max = data.value.appointmentFlow[0]?.value || 1;
+	return `${Math.max((value / max) * 100, 18)}%`;
+}
+
+const orderOption = computed(() => {
+	const colors = ['#16a34a', '#3b82f6', '#f59e0b', '#a855f7'];
+	const keys = ['鐜板満鍥炴敹', '棰勭害涓婇棬', '澶у睆鎶曢��', '娲诲姩鍥炴敹'] as const;
+	return {
+		grid: { containLabel: true, left: 8, right: 12, top: 36, bottom: 8 },
+		legend: { top: 0, textStyle: { color: mutedColor.value } },
+		tooltip: { trigger: 'axis', ...tooltip() },
+		xAxis: {
+			type: 'category',
+			data: data.value.ordersByType.axis,
+			axisLabel: { color: mutedColor.value },
+			axisLine: { show: false },
+			axisTick: { show: false }
+		},
+		yAxis: {
+			type: 'value',
+			splitLine: { lineStyle: { color: splitColor.value, type: 'dashed' } },
+			axisLabel: { color: mutedColor.value },
+			axisLine: { show: false },
+			axisTick: { show: false }
+		},
+		series: keys.map((name, i) => ({
+			name,
+			type: 'bar',
+			stack: 'order',
+			barWidth: 18,
+			data: data.value.ordersByType[name],
+			itemStyle: { color: colors[i] }
+		}))
+	};
+});
+</script>
+
+<style lang="scss" scoped>
+.screen-page {
+
+	.kpi-row,
+	.mid-row {
+		margin-bottom: 10px;
+	}
+
+	.kpi-row {
+		:deep(.el-col) {
+			margin-bottom: 10px;
+		}
+	}
+
+	.mid-row,
+	:deep(.panel-card) {
+		min-height: 0;
+	}
+
+	.mid-row {
+		:deep(.panel-card) {
+			min-height: 340px;
+		}
+	}
+
+	.chart {
+		height: 280px;
+		width: 100%;
+	}
+
+	.funnel {
+		display: flex;
+		flex-direction: column;
+		gap: 12px;
+		padding: 18px 16px 0;
+
+		&__item {
+			display: grid;
+			grid-template-columns: 52px 1fr 40px 16px;
+			align-items: center;
+			gap: 8px;
+		}
+
+		&__name {
+			font-size: 13px;
+			color: var(--el-text-color-regular);
+		}
+
+		&__bar {
+			height: 18px;
+			border-radius: 99px;
+			background: var(--el-fill-color-light);
+
+			i {
+				display: block;
+				height: 100%;
+				border-radius: 99px;
+				background: var(--el-color-primary);
+			}
+		}
+
+		&__value {
+			text-align: right;
+			font-weight: 700;
+		}
+
+		&__next {
+			color: var(--el-text-color-secondary);
+		}
+
+		&__tip {
+			margin: 16px;
+			font-size: 12px;
+			color: var(--el-text-color-secondary);
+		}
+	}
+
+	.status-list {
+		display: flex;
+		flex-direction: column;
+		gap: 12px;
+		padding: 16px;
+
+		&__item {
+			display: flex;
+			align-items: center;
+			gap: 10px;
+			padding: 12px 14px;
+			border-radius: 10px;
+			background: var(--el-fill-color-lighter);
+			font-size: 14px;
+
+			i {
+				width: 10px;
+				height: 10px;
+				border-radius: 50%;
+			}
+
+			span {
+				flex: 1;
+			}
+
+			strong {
+				font-size: 20px;
+			}
+		}
+	}
+
+	.table {
+		padding: 8px 12px 16px;
+		font-size: 13px;
+
+		&--vehicle &__head,
+		&--vehicle &__row {
+			grid-template-columns: 1.4fr repeat(4, 0.8fr);
+		}
+
+		&--site &__head,
+		&--site &__row {
+			grid-template-columns: 1.6fr 0.8fr 0.6fr;
+		}
+
+		&__head,
+		&__row {
+			display: grid;
+			gap: 8px;
+			padding: 10px 4px;
+		}
+
+		&__head {
+			color: var(--el-text-color-secondary);
+		}
+
+		&__row {
+			border-top: 1px solid var(--el-border-color-extra-light);
+		}
+
+		.is-on {
+			color: var(--el-color-success);
+		}
+
+		.is-off {
+			color: var(--el-text-color-secondary);
+		}
+	}
+
+}
+</style>
diff --git a/src/modules/report/views/screen/overview.vue b/src/modules/report/views/screen/overview.vue
new file mode 100644
index 0000000..3b731fe
--- /dev/null
+++ b/src/modules/report/views/screen/overview.vue
@@ -0,0 +1,190 @@
+<template>
+	<div class="screen-page">
+			<el-row :gutter="10" class="kpi-row">
+				<el-col v-for="item in kpis" :key="item.label" :xl="3" :lg="6" :sm="12" :xs="24">
+					<kpi-card v-bind="item" />
+				</el-col>
+			</el-row>
+
+			<el-row :gutter="10" class="mid-row">
+				<el-col :lg="10" :xs="24">
+					<panel-card title="鍨冨溇鍒嗙被缁撴瀯" sub="瀛︽牎绠$悊灞傜湅缁撴瀯锛屼笉鐪嬪崟娆$О閲�">
+						<template #extra>
+							<cl-select-button v-model="mixMetric" :options="mixOptions" small />
+						</template>
+						<v-chart :option="mixOption" autoresize class="chart" />
+					</panel-card>
+				</el-col>
+				<el-col :lg="14" :xs="24">
+					<panel-card title="鍥炴敹瓒嬪娍" :sub="trendHint">
+						<template #extra>
+							<cl-select-button v-model="trendMetric" :options="trendOptions" small />
+						</template>
+						<v-chart :option="trendOption" autoresize class="chart" />
+					</panel-card>
+				</el-col>
+			</el-row>
+
+			<el-row :gutter="10">
+				<el-col :span="24">
+					<panel-card title="鍚勯櫌绯诲弬涓庝汉鏁�" sub="鎸夌敤鎴峰闄㈠悕绉� collegeName 姹囨�伙紝浜哄潎鎸夊弬涓庝汉鏁�">
+						<v-chart :option="rankOption" autoresize class="chart chart--bar" />
+					</panel-card>
+				</el-col>
+			</el-row>
+		</div>
+</template>
+
+<script lang="ts" setup>
+defineOptions({
+	name: 'report-screen-overview'
+});
+
+import { computed, ref } from 'vue';
+import KpiCard from '../../components/kpi-card.vue';
+import PanelCard from '../../components/panel-card.vue';
+import { useChartTheme, useScreenData } from '../../hooks/use-screen';
+
+const { data, timeRange } = useScreenData();
+const { textColor, mutedColor, splitColor, primary, baseGrid, axisStyle, tooltip } = useChartTheme();
+
+const mixMetric = ref<'weight' | 'value' | 'count'>('weight');
+const trendMetric = ref<'weight' | 'value' | 'carbon'>('weight');
+
+const mixOptions = [
+	{ label: '閲嶉噺', value: 'weight' },
+	{ label: '浠峰��', value: 'value' },
+	{ label: '鏁伴噺', value: 'count' }
+];
+
+const trendOptions = [
+	{ label: '閲嶉噺', value: 'weight' },
+	{ label: '浠峰��', value: 'value' },
+	{ label: '纰冲噺鎺�', value: 'carbon' }
+];
+
+const kpis = computed(() => [
+	{ label: '浠婃棩鍥炴敹閲�', value: data.value.kpis.todayWeightKg, suffix: 'kg', fixed: 1, hint: '瀹炴椂绉伴噸姹囨��' },
+	{ label: '鏈尯闂村洖鏀堕噺', value: data.value.kpis.periodWeightTon, suffix: '鍚�', fixed: 2, hint: '褰撳墠鏃堕棿鑼冨洿' },
+	{ label: '璧勬簮鍖栫巼', value: data.value.kpis.resourceRate, suffix: '%', fixed: 1, hint: '鍙洖鏀剁墿閲嶉噺 / 鎬婚噸閲忥紝涓嶅惈澶т欢鍜岀數瀛�' },
+	{ label: '鍥炴敹浠峰��', value: data.value.kpis.periodValue, suffix: '鍏�', fixed: 0, hint: '鏃ヨ〃浼扮畻閿�鍞' },
+	{ label: '纰冲噺鎺�', value: data.value.kpis.periodCarbonTon, suffix: '鍚–O鈧俥', fixed: 2, hint: '鍒嗙被閲嶉噺 脳 纰冲噺鍥犳暟' },
+	{ label: '绱鍥炴敹閲�', value: data.value.kpis.totalWeightTon, suffix: '鍚�', fixed: 1, hint: '涓婄嚎浠ユ潵绱' },
+	{ label: '绱鍙備笌浜烘暟', value: data.value.kpis.totalParticipants, suffix: '浜�', fixed: 0, hint: '鍘婚噸鏍″洯鐢ㄦ埛' },
+	{ label: '绱纰崇Н鍒�', value: data.value.kpis.totalPoints, suffix: '鍒�', fixed: 0, hint: '璐︽埛浣欓鍚堣' }
+]);
+
+const mixOption = computed(() => ({
+	tooltip: { trigger: 'item', formatter: '{b}<br/>{c} ({d}%)', ...tooltip() },
+	legend: { bottom: 0, textStyle: { color: mutedColor.value } },
+	series: [
+		{
+			type: 'pie',
+			radius: ['38%', '62%'],
+			center: ['50%', '46%'],
+			padAngle: 3,
+			itemStyle: { borderRadius: 6 },
+			label: { color: textColor.value, formatter: '{b}\n{d}%' },
+			data: data.value.wasteMix.map(e => ({
+				name: e.name,
+				value: e[mixMetric.value],
+				itemStyle: { color: e.color }
+			}))
+		}
+	]
+}));
+
+const trendHint = computed(() => {
+	const map = { today: '杩� 7 鏃�', week: '鎸夋棩', month: '鎸夋棩', quarter: '鎸夋棩', year: '鎸夋湀' };
+	return map[timeRange.value];
+});
+
+const trendUnit = computed(() => {
+	if (trendMetric.value === 'value') return '鍏�';
+	if (trendMetric.value === 'carbon') return 'kgCO鈧俥';
+	return 'kg';
+});
+
+const trendOption = computed(() => ({
+	grid: baseGrid(),
+	tooltip: { trigger: 'axis', ...tooltip() },
+	xAxis: { type: 'category', data: data.value.axis, ...axisStyle() },
+	yAxis: {
+		type: 'value',
+		name: trendUnit.value,
+		nameTextStyle: { color: mutedColor.value },
+		splitLine: { lineStyle: { color: splitColor.value, type: 'dashed' } },
+		axisLabel: { color: mutedColor.value },
+		axisLine: { show: false },
+		axisTick: { show: false }
+	},
+	series: [
+		{
+			type: 'line',
+			smooth: true,
+			showSymbol: false,
+			data: data.value.trend[trendMetric.value],
+			itemStyle: { color: primary.value },
+			areaStyle: { color: primary.value, opacity: 0.12 }
+		}
+	]
+}));
+
+const rankOption = computed(() => ({
+	grid: { containLabel: true, left: 8, right: 24, top: 16, bottom: 8 },
+	tooltip: { trigger: 'axis', ...tooltip() },
+	xAxis: {
+		type: 'value',
+		name: '浜�',
+		splitLine: { lineStyle: { color: splitColor.value, type: 'dashed' } },
+		axisLabel: { color: mutedColor.value },
+		axisLine: { show: false },
+		axisTick: { show: false }
+	},
+	yAxis: {
+		type: 'category',
+		data: data.value.deptRank.map(e => e.name).reverse(),
+		axisLabel: { color: textColor.value },
+		axisLine: { show: false },
+		axisTick: { show: false }
+	},
+	series: [
+		{
+			type: 'bar',
+			barWidth: 14,
+			data: data.value.deptRank.map(e => e.people).reverse(),
+			itemStyle: { color: primary.value, borderRadius: [0, 8, 8, 0] }
+		}
+	]
+}));
+</script>
+
+<style lang="scss" scoped>
+.screen-page {
+	.kpi-row,
+	.mid-row {
+		margin-bottom: 10px;
+	}
+
+	.kpi-row {
+		:deep(.el-col) {
+			margin-bottom: 10px;
+		}
+	}
+
+	.mid-row {
+		:deep(.panel-card) {
+			min-height: 360px;
+		}
+	}
+
+	.chart {
+		height: 300px;
+		width: 100%;
+
+		&--bar {
+			height: 320px;
+		}
+	}
+}
+</style>
diff --git a/src/modules/report/views/screen/participation.vue b/src/modules/report/views/screen/participation.vue
new file mode 100644
index 0000000..565d355
--- /dev/null
+++ b/src/modules/report/views/screen/participation.vue
@@ -0,0 +1,253 @@
+<template>
+	<div class="screen-page">
+			<el-row :gutter="10" class="kpi-row">
+				<el-col v-for="item in kpis" :key="item.label" :lg="4" :sm="12" :xs="24">
+					<kpi-card v-bind="item" />
+				</el-col>
+			</el-row>
+
+			<el-row :gutter="10" class="mid-row">
+				<el-col :lg="14" :xs="24">
+					<panel-card title="鍙備笌瓒嬪娍" sub="鍙湪浜烘暟涓庢姇閫掓鏁颁箣闂村垏鎹�">
+						<template #extra>
+							<cl-select-button v-model="trendKind" :options="trendOptions" small />
+						</template>
+						<v-chart :option="trendOption" autoresize class="chart" />
+					</panel-card>
+				</el-col>
+				<el-col :lg="10" :xs="24">
+					<panel-card title="纰崇Н鍒嗘祦杞�" sub="绗竴鐗堢敤娴佸悜锛屼笉鍋� Sankey">
+						<div class="flow">
+							<div class="flow__node is-in">
+								<span>鍙戞斁</span>
+								<strong>{{ data.pointFlow.issued.toLocaleString() }}</strong>
+							</div>
+							<div class="flow__arrow">鈫�</div>
+							<div class="flow__split">
+								<div>
+									<span>杞禒</span>
+									<strong>{{ data.pointFlow.transfer.toLocaleString() }}</strong>
+								</div>
+								<div>
+									<span>鎹愯禒</span>
+									<strong>{{ data.pointFlow.donate.toLocaleString() }}</strong>
+								</div>
+								<div>
+									<span>鍟嗗煄娑堣垂</span>
+									<strong>{{ data.pointFlow.mall.toLocaleString() }}</strong>
+								</div>
+							</div>
+							<div class="flow__arrow">鈫�</div>
+							<div class="flow__node is-out">
+								<span>褰撳墠浣欓</span>
+								<strong>{{ data.pointFlow.balance.toLocaleString() }}</strong>
+							</div>
+						</div>
+					</panel-card>
+				</el-col>
+			</el-row>
+
+			<el-row :gutter="10">
+				<el-col :span="24">
+					<panel-card title="缁勭粐鎺掕姒�" sub="浜哄潎鎸夊弬涓庝汉鏁帮紱闄㈢郴涓嶇粺璁″弬涓庣巼">
+						<template #extra>
+							<div class="rank-tools">
+								<cl-select-button v-model="rankOrg" :options="orgOptions" small />
+								<cl-select-button v-model="rankMetric" :options="metricOptions" small />
+							</div>
+						</template>
+						<v-chart :option="rankOption" autoresize class="chart chart--rank" />
+					</panel-card>
+				</el-col>
+			</el-row>
+		</div>
+</template>
+
+<script lang="ts" setup>
+defineOptions({
+	name: 'report-screen-participation'
+});
+
+import { computed, ref } from 'vue';
+import KpiCard from '../../components/kpi-card.vue';
+import PanelCard from '../../components/panel-card.vue';
+import { type RankMetric } from '../../data/screen';
+import { useChartTheme, useScreenData } from '../../hooks/use-screen';
+
+const { data } = useScreenData();
+const { textColor, mutedColor, splitColor, primary, baseGrid, axisStyle, tooltip } = useChartTheme();
+
+const trendKind = ref<'people' | 'times'>('people');
+const rankOrg = ref<'class' | 'major' | 'dept'>('class');
+const rankMetric = ref<RankMetric>('people');
+
+const trendOptions = [
+	{ label: '姣忔棩鍙備笌浜烘暟', value: 'people' },
+	{ label: '姣忔棩鎶曢�掓鏁�', value: 'times' }
+];
+
+const orgOptions = [
+	{ label: '鐝骇', value: 'class' },
+	{ label: '涓撲笟', value: 'major' },
+	{ label: '闄㈢郴', value: 'dept' }
+];
+
+const metricOptions: { label: string; value: RankMetric }[] = [
+	{ label: '鍙備笌浜烘暟', value: 'people' },
+	{ label: '鍥炴敹閲嶉噺', value: 'weight' },
+	{ label: '浜哄潎鍥炴敹閲�', value: 'weightPerCapita' },
+	{ label: '浜哄潎绉垎', value: 'pointPerCapita' },
+	{ label: '纰冲噺鎺�', value: 'carbon' }
+];
+
+const kpis = computed(() => [
+	{ label: '鍙備笌甯堢敓', value: data.value.kpis.totalParticipants, suffix: '浜�', fixed: 0 },
+	{ label: '鍙備笌鐜�', value: data.value.kpis.participateRate, suffix: '%', fixed: 1, hint: '鍙備笌浜烘暟 / 鍙傛暟 student.count.{閮ㄩ棬ID}' },
+	{ label: '鏈尯闂存柊澧炲弬涓�', value: data.value.kpis.newParticipants, suffix: '浜�', fixed: 0, hint: '鍖洪棿鍐呭嚭鐜拌繃鐨勫幓閲嶇敤鎴�' },
+	{ label: '纰崇Н鍒嗗彂鏀�', value: data.value.kpis.pointsIssued, suffix: '鍒�', fixed: 0 },
+	{ label: '纰崇Н鍒嗘秷璐�', value: data.value.kpis.pointsConsumed, suffix: '鍒�', fixed: 0 },
+	{ label: '纰崇Н鍒嗕綑棰�', value: data.value.kpis.pointsBalance, suffix: '鍒�', fixed: 0 }
+]);
+
+const trendOption = computed(() => ({
+	grid: baseGrid(),
+	tooltip: { trigger: 'axis', ...tooltip() },
+	xAxis: { type: 'category', data: data.value.axis, ...axisStyle() },
+	yAxis: {
+		type: 'value',
+		splitLine: { lineStyle: { color: splitColor.value, type: 'dashed' } },
+		axisLabel: { color: mutedColor.value },
+		axisLine: { show: false },
+		axisTick: { show: false }
+	},
+	series: [
+		{
+			type: 'line',
+			smooth: true,
+			showSymbol: false,
+			data: trendKind.value === 'people' ? data.value.participateTrend : data.value.deliverTrend,
+			itemStyle: { color: primary.value },
+			areaStyle: { color: primary.value, opacity: 0.12 }
+		}
+	]
+}));
+
+const rankRows = computed(() => {
+	if (rankOrg.value === 'major') return data.value.majorRank;
+	if (rankOrg.value === 'dept') return data.value.deptRank;
+	return data.value.classRank;
+});
+
+const rankOption = computed(() => {
+	const rows = [...rankRows.value].reverse();
+	return {
+		grid: { containLabel: true, left: 8, right: 24, top: 12, bottom: 8 },
+		tooltip: { trigger: 'axis', ...tooltip() },
+		xAxis: {
+			type: 'value',
+			splitLine: { lineStyle: { color: splitColor.value, type: 'dashed' } },
+			axisLabel: { color: mutedColor.value },
+			axisLine: { show: false },
+			axisTick: { show: false }
+		},
+		yAxis: {
+			type: 'category',
+			data: rows.map(e => e.name),
+			axisLabel: { color: textColor.value },
+			axisLine: { show: false },
+			axisTick: { show: false }
+		},
+		series: [
+			{
+				type: 'bar',
+				barWidth: 14,
+				data: rows.map(e => Number((e as Record<string, number>)[rankMetric.value] || 0)),
+				itemStyle: { color: primary.value, borderRadius: [0, 8, 8, 0] }
+			}
+		]
+	};
+});
+</script>
+
+<style lang="scss" scoped>
+.screen-page {
+	.kpi-row,
+	.mid-row {
+		margin-bottom: 10px;
+	}
+
+	.kpi-row {
+		:deep(.el-col) {
+			margin-bottom: 10px;
+		}
+	}
+
+	.mid-row {
+		:deep(.panel-card) {
+			min-height: 360px;
+		}
+	}
+
+	.chart {
+		height: 300px;
+		width: 100%;
+
+		&--rank {
+			height: 340px;
+		}
+	}
+
+	.rank-tools {
+		display: flex;
+		flex-wrap: wrap;
+		gap: 8px;
+		justify-content: flex-end;
+	}
+
+	.flow {
+		display: flex;
+		flex-direction: column;
+		align-items: stretch;
+		justify-content: center;
+		height: 300px;
+		padding: 8px 16px;
+		gap: 8px;
+
+		&__node,
+		&__split > div {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			padding: 12px 14px;
+			border-radius: 10px;
+			background: var(--el-fill-color-lighter);
+			font-size: 13px;
+			color: var(--el-text-color-secondary);
+
+			strong {
+				font-size: 20px;
+				color: var(--el-text-color-primary);
+			}
+		}
+
+		&__node.is-in strong {
+			color: var(--el-color-success);
+		}
+
+		&__node.is-out strong {
+			color: var(--el-color-primary);
+		}
+
+		&__split {
+			display: grid;
+			grid-template-columns: repeat(3, 1fr);
+			gap: 8px;
+		}
+
+		&__arrow {
+			text-align: center;
+			color: var(--el-text-color-secondary);
+		}
+	}
+}
+</style>
diff --git a/src/modules/report/views/screen/resource.vue b/src/modules/report/views/screen/resource.vue
new file mode 100644
index 0000000..4afc7d9
--- /dev/null
+++ b/src/modules/report/views/screen/resource.vue
@@ -0,0 +1,160 @@
+<template>
+	<div class="screen-page">
+			<el-row :gutter="10" class="kpi-row">
+				<el-col v-for="item in kpis" :key="item.label" :lg="4" :sm="12" :xs="24">
+					<kpi-card v-bind="item" />
+				</el-col>
+			</el-row>
+
+			<el-row :gutter="10" class="mid-row">
+				<el-col :lg="10" :xs="24">
+					<panel-card title="鍙洖鏀剁墿鍝佺被鍗犳瘮" sub="鍚屼竴鏃堕棿鑼冨洿锛岀湅缁撴瀯">
+						<v-chart :option="pieOption" autoresize class="chart" />
+					</panel-card>
+				</el-col>
+				<el-col :lg="14" :xs="24">
+					<panel-card title="鍚勭被鍥炴敹閲�" sub="妯悜鏌辩姸鍥炬洿閫傚悎闀垮搧绫诲悕">
+						<v-chart :option="weightOption" autoresize class="chart" />
+					</panel-card>
+				</el-col>
+			</el-row>
+
+			<el-row :gutter="10">
+				<el-col :span="24">
+					<panel-card title="鍥炴敹浠峰�煎垎鏋�" sub="瀛︽牎鏈�鍏冲績锛氫粈涔堝瀮鍦炬渶鍊奸挶">
+						<v-chart :option="valueOption" autoresize class="chart chart--value" />
+					</panel-card>
+				</el-col>
+			</el-row>
+		</div>
+</template>
+
+<script lang="ts" setup>
+defineOptions({
+	name: 'report-screen-resource'
+});
+
+import { computed } from 'vue';
+import KpiCard from '../../components/kpi-card.vue';
+import PanelCard from '../../components/panel-card.vue';
+import { useChartTheme, useScreenData } from '../../hooks/use-screen';
+
+const { data } = useScreenData();
+const { textColor, mutedColor, splitColor, primary, tooltip } = useChartTheme();
+
+const kpis = computed(() => [
+	{ label: '鍥炴敹鎬婚噺', value: data.value.kpis.periodWeightTon, suffix: '鍚�', fixed: 2, hint: '鍏ㄩ儴鍒嗙被閲嶉噺鍚堣' },
+	{ label: '鍙洖鏀剁墿', value: data.value.kpis.recyclableTon, suffix: '鍚�', fixed: 2, hint: 'SW62' },
+	{ label: '澶т欢鍨冨溇', value: data.value.kpis.bulkTon, suffix: '鍚�', fixed: 2, hint: 'SW63' },
+	{ label: '鐢靛瓙浜у搧', value: data.value.kpis.elecTon, suffix: '鍚�', fixed: 2, hint: '鍙洖鏀跺瓙绫�' },
+	{ label: '搴熸棫缁囩墿', value: data.value.kpis.fabricTon, suffix: '鍚�', fixed: 2, hint: '鍙洖鏀跺瓙绫�' }
+]);
+
+const pieOption = computed(() => ({
+	tooltip: { trigger: 'item', formatter: '{b}<br/>{c} kg ({d}%)', ...tooltip() },
+	legend: { bottom: 0, textStyle: { color: mutedColor.value } },
+	series: [
+		{
+			type: 'pie',
+			radius: ['36%', '60%'],
+			center: ['50%', '46%'],
+			padAngle: 3,
+			itemStyle: { borderRadius: 6 },
+			label: { color: textColor.value, formatter: '{b} {d}%' },
+			data: data.value.recycleItems.map(e => ({
+				name: e.name,
+				value: e.weight,
+				itemStyle: { color: e.color }
+			}))
+		}
+	]
+}));
+
+const weightOption = computed(() => ({
+	grid: { containLabel: true, left: 8, right: 28, top: 12, bottom: 8 },
+	tooltip: { trigger: 'axis', ...tooltip() },
+	xAxis: {
+		type: 'value',
+		name: 'kg',
+		splitLine: { lineStyle: { color: splitColor.value, type: 'dashed' } },
+		axisLabel: { color: mutedColor.value },
+		axisLine: { show: false },
+		axisTick: { show: false }
+	},
+	yAxis: {
+		type: 'category',
+		data: data.value.recycleItems.map(e => e.name).reverse(),
+		axisLabel: { color: textColor.value },
+		axisLine: { show: false },
+		axisTick: { show: false }
+	},
+	series: [
+		{
+			type: 'bar',
+			barWidth: 16,
+			data: data.value.recycleItems
+				.map(e => ({ value: e.weight, itemStyle: { color: e.color, borderRadius: [0, 8, 8, 0] } }))
+				.reverse()
+		}
+	]
+}));
+
+const valueOption = computed(() => ({
+	grid: { containLabel: true, left: 16, right: 16, top: 28, bottom: 8 },
+	tooltip: { trigger: 'axis', ...tooltip() },
+	xAxis: {
+		type: 'category',
+		data: data.value.recycleItems.map(e => e.name),
+		axisLabel: { color: mutedColor.value },
+		axisLine: { show: false },
+		axisTick: { show: false }
+	},
+	yAxis: {
+		type: 'value',
+		name: '鍏�',
+		nameTextStyle: { color: mutedColor.value },
+		splitLine: { lineStyle: { color: splitColor.value, type: 'dashed' } },
+		axisLabel: { color: mutedColor.value },
+		axisLine: { show: false },
+		axisTick: { show: false }
+	},
+	series: [
+		{
+			type: 'bar',
+			barWidth: 28,
+			data: data.value.recycleItems.map(e => e.value),
+			itemStyle: { color: primary.value, borderRadius: [6, 6, 0, 0] }
+		}
+	]
+}));
+</script>
+
+<style lang="scss" scoped>
+.screen-page {
+	.kpi-row,
+	.mid-row {
+		margin-bottom: 10px;
+	}
+
+	.kpi-row {
+		:deep(.el-col) {
+			margin-bottom: 10px;
+		}
+	}
+
+	.mid-row {
+		:deep(.panel-card) {
+			min-height: 360px;
+		}
+	}
+
+	.chart {
+		height: 300px;
+		width: 100%;
+
+		&--value {
+			height: 280px;
+		}
+	}
+}
+</style>

--
Gitblit v1.9.1