wangzhibo
4 天以前 656e2507b9aa388afa4c3346927b1b94ab70a0b2
add 监控大屏
12个文件已添加
2个文件已修改
2014 ■■■■■ 已修改文件
build/cool/eps.d.ts 268 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
build/cool/eps.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/components/kpi-card.vue 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/components/panel-card.vue 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/components/screen-shell.vue 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/config.ts 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/data/screen.ts 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/hooks/use-screen.ts 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/views/screen/carbon.vue 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/views/screen/index.vue 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/views/screen/operation.vue 307 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/views/screen/overview.vue 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/views/screen/participation.vue 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/views/screen/resource.vue 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
build/cool/eps.d.ts
@@ -1901,7 +1901,7 @@
        /**
         * 用户ID
         */
        userId?: number;
        userId?: string;
        /**
         * 优惠券ID
@@ -2147,7 +2147,7 @@
        /**
         * 经手人ID
         */
        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;
        /**
         * 所属单位ID
         */
        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;
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":"代码","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":"父ID","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":"优惠券ID","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":"客户端ID","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":"分拣员ID","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":"操作人ID","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":["禁用","正常","已注销"],"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"}]}}]
[{"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":"代码","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":"父ID","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":"优惠券ID","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":"客户端ID","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":["正常","迟到","早退","缺卡","旷工"],"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":"分拣员ID","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":"操作人ID","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":["禁用","正常","已注销"],"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"}]}}]
src/modules/report/components/kpi-card.vue
New file
@@ -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>
src/modules/report/components/panel-card.vue
New file
@@ -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>
src/modules/report/components/screen-shell.vue
New file
@@ -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="当前拿不到或口径待确认的指标" 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>
src/modules/report/config.ts
New file
@@ -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')
            }
        ]
    };
};
src/modules/report/data/screen.ts
New file
@@ -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: []
    };
}
src/modules/report/hooks/use-screen.ts
New file
@@ -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 || '驾驶舱接口调用失败';
        } 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
    };
}
src/modules/report/views/screen/carbon.vue
New file
@@ -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₂e,展示时 ÷1000 为吨">
                        <v-chart :option="yearOption" autoresize class="chart" />
                    </panel-card>
                </el-col>
                <el-col :lg="8" :xs="24">
                    <panel-card title="口径说明" sub="大屏只展示 KPI,不直接绑表">
                        <ul class="note">
                            <li>碳减排 = Σ 分类重量 × 碳减因数 × 方向</li>
                            <li>因数来自垃圾种类 carbonFactor</li>
                            <li>日表字段单位为 kgCO₂e,大屏吨数已除以 1000</li>
                            <li>本页给学校双碳、ESG、绿色教育汇报,不展示分拣点明细</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: '吨CO₂e', fixed: 1 },
    { label: '本年度碳减排', value: data.value.kpis.yearCarbonTon, suffix: '吨CO₂e', fixed: 1 },
    { label: '本区间碳减排', value: data.value.kpis.periodCarbonTon, suffix: '吨CO₂e', 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: '吨CO₂e',
            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: '吨CO₂e',
        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₂e ({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>
src/modules/report/views/screen/index.vue
New file
@@ -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>
src/modules/report/views/screen/operation.vue
New file
@@ -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>
src/modules/report/views/screen/overview.vue
New file
@@ -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: '吨CO₂e', 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₂e';
    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>
src/modules/report/views/screen/participation.vue
New file
@@ -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>
src/modules/report/views/screen/resource.vue
New file
@@ -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>