예제 #1
0
 public Result PostSmartFactory([FromBody] SmartProcessFault smartProcessFault)
 {
     smartProcessFault.IsDeal = true;
     SmartProcessFaultHelper.Instance.Update(smartProcessFault);
     SmartFlowCardProcessHelper.UpdateSmartFlowCardProcessFault(smartProcessFault.ProcessId);
     return(Result.GenError <Result>(Error.Success));
 }
예제 #2
0
        public DataResult GetSmartFlowCardProcess([FromQuery] int qId, int wId, int flowCardId)
        {
            var result = new DataResult();

            result.datas.AddRange(SmartFlowCardProcessHelper.GetDetail(qId, wId, flowCardId));
            if (qId != 0 && !result.datas.Any())
            {
                result.errno = Error.SmartFlowCardProcessNotExist;
                return(result);
            }
            return(result);
        }
예제 #3
0
        public DataResult GetSmartFlowCard([FromQuery] int wId, int qId, int productId, int taskOrderId, bool menu, DateTime startTime, DateTime endTime)
        {
            var result = new DataResult();

            if (menu)
            {
                result.datas.AddRange(SmartFlowCardHelper.GetMenu(qId, wId));
            }
            else
            {
                var data = SmartFlowCardHelper.GetDetail(startTime, endTime, qId, wId, taskOrderId, productId);
                if (qId != 0 && !menu)
                {
                    var d = data.First();
                    if (d.State != SmartFlowCardState.未加工)
                    {
                        var processes = SmartFlowCardProcessHelper.GetSmartFlowCardProcessesByFlowCardId(d.Id);
                        if (processes.Any())
                        {
                            var st    = processes.First().StartTime;
                            var etMax = processes.Where(x => x.EndTime != default(DateTime)).Min(y => y.EndTime);
                            if (d.State == SmartFlowCardState.已完成)
                            {
                                var et = processes.Last().EndTime;
                                d.Consume = (int)(et - st).TotalSeconds;
                            }
                            else if (d.State == SmartFlowCardState.已取消)
                            {
                                d.Consume = (int)(etMax - st).TotalSeconds;
                            }
                            else
                            {
                                d.Consume = (int)(DateTime.Now - st).TotalSeconds;
                            }

                            var last = processes.LastOrDefault(x => x.Before != 0);
                            if (last != null)
                            {
                                d.Done = last.Qualified + last.Unqualified;
                                d.Left = last.Before - d.Done;
                            }
                        }
                    }
                }
                result.datas.AddRange(data);
            }

            if (qId != 0 && !result.datas.Any())
            {
                result.errno = Error.SmartFlowCardNotExist;
            }
            return(result);
        }
