# -*- 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()