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

main
frankiecao 1 year ago
commit 206f15aab0

@ -20,6 +20,9 @@ namespace SlnMesnac.Business.business
private IRecordStaffAttendanceService _recordStaffAttendanceService; private IRecordStaffAttendanceService _recordStaffAttendanceService;
private IRecordStaffCommuteService _recordStaffCommuteService; private IRecordStaffCommuteService _recordStaffCommuteService;
private string currentTime; private string currentTime;
private string teamMembers = null;
private List<string> members = new List<string>();
public RfidHandleBusniess(IRecordStaffAttendanceService recordStaffAttendanceService, IRecordStaffCommuteService recordStaffCommuteService) public RfidHandleBusniess(IRecordStaffAttendanceService recordStaffAttendanceService, IRecordStaffCommuteService recordStaffCommuteService)
{ {
@ -79,5 +82,24 @@ namespace SlnMesnac.Business.business
_recordStaffCommuteService.Update(recordStaffCommute); _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 记录员工打卡")] [DataContract(Name = "RecordStaffAttendance 记录员工打卡")]
public class RecordStaffAttendance public class RecordStaffAttendance
{ {
//public BaseStaffInfo baseStaffInfo { get; set; }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>

@ -21,5 +21,12 @@ namespace SlnMesnac.Repository.service
/// <param name="cardId"></param> /// <param name="cardId"></param>
/// <returns></returns> /// <returns></returns>
BaseStaffInfo GetStaffInfoByCardId(string cardId); 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; _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>
/// 通过卡号获取员工信息 /// 通过卡号获取员工信息
/// </summary> /// </summary>
@ -51,5 +65,7 @@ namespace SlnMesnac.Repository.service.Impl
} }
return staffInfos; return staffInfos;
} }
} }
} }

@ -64,7 +64,8 @@ namespace SlnMesnac.Repository.service.Impl
public RecordStaffAttendance GetLastestOnRecord() 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; return recordStaffAttendances;
} }

@ -82,7 +82,14 @@
<RowDefinition Height="7.5*"/> <RowDefinition Height="7.5*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Border Grid.Row="0"> <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>
<Border Grid.Row="1" Margin="5"> <Border Grid.Row="1" Margin="5">
<Grid> <Grid>

