Files
nxxmdata/backend/models/IotJbqClient.js

391 lines
9.1 KiB
JavaScript
Raw Normal View History

2025-09-12 20:08:42 +08:00
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;