private static string GetConstant(BcpTable bcpTable, List <BcpNode> lstBcpNodes, BcpColumn col, string key)
 {
     switch (key)
     {
     case "AppName":         //获取应用信息,如"QQ"
         return(bcpTable.AppName);
     }
     return(key);
 }
        /// <summary>
        /// 转换函数的参数
        /// </summary>
        /// <param name="bcpTable"></param>
        /// <param name="lstBcpNodes"></param>
        /// <param name="xmldoc"></param>
        /// <param name="tn"></param>
        /// <param name="col"></param>
        /// <param name="tmpTable"></param>
        /// <param name="dr"></param>
        /// <param name="paramJson"></param>
        /// <returns></returns>
        private static object[] GetConverterParams(BcpTable bcpTable, List <BcpNode> lstBcpNodes, XmlDocument xmldoc, XmlNode tn, BcpColumn col, DataTable tmpTable, DataRow dr, string paramJson)
        {
            BcpConverterParam[] param = BcpConverterParam.ToConverterParams(paramJson);
            if (param.IsValid())
            {
                object[] result = new object[param.Length];
                int      index  = 0;
                foreach (BcpConverterParam p in param)
                {
                    object pk = null;
                    if (p.FK == BcpForeignKey.None && tmpTable.Columns.Contains(p.FKProperty)) //当前表中的列
                    {
                        pk = dr[p.FKProperty];
                    }
                    else
                    {
                        XmlNode fn = ToXmlNode(tn, p.FKNode);  //外键关联节点
                        if (fn != null)
                        {
                            var fkNode = lstBcpNodes.FirstOrDefault(bn => bn.XmlNode == fn);
                            if (fkNode != null)
                            {
                                if (p.FK == BcpForeignKey.Merge)
                                {
                                    pk = fkNode.DataTable != null ? fkNode.DataTable.Rows[0][p.FKProperty].ToSafeString() : null;
                                }
                                else if (p.FK == BcpForeignKey.NodeText) //该列的数据为TreeNode节点显示的文本
                                {
                                    pk = fkNode.TreeNode.Text;
                                }
                                else if (p.FK == BcpForeignKey.Constant) //该列的数据为常量数据
                                {
                                    pk = GetConstant(bcpTable, lstBcpNodes, col, p.FKProperty);
                                }
                                else if (p.FK == BcpForeignKey.Row) //该行的属性
                                {
                                    if (p.FKProperty == "rowid")
                                    {
                                        pk = (dr.Table.Rows.IndexOf(dr) + 1).ToString("D32");
                                    }
                                    else
                                    {
                                        if (tmpTable.Columns.Contains(p.FKProperty))
                                        {
                                            pk = dr[p.FKProperty];
                                        }
                                    }
                                }
                            }
                        }
                    }

                    result[index++] = pk;
                }

                return(result);
            }
            else
            {
                return(null);
            }
        }
        /// <summary>
        /// 生成BCP对应的Datatable
        /// </summary>
        /// <param name="bcpTable"></param>
        /// <param name="lstBcpNodes"></param>
        /// <param name="xmldoc"></param>
        /// <returns></returns>
        private DataTable BulidBcpTable(BcpTable bcpTable, List <BcpNode> lstBcpNodes, XmlDocument xmldoc)
        {
            DataTable dt = null;

            var tnodes = ToXmlNodeList(xmldoc, bcpTable.Node);  //获取该bcp表对应的节点

            if (tnodes == null)
            {
                return(dt);
            }
            foreach (XmlNode tn in tnodes)
            {
                var sourceNode = lstBcpNodes.FirstOrDefault(bn => bn.XmlNode == tn);
                if (sourceNode != null && sourceNode.DataTable != null)
                {
                    DataTable tmpTable = sourceNode.DataTable.Copy();                                //基本数据表

                    foreach (var col in bcpTable.Columns)                                            //遍历所有配置的列
                    {
                        if (col.FK == BcpForeignKey.None && tmpTable.Columns.Contains(col.Property)) //如果该列在当前表中,则只需要修改列名
                        {
                            int samePropertyCol =
                                bcpTable.Columns.Count(
                                    c => c.FK == BcpForeignKey.None && tmpTable.Columns.Contains(c.Property));
                            if (samePropertyCol <= 1)  //如果未出现相同的列,只需要修改列名
                            {
                                tmpTable.Columns[col.Property].ColumnName = col.GAWACode;
                            }
                            else     //有多个列,则需要复制列数据
                            {
                                tmpTable.Columns.Add(col.GAWACode);
                                foreach (DataRow dr in tmpTable.Rows)
                                {
                                    dr[col.GAWACode] = dr[col.Property];
                                }
                            }
                        }
                        else                           //如果该列是外键关联数据,需要找到对应的关联节点获取
                        {
                            if (!col.FKNode.IsValid()) //未设置外键节点则表示为当前节点
                            {
                                col.FKNode = ".";
                            }
                            tmpTable.Columns.Add(col.GAWACode);

                            XmlNode fn = ToXmlNode(tn, col.FKNode);  //外键关联节点
                            if (fn != null)
                            {
                                var fkNode = lstBcpNodes.FirstOrDefault(bn => bn.XmlNode == fn);
                                if (fkNode != null)
                                {
                                    if (col.FK == BcpForeignKey.Merge) //如果没有定义当前表的关联属性,表示直接从关联节点中获取数据并添加
                                    {
                                        if (fkNode.DataTable.Columns.Contains(col.FKProperty))
                                        {
                                            string pk = fkNode.DataTable != null ? fkNode.DataTable.Rows[0][col.FKProperty].ToSafeString() : null;
                                            if (pk.IsValid())
                                            {
                                                foreach (DataRow dr in tmpTable.Rows)
                                                {
                                                    dr[col.GAWACode] = pk;
                                                }
                                            }
                                        }
                                    }
                                    else if (col.FK == BcpForeignKey.NodeText) //该列的数据为TreeNode节点显示的文本
                                    {
                                        string pk = fkNode.TreeNode.Text;
                                        if (pk.IsValid())
                                        {
                                            foreach (DataRow dr in tmpTable.Rows)
                                            {
                                                dr[col.GAWACode] = pk;
                                            }
                                        }
                                    }
                                    else if (col.FK == BcpForeignKey.Constant) //该列的数据为常量数据
                                    {
                                        string pk = GetConstant(bcpTable, lstBcpNodes, col, col.Property);
                                        if (pk.IsValid())
                                        {
                                            foreach (DataRow dr in tmpTable.Rows)
                                            {
                                                dr[col.GAWACode] = pk;
                                            }
                                        }
                                    }
                                    else if (col.FK == BcpForeignKey.Row) //该列的数据为行参数
                                    {
                                        int rowid = 0;
                                        foreach (DataRow dr in tmpTable.Rows)
                                        {
                                            if (col.Property == "rowid")    //rowid表示当前行号,从1开始
                                            {
                                                dr[col.GAWACode] = (++rowid).ToString("D32");
                                            }
                                            else if (tmpTable.Columns.Contains(col.FKProperty))   //其它列的数据复制
                                            {
                                                dr[col.GAWACode] = dr[col.FKProperty];
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        #region 数据转换
                        if (col.ConverterFunction.IsValid())
                        {
                            foreach (DataRow dr in tmpTable.Rows)
                            {
                                object[] param = GetConverterParams(bcpTable, lstBcpNodes, xmldoc, tn, col, tmpTable, dr, col.ConverterParam);
                                dr[col.GAWACode] = ConverterResult(col.ConverterFunction, param, dr[col.GAWACode]);
                            }
                        }
                        #endregion
                    }

                    if (dt == null)
                    {
                        dt = tmpTable;
                    }
                    else
                    {
                        dt.Merge(tmpTable);     //合并表格,比如qq有多个账户时,每次都合并1个账户的好友数据,结果就为全部账户的好友列表数据
                    }
                }
            }

            #region 对表进行后续处理,比如添加ID列,删除其他列等
            if (dt != null)
            {
                //对表数据进行筛选
                if (bcpTable.RowFilter.IsValid())
                {
                    DataRow[] drss = dt.Select(bcpTable.RowFilter);
                    if (!drss.IsValid())
                    {
                        return(null);
                    }

                    DataTable tmp = drss[0].Table.Clone();
                    drss.ForEach(row =>
                    {
                        tmp.ImportRow(row);
                    });

                    dt = tmp;
                }

                dt.TableName = bcpTable.GAWACode;               //设置表名

                for (int i = dt.Columns.Count - 1; i >= 0; i--) //移除其它非BCP列
                {
                    if (!bcpTable.Columns.Any(col => col.GAWACode == dt.Columns[i].ColumnName) && "I050008" != dt.Columns[i].ColumnName)
                    {
                        dt.Columns.RemoveAt(i);
                    }
                }

                foreach (DataRow dr in dt.Rows)  //添加并设置“手机取证采集目标编号”
                {
                    dr["I050008"] = _acquisitionTargetNumber;
                }
            }
            #endregion
            return(dt);
        }