Files
nxxmdata/backend/models/IotJbqClient.js
2025-09-12 20:08:42 +08:00

391 lines
9.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;