diff --git a/SlnMesnac.Business/business/RfidHandleBusniess.cs b/SlnMesnac.Business/business/RfidHandleBusniess.cs index a99600e..d8d5ae1 100644 --- a/SlnMesnac.Business/business/RfidHandleBusniess.cs +++ b/SlnMesnac.Business/business/RfidHandleBusniess.cs @@ -20,6 +20,9 @@ namespace SlnMesnac.Business.business private IRecordStaffAttendanceService _recordStaffAttendanceService; private IRecordStaffCommuteService _recordStaffCommuteService; private string currentTime; + private string teamMembers = null; + private List members = new List(); + public RfidHandleBusniess(IRecordStaffAttendanceService recordStaffAttendanceService, IRecordStaffCommuteService recordStaffCommuteService) { @@ -79,5 +82,24 @@ namespace SlnMesnac.Business.business _recordStaffCommuteService.Update(recordStaffCommute); } } + + public string SpliceTeamMember(BaseStaffInfo baseStaffInfo) + { + RecordStaffAttendance recordStaffAttendance = _recordStaffAttendanceService.GetRecordStaffAttendanceByStaffId(baseStaffInfo.StaffId); + string type = recordStaffAttendance.AttendanceType; + if (type == "0")//上班,添加员工名字转成字符串 + { + members.Add(baseStaffInfo.StaffName); // Add the staff member's name to the list + teamMembers = string.Join("| ", members); // Convert the list of names to a string separated by commas + } + else if (type == "1")//下班,删除下班员工的名字再转为字符串 + { + members.Remove(baseStaffInfo.StaffName); // Remove the staff member's name from the list + teamMembers = string.Join("| ", members); // Convert the updated list of names to a string separated by commas + } + + return teamMembers; + } + } } diff --git a/SlnMesnac.Model/domain/RecordStaffAttendance.cs b/SlnMesnac.Model/domain/RecordStaffAttendance.cs index c56cbad..36b8841 100644 --- a/SlnMesnac.Model/domain/RecordStaffAttendance.cs +++ b/SlnMesnac.Model/domain/RecordStaffAttendance.cs @@ -10,6 +10,7 @@ namespace SlnMesnac.Model.domain [DataContract(Name = "RecordStaffAttendance 记录员工打卡")] public class RecordStaffAttendance { + //public BaseStaffInfo baseStaffInfo { get; set; } /// /// /// diff --git a/SlnMesnac.Repository/service/IBaseStaffService.cs b/SlnMesnac.Repository/service/IBaseStaffService.cs index 4568de8..0a6b049 100644 --- a/SlnMesnac.Repository/service/IBaseStaffService.cs +++ b/SlnMesnac.Repository/service/IBaseStaffService.cs @@ -21,5 +21,12 @@ namespace SlnMesnac.Repository.service /// /// BaseStaffInfo GetStaffInfoByCardId(string cardId); + + /// + /// 找出班组的班长 + /// + /// + /// + BaseStaffInfo GetMonitorByTeamCode(string teamCode); } } diff --git a/SlnMesnac.Repository/service/Impl/BaseStaffServiceImpl.cs b/SlnMesnac.Repository/service/Impl/BaseStaffServiceImpl.cs index 46db4d0..d49c425 100644 --- a/SlnMesnac.Repository/service/Impl/BaseStaffServiceImpl.cs +++ b/SlnMesnac.Repository/service/Impl/BaseStaffServiceImpl.cs @@ -15,6 +15,20 @@ namespace SlnMesnac.Repository.service.Impl _logger = logger; } + public BaseStaffInfo GetMonitorByTeamCode(string teamCode) + { + BaseStaffInfo staffInfo = null; + try + { + staffInfo = base._rep.AsQueryable().Where(x => x.TeamCode == teamCode).Where(x => x.StaffType == "1").First(); + } + catch (Exception ex) + { + _logger.LogError($"查找班组的班长信息异常:{ex.Message}"); + } + return staffInfo; + } + /// /// 通过卡号获取员工信息 /// @@ -51,5 +65,7 @@ namespace SlnMesnac.Repository.service.Impl } return staffInfos; } + + } } diff --git a/SlnMesnac.Repository/service/Impl/RecordStaffAttendanceServiceImpl.cs b/SlnMesnac.Repository/service/Impl/RecordStaffAttendanceServiceImpl.cs index 5481414..b5924bd 100644 --- a/SlnMesnac.Repository/service/Impl/RecordStaffAttendanceServiceImpl.cs +++ b/SlnMesnac.Repository/service/Impl/RecordStaffAttendanceServiceImpl.cs @@ -64,7 +64,8 @@ namespace SlnMesnac.Repository.service.Impl public RecordStaffAttendance GetLastestOnRecord() { - RecordStaffAttendance recordStaffAttendances = _rep.AsQueryable().Where(x => x.AttendanceType == "0").OrderByDescending(x => x.CreateTime).First(); + RecordStaffAttendance recordStaffAttendances = _rep.AsQueryable().Where(x => x.AttendanceType == "0") + .OrderByDescending(x => x.CreateTime).First(); return recordStaffAttendances; } diff --git a/SlnMesnac.WPF/UserControls/ExecutePage.xaml b/SlnMesnac.WPF/UserControls/ExecutePage.xaml index 4646b23..c24b9c5 100644 --- a/SlnMesnac.WPF/UserControls/ExecutePage.xaml +++ b/SlnMesnac.WPF/UserControls/ExecutePage.xaml @@ -82,7 +82,14 @@ - + + + + + + + + diff --git a/SlnMesnac.WPF/ViewModel/EmployeeLoginViewModel.cs b/SlnMesnac.WPF/ViewModel/EmployeeLoginViewModel.cs index b6d3c60..f5d3d8d 100644 --- a/SlnMesnac.WPF/ViewModel/EmployeeLoginViewModel.cs +++ b/SlnMesnac.WPF/ViewModel/EmployeeLoginViewModel.cs @@ -41,6 +41,7 @@ namespace SlnMesnac.WPF.ViewModel private bool isUse = false; private int status = 0;//0是上班,1是下班 public static HidUtils hidUtils; + public static bool isOnDuty = false; private List uniqueStrings = new List(); private List timestamps = new List(); @@ -62,6 +63,13 @@ namespace SlnMesnac.WPF.ViewModel /// 结束命令 /// public ICommand OverCommand { get; private set; } + + /// + /// + /// + /// + public delegate void TransmitUser(BaseStaffInfo staffInfo); + public static event TransmitUser TransmitUserDelegateEvent; #endregion public EmployeeLoginViewModel() @@ -91,7 +99,7 @@ namespace SlnMesnac.WPF.ViewModel 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 @@ -101,39 +109,27 @@ namespace SlnMesnac.WPF.ViewModel if (user != null) { RecordStaffAttendance recordStaffAttendance = _recordStaffAttendanceService.GetRecordStaffAttendanceByStaffId(user.StaffId); - var createTime = recordStaffAttendance.CreateTime; - var nowTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - TimeSpan timeDiff = DateTime.Parse(nowTime) - DateTime.Parse(createTime); - if(timeDiff.TotalHours >= 10)// + if (recordStaffAttendance != null) { - if (recordStaffAttendance.AttendanceType == "1") //下班卡 + var createTime = recordStaffAttendance.CreateTime; + var nowTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + TimeSpan timeDiff = DateTime.Parse(nowTime) - DateTime.Parse(createTime); + if (timeDiff.TotalHours >= 10)// { - if (recordStaffAttendance.AttendanceType == status.ToString()) + if (recordStaffAttendance.AttendanceType == "1") //下班卡 { - StatusText = "未打上班卡,请联系管理员!"; + if (recordStaffAttendance.AttendanceType == status.ToString()) + { + StatusText = "未打上班卡,请联系管理员!"; + } } - } - else if (recordStaffAttendance.AttendanceType == "0") - { - if (recordStaffAttendance.AttendanceType == status.ToString()) + else if (recordStaffAttendance.AttendanceType == "0") { - StatusText = "未打下班卡,请联系管理员!"; + if (recordStaffAttendance.AttendanceType == status.ToString()) + { + StatusText = "未打下班卡,请联系管理员!"; + } } - } - StaffIdText = user.StaffId; - CheckStatus = user.StaffName + " " + user.TeamCode + " 打卡成功!"; - var list = _rfidHandleBusniess.HandleAndInsertStaffAttendance(user, isCheckOn); - System.Windows.Application.Current.Dispatcher.Invoke((Action)(async () => - { - RecordStaffAttendanceDataGrid.Clear(); - list.ForEach(item => { RecordStaffAttendanceDataGrid.Add(item); }); - })); - _rfidHandleBusniess.HandleStaffCommute(user, isCheckOn); - } - else - { - if (recordStaffAttendance.AttendanceType != status.ToString()) - { StaffIdText = user.StaffId; CheckStatus = user.StaffName + " " + user.TeamCode + " 打卡成功!"; var list = _rfidHandleBusniess.HandleAndInsertStaffAttendance(user, isCheckOn); @@ -146,16 +142,43 @@ namespace SlnMesnac.WPF.ViewModel } else { - StatusText = "请勿重复打卡!"; - } + if (recordStaffAttendance.AttendanceType != status.ToString()) + { + StaffIdText = user.StaffId; + CheckStatus = user.StaffName + " " + user.TeamCode + " 打卡成功!"; + var list = _rfidHandleBusniess.HandleAndInsertStaffAttendance(user, isCheckOn); + System.Windows.Application.Current.Dispatcher.Invoke((Action)(async () => + { + RecordStaffAttendanceDataGrid.Clear(); + list.ForEach(item => { RecordStaffAttendanceDataGrid.Add(item); }); + })); + _rfidHandleBusniess.HandleStaffCommute(user, isCheckOn); + } + else + { + StatusText = "请勿重复打卡!"; + } + } + } + else + { + StaffIdText = user.StaffId; + CheckStatus = "打卡成功!"; + var list = _rfidHandleBusniess.HandleAndInsertStaffAttendance(user, isCheckOn); + System.Windows.Application.Current.Dispatcher.Invoke((Action)(async () => + { + RecordStaffAttendanceDataGrid.Clear(); + list.ForEach(item => { RecordStaffAttendanceDataGrid.Add(item); }); + })); + _rfidHandleBusniess.HandleStaffCommute(user, isCheckOn); } - } else { StaffIdText = "未配置"; CheckStatus = "没有匹配的员工,打卡失败!"; } + TransmitUserDelegateEvent?.Invoke(user); } } else @@ -300,6 +323,7 @@ namespace SlnMesnac.WPF.ViewModel /// private void CheckIn() { + isOnDuty = true; if (CheckInButtonText == "上班打卡") { // 执行上班打卡逻辑 @@ -328,6 +352,7 @@ namespace SlnMesnac.WPF.ViewModel /// private void CheckOut() { + isOnDuty = false; if (CheckOutButtonText == "下班打卡") { // 执行下班打卡逻辑 diff --git a/SlnMesnac.WPF/ViewModel/ExecuteViewModel.cs b/SlnMesnac.WPF/ViewModel/ExecuteViewModel.cs index 8768944..c7b9e2b 100644 --- a/SlnMesnac.WPF/ViewModel/ExecuteViewModel.cs +++ b/SlnMesnac.WPF/ViewModel/ExecuteViewModel.cs @@ -31,10 +31,12 @@ namespace SlnMesnac.WPF.ViewModel public ObservableCollection OrderCodeComboBoxItems { get; set; } public ObservableCollection PlanCodeComboBoxItems { get; set; } public ObservableCollection MaterialNameComboBoxItems { get; set; } + private RfidHandleBusniess _RfidHandleBusniess; private ProdPlanInfoService _prodPlanInfoService; private List prodPlanInfos; private ProdPlanDetailService _prodPlanDetailService; private IRecordStaffAttendanceService _recordStaffAttendanceService; + private IBaseStaffService _baseStaffService; private string StationCode; public static bool isComplete = true; private ProdPLanInfo pLanInfo; @@ -64,7 +66,7 @@ namespace SlnMesnac.WPF.ViewModel /// public ICommand ExecuteCommand { get; private set; } - #region + #region 委托 public delegate void RefreshDelegate(ProdPLanInfo pLanInfo); public static event RefreshDelegate? RefreshEvent; #endregion @@ -74,6 +76,8 @@ namespace SlnMesnac.WPF.ViewModel _prodPlanInfoService = App.ServiceProvider.GetService(); _prodPlanDetailService = App.ServiceProvider.GetService(); _recordStaffAttendanceService = App.ServiceProvider.GetService(); + _RfidHandleBusniess = App.ServiceProvider.GetService(); + _baseStaffService = App.ServiceProvider.GetService(); IConfigurationBuilder configurationBuilder = new ConfigurationBuilder() .SetBasePath(System.AppContext.BaseDirectory) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); @@ -88,6 +92,7 @@ namespace SlnMesnac.WPF.ViewModel SearchCommand = new RelayCommand(Search); ExecuteCommand = new RelayCommand(Execute); ProductionReportViewModel.RefreshDelegateEvent += Refresh; + EmployeeLoginViewModel.TransmitUserDelegateEvent += ShowTeamMember; } /// @@ -130,37 +135,43 @@ namespace SlnMesnac.WPF.ViewModel } // 新增的执行事件 + private void Execute() { - if (isComplete) + //判断是否有班组当班,查询打卡记录表,4小时内最后一次打卡类型为上班的班组 + if(EmployeeLoginViewModel.isOnDuty == true) { - // 将当前记录存为实体,可以通过parameter获取当前记录的信息 - string orderCode = _selectedRow.OrderCode.ToString(); - string planCode = _selectedRow.PlanCode.ToString(); - pLanInfo = _prodPlanInfoService.GetRecordStaffAttendancesByConditions(orderCode, planCode, "", "", "0").First(); - RecordStaffAttendance currentRecord = _recordStaffAttendanceService.GetLastestOnRecord(); - RecordStaffAttendance nextRecord = _recordStaffAttendanceService.GetLastestOffRecord(); - // 向detail表里插入一条数据 - ProdPlanDetail prodPlanDetail = new ProdPlanDetail + if (isComplete)//判断是否完成,未完成不能执行其他工单 { - PlanCode = pLanInfo.PlanCode, - MaterialCode = pLanInfo.MaterialCode, - PlanAmount = pLanInfo.PlanAmount, - CompleteAmount = pLanInfo.CompleteAmount, - BeginTime = DateTime.Now.ToString(), - CurrentStaffId = currentRecord.StaffId, - //NextStaffId = nextRecord.StaffId, - }; - _prodPlanDetailService.Insert(prodPlanDetail); - //按钮文字变成执行中并锁定,其他的订单执行按钮也禁用 - pLanInfo.BeginTime = DateTime.Now.ToString(); - pLanInfo.PlanStatus = "1"; - _prodPlanInfoService.Update(pLanInfo); - Search(); - //查明细表显示出来 - Refresh(pLanInfo); - isComplete = false; - } + // 将当前记录存为实体,可以通过parameter获取当前记录的信息 + string orderCode = _selectedRow.OrderCode.ToString(); + string planCode = _selectedRow.PlanCode.ToString(); + pLanInfo = _prodPlanInfoService.GetRecordStaffAttendancesByConditions(orderCode, planCode, "", "", "0").First(); + RecordStaffAttendance currentRecord = _recordStaffAttendanceService.GetLastestOnRecord(); + BaseStaffInfo staffInfo = _baseStaffService.GetMonitorByTeamCode(currentRecord.TeamCode); + RecordStaffAttendance nextRecord = _recordStaffAttendanceService.GetLastestOffRecord(); + // 向detail表里插入一条数据 + ProdPlanDetail prodPlanDetail = new ProdPlanDetail + { + PlanCode = pLanInfo.PlanCode, + MaterialCode = pLanInfo.MaterialCode, + PlanAmount = pLanInfo.PlanAmount, + CompleteAmount = pLanInfo.CompleteAmount, + BeginTime = DateTime.Now.ToString(), + CurrentStaffId = staffInfo.StaffId + //NextStaffId = nextRecord.StaffId, + }; + _prodPlanDetailService.Insert(prodPlanDetail); + //按钮文字变成执行中并锁定,其他的订单执行按钮也禁用 + pLanInfo.BeginTime = DateTime.Now.ToString(); + pLanInfo.PlanStatus = "1"; + _prodPlanInfoService.Update(pLanInfo); + Search(); + //查明细表显示出来 + Refresh(pLanInfo); + isComplete = false; + } + } } //刷新明细 @@ -180,8 +191,30 @@ namespace SlnMesnac.WPF.ViewModel })); } } - + + /// + /// 显示班组成员 + /// + /// + private void ShowTeamMember(BaseStaffInfo baseStaffInfo) + { + if(baseStaffInfo != null) + { + TeamMember = _RfidHandleBusniess.SpliceTeamMember(baseStaffInfo); + } + } + #region + /// + /// 班组成员 + /// + private string teamMember; + public string TeamMember + { + get { return teamMember; } + set { teamMember = value; OnPropertyChanged("TeamMember"); } + } + /// /// 订单 /// diff --git a/SlnMesnac.WPF/ViewModel/ProductionReportViewModel.cs b/SlnMesnac.WPF/ViewModel/ProductionReportViewModel.cs index f206e91..421061b 100644 --- a/SlnMesnac.WPF/ViewModel/ProductionReportViewModel.cs +++ b/SlnMesnac.WPF/ViewModel/ProductionReportViewModel.cs @@ -113,43 +113,46 @@ namespace SlnMesnac.WPF.ViewModel /// private void Confirm() { - string newAmount = NewAmountText; - if (newAmount != null) + if(EmployeeLoginViewModel.isOnDuty == true) { - bool isNum = true; - foreach (char x in newAmount) + string newAmount = NewAmountText; + if (newAmount != null) { - if (!char.IsNumber(x) && x != '.') + bool isNum = true; + foreach (char x in newAmount) { - isNum = false; + if (!char.IsNumber(x) && x != '.') + { + isNum = false; + } + } + if (isNum) + { + //将新增产量加到实际产量中 + double currentAmountDouble = Convert.ToDouble(planDetail.CompleteAmount); + double newAmountDouble = Convert.ToDouble(newAmount); + double result = currentAmountDouble + newAmountDouble; + planDetail.CompleteAmount = result.ToString(); + planInfo.CompleteAmount = result.ToString(); + _prodPlanDetailService.Update(planDetail); + _prodPlanInfoService.Update(planInfo); + Refresh(); + NewAmountText = null; + HintText = "已提交!"; + RefreshDelegateEvent?.Invoke(planInfo); + ExecuteViewModel.isComplete = true; + } + else + { + //提示框提示错误信息 + HintText = "输入有误,请输入阿拉伯数字!"; } - } - if (isNum) - { - //将新增产量加到实际产量中 - double currentAmountDouble = Convert.ToDouble(planDetail.CompleteAmount); - double newAmountDouble = Convert.ToDouble(newAmount); - double result = currentAmountDouble + newAmountDouble; - planDetail.CompleteAmount = result.ToString(); - planInfo.CompleteAmount = result.ToString(); - _prodPlanDetailService.Update(planDetail); - _prodPlanInfoService.Update(planInfo); - Refresh(); - NewAmountText = null; - HintText = "已提交!"; - RefreshDelegateEvent?.Invoke(planInfo); - ExecuteViewModel.isComplete = true; } else { - //提示框提示错误信息 - HintText = "输入有误,请输入阿拉伯数字!"; + HintText = "不能为空!"; } - } - else - { - HintText = "不能为空!"; - } + } } /// @@ -158,27 +161,33 @@ namespace SlnMesnac.WPF.ViewModel public ICommand EndPlanCommand { get; private set; } private void EndPlan() { - planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - _prodPlanDetailService.Update(planDetail); - planInfo.PlanStatus = "2"; - planInfo.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - double planAmountDouble = Convert.ToDouble(planDetail.PlanAmount); - double completeAmountDouble = Convert.ToDouble(planDetail.CompleteAmount); - if(planAmountDouble == completeAmountDouble) + if(EmployeeLoginViewModel.isOnDuty == true) { - planInfo.CompFlag = "0";//正常完成 - } - else if(planAmountDouble > completeAmountDouble) - { - planInfo.CompFlag = "1";//不足目标产量降级处理 - } - else - { - planInfo.CompFlag = "2";//超额完成 - } - _prodPlanInfoService.Update(planInfo); - //关闭窗口 - Application.Current.Windows.OfType().First().Close(); + if (planDetail != null && planInfo != null) + { + planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + _prodPlanDetailService.Update(planDetail); + planInfo.PlanStatus = "2"; + planInfo.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + double planAmountDouble = Convert.ToDouble(planDetail.PlanAmount); + double completeAmountDouble = Convert.ToDouble(planDetail.CompleteAmount); + if (planAmountDouble == completeAmountDouble) + { + planInfo.CompFlag = "0";//正常完成 + } + else if (planAmountDouble > completeAmountDouble) + { + planInfo.CompFlag = "1";//不足目标产量降级处理 + } + else + { + planInfo.CompFlag = "2";//超额完成 + } + _prodPlanInfoService.Update(planInfo); + } + //关闭窗口 + Application.Current.Windows.OfType().First().Close(); + } } public void OnPropertyChanged([CallerMemberName] string propertyName = "")