145 lines
6.5 KiB
Python
145 lines
6.5 KiB
Python
import base64
|
|
import urllib.parse
|
|
from odoo.http import Controller, request, route
|
|
from datetime import datetime, timedelta
|
|
from odoo import models, fields, api, http, SUPERUSER_ID, _
|
|
import logging
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
def remove_base64_prefix(base64_str: str) -> str:
|
|
separator_index = base64_str.find(',')
|
|
if separator_index != -1:
|
|
return base64_str[separator_index + 1:]
|
|
return base64_str
|
|
|
|
|
|
class BusController(Controller):
|
|
|
|
@route('/api/v1/addFace', methods=['POST'], type='json', auth='none', csrf=False)
|
|
def get_model_kaoqin(self):
|
|
"""
|
|
获取用户录入考勤机数据,和系统内用户绑定关联
|
|
:return:
|
|
"""
|
|
_logger.info("----------------/api/v1/addFace---------接口收到响应-------------------------------")
|
|
data = request.httprequest.json
|
|
user_name = data.get('name')
|
|
name = data.get('sn')
|
|
attendance_iot_id = request.env(user=SUPERUSER_ID)["attendance.iot"].search([('name', '=', name)])
|
|
if not attendance_iot_id:
|
|
request.env(user=SUPERUSER_ID)["attendance.iot"].create({'name': name, })
|
|
employee = request.env(user=SUPERUSER_ID)["hr.employee"].search([('name', '=', user_name)])
|
|
# 判断员工是否绑定多台设备
|
|
if employee and attendance_iot_id not in employee.attendance_iot_ids.mapped('attendance_iot_id'):
|
|
employee.write({
|
|
'image_1920': data.get('photo'),
|
|
'attendance_iot_ids': [(0, 0, {
|
|
'employee_id': employee.id,
|
|
'attendance_address': '',
|
|
'attendance_iot_id': attendance_iot_id.id
|
|
})]
|
|
})
|
|
_logger.info("-------------------------%s创建成功-------------------------------" % (employee.name))
|
|
return {"Result": 0, "Msg": "添加成功"}
|
|
|
|
@route('/api/v1/record/face', methods=['POST'], type='json', auth='none', csrf=False)
|
|
def get_model_identify(self):
|
|
"""
|
|
获取上传识别成功记录
|
|
:return:
|
|
"""
|
|
_logger.info("----------------/api/v1/record/face---------接口收到响应-------------------------------")
|
|
data = request.httprequest.json
|
|
user_id = data.get('logs')[0].get('user_id')
|
|
employee_id = request.env(user=SUPERUSER_ID)["hr.employee"].search([('mobile_phone', '=', user_id)])
|
|
attendance_iot_id = request.env(user=SUPERUSER_ID)["attendance.iot"].search([('name', '=', data.get('sn'))])
|
|
if employee_id:
|
|
request.env(user=SUPERUSER_ID)["hr.attendance.detail"].create({
|
|
'employee_id': employee_id.id, # 员工
|
|
'checkin_time': fields.Datetime.now() - timedelta(hours=8), # 打卡时间
|
|
'source': 'iot', # 打卡来源
|
|
'attendance_iot_id': attendance_iot_id.id, # 打卡设备
|
|
})
|
|
|
|
# _logger.info(f"考勤机自定义编码{user_id}: {employee_id.name}打卡--{fields.Datetime.now()}")
|
|
return {"Result": 0, "Msg": "添加成功"}
|
|
|
|
@route('/api/v1/user/inf_photo', methods=['POST'], type='json', auth='none', csrf=False)
|
|
def inf_photo(self):
|
|
"""
|
|
更新用户信息
|
|
:return:
|
|
"""
|
|
_logger.info("----------------/api/v1/user/inf_photo---------接口收到响应-------------------------------")
|
|
data = request.httprequest.json
|
|
user_data = data['content'][0]
|
|
user_id = user_data.get('user_id')
|
|
vl_photo = user_data.get('vl_photo')
|
|
sn = data.get('sn') # 设备号
|
|
# 查找员工
|
|
employee = request.env(user=SUPERUSER_ID)['hr.employee'].search([('mobile_phone', '=', user_id)], limit=1)
|
|
iot_device = request.env(user=SUPERUSER_ID)['attendance.iot'].search([('name', '=', sn)], limit=1)
|
|
if not iot_device:
|
|
request.env(user=SUPERUSER_ID)["attendance.iot"].create({'name': sn})
|
|
iot_users = request.env(user=SUPERUSER_ID)['attendance.iot.user'].search(
|
|
[('employee_id', '=', employee.id), ('attendance_iot_id', '=', iot_device.id)])
|
|
# 转码,去前缀,更新
|
|
vl_photo = urllib.parse.unquote(vl_photo)
|
|
vl_photo = remove_base64_prefix(vl_photo)
|
|
employee.write({'avatar_image': vl_photo})
|
|
if not iot_users:
|
|
request.env(user=SUPERUSER_ID)['attendance.iot.user'].create({
|
|
'employee_id': employee.id,
|
|
'attendance_iot_id': iot_device.id,
|
|
})
|
|
return {"Result": 0, "Msg": "添加成功"}
|
|
|
|
@route('/api/v1/uploadFaceInfo', methods=['POST'], type='json', auth='none', csrf=False)
|
|
def upload_face_info(self):
|
|
"""
|
|
同步数据更新
|
|
:return:
|
|
"""
|
|
_logger.info("----------------/api/v1/uploadFaceInfo---------接口收到响应-------------------------------")
|
|
data = request.httprequest.json
|
|
_logger.info(f'/api/v1/uploadFaceInfo: 结果:{data}')
|
|
sn = data.get('sn')
|
|
|
|
user_list = data.get('data')
|
|
# 遍历 user_list
|
|
# 查找员工,判重后,写入
|
|
model_employee = request.env['hr.employee'].sudo()
|
|
model_iot = request.env['attendance.iot'].sudo()
|
|
model_iot_user = request.env['attendance.iot.user'].sudo()
|
|
|
|
iot_device = model_iot.search([('name', '=', sn)], limit=1)
|
|
if not iot_device:
|
|
iot_device = model_iot.create({'name': sn})
|
|
_logger.info(f'设备:{iot_device.id}')
|
|
for u in user_list:
|
|
_logger.info(f'用户数据:{u}')
|
|
employee = model_employee.search([('mobile_phone', '=', u.get('user_id'))])
|
|
iot_users = model_iot_user.search(
|
|
[('employee_id', '=', employee.id), ('attendance_iot_id', '=', iot_device.id)])
|
|
_logger.info(f'用户:{employee.id}')
|
|
_logger.info(f'iot_users:{iot_users.id}')
|
|
if not iot_users:
|
|
# 创建用户记录 iot_sync = True , 不要再同步回设备
|
|
model_iot_user.create({
|
|
'employee_id': employee.id,
|
|
'attendance_iot_id': iot_device.id
|
|
})
|
|
# 更新头像1
|
|
# 更新
|
|
photo = u.get('photo')
|
|
_logger.info(f'同步的用户头像数据:')
|
|
_logger.info(photo)
|
|
if photo:
|
|
photo = urllib.parse.unquote(photo)
|
|
photo = remove_base64_prefix(photo)
|
|
employee.with_context(iot_sync=True).write({'avatar_image': photo})
|
|
|
|
return {"Result": 0, "Msg": "更新成功"}
|