Beispiel #1
0
        /// <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
            {
                MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "get_mt_pm", session);
                whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                whMsg.Properties.Write("PM_Cur_O", new object());

                CorrelationContext context;

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

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

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

                    VocollectMessagePart responsePart = new VocollectMessagePart();

                    responsePart.Properties.Write("PackNumber", part.Properties.Read("PMTYPID"));
                    responsePart.Properties.Write("PackDescription", part.Properties.Read("PMNAME"));

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

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

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

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
Beispiel #2
0
        private MessagePart CreateResponsePart(MessagePart part, VocollectSession session)
        {
            MessagePart responsePart = new VocollectMessagePart();

            responsePart.Properties.Write("SystemContainerId", part.Properties.ReadAsString("SEQNUM").PadLeft(session.ReadAsInt("VOICE_MIN_DIGITS_CARCODE"), '0'));
            responsePart.Properties.Write("ScannedContainerValidation", part.Properties.Read("CARCODE"));

            string carCode = part.Properties.ReadAsString("CARCODE");

            if (carCode.Length > session.ReadAsDecimal("VOICE_MIN_DIGITS_CARCODE"))
            {
                carCode = carCode.Substring(carCode.Length - session.ReadAsInt("VOICE_MIN_DIGITS_CARCODE"), session.ReadAsInt("VOICE_MIN_DIGITS_CARCODE"));
            }
            else if (carCode.Length < session.ReadAsInt("VOICE_MIN_DIGITS_CARCODE"))
            {
                carCode = carCode.PadLeft(session.ReadAsInt("VOICE_MIN_DIGITS_CARCODE"), '0');
            }

            responsePart.Properties.Write("SpokenContainerValidation", carCode);
            responsePart.Properties.Write("WorkId", "1");
            responsePart.Properties.Write("TargetContainer", "");
            responsePart.Properties.Write("ContainerStatus", "O");
            responsePart.Properties.Write("Printed", "1");
            responsePart.Properties.Write("ContainerType", part.Properties.Read("CARNAME"));
            responsePart.Properties.Write("Area", part.Properties.Read("WSID"));
            responsePart.Properties.Write("Location", part.Properties.Read("WPADR"));
            responsePart.Properties.Write("CustomerNumber", GetCotainerHashCode(part).ToString());
            responsePart.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
            responsePart.Properties.Write("Message", "");

            return(responsePart);
        }
        /// <summary>
        /// Creates an empty message part with the specified number of properties.
        /// </summary>
        /// <param name="propertyCount">The number of empty properties to create.</param>
        /// <returns>A <see cref="MessagePart"/> object.</returns>
        protected static MessagePart CreateEmptyMessagePart(int propertyCount)
        {
            MessagePart part = new VocollectMessagePart();

            for (int i = 0; i < propertyCount - 2; i++)
            {
                part.Properties.Write(i.ToString(), "");
            }

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

            return(part);
        }
        /// <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
            {
                MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "get_user_languagecode", session);
                whMsg.Properties.Write("EMPID_I", msg.Properties.ReadAsString("Operator"));
                whMsg.Properties.Write("NLANGCOD_O", "");

                CorrelationContext context;

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

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

                VocollectMessagePart part = new VocollectMessagePart();
                part.Properties.Write("BreakType", 1);
                part.Properties.Write("BreakDescription", GetCachedAlarmText("VOICEPICK014", languageCode));
                part.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
                part.Properties.Write("Message", "");

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

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

                throw;
            }
            finally
            {
                TransmitResponseMessage(responseMsg, session);
            }
        }