@ -41,6 +41,7 @@ namespace SlnMesnac.WPF.ViewModel
private bool isUse = false; private bool isUse = false;
private int status = 0;//0是上班1是下班 private int status = 0;//0是上班1是下班
public static HidUtils hidUtils; public static HidUtils hidUtils;
public static bool isOnDuty = false;
private List<string> uniqueStrings = new List<string>(); private List<string> uniqueStrings = new List<string>();
private List<DateTime> timestamps = new List<DateTime>(); private List<DateTime> timestamps = new List<DateTime>();
@ -62,6 +63,13 @@ namespace SlnMesnac.WPF.ViewModel
/// 结束命令 /// 结束命令
/// </summary> /// </summary>
public ICommand OverCommand { get; private set; } public ICommand OverCommand { get; private set; }
/// <summary>
///
/// </summary>
/// <param name="staffInfo"></param>
public delegate void TransmitUser(BaseStaffInfo staffInfo);
public static event TransmitUser TransmitUserDelegateEvent;
#endregion #endregion
public EmployeeLoginViewModel() public EmployeeLoginViewModel()
@ -101,39 +109,27 @@ namespace SlnMesnac.WPF.ViewModel
if (user != null) if (user != null)
{ {
RecordStaffAttendance recordStaffAttendance = _recordStaffAttendanceService.GetRecordStaffAttendanceByStaffId(user.StaffId); RecordStaffAttendance recordStaffAttendance = _recordStaffAttendanceService.GetRecordStaffAttendanceByStaffId(user.StaffId);
var createTime = recordStaffAttendance.CreateTime; if (recordStaffAttendance != null)
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 == "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")
else if (recordStaffAttendance.AttendanceType == "0")
{
if (recordStaffAttendance.AttendanceType == status.ToString())
{ {
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; StaffIdText = user.StaffId;
CheckStatus = user.StaffName + " " + user.TeamCode + " 打卡成功!"; CheckStatus = user.StaffName + " " + user.TeamCode + " 打卡成功!";
var list = _rfidHandleBusniess.HandleAndInsertStaffAttendance(user, isCheckOn); var list = _rfidHandleBusniess.HandleAndInsertStaffAttendance(user, isCheckOn);
@ -146,16 +142,43 @@ namespace SlnMesnac.WPF.ViewModel
} }
else 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 else
{ {
StaffIdText = "未配置"; StaffIdText = "未配置";
CheckStatus = "没有匹配的员工,打卡失败!"; CheckStatus = "没有匹配的员工,打卡失败!";
} }
TransmitUserDelegateEvent?.Invoke(user);
} }
} }
else else
@ -300,6 +323,7 @@ namespace SlnMesnac.WPF.ViewModel
/// </summary> /// </summary>
private void CheckIn() private void CheckIn()
{ {
isOnDuty = true;
if (CheckInButtonText == "上班打卡") if (CheckInButtonText == "上班打卡")
{ {
// 执行上班打卡逻辑 // 执行上班打卡逻辑
@ -328,6 +352,7 @@ namespace SlnMesnac.WPF.ViewModel
/// </summary> /// </summary>
private void CheckOut() private void CheckOut()
{ {
isOnDuty = false;
if (CheckOutButtonText == "下班打卡") if (CheckOutButtonText == "下班打卡")
{ {
// 执行下班打卡逻辑 // 执行下班打卡逻辑

@ -31,10 +31,12 @@ namespace SlnMesnac.WPF.ViewModel
public ObservableCollection<string> OrderCodeComboBoxItems { get; set; } public ObservableCollection<string> OrderCodeComboBoxItems { get; set; }
public ObservableCollection<string> PlanCodeComboBoxItems { get; set; } public ObservableCollection<string> PlanCodeComboBoxItems { get; set; }
public ObservableCollection<string> MaterialNameComboBoxItems { get; set; } public ObservableCollection<string> MaterialNameComboBoxItems { get; set; }
private RfidHandleBusniess _RfidHandleBusniess;
private ProdPlanInfoService _prodPlanInfoService; private ProdPlanInfoService _prodPlanInfoService;
private List<ProdPLanInfo> prodPlanInfos; private List<ProdPLanInfo> prodPlanInfos;
private ProdPlanDetailService _prodPlanDetailService; private ProdPlanDetailService _prodPlanDetailService;
private IRecordStaffAttendanceService _recordStaffAttendanceService; private IRecordStaffAttendanceService _recordStaffAttendanceService;
private IBaseStaffService _baseStaffService;
private string StationCode; private string StationCode;
public static bool isComplete = true; public static bool isComplete = true;
private ProdPLanInfo pLanInfo; private ProdPLanInfo pLanInfo;
@ -64,7 +66,7 @@ namespace SlnMesnac.WPF.ViewModel
/// </summary> /// </summary>
public ICommand ExecuteCommand { get; private set; } public ICommand ExecuteCommand { get; private set; }
#region #region 委托
public delegate void RefreshDelegate(ProdPLanInfo pLanInfo); public delegate void RefreshDelegate(ProdPLanInfo pLanInfo);
public static event RefreshDelegate? RefreshEvent; public static event RefreshDelegate? RefreshEvent;
#endregion #endregion
@ -74,6 +76,8 @@ namespace SlnMesnac.WPF.ViewModel
_prodPlanInfoService = App.ServiceProvider.GetService<ProdPlanInfoService>(); _prodPlanInfoService = App.ServiceProvider.GetService<ProdPlanInfoService>();
_prodPlanDetailService = App.ServiceProvider.GetService<ProdPlanDetailService>(); _prodPlanDetailService = App.ServiceProvider.GetService<ProdPlanDetailService>();
_recordStaffAttendanceService = App.ServiceProvider.GetService<IRecordStaffAttendanceService>(); _recordStaffAttendanceService = App.ServiceProvider.GetService<IRecordStaffAttendanceService>();
_RfidHandleBusniess = App.ServiceProvider.GetService<RfidHandleBusniess>();
_baseStaffService = App.ServiceProvider.GetService<IBaseStaffService>();
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder() IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
.SetBasePath(System.AppContext.BaseDirectory) .SetBasePath(System.AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
@ -88,6 +92,7 @@ namespace SlnMesnac.WPF.ViewModel
SearchCommand = new RelayCommand(Search); SearchCommand = new RelayCommand(Search);
ExecuteCommand = new RelayCommand(Execute); ExecuteCommand = new RelayCommand(Execute);
ProductionReportViewModel.RefreshDelegateEvent += Refresh; ProductionReportViewModel.RefreshDelegateEvent += Refresh;
EmployeeLoginViewModel.TransmitUserDelegateEvent += ShowTeamMember;
} }
/// <summary> /// <summary>
@ -130,36 +135,42 @@ namespace SlnMesnac.WPF.ViewModel
} }
// 新增的执行事件 // 新增的执行事件
private void Execute() private void Execute()
{ {
if (isComplete) //判断是否有班组当班,查询打卡记录表4小时内最后一次打卡类型为上班的班组
if(EmployeeLoginViewModel.isOnDuty == true)
{ {
// 将当前记录存为实体可以通过parameter获取当前记录的信息 if (isComplete)//判断是否完成,未完成不能执行其他工单
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
{ {
PlanCode = pLanInfo.PlanCode, // 将当前记录存为实体可以通过parameter获取当前记录的信息
MaterialCode = pLanInfo.MaterialCode, string orderCode = _selectedRow.OrderCode.ToString();
PlanAmount = pLanInfo.PlanAmount, string planCode = _selectedRow.PlanCode.ToString();
CompleteAmount = pLanInfo.CompleteAmount, pLanInfo = _prodPlanInfoService.GetRecordStaffAttendancesByConditions(orderCode, planCode, "", "", "0").First();
BeginTime = DateTime.Now.ToString(), RecordStaffAttendance currentRecord = _recordStaffAttendanceService.GetLastestOnRecord();
CurrentStaffId = currentRecord.StaffId, BaseStaffInfo staffInfo = _baseStaffService.GetMonitorByTeamCode(currentRecord.TeamCode);
//NextStaffId = nextRecord.StaffId, RecordStaffAttendance nextRecord = _recordStaffAttendanceService.GetLastestOffRecord();
}; // 向detail表里插入一条数据
_prodPlanDetailService.Insert(prodPlanDetail); ProdPlanDetail prodPlanDetail = new ProdPlanDetail
//按钮文字变成执行中并锁定,其他的订单执行按钮也禁用 {
pLanInfo.BeginTime = DateTime.Now.ToString(); PlanCode = pLanInfo.PlanCode,
pLanInfo.PlanStatus = "1"; MaterialCode = pLanInfo.MaterialCode,
_prodPlanInfoService.Update(pLanInfo); PlanAmount = pLanInfo.PlanAmount,
Search(); CompleteAmount = pLanInfo.CompleteAmount,
//查明细表显示出来 BeginTime = DateTime.Now.ToString(),
Refresh(pLanInfo); CurrentStaffId = staffInfo.StaffId
isComplete = false; //NextStaffId = nextRecord.StaffId,
};
_prodPlanDetailService.Insert(prodPlanDetail);
//按钮文字变成执行中并锁定,其他的订单执行按钮也禁用
pLanInfo.BeginTime = DateTime.Now.ToString();
pLanInfo.PlanStatus = "1";
_prodPlanInfoService.Update(pLanInfo);
Search();
//查明细表显示出来
Refresh(pLanInfo);
isComplete = false;
}
} }
} }
@ -181,7 +192,29 @@ namespace SlnMesnac.WPF.ViewModel
} }
} }
/// <summary>
/// 显示班组成员
/// </summary>
/// <param name="baseStaffInfo"></param>
private void ShowTeamMember(BaseStaffInfo baseStaffInfo)
{
if(baseStaffInfo != null)
{
TeamMember = _RfidHandleBusniess.SpliceTeamMember(baseStaffInfo);
}
}
#region #region
/// <summary>
/// 班组成员
/// </summary>
private string teamMember;
public string TeamMember
{
get { return teamMember; }
set { teamMember = value; OnPropertyChanged("TeamMember"); }
}
/// <summary> /// <summary>
/// 订单 /// 订单
/// </summary> /// </summary>

@ -113,43 +113,46 @@ namespace SlnMesnac.WPF.ViewModel
/// </summary> /// </summary>
private void Confirm() private void Confirm()
{ {
string newAmount = NewAmountText; if(EmployeeLoginViewModel.isOnDuty == true)
if (newAmount != null)
{ {
bool isNum = true; string newAmount = NewAmountText;
foreach (char x in newAmount) 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 else
{ {
//提示框提示错误信息 HintText = "不能为空!";
HintText = "输入有误,请输入阿拉伯数字!";
} }
} }
else
{
HintText = "不能为空!";
}
} }
/// <summary> /// <summary>
@ -158,27 +161,33 @@ namespace SlnMesnac.WPF.ViewModel
public ICommand EndPlanCommand { get; private set; } public ICommand EndPlanCommand { get; private set; }
private void EndPlan() private void EndPlan()
{ {
planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); if(EmployeeLoginViewModel.isOnDuty == true)
_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";//正常完成 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();
} }
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 = "") public void OnPropertyChanged([CallerMemberName] string propertyName = "")

Loading…
Cancel
Save