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