예제 #4
0
        public Result DeleteSmartFlowCard([FromBody] BatchDelete batchDelete)
        {
            var ids       = batchDelete.ids;
            var flowCards = SmartFlowCardHelper.Instance.GetByIds <SmartFlowCard>(ids);

            if (!flowCards.Any() || flowCards.Count() != ids.Count())
            {
                return(Result.GenError <Result>(Error.SmartFlowCardProcessNotExist));
            }
            SmartFlowCardHelper.Instance.Delete(ids);
            SmartFlowCardProcessHelper.DeleteByFlowCardIs(ids);
            OldWorkFlowHelper.Instance.OnSmartFlowCardChanged(flowCards);
            return(Result.GenError <Result>(Error.Success));
        }
        public DataResult GetSmartWorkOrder([FromQuery] int qId, int wId, bool menu)
        {
            var result = new DataResult();

            if (menu)
            {
                var data = SmartWorkOrderHelper.GetMenu(qId, wId);
                if (qId != 0 && !data.Any())
                {
                    result.errno = Error.SmartWorkOrderNotExist;
                    return(result);
                }
                result.datas.AddRange(data);
            }
            else
            {
                var data = SmartWorkOrderHelper.GetDetail(qId, wId).Select(ClassExtension.ParentCopyToChild <SmartWorkOrder, SmartWorkOrderDetail>);
                if (qId != 0 && !menu)
                {
                    var d = data.First();
                    if (d.State != SmartWorkOrderState.未加工)
                    {
                        var taskOrders = SmartTaskOrderHelper.GetDetailByWorkOrderId(d.Id);
                        var flowCards  = SmartFlowCardHelper.GetSmartFlowCardsByTaskOrderIds(taskOrders.Select(x => x.Id));
                        var processes  = SmartFlowCardProcessHelper.GetSmartFlowCardProcessesByFlowCardIds(flowCards.Select(x => x.Id));
                        if (processes.Any())
                        {
                            var st = processes.Where(x => x.StartTime != default(DateTime)).Min(y => y.StartTime);
                            var et = processes.Where(x => x.EndTime != default(DateTime)).Min(y => y.EndTime);
                            if (d.State == SmartWorkOrderState.已完成 || d.State == SmartWorkOrderState.已取消)
                            {
                                d.Consume = (int)(et - st).TotalSeconds;
                            }
                            else
                            {
                                d.Consume = (int)(DateTime.Now - st).TotalSeconds;
                            }
                        }
                    }
                }
                result.datas.AddRange(data);
            }
            if (qId != 0 && !result.datas.Any())
            {
                result.errno = Error.SmartWorkOrderNotExist;
                return(result);
            }
            return(result);
        }
        ///// <summary>
        /////  获取某类型的设备
        ///// </summary>
        ///// <param name="deviceCategoryId">设备类型</param>
        ///// <returns></returns>
        //public static string GenDevice(int deviceCategoryId)
        //{
        //    _devices = RedisHelper.Get<List<SmartDeviceProcess>>(DeviceKey);
        //    var 闲置设备 = _devices.Where(x=>x.State == SmartDeviceState.未加工)
        //    return results.FirstOrDefault() ?? "";
        //}

        private static void Simulate()
        {
            var createUserId   = "System";
            var markedDateTime = DateTime.Now;
            var faults         = new List <SmartProcessFault>();
            var processDevices = ServerConfig.ApiDb.Query <SmartFlowCardProcessDevice>("SELECT a.*, b.CategoryId, b.ProcessNumber, b.ProcessData FROM " +
                                                                                       "(SELECT * FROM `t_flow_card_process` WHERE MarkedDelete = 0 AND `State` != @state GROUP BY FlowCardId) a " +
                                                                                       "JOIN (SELECT a.Id, b.CategoryId, b.Process, a.ProcessNumber, a.ProcessData FROM `t_product_process` a " +
                                                                                       "JOIN (SELECT a.Id, b.CategoryId, b.Process FROM `t_process_code_category_process` a " +
                                                                                       "JOIN `t_process` b ON a.ProcessId = b.Id) b ON a.ProcessId = b.Id) b ON a.ProcessId = b.Id WHERE a.MarkedDelete = 0 ORDER BY a.Id;", new { state = SmartFlowCardProcessState.已完成 });
            var categroy0   = new List <int>();
            var categroy_0  = new List <int>();
            var dict        = new Dictionary <int, bool>();
            var processTime = 10;
            var checkTime   = 10;
            var rate        = 85;

            foreach (var processDevice in processDevices)
            {
                if (processDevice.Fault)
                {
                    continue;
                }
                if (processDevice.Before <= 0)
                {
                    faults.Add(new SmartProcessFault
                    {
                        CreateUserId   = createUserId,
                        MarkedDateTime = markedDateTime,
                        FaultTime      = markedDateTime,
                        Type           = ProcessFault.缺少原材料,
                        DeviceId       = processDevice.DeviceId,
                        FlowCardId     = processDevice.FlowCardId,
                        ProcessId      = processDevice.Id,
                    });
                    processDevice.State = SmartFlowCardProcessState.暂停中;
                    processDevice.Fault = true;
                    categroy0.Add(processDevice.Id);
                    continue;
                }

                if (processDevice.CategoryId == 0)
                {
                    if (!dict.ContainsKey(processDevice.CategoryId))
                    {
                        dict.Add(processDevice.CategoryId, true);
                    }
                    if (processDevice.State == SmartFlowCardProcessState.未加工 || processDevice.State == SmartFlowCardProcessState.等待中)
                    {
                        if (dict[processDevice.CategoryId])
                        {
                            if (ArrangeProcess("检验", out var processorId) == ScheduleState.成功)
                            {
                                processDevice.State       = SmartFlowCardProcessState.加工中;
                                processDevice.ProcessorId = processorId;
                                processDevice.StartTime   = markedDateTime;
                                processDevice.Count++;
                                var productProcess = SmartProductProcessHelper.Instance.Get <SmartProductProcess>(processDevice.ProcessId);
                                processDevice.Doing = processDevice.Left < productProcess.ProcessNumber ? processDevice.Left : productProcess.ProcessNumber;
                                categroy0.Add(processDevice.Id);
                            }
                        }
                        else
                        {
                            dict[processDevice.CategoryId] = false;
                        }
                    }
                    else if (processDevice.State == SmartFlowCardProcessState.加工中)
                    {
                        var productProcess = SmartProductProcessHelper.Instance.Get <SmartProductProcess>(processDevice.ProcessId);
                        var endTime        = processDevice.StartTime.AddSeconds((double)(productProcess.TotalSecond < checkTime ? checkTime : productProcess.TotalSecond));
                        if (endTime <= markedDateTime)
                        {
                            processDevice.EndTime = markedDateTime;
                            processDevice.State   = SmartFlowCardProcessState.等待中;
                            var 合格率         = (RateWeight)RandomSeed.GetWeightRandom(SimulateHelper.合格率);
                            var qualified   = processDevice.Doing * 合格率.Rate / 100;
                            var unqualified = processDevice.Doing - qualified;
                            processDevice.Qualified   += qualified;
                            processDevice.Unqualified += unqualified;
                            processDevice.Doing        = 0;
                            var last = processDevice.Left == 0;
                            if (last)
                            {
                                processDevice.State = SmartFlowCardProcessState.已完成;
                                ReleaseProcess(processDevice.ProcessorId);
                                SmartFlowCardProcessHelper.UpdateSmartFlowCardProcessNextBefore(processDevice.FlowCardId, processDevice.Id, processDevice.Qualified);
                                if (processDevice.Rate < rate)
                                {
                                    processDevice.Fault = true;
                                    faults.Add(new SmartProcessFault
                                    {
                                        CreateUserId   = createUserId,
                                        MarkedDateTime = markedDateTime,
                                        FaultTime      = markedDateTime,
                                        Type           = ProcessFault.合格率低,
                                        Remark         = $"合格率{processDevice.Rate.ToRound()}%,低于{rate}%",
                                        DeviceId       = processDevice.DeviceId,
                                        FlowCardId     = processDevice.FlowCardId,
                                        ProcessId      = processDevice.Id,
                                    });
                                }
                            }
                            var processor = AccountInfoHelper.GetAccountInfo(processDevice.ProcessorId)?.Account ?? "";
                            //todo
                            var log = new SmartFlowCardProcessLog(0, processor, markedDateTime, processDevice, qualified, unqualified);
                            SmartFlowCardProcessLogHelper.Instance.Add(log);
                            categroy0.Add(processDevice.Id);
                        }
                    }
                }
                else
                {
                    if (processDevice.State == SmartFlowCardProcessState.加工中)
                    {
                        var weight = (DeviceStateWeight)RandomSeed.GetWeightRandom(故障_暂停概率);
                        if (weight != null)
                        {
                            switch (weight.State)
                            {
                            case SmartDeviceOperateState.故障中:
                                faults.Add(new SmartProcessFault
                                {
                                    CreateUserId   = createUserId,
                                    MarkedDateTime = markedDateTime,
                                    FaultTime      = markedDateTime,
                                    Type           = ProcessFault.设备故障,
                                    DeviceId       = processDevice.DeviceId,
                                    FlowCardId     = processDevice.FlowCardId,
                                    ProcessId      = processDevice.Id,
                                });
                                processDevice.State = SmartFlowCardProcessState.暂停中;
                                processDevice.Fault = true;
                                UpdateDeviceState(processDevice.DeviceId, processDevice.CategoryId, weight.State);
                                categroy_0.Add(processDevice.Id);
                                break;

                            case SmartDeviceOperateState.暂停中:
                                processDevice.State = SmartFlowCardProcessState.暂停中;
                                UpdateDeviceState(processDevice.DeviceId, processDevice.CategoryId, weight.State);
                                categroy_0.Add(processDevice.Id);
                                break;
                            }
                        }
                    }
                    else if (processDevice.State == SmartFlowCardProcessState.未加工)
                    {
                        if (!dict.ContainsKey(processDevice.CategoryId))
                        {
                            dict.Add(processDevice.CategoryId, true);
                        }

                        if (dict[processDevice.CategoryId])
                        {
                            var totalSecond  = processDevice.TotalSecond < processTime ? processTime : processDevice.TotalSecond;
                            var processorId  = processDevice.ProcessorId;
                            var processCount = (int)Math.Ceiling((decimal)processDevice.Before / processDevice.ProcessNumber);
                            if (Arrange(processDevice.CategoryId, processDevice.Id, processDevice.ProcessNumber, processCount, (int)totalSecond,
                                        out var deviceId, ref processorId) == ScheduleState.成功)
                            {
                                processDevice.State       = SmartFlowCardProcessState.等待中;
                                processDevice.DeviceId    = deviceId;
                                processDevice.ProcessorId = processorId;
                                categroy_0.Add(processDevice.Id);
                            }
                            else
                            {
                                dict[processDevice.CategoryId] = false;
                            }
                        }
                    }
                }
            }