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

基于SQL Server与工作单元模式的员工出入离岗登记机制设计咨询

人员离岗登记功能实现方案

核心逻辑设计

员工输入ID提交时,优先查询该人员是否存在DepartureTime为空的有效入场记录:

  • 存在:将该条记录的离岗时间更新为当前时间,完成离岗登记
  • 不存在:走原有入场登记逻辑,新增带入场时间的记录

调整后代码实现

你可以直接修改btnSave_Click方法的逻辑,参考代码如下:

private void btnSave_Click(object sender, EventArgs e)
{
    // 先做输入合法性校验,避免解析报错
    if (!int.TryParse(txtIDPersonnel.Text, out int personnelId))
    {
        MessageBox.Show("请输入合法的人员ID");
        return;
    }

    using (UnitOfWork db = new UnitOfWork())
    {
        // 查询当前人员未登记离岗的最新入场记录
        var unDepartedRecord = db.GenericArrivalsAndDepartures
            .GetAll()
            .Where(x => x.IDPersonnel == personnelId && x.DepartureTime == null)
            .OrderByDescending(x => x.ArrivalTime)
            .FirstOrDefault();

        if (unDepartedRecord != null)
        {
            // 存在未离岗记录,更新离岗时间完成登出
            unDepartedRecord.DepartureTime = DateTime.Now;
            db.GenericArrivalsAndDepartures.Update(unDepartedRecord);
        }
        else
        {
            // 不存在未离岗记录,新增入场登记
            ArrivalsAndDepartures save = new ArrivalsAndDepartures();
            save.IDPersonnel = personnelId;
            save.ArrivalTime = DateTime.Now;
            db.GenericArrivalsAndDepartures.Insert(save);
        }
        
        db.Save();
        MessageBox.Show("登记成功");
    }
}

配套参考信息

考勤记录表结构

表结构示意图

注意事项

  • 如果你的仓储层GetAll()方法返回的是IQueryable,上面的查询会直接在SQL Server端执行,性能更好;如果返回的是IEnumerable,数据量较大时建议优化查询条件,给对应字段加索引提升效率
  • 可以根据业务需求添加异常场景处理:比如同一员工存在多条未离岗记录时的提示、跨天离岗的时长拆分逻辑等
  • 可以给IDPersonnel和DepartureTime字段加联合索引,进一步优化查询速度

内容的提问来源于stack exchange,提问作者Mahdi Narimani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:15:05