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 SqlSugar.SplitTableExtensions; namespace DOAN.Service.JobKanban; [AppService(ServiceType = typeof(IWorkorderProgressService), ServiceLifetime = LifeTime.Transient)] public class WorkorderProgressService : BaseService, IWorkorderProgressService { public List GetRoutes() { return Context.Queryable().Where(it => it.Status == 1).ToList(); } public List GetGroups() { return Context.Queryable().Where(it => it.Status == 1).ToList(); } public List GetReportWorkRecord(string group_code, string line_code, DateTime handleDate) { handleDate = handleDate.ToLocalTime().Date; return Context.Queryable().LeftJoin((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) => r) .ToList(); } /// /// 获取工单列表 未完成 /// /// /// /// public List GetWorkOrderListNoFinish(DateTime today, string line_code, string group_code) { today = today.ToLocalTime().Date; var query1 = Context.Queryable() .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((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() .Where(it => it.Workorder == workorder); return Context.Queryable(query) .LeftJoin((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() .Where(it => it.WorkorderDate == today) .Where(it => it.LineCode == line_code) .Where(it => it.GroupCode == group_code) .Count(); kanbanInfo.RemainTasKNum = Context.Queryable() .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().Where(it => it.Workorder == workorder).First(); UseTran2(() => { Context.Updateable().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().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() .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() .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() .Where(it => it.Workorder == workOrder) .Where(it => it.LabelContext == LabelContext) .SetColumns(it => it.Status == 1) .ExecuteCommand(); } /// /// 防错并且报工 /// /// /// /// public int ErrorProofingAndReportingWork(string workorder, string labelContext) { var checked_workorder = Context.Queryable().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().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(); } return result; } public int FinishWorkorder(string workorder, int finish_num) { var result = 0; result = Context.Updateable() .Where(it => it.Workorder == workorder) .SetColumns(it => it.Status == 3) .ExecuteCommand(); return result; } public (int, int) GetWorkOrderProgress(string workorder) { var result = Context.Queryable().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().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; } /// /// 根据工单号 查询每个工单号进度 /// /// /// private MaterialPreparationProgress SearchMaterialPreparationProgress(string Workorder) { var progress = new MaterialPreparationProgress(); //TODO 查询工单总任务数 progress.WorkOrder = Workorder; progress.Preparation_all_num = Context.Queryable() .Where(it => it.FkWorkorder == Workorder) .Count(); progress.Preparationed_num = Context.Queryable().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; } }