Odoo13 HR考勤模块获取员工每日首次签入及末次签出实现问题
Odoo 13 按日期获取员工首签入/末次签出实现方案
代码逻辑修正
你原有代码的问题是在搜索考勤记录时限定了check_in >= 当日零点,所以只能匹配当日数据,去掉时间范围限制,再按「员工+考勤日期」分组取极值即可适配所有历史记录。
修正后的首签入计算代码如下,末次签出可以套用相同逻辑修改:
@api.depends('check_in') def get_first_check_in_time(self): for emp in self: # 查询该员工所有考勤记录 all_attn = self.env['hr.attendance'].search([('employee_id', '=', emp.id)]) # 按签到日期分组 date_attn_map = {} for attn in all_attn: # 提取签到时间的日期部分作为分组键 attn_date = attn.check_in.date() if attn_date not in date_attn_map: date_attn_map[attn_date] = [] date_attn_map[attn_date].append(attn.check_in) # 每个日期分组取最小时间即为当日首签 # 这里可根据你的字段设计调整赋值逻辑,如果是要存储所有历史日期的首签,建议单独建每日考勤汇总表 emp.first_sign_in = min(date_attn_map[fields.Date.today()]) if fields.Date.today() in date_attn_map else False
轻量实现方案(无需大量代码)
如果你的核心需求是新增一个仅展示每人每日首签/末次签的视图,更简单的方式是直接用Odoo原生的分组聚合功能:
- 复制原有考勤视图,在视图定义中设置双层分组规则:先按
employee_id(员工)分组,再按check_in:day(签到日期)分组 - 给
check_in字段设置聚合属性为min,check_out字段设置聚合属性为max,系统会自动计算每个员工每天的最早签到、最晚签出时间,不需要额外开发计算字段。
性能优化建议
如果企业员工数量多、考勤数据量大,建议新增hr.attendance.daily(每日考勤汇总)模型,写定时任务每天凌晨统计前一天的所有员工考勤数据写入该模型,新增视图直接关联这个汇总模型即可,比每次实时计算效率更高。如果有跨天夜班的场景,可以根据业务规则调整分组的日期判定逻辑,比如按排班日期、签出日期分组即可。
内容的提问来源于stack exchange,提问作者SH EB
相关产品推荐
相关产品推荐

