基于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
相关产品推荐
相关产品推荐

