change -根据查库刷卡员工的最近一次打卡类型,判断有漏打卡情况并提示

main
frankiecao 1 year ago
commit 6adbaeab30

@ -19,6 +19,7 @@ namespace SlnMesnac.Business.business
{
private IRecordStaffAttendanceService _recordStaffAttendanceService;
private IRecordStaffCommuteService _recordStaffCommuteService;
private string currentTime;
public RfidHandleBusniess(IRecordStaffAttendanceService recordStaffAttendanceService, IRecordStaffCommuteService recordStaffCommuteService)
{
@ -69,9 +70,13 @@ namespace SlnMesnac.Business.business
}
else
{
currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//根据id和上班时间不超过九小时的查找对应记录
RecordStaffCommute recordStaffCommute = _recordStaffCommuteService.GetStaffCommuteByIdAndDuration(staff.StaffId, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
RecordStaffCommute recordStaffCommute = _recordStaffCommuteService.GetStaffCommuteByIdAndDuration(staff.StaffId, currentTime);
//更新这个记录的下班打卡时间和在班时长率
recordStaffCommute.EndWorkTime = currentTime;
recordStaffCommute.ClockingRatio = Convert.ToDecimal((DateTime.Parse(recordStaffCommute.EndWorkTime) - DateTime.Parse(recordStaffCommute.StartWorkTime)).TotalHours);
_recordStaffCommuteService.Update(recordStaffCommute);
}
}
}

@ -50,7 +50,7 @@ namespace SlnMesnac.Model.domain
/// 在班时长率
/// </summary>
[SugarColumn(ColumnName = "clocking_ratio")]
public string ClockingRatio { get; set; }
public decimal ClockingRatio { get; set; }
/// <summary>
/// 备注

@ -14,6 +14,13 @@ namespace SlnMesnac.Repository.service
/// <returns></returns>
List<RecordStaffAttendance> GetRecordStaffAttendances();
/// <summary>
/// 根据员工id查询
/// </summary>
/// <param name="staffId"></param>
/// <returns></returns>
RecordStaffAttendance GetRecordStaffAttendanceByStaffId(string staffId);
/// <summary>
/// 验证添加员工打卡记录
/// </summary>

@ -32,6 +32,18 @@ namespace SlnMesnac.Repository.service.Impl
return records;
}
public RecordStaffAttendance GetRecordStaffAttendanceByStaffId(string staffId)
{
RecordStaffAttendance recordStaffAttendances = _rep.AsQueryable().Where(x => x.StaffId == staffId).OrderByDescending(x => x.CreateTime).First();
if (recordStaffAttendances != null)
{
return recordStaffAttendances;
}
else
{
return null;
}
}
public bool InsertRecordStaffAttendance(List<RecordStaffAttendance> records)
{

@ -25,11 +25,7 @@ namespace SlnMesnac.Repository.service.Impl
public RecordStaffCommute GetStaffCommuteByIdAndDuration(string id, string currentTime)
{
DateTime currentDateTime = DateTime.ParseExact(currentTime, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
RecordStaffCommute recordStaffCommute = _rep.AsQueryable().Where(x => x.StaffId == id)
.Where(x =>
(DateTime.ParseExact(x.StartWorkTime, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture) - currentDateTime).TotalHours > 10)
.First();
RecordStaffCommute recordStaffCommute = _rep.AsQueryable().Where(x => x.StaffId == id).Where(x => Convert.ToDateTime(x.StartWorkTime).AddHours(10) > Convert.ToDateTime(currentTime)).First();
return recordStaffCommute;
}
}

@ -83,6 +83,7 @@
<ColumnDefinition Width="5*"/>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="5*"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0">
<TextBlock Text="人员工号" FontSize="20" FontWeight="Bold" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,0,20,0"/>
@ -102,6 +103,9 @@
</Border.Effect>
<TextBlock Text="{Binding CheckStatus}" FontSize="20" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
<Border Grid.Column="4">
<TextBlock Text="{Binding StatusText}" FontSize="25" Foreground="Red" FontWeight="Bold" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
</Grid>
</Border>
<Border Grid.Row="1">

@ -39,6 +39,7 @@ namespace SlnMesnac.WPF.ViewModel
private string _checkOutButtonColor = "#009999";
private int isCheckOn = 0;
private bool isUse = false;
private int status = 0;//0是上班1是下班
public static HidUtils hidUtils;
private List<string> uniqueStrings = new List<string>();
private List<DateTime> timestamps = new List<DateTime>();
@ -88,8 +89,9 @@ namespace SlnMesnac.WPF.ViewModel
hidUtils.pushReceiveDataEvent += (bytes, str) =>
{
string cleanStr = str.ToString().Replace(" ", "");
StatusText = StaffIdText = CheckStatus = null;
if (!IsDuplicate(cleanStr))//过滤重复str
{
{
uniqueStrings.Add(cleanStr);
timestamps.Add(DateTime.Now);
// Additional logic for processing the unique string goes here
@ -98,6 +100,21 @@ namespace SlnMesnac.WPF.ViewModel
BaseStaffInfo user = baseStaffService.GetStaffInfoByCardId(cleanStr);
if (user != null)
{
string attendanceType = _recordStaffAttendanceService.GetRecordStaffAttendanceByStaffId(user.StaffId)?.AttendanceType;
if (attendanceType == "1") //下班卡
{
if (attendanceType == status.ToString())
{
StatusText = "未打上班卡,请联系管理员!";
}
}
else if (attendanceType == "0")
{
if (attendanceType == status.ToString())
{
StatusText = "未打下班卡,请联系管理员!";
}
}
StaffIdText = user.StaffId;
CheckStatus = user.StaffName + " " + user.TeamCode + " 打卡成功!";
var list = _rfidHandleBusniess.HandleAndInsertStaffAttendance(user,isCheckOn);
@ -107,7 +124,6 @@ namespace SlnMesnac.WPF.ViewModel
list.ForEach(item => { RecordStaffAttendanceDataGrid.Add(item); });
}));
_rfidHandleBusniess.HandleStaffCommute(user, isCheckOn);
}
else
{
@ -227,6 +243,17 @@ namespace SlnMesnac.WPF.ViewModel
set { checkStatus = value; OnPropertyChanged("CheckStatus"); }
}
//Status
/// <summary>
/// 状态
/// </summary>
private string statusText;
public string StatusText
{
get { return statusText; }
set { statusText = value; OnPropertyChanged("StatusText"); }
}
private ObservableCollection<RecordStaffAttendance> item = new ObservableCollection<RecordStaffAttendance>();
/// <summary>
@ -251,6 +278,7 @@ namespace SlnMesnac.WPF.ViewModel
{
// 执行上班打卡逻辑
isCheckOn = 0;
status = 0;
isUse = true;
CheckInButtonText = "结束打卡";
IsCheckOutButtonEnabled = "False"; // Disable CheckOutButton
@ -279,6 +307,7 @@ namespace SlnMesnac.WPF.ViewModel
// 执行下班打卡逻辑
isCheckOn = 1;
isUse = true;
status = 1;
CheckOutButtonText = "结束打卡";
IsCheckInButtonEnabled = "False"; // Disable CheckInButton
CheckInButtonColor = "Gray";
@ -315,7 +344,7 @@ namespace SlnMesnac.WPF.ViewModel
{
for (int i = 0; i < uniqueStrings.Count; i++)
{
if (uniqueStrings[i] == str && (DateTime.Now - timestamps[i]).TotalMinutes < 30)
if (uniqueStrings[i] == str && (DateTime.Now - timestamps[i]).TotalMinutes < 1)
{
return true;
}

Loading…
Cancel
Save