From 7c9f98a35b80ad71bad39a8149d36e413a938fa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Mon, 7 Sep 2026 19:00:05 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E5=8B=A4=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../attendance_iot_import_user_wizard.py | 65 +++++++------------ 1 file changed, 23 insertions(+), 42 deletions(-) diff --git a/attendance_iot/wizard/attendance_iot_import_user_wizard.py b/attendance_iot/wizard/attendance_iot_import_user_wizard.py index c6b107efe..241a4669c 100644 --- a/attendance_iot/wizard/attendance_iot_import_user_wizard.py +++ b/attendance_iot/wizard/attendance_iot_import_user_wizard.py @@ -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)