考勤机人脸

This commit is contained in:
李鹏宇
2026-06-03 11:29:20 +08:00
parent 93c7584dc5
commit cab6aac604
+30 -22
View File
@@ -25,6 +25,26 @@ class AttendanceIotUser(models.Model):
_sql_constraints = [('unique','UNIQUE(attendance_iot_id,employee_id)','一台设备不允许上传相同的员工信息')]
@staticmethod
def _build_face_template(employee):
"""从员工照片字段生成设备用的 face_template
优先 avatar_image,其次 image_1920,压缩后返回 data:image/jpeg;base64, + URL编码
"""
raw = employee.avatar_image or employee.image_1920
if not raw:
return None
try:
# 可能是 JPEG bytes,也可能是 base64 文本
# 尝试 base64 解码来判断
b64decode = base64.b64decode(raw)
# 解码成功 → raw 是 base64 文本
source_b64 = raw.decode('ascii')
except Exception:
# 解码失败 → raw 是 JPEG 二进制,需要编码
source_b64 = base64.b64encode(raw).decode('ascii')
return urllib.parse.quote(
f"data:image/jpeg;base64,{source_b64}", encoding='utf-8')
# def unlink(self):
# if not self._context.get('iot_sync'):
# # 下发删除信息
@@ -61,18 +81,12 @@ class AttendanceIotUser(models.Model):
'id_valid': r.id_valid.strftime('%Y-%m-%d') if r.id_valid else '',
}
# face_template 单独放最后
if emp.compress_image:
raw = emp.compress_image
try:
b64 = raw.decode('ascii')
except UnicodeDecodeError:
b64 = base64.b64encode(raw).decode('ascii')
face_template = urllib.parse.quote(
f"data:image/jpeg;base64,{b64}", encoding='utf-8')
add_value['face_template'] = face_template
_logger.info(f"addUser 携带 face_template,base64长度: {len(b64)}")
face_tpl = self._build_face_template(emp)
if face_tpl:
add_value['face_template'] = face_tpl
_logger.info(f"addUser 携带 face_template")
else:
_logger.warning(f"addUser 未携带 face_template,compress_image 为空")
_logger.warning(f"addUser 未携带 face_template,员工无照片")
self.env['iot.message'].create([{
'name': '增加用户',
'topic': f'iot/device/{r.attendance_iot_id.name}',
@@ -99,18 +113,12 @@ class AttendanceIotUser(models.Model):
'id_valid': record.id_valid.strftime('%Y-%m-%d') if record.id_valid else '',
}
# face_template 单独放最后
if emp.compress_image:
raw = emp.compress_image
try:
b64 = raw.decode('ascii')
except UnicodeDecodeError:
b64 = base64.b64encode(raw).decode('ascii')
face_template = urllib.parse.quote(
f"data:image/jpeg;base64,{b64}", encoding='utf-8')
update_value['face_template'] = face_template
_logger.info(f"editUser 携带 face_template,base64长度: {len(b64)}")
face_tpl = self._build_face_template(emp)
if face_tpl:
update_value['face_template'] = face_tpl
_logger.info(f"editUser 携带 face_template")
else:
_logger.warning(f"editUser 未携带 face_template,compress_image 为空")
_logger.warning(f"editUser 未携带 face_template,员工无照片")
_logger.info(f"action_update_iot_info--{update_value}")
self.env['iot.message'].create([{
'name': '修改用户信息',