Beispiel #5
0
        /// <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
            {
                VocollectMessagePart part = new VocollectMessagePart();
                part.Properties.Write("LocationId", msg.Properties.ReadAsString("LocationId"));
                part.Properties.Write("PreAisleDirection", "");
                part.Properties.Write("Aisle", ((string)part.Properties.Read("WSID")).PadRight(3, ' '));
                part.Properties.Write("PostAisleDirection", "");
                part.Properties.Write("Slot", "");
                part.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
                part.Properties.Write("Message", "");

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

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

                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
            {
                MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "get_mt_pbcar_pbrow", session);
                whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                whMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                whMsg.Properties.Write("SEQNUM_I", TrimContainerId(msg.Properties.ReadAsString("ContainerId")));
                whMsg.Properties.Write("PBROW_Cur_O", new object());
                whMsg.Properties.Write("ALMID_O", "");

                CorrelationContext context;

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

                if (context.ResponseMessages[0].Parts.Count > 0)
                {
                    foreach (MessagePart part in context.ResponseMessages[0].Parts)
                    {
                        MessagePart responsePart = new VocollectMessagePart();

                        responsePart.Properties.Write("ContainerId", msg.Properties.Read("ContainerId"));
                        responsePart.Properties.Write("Description", part.Properties.Read("ARTNAME1"));
                        responsePart.Properties.Write("Quantity", part.Properties.Read("PICKQTY"));
                        responsePart.Properties.Write("Location", "");
                        responsePart.Properties.Write("PickTime", "");
                        responsePart.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
                        responsePart.Properties.Write("Message", "");

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

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

                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
            {
                int addQty = msg.Properties.ReadAsInt("PackagingQty");

                CorrelationContext context = null;

                switch (msg.Properties.ReadAsString("PackagingTransaction"))
                {
                case "0":

                    MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "get_mt_pbcarpm", session);
                    whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                    whMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                    whMsg.Properties.Write("SEQNUM_I", TrimContainerId(msg.Properties.ReadAsString("ContainerId")));
                    whMsg.Properties.Write("PBCARPM_Cur_O", new object());
                    whMsg.Properties.Write("ALMID_O", "");

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

                    if (context.ResponseMessages[0].Parts.Count > 0)
                    {
                        foreach (MessagePart part in context.ResponseMessages[0].Parts)
                        {
                            VocollectMessagePart responsePart = new VocollectMessagePart();

                            responsePart.Properties.Write("PackNumber", part.Properties.Read("PMTYPID"));
                            responsePart.Properties.Write("PackQuantity", part.Properties.Read("ADDQTY"));
                            responsePart.Properties.Write("ErrorCode", VocollectErrorCodeNoError);
                            responsePart.Properties.Write("Message", "");

                            responseMsg.Parts.Add(responsePart);
                        }
                    }
                    else
                    {
                        MessagePart part = CreateEmptyMessagePart(4);
                        part.Properties.Write("ErrorCode", VocollectErrorCodeNoPackaging);
                        part.Properties.Write("Message", "");
                        responseMsg.Parts.Add(part);
                    }

                    break;

                case "1":

                    whMsg = CreateRequestMessage("wlvoicepick", "modify_pm", session);
                    whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                    whMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                    whMsg.Properties.Write("SEQNUM_I", TrimContainerId(msg.Properties.ReadAsString("ContainerId")));
                    whMsg.Properties.Write("PMTYPID_I", msg.Properties.Read("PackNumber").ToString());
                    whMsg.Properties.Write("ADDQTY_I", addQty);
                    whMsg.Properties.Write("EMPID_I", session.ReadAsString("EMPID"));
                    whMsg.Properties.Write("NEWQTY_O", 0);
                    whMsg.Properties.Write("ALMID_O", "");

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

                    goto case "0";

                case "2":

                    addQty = -addQty;

                    goto case "1";
                }
            }
            catch (WarehouseAdapterException ex)
            {
                responseMsg.Parts.Clear();
                MessagePart part = CreateEmptyMessagePart(4);

                if (ex.AlarmId == "PBCARPM003")
                {
                    part.Properties.Write("ErrorCode", VocollectErrorCodeNoPackaging);
                }
                else if (ex.AlarmId == "PMTYP001")
                {
                    part.Properties.Write("ErrorCode", VocollectErrorCodeNoPackaging);
                }
                else
                {
                    part.Properties.Write("ErrorCode", WarehouseAlarm);
                }

                part.Properties.Write("Message", ex.Message);
                responseMsg.Parts.Add(part);

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

                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(session.ReadAsString("TUID")))
                    {
                        MultiPartMessage tuMsg = CreateRequestMessage("wlvoicepick", "disconnect_ter_from_pt", session);
                        tuMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                        tuMsg.Properties.Write("TUID_I", session.ReadAsString("TUID"));
                        tuMsg.Properties.Write("KEEP_ONLINE_I", "0");
                        tuMsg.Properties.Write("ALMID_O", "");

                        MessageEngine.Instance.TransmitRequestMessage(tuMsg, tuMsg.MessageId, out context);
                    }

                    MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "connect_ter_to_pt", session);
                    whMsg.Properties.Write("TUID_I", msg.Properties.ReadAsString("VehicleId"));
                    whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                    whMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                    whMsg.Properties.Write("TUID_O", "");
                    whMsg.Properties.Write("ALMID_O", "");

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

                    MessagePart responsePart = new VocollectMessagePart();

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

                    responseMsg.Parts.Add(responsePart);

                    session.Write("TUID", context.ResponseMessages[0].Properties.ReadAsString("TUID_O"));
                    session.Write("UPDATE_PBCAR", "1");

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

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

                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
            {
                CorrelationContext context;

                if (!string.IsNullOrEmpty(session.ReadAsString("PBROWID")))
                {
                    /* Refresh rows in status Registrated before the shorts pass */
                    MultiPartMessage refreshMsg = CreateRequestMessage("wlvoicepick", "refresh_pickorderrows", session);
                    refreshMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                    refreshMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                    refreshMsg.Properties.Write("EMPID_I", session.ReadAsString("EMPID"));
                    refreshMsg.Properties.Write("ALMID_O", "");

                    MessageEngine.Instance.TransmitRequestMessage(refreshMsg, refreshMsg.MessageId, out context);
                }

                MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "get_mt_pbrow", session);
                whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                whMsg.Properties.Write("PBHEADID_I", session.ReadAsString("PBHEADID"));
                whMsg.Properties.Write("NLANGCOD_I", session.ReadAsString("NLANGCOD"));
                whMsg.Properties.Write("PBROW_Cur_O", new object());
                whMsg.Properties.Write("ALMID_O", "");

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

                PropertyCollection properties = context.ResponseMessages[0].Parts[0].Properties;

                string prevContainer = "";
                string prevLocation  = "";
                int    rowCount      = 0;

                foreach (MessagePart part in context.ResponseMessages[0].Parts)
                {
                    string status  = null;
                    double pickQty = 0;

                    if ((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Finished) &&
                        (part.Properties.ReadAsDouble("PICKQTY") < part.Properties.ReadAsDouble("ORDQTY")))
                    {
                        rowCount++;
                        status  = "G"; //Go back  for shortage
                        pickQty = part.Properties.ReadAsDouble("ORDQTY") - part.Properties.ReadAsDouble("PICKQTY");
                    }
                    else if (((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Started) ||
                              (part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Registrated)) &&
                             (!string.IsNullOrEmpty(session.ReadAsString("PBROWID"))))
                    {
                        rowCount++;
                        status  = "S"; //Skipped
                        pickQty = part.Properties.ReadAsDouble("ORDQTY");
                    }
                    else if ((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Started) ||
                             (part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Registrated))
                    {
                        rowCount++;
                        status  = "N"; //Not picked
                        pickQty = part.Properties.ReadAsDouble("ORDQTY");
                    }
                    else
                    {
                        status = "P"; //Picked
                    }
                    MessagePart responsePart = new VocollectMessagePart();

                    responsePart.Properties.Write("Status", status);
                    responsePart.Properties.Write("BaseItem", "0");
                    responsePart.Properties.Write("Sequence", part.Properties.Read("PBROWID"));

                    /* Check if multiple picks for same location and pick load carrier */
                    if ((prevLocation == part.Properties.ReadAsString("PPKEY")) &&
                        (prevContainer == part.Properties.ReadAsString("SEQNUM")) &&
                        (session.ReadAsInt("NOCARS") == 1))
                    {
                        /* Append PBROWID to make location unique to prevent terminal from merging the lines */
                        responsePart.Properties.Write("LocationId", string.Format("{0}|{1}|{2}", part.Properties.Read("PPKEY"), part.Properties.ReadAsString("ITEID"), part.Properties.Read("PBROWID")));
                    }
                    else
                    {
                        /*Append PAKID to make location unique for each pick package. Will prevent terminal from merging different pick packages*/
                        responsePart.Properties.Write("LocationId", string.Format("{0}|{1}|{2}", part.Properties.Read("PPKEY"), part.Properties.ReadAsString("ITEID"), part.Properties.Read("PAKID")));
                    }

                    responsePart.Properties.Write("Region", "0");

                    /* VOICEPICK013 = 'Go to area {0}' */
                    string preAisle = GetCachedAlarmText("VOICEPICK013", session);
                    preAisle = string.Format(preAisle, part.Properties.ReadAsString("WSNAME").PadRight(35, ' '));
                    responsePart.Properties.Write("PreAisleDirection", preAisle);

                    responsePart.Properties.Write("Aisle", part.Properties.ReadAsString("AISLE").PadRight(3, ' '));
                    responsePart.Properties.Write("PostAisleDirection", "");

                    string slot = part.Properties.ReadAsString("WPADR");

                    string itemLoadId = part.Properties.ReadAsString("ITEID");

                    if (!string.IsNullOrEmpty(itemLoadId))
                    {
                        if (itemLoadId.Length > session.ReadAsInt("VOICE_DIGITS_ITEID"))
                        {
                            itemLoadId = itemLoadId.Substring(itemLoadId.Length - session.ReadAsInt("VOICE_DIGITS_ITEID"), session.ReadAsInt("VOICE_DIGITS_ITEID"));
                        }
                    }

                    if ((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Registrated) ||
                        (((part.Properties.ReadAsString("ITEVERIFY") == "1") || (part.Properties.ReadAsString("ITETRACE") == "1")) &&
                         (string.IsNullOrEmpty(part.Properties.ReadAsString("ITEID")))))
                    {
                        /* No item load found */
                        slot += "," + GetCachedAlarmText("VOICEPICK010", session);
                    }
                    else if (part.Properties.ReadAsString("ITEVERIFY") == "1")
                    {
                        /* Append verify item load id to slot */
                        slot += string.Format("," + GetCachedAlarmText("VOICEPICK008", session), itemLoadId);
                    }
                    else if (part.Properties.ReadAsString("ITEVERIFY") == "2")
                    {
                        /* Append verify lot to slot */
                        string lot = part.Properties.ReadAsString("PRODLOT");

                        if (!string.IsNullOrEmpty(lot))
                        {
                            if (lot.Length > session.ReadAsInt("VOICE_CHARS_PRODLOT"))
                            {
                                lot = lot.Substring(lot.Length - session.ReadAsInt("VOICE_CHARS_PRODLOT"), session.ReadAsInt("VOICE_CHARS_PRODLOT"));
                            }
                        }

                        slot += string.Format("," + GetCachedAlarmText("VOICEPICK017", session), lot);
                    }
                    else if (!string.IsNullOrEmpty(part.Properties.ReadAsString("ITEID")))
                    {
                        /* Append item load id to slot */
                        slot += string.Format("," + GetCachedAlarmText("VOICEPICK009", session), itemLoadId);
                    }

                    responsePart.Properties.Write("Slot", slot.PadRight(64, ' '));

                    responsePart.Properties.Write("QuantityToPick", pickQty);
                    responsePart.Properties.Write("UnitOfMeasure", part.Properties.ReadAsString("PAKNAME").Replace('"', ' '));
                    responsePart.Properties.Write("ItemNumber", part.Properties.Read("ARTID"));
                    responsePart.Properties.Write("VariableWeight", part.Properties.Read("MEASURE"));

                    /* Convert weight tolerances from per LUM to per package */
                    double baseQty = part.Properties.ReadAsDouble("BASEQTY");

                    if (string.IsNullOrEmpty(part.Properties.ReadAsString("MEASQTYLOTOL")))
                    {
                        responsePart.Properties.Write("VariableWeightMinimum", "000000.0000");
                    }
                    else
                    {
                        double weightMinimum = part.Properties.ReadAsDouble("MEASQTYLOTOL") * baseQty;
                        responsePart.Properties.Write("VariableWeightMinimum", weightMinimum);
                    }

                    if (string.IsNullOrEmpty(part.Properties.ReadAsString("MEASQTYUPTOL")))
                    {
                        responsePart.Properties.Write("VariableWeightMaximum", "999999.0000");
                    }
                    else
                    {
                        double weightMaximum = part.Properties.ReadAsDouble("MEASQTYUPTOL") * baseQty;
                        responsePart.Properties.Write("VariableWeightMaximum", weightMaximum);
                    }

                    responsePart.Properties.Write("QuantityPicked", "".PadLeft(5, '0'));

                    #region Check digits, product verification id and item load id

                    string checkDigits = part.Properties.ReadAsString("PPCODE");

                    if (part.Properties.ReadAsString("ITEVERIFY") == "1")
                    {
                        /* Verify pick location by item load id */

                        string verifyItemLoadId = part.Properties.ReadAsString("ITEID");

                        if (!string.IsNullOrEmpty(verifyItemLoadId))
                        {
                            if (verifyItemLoadId.Length > session.ReadAsInt("VOICE_MIN_DIGITS_ITEVERIFY"))
                            {
                                verifyItemLoadId = verifyItemLoadId.Substring(verifyItemLoadId.Length - session.ReadAsInt("VOICE_MIN_DIGITS_ITEVERIFY"), session.ReadAsInt("VOICE_MIN_DIGITS_ITEVERIFY"));
                            }
                        }

                        if ((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Registrated) ||
                            ((part.Properties.ReadAsString("ITEVERIFY") == "1") &&
                             (string.IsNullOrEmpty(part.Properties.ReadAsString("ITEID")))))
                        {
                            responsePart.Properties.Write("CheckDigits", "");
                            responsePart.Properties.Write("ScanProductId", part.Properties.ReadAsString("ITEID"));
                            responsePart.Properties.Write("SpokenProductId", "00000");
                        }
                        else
                        {
                            responsePart.Properties.Write("CheckDigits", "0");
                            responsePart.Properties.Write("ScanProductId", part.Properties.ReadAsString("ITEID"));
                            responsePart.Properties.Write("SpokenProductId", verifyItemLoadId);
                        }
                    }
                    else if (part.Properties.ReadAsString("ITEVERIFY") == "2")
                    {
                        /* Verify pick location by lot */

                        string verifyLot = part.Properties.ReadAsString("PRODLOT");

                        if (!string.IsNullOrEmpty(verifyLot))
                        {
                            if (verifyLot.Length > session.ReadAsInt("VOICE_MIN_CHARS_PRODLOTVERIFY"))
                            {
                                verifyLot = verifyLot.Substring(verifyLot.Length - session.ReadAsInt("VOICE_MIN_CHARS_PRODLOTVERIFY"), session.ReadAsInt("VOICE_MIN_CHARS_PRODLOTVERIFY"));
                            }
                        }

                        responsePart.Properties.Write("CheckDigits", "0");
                        responsePart.Properties.Write("ScanProductId", part.Properties.ReadAsString("PRODLOT"));
                        responsePart.Properties.Write("SpokenProductId", verifyLot);
                    }
                    else if ((part.Properties.ReadAsString("PPVERIFY") == PPVERIFY_ARTID) ||
                             (part.Properties.ReadAsString("PPVERIFY") == PPVERIFY_EANDUN))
                    {
                        /* Verify pick location by ARTID or EANDUN */

                        if (!string.IsNullOrEmpty(checkDigits))
                        {
                            if (checkDigits.Length > session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"))
                            {
                                checkDigits = checkDigits.Substring(checkDigits.Length - session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"), session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"));
                            }
                        }

                        responsePart.Properties.Write("CheckDigits", "0");

                        /* If the system hasn't found any item load dont verify anything */
                        if ((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Registrated) &&
                            (string.IsNullOrEmpty(part.Properties.ReadAsString("ITEID"))))
                        {
                            responsePart.Properties.Write("CheckDigits", "");
                        }

                        responsePart.Properties.Write("ScanProductId", checkDigits);
                        responsePart.Properties.Write("SpokenProductId", checkDigits);
                    }
                    else
                    {
                        /* Verify pick location by pick location code */

                        if (!string.IsNullOrEmpty(checkDigits))
                        {
                            if (checkDigits.Length > session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"))
                            {
                                checkDigits = checkDigits.Substring(checkDigits.Length - session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"), session.ReadAsInt("VOICE_MIN_DIGITS_PPCODE"));
                            }

                            long temp;

                            if (!long.TryParse(checkDigits, out temp))
                            {
                                checkDigits = "";
                            }
                        }

                        responsePart.Properties.Write("CheckDigits", checkDigits);
                        responsePart.Properties.Write("ScanProductId", "");
                        responsePart.Properties.Write("SpokenProductId", "");

                        /* If the system hasn't found any item load dont verify anything */
                        if (((part.Properties.ReadAsString("PBROWSTAT") == PBROWSTAT_Registrated) || (part.Properties.ReadAsString("ITETRACE") == "1")) &&
                            (string.IsNullOrEmpty(part.Properties.ReadAsString("ITEID"))))
                        {
                            responsePart.Properties.Write("CheckDigits", "");
                            responsePart.Properties.Write("ScanProductId", part.Properties.ReadAsString("ITEID"));
                            responsePart.Properties.Write("SpokenProductId", "00000");
                        }
                    }

                    #endregion

                    responsePart.Properties.Write("Description", part.Properties.ReadAsString("ARTNAME1").Replace('"', ' '));
                    responsePart.Properties.Write("Size", "");

                    if (part.Properties.ReadAsString("PPVERIFY") == PPVERIFY_EANDUN)
                    {
                        responsePart.Properties.Write("UniversalProductCode", part.Properties.Read("PPCODE"));
                    }
                    else
                    {
                        responsePart.Properties.Write("UniversalProductCode", "");
                    }

                    responsePart.Properties.Write("WorkId", "1");
                    responsePart.Properties.Write("DeliveryLocation", "");
                    responsePart.Properties.Write("Dummy", "");
                    responsePart.Properties.Write("Store", "");
                    responsePart.Properties.Write("CaseLabelCheckDigit", "");

                    responsePart.Properties.Write("TargetContainer", part.Properties.ReadAsString("SEQNUM").PadLeft(session.ReadAsInt("VOICE_MIN_DIGITS_CARCODE"), '0'));

                    if (part.Properties.ReadAsString("SERIAL") == "1")
                    {
                        responsePart.Properties.Write("CaptureLot", "1");
                        responsePart.Properties.Write("LotText", GetCachedAlarmText("VOICEPICK006", session));
                    }
                    else if ((part.Properties.ReadAsString("PRODLOT_VER") == "1") &&
                             (string.IsNullOrEmpty(part.Properties.ReadAsString("PRODLOTREQ"))))
                    {
                        responsePart.Properties.Write("CaptureLot", "1");
                        responsePart.Properties.Write("LotText", GetCachedAlarmText("VOICEPICK004", session));
                    }
                    else
                    {
                        responsePart.Properties.Write("CaptureLot", "0");
                        responsePart.Properties.Write("LotText", "");
                    }

                    responsePart.Properties.Write("PickMessage", part.Properties.ReadAsString("INSTRUCTIONS"));

                    string verifyLocation = "0";

                    if (session.ReadAsString("VOICE_VERIFY_PP_BALANCE") == "1")
                    {
                        verifyLocation = "1";
                    }
                    else if ((session.ReadAsString("VOICE_VERIFY_PP_BALANCE") == "2") &&
                             (status == "G"))
                    {
                        verifyLocation = "1";
                    }

                    responsePart.Properties.Write("VerifyLocation", verifyLocation);

                    responsePart.Properties.Write("CycleCount", "0");
                    responsePart.Properties.Write("CustomerId", PrTaskLUTContainer.GetCotainerHashCode(part));

                    if (part.Properties.ReadAsString("SERIAL") == "1")
                    {
                        responsePart.Properties.Write("PutLotPrompt", GetCachedAlarmText("VOICEPICK005", session));
                    }
                    else if (part.Properties.ReadAsString("PRODLOT_VER") == "1")
                    {
                        responsePart.Properties.Write("PutLotPrompt", GetCachedAlarmText("VOICEPICK003", session));
                    }
                    else
                    {
                        responsePart.Properties.Write("PutLotPrompt", "");
                    }

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

                    responseMsg.Parts.Add(responsePart);

                    prevLocation  = part.Properties.ReadAsString("PPKEY");
                    prevContainer = part.Properties.ReadAsString("SEQNUM");
                }

                //Reset session values
                session.Write("PBROW_COUNT", rowCount);
                session.Write("SPLIT_PBROWID", "");
                session.Write("SPLIT_STATUS", "0");
                session.Write("PREV_PPKEY", "");
                session.Write("RESTCOD", "");
                session.Write("PRODLOT", "");
                session.Write("PRODLOTQTY", 0d);
            }
            catch (WarehouseAdapterException ex)
            {
                responseMsg.Parts.Clear();
                MessagePart part = CreateEmptyMessagePart(35);
                part.Properties.Write("ErrorCode", WarehouseAlarm);
                part.Properties.Write("Message", ex.Message);
                responseMsg.Parts.Add(part);

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

                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);
            }
        }
