考勤机

This commit is contained in:
李鹏宇
2026-09-07 19:00:05 +08:00
parent be0a7b6522
commit 7c9f98a35b
@@ -13,61 +13,42 @@ class AttendanceIotImportUserWizard(models.TransientModel):
def default_get(self, fields_list):
# 先调用父类获取各字段的默认值字典
res = super(AttendanceIotImportUserWizard, self).default_get(fields_list)
# 源考勤机(默认空记录集)
source_iot = self.env['attendance.iot']
# 入口一:从员工表单按钮进入,context 直接给了源考勤机 id
if self.env.context.get('default_source_attendance_iot_id'):
# 按 id 取出源考勤机
source_iot = self.env['attendance.iot'].browse(
self.env.context.get('default_source_attendance_iot_id'))
else:
# 入口二:从考勤机用户列表勾选进入,取勾选第一条记录所属的源考勤机
active_ids = self.env.context.get('active_ids')
records = self.env['attendance.iot.user'].browse(active_ids)
# 列表里有勾选记录时才取源考勤机
if records:
source_iot = records[0].attendance_iot_id
# 「当前被拷贝考勤机」显示源考勤机
res['current_attendance_iot_id'] = source_iot.id
# 是否默认带出本公司全部考勤机:
# 1)「同步到全部设备」按钮 default_sync_to_all=True
# 2) 考勤机用户列表的「批量拷贝」入口(保持原有默认带出行为)
sync_to_all = self.env.context.get('default_sync_to_all') or (
not self.env.context.get('default_source_attendance_iot_id')
and bool(self.env.context.get('active_ids')))
if sync_to_all:
# 查出源考勤机所属公司的全部考勤机,作为同步目标默认带出(不排除源设备)
company_iots = self.env['attendance.iot'].search(
[('company_id', '=', source_iot.company_id.id)])
res['attendance_iot_ids'] = [(6, 0, company_iots.ids)]
# 从上下文中取出列表页勾选的考勤机用户记录 id 列表
active_ids = self.env.context.get('active_ids')
# 按 id 批量取出被勾选的考勤机用户记录
records = self.env['attendance.iot.user'].browse(active_ids)
# 取第一条记录,作为被拷贝的源考勤机
source_iot = records[0].attendance_iot_id
# 查出源考勤机所属公司的全部考勤机,作为同步目标默认带出(不排除源设备)
company_iots = self.env['attendance.iot'].search(
[('company_id', '=', source_iot.company_id.id)])
res.update({
'current_attendance_iot_id': source_iot.id,
'attendance_iot_ids': [(6, 0, company_iots.ids)],
})
return res
def action_import(self):
# 确定要拷贝的考勤机用户记录:
# 入口一:从员工表单按钮进入,context 带了员工 id,取该员工的全部考勤机用户记录
employee_id = self.env.context.get('default_source_employee_id')
if employee_id:
records = self.env['attendance.iot.user'].search(
[('employee_id', '=', employee_id)])
else:
# 入口二:从考勤机用户列表勾选进入,取勾选的记录
records = self.env['attendance.iot.user'].browse(
self.env.context.get('active_ids'))
# 按员工去重,避免同一员工重复创建记录
employees = records.mapped('employee_id')
# 获取用户, employee_id
# 根据 attendance_iot_user.employ_id 批量给每个考勤机创建信息
# 完成
ids = self.env.context.get('active_ids')
records = self.env['attendance.iot.user'].browse(ids)
values = []
for attendance_iot_id in self.attendance_iot_ids:
for employee in employees:
for record in records:
# 去重,已经有的记录不再更新,
iot_user = self.env['attendance.iot.user'].search(
[('attendance_iot_id','=', attendance_iot_id.id), ('employee_id', '=', employee.id)])
[('attendance_iot_id','=', attendance_iot_id.id), ('employee_id', '=', record.employee_id.id)])
if iot_user:
if not self.is_force_update:
continue
iot_user.with_context(iot_sync=True).unlink()
values.append({
'attendance_iot_id': attendance_iot_id.id,
'employee_id': employee.id
'employee_id': record.employee_id.id
})
self.env['attendance.iot.user'].sudo().create(values)