Ejemplo n.º 1
0
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            /* Ignore ODR stored in flash output queue after terminal reset */
            if (session == null)
            {
                return;
            }

            using (TransactionScope transactionScope = new TransactionScope())
            {
                PrTaskLUTGetAssignment.RequestPickOrder(PickOrderHoldType.Temporarily, session);

                transactionScope.Complete();
            }
        }
        /// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage responseMsg = CreateResponseMessage(msg);

            responseMsg.Properties.Write("Interleave", 0);
            responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
            responseMsg.Properties.Write("Message", "");

            try
            {
                using (TransactionScope transactionScope = new TransactionScope())
                {
                    /* Fetch user's language code */
                    MultiPartMessage langMsg = CreateRequestMessage("wlvoicepick", "get_user_languagecode", session);
                    langMsg.Properties.Write("EMPID_I", msg.Properties.ReadAsString("Operator"));
                    langMsg.Properties.Write("NLANGCOD_O", "");

                    CorrelationContext context;

                    MessageEngine.Instance.TransmitRequestMessage(langMsg, langMsg.MessageId, out context);

                    string languageCode = context.ResponseMessages[0].Properties.ReadAsString("NLANGCOD_O");

                    AuthenticationProvider provider = new AuthenticationProvider();
                    provider.Initialize(msg.Properties.ReadAsString("Password"));

                    MultiPartMessage authMsg = CreateRequestMessage("wlvoicepick", "authenticate", session);
                    authMsg.Properties.Write("EMPID_I", msg.Properties.ReadAsString("Operator"));
                    authMsg.Properties.Write("SALT_I", provider.Salt);
                    authMsg.Properties.Write("DATA_I", provider.SessionData);
                    authMsg.Properties.Write("WHID_I", "");
                    authMsg.Properties.Write("COMPANY_ID_I", "");
                    authMsg.Properties.Write("PRODUCT_I", "VOICE");
                    authMsg.Properties.Write("TERID_I", msg.Properties.ReadAsString("SerialNumber"));
                    authMsg.Properties.Write("SESSION_DATA_O", "");
                    authMsg.Properties.Write("ALMID_O", "");
                    authMsg.Properties.Write("ALMTXT1_O", "");
                    authMsg.Properties.Write("ALMTXT2_O", "");
                    authMsg.Properties.Write("ALMTXT3_O", "");

                    /* Set language code since we do not yet have a session */
                    authMsg.Metadata.Write("LanguageCode", languageCode);

                    MessageEngine.Instance.TransmitRequestMessage(authMsg, authMsg.MessageId, out context);

                    string sessionData = context.ResponseMessages[0].Properties.ReadAsString("SESSION_DATA_O");

                    AuthenticationSession authenticationSession = provider.DecryptSession(sessionData);

                    MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "logon", session);
                    whMsg.Properties.Write("TERID_I", msg.Properties.ReadAsString("SerialNumber"));
                    whMsg.Properties.Write("EMPID_I", msg.Properties.ReadAsString("Operator"));
                    whMsg.Properties.Write("SESSIONID_I", authenticationSession.SessionId);
                    whMsg.Properties.Write("WHID_O", "");
                    whMsg.Properties.Write("NLANGCOD_O", "");
                    whMsg.Properties.Write("ALMID_O", "");

                    /* Set language code since we do not yet have a session */
                    whMsg.Metadata.Write("LanguageCode", languageCode);

                    MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                    //Create session object
                    session = SessionManager.Instance.CreateSession(msg.Properties.ReadAsString("SerialNumber"));

                    /* Clear session if already exists */
                    session.Clear();

                    //Set session variables
                    session.Write("TERID", msg.Properties.ReadAsString("SerialNumber"));
                    session.Write("WHID", context.ResponseMessages[0].Properties.Read("WHID_O"));
                    session.Write("NLANGCOD", context.ResponseMessages[0].Properties.Read("NLANGCOD_O"));
                    session.Write("EMPID", msg.Properties.ReadAsString("Operator"));
                    session.Write("TUID", "");
                    session.Write("PBHEADID", "");
                    session.Write("PZID", "");
                    session.Write("PZGRPID", "");
                    session.Write("ITEID", "");

                    try
                    {
                        //Check if there is a temporarily stopped pick order available
                        PrTaskLUTGetAssignment.RequestPickOrder(PickOrderHoldType.Temporarily, session);

                        responseMsg.Properties.Write("ErrorCode", ErrorTempInterruptedPickOrderFound);
                    }
                    catch (WarehouseAdapterException ex)
                    {
                        if (ex.AlarmId != "PBHEAD030" && ex.AlarmId != "PBHEAD057")
                        {
                            throw;
                        }
                    }

                    transactionScope.Complete();
                }
            }
            catch (WarehouseAdapterException ex)
            {
                responseMsg.Properties.Write("ErrorCode", WarehouseAlarm);
                responseMsg.Properties.Write("Message", ex.Message);

                throw;
            }
            catch (Exception)
            {
                responseMsg.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                responseMsg.Properties.Write("Message", GetCriticalErrorMessageText(msg));

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
        /// <summary>
        /// Invokes the subscriber.
        /// </summary>
        /// <param name="msg">A reference to the subscribed message.</param>
        /// <param name="session">The current <see cref="VocollectSession"/> object.</param>
        /// <exception cref="WarehouseAdapterException">
        /// </exception>
        /// <exception cref="MessageEngineException">
        /// </exception>
        public override void Invoke(MultiPartMessage msg, VocollectSession session)
        {
            MultiPartMessage responseMsg = CreateResponseMessage(msg);

            try
            {
                using (TransactionScope transactionScope = new TransactionScope())
                {
                    CorrelationContext context;

                    if (!string.IsNullOrEmpty(msg.Properties.ReadAsString("RegionNumber")))
                    {
                        //Check if region is a pick zone or a pick zone group
                        MultiPartMessage pzMsg = CreateRequestMessage("wlvoicepick", "select_zone_or_group", session);
                        pzMsg.Properties.Write("TERID_I", msg.Properties.ReadAsString("SerialNumber"));
                        pzMsg.Properties.Write("PZID_I", msg.Properties.ReadAsString("RegionNumber"));
                        pzMsg.Properties.Write("EMPID_I", msg.Properties.ReadAsString("Operator"));
                        pzMsg.Properties.Write("WHID_I", session.ReadAsString("WHID"));
                        pzMsg.Properties.Write("TYPE_O", "");
                        pzMsg.Properties.Write("ALMID_O", "");

                        MessageEngine.Instance.TransmitRequestMessage(pzMsg, pzMsg.MessageId, out context);

                        if (context.ResponseMessages[0].Properties.ReadAsString("TYPE_O") == "PZ")
                        {
                            session.Write("PZID", msg.Properties.ReadAsString("RegionNumber"));
                            session.Write("PZGRPID", "");
                        }
                        else
                        {
                            session.Write("PZID", "");
                            session.Write("PZGRPID", msg.Properties.ReadAsString("RegionNumber"));
                        }
                    }

                    MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "get_mt_restcod", session);
                    whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                    whMsg.Properties.Write("NLANGCOD_I", session.ReadAsString("NLANGCOD"));
                    whMsg.Properties.Write("RESTCOD_Cur_O", new object());
                    whMsg.Properties.Write("WHID_I", session.ReadAsString("WHID"));
                    whMsg.Properties.Write("PZID_I", session.ReadAsString("PZID"));

                    MessageEngine.Instance.TransmitRequestMessage(whMsg, whMsg.MessageId, out context);

                    foreach (MessagePart part in context.ResponseMessages[0].Parts)
                    {
                        int temp;

                        /* Code must be numeric in order to be valid */
                        if (!int.TryParse(part.Properties.ReadAsString("OLACOD"), out temp))
                        {
                            continue;
                        }

                        MessagePart responsePart = new VocollectMessagePart();

                        responsePart.Properties.Write("DiscrepancyCode", part.Properties.Read("OLACOD"));
                        responsePart.Properties.Write("DiscrepancyCodeDescription", part.Properties.Read("RESTCODTXT"));

                        if (part.Properties.ReadAsString("AQTYDISC") == AqtyDiscPositive)
                        {
                            responsePart.Properties.Write("AllowOverpick", 1);
                        }
                        else if (part.Properties.ReadAsString("AQTYDISC") == AqtyDiscNegative)
                        {
                            responsePart.Properties.Write("AllowOverpick", 0);
                        }
                        else
                        {
                            continue;
                        }

                        responsePart.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
                        responsePart.Properties.Write("Message", "");

                        responseMsg.Parts.Add(responsePart);
                    }

                    if (string.IsNullOrEmpty(session.ReadAsString("PBHEADID")))
                    {
                        try
                        {
                            PrTaskLUTGetAssignment.RequestPickOrder(PickOrderHoldType.Definitely, session);

                            if (responseMsg.Parts.Count == 0)
                            {
                                MessagePart part = CreateEmptyMessagePart(5);
                                responseMsg.Parts.Add(part);
                            }

                            responseMsg.Parts[0].Properties.Write("ErrorCode", ErrorDefinitelyStoppedPickOrderFound);
                        }
                        catch (WarehouseAdapterException ex)
                        {
                            if (ex.AlarmId != "PBHEAD030" && ex.AlarmId != "PBHEAD057")
                            {
                                throw;
                            }
                        }
                    }

                    transactionScope.Complete();
                }
            }
            catch (WarehouseAdapterException ex)
            {
                responseMsg.Parts.Clear();
                MessagePart part = CreateEmptyMessagePart(5);
                part.Properties.Write("ErrorCode", WarehouseAlarm);
                part.Properties.Write("Message", ex.Message);
                responseMsg.Parts.Add(part);

                throw;
            }
            catch (Exception)
            {
                responseMsg.Parts.Clear();
                MessagePart part = CreateEmptyMessagePart(5);
                part.Properties.Write("ErrorCode", VocollectErrorCodeCritialError);
                part.Properties.Write("Message", GetCriticalErrorMessageText(msg));
                responseMsg.Parts.Add(part);

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }