using Infrastructure.Attribute; using Infrastructure.Extensions; using Infrastructure.Model; using MDM.Model.Plant; using MDM.Model.Process; using Microsoft.AspNetCore.JsonPatch.Operations; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using NLog; using RIZO.Model.Mes; using RIZO.Model.MES.product_trace; using RIZO.Repository; using RIZO.Service.MES.product.IService; using RIZO.Service.PLC; using S7.Net; using SqlSugar.IOC; using System; using System.Threading; using System.Threading.Tasks; namespace RIZO.Service.PLCBackground.Stations.Into { /// /// OP点散热胶GF1500 /// [AppService(ServiceType = typeof(PlcIntoStationService_OP020_2), ServiceLifetime = LifeTime.Singleton)] public class PlcIntoStationService_OP020_2 : PlcIntoStationService_Common { public PlcIntoStationService_OP020_2(IOptions options) : base(options) { WorkstationCode = "OP020_2"; } /// /// 校验是否可以进站 /// /// 产品型号 /// 产品SN /// protected override async Task checkEntryPermission(string productModel, string productSN, string workstationCode, List processOperations) { EntryPermissionResult result = EntryPermissionResult.UnkownException; //2上工位无记录 //ProcessOperation LastOperation = processOperations.Where(operation => operation.OperationSeq < processOperations.Where(it => it.OperationCode == workstationCode).Select(it => it.OperationSeq).First()).OrderByDescending(operation => operation.OperationSeq).First(); int LastOperationSeq = processOperations.Where(operation => operation.OperationCode == workstationCode).Select(operation => operation.LastOperationSeq ?? -1).First(); ProcessOperation LastOperation = processOperations.Where(it => it.OperationSeq == LastOperationSeq).First(); bool isExistLastOperationRecord = await DbScoped.SugarScope.CopyNew().Queryable() .Where(it => it.ProductSN == productSN) .Where(it => it.OperationCode == LastOperation.OperationCode) .AnyAsync(); if (!isExistLastOperationRecord) { return EntryPermissionResult.NoRecordAtPreviousStation; } // 3 上工位NG 入站或者出站结果 NG bool isExistLastOperationNG = await Context.Queryable() .Where(it => it.ProductSN == productSN) .Where(it => it.OperationCode == LastOperation.OperationCode) .Where(it => it.PasstationType == 2 || it.PasstationType == 4) .Where(it => it.ResultCode != 1) .AnyAsync(); if (!isExistLastOperationNG) { result = EntryPermissionResult.PreviousStationNG; goto InsertPassrecord; } // 4 扫码产品型号错误 bool isExistproductSN = await Context.Queryable() .Where(it => it.ProductSN == productSN).AnyAsync(); bool isExistproductSNProducting = await Context.Queryable() .Where(it => it.ProductSN == productSN && (it.ProductCurrentStatus != 1 && it.ProductCurrentStatus != 3)).AnyAsync(); if (!isExistproductSN || !isExistproductSNProducting) { result = EntryPermissionResult.ProductModelError; goto InsertPassrecord; } //6时间超出规定无法生产 //7固化时间未到规定时间 int LastOperationStandardTime = processOperations.Where(operation => operation.OperationCode == LastOperation.OperationCode) .Select(operation => operation.StandardTime ?? 0).First(); if (LastOperationStandardTime > 0) { // 上一站的入站时间 和本站的请求时间差值 DateTime LastInStationTime = await Context.Queryable() .Where(it => it.ProductSN == productSN) .Where(it => it.OperationCode == LastOperation.OperationCode) .Where(it => it.PasstationType == 1) .MaxAsync(it => it.InStationTime ?? DateTime.MinValue); TimeSpan timeDiff = DateTime.Now - LastInStationTime; double totalSeconds = timeDiff.TotalSeconds; if (totalSeconds < LastOperationStandardTime) { result = EntryPermissionResult.CuringTimeNotReached; goto InsertPassrecord; } } //12 最大重复入站次数 int MaxRepeatEntries = processOperations.Where(operation => operation.OperationCode == workstationCode).Select(operation => operation.MaxStationCount ?? 1).First(); if (MaxRepeatEntries > 1) { int currentStationEntryCount = await Context.Queryable() .Where(it => it.ProductSN == productSN) .Where(it => it.OperationCode == workstationCode) .Where(it => it.PasstationType == 1) .CountAsync(); if (currentStationEntryCount >= MaxRepeatEntries) { result = EntryPermissionResult.MaximumRepeatedEntries; goto InsertPassrecord; } } //OK 准许进站 result = EntryPermissionResult.AllowIntoStation; goto InsertPassrecord; InsertPassrecord: //插入入站请求Resp过站记录 ProductPassStationRecord RespintoStation = new ProductPassStationRecord { ProductSN = productSN, WorkstationCode = WorkstationCode, Routingcode = processOperations?.First()?.FkRoutingCode ?? "", OperationCode = WorkstationCode, OperationName = plcSetting.WorkStationName, ProductionLifeStage = 1, // 1表示生产中 PasstationType = 1, // 入站完毕 PasstationDescription = "入站完毕Resp", EffectTime = DateTime.Now, InStationTime = DateTime.Now, ResultCode = (int)result, ResultDescription = result.ToString(), CreatedTime = DateTime.Now, }; await Context.Insertable(RespintoStation).ExecuteCommandAsync(); return result; } } }