using Infrastructure.Attribute; using JinianNet.JNTemplate; using MDM.Attribute; using MDM.Model.Material; using MDM.Model.Process; using MDM.Models.Flow; using MDM.Models.Session; using MDM.Service; using NPOI.SS.Formula.Functions; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MDM.Services.Flows { /// /// 普通流程功能函数 /// // [AppService(ServiceType = typeof(CommonFlowService), ServiceLifetime = LifeTime.Singleton)] public class CommonFlowService : BaseService { /// /// 普通入站站流程 /// /// [RIZOFlow(FlowType = "common_inbound_flow")] public InStationApplyResult CommonInboundStationFlow(string operationCode, string processCode) { // 参数验证 if (string.IsNullOrWhiteSpace(operationCode) || string.IsNullOrWhiteSpace(processCode)) { return InStationApplyResult.InvalidParameters; } // 获取产品是否开工 var product = GetProductBySn(processCode); if (product == null) { // 产品未开工,不得入站 return InStationApplyResult.ProductNotStartWork; } // 判断正常件还是返工件,完工件 if (product.ProductStatus == 2) { // 完工件不得入站 return InStationApplyResult.ProductCompleted; } // 返工件进行 进站处理 if (product.ProductStatus == 3) { // 返工件入站 return InStationApplyResult.Success; } // 正常件进行 进站处理 if (product.ProductStatus == 1) { return HandleInProductionProduct(product, operationCode); } return InStationApplyResult.Success; } private ProductLifecycle GetProductBySn(string productSn) { return Context.Queryable() .Where(it => it.ProductSN == productSn) .First(); } private InStationApplyResult HandleInProductionProduct(ProductLifecycle product, string operationCode) { // 检查是否重复进站 if (IsRepeatInStation(product.ProductSN, operationCode)) { //重复入站,禁止入站 return InStationApplyResult.RepeatInStation; } // 获取工序信息 var processOperation = GetProcessOperation(product.RoutingCode, operationCode); if (processOperation == null) { // 工序不存在 异常 return InStationApplyResult.OperationNotFound; } // 检查是否可以跳站 if (processOperation.IsSkippable == 1) { // 允许跳站,直接入站成功 return InStationApplyResult.Success; } // 检查上一工序状态 return CheckPreviousOperationStatus(product.ProductSN, product.RoutingCode, processOperation.OperationSeq); } private bool IsRepeatInStation(string productSn, string operationCode) { return Context.Queryable() .Where(it => it.ProductSN == productSn && it.OperationCode == operationCode) .Any(); } private ProcessOperation GetProcessOperation(string routingCode, string operationCode) { return Context.Queryable() .Where(it => it.FkRoutingCode == routingCode && it.OperationCode == operationCode) .First(); } private InStationApplyResult CheckPreviousOperationStatus(string productSn, string routingCode, int? currentOperationSeq) { // 获取上一个工序 var lastOperation = Context.Queryable() .Where(it => it.FkRoutingCode == routingCode) .Where(it => it.OperationSeq < currentOperationSeq) .OrderByDescending(it => it.OperationSeq) .First(); if (lastOperation == null) { return InStationApplyResult.PreviousOperationNotFound; } // 获取上一工序的通过记录状态 var lastOperationStatus = Context.Queryable() .Where(it => it.ProductSN == productSn && it.OperationCode == lastOperation.OperationCode) .Select(it => it.ProuductStatus) .First(); return lastOperationStatus switch { // 上一个工序未入站,禁止入站 null => InStationApplyResult.PreviousOperationNotStarted, // 上一个工序进站但未出站,禁止入站 1 => InStationApplyResult.PreviousOperationInProgress, // 上一个工序已完成,允许入站 2 => InStationApplyResult.Success, // 上一个工序有异常,禁止入站 3 => InStationApplyResult.PreviousOperationHasException, _ => InStationApplyResult.UnknownStatus }; } } }