91 lines
3.5 KiB
Python
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()
|
|
|