change -修改暂停工单和结束工单时,右边的信息清空;工单编号输入框的编号能正常走逻辑的就清空,不正常的不清空;报工提交按钮时间限制加在每个工单上,每个工单15分钟只能报工一次合并

main
启龙 曹 9 months ago
commit a815f167b4

@ -190,6 +190,15 @@ namespace SlnMesnac.Business.business
return monitorInfo;
}
/// <summary>
/// 获取最后一条明细的结束时间
/// </summary>
public ProdPlanDetail GetLastDetailEndTime(string planCode)
{
ProdPlanDetail prodPlanDetail = new ProdPlanDetail();
prodPlanDetail = _prodPlanDetailService.GetLastPlanDetailByPlanCode(planCode);
return prodPlanDetail;
}
///// <summary>
///// 设置员工下班时间
///// </summary>

@ -49,18 +49,42 @@ namespace SlnMesnac.Repository.service.Impl
public List<ProdPlanDetail> GetPlanDetailsByPlanCode(string planCode)
{
List<ProdPlanDetail> prodPlanDetails = _rep.AsQueryable().WhereIF(!string.IsNullOrEmpty(planCode),x=>x.PlanCode == planCode).OrderByDescending(x => x.ObjId).ToList();
List<ProdPlanDetail> prodPlanDetails = new List<ProdPlanDetail>();
try
{
prodPlanDetails = _rep.AsQueryable().WhereIF(!string.IsNullOrEmpty(planCode), x => x.PlanCode == planCode).OrderByDescending(x => x.ObjId).ToList();
}
catch (Exception ex)
{
_logger.LogError($"查询对应计划的所有明细异常:{ex.Message}");
throw;
}
return prodPlanDetails;
}
public ProdPlanDetail GetLastPlanDetailByPlanCode(string planCode)
{
ProdPlanDetail prodPlanDetail = new ProdPlanDetail();
try
{
prodPlanDetail = _rep.AsQueryable().WhereIF(!string.IsNullOrEmpty(planCode), x => x.PlanCode == planCode).OrderByDescending(x => x.EndTime).First();
}
catch (Exception ex)
{
_logger.LogError($"查询对应计划的最新一条明细异常:{ex.Message}");
throw;
}
return prodPlanDetail;
}
public bool DeleteByPlanCodeBatchNumber(string planCode, int number)
{
bool result = false;
try
{
//_rep.AsQueryable().WhereIF(!string.IsNullOrEmpty(planCode), x => x.PlanCode == planCode && x.BatchNumber == number).OrderByDescending(x => x.ObjId).First();
ProdPlanDetail temp = _rep.AsQueryable().Where(x => x.PlanCode == planCode && x.BatchNumber == number).OrderByDescending(x => x.ObjId).First();
result = _rep.Delete(temp);
List<ProdPlanDetail> tempList = _rep.AsQueryable().Where(x => x.PlanCode == planCode && x.BatchNumber == number).OrderByDescending(x => x.ObjId).ToList();
result = _rep.Delete(tempList);
}
catch (Exception ex)
{

@ -29,6 +29,13 @@ namespace SlnMesnac.Repository.service
/// <returns></returns>
List<ProdPlanDetail> GetPlanDetailsByPlanCode(string planCode);
/// <summary>
/// 根据计划编号查询最新的一条明细
/// </summary>
/// <param name="planCode"></param>
/// <returns></returns>
ProdPlanDetail GetLastPlanDetailByPlanCode(string planCode);
/// <summary>
/// 根据工单号删除锅数为0的明细
/// </summary>

@ -157,7 +157,7 @@
RowHeight="35" AutoGenerateColumns="False" RowHeaderWidth="0"
GridLinesVisibility="None" ScrollViewer.HorizontalScrollBarVisibility="Hidden"
BorderThickness="0" CanUserAddRows="False"
Foreground="#FFFFFF" SelectedItem="{Binding SelectedDataItem}">
Foreground="#FFFFFF" >
<!--resourceStyle 399行修改选中字体颜色-->
<DataGrid.Columns>
<DataGridTemplateColumn Width="55" Header="序号" >

@ -338,11 +338,11 @@
</Grid>
</Border>
<Border Grid.Row="3">
<DataGrid Name="dataGridPlanDetail" ItemsSource="{Binding ProdPLanDetailDataGrid}" Background="Transparent"
<DataGrid Name="dataGridPlanDetail" ItemsSource="{Binding ProdPLanDetailDataGrid,Mode=TwoWay}" Background="Transparent"
FontSize="15" ColumnHeaderHeight="30" LoadingRow="dgvMH_LoadingRow"
RowHeight="40" AutoGenerateColumns="False" RowHeaderWidth="0"
GridLinesVisibility="None" ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ScrollViewer.VerticalScrollBarVisibility="Hidden" BorderThickness="0" CanUserAddRows="False"
ScrollViewer.VerticalScrollBarVisibility="Auto" BorderThickness="0" CanUserAddRows="False"
Foreground="#FFFFFF" SelectedItem="{Binding SelectedDetailRow}">
<DataGrid.Columns>
<DataGridTemplateColumn Width="55" Header="序号" >

@ -38,6 +38,7 @@ namespace SlnMesnac.WPF.ViewModel
private RfidHandleBusniess _RfidHandleBusniess;
private DatabaseHandleBusniess _databaseHandleBusniess;
private ProdPlanInfoService _prodPlanInfoService;
private ProdOrderInfoService _prodOrderInfoService;
private List<ProdPLanInfo> prodPlanInfos;
private ProdPlanDetailService _prodPlanDetailService;
private IRecordStaffAttendanceService _recordStaffAttendanceService;
@ -48,7 +49,7 @@ namespace SlnMesnac.WPF.ViewModel
private string ProcessCode;
public static bool isComplete = true;
public static string theStartTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");//记录每个明细的开始时间
public static string intervalvalTime = "2023-11-11 00:00:00";
//public static string intervalvalTime = "2023-11-11 00:00:00";
public static int stations = 0;
private string theOrderCode = "";
private ProdPLanInfo pLanInfo;
@ -57,6 +58,7 @@ namespace SlnMesnac.WPF.ViewModel
private string executeText = "待执行";
private int isSearch = 0;
public static string lastReportTime;
private int refreshOrNot = 1;//是否刷新
//public static string batchNums = "";//批次
#region 定义命令
@ -95,6 +97,8 @@ namespace SlnMesnac.WPF.ViewModel
public delegate void RefreshDelegate(ProdPLanInfo pLanInfo);
public static event RefreshDelegate? RefreshEvent;
public static Action ClearOrderCodeAction;
/// <summary>
/// 按钮文字转换事件
/// </summary>
@ -139,9 +143,16 @@ namespace SlnMesnac.WPF.ViewModel
public string MaterialCodeTextBox
{
get { return materialCodeTextBox; }
set { materialCodeTextBox = value; OnPropertyChanged("MaterialNameTextBox"); }
set { materialCodeTextBox = value; OnPropertyChanged("MaterialCodeTextBox"); }
}
//private string materialNameTextBox;
//public string MaterialNameTextBox
//{
// get { return materialNameTextBox; }
// set { materialNameTextBox = value; OnPropertyChanged("MaterialNameTextBox"); }
//}
/// <summary>
/// 工位
/// </summary>
@ -201,7 +212,7 @@ namespace SlnMesnac.WPF.ViewModel
/// <summary>
/// 订单Text
/// </summary>
private string orderCodeText;
private string orderCodeText = string.Empty;
public string OrderCodeText
{
get { return orderCodeText; }
@ -271,8 +282,10 @@ namespace SlnMesnac.WPF.ViewModel
public ExecuteViewModel()
{
_logger = App.ServiceProvider.GetService<ILogger<ExecuteViewModel>>();
_prodPlanInfoService = App.ServiceProvider.GetService<ProdPlanInfoService>();
_prodOrderInfoService = App.ServiceProvider.GetService<ProdOrderInfoService>();
_prodPlanDetailService = App.ServiceProvider.GetService<ProdPlanDetailService>();
_recordStaffAttendanceService = App.ServiceProvider.GetService<IRecordStaffAttendanceService>();
_recordStaffRealTimeService = App.ServiceProvider.GetService<IRecordStaffRealTimeService>();
@ -299,6 +312,12 @@ namespace SlnMesnac.WPF.ViewModel
{
updateStationName(stationName);
};
ProductionReportViewModel.RefrashClearAction += num =>
{
refreshOrNot = num;
Clear();
}
;
DeviceCode = configuration.GetSection("AppConfig")["DeviceCode"];
ProcessCode = configuration.GetSection("AppConfig")["ProcessCode"];
HandoverCommand = new RelayCommand(Handover);
@ -368,7 +387,6 @@ namespace SlnMesnac.WPF.ViewModel
StationTextBox = EmployeeLoginViewModel.stationName;
}
/// <summary>
/// 换班弹窗
/// </summary>
@ -396,7 +414,11 @@ namespace SlnMesnac.WPF.ViewModel
reportWin.WindowStartupLocation = WindowStartupLocation.CenterScreen; // 让窗体出现在屏幕中央
reportWin.ShowDialog();//窗体出现后禁止后面的用户控件
Search();
Refresh(pLanInfo);
if (refreshOrNot == 1)
{
Refresh(pLanInfo);
}
refreshOrNot = 1;
ShowTeamMember();
if (stations >= 3)
{
@ -468,42 +490,46 @@ namespace SlnMesnac.WPF.ViewModel
/// </summary>
private void HandleOrderCode(string orderCode)
{
theOrderCode = orderCode;
if (isComplete)
{
if (isSearch == 1)
var order = _prodOrderInfoService.GetProdOrderInfoByOrderCode(orderCode);
if (order != null)
{
//更新当前工单状态
_databaseHandleBusniess.UpdateOrderInfoStatus(orderCode,"1");
//判断当前工位的工单编号是否存在
var plan = _prodPlanInfoService.GetProdPLanInfoByOrderCode(RfidHandleBusniess.stationCode, orderCode);
if (plan == null)//不存在就在生产工单表中新增一条当前工位的订单且执行状态改为4,重新检索,并高亮这条工单,执行按钮可用
if (isSearch == 1)
{
foreach(var item in RfidHandleBusniess.stationList)
ClearOrderCodeAction?.Invoke();
//更新当前工单状态
_databaseHandleBusniess.UpdateOrderInfoStatus(order.OrderCode, "1");
//判断当前工位的工单编号是否存在
var plan = _prodPlanInfoService.GetProdPLanInfoByOrderCode(RfidHandleBusniess.stationCode, order.OrderCode);
if (plan == null)//不存在就在生产工单表中新增一条当前工位的订单且执行状态改为4,重新检索,并高亮这条工单,执行按钮可用
{
//现扫描一个订单码,同时插入三张(出布包胶成型)工单表
_databaseHandleBusniess.AddNewPlanInfo(orderCode, item , DeviceCode, ProcessCode, "0");
}
}
else//存在将本条数据的执行状态改为4高亮这条工单执行按钮可用
{
//判断这条工单状态是否为待执行或未执行
//var info = _databaseHandleBusniess.SelectPlanStatus(orderCode, RfidHandleBusniess.stationCode, DeviceCode, ProcessCode, "0");
if (plan.PlanStatus != "2")
{
_databaseHandleBusniess.UpdatePlanStatus(orderCode, RfidHandleBusniess.stationCode, DeviceCode, ProcessCode, "4");
foreach (var item in RfidHandleBusniess.stationList)
{
//现扫描一个订单码,同时插入三张(出布包胶成型)工单表
_databaseHandleBusniess.AddNewPlanInfo(order.OrderCode, item, DeviceCode, ProcessCode, "0");
}
}
else
else//存在将本条数据的执行状态改为4高亮这条工单执行按钮可用
{
MessageBox.Show("此工单已完成");
//判断这条工单状态是否为待执行或未执行
//var info = _databaseHandleBusniess.SelectPlanStatus(orderCode, RfidHandleBusniess.stationCode, DeviceCode, ProcessCode, "0");
if (plan.PlanStatus != "2")
{
_databaseHandleBusniess.UpdatePlanStatus(order.OrderCode, RfidHandleBusniess.stationCode, DeviceCode, ProcessCode, "4");
}
else
{
MessageBox.Show("此工单已完成");
}
}
Search();
}
Search();
}
//else
//{
// MessageBox.Show("请先检索工单!");
//}
else
{
MessageBox.Show("此订单不存在,请联系管理员!");
}
}
else
{
@ -524,6 +550,9 @@ namespace SlnMesnac.WPF.ViewModel
{
try
{
var Info = OrderCodeText.GetHashCode();
// 将当前记录存为实体可以通过parameter获取当前记录的信息
string orderCode = _selectedRow.OrderCode.ToString();
string planCode = _selectedRow.PlanCode.ToString();
@ -605,6 +634,18 @@ namespace SlnMesnac.WPF.ViewModel
//}
}
/// <summary>
/// 清空右边信息和明细
/// </summary>
private void Clear()
{
PlanCodeText = "";
OrderCodeText = "";
MaterialNameText = "";
ProdPLanDetailDataGrid.Clear();
}
/// <summary>
/// 显示班组成员
/// </summary>

@ -173,6 +173,7 @@ namespace SlnMesnac.WPF.ViewModel
{
info = OrderCodeText;
};
ExecuteViewModel.ClearOrderCodeAction += ClearOrderCode;
}
/// <summary>
@ -209,6 +210,14 @@ namespace SlnMesnac.WPF.ViewModel
}
#endregion
/// <summary>
/// 清空订单编码
/// </summary>
private void ClearOrderCode()
{
OrderCodeText = "";
}
/// <summary>
/// 窗体控制
/// </summary>

@ -29,6 +29,7 @@ namespace SlnMesnac.WPF.ViewModel
private double newAmountDouble;
private double result;
#region
/// <summary>
/// 按钮文字转换事件
@ -38,6 +39,8 @@ namespace SlnMesnac.WPF.ViewModel
//刷新委托
public delegate void RefreshDelegate(ProdPLanInfo pLanInfo);
public static event RefreshDelegate RefreshDelegateEvent;
public static Action<int>? RefrashClearAction;
#endregion
public ProductionReportViewModel()
@ -60,7 +63,7 @@ namespace SlnMesnac.WPF.ViewModel
private void Init()
{
planInfo = _prodPlanInfoService.GetRecordStaffAttendancesByConditions("", "", "", RfidHandleBusniess.stationCode, "1").FirstOrDefault();
planInfo = _prodPlanInfoService.GetPlanInfoByConditions("", "", "", RfidHandleBusniess.stationCode, "1").FirstOrDefault();
if (planInfo != null)
{
complateRate = GetComplateRate(Convert.ToDouble(planInfo.CompleteAmount), planInfo.PlanAmount);
@ -158,90 +161,88 @@ namespace SlnMesnac.WPF.ViewModel
/// </summary>
private void Confirm()
{
DateTime startTime = DateTime.Parse(ExecuteViewModel.intervalvalTime);
if ((DateTime.Now - startTime).TotalMinutes > 15)
// 获取最新工单明细的结束时间
var detail = _databaseHandleBusniess.GetLastDetailEndTime(planInfo.PlanCode);
// 如果最新工单明细没有结束时间,跳过时间判断
if (!string.IsNullOrEmpty(detail.EndTime))
{
if (EmployeeLoginViewModel.isOnDuty == true)//是否有班组当班,无当班时操作无效
DateTime startTime = DateTime.Parse(detail.EndTime);
if ((DateTime.Now - startTime).TotalMinutes <= 15)
{
var monitor = _databaseHandleBusniess.GetMonitor(RfidHandleBusniess.stationCode);
if (monitor != null)
{
string newAmount = NewAmountText;
RfidHandleBusniess.theNewAmount = NewAmountText;
if (newAmount != "")
{
bool isNum = true;
foreach (char x in newAmount)
{
if (!char.IsNumber(x) && x != '.')
{
isNum = false;
}
}
if (isNum)
{
HintText = "请撤回最新工单明细!";
//将新增产量加到实际产量中
currentAmountDouble = Convert.ToDouble(planInfo.CompleteAmount);
newAmountDouble = Convert.ToDouble(newAmount);
result = currentAmountDouble + newAmountDouble;
//planDetail = new ProdPlanDetail();
planDetail.CurrentStaffId = monitor.staffId;//取班长ID
planDetail.CreatedBy = monitor.staffName;//存班长名
planDetail.CompleteAmount = newAmountDouble.ToString();
planInfo.CompleteAmount = result.ToString();
if (planDetail.EndTime == null)//第一条明细
{
planDetail.BeginTime = ExecuteViewModel.theStartTime;
}
else
{
planDetail.BeginTime = planDetail.EndTime;
}
planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
ExecuteViewModel.intervalvalTime = planDetail.EndTime;
planDetail.BatchNumber += 1;
//ExecuteViewModel.batchNums = planDetail.BatchNumber.ToString();
//保存工单的执行人员
List<RecordStaffRealTime> realTimes = _databaseHandleBusniess.GetRecordStaffRealTimes();
_prodPlanDetailService.Insert(planDetail);
_prodPlanInfoService.Update(planInfo);
_databaseHandleBusniess.InsertPlanExecuteUser(planInfo, planDetail, realTimes);
Refresh();
HintText = "已提交!";
RefreshDelegateEvent?.Invoke(planInfo);
//ExecuteViewModel.isComplete = true;
complateRate = GetComplateRate(result, PlanAmountText);
if (complateRate > 0.9)
{
EndButtonColor = "#FF11B514";
}
}
else
{
//提示框提示错误信息
HintText = "输入有误,请输入阿拉伯数字!";
}
}
else
{
HintText = "不能为空!";
}
}
else
{
HintText = "班长未打卡,无法执行此操作!";
}
}
else
{
HintText = "没有班组当班,无法执行此操作!";
HintText = "当前工单距离上次提交不足15分钟";
return;
}
}
else
// 如果没有班组当班,直接返回
if (!EmployeeLoginViewModel.isOnDuty)
{
HintText = "当前工单距离上次提交不足15分钟";
HintText = "没有班组当班,无法执行此操作!";
return;
}
// 获取班组长信息
var monitor = _databaseHandleBusniess.GetMonitor(RfidHandleBusniess.stationCode);
if (monitor == null)
{
HintText = "班长未打卡,无法执行此操作!";
return;
}
// 获取新输入的产量
string newAmount = NewAmountText?.Trim();
if (string.IsNullOrEmpty(newAmount))
{
HintText = "不能为空!";
return;
}
// 验证输入的产量是否为数字
if (!IsNumeric(newAmount))
{
HintText = "输入有误,请输入阿拉伯数字!";
return;
}
// 更新计划信息
RfidHandleBusniess.theNewAmount = newAmount;
double currentAmountDouble = Convert.ToDouble(planInfo.CompleteAmount);
double newAmountDouble = Convert.ToDouble(newAmount);
double result = currentAmountDouble + newAmountDouble;
// 设置工单明细
planDetail.CurrentStaffId = monitor.staffId; // 班长ID
planDetail.CreatedBy = monitor.staffName; // 班长名称
planDetail.CompleteAmount = newAmountDouble.ToString();
planInfo.CompleteAmount = result.ToString();
planDetail.BeginTime = planDetail.EndTime ?? ExecuteViewModel.theStartTime;
planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
planDetail.BatchNumber += 1;
// 保存数据
var realTimes = _databaseHandleBusniess.GetRecordStaffRealTimes();
_prodPlanDetailService.Insert(planDetail);
_prodPlanInfoService.Update(planInfo);
_databaseHandleBusniess.InsertPlanExecuteUser(planInfo, planDetail, realTimes);
// 刷新并更新UI
Refresh();
HintText = "已提交!";
RefreshDelegateEvent?.Invoke(planInfo);
// 更新完成率
complateRate = GetComplateRate(result, PlanAmountText);
if (complateRate > 0.9)
{
EndButtonColor = "#FF11B514";
}
}
// 检查字符串是否为有效数字
private bool IsNumeric(string value)
{
return value.All(c => char.IsDigit(c) || c == '.');
}
/// <summary>
@ -250,45 +251,53 @@ namespace SlnMesnac.WPF.ViewModel
public ICommand EndPlanCommand { get; private set; }
private void EndPlan()
{
//判断工单实际产量与目标产量的差距,满足才能执行结束
// 判断工单实际产量与目标产量的差距,满足才能执行结束
if (complateRate > 0.9)
{
if (EmployeeLoginViewModel.isOnDuty == true)//是否有班组当班,无当班时操作无效
if (EmployeeLoginViewModel.isOnDuty == true) // 是否有班组当班,无当班时操作无效
{
if (planDetail != null && planInfo != null)
{
//planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
// planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//_prodPlanDetailService.Insert(planDetail);
planInfo.PlanStatus = "2";
planInfo.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
double planAmountDouble = Convert.ToDouble(planInfo.PlanAmount);
double completeAmountDouble = Convert.ToDouble(planInfo.CompleteAmount);
ExecuteViewModel.isComplete = true;
if (planAmountDouble == completeAmountDouble)
// 使用 switch-case 来处理完成情况
switch (planAmountDouble.CompareTo(completeAmountDouble))
{
planInfo.CompFlag = "0";//正常完成
}
else if (planAmountDouble > completeAmountDouble)
{
planInfo.CompFlag = "1";//不足目标产量降级处理
}
else
{
planInfo.CompFlag = "2";//超额完成
case 0: // 完成量等于计划量
planInfo.CompFlag = "0"; // 正常完成
break;
case int n when (n > 0): // 完成量小于计划量
planInfo.CompFlag = "1"; // 不足目标产量降级处理
break;
case int n when (n < 0): // 完成量大于计划量
planInfo.CompFlag = "2"; // 超额完成
break;
}
_prodPlanInfoService.Update(planInfo);
ExecuteViewModel.stations += 1;
}
//关闭窗口
// 关闭窗口
Application.Current.Windows.OfType<ProductionReportWin>().First().Close();
RefrashClearAction?.Invoke(0);
}
}
else
{
MessageBox.Show("完成产量与计划数量差距过大!");
}
}
}
/// <summary>
/// 继续执行
/// </summary>
@ -310,6 +319,7 @@ namespace SlnMesnac.WPF.ViewModel
ExecuteViewModel.isComplete = true;
//关闭窗口
Application.Current.Windows.OfType<ProductionReportWin>().First().Close();
RefrashClearAction?.Invoke(0);
}

Loading…
Cancel
Save