Exemple #1
0
        protected override QCServiceWorkState Work()
        {
            bool idle = true;

            Logger.Info("Start Main service Work()!");
            foreach (var source in EventSources)
            {
                try
                {
                    if (source.HasNextEvent())
                    {
                        Logger.Info("source.HasNextEvent()");
                        QCEvent e = source.NextEvent();

                        Debug.Assert(e != null, "Event can't be null");

                        bool eventHasNotBeenAccept = true;

                        foreach (IQCEventJobFactory handlerFactory in EventJobFactories)
                        {
                            if (handlerFactory.AcceptEvent(e))
                            {
                                eventHasNotBeenAccept = false;
                                IQCEventJob handler = handlerFactory.NewJob(e);
                                Logger.Info(" Handler: " + handlerFactory.GetType() + " Event: " + source.GetType());

                                if (IsSTAThread)
                                {
                                    Logger.Info("STAThread, do without new thread");
                                    HandlerWork(e, handler, false);
                                }
                                else
                                {
                                    Semaphore.WaitOne(); // need to be the last line

                                    Task.Factory.StartNew(() =>
                                    {
                                        HandlerWork(e, handler, true);
                                    });
                                }
                            }
                        }

                        if (eventHasNotBeenAccept)
                        {
                            Logger.Debug("Event " + e + " has not been accepted by any factory. Skipped");
                        }

                        idle = false;
                    }
                }
                catch (QCEventIOException e)
                {
                    Logger.Debug("Event Fetching Error: " + e);
                }
                catch (SendMessageException smse) {
                    throw smse;
                }
            }

            if (idle)
            {
                return(QCServiceWorkState.Idle);
            }
            else
            {
                return(QCServiceWorkState.Working);
            }
        }
 protected void PrepareUpdate(QCEvent entity)
 {
     entity.LastUpdated = DateTime.UtcNow;
 }
        public IDictionary <string, object> GetQCEventDynamic(
            QCEvent row, QCEventQueryProjection projection,
            QCEventQueryOptions options, string qcFolderPath, IFileService fileService)
        {
            var obj = new Dictionary <string, object>();

            foreach (var f in projection.GetFieldsArr())
            {
                switch (f)
                {
                case QCEventQueryProjection.INFO:
                {
                    var entity = row;
                    obj["id"] = entity.Id;
                    var details = entity.Details.Select(o => new
                        {
                            id             = o.Id,
                            defect_type_id = o.DefectTypeId,
                            defect_type    = new
                            {
                                id   = o.DefectType.Id,
                                code = o.DefectType.Code,
                                name = o.DefectType.Name
                            }
                        }).ToList();
                    obj["details"]             = details;
                    obj["description"]         = entity.Description;
                    obj["production_batch_id"] = entity.ProductionBatchId;
                    obj["qc_device_id"]        = entity.QCDeviceId;
                    var time = entity.CreatedTime
                               .ToDefaultTimeZone();
                    var timeStr = time.ToString(options.date_format);
                    obj["created_time"] = new
                    {
                        display = timeStr,
                        iso     = $"{time.ToUniversalTime():s}Z"
                    };
                    time = entity.LastUpdated
                           .ToDefaultTimeZone();
                    timeStr             = time.ToString(options.date_format);
                    obj["last_updated"] = new
                    {
                        display = timeStr,
                        iso     = $"{time.ToUniversalTime():s}Z"
                    };
                    obj["seen"] = entity.Seen;
                }
                break;

                case QCEventQueryProjection.BATCH:
                {
                    var entity = row.Batch;
                    if (entity != null)
                    {
                        obj["batch"] = new
                        {
                            id   = entity.Id,
                            code = entity.Code,
                        }
                    }
                    ;
                }
                break;

                case QCEventQueryProjection.IMAGE:
                {
                    if (!options.single_only)
                    {
                        throw new Exception("Only single option can query image field");
                    }
                    var entity = row;
                    if (entity.LeftImage != null)
                    {
                        var finalPath = Path.Combine(qcFolderPath, entity.LeftImage);
                        if (File.Exists(finalPath))
                        {
                            var img   = File.ReadAllBytes(finalPath);
                            var img64 = Convert.ToBase64String(img);
                            obj["left_image"] = img64;
                        }
                    }
                    if (entity.RightImage != null)
                    {
                        var finalPath = Path.Combine(qcFolderPath, entity.RightImage);
                        if (File.Exists(finalPath))
                        {
                            var img   = File.ReadAllBytes(finalPath);
                            var img64 = Convert.ToBase64String(img);
                            obj["right_image"] = img64;
                        }
                    }
                    if (entity.SideImages != null)
                    {
                        var sideImages    = JsonConvert.DeserializeObject <IEnumerable <string> >(entity.SideImages);
                        var sideImagesB64 = new List <string>();
                        obj["side_images"] = sideImagesB64;
                        foreach (var iPath in sideImages)
                        {
                            var fullPath = fileService.GetFilePath(qcFolderPath, null, iPath).Item2;
                            if (File.Exists(fullPath))
                            {
                                var img   = File.ReadAllBytes(fullPath);
                                var img64 = Convert.ToBase64String(img);
                                sideImagesB64.Add(img64);
                            }
                        }
                    }
                }
                break;
                }
            }
            return(obj);
        }
 public QCEvent CreateQCEvent(QCEvent entity)
 {
     PrepareCreate(entity);
     return(context.QCEvent.Add(entity).Entity);
 }
 protected void PrepareCreate(QCEvent entity)
 {
     entity.LastUpdated = entity.CreatedTime;
 }
 public ValidationData ValidateDeleteQCEvent(ClaimsPrincipal principal,
                                             QCEvent entity)
 {
     return(new ValidationData());
 }
 public QCEvent DeleteQCEvent(QCEvent entity)
 {
     return(context.QCEvent.Remove(entity).Entity);
 }
        public void ProduceEventToKafkaServer(IProducer <Null, string> producer, QCEvent entity,
                                              DeviceConfig currentConfig, string dataFolder, string statePath)
        {
            var    mess = new Message <Null, string>();
            string leftImgB64 = null; string rightImgB64 = null; List <string> sideImagesB64 = null;
            var    imgPath = Path.Combine(dataFolder, entity.LeftImage);

            if (File.Exists(imgPath))
            {
                var img = File.ReadAllBytes(imgPath);
                leftImgB64 = Convert.ToBase64String(img);
            }
            imgPath = Path.Combine(dataFolder, entity.RightImage);
            if (File.Exists(imgPath))
            {
                var img = File.ReadAllBytes(imgPath);
                rightImgB64 = Convert.ToBase64String(img);
            }
            var sideImages = entity.SideImages == null ? null :
                             JsonConvert.DeserializeObject <IEnumerable <string> >(entity.SideImages);

            if (sideImages != null && sideImages.Count() > 0)
            {
                sideImagesB64 = new List <string>();
                foreach (var iPath in sideImages)
                {
                    imgPath = Path.Combine(dataFolder, iPath);
                }
                if (File.Exists(imgPath))
                {
                    var img = File.ReadAllBytes(imgPath);
                    var b64 = Convert.ToBase64String(img);
                    sideImagesB64.Add(b64);
                }
            }
            var details = entity.Details.Select(o => new QCEventDetailMessage
            {
                Id           = o.Id,
                QCDefectCode = o.DefectTypeCode
            }).ToList();

            mess.Value = JsonConvert.SerializeObject(new QCEventMessage
            {
                Id            = entity.Id,
                CreatedTime   = entity.CreatedTime,
                Identifier    = currentConfig.Identifier,
                LeftB64Image  = leftImgB64,
                RightB64Image = rightImgB64,
                SideB64Images = sideImagesB64,
                Details       = details,
                LeftImage     = entity.LeftImage,
                RightImage    = entity.RightImage,
                SideImages    = entity.SideImages == null ? null :
                                JsonConvert.DeserializeObject <IList <string> >(entity.SideImages)
            });
            producer.Produce(Kafka.Constants.KafkaTopic.TOPIC_QC_EVENT, mess, report =>
            {
                if (report.Status == PersistenceStatus.Persisted)
                {
                    State.Instance.LastEventTime = entity.CreatedTime;
                    SaveCurrentState(statePath);
                }
            });
        }