391 lines
9.1 KiB
JavaScript
391 lines
9.1 KiB
JavaScript
|
|
const { Model, DataTypes } = require('sequelize');
|
|||
|
|
const { sequelize } = require('../config/database-simple');
|
|||
|
|
|
|||
|
|
class IotJbqClient extends Model {
|
|||
|
|
// 获取设备状态文本
|
|||
|
|
getStatusText() {
|
|||
|
|
const statusMap = {
|
|||
|
|
0: '离线',
|
|||
|
|
1: '在线',
|
|||
|
|
2: '报警',
|
|||
|
|
3: '维护'
|
|||
|
|
};
|
|||
|
|
return statusMap[this.state] || '未知';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取设备状态颜色
|
|||
|
|
getStatusColor() {
|
|||
|
|
const colorMap = {
|
|||
|
|
0: 'red', // 离线
|
|||
|
|
1: 'green', // 在线
|
|||
|
|
2: 'orange', // 报警
|
|||
|
|
3: 'blue' // 维护
|
|||
|
|
};
|
|||
|
|
return colorMap[this.state] || 'default';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取电量百分比
|
|||
|
|
getBatteryPercent() {
|
|||
|
|
const voltage = parseFloat(this.voltage) || 0;
|
|||
|
|
// 假设电压范围是0-100,转换为百分比
|
|||
|
|
return Math.min(100, Math.max(0, voltage));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取温度值
|
|||
|
|
getTemperatureValue() {
|
|||
|
|
return parseFloat(this.temperature) || 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取GPS状态文本
|
|||
|
|
getGpsStatusText() {
|
|||
|
|
const gpsMap = {
|
|||
|
|
'A': '有效',
|
|||
|
|
'V': '无效',
|
|||
|
|
'N': '无信号'
|
|||
|
|
};
|
|||
|
|
return gpsMap[this.gps_state] || '未知';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取最后更新时间
|
|||
|
|
getLastUpdateTime() {
|
|||
|
|
if (!this.uptime) return '-';
|
|||
|
|
const date = new Date(this.uptime * 1000);
|
|||
|
|
return date.toLocaleString('zh-CN', {
|
|||
|
|
year: 'numeric',
|
|||
|
|
month: '2-digit',
|
|||
|
|
day: '2-digit',
|
|||
|
|
hour: '2-digit',
|
|||
|
|
minute: '2-digit',
|
|||
|
|
second: '2-digit'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取绑带状态文本
|
|||
|
|
getBandgeStatusText() {
|
|||
|
|
const statusMap = {
|
|||
|
|
0: '未绑定',
|
|||
|
|
1: '已绑定',
|
|||
|
|
2: '松动',
|
|||
|
|
3: '脱落'
|
|||
|
|
};
|
|||
|
|
return statusMap[this.bandge_status] || '未知';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取绑带状态颜色
|
|||
|
|
getBandgeStatusColor() {
|
|||
|
|
const colorMap = {
|
|||
|
|
0: 'default', // 未绑定
|
|||
|
|
1: 'green', // 已绑定
|
|||
|
|
2: 'orange', // 松动
|
|||
|
|
3: 'red' // 脱落
|
|||
|
|
};
|
|||
|
|
return colorMap[this.bandge_status] || 'default';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 检查是否有定位信息
|
|||
|
|
hasLocation() {
|
|||
|
|
return this.lat && this.lon && this.lat !== '0' && this.lon !== '0';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取耳标编号(使用aaid字段)
|
|||
|
|
getEartagNumber() {
|
|||
|
|
return this.aaid ? this.aaid.toString() : '-';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取被采集主机(使用sid字段)
|
|||
|
|
getHostId() {
|
|||
|
|
return this.sid || '-';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取总运动量
|
|||
|
|
getTotalMovement() {
|
|||
|
|
return this.walk || 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取当日运动量
|
|||
|
|
getDailyMovement() {
|
|||
|
|
return this.y_steps || 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取佩戴状态文本
|
|||
|
|
getWearStatusText() {
|
|||
|
|
return this.is_wear ? '已佩戴' : '未佩戴';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取佩戴状态颜色
|
|||
|
|
getWearStatusColor() {
|
|||
|
|
return this.is_wear ? 'green' : 'default';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取GPS信号等级
|
|||
|
|
getGpsSignalLevel() {
|
|||
|
|
const gpsState = this.gps_state;
|
|||
|
|
if (gpsState === 'A') {
|
|||
|
|
return '强';
|
|||
|
|
} else if (gpsState === 'V') {
|
|||
|
|
return '弱';
|
|||
|
|
} else {
|
|||
|
|
return '无';
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
IotJbqClient.init({
|
|||
|
|
id: {
|
|||
|
|
type: DataTypes.BIGINT,
|
|||
|
|
primaryKey: true,
|
|||
|
|
autoIncrement: true,
|
|||
|
|
comment: '耳标设备ID'
|
|||
|
|
},
|
|||
|
|
org_id: {
|
|||
|
|
type: DataTypes.INTEGER.UNSIGNED,
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '组织ID'
|
|||
|
|
},
|
|||
|
|
cid: {
|
|||
|
|
type: DataTypes.BIGINT,
|
|||
|
|
allowNull: false,
|
|||
|
|
comment: '设备CID'
|
|||
|
|
},
|
|||
|
|
aaid: {
|
|||
|
|
type: DataTypes.BIGINT,
|
|||
|
|
allowNull: false,
|
|||
|
|
comment: '耳标编号'
|
|||
|
|
},
|
|||
|
|
uid: {
|
|||
|
|
type: DataTypes.BIGINT,
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '用户ID'
|
|||
|
|
},
|
|||
|
|
time: {
|
|||
|
|
type: DataTypes.INTEGER,
|
|||
|
|
allowNull: false,
|
|||
|
|
comment: '时间戳'
|
|||
|
|
},
|
|||
|
|
uptime: {
|
|||
|
|
type: DataTypes.INTEGER,
|
|||
|
|
allowNull: false,
|
|||
|
|
comment: '更新时间戳'
|
|||
|
|
},
|
|||
|
|
sid: {
|
|||
|
|
type: DataTypes.STRING(16),
|
|||
|
|
allowNull: false,
|
|||
|
|
comment: '被采集主机ID'
|
|||
|
|
},
|
|||
|
|
walk: {
|
|||
|
|
type: DataTypes.BIGINT,
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '总运动量'
|
|||
|
|
},
|
|||
|
|
y_steps: {
|
|||
|
|
type: DataTypes.BIGINT,
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '当日运动量'
|
|||
|
|
},
|
|||
|
|
r_walk: {
|
|||
|
|
type: DataTypes.BIGINT,
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '剩余运动量'
|
|||
|
|
},
|
|||
|
|
lat: {
|
|||
|
|
type: DataTypes.STRING(50),
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: '0',
|
|||
|
|
comment: '纬度'
|
|||
|
|
},
|
|||
|
|
lon: {
|
|||
|
|
type: DataTypes.STRING(50),
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: '0',
|
|||
|
|
comment: '经度'
|
|||
|
|
},
|
|||
|
|
gps_state: {
|
|||
|
|
type: DataTypes.STRING(5),
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 'V',
|
|||
|
|
comment: 'GPS状态'
|
|||
|
|
},
|
|||
|
|
voltage: {
|
|||
|
|
type: DataTypes.STRING(10),
|
|||
|
|
allowNull: true,
|
|||
|
|
comment: '电压/电量'
|
|||
|
|
},
|
|||
|
|
temperature: {
|
|||
|
|
type: DataTypes.STRING(10),
|
|||
|
|
allowNull: true,
|
|||
|
|
comment: '温度'
|
|||
|
|
},
|
|||
|
|
temperature_two: {
|
|||
|
|
type: DataTypes.STRING(10),
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: '0',
|
|||
|
|
comment: '温度2'
|
|||
|
|
},
|
|||
|
|
state: {
|
|||
|
|
type: DataTypes.INTEGER(1),
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 1,
|
|||
|
|
comment: '设备状态:0-离线,1-在线,2-报警,3-维护'
|
|||
|
|
},
|
|||
|
|
type: {
|
|||
|
|
type: DataTypes.INTEGER(5),
|
|||
|
|
allowNull: true,
|
|||
|
|
defaultValue: 1,
|
|||
|
|
comment: '设备类型'
|
|||
|
|
},
|
|||
|
|
sort: {
|
|||
|
|
type: DataTypes.INTEGER(5),
|
|||
|
|
allowNull: true,
|
|||
|
|
defaultValue: 4,
|
|||
|
|
comment: '排序'
|
|||
|
|
},
|
|||
|
|
ver: {
|
|||
|
|
type: DataTypes.STRING(10),
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: '0',
|
|||
|
|
comment: '固件版本'
|
|||
|
|
},
|
|||
|
|
weight: {
|
|||
|
|
type: DataTypes.INTEGER(5),
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '重量'
|
|||
|
|
},
|
|||
|
|
start_time: {
|
|||
|
|
type: DataTypes.INTEGER,
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '开始时间'
|
|||
|
|
},
|
|||
|
|
run_days: {
|
|||
|
|
type: DataTypes.INTEGER,
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 240,
|
|||
|
|
comment: '运行天数'
|
|||
|
|
},
|
|||
|
|
zenowalk: {
|
|||
|
|
type: DataTypes.INTEGER,
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '零步数'
|
|||
|
|
},
|
|||
|
|
zenotime: {
|
|||
|
|
type: DataTypes.INTEGER,
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '零时间'
|
|||
|
|
},
|
|||
|
|
is_read: {
|
|||
|
|
type: DataTypes.INTEGER(5),
|
|||
|
|
allowNull: true,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '是否已读'
|
|||
|
|
},
|
|||
|
|
read_end_time: {
|
|||
|
|
type: DataTypes.INTEGER,
|
|||
|
|
allowNull: true,
|
|||
|
|
comment: '读取结束时间'
|
|||
|
|
},
|
|||
|
|
bank_userid: {
|
|||
|
|
type: DataTypes.INTEGER(5),
|
|||
|
|
allowNull: true,
|
|||
|
|
comment: '银行用户ID'
|
|||
|
|
},
|
|||
|
|
bank_item_id: {
|
|||
|
|
type: DataTypes.INTEGER,
|
|||
|
|
allowNull: true,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '银行项目ID'
|
|||
|
|
},
|
|||
|
|
bank_house: {
|
|||
|
|
type: DataTypes.INTEGER,
|
|||
|
|
allowNull: true,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '银行房屋'
|
|||
|
|
},
|
|||
|
|
bank_lanwei: {
|
|||
|
|
type: DataTypes.INTEGER,
|
|||
|
|
allowNull: true,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '银行栏位'
|
|||
|
|
},
|
|||
|
|
bank_place: {
|
|||
|
|
type: DataTypes.TINYINT(2),
|
|||
|
|
allowNull: true,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '银行地点'
|
|||
|
|
},
|
|||
|
|
is_home: {
|
|||
|
|
type: DataTypes.INTEGER(5),
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 1,
|
|||
|
|
comment: '是否在家'
|
|||
|
|
},
|
|||
|
|
distribute_time: {
|
|||
|
|
type: DataTypes.INTEGER.UNSIGNED,
|
|||
|
|
allowNull: true,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '分发时间'
|
|||
|
|
},
|
|||
|
|
bandge_status: {
|
|||
|
|
type: DataTypes.INTEGER(5),
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '绑带状态:0-未绑定,1-已绑定,2-松动,3-脱落'
|
|||
|
|
},
|
|||
|
|
is_wear: {
|
|||
|
|
type: DataTypes.TINYINT(1).UNSIGNED,
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '是否佩戴'
|
|||
|
|
},
|
|||
|
|
is_temperature: {
|
|||
|
|
type: DataTypes.TINYINT(1).UNSIGNED,
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '是否有温度'
|
|||
|
|
},
|
|||
|
|
source_id: {
|
|||
|
|
type: DataTypes.BIGINT,
|
|||
|
|
allowNull: true,
|
|||
|
|
comment: '来源ID'
|
|||
|
|
},
|
|||
|
|
expire_time: {
|
|||
|
|
type: DataTypes.INTEGER.UNSIGNED,
|
|||
|
|
allowNull: false,
|
|||
|
|
defaultValue: 0,
|
|||
|
|
comment: '过期时间'
|
|||
|
|
}
|
|||
|
|
}, {
|
|||
|
|
sequelize,
|
|||
|
|
modelName: 'IotJbqClient',
|
|||
|
|
tableName: 'iot_jbq_client',
|
|||
|
|
timestamps: false,
|
|||
|
|
indexes: [
|
|||
|
|
{ fields: ['org_id'] },
|
|||
|
|
{ fields: ['aaid'] },
|
|||
|
|
{ fields: ['uid'] },
|
|||
|
|
{ fields: ['uptime'] },
|
|||
|
|
{ fields: ['sid'] },
|
|||
|
|
{ fields: ['type'] },
|
|||
|
|
{ fields: ['is_wear'] },
|
|||
|
|
{ fields: ['source_id'] }
|
|||
|
|
]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 定义关联关系
|
|||
|
|
IotJbqClient.associate = (models) => {
|
|||
|
|
// 与牛只档案的关联关系(通过cid和earNumber匹配)
|
|||
|
|
IotJbqClient.hasOne(models.IotCattle, {
|
|||
|
|
foreignKey: 'earNumber',
|
|||
|
|
sourceKey: 'cid',
|
|||
|
|
as: 'cattle'
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
module.exports = IotJbqClient;
|