using Infrastructure.Attribute; using SqlSugar; using System; using System.Collections.Generic; using System.Globalization; using System.Reflection; using ZR.Model; using ZR.Model.MES.pro; using ZR.Model.MES.qc; using ZR.Model.MES.qc.DTO; using ZR.Model.MES.qu; using ZR.Model.MES.wms; using ZR.Service.mes.qc.IService; using static System.Runtime.InteropServices.JavaScript.JSType; namespace ZR.Service.mes.qc { [AppService(ServiceType = typeof(ICommonFQCService), ServiceLifetime = LifeTime.Transient)] public class CommonFQCService : BaseService, ICommonFQCService { public int CheckPackageWorkOrderStatus(string workOrderId) { try { // 检查对应工单是否存在 ProWorkorder_v2 proWorkorder = Context.Queryable() .Where(it => it.ClientWorkorder == workOrderId) .First(); if (proWorkorder == null) { return -1; } return proWorkorder.Status; } catch (Exception ex) { return -1; } } /// /// 根据年周日生成当日全部工单列表 /// /// 年 /// 周 /// 日 /// 0-不读取status 1-读取status 2- 查询status为1,2时 /// -1-全部 0-初态 1-上线 2-包装完成 /// public List GenerateWorkOrderListUtil(int year, int week, int date, int type = 0, int status = -1) { try { var predicate = Expressionable.Create() .And(it => it.Year == year) .And(it => it.Week == week) .And(it => it.Date == date) .And(it => it.Remark3 == "是") .AndIF(type == 1, it => it.Status == status) .AndIF(type == 2, it => it.Status == 1 || it.Status == 2) .ToExpression(); return Context.Queryable() .Where(predicate) .OrderBy(it => it.Sort) .ToList(); } catch (Exception ex) { return null; } } public int CheckPackageWorkOrderInListStatus(string workOrderId) { try { // 检查对应工单是否存在 ProWorkorder_v2 proWorkOrder = Context.Queryable().Where(it => it.ClientWorkorder == workOrderId).First(); if (proWorkOrder == null) { return -1; } // 提取工单年周日,组成数组 int year = proWorkOrder.Year; int week = proWorkOrder.Week; int date = proWorkOrder.Date; List proWorkorders = GenerateWorkOrderListUtil(year, week, date, 2); if (proWorkorders == null) { return -1; } // 提取目标工单号所在工单列表的位置 int index = -1; for (int i = 0; i < proWorkorders.Count; i++) { if (workOrderId == proWorkorders[i].ClientWorkorder) { index = i; break; } } if (index == 0) { return 2; } for (int i = 0; i < index; i++) { if (proWorkorders[i].Status == 1) { return 1; } } if (index == proWorkorders.Count - 1) { return 3; } return 0; } catch (Exception ex) { return -1; } } public int[] CheckWorkOrderInDayListNum(string workOrderId) { try { int[] result = new int[4]; // 工单总数 int workOrderTotal = 0; // 当前位置 int index = 0; // 已完成 int finishNum = 0; // 未完成 int noFinishNum = 0; // 检查对应工单是否存在 ProWorkorder_v2 proWorkOrder = Context.Queryable().Where(it => it.ClientWorkorder == workOrderId).First(); if (proWorkOrder == null) { return result; } // 提取工单年周日,组成数组 int year = proWorkOrder.Year; int week = proWorkOrder.Week; int date = proWorkOrder.Date; List proWorkorders = GenerateWorkOrderListUtil(year, week, date, 2); if (proWorkorders == null) { return result; } workOrderTotal = proWorkorders.Count; // 提取目标工单号所在工单列表的位置 for (int i = 0; i < proWorkorders.Count; i++) { if (workOrderId == proWorkorders[i].ClientWorkorder) { index = i + 1; break; } } List finishWorkorders = GenerateWorkOrderListUtil(year, week, date, 1, 2); if (finishWorkorders == null) { return result; } finishNum = finishWorkorders.Count; noFinishNum = workOrderTotal - finishNum; // 最终赋值 result.SetValue(index, 0); result.SetValue(workOrderTotal, 1); result.SetValue(finishNum, 2); result.SetValue(noFinishNum, 3); return result; } catch (Exception ex) { return null; } } /// /// 工单需要打印标签总数 /// /// 工单号 /// 上件数 /// public int GetWorkOrderNeedPackingTotal(string workOrderId) { try { ProWorkorder_v2 workOrder = Context.Queryable().Where(it => it.ClientWorkorder == workOrderId).First(); var res = Context.Queryable() .Where(it => it.FKWorkorderId.Equals(workOrderId)) .GroupBy(it => it.FKWorkorderId) .Select(it => new { sum = SqlFunc.AggregateSum(it.Counter ?? 0) }).First(); if (res == null) { return workOrder.PreviousNumber; } else { return workOrder.PreviousNumber - res.sum; } } catch (Exception ex) { return 0; } } /// /// 工单已打印标签数 /// /// /// public int GetWorkOrderPackingrecordCount(string workOrderId) { try { return Context.Queryable() .Where(it => it.WorkOrderNum == workOrderId) .OrderBy(it => it.Id) .Count(); } catch (Exception ex) { return 0; } } public QcCommonFqcBoardDto GetWorkOrderBoardData(string workOrderId) { try { // 检查对应工单是否存在 ProWorkorder_v2 proWorkOrder = Context.Queryable().Where(it => it.ClientWorkorder == workOrderId).First(); if (proWorkOrder == null) { return null; } // QcCommonFqcBoardDto boardData = new QcCommonFqcBoardDto(); boardData.WorkOrderId = workOrderId; // 提取工单年周日,组成数组 int year = proWorkOrder.Year; int week = proWorkOrder.Week; int date = proWorkOrder.Date; List proWorkorders = GenerateWorkOrderListUtil(year, week, date, 2); if (proWorkorders == null) { return null; } boardData.WorkOrderDayListCount = proWorkorders.Count; // 提取目标工单号所在工单列表的位置 for (int i = 0; i < proWorkorders.Count; i++) { if (workOrderId == proWorkorders[i].ClientWorkorder) { boardData.WorkOrderIndex = i + 1; break; } } boardData.WorkOrderPackageCount = GetWorkOrderNeedPackingTotal(workOrderId); boardData.WorkOrderFinishPackageNum = GetWorkOrderPackingrecordCount(workOrderId); boardData.WorkOrderNotFinishPackageNum = boardData.WorkOrderPackageCount - boardData.WorkOrderFinishPackageNum; // 如果不是第一个工单,找到上一个工单号 if (boardData.WorkOrderIndex > 1) { boardData.LastWorkOrderId = proWorkorders[(boardData.WorkOrderIndex - 2) ?? 0].ClientWorkorder; boardData.LastWorkOrderPackageCount = GetWorkOrderNeedPackingTotal(boardData.LastWorkOrderId); boardData.LastWorkOrderFinishPackageNum = GetWorkOrderPackingrecordCount(boardData.LastWorkOrderId); boardData.LastWorkOrderNotFinishPackageNum = boardData.LastWorkOrderPackageCount - boardData.LastWorkOrderFinishPackageNum; } List finishWorkorders = GenerateWorkOrderListUtil(year, week, date, 1, 2); if (finishWorkorders == null) { return null; } boardData.WorkOrderFinishNum = finishWorkorders.Count; boardData.WorkOrderNotFinishNum = boardData.WorkOrderDayListCount - boardData.WorkOrderFinishNum; boardData.UpdatedTime = DateTime.Now; return boardData; } catch (Exception ex) { return null; } } public PagedInfo GetWorkOrderFqcData(QcCommonFqcWorkerOrderDataQuery query) { try { // 时间解析 年 周(第几周) 日(星期) 转换 int year = -1; int week = -1; int date = -1; if (query.StartTime != null) { DateTime dateTime = query.StartTime ?? DateTime.Now; GregorianCalendar gregorianCalendar = new GregorianCalendar(); year = gregorianCalendar.GetYear(dateTime); week = gregorianCalendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Monday); date = (int)gregorianCalendar.GetDayOfWeek(dateTime); if (date == 0) { date = 7; } } // 获取当天全部工单数据 bool isCheckData = true; if (!string.IsNullOrEmpty(query.WorkOrderId)) { isCheckData = false; } var predicate = Expressionable.Create() .AndIF(isCheckData, it => it.Year == year) .AndIF(isCheckData, it => it.Week == week) .AndIF(isCheckData, it => it.Date == date) .And(it => it.Remark3 == "是") .AndIF(query.Status > -1, it => it.Status == query.Status) .AndIF(!string.IsNullOrEmpty(query.WorkOrderId), it => it.ClientWorkorder.Contains(query.WorkOrderId)) .AndIF(!string.IsNullOrEmpty(query.Partnumber), it => it.FinishedPartNumber.Contains(query.Partnumber)) .AndIF(!string.IsNullOrEmpty(query.Description), it => it.ProductDescription.Contains(query.Description) || it.Colour.Contains(query.Description) || it.Specifications.Contains(query.Description)) .ToExpression(); List orderList = Context.Queryable() .Where(predicate) .OrderBy(it => it.Sort) .ToList(); //TODO 分页暂不实现 //转换数据 PagedInfo resultPage = new PagedInfo(); List resultList = new List(); foreach (var item in orderList) { if (item != null) { string Remark = ""; WmMaterial material = Context.Queryable() .Where(it => it.Partnumber == item.FinishedPartNumber) .First(); string Description = ""; string Color = ""; string Specification = ""; if (material != null) { Description = material.Description; Color = material.Color; Specification = material.Specification; } else { Remark += "物料不在清单内 "; } // 首检报表数据拉取 QcQualityStatisticsFirst QcFirstData = Context.Queryable() .Where(it => it.WorkorderId == item.ClientWorkorder) .First(); string Team = ""; DateTime? startTime = null; DateTime? endTime = null; if (QcFirstData != null) { Team = QcFirstData.Team; startTime = QcFirstData.StartTime; endTime = QcFirstData.EndTime; if (startTime == null) { Remark += "工单开始时间为空 "; } } int WorkOrderPackageCount = GetWorkOrderNeedPackingTotal(item.ClientWorkorder); int WorkOrderFinishPackageNum = GetWorkOrderPackingrecordCount(item.ClientWorkorder); int WorkOrderNotFinishPackageNum = WorkOrderPackageCount - WorkOrderFinishPackageNum; if (WorkOrderNotFinishPackageNum < 0) { WorkOrderNotFinishPackageNum = 0; } bool IsFinish = WorkOrderNotFinishPackageNum == 0; QcCommonFqcWorkerOrderDataDto newItem = new() { WorkOrderId = item.ClientWorkorder, Partnumber = item.FinishedPartNumber, Description = Description, Color = Color, Specification = Specification, Team = Team, StartTime = startTime, EndTime = endTime, Status = item.Status, Remark = Remark, IsFinish = IsFinish, WorkOrderPackageCount = WorkOrderPackageCount, WorkOrderFinishPackageNum = WorkOrderFinishPackageNum, WorkOrderNotFinishPackageNum = WorkOrderNotFinishPackageNum }; resultList.Add(newItem); } } resultPage.Result = resultList; resultPage.TotalNum = resultPage.Result.Count; resultPage.PageSize = query.PageSize; resultPage.PageIndex = query.PageNum; return resultPage; } catch (Exception ex) { throw new Exception(ex.Message); } } } }