You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:42:02