Files
gzth/yuthon_hr_attendance/models/attendance_iot_manager.py
T
2024-10-10 19:43:59 +08:00

91 lines
3.5 KiB
Python

# -*- coding: utf-8 -*-
from odoo import api, fields, models, tools, _
from datetime import datetime, time, timedelta
from odoo import api, fields, models, tools
from odoo.exceptions import UserError
import paho.mqtt.client as mqtt
import logging
_logger = logging.getLogger(__name__)
class AttendanceIotManager(models.Model):
_name = 'attendance.iot.manager'
_description = "考勤机管理"
attendance_iot_id = fields.Many2one('attendance.iot', string="设备号")
attendance_address = fields.Char(string="设备地址")
employee_id = fields.Many2one('hr.employee', string="员工")
id_valid = fields.Date(string="数据有效期")
data_selection = fields.Selection([('mqtt', 'mqtt'), ('api', 'api')], default="mqtt", string="数据类型")
def action_attendance_iot_manager(self):
return {
"type": "ir.actions.act_window",
"name": "批量导入考勤机",
"res_model": "attendance.iot.manager.wizard",
"view_mode": "form",
"target": "new",
}
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if vals['data_selection'] == 'mqtt':
self.mqtt_request(self, vals['attendance_number'], 'addUser')
return super().create(vals_list)
def mqtt_request(self, attendance_number, data):
reuqired_params = self.get_required_params(data)
if any(reuqired_param not in data.keys() for reuqired_param in reuqired_params):
raise UserError(f'缺少必填参数,请确认: {",".join(reuqired_params)}')
mqtt_config = self.get_mqtt_config()
self.start_mqtt(mqtt_config)
self.publish_message(mqtt_config, f'iot/device/{attendance_number}', data)
def get_required_params(self, cmd):
params_dict = {
'addUser': ['cmd', 'user_id', 'name', 'id_valid'],
'editUser': ['cmd', 'user_id', 'edit_mode'],
'delUser': ['cmd'],
'delMultiUser': ['cmd', 'user_ids'],
'setPasswordVerify': ['cmd', 'value'],
'setOpenDoorPassword': ['cmd', 'value'],
}
if cmd not in params_dict.keys():
raise UserError(f'指令不存在,请确认,目前支持: {",".join(params_dict.keys())}')
else:
return params_dict[cmd]
@api.model
def get_mqtt_config(self):
mqtt_config = self.search([], limit=1)
return mqtt_config
@api.model
def start_mqtt(self, mqtt_config):
def on_connect(client, userdata, flags, rc):
if rc == 0:
_logger.info("Connected to MQTT Broker")
else:
_logger.info(f"Failed to connect, return code {rc}", )
def on_message(client, userdata, message):
_logger.info(f"Received message: {str(message.payload.decode('utf-8'))}", )
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1, "OdooMQTT")
client.on_connect = on_connect
client.on_message = on_message
client.connect(mqtt_config.broker, mqtt_config.port, 60)
client.loop_start()
@api.model
def publish_message(self, mqtt_config, topic, message):
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1, "OdooMQTT")
client.connect(mqtt_config.broker, mqtt_config.port, 60)
res = client.publish(topic, message)
if res.get('code') == 0:
_logger.info("操作成功")
else:
_logger.info(f"操作失败,返回错误码: {res.get('code')}")
client.disconnect()