wangrong
2022-06-28 0b31be01af4247244e1b6285d6c537c2894acea9
添加socket.io taskshchedule等
9个文件已修改
9个文件已添加
1318 ■■■■■ 已修改文件
bootstrap.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/app/comm/aerial.proto 294 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/app/modules/base/service/dataapi/rpcservice.ts 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/app/modules/base/utils/axiosutil.ts 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/app/modules/base/utils/dateutil.ts 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/app/modules/business/controller/admin/colletmeta.ts 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/app/modules/business/controller/admin/taskimmediately.ts 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/app/modules/business/controller/admin/taskmonitor.ts 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/app/modules/business/entity/periodicsetting.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/app/modules/business/service/taskimmediately.ts 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/config/config.default.ts 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/configuration.ts 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/schedule/aerial.proto 294 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/schedule/helloCorn 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/schedule/taskSchedule.js 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/socket/chatUser.ts 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/socket/socketHandle.ts 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bootstrap.js
@@ -1,7 +1,17 @@
const WebFramework = require('@midwayjs/web').Framework;
const { SocketFramework, createRedisAdapter} = require('@cool-midway/socket');
const web = new WebFramework().configure({
  port: 8001,
});
// // 初始化 socket.io 框架
// const socketFramework = new SocketFramework().configure({
//   port: 3000,
//   // adapter: createRedisAdapter({ host: '192.168.1.2', port: 6379}),
// });
const { Bootstrap } = require('@midwayjs/bootstrap');
Bootstrap.load(web).run();
const schedule_ = require("./src/schedule/taskSchedule.js");
schedule_.job_();
package.json
@@ -1,7 +1,7 @@
{
  "name": "cool-admin",
  "version": "4.0.0",
  "description": "cool-admin 一个很酷的通用后台管理系统",
  "description": "一个很酷的通用后台管理系统",
  "private": true,
  "dependencies": {
    "@cool-midway/alipay": "^4.0.4",
@@ -17,9 +17,11 @@
    "@midwayjs/core": "^2.14.0",
    "@midwayjs/decorator": "^2.14.0",
    "@midwayjs/orm": "^2.14.0",
    "@midwayjs/socketio": "^3.3.5",
    "@midwayjs/swagger": "^1.3.0",
    "@midwayjs/view-nunjucks": "^2.14.0",
    "@midwayjs/web": "^2.13.4",
    "axios": "^0.27.2",
    "egg": "^2.33.1",
    "egg-cors": "^2.2.3",
    "egg-scripts": "^2.15.2",
@@ -29,7 +31,9 @@
    "md5": "^2.3.0",
    "mini-svg-data-uri": "^1.4.3",
    "mysql2": "^2.3.3",
    "node-schedule": "^2.1.0",
    "node-xlsx": "^0.17.2",
    "protobufjs": "^6.11.3",
    "svg-captcha": "^1.4.0",
    "typeorm": "^0.2.41"
  },
src/app/comm/aerial.proto
New file
@@ -0,0 +1,294 @@
syntax = "proto3";
// enum SysCommand {
//   UNKOWN_COMMAND     = 0;   // 未知命令
//   SYS_COMMAND        = 1;   // 系统命令
//   SENSOR_COMMAND     = 2;   // 传感器命令
//   FIVE_G_COMMAND     = 3;   // 通讯5G模块命令
//   CAMERA_COMMAND     = 4;   // 摄像头参数命令
//   IO_COMMAND         = 5;   // 外设IO口操作命令
//   SYS_PARAMS_COMMAND = 6;   // 系统参数获取
//   WIFI_COMMAND       = 7;   // 设备WIFI参数设置
//   KERNEL_COMMAND     = 8;   // 核心计算参数设
//   DEVICE_COMMAND     = 9;   // 工作设备参数设置
//   MICRO_WAVE_COMMAND = 10;  // 毫米波
// }
// enum SubCommand {
//   option allow_alias = true;
//   UNKOWN_SUB_COMMAND   = 0;                   // 未知子命令
//   // 系统命令
//   POWER_ON_SUB_COMMAND = 1;                   // 开机
//   POWER_OFF_SUB_COMMAND = 2;                  // 关机
//   // 传感器命令
//   SENSOR_INIT_SUB_COMMAND = 1;                // 传感器初始化
//   SENSOR_REQURE_SUB_COMMAND = 2;              // 传感器参数获取
//   RTK_SETTING_SUB_COMMAND = 3;                // RTK外设参数设置
//   RTK_REQURE_SUB_COMMAND = 4;                 // RTK外设数据获取
//   // 通讯5G模块命令
//   FIVE_G_INIT_SUB_COMMAND = 1;                // 5G模块参数初始化
//   FIVE_G_SEND_IMAGE_SUB_COMMAND = 2;          // 5G通讯图像数据发送
//   FIVE_G_REQURE_SUB_COMMAND = 3;              // 5G通讯接收
//   // 摄像头参数命令
//   CAMERA_NUMBER_SUB_COMMAND = 1;              // 设备摄像头个数
//   CAMERA_RESOLUTION_SUB_COMMAND = 2;          // 设备摄像头工作分辨率
//   CAMERA_FRAME_RATE_SUB_COMMAND = 3;          // 摄像头工作帧率
//   CAMERA_OTHER_PARAMS_SUB_COMMAND = 4;        // 摄像头工作其他参数
//   // 外设IO口操作命令
//   CAMERA_DUST_REMOVAL_START_SUB_COMMAND = 1;  // 摄像头除尘启动
//   CAMERA_CONTROL_START_SUB_COMMAND = 2;       // 外设控制数据启动(18路控制)
//   // 系统参数获取
//   CPU_FREQUENCY_SUB_COMMAND = 1;              // CPU主频工作数据
//   CPU_KERNAL_TEMP_SUB_COMMAND = 2;            // CPU核心温度数据
//   CPU_BETTERY_DATA_SUB_COMMAND = 3;           // 电池供电电量数据
//   // 设备WIFI参数设置
//   WIFI_HOTSPOT_SETTING_SUB_COMMAND = 1;       // WIFI热点设置
//   WIFI_HOTSPOT_START_STOP_SUB_COMMAND = 2;    // WIFI热点开启和关闭
//   // 核心计算参数设置
//   POINT_CLOUD_ACCURACY_SUB_COMMAND = 1;       // 点云计算精度
//   SPLICING_PARAMS_SUB_COMMAND = 2;            // 拼接参数
//   MAP_INTERFACE_PLATFORM_SUB_COMMAND = 3;     // 地图接口平台
//   DATA_STORE_BACKUP_SUB_COMMAND = 4;          // 数据存储备份
//   // 工作设备参数设置
//   SYSTEM_TIMER_SUB_COMMAND = 1;               // 系统工作定时
//   SYSTEM_COORD_HEIGHT_SUB_COMMAND = 2;        // 工作区域坐标与高度
//   TRIGGER_CONDITION_SUB_COMMAND = 3;          // 工作触发条件
//   GRAVITY_FAILURE_SUB_COMMAND = 4;            // 重力加速度失效参数
//   NINE_AXIS_FAILURE_SUB_COMMAND = 5;          // 九轴加速度失效参数
//   // 毫米波
//   MICRO_WAVE_SUB_COMMAND = 1;                 // 毫米波
// }
// message DataField {
//   int32 length = 1;                           // 数据长度
//   bytes data = 2;                            // 数据内容
//   int32 checksum = 3;                        // 校验码
// }
// message CapturedData {
//   int64 capture_time = 1;                     // 采集时间
//   string capture_device =2;                   // 采集设备
//   int32 capture_port = 3;                     // 采集设备序号
//   DataField DataField = 4;
//   string data_type = 5;                         // 数据类型 image udp
// }
// message DataMessage{
//   int64 sending_time = 1;
//   string sending_device = 2;
//   string target_device = 3;
//   CapturedData CapturedData = 5;
// }
// message StateData {
//  int64 state_time = 1;
//  string state_device = 2;
//  DataField DataField = 4;
// }
// message StateMessage {
//   int64 sending_time = 1;
//   string sending_device = 2;
//   string target_device = 3;
//   CapturedData StatedData = 5;
// }
// message CommandData {
//   SysCommand SysCommand = 1;
//   SubCommand SubCommand = 2;
// }
// message CommandMessage {
//   int64 sending_time = 1;
//   string sending_device = 2;
//   string target_device = 3;
//   CommandData CommandData =4;
// }
enum SysCommand{
  UNKOWN_COMMAND     = 0;
  CAMERA_COMMAND     = 1;
  MICROWAVE_COMMAND   = 2;
  DUSTCLEANER_COMMAND   = 3;
}
enum SubCommand{
  UNKOWN_SUBCOMMAND     = 0;
  // camera params
  ONE_TIME_CAPTURE      = 1;
  // microwave params
  ONE_CIRCLE_SCAN       = 2;
  // dust cleaner params
  ONE_CLEAN_SCAN        = 4;
}
message CommandMessage{
  string source = 1;
  string generatetime = 2;
  SysCommand syscommand = 3;
  SubCommand subcommand = 4;
  string targetclient = 5;
  string returnserver = 6;
  string taskuuid = 7;
}
message LogsMessage{
  string source = 1;
  string timestamp = 2;
  string context = 3;
  optional string taskuuid = 4;
}
message ImagesMessage
{
  string source = 1;
  string timestamp = 2;
  message ImageItems
  {
    int32 length = 1;                           // 数据长度
    bytes data = 2;                            // 数据内容
  }
  repeated ImageItems Image = 3;
  optional string taskuuid = 4;
}
message PlysMessage
{
  string source = 1;
  string timestamp = 2;
  message PointCloudItem
  {
    int32 length = 1;
    int32 rows = 2;
    int32 cols = 3;
    string order = 4;
    string dtype = 5;
    bytes data = 6;
  }
  repeated PointCloudItem Plydata = 3;
  optional string taskuuid = 4;
  // enum ref_system
  // {
  //   MICROWAVE_SYSTEM = 0;
  //   DEVICE_SYSTEM = 1;
  // }
  // ref_system reference = 4
}
// message MicroWaveMessage
// {
//   int32 length = 1;                           // 数据长度
//   bytes data = 2;                            // 数据内容
// }
// message CommandRequest{
// }
// message StateMessage{
//   string message_type = 1;
//   int64 generatetime = 2;
//   string generate_device = 3;
//   string target_device = 4;
//   string message_uuid = 5;
//   string str_body = 6;
// }
// message RequestCommand {
//   int32 sync_word = 1;              // 同步字
//   string device_id = 2;             // 设备ID
//   SysCommand sys_command = 3;       // 命令1
//   SubCommand sub_command = 4;       // 命令2
//   DataField data1 = 5;              // 数据1
//   DataField data2 = 6;              // 数据2
//   int32 checksum = 7;               // 校验码
// }
// enum ResponseState
// {
//   SUCCESS = 0;                  // 成功
//   FAILURE = 1;                  // 失败
//   ABNORMAL = 2;                 // 异常
//   INFICIENT_POWER = 3;          // 电量不足
//   OTHER = 4;                    // 其他
// }
// message ResponseCommand
// {
//     string device_id = 1;        // 设备ID
//     SysCommand sys_command = 2;  // 命令1
//     SubCommand sub_command = 3;  // 命令2
//     ResponseState state = 4;     // 响应状态
//     int32 data_length = 5;       // 数据长度
//     bytes data = 6;              // 数据
//     int32 checksum = 7;          // 校验码
// }
// // 服务端向采集端发送的主指令
// enum ControlSysCommand {
//   DUST_CLEANER_COMMAND = 0;
// }
// // 服务端向采集端发送的子命令
// enum ControlSubCommand {
//   // dust cleaner sub commands
//   DUST_CLEANER_ONETIME_CLEAN_SELF         = 0;
//   DUST_CLEANER_ONETIME_CLEAN_CAMERA       = 1;
//   DUST_CLEANER_CLOSE_PERIOD_CLEAN_SELF    = 2;
//   DUST_CLEANER_CLOSE_PERIOD_CLEAN_CAMERA  = 3;
//   DUST_CLEANER_PERIOD_CLEAN_SELF          = 4;
//   DUST_CLEANER_PERIOD_CLEAN_CAMERA        = 5;
// }
// // dust cleaner command message
// message DustCleanerMessage  {
//   uint32 period = 1;
// }
// // 控制上位机消息
// message ControllMessage {
//   int32 sync_word = 1;                // 同步字
//   ControlSysCommand sys_command = 3;  // 主命令
//   ControlSubCommand sub_command = 4;  // 子命令
//   DataField data = 5;                 // 数据
//   int32 checksum = 7;                 // 校验码
// }
src/app/modules/base/service/dataapi/rpcservice.ts
New file
@@ -0,0 +1,115 @@
import { Inject, Provide } from '@midwayjs/decorator';
import { BaseService, ICoolCache, } from '@cool-midway/core';
import * as _ from 'lodash';
import { MysqlUtil } from '../../utils/mysqlutil';
import { DateUtil } from '../../utils/dateutil';
import { AxiosUtil } from '../../utils/axiosutil';
// 引入读写核心模块
/**
 * 系统用户
 */
@Provide()
export class RpcService extends BaseService {
    @Inject('cool:cache')
    coolCache: ICoolCache;
    @Inject()
    mysqlUtil: MysqlUtil;
    rpc_url: "http://192.168.1.4:5000/api";
    @Inject()
    dateUtil: DateUtil;
    @Inject()
    axios: AxiosUtil;
    /**
   * 远程调用设备,启动任务执行
   * @param query
   */
    async remoteCall(url, query) {
        if (url == null) {
            url = this.rpc_url;
        }
        let stattime = this.dateUtil.getCurretTimeStr()
        console.log('---------------------------------------------send msg  to device-----------------------------------------')
        console.log(query)
        // let res = await this.axios.httpPostBuffer(url, query)
        console.log('---------------------------------------receive the reply msg from device-----------------------------------')
        this.axios.httpPostBuffer(url, query).then(res => {
            console.log(res)
            const bidsql = `insert into t_config_interface_record (interface_direct,start_time,end_time,request_type,createTime,remark,status,params,result)
                values ('${url}','${stattime}','${this.dateUtil.getCurretTimeStr()}','post',now(),'ok',200,'${JSON.stringify(query)}','${res}') `;
            this.nativeQuery(bidsql);
            return res
        }).catch((error) => {
            console.log(error)
            return error
        })
    }
    /**
     * 分页查询
     * @param query
     */
    async getData(query) {
        // const { keyWord, status, departmentIds = [] } = query;
        // const permsDepartmentArr = await this.baseSysPermsService.departmentIds(
        //   this.ctx.admin.userId
        // ); // 部门权限
        const bidsql = `select * from t_sys_business_config where id_='${query.bid}' limit 0,1`;
        const bid_obj_ = await this.nativeQuery(bidsql);
        console.log(bid_obj_)
        let sqlObj = this.mysqlUtil.create_sql(bid_obj_[0], query?.pageindex || null, query?.pagesize || null, query);
        if (sqlObj?.status == 0) {
            return sqlObj?.msg;
        }
        return this.nativeQuery(sqlObj?.sql, query);
    }
    /**
     * 分页查询
     * @param query
     */
    async getDataByNative(query) {
        // const { keyWord, status, departmentIds = [] } = query;
        // const permsDepartmentArr = await this.baseSysPermsService.departmentIds(
        //   this.ctx.admin.userId
        // ); // 部门权限
        const bidsql = `select * from t_sys_business_config where id_='${query.bid}' limit 0,1`;
        const bid_obj_ = await this.nativeQuery(bidsql);
        console.log(bid_obj_)
        let sqlObj = this.mysqlUtil.create_sql(bid_obj_[0], query?.pageindex || null, query?.pagesize || null, query);
        if (sqlObj?.status == 0) {
            return sqlObj?.msg;
        }
        return this.nativeQuery(sqlObj?.sql)
    }
    /**
     * 分页查询
     * @param query
     */
    async updateData(query) {
        // const { keyWord, status, departmentIds = [] } = query;
        // const permsDepartmentArr = await this.baseSysPermsService.departmentIds(
        //   this.ctx.admin.userId
        // ); // 部门权限
        const bidsql = `select * from t_sys_business_config where id_='${query.bid}' limit 0,1`;
        const bid_obj_ = await this.nativeQuery(bidsql);
        let sqlObj = this.mysqlUtil.create_sql(bid_obj_[0], query?.pageindex || null, query?.pagesize || null, query);
        if (sqlObj?.status == 0) {
            return sqlObj?.msg;
        }
        return this.sqlRenderPage(sqlObj?.sql, query);
    }
}
src/app/modules/base/utils/axiosutil.ts
New file
@@ -0,0 +1,56 @@
import { Provide } from "@midwayjs/decorator"
const axios = require('axios');
/**
 * 系统用户
 */
@Provide()
export class AxiosUtil {
    async httpGet(uri) {
        console.log(uri);
        axios.get(uri).then(response => {
            console.log(response.data);
            return response;
        }).catch(error => {
            console.log(error);
            return error
        });
    }
    async httpPost(uri, postdata) {
        // let data = {
        //     name: 'John Doe',
        //     job: 'Content Writer'
        // };
        axios.post(uri, postdata).then((res) => {
            console.log(`Status: ${res.status}`);
            console.log('Body: ', res.data);
            return res;
        }).catch((err) => {
            console.error(err);
            return err
        });
    }
    async httpPostBuffer(uri,postdata) {
        axios({
            method: 'post',
            url: uri,
            data: postdata,
            headers: {
                'Content-Type': 'application/octet-stream', // 关键
            },
        }).then(res => {
            console.log(res)
            return res
        }).catch((error) => {
            console.log(error)
            return error
        })
    }
}
src/app/modules/base/utils/dateutil.ts
@@ -6,7 +6,6 @@
@Provide()
export class DateUtil {
    date_format(date_str, format) {
        // = 'YY-MM-DD hh:mm:ss'
        let date = new Date(date_str)
@@ -49,4 +48,9 @@
        return result
    }
    getCurretTimeStr() {
        let currtime = this.date_format(new Date(), 'YY-MM-DD hh:mm:ss')
        return currtime
    }
}
src/app/modules/business/controller/admin/colletmeta.ts
@@ -1,8 +1,10 @@
import { ALL, Body, Get, Inject, Post, Provide, Query } from '@midwayjs/decorator';
import { CoolController, BaseController } from '@cool-midway/core';
import { Colletmeta } from '../../entity/colletmeta';
// import { ColletmetaService } from '../../service/colletmeta';
// import { ColletmetaService } from '../../service/';
import { DataController } from '../../../base/controller/dataController';
import { SocketHandler } from '../../../../../socket/socketHandle';
import { RpcService } from '../../../base/service/dataapi/rpcservice';
/**
        * 监测元数据
        */
@@ -15,6 +17,22 @@
export class ColletmetaController extends DataController {
  //   @Inject()
  //   colletmetaService: ColletmetaService;
  @Inject()
  socketHandler: SocketHandler
  @Inject()
  rpcService: RpcService
  /**
  * 接收设备监控消息
  */
  @Post('/getDeviceMsg', { summary: '接收设备消息' })
  async getDeviceMsg(@Query(ALL) params: any) {
    this.dealMessage(params)
    return this.ok();
  }
  /**
  * 获得数据
@@ -30,4 +48,11 @@
  async postData(@Query(ALL) params: any) {
    return this.ok(await this.dataService.getData(params));
  }
  async dealMessage(params: any) {
    // this.socketHandler.connection
    console.log(params);
  }
}
src/app/modules/business/controller/admin/taskimmediately.ts
@@ -1,20 +1,61 @@
import { ALL, Body, Get, Inject, Post, Provide, Query } from '@midwayjs/decorator';
import { CoolController, BaseController } from '@cool-midway/core';
import { Taskimmediately } from '../../entity/taskimmediately';
// import { TaskimmediatelyService } from '../../service/taskimmediately';
import { TaskimmediatelyService } from '../../../business/service/taskimmediately';
import { DataController } from '../../../base/controller/dataController';
import { SocketHandler } from '../../../../../socket/socketHandle';
import { RpcService } from '../../../base/service/dataapi/rpcservice';
import { randomUUID } from 'crypto';
const ProtoBufJs = require("protobufjs");
const root = ProtoBufJs.loadSync("D:/21-dljc/road-env-server/server/models/aerial.proto");
const CommandMessage = root.lookupType("CommandMessage");
const command_req = CommandMessage.create();
// const SYScommand = root.lookupType("SysCommand");
// const SUBcommand = root.lookupType("SubCommand");
/**
        * 即时任务记录
        */
@Provide()
@CoolController({
  api: ['add', 'delete', 'update', 'list', 'page', 'info'],
  api: ['delete', 'update', 'list', 'page', 'info'],
  entity: Taskimmediately,
  //   service: TaskimmediatelyService,
  // service: TaskimmediatelyService,
})
export class TaskimmediatelyController extends DataController {
  //   @Inject()
  //   taskimmediatelyService: TaskimmediatelyService;
  @Inject()
  taskimmediatelyService: TaskimmediatelyService;
  @Inject()
  socketHandler: SocketHandler
  @Inject()
  rpcService: RpcService
  private colletServiceUrl = "http://192.168.1.4:5000/api";
  /**
  * 下发设备指令消息
  */
  @Post('/sendMsgToDevice', { summary: '下发设备指令消息' })
  async sendMsgToDevice(@Query(ALL) params: any) {
    console.log(params);
    return this.ok(await this.rpcService.remoteCall(this.colletServiceUrl, this.createCommand(params)))
  }
  /**
  * 下发设备指令消息
  */
   @Get('/sendMsgToDevice', { summary: '下发设备指令消息' })
   async sendMsg2Device(@Query(ALL) params: any) {
     // this.socketHandler.connection
     console.log(params);
     return this.ok(await this.rpcService.remoteCall(this.colletServiceUrl, this.createCommand(params)))
     // this.rpcService.remoteCall("http://192.168.1.4:5000/api", params);
   }
  /**
  * 获得数据
@@ -30,4 +71,29 @@
  async postData(@Query(ALL) params: any) {
    return this.ok(await this.dataService.getData(params));
  }
  createCommand(params: any) {
    command_req.source = "testcommand"
    command_req.generatetime = "2"
    command_req.syscommand = root.SysCommand.CAMERA_COMMAND
    command_req.subcommand = root.SubCommand.ONE_TIME_CAPTURE
    command_req.targetclient = "bunker0.block0.device0"
    command_req.returnserver = "server0"
    command_req.taskuuid = randomUUID()
    console.log(JSON.stringify(command_req))
    // Verify the payload if necessary (i.e. when possibly incomplete or invalid)
    let errMsg = CommandMessage.verify(command_req);
    if (errMsg)
      throw Error(errMsg);
    // let buffer = Buffer.from(command_req)
    let buffer_ = CommandMessage.encode(command_req).finish();
    // let msg_ = CommandMessage.decode(buffer_);
    return buffer_;
  }
}
src/app/modules/business/controller/admin/taskmonitor.ts
@@ -3,6 +3,8 @@
import { Taskmonitor } from '../../entity/taskmonitor';
// import { TaskmonitorService } from '../../service/taskmonitor';
import { DataController } from '../../../base/controller/dataController';
import { SocketHandler } from '../../../../../socket/socketHandle';
import { RpcService } from '../../../base/service/dataapi/rpcservice';
/**
        * 监测任务
        */
@@ -10,17 +12,39 @@
@CoolController({
  api: ['add', 'delete', 'update', 'list', 'page', 'info'],
  entity: Taskmonitor,
  service: RpcService,
  //   service: TaskmonitorService,
})
export class TaskmonitorController extends DataController {
  //   @Inject()
  //   taskmonitorService: TaskmonitorService;
  @Inject()
  socketHandler: SocketHandler
  @Inject()
  rpcService: RpcService
  /**
  * 任务下发
  */
  @Get('/add', { summary: '下发任务' })
  async add(@Query(ALL) params: any) {  // 这个io对象对应 SocketHandler的命名空间
    // this.socketHandler.connection
    this.socketHandler.clients.get("").emit('device is offline');
    this.rpcService.remoteCall(null,"");
  }
  /**
  * 获得数据
  */
  @Get('/getdata', { summary: '数据接口' })
  async getData(@Query(ALL) params: any) {
  async getData(@Query(ALL) params: any) {  // 这个io对象对应 SocketHandler的命名空间
    // this.socketHandler.connection
    this.socketHandler.clients.get("").emit('device is offline');
    return this.ok(await this.dataService.getData(params));
  }
  /**
@@ -30,4 +54,8 @@
  async postData(@Query(ALL) params: any) {
    return this.ok(await this.dataService.getData(params));
  }
}
src/app/modules/business/entity/periodicsetting.ts
@@ -9,6 +9,9 @@
  @Column({ comment: '周期任务', type: 'varchar', default: '', length: 255 })
  crontab_rule: string;
  @Column({ comment: '任务开始时间', type: 'datetime' })
  start_time: Date;
  @Column({ comment: '任务结束时间', type: 'datetime' })
  end_time: Date;
src/app/modules/business/service/taskimmediately.ts
New file
@@ -0,0 +1,51 @@
import { Provide } from '@midwayjs/decorator';
import { BaseService } from '@cool-midway/core';
import { InjectEntityModel } from '@midwayjs/orm';
import { Repository } from 'typeorm';
import { Basedeviceinfo } from '../entity/basedeviceinfo';
import { Devicegroup } from '../entity/devicegroup';
/**
 * 描述
 */
@Provide()
export class TaskimmediatelyService extends BaseService {
  @InjectEntityModel(Basedeviceinfo)
  Basedeviceinfo: Repository<Basedeviceinfo>;
  @InjectEntityModel(Devicegroup)
  Devicegroup: Repository<Devicegroup>;
  /**
   * 描述
   */
  // async add(param: any) {
  //   console.log(param, "dddddddd")
  //   const { logic_id } = param
  //   const devicegroup = this.Devicegroup
  //   await this.Devicegroup.insert(param)
  //   return await super.add(param)
  // }
  async delete(logic_id: any) {
    console.log(this.ctx, "ddd")
    await this.nativeQuery(
      'DELETE t_base_deviceinfo,t_base_device_group FROM t_base_deviceinfo,t_base_device_group WHERE t_base_deviceinfo.logic_id = t_base_device_group.logic_id AND t_base_deviceinfo.id in (?)',
      [logic_id]
    );
    await this.Basedeviceinfo.delete(logic_id)
  }
  async page(query) {
    // const { keyWord, status, departmentIds = [] } = query;
    // const permsDepartmentArr = await this.Basedeviceinfo.id(
    //   this.ctx.admin.userId
    // ); // 部门权限
    const sql = `
        SELECT a.*,b.configurator FROM t_base_deviceinfo a,t_base_device_group b WHERE 1 = 1`;
    return this.sqlRenderPage(sql, query);
  }
}
src/config/config.default.ts
@@ -74,8 +74,21 @@
    // 文件上传
    file: {
      // 文件路径前缀 本地上传模式下 有效
      // domain: 'http://127.0.0.1:8001',
      domain: 'http://112.74.77.127:9100/hn',
      domain: 'http://127.0.0.1:8001',
    },
    // redis为插件名称
    redis: {
      host: "127.0.0.1",
      password: "",
      port: 6379,
      db: 0
    },
    socket: {
      cors: {
        // 这里可以写具体的地址如:http://127.0.0.1:8080
        origin: '*',
        methods: ['GET', 'POST'],
      },
    },
  } as CoolConfig;
src/configuration.ts
@@ -7,12 +7,14 @@
import * as swagger from '@midwayjs/swagger';
// import * as wxpay from '@cool-midway/wxpay';
// import * as oss from '@cool-midway/oss';
// import * as redis from '@cool-midway/redis';
// import * as queue from '@cool-midway/queue';
import * as redis from '@cool-midway/redis';
import * as queue from '@cool-midway/queue';
// import * as alipay from '@cool-midway/alipay';
// import * as socket from '@cool-midway/socket';
import * as socket from '@cool-midway/socket';
@Configuration({
  // 注意组件顺序 cool 有依赖orm组件, 所以必须放在,orm组件之后 cool的其他组件必须放在cool 核心组件之后
  imports: [
    // 模板渲染
@@ -29,15 +31,15 @@
    // oss插件,需要到后台配置之后才有用,默认是本地上传
    // oss,
    // 将缓存替换成redis
    // redis,
    // // 队列
    // queue,
    redis,
    // 队列
    queue,
    // 微信支付
    //wxpay,
    // 支付宝支付
    // alipay,
    // socket
    //socket,
    socket,
    // file,
  ],
})
src/schedule/aerial.proto
New file
@@ -0,0 +1,294 @@
syntax = "proto3";
// enum SysCommand {
//   UNKOWN_COMMAND     = 0;   // 未知命令
//   SYS_COMMAND        = 1;   // 系统命令
//   SENSOR_COMMAND     = 2;   // 传感器命令
//   FIVE_G_COMMAND     = 3;   // 通讯5G模块命令
//   CAMERA_COMMAND     = 4;   // 摄像头参数命令
//   IO_COMMAND         = 5;   // 外设IO口操作命令
//   SYS_PARAMS_COMMAND = 6;   // 系统参数获取
//   WIFI_COMMAND       = 7;   // 设备WIFI参数设置
//   KERNEL_COMMAND     = 8;   // 核心计算参数设
//   DEVICE_COMMAND     = 9;   // 工作设备参数设置
//   MICRO_WAVE_COMMAND = 10;  // 毫米波
// }
// enum SubCommand {
//   option allow_alias = true;
//   UNKOWN_SUB_COMMAND   = 0;                   // 未知子命令
//   // 系统命令
//   POWER_ON_SUB_COMMAND = 1;                   // 开机
//   POWER_OFF_SUB_COMMAND = 2;                  // 关机
//   // 传感器命令
//   SENSOR_INIT_SUB_COMMAND = 1;                // 传感器初始化
//   SENSOR_REQURE_SUB_COMMAND = 2;              // 传感器参数获取
//   RTK_SETTING_SUB_COMMAND = 3;                // RTK外设参数设置
//   RTK_REQURE_SUB_COMMAND = 4;                 // RTK外设数据获取
//   // 通讯5G模块命令
//   FIVE_G_INIT_SUB_COMMAND = 1;                // 5G模块参数初始化
//   FIVE_G_SEND_IMAGE_SUB_COMMAND = 2;          // 5G通讯图像数据发送
//   FIVE_G_REQURE_SUB_COMMAND = 3;              // 5G通讯接收
//   // 摄像头参数命令
//   CAMERA_NUMBER_SUB_COMMAND = 1;              // 设备摄像头个数
//   CAMERA_RESOLUTION_SUB_COMMAND = 2;          // 设备摄像头工作分辨率
//   CAMERA_FRAME_RATE_SUB_COMMAND = 3;          // 摄像头工作帧率
//   CAMERA_OTHER_PARAMS_SUB_COMMAND = 4;        // 摄像头工作其他参数
//   // 外设IO口操作命令
//   CAMERA_DUST_REMOVAL_START_SUB_COMMAND = 1;  // 摄像头除尘启动
//   CAMERA_CONTROL_START_SUB_COMMAND = 2;       // 外设控制数据启动(18路控制)
//   // 系统参数获取
//   CPU_FREQUENCY_SUB_COMMAND = 1;              // CPU主频工作数据
//   CPU_KERNAL_TEMP_SUB_COMMAND = 2;            // CPU核心温度数据
//   CPU_BETTERY_DATA_SUB_COMMAND = 3;           // 电池供电电量数据
//   // 设备WIFI参数设置
//   WIFI_HOTSPOT_SETTING_SUB_COMMAND = 1;       // WIFI热点设置
//   WIFI_HOTSPOT_START_STOP_SUB_COMMAND = 2;    // WIFI热点开启和关闭
//   // 核心计算参数设置
//   POINT_CLOUD_ACCURACY_SUB_COMMAND = 1;       // 点云计算精度
//   SPLICING_PARAMS_SUB_COMMAND = 2;            // 拼接参数
//   MAP_INTERFACE_PLATFORM_SUB_COMMAND = 3;     // 地图接口平台
//   DATA_STORE_BACKUP_SUB_COMMAND = 4;          // 数据存储备份
//   // 工作设备参数设置
//   SYSTEM_TIMER_SUB_COMMAND = 1;               // 系统工作定时
//   SYSTEM_COORD_HEIGHT_SUB_COMMAND = 2;        // 工作区域坐标与高度
//   TRIGGER_CONDITION_SUB_COMMAND = 3;          // 工作触发条件
//   GRAVITY_FAILURE_SUB_COMMAND = 4;            // 重力加速度失效参数
//   NINE_AXIS_FAILURE_SUB_COMMAND = 5;          // 九轴加速度失效参数
//   // 毫米波
//   MICRO_WAVE_SUB_COMMAND = 1;                 // 毫米波
// }
// message DataField {
//   int32 length = 1;                           // 数据长度
//   bytes data = 2;                            // 数据内容
//   int32 checksum = 3;                        // 校验码
// }
// message CapturedData {
//   int64 capture_time = 1;                     // 采集时间
//   string capture_device =2;                   // 采集设备
//   int32 capture_port = 3;                     // 采集设备序号
//   DataField DataField = 4;
//   string data_type = 5;                         // 数据类型 image udp
// }
// message DataMessage{
//   int64 sending_time = 1;
//   string sending_device = 2;
//   string target_device = 3;
//   CapturedData CapturedData = 5;
// }
// message StateData {
//  int64 state_time = 1;
//  string state_device = 2;
//  DataField DataField = 4;
// }
// message StateMessage {
//   int64 sending_time = 1;
//   string sending_device = 2;
//   string target_device = 3;
//   CapturedData StatedData = 5;
// }
// message CommandData {
//   SysCommand SysCommand = 1;
//   SubCommand SubCommand = 2;
// }
// message CommandMessage {
//   int64 sending_time = 1;
//   string sending_device = 2;
//   string target_device = 3;
//   CommandData CommandData =4;
// }
enum SysCommand{
  UNKOWN_COMMAND     = 0;
  CAMERA_COMMAND     = 1;
  MICROWAVE_COMMAND   = 2;
  DUSTCLEANER_COMMAND   = 3;
}
enum SubCommand{
  UNKOWN_SUBCOMMAND     = 0;
  // camera params
  ONE_TIME_CAPTURE      = 1;
  // microwave params
  ONE_CIRCLE_SCAN       = 2;
  // dust cleaner params
  ONE_CLEAN_SCAN        = 4;
}
message CommandMessage{
  string source = 1;
  string generatetime = 2;
  SysCommand syscommand = 3;
  SubCommand subcommand = 4;
  string targetclient = 5;
  string returnserver = 6;
  string taskuuid = 7;
}
message LogsMessage{
  string source = 1;
  string timestamp = 2;
  string context = 3;
  optional string task_uuid = 4;
}
message ImagesMessage
{
  string source = 1;
  string timestamp = 2;
  message ImageItems
  {
    int32 length = 1;                           // 数据长度
    bytes data = 2;                            // 数据内容
  }
  repeated ImageItems Image = 3;
  optional string task_uuid = 4;
}
message PlysMessage
{
  string source = 1;
  string timestamp = 2;
  message PointCloudItem
  {
    int32 length = 1;
    int32 rows = 2;
    int32 cols = 3;
    string order = 4;
    string dtype = 5;
    bytes data = 6;
  }
  repeated PointCloudItem Plydata = 3;
  optional string task_uuid = 4;
  // enum ref_system
  // {
  //   MICROWAVE_SYSTEM = 0;
  //   DEVICE_SYSTEM = 1;
  // }
  // ref_system reference = 4
}
// message MicroWaveMessage
// {
//   int32 length = 1;                           // 数据长度
//   bytes data = 2;                            // 数据内容
// }
// message CommandRequest{
// }
// message StateMessage{
//   string message_type = 1;
//   int64 generate_time = 2;
//   string generate_device = 3;
//   string target_device = 4;
//   string message_uuid = 5;
//   string str_body = 6;
// }
// message RequestCommand {
//   int32 sync_word = 1;              // 同步字
//   string device_id = 2;             // 设备ID
//   SysCommand sys_command = 3;       // 命令1
//   SubCommand sub_command = 4;       // 命令2
//   DataField data1 = 5;              // 数据1
//   DataField data2 = 6;              // 数据2
//   int32 checksum = 7;               // 校验码
// }
// enum ResponseState
// {
//   SUCCESS = 0;                  // 成功
//   FAILURE = 1;                  // 失败
//   ABNORMAL = 2;                 // 异常
//   INFICIENT_POWER = 3;          // 电量不足
//   OTHER = 4;                    // 其他
// }
// message ResponseCommand
// {
//     string device_id = 1;        // 设备ID
//     SysCommand sys_command = 2;  // 命令1
//     SubCommand sub_command = 3;  // 命令2
//     ResponseState state = 4;     // 响应状态
//     int32 data_length = 5;       // 数据长度
//     bytes data = 6;              // 数据
//     int32 checksum = 7;          // 校验码
// }
// // 服务端向采集端发送的主指令
// enum ControlSysCommand {
//   DUST_CLEANER_COMMAND = 0;
// }
// // 服务端向采集端发送的子命令
// enum ControlSubCommand {
//   // dust cleaner sub commands
//   DUST_CLEANER_ONETIME_CLEAN_SELF         = 0;
//   DUST_CLEANER_ONETIME_CLEAN_CAMERA       = 1;
//   DUST_CLEANER_CLOSE_PERIOD_CLEAN_SELF    = 2;
//   DUST_CLEANER_CLOSE_PERIOD_CLEAN_CAMERA  = 3;
//   DUST_CLEANER_PERIOD_CLEAN_SELF          = 4;
//   DUST_CLEANER_PERIOD_CLEAN_CAMERA        = 5;
// }
// // dust cleaner command message
// message DustCleanerMessage  {
//   uint32 period = 1;
// }
// // 控制上位机消息
// message ControllMessage {
//   int32 sync_word = 1;                // 同步字
//   ControlSysCommand sys_command = 3;  // 主命令
//   ControlSubCommand sub_command = 4;  // 子命令
//   DataField data = 5;                 // 数据
//   int32 checksum = 7;                 // 校验码
// }
src/schedule/helloCorn
New file
@@ -0,0 +1,19 @@
import { Provide, Inject, Schedule, CommonSchedule } from '@midwayjs/decorator';
import { Context } from 'egg';
@Provide()
@Schedule({
  interval: 2333, // 2.333s 间隔
  type: 'worker', // 指定某一个 worker 执行
  //cron: '0 0 */3 * * *',
})
export class HelloCron implements CommonSchedule {
  @Inject()
  ctx: Context;
  // 定时执行的具体任务
  async exec() {
    this.ctx.logger.info(process.pid, 'hello');
  }
}
src/schedule/taskSchedule.js
New file
@@ -0,0 +1,181 @@
const schedule = require('node-schedule');
const axios = require('axios');
const ProtoBufJs = require("protobufjs");
const root = ProtoBufJs.loadSync("D:/22-hn3d/hn3d/src/schedule/aerial.proto");
const CommandMessage = root.lookupType("CommandMessage");
const command_req = CommandMessage.create();
var jsonData = '';//存储天气信息
// 定义规则
let rule = new schedule.RecurrenceRule();
// rule.minute = [1,6,11,16,21,26,31,36,41,46,51,56]
rule.second = [58]; // 每隔 10 秒执行一次
let rule_task = new schedule.RecurrenceRule();
// rule.minute = [1,6,11,16,21,26,31,36,41,46,51,56]
rule_task.second = [00]; // 每隔 10 秒执行一次
var periodTasklist = []
var payload = { source: "AwesomeString", syscommand: 1, subcommand: 2, generatetime: "2", targetclient:"111",returnserver:"#server#", taskuuid:"1234" };
// Verify the payload if necessary (i.e. when possibly incomplete or invalid)
var errMsg = CommandMessage.verify(payload);
if (errMsg)
    throw Error(errMsg);
// Create a new message
var message = CommandMessage.create(payload); // or use .fromObject if conversion is necessary
// let buffer = Buffer.from(command_req)
// let buffer = CommandMessage.encode(message).finish();
// let msg = CommandMessage.decode(buffer);
module.exports = {
    async job_() {
        // schedule.scheduleJob('5 * * * * *', async () => {
        // });
    },
};
schedule.scheduleJob(rule_task, async () => {//每分钟读取周期任务 并将任务分解执行
    // let res = httpGet('http://127.0.0.1:8001/admin/business/periodicsetting/getdata?bid=getPeriodTaskList');
    axios.get('http://127.0.0.1:8001/admin/business/periodicsetting/getdata?bid=getPeriodTaskList').then(response => {
        periodTasklist = response.data.data;
        console.log(periodTasklist)
    }).catch(error => {
        console.log(error);
    });
});
schedule.scheduleJob(rule, async () => {//每分钟读取周期任务 并将任务分解执行
    //http://192.168.1.4:5000/api
    // Exemplary payload
    var payload = { source: "AwesomeString", syscommand: 1, subcommand: 2, generatetime: "2", targetclient:"111",returnserver:"#server#", taskuuid:"1234" };
    // Verify the payload if necessary (i.e. when possibly incomplete or invalid)
    var errMsg = CommandMessage.verify(payload);
    if (errMsg)
        throw Error(errMsg);
    // Create a new message
    var message = CommandMessage.create(payload); // or use .fromObject if conversion is necessary
    // let buffer = Buffer.from(command_req)
    let buffer = CommandMessage.encode(message).finish();
    let msg = CommandMessage.decode(buffer);
    console.log('-------step in-------------------------')
    let urlstr = "http://192.168.1.4:5000/api";
    axios({
        method: 'post',
        url: urlstr,
        data: buffer,
        headers: {
            'Content-Type': 'application/octet-stream', // 关键
        },
    }).then(res => {
        console.log(res)
    }).catch((error) => {
        console.log(error)
    })
    console.log('-----step over------------------------------------------------')
});
// schedule.scheduleJob(rule, async () => {//每小时定时取天气数据
//     //https://devapi.heweather.net/v7/weather/now?location=101021700&key=495b433d21c84986a99c4ac52d42fd3b
//     // 1. 检测当前是否已有天气数据
//     let sqlstr = `select count(1) as counter from t_d_weather_hour where TO_DAYS(now())=TO_DAYS(posttime) and HOUR(now())=hour(posttime) and posttime> date_sub(now(), interval 1 hour)`;
//     let lastdata_times = await mysql.query_data(sqlstr, 'master', null);
//     if( lastdata_times[0].counter > 0 ) { return ;}
//     // 2.若当前无天气数据,重新抓取
//     let urlstr = "https://devapi.heweather.net/v7/weather/now?location=location_code&key=495b433d21c84986a99c4ac52d42fd3b";
//     sqlstr = `select * from t_s_weather_city order by code`;
//     let data_rets = await mysql.query_data(sqlstr, 'master', null)
//     for (let index = 0; index < data_rets.length; index++) {
//         let element = data_rets[index];
//         axios.get(urlstr.replace('location_code', element.code)).then(response => {
//             if(response.data.now) {
//                 let w = response.data.now;
//                 let posttime_ = w.obsTime.replace('T',' ').substr(0,13)+ ':00:00';
//                 let sql_ = `insert into t_d_weather_hour (type,citycode,cityname,posttime,temp,feelsLike,icon,text,wind360,windDir,windScale,windSpeed,humidity,precip,pressure,vis,cloud,dew,responsedata)
//                     values ('${element.type}','${element.code}','${element.name}','${posttime_}','${w.temp}','${w.feelsLike}','${w.icon}','${w.text}','${w.wind360}',
//                     '${w.windDir}','${w.windScale}','${w.windSpeed}','${w.humidity}','${w.precip}','${w.pressure}','${w.vis}','${w.cloud}','${w.dew}','${JSON.stringify(response.data)}'
//                 )`;
//                 mysql.query_data(sql_, 'master', null)
//             }
//         }).catch(error => {
//             console.log(error);
//         });
//     }
// });
// schedule.scheduleJob(rule, async () => {//每天定时更新天气数据
//     //https://devapi.qweather.com/v7/weather/3d?location=101021700&key=495b433d21c84986a99c4ac52d42fd3b
//     // 1. 检测当前是否已有天气数据
//     let sqlstr = `select count(1) as counter from t_d_weather_day where TO_DAYS(now())=TO_DAYS(posttime)`;
//     let lastdata_times = await mysql.query_data(sqlstr, 'master', null);
//     if( lastdata_times[0].counter > 0 ) { return ;}
//     // 2.若当前无天气数据,重新抓取
//     let urlstr = "https://devapi.qweather.com/v7/weather/3d?location=location_code&key=495b433d21c84986a99c4ac52d42fd3b";
//     sqlstr = `select * from t_s_weather_city order by code`;
//     let data_rets = await mysql.query_data(sqlstr, 'master', null)
//     for (let index = 0; index < data_rets.length; index++) {
//         let element = data_rets[index];
//         axios.get(urlstr.replace('location_code', element.code)).then(response => {
//             if(response.data.daily) {
//                 let w = response.data.daily[0];
//                 let posttime_ = w.fxDate+ ' 00:00:00';
//                 let sql_ = `insert into t_d_weather_day (type,citycode,cityname,posttime,iconNight,iconDay,humidity,precip,pressure,vis,cloud,
//                     moonPhase,moonPhaseIcon,moonrise,moonset,sunrise,sunset,tempMax,tempMin,textDay,textNight,uvIndex,
//                     wind360Day,windDirDay,wind360Night,windDirNight,windScaleDay,windScaleNight,windSpeedDay,windSpeedNight,responsedata)
//                     values ('${element.type}','${element.code}','${element.name}','${posttime_}','${w.iconNight}','${w.iconDay}','${w.humidity}','${w.precip}','${w.pressure}','${w.vis}',
//                     '${w.cloud}','${w.moonPhase}','${w.moonPhaseIcon}','${w.moonrise}','${w.moonset}','${w.sunrise}','${w.sunset}','${w.tempMax}','${w.tempMin}','${w.textDay}','${w.textNight}','${w.uvIndex}',
//                     '${w.wind360Day}','${w.windDirDay}','${w.wind360Night}','${w.windDirNight}','${w.windScaleDay}','${w.windScaleNight}','${w.windSpeedDay}','${w.windSpeedNight}',
//                     '${JSON.stringify(response.data)}'
//                 )`;
//                 mysql.query_data(sql_, 'master', null)
//             }
//         }).catch(error => {
//             console.log(error);
//         });
//     }
// });
//  https://devapi.heweather.net/v7/weather/now?location=101021700&key=495b433d21c84986a99c4ac52d42fd3b
function httpGet(uri) {
    console.log(uri);
    axios.get(uri).then(response => {
        console.log(response.data);
        return response.data;
    }).catch(error => {
        console.log(error);
    });
}
function httpPost(uri, postdata) {
    // let data = {
    //     name: 'John Doe',
    //     job: 'Content Writer'
    // };
    axios.post(uri, postdata).then((res) => {
        return res.data;
        console.log(`Status: ${res.status}`);
        console.log('Body: ', res.data);
    }).catch((err) => {
        console.error(err);
    });
}
src/socket/chatUser.ts
New file
@@ -0,0 +1,32 @@
import { EntityModel } from '@midwayjs/orm';
import { BaseEntity } from '@cool-midway/core';
import { Column, Index } from 'typeorm';
/**
 * 系统日志
 */
@EntityModel('t_sys_user_chat')
export class ChatUserEntity extends BaseEntity {
  @Index()
  @Column({ comment: '用户ID', nullable: true, type: 'bigint' })
  userId: number;
  @Index()
  @Column({ comment: '行为', length: 100 })
  action: string;
  @Index()
  @Column({ comment: '内容', length: 100 })
  chatmsg: string;
  @Index()
  @Column({ comment: 'ip', nullable: true, length: 50 })
  ip: string;
  @Index()
  @Column({ comment: 'ip地址', nullable: true, length: 50 })
  ipAddr: string;
  @Column({ comment: '参数', nullable: true, type: 'text' })
  params: string;
}
src/socket/socketHandle.ts
New file
@@ -0,0 +1,85 @@
import { Config, Provide, Scope, ScopeEnum } from '@midwayjs/decorator';
import { InjectEntityModel } from '@midwayjs/orm';
import { CoolSocket, SocketEnvent } from '@cool-midway/socket';
import { Socket } from 'socket.io';
// import { ChatUserEntity } from '../entity/user';
import { Repository } from 'typeorm';
import * as jwt from 'jsonwebtoken';
/**
 * socket的事件
 */
@Provide()
@Scope(ScopeEnum.Singleton)
@CoolSocket() // 支持设置命名空间 如:@CoolSocket('/test')
export class SocketHandler {
  // 获得模块的配置信息
  @Config('module.chat.jwt')
  jwtConfig;
  public clients: Map<String, Socket>;
//   @InjectEntityModel(ChatUserEntity)
//   chatUserEntity: Repository<ChatUserEntity>;
  /**
   * 连接成功
   * @param data
   */
  @SocketEnvent()
  async connection(socket: Socket) {
    // console.log('socket事件', socket.id, socket.handshake.query);
    // console.log('socket事件', socket.id, socket.handshake);
    console.log(socket);
    this.clients.set(socket.id, socket)
    const { token } = socket.handshake.query;
    console.log('-----------------------------------------------------------------------------------------------------------------------')
    console.log(token)
    // let tokenInfo;
    // try {
    //   // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    //   // @ts-ignore
    //   tokenInfo = jwt.verify(token, this.jwtConfig.secret);
    // } catch (error) {
    //   // 如果验证不通过则断开连接
    //   socket.emit('comm', '校验失效');
    //   socket.disconnect();
    //   return;
    // }
    socket.on('disconnect', eventSocket => {
      this.clients.delete(socket.id)
      console.log('断开连接');
    });
    socket.on('msg', msg => {
      console.log('客户端消息', msg);
      socket.emit('data', 're:'+msg.op +" "+ msg.deviceid)
    });
    socket.on('devicelog',msg => {
      //解析终端上报的状态消息
      //入库
      //推送到前端
      socket.broadcast.emit('');
    });
  }
  /**
   * 连接成功
   * @param data
   */
   @SocketEnvent()
   async broadcast(socket: Socket) {
       //推送到前端
       socket.broadcast.emit('');
   }
}