zhuangpei-mesbackend/DOAN.Service/JobKanban/WorkorderProgressService.cs
2024-11-17 20:28:38 +08:00

460 lines
17 KiB
C#

using DOAN.Model.JobKanban;
using DOAN.Model.MES.base_;
using DOAN.Model.MES.mm;
using DOAN.Model.MES.product;
using DOAN.Model.MES.product.Dto;
using DOAN.Service.JobKanban.IService;
using Infrastructure.Attribute;
using Mapster;
using Org.BouncyCastle.Asn1;
using SqlSugar.SplitTableExtensions;
namespace DOAN.Service.JobKanban;
[AppService(ServiceType = typeof(IWorkorderProgressService), ServiceLifetime = LifeTime.Transient)]
public class WorkorderProgressService : BaseService<ProWorkorder>, IWorkorderProgressService
{
public List<BaseWorkRoute> GetRoutes()
{
return Context.Queryable<BaseWorkRoute>().Where(it => it.Status == 1).ToList();
}
public List<BaseGroup> GetGroups()
{
return Context.Queryable<BaseGroup>().Where(it => it.Status == 1).ToList();
}
public List<ProWorkorder> GetWorkOrderList(string group_code, string line_code, DateTime handleDate)
{
handleDate = handleDate.ToLocalTime().Date;
return Context.Queryable<ProWorkorder>().Where(it => it.GroupCode == group_code)
.Where(it => it.LineCode == line_code)
.Where(it => it.WorkorderDate == handleDate)
.ToList();
}
public List<ProWorkorder> GetWorkOrderStatusList(string group_code, int status, DateTime handleDate)
{
return Context.Queryable<ProWorkorder>().Where(it => it.GroupCode == group_code)
.Where(it => it.Status == status)
.Where(it => it.WorkorderDate == handleDate)
.ToList();
}
public List<ProReportwork> GetReportWorkRecord(string group_code, string line_code, DateTime handleDate)
{
return Context.Queryable<ProWorkorder>().LeftJoin<ProReportwork>((w, r) => w.Workorder == r.FkWorkorder)
.Where((w, r) => w.GroupCode == group_code)
.Where((w, r) => w.LineCode == line_code)
.Where((w, r) => w.WorkorderDate == handleDate)
.Select((w, r) => new
{
FkWorkorder = w.Workorder,
DispatchNum = w.DeliveryNum,
FinishedNum = r.FinishedNum,
})
.ToList().Adapt<List<ProReportwork>>();
}
/// <summary>
/// 获取工单列表 未完成
/// </summary>
/// <param name="today"></param>
/// <param name="LineCode"></param>
/// <returns></returns>
public List<ProWorkorderDto4> GetWorkOrderListNoFinish(DateTime today, string line_code, string group_code)
{
today = today.ToLocalTime().Date;
var query1 = Context.Queryable<ProWorkorder>()
.Where(it => it.WorkorderDate == today)
.Where(it => it.LineCode == line_code)
.Where(it => it.GroupCode == group_code)
.Where(it => it.Status == 1 || it.Status == 2)
;
var ProWorkorderDto4List = Context.Queryable(query1)
.LeftJoin<ProReportwork>((q, r) => q.Workorder == r.FkWorkorder)
.Select((q, r) => new ProWorkorderDto4
{
FinishNum = r.FinishedNum
}, true)
.MergeTable()
.OrderBy(it => it.Sort)
.ToList();
if (ProWorkorderDto4List.Count > 0)
foreach (var item in ProWorkorderDto4List)
item.progress = SearchMaterialPreparationProgress(item.Workorder);
return ProWorkorderDto4List;
}
public ProWorkorderDto4 GetWorkOrderDetail(string workorder)
{
var query = Context.Queryable<ProWorkorder>()
.Where(it => it.Workorder == workorder);
return Context.Queryable(query)
.LeftJoin<ProReportwork>((q, r) => q.Workorder == r.FkWorkorder)
.Select((q, r) => new ProWorkorderDto4
{
FinishNum = r.FinishedNum
}, true).First();
}
public KanbanInfo GetKanbanNum(DateTime today, string line_code, string group_code)
{
var kanbanInfo = new KanbanInfo();
today = today.ToLocalTime().Date;
kanbanInfo.TotalTaskNum = Context.Queryable<ProWorkorder>()
.Where(it => it.WorkorderDate == today)
.Where(it => it.LineCode == line_code)
.Where(it => it.GroupCode == group_code)
.Count();
kanbanInfo.RemainTasKNum = Context.Queryable<ProWorkorder>()
.Where(it => it.WorkorderDate == today)
.Where(it => it.LineCode == line_code)
.Where(it => it.GroupCode == group_code)
.Where(it => it.Status == 1 || it.Status == 2)
.Count();
return kanbanInfo;
}
public int StartWorkOrder(string workorder)
{
var result = 0;
// 获取同一天 同一组 同一线 的所有工单 把状态2 设为init 1
var handleWorkorder =
Context.Queryable<ProWorkorder>().Where(it => it.Workorder == workorder).First();
UseTran2(() =>
{
Context.Updateable<ProWorkorder>().SetColumns(it => it.Status == 1)
.Where(it => it.Status == 2)
.Where(it => it.WorkorderDate == handleWorkorder.WorkorderDate)
.Where(it => it.GroupCode == handleWorkorder.GroupCode)
.Where(it => it.LineCode == handleWorkorder.LineCode)
.ExecuteCommand();
result = Context.Updateable<ProWorkorder>().SetColumns(it => it.Status == 2)
.SetColumns(it => it.StartTime == DateTime.Now)
.Where(it => it.Workorder == workorder).ExecuteCommand();
});
return result;
}
public int FinishWorkOrder(string workorder)
{
return Context.Updateable<ProWorkorder>()
.SetColumns(it => it.Status == 3)
.SetColumns(it => it.EndTime == DateTime.Now)
.Where(it => it.Workorder == workorder).ExecuteCommand();
}
public ProWorkorder GetProductingWorkorder(string line_code, DateTime handleDate)
{
//TODO 这个日期有问题??????
if (handleDate.Kind == DateTimeKind.Utc)
handleDate = handleDate.ToLocalTime().Date;
else
handleDate = handleDate.Date;
return Context.Queryable<ProWorkorder>()
.Where(it => it.LineCode == line_code)
.Where(it => it.WorkorderDate == handleDate)
.Where(it => it.Status == 2)
//.Select(it=>it.Workorder)
.First();
}
public int AddLabelLog(string labelContext, string workOrder)
{
var log = new ProLabelTraceLog();
log.Id = XueHua;
log.LabelContext = labelContext;
log.Workorder = workOrder;
log.Status = 1;
log.CreatedTime = DateTime.Now;
log.CreatedBy = "MES";
return Context.Insertable(log).ExecuteCommand();
}
public int LabelWorkOrderMatch(string LabelContext, string workOrder)
{
return Context.Updateable<ProLabelTraceLog>()
.Where(it => it.Workorder == workOrder)
.Where(it => it.LabelContext == LabelContext)
.SetColumns(it => it.Status == 1)
.ExecuteCommand();
}
/// <summary>
/// 防错并且报工
/// </summary>
/// <param name="workorder"></param>
/// <param name="labelContext"></param>
/// <returns></returns>
public int ErrorProofingAndReportingWork(string workorder, string labelContext)
{
var checked_workorder = Context.Queryable<ProWorkorder>().Where(it => it.Workorder == workorder)
.First();
if (!labelContext.Contains(checked_workorder.Specification))
// 产品不属于这个工单里
return -1;
// 记录条码
var detail = new ProReportworkDetail();
detail.Id = XueHua;
detail.Workorder = workorder;
detail.LabelCode = labelContext;
detail.CreatedBy = "MES";
detail.CreatedTime = DateTime.Now;
Context.Insertable(detail).ExecuteCommand();
// 累加报工数
var reportWork = new ProReportwork();
reportWork.Id = XueHua;
reportWork.FkWorkorder = workorder;
reportWork.DispatchNum = checked_workorder.DeliveryNum;
reportWork.FinishedNum = 1;
reportWork.GroupCode = checked_workorder.GroupCode;
reportWork.LineCode = checked_workorder.LineCode;
reportWork.CreatedTime = DateTime.Now;
reportWork.CreatedBy = "kanban";
reportWork.UpdatedBy = "kanban";
reportWork.UpdatedTime = DateTime.Now;
var ExistReportwork =
Context.Queryable<ProReportwork>().Where(it => it.FkWorkorder == workorder).First();
var result = 0;
if (ExistReportwork != null)
{
reportWork.FinishedNum = ExistReportwork.FinishedNum + 1;
result += Context.Updateable(reportWork)
.WhereColumns(it => new { it.FkWorkorder })
.UpdateColumns(it => new { it.UpdatedBy, it.UpdatedTime, it.FinishedNum })
.ExecuteCommand();
}
else
{
reportWork.FinishedNum = 1;
result += Context.Insertable(reportWork).ExecuteCommand();
}
#region 线
linesideInventoryDeductions(workorder, 1);
#endregion
return result;
}
public int NoErrorProofingAndReportingReport(string wokorder, int reportNum)
{
int result = 0;
var selected_workorder = Context.Queryable<ProWorkorder>().Where(it => it.Workorder == wokorder)
.First();
if (selected_workorder != null)
{
//修改
result = Context.Updateable<ProReportwork>().Where(it => it.FkWorkorder == wokorder)
.SetColumns(it => it.FinishedNum == reportNum)
.SetColumns(it => it.UpdatedTime == DateTime.Now)
.SetColumns(it => it.UpdatedBy == "PDA")
.ExecuteCommand();
}
else
{
//新增
var reportWork = new ProReportwork();
reportWork.Id = XueHua;
reportWork.FkWorkorder = wokorder;
reportWork.DispatchNum = selected_workorder.DeliveryNum;
reportWork.FinishedNum = reportNum;
reportWork.GroupCode = selected_workorder.GroupCode;
reportWork.LineCode = selected_workorder.LineCode;
reportWork.CreatedTime = DateTime.Now;
reportWork.CreatedBy = "kanban";
reportWork.UpdatedBy = "kanban";
reportWork.UpdatedTime = DateTime.Now;
result = Context.Insertable(reportWork).ExecuteCommand();
}
#region 线
linesideInventoryDeductions(wokorder, reportNum);
#endregion
return result;
}
public int FinishWorkorder(string workorder, int finish_num)
{
var result = 0;
result = Context.Updateable<ProWorkorder>()
.Where(it => it.Workorder == workorder)
.SetColumns(it => it.EndTime == DateTime.Now.ToLocalTime())
.SetColumns(it => it.Status == 3)
.ExecuteCommand();
return result;
}
public (int, int) GetWorkOrderProgress(string workorder)
{
var result = Context.Queryable<ProReportwork>().Where(it => it.FkWorkorder == workorder)
.Select(it => new { it.DispatchNum, it.FinishedNum }).First();
if (result == null)
{
return (0, 0);
}
(int, int) tuple = (result.DispatchNum ?? 0, result.FinishedNum ?? 0);
return tuple;
}
public (DateTime, float) GetWorkOrderTime(string workorder)
{
var result = Context.Queryable<ProWorkorder>().Where(it => it.Workorder == workorder)
.Select(it => new { it.StartTime, it.Beat, it.DeliveryNum }).First();
(DateTime, float) tuple = (result.StartTime ?? DateTime.MinValue,
(result.Beat * result.DeliveryNum ?? 0) / 3600);
return tuple;
}
//查询工单下的扫描条码信息
public List<ProReportworkDetail> GetWorkOrderScanCodeInfo(string workorder)
{
return Context.Queryable<ProReportworkDetail>().Where(it => it.Workorder == workorder).ToList();
}
/// <summary>
/// 线边库 库存扣除
/// </summary>
/// <param name="workorder"></param>
private void linesideInventoryDeductions(string workorder, int reportNum)
{
var selected_workorder = Context.Queryable<ProWorkorder>().Where(it => it.Workorder == workorder).First();
if (selected_workorder == null)
{
return;
}
//TODO 获取实际报工数量 作为线边库库存 出库
// 查询这个工单的BOM
List<BaseMaterialBom> SubMaterialList = Context.Queryable<BaseMaterialBom>()
.Where(it => it.InvCode == selected_workorder.ProductionCode)
.ToList();
if (SubMaterialList.Count > 0)
{
List<MmLinesidebarInventoryOutboundAndInbound> InsertedSubMaterialOutboundAndInboundList =
new List<MmLinesidebarInventoryOutboundAndInbound>();
List<MmLinesidebarInventory> needReduceLinesidebarInventories = new List<MmLinesidebarInventory>();
// 添加出库记录
// 扣除库存记录
string[] SubMaterialArray = SubMaterialList.Select(it => it.InvCode).ToArray();
//线边库存
List<MmLinesidebarInventory> SideInventoryList = Context.Queryable<MmLinesidebarInventory>()
.Where(it => it.LineCode == selected_workorder.LineCode)
.Where(it => SubMaterialArray.Contains(it.MaterialCode)).ToList();
foreach (var subMaterial in SubMaterialList)
{
//物料在线边库存
if (SideInventoryList.Where(it => it.MaterialCode == subMaterial.SubInvCode).Any())
{
// 记录需要扣除的线边库存
MmLinesidebarInventory sideInventory = new MmLinesidebarInventory();
sideInventory.LineCode = selected_workorder.LineCode;
sideInventory.MaterialCode = subMaterial.SubInvCode;
var seleced = SideInventoryList.Where(it => it.MaterialCode == subMaterial.SubInvCode).First();
sideInventory.LogicQuantity =
seleced.LogicQuantity -
reportNum * Convert.ToDecimal(subMaterial.Iusequantity); //库存------需要扣减的数量
needReduceLinesidebarInventories.Add(sideInventory);
MmLinesidebarInventoryOutboundAndInbound outbound =
new MmLinesidebarInventoryOutboundAndInbound();
outbound.Id = XueHua;
outbound.LineCode = selected_workorder.LineCode;
outbound.MaterialCode = subMaterial.SubInvCode;
outbound.MaterialName = subMaterial.SubInvName;
outbound.Action = 1;
outbound.Quantity = reportNum * Convert.ToDecimal(subMaterial.Iusequantity);
outbound.Remark = $"(正常)触摸屏报工,工单号为{workorder}";
outbound.CreatedBy = "kanban";
outbound.CreatedTime = DateTime.Now;
InsertedSubMaterialOutboundAndInboundList.Add(outbound);
}
else
{
MmLinesidebarInventoryOutboundAndInbound outbound =
new MmLinesidebarInventoryOutboundAndInbound();
outbound.Id = XueHua;
outbound.LineCode = selected_workorder.LineCode;
outbound.MaterialCode = subMaterial.SubInvCode;
outbound.MaterialName = subMaterial.SubInvName;
outbound.Action = 1;
outbound.Quantity = reportNum * Convert.ToDecimal(subMaterial.Iusequantity);
outbound.Remark = $"(异常)触摸屏报工,工单号为{workorder},物料不在这个线边库";
outbound.CreatedBy = "kanban";
outbound.CreatedTime = DateTime.Now;
InsertedSubMaterialOutboundAndInboundList.Add(outbound);
}
}
UseTran2(() =>
{
Context.Updateable(needReduceLinesidebarInventories).UpdateColumns(it => new { it.LogicQuantity })
.WhereColumns(it => new { it.LineCode, it.MaterialCode }).ExecuteCommand();
Context.Insertable(InsertedSubMaterialOutboundAndInboundList).ExecuteCommand();
});
}
}
/// <summary>
/// 根据工单号 查询每个工单号进度
/// </summary>
/// <param name="Workorder"></param>
/// <returns></returns>
private MaterialPreparationProgress SearchMaterialPreparationProgress(string Workorder)
{
var progress = new MaterialPreparationProgress();
//TODO 查询工单总任务数
progress.WorkOrder = Workorder;
progress.Preparation_all_num = Context.Queryable<MmPreparationTask>()
.Where(it => it.FkWorkorder == Workorder)
.Count();
progress.Preparationed_num = Context.Queryable<MmPreparationTask>().Where(it => it.FkWorkorder == Workorder)
.Where(it => it.PreparationStatus == 2)
.Count();
if (progress.Preparationed_num == progress.Preparation_all_num)
progress.PreparationStatus = 2;
else if (progress.Preparationed_num < progress.Preparation_all_num) progress.PreparationStatus = 1;
if (progress.Preparation_all_num == 0) progress.PreparationStatus = 0;
return progress;
}
}