/// <summary>
        ///     答题操作
        /// </summary>
        /// <param name="tq"></param>
        private void OperationQuestion(T_TradeQuestion tq)
        {
            //"TellerSystem.Client.vshost"
            //if (!CommonFunction.ProcessIsExist(new[] { "Platform.Launcher.exe", "Platform.Launcher.vshost.exe" }))
            //{
            //    Messenger.Default.Send("请先启动综合业务前端系统");
            //    return;
            //}

            // 如果已经是完成状态说明需要重做,就要先清除原来的答案
            if (tq.State == QuestionState.Complete)
            {
                //
                bool flag = false;
                Messenger.Default.Send(new DialogMessage
                                           ("请选择\n\n 是:重做并删除原答案【注意:原交易本身不允许重新做的,请勿选择此选项】\n否:重做不删除原答案", result1 =>
                {
                    // 删除此题原答案
                    if (result1 == MessageBoxResult.Yes)
                    {
                        flag = true;

                        //
                        bool result = ExamHandle.TryExecute(Sql.DELETE_ANSWER, new[] { PaperData.Key, tq.Key });
                        if (!result)
                        {
                            Messenger.Default.Send("删除原答案时出现异常");
                            return;
                        }

                        // 删除原答案后需要重置此题状态为未做
                        tq.State = QuestionState.Normal;
                    }
                    // 保留原题已经做过的答案
                    else if (result1 == MessageBoxResult.No)
                    {
                        flag = true;
                    }
                    //不重做此题
                    else
                    {
                    }
                }
                                           )
                {
                    Button = MessageBoxButton.YesNoCancel, Caption = "提示", Icon = MessageBoxImage.Question
                });

                if (!flag)
                {
                    return;
                }
            }
            Dictionary <string, List <string> > dicQuAnswer = new Dictionary <string, List <string> >();
            var resultQuTrades = ExamHandle.TryGetData(@"SELECT F_KEY,F_MENU_NO FROM T_TRADE_STA WHERE F_QUESTION_KEY =?", tq.Key);

            foreach (DataRow item in resultQuTrades.Rows)
            {
                var           resultTradeFields = ExamHandle.TryGetData(@"SELECT F_FLDCODE FROM T_FLD_STA WHERE F_TRADESTA_KEY =? AND F_LOCATION='主界面' ", item[0].ToString());
                List <string> listString        = new List <string>();
                foreach (DataRow ele in resultTradeFields.Rows)
                {
                    listString.Add(ele[0].ToString());
                }
                dicQuAnswer.Add(item[1].ToString(), listString);
            }
            string strQuAnswer = string.Empty;

            foreach (var item in dicQuAnswer)
            {
                strQuAnswer += item.Key + "=*=";
                foreach (var ele in item.Value)
                {
                    strQuAnswer += ele + ";*;";
                }
                strQuAnswer += "]*]";
            }
            // 与前端系统约定A是启动考试模式
            string[] strArray = new string[] {
                //0-题目key
                tq.Key,
                //1-题干信息
                tq.Index.ToString() + "、" + tq.TitleView,
                //2-此刻时间
                ExamHandle.GetNowDateTime().ToString(),
                //3-开始时间
                PaperData.BeginTime.ToString(),
                //4-考试时长(秒)
                CurrentExam.Exam_Space.ToString(),
                //5-剩余时长
                ExamClock.Second.ToString(),
                //6-主界面采分点
                strQuAnswer
            };
            bool istrue = _messageObject.SendMessage(strArray, CommniucationFlag.A);

            if (!istrue)
            {
                Messenger.Default.Send("向前端系统发送信息失败!");
                return;
            }

            tq.Answer.Clear(); // 数据库删除了,本地实例也要删除

            Messenger.Default.Send(Visibility.Collapsed, MessageToken.PaperVisibilityToken);
        }
        /// <summary>
        ///     收到前端系统发过来的消息
        /// </summary>
        /// <param name="flag"></param>
        /// <param name="receiveString"></param>
        private void messageObject_ReceiveMessage(CommniucationFlag flag, string[] receiveString)
        {
            switch (flag)
            {
            case CommniucationFlag.A:
            {
                if (receiveString.Length != 5)
                {
                    Messenger.Default.Send("从前端系统参数传递过来的参数错误。");
                    return;
                }

                string questionkey = receiveString[0];    // 题主键
                string MenuNo      = receiveString[1];    // 交易号
                string serialid    = receiveString[2];    // 前端系统交易的前端流水号

                /*Temp0918
                 * string ciphertext1 = MessageDeal(receiveString[3].Split(new string[] { "@KSXT#" }, StringSplitOptions.RemoveEmptyEntries)[0]); // 提交报文
                 * string ciphertext2 = MessageDeal(receiveString[4].Split(new string[] { "@KSXT#" }, StringSplitOptions.RemoveEmptyEntries)[0]); // 返回报文
                 *
                 * var msg1 = new TellerSystemMessage(ciphertext1);
                 * var msg2 = new TellerSystemMessage(ciphertext2);
                 *
                 * // 取附件file1是发送报文的附件,file2是接收报文的附件
                 * var file1 = new TellerSystemFileData(receiveString[3].Split(new string[] { "@KSXT#" }, StringSplitOptions.None)[1]);
                 * var file2 = new TellerSystemFileData(receiveString[4].Split(new string[] { "@KSXT#" }, StringSplitOptions.None)[1]);
                 */

                Dictionary <string, string> DicMainPageData = new Dictionary <string, string>();
                Dictionary <string, Dictionary <string, string> > DicChildrenPageData = new Dictionary <string, Dictionary <string, string> >();
                Dictionary <string, Dictionary <string, string> > DicPrintPageData    = new Dictionary <string, Dictionary <string, string> >();
                {
                    var arraySendData = receiveString[3].Split(new string[] { "%*%" }, StringSplitOptions.RemoveEmptyEntries);
                    if (arraySendData != null && arraySendData.Length == 2)
                    {
                        var arrayMainPageData = arraySendData[0].Split(new string[] { "]*]" }, StringSplitOptions.RemoveEmptyEntries);
                        if (arrayMainPageData != null && arrayMainPageData.Length > 0)
                        {
                            foreach (var item in arrayMainPageData)
                            {
                                var arrayItem = item.Split(new string[] { "=*=" }, StringSplitOptions.None);
                                var tempKey   = arrayItem[0];
                                var tempValue = arrayItem[1];
                                if (!DicMainPageData.Keys.Contains(tempKey))
                                {
                                    DicMainPageData.Add(tempKey, tempValue);
                                }
                            }
                        }
                        var arrayChildrenPageData = arraySendData[1].Split(new string[] { "#*#" }, StringSplitOptions.RemoveEmptyEntries);

                        if (arrayChildrenPageData != null && arraySendData.Length > 0)
                        {
                            foreach (var OneChildPageData in arrayChildrenPageData)
                            {
                                var arrayOneChildPageData = OneChildPageData.Split(new string[] { ":*:" }, StringSplitOptions.RemoveEmptyEntries);
                                if (arrayOneChildPageData != null && arrayOneChildPageData.Length == 2)
                                {
                                    var ChildPageIndex                = arrayOneChildPageData[0];
                                    var OneChildPageElementDatas      = arrayOneChildPageData[1];
                                    var arrayOneChildPageElementDatas = OneChildPageElementDatas.Split(new string[] { "]*]" }, StringSplitOptions.RemoveEmptyEntries);
                                    Dictionary <string, string> OneChildPageDataDic = new Dictionary <string, string>();
                                    if (arrayOneChildPageElementDatas != null && arrayOneChildPageElementDatas.Length > 0)
                                    {
                                        foreach (var OneChildElementGroup in arrayOneChildPageElementDatas)
                                        {
                                            var arrayOneChildElementGroup = OneChildElementGroup.Split(new string[] { "=*=" }, StringSplitOptions.None);
                                            var tempKey   = arrayOneChildElementGroup[0];
                                            var tempValue = arrayOneChildElementGroup[1];
                                            if (!OneChildPageDataDic.Keys.Contains(tempKey))
                                            {
                                                OneChildPageDataDic.Add(tempKey, tempValue);
                                            }
                                        }
                                    }
                                    DicChildrenPageData.Add(ChildPageIndex, OneChildPageDataDic);
                                }
                            }
                        }
                    }
                }

                {
                    var arrayChildrenPageData = receiveString[4].Split(new string[] { "#*#" }, StringSplitOptions.RemoveEmptyEntries);

                    if (arrayChildrenPageData != null && arrayChildrenPageData.Length > 0)
                    {
                        foreach (var OneChildPageData in arrayChildrenPageData)
                        {
                            var arrayOneChildPageData = OneChildPageData.Split(new string[] { ":*:" }, StringSplitOptions.RemoveEmptyEntries);
                            if (arrayOneChildPageData != null && arrayOneChildPageData.Length == 2)
                            {
                                var ChildPageIndex                = arrayOneChildPageData[0];
                                var OneChildPageElementDatas      = arrayOneChildPageData[1];
                                var arrayOneChildPageElementDatas = OneChildPageElementDatas.Split(new string[] { "]*]" }, StringSplitOptions.RemoveEmptyEntries);
                                Dictionary <string, string> OneChildPageDataDic = new Dictionary <string, string>();
                                if (arrayOneChildPageElementDatas != null && arrayOneChildPageElementDatas.Length > 0)
                                {
                                    foreach (var OneChildElementGroup in arrayOneChildPageElementDatas)
                                    {
                                        var arrayOneChildElementGroup = OneChildElementGroup.Split(new string[] { "=*=" }, StringSplitOptions.None);
                                        var tempKey   = arrayOneChildElementGroup[0];
                                        var tempValue = arrayOneChildElementGroup[1];
                                        if (!OneChildPageDataDic.Keys.Contains(tempKey))
                                        {
                                            OneChildPageDataDic.Add(tempKey, tempValue);
                                        }
                                    }
                                }
                                DicPrintPageData.Add(ChildPageIndex, OneChildPageDataDic);
                            }
                        }
                    }
                }

                T_TradeQuestion tq = PaperData.QuestionCollection.SingleOrDefault(c => c.Key == questionkey);

                if (tq != null)
                {
                    string   sql   = @"INSERT INTO T_PAPER_ANSWER (F_KEY, F_QUESTION_KEY, F_PAPER_KEY, F_TRADE_NO, F_CIPHERTEXT1, F_CIPHERTEXT2, F_TELLERSYS_SERIAL) VALUES (SYS_GUID(), ?, ?, ?, ?, ?, ?)";
                    string[] param = new string[] { questionkey, PaperData.Key, MenuNo, receiveString[3], receiveString[4], serialid };
                    if (!ExamHandle.TryExecute(sql, param))
                    {
                        Messenger.Default.Send("保存交易答案失败");
                        return;
                    }
                    T_Sta_Answer[] an = tq.Sta_Answer.Where(c => { return(c.MenuNo == MenuNo && c.IsCreate); }).ToArray();

                    if (an.Length > 0)
                    {
                        foreach (T_Sta_Answer item in an)
                        {
                            Variable v = PaperData.Variables.Single(c => { return(c.Name == item.FldValue); });
                            if (item.Location == "主界面")
                            {
                                v.Value = DicMainPageData.Keys.Contains(item.FldCode) ? DicMainPageData[item.FldCode] : "";
                            }
                            else if (item.Location == "弹出页")
                            {
                                foreach (var eletempp in DicChildrenPageData)
                                {
                                    v.Value = eletempp.Value.Keys.Contains(item.FldCode) ? eletempp.Value[item.FldCode] : "";
                                    if (v.Value != "")
                                    {
                                        break;
                                    }
                                }
                            }
                            else if (item.Location == "打印页")
                            {
                                foreach (var eletempp in DicPrintPageData)
                                {
                                    v.Value = eletempp.Value.Keys.Contains(item.FldCode) ? eletempp.Value[item.FldCode] : "";
                                    if (v.Value != "")
                                    {
                                        break;
                                    }
                                }
                            }

                            //if (item.Location == 0)        // 0是提交报文
                            //    v.Value = msg1.GetValue("Fd" + item.FldCode);
                            //else if (item.Location == 1)   // 1是接受报文
                            //    v.Value = msg2.GetValue("Fd" + item.FldCode);
                            //else if (item.Location == 4)   // 4是提交附件
                            //    v.Value = file1.GetValue(int.Parse(item.FldCode));
                            //else if (item.Location == 5)   // 5是回收附件
                            //    v.Value = file2.GetValue(int.Parse(item.FldCode));
                        }
                    }

                    string variable = string.Empty;
                    for (int i = 0; i < PaperData.Variables.Count; i++)
                    {
                        variable += PaperData.Variables[i].Name + "=" + PaperData.Variables[i].Value;
                        variable += i == PaperData.Variables.Count - 1 ? "" : "]";
                    }

                    if (!ExamHandle.TryExecute(Sql.UPDATE_PAPERVARIABLE, variable, PaperData.Key))
                    {
                        Messenger.Default.Send("更新答案时出现异常");
                    }

                    // 只要走到这里就已经保存此题的答案了,就可以标记它的状态为已做过的状态
                    T_TradeQuestion question = PaperData.QuestionCollection.SingleOrDefault(c => c.Key == questionkey);

                    if (question != null)
                    {
                        question.State = QuestionState.Complete;
                        PaperData.CompletedQuestion += 1;
                    }
                }
            }
            break;

            case CommniucationFlag.B:
            {
                Messenger.Default.Send(Visibility.Visible, MessageToken.PaperVisibilityToken);

                if (receiveString.Length != 1)
                {
                    Messenger.Default.Send("从前端系统参数传递过来的参数错误");
                    return;
                }

                //string questionkey = receiveString[0]; // 题主键

                //T_TradeQuestion item = PaperData.QuestionCollection.SingleOrDefault(c => c.Key == questionkey);

                //if (item != null)
                //{
                //    item.State = QuestionState.Complete;
                //    PaperData.CompletedQuestion += 1;
                //}
            }
            break;
            }
        }
        /// <summary>
        ///     处理试卷中的变量
        /// </summary>
        /// <param name="question"></param>
        private void DealVariables(T_TradeQuestion question)
        {
            Action <string> forVariables = name =>
            {
                if (!string.IsNullOrEmpty(name) && PaperData.Variables.All(c => c.Name != name))
                {
                    var var = new Variable(name, string.Empty);
                    PaperData.Variables.Add(var);
                    var.VariableValueChanged += new Variable.VariableValueChangedHandle(var_VariableValueChanged);
                    //var.VariableValueChanged += a =>
                    //                            PaperData.QuestionCollection
                    //                                     .ToList()
                    //                                     .ForEach(item =>
                    //                                         {
                    //                                             item.TitleView = item.Title;
                    //                                             List<Variable> list = PaperData.Variables.ToList();
                    //                                             list.ForEach
                    //                                                 (c => item.TitleView = item.TitleView
                    //                                                                            .Replace(c.Name,
                    //                                                                                     "[" +
                    //                                                                                     c.Value +
                    //                                                                                     "]"));
                    //                                         });
                }
            };

            // 变量处理
            string[] d = question.Variable.Split('|');

            string[] v1 = d[0].Split(',');  // 题目部分
            string[] v2 = d[1].Split('\\'); // 答案部分,可以有多少答案

            foreach (string item in v1)
            {
                forVariables(item);
            }

            int n = 0;

            // 替换掉混在题目里面的@变量为名称,也是按顺序来对应的
            foreach (string item in v1)
            {
                if (item == string.Empty)
                {
                    continue;
                }

                n = question.Title.IndexOf("@", n, StringComparison.Ordinal);
                question.Title = question.Title.Insert(n + 1, item.Substring(1, item.Length - 1));
                n += item.Length;
            }

            for (int ii = 0; ii < v2.Length; ii++)
            {
                if (string.IsNullOrEmpty(v2[ii]))
                {
                    continue;
                }

                string[] v3 = v2[ii].Split(',');

                foreach (string item in v3)
                {
                    forVariables(item);
                }
            }

            question.TitleView = question.Title;

            // 定义全局的初始变量
            ////Variable var1 = new Variable("@TELLERNO@", string.Empty);
            ////PaperData.Variables.Add(var1);
            ////var1.VariableValueChanged += new Variable.VariableValueChangedHandle(var_VariableValueChanged);
            ////var1.Value = PaperData.TellerNo;
            var m = PaperData.Variables.Where(x => { return(x.Name == "@TELLERNO@"); }).ToList();

            if (m.Count == 1)
            {
                m.FirstOrDefault().Value = PaperData.TellerNo;
            }
        }