using COSXML.Network; using Furion.ClayObject.Extensions; using Furion.DatabaseAccessor; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using iWare.Wms.Application.Mapper; using iWare.Wms.Application.Service.AccessInterface.Dto; using iWare.Wms.Core; using iWare.Wms.Core.Enum; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Extensions; using Microsoft.AspNetCore.Mvc; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; using static Aliyun.OSS.Model.SelectObjectRequestModel.InputFormatModel; namespace iWare.Wms.Application { /// /// 外部访问接口 /// [ApiDescriptionSettings("外部访问接口", Name = "AccessInterface", Order = 100)] [Route("api/[Controller]")] public class AccessInterfaceService : IAccessInterfaceService, IDynamicApiController, ITransient { private readonly IRepository _qualityDataInfoRep; private readonly IRepository _qualityDataInfoLogRep; private readonly IRepository _workPieceInfoRep; private readonly IRepository _threadStatusMonitorRep; private readonly IRepository _dataCaptureConfigRep; private readonly IHttpContextAccessor _httpContextAccessor; private readonly IRepository _workPieceProcessRep; private readonly IAccessInterfaceLogService _accessInterfaceLog; private readonly IAccessInterfaceLogForRequestService _accessInterfaceLogForRequest; private readonly IRepository _WorkPieceInfoLog; private readonly IRepository _equipmentCurrentMonitorRep; private readonly IRepository _equipmentBaseInfoRep; private readonly ISysDictTypeService _dict; private readonly IRepository _productionPlanInfoRep; private readonly IRepository _shiftInfoRep; /// /// 外部访问构造函数 /// /// /// /// /// /// public AccessInterfaceService( IAccessInterfaceLogForRequestService accessInterfaceLogForRequest, IRepository qualityDataInfoRep, IRepository qualityDataInfoLogRep, IRepository workPieceInfoRep, IHttpContextAccessor httpContextAccessor, IAccessInterfaceLogService accessInterfaceLog, IRepository threadStatusMonitorRep, IRepository dataCaptureConfigRep, IRepository workPieceProcessRep, WorkPieceInfoService WorkPieceInfoService, IRepository workPieceInfoLog, IRepository equipmentCurrentMonitorRep, IRepository equipmentBaseInfoRep, ISysDictTypeService dict , IRepository productionPlanInfoRep , IRepository shiftInfoRep) { _accessInterfaceLogForRequest = accessInterfaceLogForRequest; _qualityDataInfoRep = qualityDataInfoRep; _qualityDataInfoLogRep = qualityDataInfoLogRep; _workPieceInfoRep = workPieceInfoRep; _httpContextAccessor = httpContextAccessor; _accessInterfaceLog = accessInterfaceLog; _threadStatusMonitorRep = threadStatusMonitorRep; _dataCaptureConfigRep = dataCaptureConfigRep; _workPieceProcessRep = workPieceProcessRep; _WorkPieceInfoLog = workPieceInfoLog; _equipmentCurrentMonitorRep = equipmentCurrentMonitorRep; _equipmentBaseInfoRep = equipmentBaseInfoRep; _dict = dict; _productionPlanInfoRep = productionPlanInfoRep; _shiftInfoRep = shiftInfoRep; } public Dictionary GetQualityDataInfoUpdate() { Dictionary dict = new Dictionary(); dict.Add("QualityState", "QualityState"); dict.Add("QualityStateUpdateMode", "QualityStateUpdateMode"); dict.Add("QualityStateUpdateUser", "QualityStateUpdateUser"); dict.Add("OfflineTime", "OfflineTime"); //dict.Add("QualityOP10To1", "QualityOP10To1"); //dict.Add("QualityOP10To2", "QualityOP10To2"); //dict.Add("QualityOP10To3", "QualityOP10To3"); //dict.Add("QualityOP10To4", "QualityOP10To4"); return dict; } #region M128柔性测量单元用的接口 /// /// M31反馈质量数据 /// /// /// [HttpPost("UploadQualityData")] public async Task UploadQualityData([FromQuery] JsonInput input2) { AddAccessInterfaceLogInput addLog = new(); var json = input2.json; addLog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); addLog.JsonString = json; addLog.Action = 2; addLog.OperateAddress = $"{_httpContextAccessor.HttpContext.Request.Path}"; DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); var ipAddress = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress; if (ipAddress.IsIPv4MappedToIPv6) { addLog.IpAddress = ipAddress.MapToIPv4().ToString(); } AddQualityDataInfoInputV2 input = null; try { input = JsonConvert.DeserializeObject(json); addLog.Key = input.WorkPieceID; if (input == null || string.IsNullOrEmpty(input.WorkPieceID) || input.QualityState == 0) { addLog.Result = "传入参数异常:工件号不能为空!质量结果不能没有值"; //await _accessInterfaceLog.AddInterfaceLogAsync(addLog); throw Oops.Oh(addLog.Result); } var info = await _workPieceInfoRep .FirstOrDefaultAsync(w => w.WorkPieceID == input.WorkPieceID.Trim()); if (info == null) { addLog.Result = $"传入参数异常:工件号{input.WorkPieceID}不能找到指定工件!"; //await _accessInterfaceLog.AddInterfaceLogAsync(addLog); throw Oops.Oh(addLog.Result); } //var qualityData = _qualityDataInfoRep.Where(o => o.WorkPieceID == input.WorkPieceID).FirstOrDefault(); //if (qualityData == null || qualityData.WorkPieceID.Length < 1 || qualityData.WorkingProcedure.Length < 1) //{//插入QualityDataInfo表 // qualityData = EntityPropHelper.Mapper(info); // qualityData.WorkingProcedure = input.WorkingProcedure; // qualityData.QualityState = input.QualityState; // qualityData.Id = Yitter.IdGenerator.YitIdHelper.NextId(); // await _qualityDataInfoRep.InsertAsync(qualityData); //} ////修改QualityDataInfo表(主要是质量字段) //重复收到质量信息,会覆盖之前的 //EntityPropHelper.CopyProp(input, qualityData, GetQualityDataInfoUpdate());//指定修改字段 //qualityData.QualityReceiveTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local); //QualityDataInfoLog qualitylog = EntityPropHelper.Mapper(qualityData); //qualitylog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); //qualitylog.QualityDataInfoID = qualityData.Id; //await _qualityDataInfoLogRep.InsertAsync(qualitylog); DateTime spcStartTime; DateTime spcEndTime; //更新工序追溯表SPC var pro = _workPieceProcessRep.Where(o => o.WorkPieceID == input.WorkPieceID && o.WorkingProcedureCurrent == input.WorkingProcedure && o.OperationType == OperationType.SPC.ToString()).FirstOrDefault(); if (pro == null || pro.WorkPieceID.Length < 1) { WorkPieceProcess process = new WorkPieceProcess(); process = EntityPropHelper.Mapper(info); process.StartTime = now; process.EndTime = now; process.Id = Yitter.IdGenerator.YitIdHelper.NextId(); process.CreatedUserName = "API"; process.CreatedTime = now; process.UpdatedUserName = "API"; process.UpdatedTime = now; process.OperationType = OperationType.SPC.ToString(); process.QualityState = input.QualityState; process.Remarks = "柔性测量单元反馈新增"; process.QualityDataInfoID = addLog.Id; process.WorkingProcedureCurrent = input.WorkingProcedure; process.EquipmentID = ""; spcStartTime = process.StartTime; spcEndTime = process.EndTime; _workPieceProcessRep.InsertNow(process); } else { pro.QualityDataInfoID = addLog.Id; pro.EndTime = now; pro.UpdatedUserName = "API"; pro.UpdatedTime = now; pro.QualityState = input.QualityState; spcStartTime = pro.StartTime; spcEndTime = pro.EndTime; } info.QualityState = input.QualityState; if (!info.QualityState.Equals(((int)EnumQualityState.OK).ToString())) { info.QualityErrorInfo = $"SPC不合格"; } else { info.QualityErrorInfo = ""; } if (input.QualityState != (int)EnumQualityState.OK) { //更新表WorkPieceInfo info.WorkPieceState = (int)WorkPieceState.WIP;//推出后和SPC抽检后 质量录入时状态修改回在制品 info.UpdatedUserName = "api"; info.QualityStateUpdateUser = input.QualityStateUpdateUser; info.QualityStateUpdateTime = now; info.QualityStateUpdateMode = EnumQualityStateUpdateMode.SPC.ToString(); info.Remarks = $"SPC不合格,质量状态变更"; info.UpdatedTime = now; info.CompleteTime = null; WorkPieceInfoLog infolog = EntityPropHelper.Mapper(info); infolog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); infolog.WorkPieceInfoID = info.Id; infolog.LogAddTime = DateTime.Now; infolog.LogAddRemark = $"【{CurrentUserInfo.Name}】 柔性测量单元反馈质量信息"; _WorkPieceInfoLog.InsertAsync(infolog); //当某到工序检测到不合格工件时,从该工件加工完成时刻前指定时间起至报检不合格时间止,系统将该工件的最后加工工序在该时间段内加工的所有工件、正在加工的工件、该工序入口处的第一个工件全部标记为疑似状态,由人工复检工件并修改状态,并支持批量变更。 //答复:在线测量不需要走这个流程,只有SPC抽检才需要,需要把这时间段的工件全部置为疑似,哪怕是已完成工件 //时间段起始时间:抽检工件生产时间前一SPC抽检时间 //时间段结束时间:抽检工件质量结果出现后的时间 //抽检工件工序扫描枪外入口处的第一个工件 也把质量状态置为疑似 //(每一工序SPC抽检是设置的固定的,比如200抽4,状态置为疑似时若工件还在设备内,会继续生产完毕后排出) DateTime NOOKStartTime; DateTime NOOKEndTime; if (input.CompletedTimeHand.HasValue && input.CompletedTimeHand > now.AddHours(-1)) { NOOKEndTime = input.CompletedTimeHand.Value; } else { addLog.Result = $"M31质量上传工件测量完成时间{input.CompletedTime}异常!"; throw Oops.Oh(addLog.Result); } //CompletedTime SPC质量完成时间 //获取抽检工件生产时间前一SPC抽检时间 var previousSPC = _workPieceProcessRep.Where(o => o.WorkingProcedureCurrent == input.WorkingProcedure && o.OperationType == OperationType.SPC.ToString() && o.StartTime < spcStartTime ).OrderByDescending(o => o.StartTime).FirstOrDefault(); if (previousSPC != null && previousSPC.StartTime > now.AddDays(-1)) {//避免上一工件抽检时间过长 (24小时) NOOKStartTime = previousSPC.StartTime; } else {//没有找到上一抽检工件 或上一抽检工件超过24小时,则就用当前工件SPC开始时间 NOOKStartTime = spcStartTime; } var updatelist = _workPieceProcessRep.Where(o => o.WorkingProcedureCurrent == input.WorkingProcedure && o.OperationType == OperationType.生产.ToString() && o.StartTime < NOOKEndTime && o.StartTime > NOOKStartTime); foreach (var update in updatelist) { var updateinfo = await _workPieceInfoRep .FirstOrDefaultAsync(w => w.WorkPieceID == update.WorkPieceID); if (updateinfo == null) { addLog.Result = $"传入参数异常:工件号{input.WorkPieceID}不能找到指定工件!"; continue; } updateinfo.WorkPieceState = (int)WorkPieceState.WIP;//推出后和SPC抽检后 质量录入时状态修改回在制品 updateinfo.QualityState = (int)EnumQualityState.Suspected; updateinfo.QualityErrorInfo = $"工件{update.WorkPieceID}在工序{input.WorkingProcedure}抽检不合格,相关工件质量状态变更为疑似"; ; updateinfo.QualityStateUpdateUser = input.QualityStateUpdateUser; updateinfo.QualityStateUpdateTime = now; updateinfo.QualityStateUpdateMode = EnumQualityStateUpdateMode.SPC.ToString(); updateinfo.Remarks = $"工件{update.WorkPieceID}在工序{input.WorkingProcedure}抽检不合格,相关工件质量状态变更为疑似"; updateinfo.CompleteTime = null; } } addLog.Result = $"工件号{input.WorkPieceID} M31质量上传成功!"; //await _accessInterfaceLog.AddInterfaceLogAsync(addLog); } catch (Exception ex) { //addLog.Result = $"M31质量上传失败!"; throw Oops.Oh(addLog.Result + ex.Message); } finally { try { addLog.WorkPieceID = input?.WorkPieceID; addLog.WorkingProcedureCurrent = input?.WorkingProcedure; addLog.QualityState = input?.QualityState; await _accessInterfaceLog.AddInterfaceLogAsync(addLog); } catch (Exception ex32) { addLog.Result = $"M31质量上传失败1!"; throw Oops.Oh(addLog.Result); } } } /// /// 分页查询数据收集工序配置 /// /// /// [HttpGet("GetWorkingProcedureForID")] public async Task GetWorkingProcedureForID([FromQuery] AccessWorkPieceInfoInput input) { AddAccessInterfaceLogForRequestInput addLog = new(); addLog.JsonString = JsonConvert.SerializeObject(input); addLog.Action = 2; addLog.Key = input.WorkPieceID; addLog.OperateAddress = $"{_httpContextAccessor.HttpContext.Request.Path}"; var ipAddress = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress; if (ipAddress.IsIPv4MappedToIPv6) { addLog.IpAddress = ipAddress.MapToIPv4().ToString(); } if (input == null || string.IsNullOrEmpty(input.WorkPieceID)) { addLog.Result = "传入参数异常:工件号不能为空!"; //await _accessInterfaceLog.AddInterfaceLogAsync(addLog); //替换[Editby shaocx,2024-09-04] await _accessInterfaceLogForRequest.AddInterfaceLogForRequestAsync(addLog); throw Oops.Oh(addLog.Result); } var workPieceInfo = await _workPieceInfoRep.DetachedEntities .FirstOrDefaultAsync(w => w.WorkPieceID == input.WorkPieceID.Trim()); if (workPieceInfo == null) { addLog.Result = $"传入参数异常:工件号{input.WorkPieceID}不能找到指定工件!"; //await _accessInterfaceLog.AddInterfaceLogAsync(addLog); //替换[Editby shaocx,2024-09-04] await _accessInterfaceLogForRequest.AddInterfaceLogForRequestAsync(addLog); throw Oops.Oh(addLog.Result); } var re = workPieceInfo.Adapt(); addLog.Result = re; //await _accessInterfaceLog.AddInterfaceLogAsync(addLog); //替换[Editby shaocx,2024-09-04] await _accessInterfaceLogForRequest.AddInterfaceLogForRequestAsync(addLog); return re; } #endregion #region 大屏接口 /// /// 获取设备实时状态 /// /// /// [HttpGet("GetEquipmentCurrentState")] [AllowAnonymous] public async Task> GetEquipmentLst([FromQuery] EquipmentCurrentMonitorSearch input) { var equipmentCurrentMonitors = await (from monitor in _equipmentCurrentMonitorRep.DetachedEntities join baseinfo in _equipmentBaseInfoRep.DetachedEntities on monitor.EquipmentID equals baseinfo.EquipmentId into joinedEmpty from baseinfo2 in joinedEmpty.DefaultIfEmpty() where monitor.EquipmentID != "HMI" select new EquipmentCurrentMonitorOutputV2 { Id = monitor.Id, EquipmentID = monitor.EquipmentID, EquipmentName = baseinfo2.EquipmentName, EquipmentCurrentStateHand = monitor.EquipmentCurrentState, //EquipmentCurrentStateName = monitor.Value, WorkingProcedure = monitor.WorkingProcedure, AlertTime = monitor.AlertTime, FailureType = monitor.FailureType, Alertmsg = monitor.Alertmsg, Remarks = monitor.Remarks, WarnType = monitor.WarnType, Warnmsg = monitor.Warnmsg, WarnTime = monitor.WarnTime }) .ProjectToType() .OrderBy(o => o.EquipmentID) .ToListAsync(); return equipmentCurrentMonitors; } /// /// 获取当前年份所在的12个月生产完成情况 /// [HttpGet("GetProduceCompletionStatus")] [AllowAnonymous] public async Task> GetProduceCompletionStatus() { List list = new List(); //获取当前年的第一天 var yearOneDay = DateTime.Now.AddDays(-((int)DateTime.Now.DayOfYear - 1)).Date; //获取月份计划 var productionPlanInfos = _productionPlanInfoRep.DetachedEntities .Where(o => o.IsDeleted == false && o.PlanType.Equals("2")).ToList(); try { //获取最近一年下线工件的成品 var Completionlist = _workPieceInfoRep.DetachedEntities .Where(o => o.IsDeleted == false && o.WorkPieceLastOfflineTime >= yearOneDay && o.WorkPieceLastOfflineTime < yearOneDay.AddYears(1) && o.WorkPieceState == (int)WorkPieceState.FinishedProducts).ProjectToType().ToList() .GroupBy(o => o.WorkPieceLastOfflineTimeHand) .Select(o => new { YearMonth = o.Key, CompletionNum = o.Count() }).ToList(); for (int i = 1; i <= 12; i++) { //当前月份 var month = yearOneDay.Date.AddMonths((i - 1)).ToString("yyyy-MM"); var plan = productionPlanInfos.Where(o => o.PlanTime.ToString("yyyy-MM") == month).FirstOrDefault(); ProduceCompletionStatus produceCompletionStatus = new ProduceCompletionStatus(); produceCompletionStatus.Month = i.ToString(); produceCompletionStatus.PlanCompletionNum = (plan == null ? 0 : plan.PlanProductionNum); var completion = Completionlist.Where(o => o.YearMonth.Equals(month)).FirstOrDefault(); produceCompletionStatus.CompletionNum = (completion == null ? 0 : completion.CompletionNum); if (produceCompletionStatus.PlanCompletionNum == 0) { produceCompletionStatus.PlanCompletionRate = 0; } else { produceCompletionStatus.PlanCompletionRate = (int)Math.Clamp( Math.Round(((double)produceCompletionStatus.CompletionNum / (double)produceCompletionStatus.PlanCompletionNum), 3) * 100 , 0, 100); } list.Add(produceCompletionStatus); } } catch (Exception ex) { } return list; } /// /// 获取当前班次/月份的 实际产量和计划产量 /// [HttpGet("GetCurrentProduceInfo")] [AllowAnonymous] public async Task GetCurrentProduceInfo() { CurrentProduceInfo currentProduceInfo = new CurrentProduceInfo(); //获取当前月 var month = DateTime.Now.ToString("yyyy-MM"); //获取当前天 var day = DateTime.Now.ToString("yyyy-MM-dd"); //获取当前月份计划 var productionPlanInfos = _productionPlanInfoRep.DetachedEntities.ProjectToType().ToList() .Where(o => o.PlanType.Equals("2") && o.PlanTimeHand.Equals(month)).FirstOrDefault(); //获取最近月下线工件的成品 try { var MonthCompletionnNum = _workPieceInfoRep.DetachedEntities.ProjectToType().ToList() .Where(o => o.WorkPieceLastOfflineTimeHand.Equals(month) && o.WorkPieceState == (int)WorkPieceState.FinishedProducts).Count(); currentProduceInfo.CurrentMonthProduceNum = MonthCompletionnNum; } catch (Exception ex) { } //获取最近月下线工件的成品 var DayCompletionnNum = _workPieceInfoRep.DetachedEntities.ProjectToType().ToList() .Where(o => o.WorkPieceLastOfflineTimeDayHand.Equals(day) && o.WorkPieceState == (int)WorkPieceState.FinishedProducts).Count(); //获取班次班组信息 var shiftlist = _shiftInfoRep.DetachedEntities.ProjectToType().ToList().Where(o => o.StartTime < DateTime.Now && o.EndTime > DateTime.Now).FirstOrDefault(); currentProduceInfo.CurrentShiftProduceNum = DayCompletionnNum; currentProduceInfo.CurrentShiftPlanNum = 0; currentProduceInfo.CurrentMonthPlanNum = (productionPlanInfos == null ? 0 : productionPlanInfos.PlanProductionNum); if (shiftlist == null) { currentProduceInfo.CurrentTime = DateTime.Now; currentProduceInfo.CurrentTeamLeader = "袁班长"; currentProduceInfo.CurrentTeamName = "白班"; } else { //获取班次计划 var shiftplan = _productionPlanInfoRep.DetachedEntities.ProjectToType().ToList() .Where(o => o.PlanType.Equals("1") && o.TeamType.Equals(shiftlist.ShiftName) && o.PlanTimeDayHand.Equals(day)).FirstOrDefault(); currentProduceInfo.CurrentTime = DateTime.Now; currentProduceInfo.CurrentTeamLeader = shiftlist.ShiftRemark; currentProduceInfo.CurrentTeamName = shiftlist.ShiftName; if (shiftplan != null) { currentProduceInfo.CurrentShiftPlanNum = shiftplan.PlanProductionNum; } } try { DateTime time = DateTime.Now; var dicts = await _dict.GetDictTreeOutput(); var dict = dicts.Where(o => o.Code.Equals("last_failure_time"));//获取最新故障时间,用了判断安全生产多少天用 if (dict.Any()) { if (DateTime.TryParse(dict.FirstOrDefault().Remark, out time)) { currentProduceInfo.CurrentSafeProductionDay = ((int)((DateTime.Now - time).TotalDays)).ToString(); } else { currentProduceInfo.CurrentSafeProductionDay = ""; } } else { currentProduceInfo.CurrentSafeProductionDay = ""; } } catch (Exception ex) { currentProduceInfo.CurrentSafeProductionDay = "异常"; } return currentProduceInfo; } /// /// 获取大屏质量数据显示 /// /// 传返回参数的QualityType /// [HttpGet("GetQualityData")] [AllowAnonymous] public async Task GetQualityData([FromQuery] string input) { QualityDataDisplay qualityDataDisplay = new QualityDataDisplay(); List list = new List(); list.Add("OP10连杆厚度"); //list.Add("OP20小头孔直径"); //list.Add("OP20大头孔直径"); list.Add("OP30涨断力矩"); list.Add("OP35压装力矩"); //list.Add("OP40大头孔直径"); //list.Add("OP60大头孔直径"); Random rd = new Random((int)DateTime.Now.Ticks); var str = list[rd.Next(0, list.Count - 1)]; switch (str) { case "OP10连杆厚度": qualityDataDisplay.QualityType = str; var datas = _qualityDataInfoRep.DetachedEntities.ProjectToType() .Where(o => !string.IsNullOrEmpty(o.QualityOP10To1) && !string.IsNullOrEmpty(o.WorkPieceID)) .OrderByDescending(o => o.OP10QualityReceiveTime) .Select(o => new QualityData() { WorkPieceID = o.WorkPieceID, QualityDataVaule = double.Parse(o.QualityOP10To1) }) .Take(10).Reverse().ToList(); qualityDataDisplay.list = datas; break; case "OP30涨断力矩": qualityDataDisplay.QualityType = str; var dataop30ch1 = _qualityDataInfoRep.DetachedEntities.ProjectToType() .Where(o => !string.IsNullOrEmpty(o.QualityOP30To1) && !string.IsNullOrEmpty(o.WorkPieceID)) .OrderByDescending(o => o.OP30QualityReceiveTimeCH3) .Select(o => new QualityData() { WorkPieceID = o.WorkPieceID, QualityDataVaule = double.Parse(o.QualityOP30To1.Replace("kN", "")) }) .Take(10).Reverse().ToList(); qualityDataDisplay.list = dataop30ch1; break; case "OP35压装力矩": qualityDataDisplay.QualityType = str; var dataop35 = _qualityDataInfoRep.DetachedEntities.ProjectToType() .Where(o => !string.IsNullOrEmpty(o.QualityOP35To1) && !string.IsNullOrEmpty(o.WorkPieceID)) .OrderByDescending(o => o.OP35QualityReceiveTime) .Select(o => new QualityData() { WorkPieceID = o.WorkPieceID, QualityDataVaule = double.Parse(o.QualityOP35To1) }) .Take(10).Reverse().ToList(); qualityDataDisplay.list = dataop35; break; default: break; } return qualityDataDisplay; } /// /// 获取大屏的刷新频率(微妙) /// [HttpGet("GetLargeScreenFrequency")] [AllowAnonymous] public async Task GetLargeScreenFrequency() { try { var dicts = await _dict.GetDictTreeOutput(); var dict = dicts.Where(o => o.Code.Equals("screen_refresh_frequency")); if (dict.Any()) { int num = int.Parse(dict.FirstOrDefault().Remark); if (num < 1000 || num > 100000) { return 5000; } else { return num; } } else { return 5000; } } catch (Exception ex) { return 6000; } } /// /// 获取指定时间范围内的产量信息 /// /// /// /// [HttpGet("GetProductionForTime")] [AllowAnonymous] public async Task> GetProductionForTime(DateTime start, DateTime end) { //获取最近月下线工件的成品 var Production = from info in _workPieceInfoRep.DetachedEntities.ProjectToType().ToList() where info.WorkPieceLastOfflineTime >= start where info.WorkPieceLastOfflineTime <= end where info.WorkPieceState == (int)WorkPieceState.FinishedProducts group info by info.WorkPieceLastOfflineTimeDayHand into grouplist select new ProductionInfo() { Day = grouplist.Key, ProductionNum = grouplist.Count(), }; return Production.OrderBy(o => o.Day).ToList(); } #endregion #region 其他 /// /// 添加设备质量数据 /// /// /// [HttpPost("Add")] [AllowAnonymous] public async Task AddQualityDataAsync(AddQualityDataInfoInput input) { var quatilyData = input.Adapt(); var workInfo = await _workPieceInfoRep.DetachedEntities.FirstOrDefaultAsync(w => w.WorkPieceID == input.WorkPieceID); WorkPieceInfo newWorkInfo = new(); if (workInfo != null) { workInfo.EquipmentID = input.EquipmentID; workInfo.WorkPieceState = 1; workInfo.WorkingProcedureCurrent = input.WorkingProcedure; await _workPieceInfoRep.UpdateAsync(workInfo); } else { quatilyData.QualityState = 3; newWorkInfo.Id = Yitter.IdGenerator.YitIdHelper.NextId(); newWorkInfo.WorkPieceID = "GJ" + DateTime.Now.ToString("yyMMdd-HHmmssfff"); newWorkInfo.EquipmentID = input.EquipmentID; newWorkInfo.WorkPieceState = 1; newWorkInfo.WorkingProcedureCurrent = input.WorkingProcedure; await _workPieceInfoRep.InsertAsync(newWorkInfo); } var quantilyDataInfo = await _qualityDataInfoRep.DetachedEntities.FirstOrDefaultAsync(q => q.WorkPieceID == input.WorkPieceID && q.WorkingProcedure == input.WorkingProcedure); if (quantilyDataInfo == null) { var quailtyDataLog = quatilyData.Adapt(); quatilyData.Id = Yitter.IdGenerator.YitIdHelper.NextId(); quailtyDataLog.QualityDataInfoID = quatilyData.Id; using (var tran = await _qualityDataInfoRep.Database.BeginTransactionAsync())//事务 { try { await _qualityDataInfoRep.InsertAsync(quatilyData); // 质量数据 await _qualityDataInfoLogRep.InsertAsync(quailtyDataLog); // 质量日志 await tran.CommitAsync(); } catch (Exception ex) { await tran.RollbackAsync(); throw Oops.Oh("执行失败:" + ex.Message); } } await _qualityDataInfoRep.InsertAsync(quatilyData); await _qualityDataInfoLogRep.InsertAsync(quailtyDataLog); } else { quantilyDataInfo.EquipmentID = input.EquipmentID; quantilyDataInfo.QualityState = input.QualityState; quantilyDataInfo.QualityStateUpdateMode = input.QualityStateUpdateMode; quantilyDataInfo.QualityStateUpdateUser = input.QualityStateUpdateUser; quantilyDataInfo.QualityReceiveTime = input.QualityReceiveTime; quantilyDataInfo.OfflineTime = input.OfflineTime; switch (input.EquipmentID) { case "EOP10": quantilyDataInfo.QualityOP10To1 = input.QualityOP10To1; break; case "EOP20": quantilyDataInfo.QualityOP20To1 = input.QualityOP20To1; break; case "EOP30": quantilyDataInfo.QualityOP30To1 = input.QualityOP30To1; quantilyDataInfo.QualityOP30To2 = input.QualityOP30To2; quantilyDataInfo.QualityOP30To3 = input.QualityOP30To3; quantilyDataInfo.QualityOP30To4 = input.QualityOP30To4; quantilyDataInfo.QualityOP30To5 = input.QualityOP30To5; quantilyDataInfo.QualityOP30To6 = input.QualityOP30To6; quantilyDataInfo.QualityOP30To7 = input.QualityOP30To7; quantilyDataInfo.QualityOP30To8 = input.QualityOP30To8; quantilyDataInfo.QualityOP30To9 = input.QualityOP30To9; quantilyDataInfo.QualityOP30To10 = input.QualityOP30To10; quantilyDataInfo.QualityOP30To11 = input.QualityOP30To11; break; case "EOP35": quantilyDataInfo.QualityOP35To1 = input.QualityOP35To1; quantilyDataInfo.QualityOP35To2 = input.QualityOP35To2; break; case "EOP40": quantilyDataInfo.QualityOP40To1 = input.QualityOP40To1; break; case "EOP60": quantilyDataInfo.QualityOP60To1 = input.QualityOP60To1; quantilyDataInfo.QualityOP60To2 = input.QualityOP60To2; break; case "EOP70": quantilyDataInfo.QualityOP70To1 = input.QualityOP70To1; quantilyDataInfo.QualityOP70To2 = input.QualityOP70To2; quantilyDataInfo.QualityOP70To3 = input.QualityOP70To3; break; case "EOP80": quantilyDataInfo.QualityOP80To1 = input.QualityOP80To1; quantilyDataInfo.QualityOP80To2 = input.QualityOP80To2; quantilyDataInfo.QualityOP80To3 = input.QualityOP80To3; quantilyDataInfo.QualityOP80To4 = input.QualityOP80To4; quantilyDataInfo.QualityOP80To5 = input.QualityOP80To5; quantilyDataInfo.QualityOP80To6 = input.QualityOP80To6; quantilyDataInfo.QualityOP80To7 = input.QualityOP80To7; quantilyDataInfo.QualityOP80To8 = input.QualityOP80To8; quantilyDataInfo.QualityOP80To9 = input.QualityOP80To9; quantilyDataInfo.QualityOP80To10 = input.QualityOP80To10; break; } var quailtyDataInfoLog = quantilyDataInfo.Adapt(); quailtyDataInfoLog.Id = Yitter.IdGenerator.YitIdHelper.NextId(); quailtyDataInfoLog.QualityDataInfoID = quantilyDataInfo.Id; await _qualityDataInfoRep.UpdateAsync(quantilyDataInfo); await _qualityDataInfoLogRep.InsertAsync(quailtyDataInfoLog); } AddAccessInterfaceLogInput addLog = new(); addLog.JsonString = JsonConvert.SerializeObject(input); addLog.Action = 1; addLog.Key = input.WorkingProcedure; addLog.IpAddress = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString(); addLog.OperateAddress = $"{_httpContextAccessor.HttpContext.Request.Path}{_httpContextAccessor.HttpContext.Request.QueryString}";// _httpContextAccessor.HttpContext.Request.GetEncodedUrl(); await _accessInterfaceLog.AddInterfaceLogAsync(addLog); } /// /// 获取工件信息 /// /// /// [HttpGet("workPieceInfo")] [AllowAnonymous] public async Task GetWorkPieceInfoAsync([FromQuery] AccessWorkPieceInfoInput input) { var workPieceInfo = await _workPieceInfoRep.DetachedEntities .FirstOrDefaultAsync(w => w.WorkPieceID == input.WorkPieceID.Trim()); AddAccessInterfaceLogForRequestInput addLog = new(); addLog.JsonString = JsonConvert.SerializeObject(input); addLog.Action = 2; addLog.Key = input.WorkPieceID; addLog.Result = workPieceInfo; var ipAddress = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress; if (ipAddress.IsIPv4MappedToIPv6) { addLog.IpAddress = ipAddress.MapToIPv4().ToString(); } addLog.OperateAddress = $"{_httpContextAccessor.HttpContext.Request.Path}";// {_httpContextAccessor.HttpContext.Request.QueryString}"; //_httpContextAccessor.HttpContext.Request.GetEncodedUrl(); //替换[Editby shaocx,2024-09-04] // await _accessInterfaceLog.AddInterfaceLogAsync(addLog); await _accessInterfaceLogForRequest.AddInterfaceLogForRequestAsync(addLog); return workPieceInfo == null ? null : workPieceInfo.Adapt(); } /// /// 更新线程状态监控 /// /// /// [HttpPost("ThreadStatus")] [AllowAnonymous] public async Task AddThreadStatusAsync(AddThreadStatusMonitorInput input) { var dataCapture = await _dataCaptureConfigRep.DetachedEntities.FirstOrDefaultAsync(d => d.WorkingProcedure == input.Threadcode); var threadStatusMonitor = await _threadStatusMonitorRep.DetachedEntities.FirstOrDefaultAsync(t => t.Threadcode == input.Threadcode); if (threadStatusMonitor == null) { var threadMonitior = new ThreadStatusMonitor(); threadMonitior.Threadcode = input.Threadcode; threadMonitior.ThreadId = input.ThreadId; threadMonitior.Threadstatue = 1; threadMonitior.Threadstarttime = DateTime.Now; threadMonitior.Threadlastmodifytime = DateTime.Now; threadMonitior.Threadcname = input.Threadcname; threadMonitior.ThreadFrequency = dataCapture?.DataCaptureFrequency ?? 0; await _threadStatusMonitorRep.InsertAsync(threadMonitior); } else { if (threadStatusMonitor.Threadstatue == 1) { threadStatusMonitor.Threadstatue = 2; threadStatusMonitor.Threadendtime = DateTime.Now; threadStatusMonitor.Threadlastmodifytime = DateTime.Now; } if (threadStatusMonitor.Threadstatue == 2) { threadStatusMonitor.Threadstatue = 1; threadStatusMonitor.Threadstarttime = DateTime.Now; threadStatusMonitor.Threadendtime = null; threadStatusMonitor.Threadlastmodifytime = DateTime.Now; await _threadStatusMonitorRep.UpdateAsync(threadStatusMonitor); } } AddAccessInterfaceLogForRequestInput addLog = new(); addLog.JsonString = JsonConvert.SerializeObject(input); addLog.Action = 1; addLog.Key = input.Threadcode; addLog.IpAddress = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString(); addLog.OperateAddress = $"{_httpContextAccessor.HttpContext.Request.Path}{_httpContextAccessor.HttpContext.Request.QueryString}"; //替换[Editby shaocx,2024-09-04] // await _accessInterfaceLog.AddInterfaceLogAsync(addLog); await _accessInterfaceLogForRequest.AddInterfaceLogForRequestAsync(addLog); } #endregion } }