修改管理后台
This commit is contained in:
391
backend/models/IotJbqClient.js
Normal file
391
backend/models/IotJbqClient.js
Normal file
@@ -0,0 +1,391 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user