/// <summary>
        /// 上载报文(到QP)
        /// </summary>
        /// <param name="keyValue">激活码</param>
        /// <param name="machineCode">机器代码</param>
        /// <param name="cusCiqNo">关检关联号(可选),如果没有填空字符</param>
        /// <param name="msgXml">消息</param>
        /// <returns></returns>
        public MesReceipt SendMessage(string keyValue, string machineCode, string cusCiqNo, string msgXml)
        {
            var       receipt   = new MesReceipt();
            LogHelper logHelper = LogHelper.GetInstance();

            try
            {
                CusCiqNoInfo cusCiqNoInfo = new CusCiqNoInfo {
                    CusCiqNo = cusCiqNo
                };

                var cusDataMsg = new CusDataMsg {
                    KeyValue = keyValue, MachineCode = machineCode, MessageXml = msgXml, CusCiqNo = cusCiqNoInfo
                };
                IMessageDataHelper dataHelper = DataHelperFactory.GetMessageDataHelper();
                //检查激活码
                if (!Utility.CheckKey(dataHelper.GetKeyInfo(keyValue, machineCode)))
                {
                    receipt.Status  = "003";
                    receipt.Message = GetErrInfo(Context.ErrKeyValueInvalid, Context.ErrKeyValueInvalidId);
                    return(receipt);
                }
                cusDataMsg    = Utility.FormatCusDataMsg(cusDataMsg, dataHelper.GetMaxTcsCurrentId(), ConfigInfo.TscIdHead, ConfigInfo.DocumentNo);
                receipt.RDate = DateTime.Now.ToString("yyyyMMddHHmmss");
                DeclHelper      declHelper = new DeclHelper();
                DeclEnvelopHead msgHeader  = declHelper.GetEnvelopHeader(msgXml);
                #region 生成TCS报文
                XDocEntity tmpDoc    = ConfigInfo.GetTemplateDocEntity();
                TcsHelper  tcsHelper = new TcsHelper();
                //保存报文
                XDocument tcsDoc = tcsHelper.GenerateTcsXDoc(tmpDoc, cusDataMsg);
                tcsDoc.Save(GetFileName(ConfigInfo.Path));
                #endregion
                #region 报文落地数据库
                cusDataMsg.TcsMessageXml = tcsDoc.ToString();
                cusDataMsg.DeclTime      = DateTime.Now;
                cusDataMsg.MsgGuid       = msgHeader.MsgGuid;
                cusDataMsg.Sendtime      = msgHeader.SendTime;
                dataHelper.SaveMessageInfo(cusDataMsg);
                #endregion

                receipt.Status   = "000";
                receipt.Message  = string.Empty;
                receipt.MessagID = cusDataMsg.TaskId;

                //记录操作日志
                logHelper.LogOperation(string.Format("SendMessage 上载报文(到QP),KeyValue:{0},Machinecode:{1},CusCiqNo:{2}",
                                                     keyValue, machineCode, cusCiqNo), Context.SendMessageEventId, "SendMessage", keyValue);
                return(receipt);
            }
            catch (Exception ex)
            {
                receipt.Status  = "001";
                receipt.Message = GetErrInfo(Context.ErrSendMessage, Context.SendMessageEventId);
                logHelper.LogErrInfo(ex.Message, Context.SendMessageEventId, "SendMessage", keyValue, msgXml);
                return(receipt);
            }
        }
        /// <summary>
        /// 获取关检关联号(16位)
        /// </summary>
        /// <param name="ieFlag">进出口标识,1为进口,0为出口</param>
        /// <param name="locationCode">现场代码(4位)</param>
        /// <returns>关检关联号(16位)</returns>
        public string GetCusCiqNo(string ieFlag, string locationCode)
        {
            LogHelper logHelper = LogHelper.GetInstance();

            try
            {
                var cusCiqNo = new CusCiqNoInfo()
                {
                    IeFlag = ieFlag, LocationCode = locationCode, CusCiqNo = string.Empty
                };
                if (!new EntityValidator <CusCiqNoInfo>().Validate(cusCiqNo))
                {
                    throw new Exception(Context.ErrIeFlagOrLocalCodeInValid);
                }
                IPreserveDataHelper dataHelper = DataHelperFactory.GetPreserveDataHelper();
                int    index    = dataHelper.GetCusCiqIndex(cusCiqNo.IeFlag, cusCiqNo.LocationCode);
                string indexStr = index.ToString();
                cusCiqNo.CusCiqNo = string.Format("{0}{1}{2}{3}", ieFlag, DateTime.Now.ToString("yyMMdd"), locationCode, indexStr.PadLeft(5, '0'));
                //记录操作日志
                logHelper.LogOperation(string.Format("GetCusCiqNo 获取关检关联号,IeFlag:{0},LocationCode:{1},CusCiqNo:{2}",
                                                     ieFlag, locationCode, cusCiqNo.CusCiqNo), Context.GetCusCiqNoEventId, "GetCusCiqNo");
                if (ConfigInfo.DeclType == 0 && ieFlag == "1")
                {
                    throw new Exception("目前只允许出口业务类型");
                }
                if (ConfigInfo.DeclType == 1 && ieFlag == "0")
                {
                    throw new Exception("目前只允许进口业务类型");
                }

                return(cusCiqNo.CusCiqNo);
            }
            catch (Exception ex)
            {
                logHelper.LogErrInfo(ex.Message, Context.GetCusCiqNoEventId, "GetCusCiqNo");
                return(GetErrInfo(Context.ErrGetCusCiqNo, Context.GetCusCiqNoEventId));
            }
        }
        /// <summary>
        /// 上传报关和报检数据(暂存数据)
        /// </summary>
        /// <param name="keyValue">激活码</param>
        /// <param name="machineCode">机器代码</param>
        /// <param name="ieFlag">进出口标识,1为进口,0为出口</param>
        /// <param name="locationCode">现场代码(4位)</param>
        /// <param name="cusCiqNo">关检关联号</param>
        /// <param name="status">数据状态(0,暂存;1,报检;2,上载QP;3,申报)</param>
        /// <param name="cusMsgXml">报关数据报文</param>
        /// <param name="ciqMsgXml">报检数据报文</param>
        /// <returns>返回实体消息</returns>
        public SaveModel UploadAllData(string keyValue,
                                       string machineCode, string ieFlag, string locationCode, string cusCiqNo, int status, string cusMsgXml, string ciqMsgXml)
        {
            CusCiqNoInfo cusCiqNoInfo = new CusCiqNoInfo {
                CusCiqNo = cusCiqNo, IeFlag = ieFlag, LocationCode = locationCode
            };

            if (!new EntityValidator <CusCiqNoInfo>().Validate(cusCiqNoInfo))
            {
                throw new Exception(Context.ErrIeFlagOrLocalCodeInValid);
            }
            SaveModel saveModel = new SaveModel()
            {
                CusCiqNo = cusCiqNo, Password = string.Empty, IsSuccess = false
            };
            LogHelper logHelper = LogHelper.GetInstance();

            try
            {
                IMessageDataHelper msgDataHelper = DataHelperFactory.GetMessageDataHelper();
                //检查激活码是否有效
                if (!Utility.CheckKey(msgDataHelper.GetKeyInfo(keyValue, machineCode)))
                {
                    saveModel.Message = GetErrInfo(Context.ErrKeyValueInvalid, Context.ErrKeyValueInvalidId);;
                    return(saveModel);
                }

                PreCusData preData = new PreCusData
                {
                    CusCiqNoInfo = cusCiqNoInfo,
                    KeyValue     = keyValue,
                    MachineCode  = machineCode,
                    CusMsgXml    = cusMsgXml,
                    CiqMsgXml    = ciqMsgXml,
                    UpdateTime   = DateTime.Now,
                    Password     = Utility.GetRandomNumString(6)
                };
                IPreserveDataHelper preDataHelper = DataHelperFactory.GetPreserveDataHelper();
                //如果暂存成功
                if (preDataHelper.UploadPreCusData(preData) == 1)
                {
                    preData.Password    = preDataHelper.GetPasswordByCusCiqNo(cusCiqNo);
                    saveModel.IsSuccess = true;
                    saveModel.Message   = string.Empty;
                    saveModel.Password  = preData.Password;
                }
                if (status > 0)
                {
                    DeclCusData declData = new DeclCusData
                    {
                        CusCiqNoInfo = preData.CusCiqNoInfo,
                        CiqMsgXml    = preData.CiqMsgXml,
                        CusMsgXml    = preData.CusMsgXml,
                        Status       = (DeclCusData.SaveType)status
                    };
                    preDataHelper.UploadDeclData(declData);
                }
            }
            catch (Exception ex)
            {
                saveModel.Message = GetErrInfo(Context.ErrUploadAllData, Context.UploadAllDataEventId);
                logHelper.LogErrInfo(ex.Message, Context.UploadAllDataEventId, "UploadAllData", keyValue);
            }
            return(saveModel);
        }