using Aliyun.OSS; using Infrastructure.Attribute; using Infrastructure.Extensions; using Microsoft.Data.SqlClient; using RIZO.Model.Mes.Dto.GatherData; using RIZO.Model.Mes.Dto.WorkOrderInfo; using RIZO.Model.Mes.MasterData; using RIZO.Model.Mes.WorkOrderInfo; using RIZO.Repository; using RIZO.Service.Mes.IMesService.MasterData; using RIZO.Service.Mes.IMesService.WorkOrderInfo; using RIZO.Service.Mes.MasterData; using SqlSugar.Extensions; namespace RIZO.Service.Mes.WorkOrderInfo { /// /// 工单主表Service业务层处理 /// [AppService(ServiceType = typeof(IWorkOrderService), ServiceLifetime = LifeTime.Transient)] public class WorkOrderService : BaseService, IWorkOrderService { private WorkOrderItemService workOrderItemService = new WorkOrderItemService(); /// /// 查询工单主表列表 /// /// /// public PagedInfo GetList(WorkOrderQueryDto parm) { var predicate = QueryExp(parm); var response = Queryable() .Where(predicate.ToExpression()) .ToPage(parm); return response; } public PagedInfo GetListExport(WorkOrderQueryDto parm) { var predicate = QueryExpExport(parm); var response = Queryable() .Where(predicate.ToExpression()) .ToPage(parm); return response; } /// /// 获取详情 /// /// /// public WorkOrder GetInfo(long Id) { var response = Queryable() .Where(x => x.Id == Id) .First(); return response; } /// /// 添加工单主表 /// /// /// public WorkOrder AddWorkOrder(WorkOrder model) { return Insertable(model).ExecuteReturnEntity(); } /// /// 修改工单主表 /// /// /// public int UpdateWorkOrder(WorkOrder model) { return Update(model, true); } /// /// 查询表达式 /// /// /// private static Expressionable QueryExp(WorkOrderQueryDto parm) { var predicate = Expressionable.Create(); if (!string.IsNullOrWhiteSpace(parm.LineCode)) { predicate.And(it => it.LineCode.Contains(parm.LineCode)); } if (!string.IsNullOrWhiteSpace(parm.LineName)) { predicate.And(it => it.LineName.Contains(parm.LineName)); } if (!string.IsNullOrWhiteSpace(parm.WorkOrderCode)) { predicate.And(it => it.WorkOrderCode.Contains(parm.WorkOrderCode)); } if (!string.IsNullOrWhiteSpace(parm.OrderDate)) { predicate.And(it => it.OrderDate.Contains(parm.OrderDate)); } return predicate; } private static Expressionable QueryExpExport(WorkOrderQueryDto parm) { var predicate = Expressionable.Create(); if (parm.StartTime != null && parm.StartTime.ToString().Length > 0) { predicate.And(it => it.CreateTime >= parm.StartTime); } if (parm.EndTime != null && parm.EndTime.ToString().Length > 0) { predicate.And(it => it.CreateTime < parm.EndTime); } return predicate; } public WorkOrder CreateWorkOrderBySacnCode(FlowCard flowCard) { try { WorkOrder orderInfoNew = new WorkOrder(); //扫码信息转成FlowCard对象 //假设扫码结果是json形式 //{ // "FlowCardNo": "0001", // "MaterialCode": "GEAR-001", // "MaterialName": "齿轮(A型)", // "BatchNumber": "Batch-20251122-01", // "TotalQty": 100 //} //字符串转对象 //FlowCard flowCard = JsonConvert.DeserializeObject(ScanCode); //根据IDCode解析的数据去检索物料档案 //var material = materialInfoService.Queryable().Where(it => it.MaterialCode == flowCard.MaterialCode).First(); //if (material != null) //{ //} string strDay = DateTime.Now.ToString("yyyyMMdd"); //检验流卡二维码生成的工单是否重复生成 var WorkOrder = Queryable() .Where(it => it.WorkOrderCode == flowCard.FlowCardNo).First(); ; if (WorkOrder == null) { orderInfoNew.OrderDate = strDay; orderInfoNew.WorkOrderCode = flowCard.FlowCardNo; orderInfoNew.MaterialCode = flowCard.MaterialCode; orderInfoNew.MaterialName = flowCard.MaterialName; orderInfoNew.BatchNumber = flowCard.BatchNumber; orderInfoNew.TotalQty = flowCard.TotalQty; orderInfoNew.OrderDate = strDay; orderInfoNew.OrderStatus = 1; //根据前端是否能返回UserId //orderInfoNew.CreateBy = parm.UserId; //orderInfoNew.CreateName = parm.UserName; //orderInfoNew.UpdateBy = parm.UserId; //orderInfoNew.UpdateName = parm.UserName; orderInfoNew.CreateTime = DateTime.Now; orderInfoNew.UpdateTime = DateTime.Now; int iFlag = Update(orderInfoNew); } return orderInfoNew; } catch (Exception ex) { return null; } } //根据工单主表号去创建工单从表数据 //private WorkOrderItem createWorkOrderItem(string strWorkOrderCode, string strMaterialCode, string strLineCode, string strLineName, string strProcessCode, string strProcessName, string strIdCode, MaterialInfo material,string strUserId,string strUserName) //{ // string plcCode = ""; // string materialCode = material.MaterialCode; // string strFeature = material.Feature; // List plcFirstCodes = plcFirstCodeService.Queryable() // .Where(it => it.LineCode == strLineCode && (it.Feature == "ALL" || it.Feature == strFeature)).ToList(); // string strPlcFirstCode = ""; // if (plcFirstCodes != null && plcFirstCodes.Any()) // { // strPlcFirstCode = plcFirstCodes[0].FirstCode; // } // int Sequcence = 1; // WorkOrderItem workOrderItem = workOrderItemService.Queryable() // .Where(it => it.WorkOrderCode == strWorkOrderCode).OrderByDescending(it => it.Sequcence).First(); // if (workOrderItem != null) // { // Sequcence = workOrderItem.Sequcence; // Sequcence += 1; // } // string formattedSequence = Sequcence.ToString("D4"); // string strWorkOrderItemCode = strWorkOrderCode + formattedSequence; // plcCode = strPlcFirstCode + materialCode + strWorkOrderItemCode; // WorkOrderItem workOrderItem1 = new WorkOrderItem(); // workOrderItem1.WorkOrderCode = strWorkOrderCode; // workOrderItem1.WorkOrderItemCode = strWorkOrderItemCode; // workOrderItem1.PlcCode = plcCode; // workOrderItem1.ProcessCode = strProcessCode; // workOrderItem1.ProcessName = strProcessName; // workOrderItem1.MaterialCode = materialCode; // workOrderItem1.MaterialName = material.MaterialName; // workOrderItem1.CreateBy = strUserId; // workOrderItem1.CreateName = strUserName; // workOrderItem1.UpdateBy = strUserId; // workOrderItem1.UpdateName = strUserName; // workOrderItem1.CreateTime = DateTime.Now; // workOrderItem1.UpdateTime = DateTime.Now; // workOrderItem1.Qty = 1; // workOrderItem1.Sequcence = Sequcence; // int iFlag = workOrderItemService.Insert(workOrderItem1); // return workOrderItem1; //} /// /// OrderStatus 1执行中,2已完成 /// /// /// public int ChangeWorkOrderState(WorkOrderState parm) { int iResult = 0; try { iResult = Update(where: it => parm.Ids.Contains(it.Id), columns: it => new WorkOrder { OrderStatus = parm.OrderStatus, // 目标状态 UpdateBy = parm.UserId, // 更新人ID UpdateName = parm.UserName, // 更新人名称 UpdateTime = DateTime.Now // 更新时间 } ); } catch (Exception ex) { iResult = 0; } return iResult; } /// /// 按产线统计7天内每日合格率(折线图数据) /// /// 合格率折线图格式(xAxisData + series) public LineChartResponse QueryQualityLineChart() { DateTime now = DateTime.Now; List last7Days = Enumerable.Range(0, 7) .Select(i => now.AddDays(-i).Date) .OrderBy(date => date) .ToList(); List xAxisData = last7Days.Select(date => date.ToString("yyyy-MM-dd")).ToList(); string sql = string.Format(@"SELECT w.line_code LineCode, w.line_name LineName, w.create_time, sum(w.ok_qty) OkQty, sum(w.ng_qty) NgQty FROM work_order w WHERE w.create_time >= DATE_SUB(CURDATE(), INTERVAL 6 DAY) AND w.create_time < DATE_ADD(CURDATE(), INTERVAL 1 DAY) GROUP BY w.line_code, w.line_name, DATE_FORMAT(w.create_time, '%Y-%m-%d')"); var queryData = SqlQueryToList(sql); List series = new List(); foreach (var lineKv in queryData) { string lineCode = lineKv.LineCode; string lineName = lineKv.LineName; // 为7天的每个日期补全数据,计算合格率 List data = new List(); foreach (string date in xAxisData) { // 存在该日期数据则用查询结果,否则OK/NG均为0 if (lineKv.CreateTime.ObjToDate().ToString("yyyy-MM-dd").Contains(date)) { int total = lineKv.OkQty + lineKv.NgQty; // 合格率=OK数/总数(总数为0时合格率设为0,避免除以0) double rate = total == 0 ? 0 : Math.Round(((double)lineKv.OkQty / total)*100, 2); data.Add(rate); } else { data.Add(0); } } series.Add(new LineChartSeries { Name = $"{lineName}({lineCode})", Data = data }); } return new LineChartResponse { xAxisData = xAxisData, series = series }; } } }