wangzhibo
昨天 5e756b5a69bcd957f8eafc5f99a4f6413691d6dd
add maps
1个文件已删除
8个文件已添加
2个文件已修改
1486 ■■■■■ 已修改文件
build/cool/eps.d.ts 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
build/cool/eps.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/maps/components/map-board.vue 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/maps/components/track-toolbar.vue 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/maps/config.ts 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/maps/hooks/use-map.ts 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/maps/hooks/use-track.ts 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/maps/views/layers.vue 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/maps/views/site.vue 296 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/maps/views/sorter.vue 267 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/maps/views/vehicle.vue 285 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
build/cool/eps.d.ts
@@ -4972,6 +4972,20 @@
    type json = any;
    type DictKey =
        | "upgradeType"
        | "complainType"
        | "feedbackType"
        | "ratedpayload"
        | "iottype"
        | "brand"
        | "occupation"
        | "sitetype"
        | "datachanel"
        | "vehicletype"
        | "businesstype"
        | "appointmentslot";
    interface PagePagination {
        size: number;
        page: number;
@@ -7067,6 +7081,78 @@
            list: boolean;
            page: boolean;
            add: boolean;
        };
        request: Request;
    }
    interface MapsLive {
        /**
         * 在线车辆位置
         */
        vehicleOnline(data?: any): Promise<any>;
        /**
         * 车辆司机行为消息
         */
        vehicleEvents(data?: any): Promise<any>;
        /**
         * 在线分拣员位置
         */
        sorterOnline(data?: any): Promise<any>;
        /**
         * 分拣员健康与告警
         */
        sorterHealth(data?: any): Promise<any>;
        /**
         * 车辆历史轨迹
         */
        vehicleTrack(data?: any): Promise<any>;
        /**
         * 分拣员历史轨迹
         */
        sorterTrack(data?: any): Promise<any>;
        /**
         * 站点称重历史
         */
        siteWeight(data?: any): Promise<any>;
        /**
         * 站点地图点位
         */
        sites(data?: any): Promise<any>;
        /**
         * 权限标识
         */
        permission: {
            vehicleOnline: string;
            vehicleEvents: string;
            sorterOnline: string;
            sorterHealth: string;
            vehicleTrack: string;
            sorterTrack: string;
            siteWeight: string;
            sites: string;
        };
        /**
         * 权限状态
         */
        _permission: {
            vehicleOnline: boolean;
            vehicleEvents: boolean;
            sorterOnline: boolean;
            sorterHealth: boolean;
            vehicleTrack: boolean;
            sorterTrack: boolean;
            siteWeight: boolean;
            sites: boolean;
        };
        request: Request;
@@ -9217,6 +9303,7 @@
            type: GoodsType;
        };
        info: { banner: InfoBanner };
        maps: { live: MapsLive };
        market: { coupon: { info: MarketCouponInfo; user: MarketCouponUser } };
        monitor: { capturetask: MonitorCapturetask; ys7: MonitorYs7 };
        operation: { traderecord: OperationTraderecord; wastesale: OperationWastesale };
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":"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"}]}}]
[{"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/maps/live","name":"","api":[{"method":"post","path":"/vehicleOnline"},{"method":"post","path":"/vehicleEvents"},{"method":"post","path":"/sorterOnline"},{"method":"post","path":"/sorterHealth"},{"method":"post","path":"/vehicleTrack"},{"method":"post","path":"/sorterTrack"},{"method":"post","path":"/siteWeight"},{"method":"post","path":"/sites"}],"search":{"fieldEq":[],"fieldLike":[],"keyWordLikeFields":[]}},{"prefix":"/admin/market/coupon/info","name":"MarketCouponInfoEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"状态 0-禁用 1-启用","nullable":false,"defaultValue":0,"source":"a.status"}],"fieldLike":[],"keyWordLikeFields":[{"propertyName":"title","type":"string","length":"","comment":"标题","nullable":false,"source":"a.title"}]}},{"prefix":"/admin/market/coupon/user","name":"MarketCouponUserEntity","api":[{"method":"post","path":"/delete"},{"method":"post","path":"/update"},{"method":"get","path":"/info"},{"method":"post","path":"/list"},{"method":"post","path":"/page"},{"method":"post","path":"/add"}],"search":{"fieldEq":[{"propertyName":"status","type":"number","length":"","comment":"状态 0-未使用 1-已使用","nullable":false,"defaultValue":0,"source":"a.status"},{"propertyName":"couponId","type":"number","length":"","comment":"优惠券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/maps/components/map-board.vue
New file
@@ -0,0 +1,137 @@
<template>
    <div class="map-board">
        <aside class="map-board__side">
            <div class="map-board__side-head">
                <slot name="side-head" />
            </div>
            <div class="map-board__side-body">
                <slot name="side" />
            </div>
        </aside>
        <div class="map-board__map">
            <slot name="map" />
            <div v-if="$slots.legend" class="map-board__legend">
                <slot name="legend" />
            </div>
        </div>
        <aside v-if="open" class="map-board__panel">
            <div class="map-board__panel-head">
                <div>
                    <div class="map-board__panel-title">{{ title }}</div>
                    <div v-if="sub" class="map-board__panel-sub">{{ sub }}</div>
                </div>
                <el-button text @click="$emit('close')">关闭</el-button>
            </div>
            <div class="map-board__panel-body">
                <slot name="panel" />
            </div>
        </aside>
    </div>
</template>
<script lang="ts" setup>
defineProps<{
    open?: boolean;
    title?: string;
    sub?: string;
}>();
defineEmits(['close']);
</script>
<style lang="scss" scoped>
.map-board {
    display: flex;
    height: 100%;
    min-height: calc(100vh - 140px);
    background: var(--el-bg-color-page);
    gap: 10px;
    &__side {
        width: 260px;
        flex-shrink: 0;
        display: flex;
        flex-direction: column;
        border: 1px solid var(--el-border-color-extra-light);
        border-radius: 10px;
        background: var(--el-bg-color);
        overflow: hidden;
    }
    &__side-head {
        padding: 12px;
        border-bottom: 1px solid var(--el-border-color-extra-light);
    }
    &__side-body {
        flex: 1;
        overflow: auto;
    }
    &__map {
        flex: 1;
        min-width: 0;
        position: relative;
        border-radius: 10px;
        overflow: hidden;
        border: 1px solid var(--el-border-color-extra-light);
    }
    &__legend {
        position: absolute;
        left: 12px;
        bottom: 12px;
        z-index: 20;
        padding: 8px 10px;
        border-radius: 8px;
        background: rgba(255, 255, 255, 0.92);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
        font-size: 12px;
    }
    &__panel {
        width: 420px;
        flex-shrink: 0;
        display: flex;
        flex-direction: column;
        border: 1px solid var(--el-border-color-extra-light);
        border-radius: 10px;
        background: var(--el-bg-color);
        overflow: hidden;
    }
    &__panel-head {
        display: flex;
        align-items: flex-start;
        justify-content: space-between;
        gap: 8px;
        padding: 12px 14px;
        border-bottom: 1px solid var(--el-border-color-extra-light);
    }
    &__panel-title {
        font-size: 16px;
        font-weight: 700;
        color: var(--el-text-color-primary);
    }
    &__panel-sub {
        margin-top: 4px;
        font-size: 12px;
        color: var(--el-text-color-secondary);
    }
    &__panel-body {
        flex: 1;
        min-height: 0;
        overflow: auto;
        padding: 0 12px 12px;
    }
}
:deep(.tdt-container),
:deep(.mapDiv) {
    width: 100%;
    height: 100%;
}
</style>
src/modules/maps/components/track-toolbar.vue
New file
@@ -0,0 +1,110 @@
<template>
    <div class="track-bar">
        <el-popover v-model:visible="open" placement="bottom-start" :width="340" trigger="click">
            <template #reference>
                <el-button :icon="Setting" circle size="small" />
            </template>
            <div class="track-bar__form">
                <div class="track-bar__label">查询时段</div>
                <el-date-picker
                    v-model="range"
                    type="datetimerange"
                    start-placeholder="开始时间"
                    end-placeholder="结束时间"
                    format="YYYY-MM-DD HH:mm"
                    value-format="YYYY-MM-DD HH:mm:ss"
                    size="small"
                />
                <div class="track-bar__actions">
                    <el-button size="small" @click="open = false">取消</el-button>
                    <el-button type="primary" size="small" @click="confirm">查询轨迹</el-button>
                </div>
            </div>
        </el-popover>
        <el-button size="small" :disabled="!hasTrack" @click="$emit(playing ? 'pause' : 'play')">
            {{ playing ? '暂停' : '播放' }}
        </el-button>
        <el-button size="small" :disabled="!hasTrack" @click="$emit('stop')">停止</el-button>
        <span class="track-bar__speed">{{ speed }}x</span>
        <el-slider v-model="speedModel" :min="1" :max="30" :step="1" class="track-bar__slider" />
        <el-progress :percentage="progress" :stroke-width="6" class="track-bar__progress" />
    </div>
</template>
<script lang="ts" setup>
import { computed, ref, watch } from 'vue';
import { Setting } from '@element-plus/icons-vue';
const props = defineProps<{
    playing?: boolean;
    speed?: number;
    progress?: number;
    hasTrack?: boolean;
    startTime?: string;
    endTime?: string;
}>();
const emit = defineEmits(['update:speed', 'play', 'pause', 'stop', 'query']);
const open = ref(false);
const range = ref<[string, string] | null>(null);
const speedModel = computed({
    get: () => props.speed || 5,
    set: v => emit('update:speed', v)
});
watch(
    () => [props.startTime, props.endTime],
    () => {
        if (props.startTime && props.endTime) range.value = [props.startTime, props.endTime];
    },
    { immediate: true }
);
function confirm() {
    if (!range.value) return;
    emit('query', range.value);
    open.value = false;
}
</script>
<style lang="scss" scoped>
.track-bar {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 0 4px;
    &__slider {
        width: 96px;
    }
    &__speed {
        font-size: 12px;
        color: var(--el-text-color-secondary);
        min-width: 28px;
    }
    &__progress {
        flex: 1;
        min-width: 80px;
    }
    &__form {
        display: flex;
        flex-direction: column;
        gap: 8px;
    }
    &__label {
        font-size: 12px;
        color: var(--el-text-color-secondary);
    }
    &__actions {
        display: flex;
        justify-content: flex-end;
        gap: 8px;
    }
}
</style>
src/modules/maps/config.ts
New file
@@ -0,0 +1,29 @@
import { type ModuleConfig } from '/@/cool';
export default (): ModuleConfig => {
    return {
        label: '地图监控',
        description: '站点、分拣员、车辆实时位置与历史轨迹',
        order: 8,
        views: [
            {
                path: '/maps/site',
                name: 'maps-site',
                meta: { label: '站点地图' },
                component: () => import('./views/site.vue')
            },
            {
                path: '/maps/sorter',
                name: 'maps-sorter',
                meta: { label: '分拣员位置' },
                component: () => import('./views/sorter.vue')
            },
            {
                path: '/maps/vehicle',
                name: 'maps-vehicle',
                meta: { label: '车辆位置' },
                component: () => import('./views/vehicle.vue')
            }
        ]
    };
};
src/modules/maps/hooks/use-map.ts
New file
@@ -0,0 +1,92 @@
import type { LngLat } from 'vue-tianditu2';
import { useCool } from '/@/cool';
export const MAP_TK = '51915011aa0997aa2ddd7e38504fa8bc';
export const MAP_LOAD = { v: '4.0', tk: MAP_TK };
export const DEFAULT_CENTER: LngLat = [121.280637, 32.125178];
export function pinIcon(color: string) {
    const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="28" height="40" viewBox="0 0 28 40"><path fill="${color}" stroke="#fff" stroke-width="1.5" d="M14 1C7.4 1 2 6.4 2 13c0 8.8 12 25 12 25s12-16.2 12-25C26 6.4 20.6 1 14 1z"/><circle cx="14" cy="13" r="5" fill="#fff"/></svg>`;
    return {
        iconUrl: 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg),
        iconSize: [28, 40] as [number, number],
        iconAnchor: [14, 40] as [number, number]
    };
}
export const SITE_ICONS = {
    收集点: pinIcon('#16a34a'),
    压缩站: pinIcon('#f59e0b'),
    default: pinIcon('#3b82f6')
};
export function siteIcon(type: string) {
    if (type === '压缩站') return SITE_ICONS.压缩站;
    if (type === '收集点') return SITE_ICONS.收集点;
    return SITE_ICONS.default;
}
export const SORTER_ICON = pinIcon('#2563eb');
export const VEHICLE_ICON = pinIcon('#7c3aed');
export const PLAY_ICON = pinIcon('#ef4444');
export function useMapsApi() {
    const { service } = useCool();
    function call(name: string, data?: Record<string, any>) {
        const api = (service as any).maps?.live?.[name];
        if (typeof api === 'function') {
            return api.call((service as any).maps.live, data);
        }
        return service.request({
            url: `admin/maps/live/${name}`,
            method: 'POST',
            data
        });
    }
    return {
        sites: () => call('sites'),
        siteWeight: (data: { businessId: string; startTime: string; endTime: string }) => call('siteWeight', data),
        sorterOnline: () => call('sorterOnline'),
        sorterTrack: (data: { idCard: string; startTime: string; endTime: string }) => call('sorterTrack', data),
        sorterHealth: (idCard: string) => call('sorterHealth', { idCard }),
        vehicleOnline: () => call('vehicleOnline'),
        vehicleTrack: (data: { vehicleNo: string; startTime: string; endTime: string }) => call('vehicleTrack', data),
        vehicleEvents: (vehicleNo: string) => call('vehicleEvents', { vehicleNo })
    };
}
export async function fetchYsToken(service: any) {
    const res = await service.base.sys.param.stringbykey({ key: 'ys7.accessToken' });
    return (res as string) || '';
}
export function formatTime(v: any) {
    if (!v) return '-';
    const d = new Date(v);
    if (Number.isNaN(d.getTime())) return String(v);
    const p = (n: number) => String(n).padStart(2, '0');
    return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;
}
export function dayRange(offsetEnd = 0, offsetStart = 0) {
    const end = new Date();
    end.setHours(23, 59, 59, 999);
    if (offsetEnd) end.setTime(end.getTime() + offsetEnd);
    const start = new Date();
    start.setHours(0, 0, 0, 0);
    if (offsetStart) start.setTime(start.getTime() + offsetStart);
    return { start, end };
}
export function lastHours(hours = 1) {
    const end = new Date();
    const start = new Date(end.getTime() - hours * 3600 * 1000);
    return { start, end };
}
export function toStamp(v: any) {
    const t = new Date(v).getTime();
    return Number.isFinite(t) ? t : 0;
}
src/modules/maps/hooks/use-track.ts
New file
@@ -0,0 +1,97 @@
import { onBeforeUnmount, ref, type Ref } from 'vue';
import type { LngLat } from 'vue-tianditu2';
import { toStamp } from '../hooks/use-map';
export type TrackPoint = { longitude: number; latitude: number; time?: any; speed?: number };
export function useTrackPlayback(points: Ref<TrackPoint[]>) {
    const playing = ref(false);
    const speed = ref(5);
    const progress = ref(0);
    const playPos = ref<LngLat | null>(null);
    let raf = 0;
    let startedAt = 0;
    let elapsed = 0;
    function path(): LngLat[] {
        return points.value
            .filter(p => Number(p.longitude) && Number(p.latitude))
            .map(p => [Number(p.longitude), Number(p.latitude)] as LngLat);
    }
    function duration() {
        const list = points.value;
        if (list.length < 2) return 8000;
        const t0 = toStamp(list[0].time);
        const t1 = toStamp(list[list.length - 1].time);
        const real = t1 > t0 ? t1 - t0 : list.length * 2000;
        return Math.max(real, 4000);
    }
    function at(ratio: number): LngLat | null {
        const list = path();
        if (!list.length) return null;
        if (list.length === 1) return list[0];
        const times = points.value.map((p, i) => toStamp(p.time) || i * 1000);
        const t0 = times[0];
        const t1 = times[times.length - 1];
        const span = Math.max(t1 - t0, 1);
        const target = t0 + span * ratio;
        let i = 0;
        while (i < times.length - 1 && times[i + 1] < target) i += 1;
        const a = list[i];
        const b = list[Math.min(i + 1, list.length - 1)];
        const seg = Math.max(times[Math.min(i + 1, times.length - 1)] - times[i], 1);
        const k = Math.min(Math.max((target - times[i]) / seg, 0), 1);
        return [a[0] + (b[0] - a[0]) * k, a[1] + (b[1] - a[1]) * k];
    }
    function tick(now: number) {
        if (!playing.value) return;
        const total = duration() / Math.max(speed.value, 1);
        elapsed += now - startedAt;
        startedAt = now;
        const ratio = Math.min(elapsed / total, 1);
        progress.value = Math.round(ratio * 100);
        playPos.value = at(ratio);
        if (ratio >= 1) {
            playing.value = false;
            return;
        }
        raf = requestAnimationFrame(tick);
    }
    function play() {
        if (!points.value.length) return;
        if (progress.value >= 100) {
            progress.value = 0;
            elapsed = 0;
        }
        playing.value = true;
        startedAt = performance.now();
        raf = requestAnimationFrame(tick);
    }
    function pause() {
        playing.value = false;
        cancelAnimationFrame(raf);
    }
    function stop() {
        pause();
        elapsed = 0;
        progress.value = 0;
        playPos.value = points.value.length
            ? [Number(points.value[0].longitude), Number(points.value[0].latitude)]
            : null;
    }
    function reset() {
        stop();
        playPos.value = null;
    }
    onBeforeUnmount(pause);
    return { playing, speed, progress, playPos, path, play, pause, stop, reset };
}
src/modules/maps/views/layers.vue
File was deleted
src/modules/maps/views/site.vue
New file
@@ -0,0 +1,296 @@
<template>
    <map-board :open="!!current" :title="current?.businessName" :sub="current?.siteType" @close="current = null">
        <template #side-head>
            <el-input v-model="keyword" placeholder="搜索站点" clearable size="small" />
            <div class="filters">
                <el-checkbox-group v-model="types" size="small">
                    <el-checkbox value="收集点" label="收集点">收集点</el-checkbox>
                    <el-checkbox value="压缩站" label="压缩站">压缩站</el-checkbox>
                </el-checkbox-group>
            </div>
        </template>
        <template #side>
            <div
                v-for="item in visibleSites"
                :key="item.id"
                class="list-item"
                :class="{ 'is-active': current?.id === item.id }"
                @click="select(item)"
            >
                <i :style="{ background: item.siteType === '压缩站' ? '#f59e0b' : '#16a34a' }" />
                <div>
                    <div class="list-item__name">{{ item.businessName }}</div>
                    <div class="list-item__meta">{{ item.siteType }} · {{ item.address || '无地址' }}</div>
                </div>
            </div>
            <el-empty v-if="!visibleSites.length" description="暂无站点" :image-size="64" />
        </template>
        <template #legend>
            <div class="legend"><i style="background:#16a34a" />收集点</div>
            <div class="legend"><i style="background:#f59e0b" />压缩站</div>
        </template>
        <template #map>
            <div class="mapDiv">
                <tdt-map :center="center" :zoom="zoom" :controls="controls" :loadConfig="MAP_LOAD">
                    <tdt-marker
                        v-for="item in visibleSites"
                        :key="item.id"
                        :position="pos(item)"
                        :icon="siteIcon(item.siteType)"
                        :title="item.businessName"
                        @click="select(item)"
                    />
                </tdt-map>
            </div>
        </template>
        <template #panel>
            <el-tabs v-model="tab">
                <el-tab-pane label="基本属性" name="info">
                    <el-descriptions :column="1" border size="small">
                        <el-descriptions-item label="站点编码">{{ current?.businessId }}</el-descriptions-item>
                        <el-descriptions-item label="名称">{{ current?.businessName }}</el-descriptions-item>
                        <el-descriptions-item label="类型">{{ current?.siteType }}</el-descriptions-item>
                        <el-descriptions-item label="地址">{{ current?.address || '-' }}</el-descriptions-item>
                        <el-descriptions-item label="负责人">{{ current?.leader || '-' }}</el-descriptions-item>
                        <el-descriptions-item label="经纬度">{{ current?.longitude }}, {{ current?.latitude }}</el-descriptions-item>
                        <el-descriptions-item label="备注">{{ current?.remark || '-' }}</el-descriptions-item>
                    </el-descriptions>
                    <cl-image v-if="current?.photo" :src="current.photo" style="margin-top: 10px; width: 100%" />
                </el-tab-pane>
                <el-tab-pane label="实时监控" name="live">
                    <el-empty v-if="!cameras.length" description="该站点没有关联监控" :image-size="72" />
                    <div v-for="dev in cameras" :key="dev.id" class="cam">
                        <div class="cam__name">{{ dev.iotName || dev.iotCode }}</div>
                        <ezuikit-player
                            v-if="ysToken"
                            :key="'p_' + dev.id + '_' + ysToken"
                            :container-id="'site_player_' + dev.id"
                            :access-token="ysToken"
                            :url="`ezopen://open.ys7.com/${dev.iotCode}/1.hd.live`"
                        />
                    </div>
                </el-tab-pane>
                <el-tab-pane label="称重历史" name="weight">
                    <div class="weight-tools">
                        <span>默认当天</span>
                        <el-popover v-model:visible="weightOpen" placement="bottom-end" :width="340" trigger="click">
                            <template #reference>
                                <el-button :icon="Setting" circle size="small" />
                            </template>
                            <div class="weight-form">
                                <el-date-picker
                                    v-model="weightRange"
                                    type="datetimerange"
                                    start-placeholder="开始时间"
                                    end-placeholder="结束时间"
                                    format="YYYY-MM-DD HH:mm"
                                    value-format="YYYY-MM-DD HH:mm:ss"
                                    size="small"
                                />
                                <div class="weight-form__actions">
                                    <el-button size="small" @click="weightOpen = false">取消</el-button>
                                    <el-button type="primary" size="small" @click="queryWeight()">查询</el-button>
                                </div>
                            </div>
                        </el-popover>
                    </div>
                    <el-table :data="weights" size="small" height="360" stripe>
                        <el-table-column prop="uploadTime" label="时间" min-width="150">
                            <template #default="{ row }">{{ formatTime(row.uploadTime) }}</template>
                        </el-table-column>
                        <el-table-column prop="garbageName" label="种类" min-width="90">
                            <template #default="{ row }">{{ row.garbageName || row.garbageType }}</template>
                        </el-table-column>
                        <el-table-column prop="weight" label="重量kg" width="80" />
                        <el-table-column prop="deviceNo" label="设备" min-width="90" />
                    </el-table>
                </el-tab-pane>
            </el-tabs>
        </template>
    </map-board>
</template>
<script lang="ts" setup>
defineOptions({ name: 'maps-layers' });
import { computed, onMounted, ref } from 'vue';
import { Setting } from '@element-plus/icons-vue';
import { TdtMap, TdtMarker, type LngLat } from 'vue-tianditu2';
import { useCool } from '/@/cool';
import EzuikitPlayer from '../../ezuikit/components/ezuikit-player.vue';
import MapBoard from '../components/map-board.vue';
import {
    DEFAULT_CENTER,
    MAP_LOAD,
    siteIcon,
    fetchYsToken,
    formatTime,
    useMapsApi
} from '../hooks/use-map';
const { service } = useCool();
const api = useMapsApi();
const sites = ref<any[]>([]);
const keyword = ref('');
const types = ref(['收集点', '压缩站']);
const current = ref<any>(null);
const center = ref<LngLat>(DEFAULT_CENTER);
const zoom = ref(12);
const tab = ref('info');
const cameras = ref<any[]>([]);
const ysToken = ref('');
const weights = ref<any[]>([]);
const weightOpen = ref(false);
const weightRange = ref<[string, string] | null>(null);
const controls = ['Zoom', 'Scale', { name: 'MapType', position: 'topright' }];
const visibleSites = computed(() =>
    sites.value.filter(e => {
        if (!types.value.includes(e.siteType)) return false;
        if (!keyword.value) return true;
        const k = keyword.value.toLowerCase();
        return [e.businessName, e.businessId, e.address].some(v => String(v || '').toLowerCase().includes(k));
    })
);
function pos(item: any): LngLat {
    return [Number(item.longitude), Number(item.latitude)];
}
function todayRange() {
    const d = new Date();
    const p = (n: number) => String(n).padStart(2, '0');
    const day = `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;
    return [`${day} 00:00:00`, `${day} 23:59:59`] as [string, string];
}
async function select(item: any) {
    current.value = item;
    center.value = pos(item);
    zoom.value = 16;
    tab.value = 'info';
    cameras.value = [];
    weights.value = [];
    weightRange.value = todayRange();
    if (!ysToken.value) {
        try {
            ysToken.value = await fetchYsToken(service);
        } catch {}
    }
    try {
        cameras.value = (await service.basicdata.iot.getYsDevices({ businessId: item.businessId })) || [];
    } catch {
        cameras.value = [];
    }
    await queryWeight();
}
async function queryWeight() {
    if (!current.value) return;
    weightOpen.value = false;
    const range = weightRange.value || todayRange();
    weights.value = (await api.siteWeight({
        businessId: current.value.businessId,
        startTime: range[0],
        endTime: range[1]
    })) || [];
}
onMounted(async () => {
    sites.value = (await api.sites()) || [];
    const first = visibleSites.value[0];
    if (first) {
        center.value = pos(first);
        zoom.value = 13;
    }
});
</script>
<style lang="scss" scoped>
.filters {
    margin-top: 8px;
}
.list-item {
    display: flex;
    gap: 8px;
    padding: 10px 12px;
    cursor: pointer;
    border-bottom: 1px solid var(--el-border-color-extra-light);
    i {
        width: 8px;
        height: 8px;
        margin-top: 6px;
        border-radius: 50%;
        flex-shrink: 0;
    }
    &:hover,
    &.is-active {
        background: var(--el-color-primary-light-9);
    }
    &__name {
        font-size: 13px;
        font-weight: 600;
    }
    &__meta {
        margin-top: 2px;
        font-size: 12px;
        color: var(--el-text-color-secondary);
    }
}
.legend {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 2px 0;
    i {
        width: 8px;
        height: 8px;
        border-radius: 50%;
    }
}
.cam {
    margin-bottom: 12px;
    &__name {
        margin-bottom: 6px;
        font-size: 13px;
        color: var(--el-text-color-regular);
    }
}
.weight-tools {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin: 8px 0;
    font-size: 12px;
    color: var(--el-text-color-secondary);
}
.weight-form {
    display: flex;
    flex-direction: column;
    gap: 8px;
    &__actions {
        display: flex;
        justify-content: flex-end;
        gap: 8px;
    }
}
.mapDiv {
    width: 100%;
    height: 100%;
}
</style>
src/modules/maps/views/sorter.vue
New file
@@ -0,0 +1,267 @@
<template>
    <map-board :open="!!current" :title="current?.name" :sub="current?.idCard" @close="close">
        <template #side-head>
            <el-input v-model="keyword" placeholder="搜索分拣员" clearable size="small" />
            <div class="hint">最近 15 分钟有 GPS 视为在线 · {{ list.length }} 人</div>
        </template>
        <template #side>
            <div
                v-for="item in visibleList"
                :key="item.idCard"
                class="list-item"
                :class="{ 'is-active': current?.idCard === item.idCard }"
                @click="select(item)"
            >
                <i />
                <div>
                    <div class="list-item__name">{{ item.name || item.idCard }}</div>
                    <div class="list-item__meta">{{ formatTime(item.uploadTime) }} · {{ item.speed || 0 }} km/h</div>
                </div>
            </div>
            <el-empty v-if="!visibleList.length" description="当前没有在线分拣员" :image-size="64" />
        </template>
        <template #legend>
            <div class="legend"><i style="background:#2563eb" />在线分拣员</div>
            <div class="legend"><i style="background:#ef4444" />轨迹回放</div>
        </template>
        <template #map>
            <div class="mapDiv">
                <tdt-map :center="center" :zoom="zoom" :controls="controls" :loadConfig="MAP_LOAD">
                    <tdt-marker
                        v-for="item in visibleList"
                        :key="item.idCard"
                        :position="pos(item)"
                        :icon="SORTER_ICON"
                        :title="item.name"
                        @click="select(item)"
                    />
                    <tdt-polyline v-if="trackPath.length" :path="trackPath" color="#16a34a" :weight="4" :opacity="0.85" />
                    <tdt-marker v-if="playPos" :position="playPos" :icon="PLAY_ICON" title="回放位置" />
                </tdt-map>
            </div>
        </template>
        <template #panel>
            <el-tabs v-model="tab">
                <el-tab-pane label="基本信息" name="info">
                    <el-descriptions :column="1" border size="small">
                        <el-descriptions-item label="姓名">{{ current?.name }}</el-descriptions-item>
                        <el-descriptions-item label="身份证">{{ current?.idCard }}</el-descriptions-item>
                        <el-descriptions-item label="手机">{{ current?.phone || '-' }}</el-descriptions-item>
                        <el-descriptions-item label="工作站点">{{ current?.workSiteId || '-' }}</el-descriptions-item>
                        <el-descriptions-item label="当前速度">{{ current?.speed || 0 }} km/h</el-descriptions-item>
                        <el-descriptions-item label="定位时间">{{ formatTime(current?.uploadTime) }}</el-descriptions-item>
                    </el-descriptions>
                </el-tab-pane>
                <el-tab-pane label="健康上报" name="health">
                    <el-table :data="health.recent" size="small" height="220" stripe>
                        <el-table-column label="时间" min-width="140">
                            <template #default="{ row }">{{ formatTime(row.uploadTime) }}</template>
                        </el-table-column>
                        <el-table-column prop="temperature" label="体温" width="64" />
                        <el-table-column prop="heartRate" label="心率" width="64" />
                        <el-table-column label="血压" width="80">
                            <template #default="{ row }">{{ row.bloodPressureHigh || '-' }}/{{ row.bloodPressureLow || '-' }}</template>
                        </el-table-column>
                        <el-table-column prop="bloodOxygen" label="血氧" width="64" />
                        <el-table-column prop="dataType" label="类型" width="64" />
                    </el-table>
                    <div class="block-title">异常上报</div>
                    <el-table :data="health.abnormal" size="small" height="160" stripe>
                        <el-table-column label="时间" min-width="140">
                            <template #default="{ row }">{{ formatTime(row.uploadTime) }}</template>
                        </el-table-column>
                        <el-table-column prop="temperature" label="体温" width="64" />
                        <el-table-column prop="heartRate" label="心率" width="64" />
                        <el-table-column prop="dataType" label="类型" width="64" />
                    </el-table>
                    <div class="block-title">健康告警</div>
                    <el-table :data="health.alarms" size="small" height="160" stripe>
                        <el-table-column label="时间" min-width="140">
                            <template #default="{ row }">{{ formatTime(row.uploadTime) }}</template>
                        </el-table-column>
                        <el-table-column prop="alarmType" label="类型" min-width="80" />
                        <el-table-column prop="alarmLevel" label="级别" width="70" />
                        <el-table-column prop="content" label="内容" min-width="120" show-overflow-tooltip />
                    </el-table>
                </el-tab-pane>
                <el-tab-pane label="历史轨迹" name="track">
                    <track-toolbar
                        v-model:speed="speed"
                        :playing="playing"
                        :progress="progress"
                        :has-track="trackPoints.length > 1"
                        :start-time="trackStart"
                        :end-time="trackEnd"
                        @play="play"
                        @pause="pause"
                        @stop="stop"
                        @query="onQueryTrack"
                    />
                    <div class="hint">默认最近 1 小时,回放默认 5 倍速</div>
                </el-tab-pane>
            </el-tabs>
        </template>
    </map-board>
</template>
<script lang="ts" setup>
defineOptions({ name: 'maps-sorter' });
import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
import { TdtMap, TdtMarker, TdtPolyline, type LngLat } from 'vue-tianditu2';
import MapBoard from '../components/map-board.vue';
import TrackToolbar from '../components/track-toolbar.vue';
import { DEFAULT_CENTER, MAP_LOAD, PLAY_ICON, SORTER_ICON, formatTime, lastHours, useMapsApi } from '../hooks/use-map';
import { useTrackPlayback, type TrackPoint } from '../hooks/use-track';
const api = useMapsApi();
const list = ref<any[]>([]);
const keyword = ref('');
const current = ref<any>(null);
const center = ref<LngLat>(DEFAULT_CENTER);
const zoom = ref(12);
const tab = ref('info');
const health = ref<{ recent: any[]; abnormal: any[]; alarms: any[] }>({ recent: [], abnormal: [], alarms: [] });
const trackPoints = ref<TrackPoint[]>([]);
const trackStart = ref('');
const trackEnd = ref('');
const { playing, speed, progress, playPos, path, play, pause, stop, reset } = useTrackPlayback(trackPoints);
const trackPath = computed(() => path());
const controls = ['Zoom', 'Scale', { name: 'MapType', position: 'topright' }];
let timer: number;
const visibleList = computed(() => {
    if (!keyword.value) return list.value;
    const k = keyword.value.toLowerCase();
    return list.value.filter(e => [e.name, e.idCard, e.phone].some(v => String(v || '').toLowerCase().includes(k)));
});
function pos(item: any): LngLat {
    return [Number(item.longitude), Number(item.latitude)];
}
function fmt(d: Date) {
    const p = (n: number) => String(n).padStart(2, '0');
    return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;
}
async function loadOnline() {
    list.value = (await api.sorterOnline()) || [];
    if (!current.value && list.value[0]) {
        center.value = pos(list.value[0]);
        zoom.value = 13;
    }
}
async function select(item: any) {
    current.value = item;
    center.value = pos(item);
    zoom.value = 16;
    tab.value = 'info';
    reset();
    const { start, end } = lastHours(1);
    trackStart.value = fmt(start);
    trackEnd.value = fmt(end);
    const [h, track] = await Promise.all([
        api.sorterHealth(item.idCard),
        api.sorterTrack({ idCard: item.idCard, startTime: trackStart.value, endTime: trackEnd.value })
    ]);
    health.value = h || { recent: [], abnormal: [], alarms: [] };
    trackPoints.value = track || [];
    if (trackPoints.value.length) {
        playPos.value = pos(trackPoints.value[0] as any);
    }
}
async function onQueryTrack(range: [string, string]) {
    if (!current.value) return;
    trackStart.value = range[0];
    trackEnd.value = range[1];
    reset();
    trackPoints.value = (await api.sorterTrack({
        idCard: current.value.idCard,
        startTime: range[0],
        endTime: range[1]
    })) || [];
}
function close() {
    current.value = null;
    reset();
    trackPoints.value = [];
}
onMounted(async () => {
    await loadOnline();
    timer = window.setInterval(loadOnline, 30000);
});
onBeforeUnmount(() => clearInterval(timer));
</script>
<style lang="scss" scoped>
.hint {
    margin-top: 8px;
    font-size: 12px;
    color: var(--el-text-color-secondary);
    line-height: 1.4;
}
.list-item {
    display: flex;
    gap: 8px;
    padding: 10px 12px;
    cursor: pointer;
    border-bottom: 1px solid var(--el-border-color-extra-light);
    i {
        width: 8px;
        height: 8px;
        margin-top: 6px;
        border-radius: 50%;
        background: #22c55e;
        flex-shrink: 0;
    }
    &:hover,
    &.is-active {
        background: var(--el-color-primary-light-9);
    }
    &__name {
        font-size: 13px;
        font-weight: 600;
    }
    &__meta {
        margin-top: 2px;
        font-size: 12px;
        color: var(--el-text-color-secondary);
    }
}
.legend {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 2px 0;
    font-size: 12px;
    i {
        width: 8px;
        height: 8px;
        border-radius: 50%;
    }
}
.block-title {
    margin: 12px 0 6px;
    font-size: 13px;
    font-weight: 600;
}
.mapDiv {
    width: 100%;
    height: 100%;
}
</style>
src/modules/maps/views/vehicle.vue
New file
@@ -0,0 +1,285 @@
<template>
    <map-board :open="!!current" :title="current?.vehicleNo" :sub="current?.vehicleType" @close="close">
        <template #side-head>
            <el-input v-model="keyword" placeholder="搜索车牌" clearable size="small" />
            <div class="hint">最近 15 分钟有 GPS 视为在线 · {{ list.length }} 辆</div>
        </template>
        <template #side>
            <div
                v-for="item in visibleList"
                :key="item.vehicleNo"
                class="list-item"
                :class="{ 'is-active': current?.vehicleNo === item.vehicleNo }"
                @click="select(item)"
            >
                <i />
                <div>
                    <div class="list-item__name">{{ item.vehicleNo }}</div>
                    <div class="list-item__meta">{{ formatTime(item.gpsTime) }} · {{ item.speed || 0 }} km/h</div>
                </div>
            </div>
            <el-empty v-if="!visibleList.length" description="当前没有在线车辆" :image-size="64" />
        </template>
        <template #legend>
            <div class="legend"><i style="background:#7c3aed" />在线车辆</div>
            <div class="legend"><i style="background:#ef4444" />轨迹回放</div>
        </template>
        <template #map>
            <div class="mapDiv">
                <tdt-map :center="center" :zoom="zoom" :controls="controls" :loadConfig="MAP_LOAD">
                    <tdt-marker
                        v-for="item in visibleList"
                        :key="item.vehicleNo"
                        :position="pos(item)"
                        :icon="VEHICLE_ICON"
                        :title="item.vehicleNo"
                        @click="select(item)"
                    />
                    <tdt-polyline v-if="trackPath.length" :path="trackPath" color="#7c3aed" :weight="4" :opacity="0.85" />
                    <tdt-marker v-if="playPos" :position="playPos" :icon="PLAY_ICON" title="回放位置" />
                </tdt-map>
            </div>
        </template>
        <template #panel>
            <el-tabs v-model="tab">
                <el-tab-pane label="基本信息" name="info">
                    <el-descriptions :column="1" border size="small">
                        <el-descriptions-item label="车牌">{{ current?.vehicleNo }}</el-descriptions-item>
                        <el-descriptions-item label="车型">{{ current?.vehicleType || '-' }}</el-descriptions-item>
                        <el-descriptions-item label="载重">{{ current?.capacityTon || '-' }} 吨</el-descriptions-item>
                        <el-descriptions-item label="设备号">{{ current?.sn || '-' }}</el-descriptions-item>
                        <el-descriptions-item label="当前速度">{{ current?.speed || 0 }} km/h</el-descriptions-item>
                        <el-descriptions-item label="定位时间">{{ formatTime(current?.gpsTime) }}</el-descriptions-item>
                    </el-descriptions>
                </el-tab-pane>
                <el-tab-pane label="司机行为" name="event">
                    <el-table :data="events" size="small" height="280" stripe>
                        <el-table-column label="时间" min-width="140">
                            <template #default="{ row }">{{ formatTime(row.alarmTime || row.createTime) }}</template>
                        </el-table-column>
                        <el-table-column prop="alarmType" label="类型" min-width="90" />
                        <el-table-column prop="describe" label="描述" min-width="120" show-overflow-tooltip />
                        <el-table-column prop="deviceName" label="设备" min-width="90" show-overflow-tooltip />
                    </el-table>
                </el-tab-pane>
                <el-tab-pane label="车载监控" name="live">
                    <el-empty v-if="!cameras.length" description="该车辆没有关联车载摄像头" :image-size="72" />
                    <div v-for="dev in cameras" :key="dev.id" class="cam">
                        <div class="cam__name">{{ dev.iotName || dev.iotCode }}</div>
                        <ezuikit-player
                            v-if="ysToken"
                            :key="'v_' + dev.id + '_' + ysToken"
                            :container-id="'vehicle_player_' + dev.id"
                            :access-token="ysToken"
                            :url="`ezopen://open.ys7.com/${dev.iotCode}/1.hd.live`"
                        />
                    </div>
                </el-tab-pane>
                <el-tab-pane label="历史轨迹" name="track">
                    <track-toolbar
                        v-model:speed="speed"
                        :playing="playing"
                        :progress="progress"
                        :has-track="trackPoints.length > 1"
                        :start-time="trackStart"
                        :end-time="trackEnd"
                        @play="play"
                        @pause="pause"
                        @stop="stop"
                        @query="onQueryTrack"
                    />
                    <div class="hint">默认最近 1 小时,回放默认 5 倍速</div>
                </el-tab-pane>
            </el-tabs>
        </template>
    </map-board>
</template>
<script lang="ts" setup>
defineOptions({ name: 'maps-vehicle' });
import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
import { TdtMap, TdtMarker, TdtPolyline, type LngLat } from 'vue-tianditu2';
import { useCool } from '/@/cool';
import EzuikitPlayer from '../../ezuikit/components/ezuikit-player.vue';
import MapBoard from '../components/map-board.vue';
import TrackToolbar from '../components/track-toolbar.vue';
import {
    DEFAULT_CENTER,
    MAP_LOAD,
    PLAY_ICON,
    VEHICLE_ICON,
    fetchYsToken,
    formatTime,
    lastHours,
    useMapsApi
} from '../hooks/use-map';
import { useTrackPlayback, type TrackPoint } from '../hooks/use-track';
const { service } = useCool();
const api = useMapsApi();
const list = ref<any[]>([]);
const keyword = ref('');
const current = ref<any>(null);
const center = ref<LngLat>(DEFAULT_CENTER);
const zoom = ref(12);
const tab = ref('info');
const events = ref<any[]>([]);
const cameras = ref<any[]>([]);
const ysToken = ref('');
const trackPoints = ref<TrackPoint[]>([]);
const trackStart = ref('');
const trackEnd = ref('');
const { playing, speed, progress, playPos, path, play, pause, stop, reset } = useTrackPlayback(trackPoints);
const trackPath = computed(() => path());
const controls = ['Zoom', 'Scale', { name: 'MapType', position: 'topright' }];
let timer: number;
const visibleList = computed(() => {
    if (!keyword.value) return list.value;
    const k = keyword.value.toLowerCase();
    return list.value.filter(e => String(e.vehicleNo || '').toLowerCase().includes(k));
});
function pos(item: any): LngLat {
    return [Number(item.longitude), Number(item.latitude)];
}
function fmt(d: Date) {
    const p = (n: number) => String(n).padStart(2, '0');
    return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;
}
async function loadOnline() {
    list.value = (await api.vehicleOnline()) || [];
    if (!current.value && list.value[0]) {
        center.value = pos(list.value[0]);
        zoom.value = 13;
    }
}
async function select(item: any) {
    current.value = item;
    center.value = pos(item);
    zoom.value = 16;
    tab.value = 'info';
    reset();
    cameras.value = [];
    events.value = [];
    const { start, end } = lastHours(1);
    trackStart.value = fmt(start);
    trackEnd.value = fmt(end);
    if (!ysToken.value) {
        try {
            ysToken.value = await fetchYsToken(service);
        } catch {}
    }
    const [ev, cam, track] = await Promise.all([
        api.vehicleEvents(item.vehicleNo),
        service.basicdata.iot.getYsDevices({ businessId: item.vehicleNo }).catch(() => []),
        api.vehicleTrack({ vehicleNo: item.vehicleNo, startTime: trackStart.value, endTime: trackEnd.value })
    ]);
    events.value = ev || [];
    cameras.value = cam || [];
    trackPoints.value = track || [];
    if (trackPoints.value.length) {
        playPos.value = [Number(trackPoints.value[0].longitude), Number(trackPoints.value[0].latitude)];
    }
}
async function onQueryTrack(range: [string, string]) {
    if (!current.value) return;
    trackStart.value = range[0];
    trackEnd.value = range[1];
    reset();
    trackPoints.value = (await api.vehicleTrack({
        vehicleNo: current.value.vehicleNo,
        startTime: range[0],
        endTime: range[1]
    })) || [];
}
function close() {
    current.value = null;
    reset();
    trackPoints.value = [];
}
onMounted(async () => {
    await loadOnline();
    timer = window.setInterval(loadOnline, 30000);
});
onBeforeUnmount(() => clearInterval(timer));
</script>
<style lang="scss" scoped>
.hint {
    margin-top: 8px;
    font-size: 12px;
    color: var(--el-text-color-secondary);
    line-height: 1.4;
}
.list-item {
    display: flex;
    gap: 8px;
    padding: 10px 12px;
    cursor: pointer;
    border-bottom: 1px solid var(--el-border-color-extra-light);
    i {
        width: 8px;
        height: 8px;
        margin-top: 6px;
        border-radius: 50%;
        background: #7c3aed;
        flex-shrink: 0;
    }
    &:hover,
    &.is-active {
        background: var(--el-color-primary-light-9);
    }
    &__name {
        font-size: 13px;
        font-weight: 600;
    }
    &__meta {
        margin-top: 2px;
        font-size: 12px;
        color: var(--el-text-color-secondary);
    }
}
.legend {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 2px 0;
    font-size: 12px;
    i {
        width: 8px;
        height: 8px;
        border-radius: 50%;
    }
}
.cam {
    margin-bottom: 12px;
    &__name {
        margin-bottom: 6px;
        font-size: 13px;
        color: var(--el-text-color-regular);
    }
}
.mapDiv {
    width: 100%;
    height: 100%;
}
</style>