Beispiel #11
0
        /// <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
            {
                MultiPartMessage whMsg = CreateRequestMessage("wlvoicepick", "get_mt_emp_pz", session);
                whMsg.Properties.Write("TERID_I", session.ReadAsString("TERID"));
                whMsg.Properties.Write("EMP_PZ_Cur_O", new object());
                whMsg.Properties.Write("ALMID_O", "");

                CorrelationContext context;

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

                foreach (MessagePart part in context.ResponseMessages[0].Parts)
                {
                    VocollectMessagePart responsePart = new VocollectMessagePart();

                    responsePart.Properties.Write("RegionNumber", part.Properties.Read("PZID"));
                    responsePart.Properties.Write("RegionName", part.Properties.Read("PZNAME"));

                    if (part.Properties.ReadAsString("FROM_TABLE") == "PZGRP")
                    {
                        responsePart.Properties.Write("GroupRegion", 1);
                    }
                    else
                    {
                        responsePart.Properties.Write("GroupRegion", 0);
                    }

                    if ((part.Properties.ReadAsString("PICKTRUCK") == "1") &&
                        (string.IsNullOrEmpty(session.ReadAsString("TUID"))))
                    {
                        responsePart.Properties.Write("UseVehicle", 1);
                    }
                    else
                    {
                        responsePart.Properties.Write("UseVehicle", 0);
                    }

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

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

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

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