change -工单执行页显示在岗员工名称,完善生产报工逻辑防止误报

main
frankiecao 1 year ago
commit 206f15aab0

@ -20,6 +20,9 @@ namespace SlnMesnac.Business.business
private IRecordStaffAttendanceService _recordStaffAttendanceService;
private IRecordStaffCommuteService _recordStaffCommuteService;
private string currentTime;
private string teamMembers = null;
private List<string> members = new List<string>();
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;
}
}
}

@ -10,6 +10,7 @@ namespace SlnMesnac.Model.domain
[DataContract(Name = "RecordStaffAttendance 记录员工打卡")]
public class RecordStaffAttendance
{
//public BaseStaffInfo baseStaffInfo { get; set; }
/// <summary>
///
/// </summary>

@ -21,5 +21,12 @@ namespace SlnMesnac.Repository.service
/// <param name="cardId"></param>
/// <returns></returns>
BaseStaffInfo GetStaffInfoByCardId(string cardId);
/// <summary>
/// 找出班组的班长
/// </summary>
/// <param name="teamCode"></param>
/// <returns></returns>
BaseStaffInfo GetMonitorByTeamCode(string teamCode);
}
}

@ -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;
}
/// <summary>
/// 通过卡号获取员工信息
/// </summary>
@ -51,5 +65,7 @@ namespace SlnMesnac.Repository.service.Impl
}
return staffInfos;
}
}
}

@ -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;
}

@ -82,7 +82,14 @@
<RowDefinition Height="7.5*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0">
<TextBlock Text="工单列表" FontSize="20" FontWeight="Bold" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="9*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="班组成员:" FontSize="15" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Right"/>
<TextBlock Grid.Column="1" Text="{Binding TeamMember}" FontSize="15" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
</Grid>
</Border>
<Border Grid.Row="1" Margin="5">
<Grid>

@ -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<string> uniqueStrings = new List<string>();
private List<DateTime> timestamps = new List<DateTime>();
@ -62,6 +63,13 @@ namespace SlnMesnac.WPF.ViewModel
/// 结束命令
/// </summary>
public ICommand OverCommand { get; private set; }
/// <summary>
///
/// </summary>
/// <param name="staffInfo"></param>
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
/// </summary>
private void CheckIn()
{
isOnDuty = true;
if (CheckInButtonText == "上班打卡")
{
// 执行上班打卡逻辑
@ -328,6 +352,7 @@ namespace SlnMesnac.WPF.ViewModel
/// </summary>
private void CheckOut()
{
isOnDuty = false;
if (CheckOutButtonText == "下班打卡")
{
// 执行下班打卡逻辑

@ -31,10 +31,12 @@ namespace SlnMesnac.WPF.ViewModel
public ObservableCollection<string> OrderCodeComboBoxItems { get; set; }
public ObservableCollection<string> PlanCodeComboBoxItems { get; set; }
public ObservableCollection<string> MaterialNameComboBoxItems { get; set; }
private RfidHandleBusniess _RfidHandleBusniess;
private ProdPlanInfoService _prodPlanInfoService;
private List<ProdPLanInfo> 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
/// </summary>
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<ProdPlanInfoService>();
_prodPlanDetailService = App.ServiceProvider.GetService<ProdPlanDetailService>();
_recordStaffAttendanceService = App.ServiceProvider.GetService<IRecordStaffAttendanceService>();
_RfidHandleBusniess = App.ServiceProvider.GetService<RfidHandleBusniess>();
_baseStaffService = App.ServiceProvider.GetService<IBaseStaffService>();
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;
}
/// <summary>
@ -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
}));
}
}
/// <summary>
/// 显示班组成员
/// </summary>
/// <param name="baseStaffInfo"></param>
private void ShowTeamMember(BaseStaffInfo baseStaffInfo)
{
if(baseStaffInfo != null)
{
TeamMember = _RfidHandleBusniess.SpliceTeamMember(baseStaffInfo);
}
}
#region
/// <summary>
/// 班组成员
/// </summary>
private string teamMember;
public string TeamMember
{
get { return teamMember; }
set { teamMember = value; OnPropertyChanged("TeamMember"); }
}
/// <summary>
/// 订单
/// </summary>

@ -113,43 +113,46 @@ namespace SlnMesnac.WPF.ViewModel
/// </summary>
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 = "不能为空!";
}
}
}
/// <summary>
@ -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<ProductionReportWin>().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<ProductionReportWin>().First().Close();
}
}
public void OnPropertyChanged([CallerMemberName] string propertyName = "")

Loading…
Cancel
Save