呼叫中心项目学习总结

  这几天一直在学习呼叫中心项目视频教程,跟着学习了下这个项目的一些关键知识点,现在回顾梳理一下重点:

一、三层架构设计+代码生成器

  复杂项目不能把SQL语句直接写到程序里,不模块化、难以维护,应该采用三层架构。三层的优点:UI层和BLL打交道,不用处理SQL语句;UI层(界面代码,就是写到Form中的代码)访问的都是强类型的对象,而不是row["age"]这样的东西,开发更方便,更不容易出错。一般三层的代码都是一个人写;UI层中没有复杂的代码,解耦,容易改变UI层技术。关于这个不用多说了,代码生成器我单独写了一篇学习笔记,详见《自己动手写三层代码生成器学习笔记》;

二、MD5算法基础

  MD5是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错)。任何长度的任意内容都可以用MD5计算出散列值。MD5算法不可逆,也就是只能得到内容对应的MD5值,无法由MD5值反推内容。对不不同的内容产生相同MD5值的概率非常非常非常低!MD5算法理论上是不可逆的,因此攻击的唯一办法就是碰撞。两个不同的内容生成相同的MD5值,这就叫碰撞。MD5算法的碰撞概率非常小。找到一个内容虽然不同但是产生同样MD5的内容即可。

三、程序中的Excel处理技术

  (1)OLE Automation:程序启动一个Excel进程,然后和Excel进程进行通讯来进行Excel的操作。优点:强大,能够使用Excel的所有功能,要求装Excel,微软最推荐这种用法,因为可以促进Excel的销量。会启动Excel进程,不适合于服务器(比如Asp.Net网站,安全性、效率)。

  (2)OpenXML:微软提供的读写Excel的技术,优点和NPOI差不多,不过只能处理xlsx格式文件。docx、pptx。

  (3)NPOI:它能够分析Excel文件的格式,能够进行常用Excel操作,不依赖于Excel,节省资源,没有安全性、性能的问题,在ASP.net中用最合适。只能处理xls格式文件、不能处理xlsx这样的新版本Excel文件格式。处理xlsx还要用OpenXML。

下面主要介绍NPOI:

  1、读取

            using (FileStream stream = new FileStream(@"c:\客户资料.xls", FileMode.Open, FileAccess.Read))
            {
                HSSFWorkbook workbook = new HSSFWorkbook(stream);
                MessageBox.Show(workbook.GetSheetName(0));
            }

  2、遇到错误别慌,仔细看错误信息。可能遇到的问题:文件被其他进程占用。
  3、NPOI处理WPS生成的XLS有问题。这个我最初用WPS2010时一直报错,后面下载了一个Office 2003绿色版,就可以了。看来NPOI的兼容性还有待改进。

  4、写入Excel:

            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = workbook.CreateSheet();
            HSSFRow row = sheet.CreateRow(0);
            row.CreateCell(0, HSSFCell.CELL_TYPE_STRING).SetCellValue("Hello");
            row.CreateCell(1, HSSFCell.CELL_TYPE_NUMERIC).SetCellValue(3.14);
            using (FileStream stream = new FileStream(@"c:\1.xls", FileMode.OpenOrCreate, FileAccess.ReadWrite))
            {
                workbook.Write(stream);
            }

四、数据同步实现问题—FTP程序应用:

  为何采用FTP?因为FTP专门用于文件的上传、下载,效率更高(相比HTTP)
  Windows下常用FTP服务器:Serve-U、IIS FTP、FileZilla Server(免费、开源)。学习用FileZilla Server(解压以后再运行,一旦运行就不要再改路径、移动,一旦出错到服务里面看原始位置)。
  Windows下常用FTP客户端:Windows内置(命令行ftp.exe、资源管理器)、CuteFtp(收费)、FlashFXp、FileZilla FTP Client。有人电脑用资源管理器有问题,可以用FileZilla FTP Client。

  程序中应用FTP:

  (1)DotNet中内置的操作FTP的类有:WebClient、FtpWebRequest。WebClient用起来简单,但是只能上传、下载。FtpWebRequest 比较强大,WebClient内部就是调用FtpWebRequest实现的,如果要实现遍历ftp文件、创建ftp文件夹等就要用FtpWebRequest 
  (2)WebClient也可以下载Http网页、上传Http文件。
  (3)开源的FTPClient.cs,已经帮助我们封装了很多关于FTP的常用操作方法,实际应用时直接调用即可。

五、数据同步安全性问题—MD5+密钥

   背景:检测FTP服务器文件被恶意人士、病毒修改,上传一个和excel文件同名的md5后缀的文件,内容是excel文件的md5值,数据导入之前先读服务器上excel文件的值,然后与服务器上的md5文件比对,如果不相等就是被篡改了。但是此方法存在缺陷,恶意人士可以修改完文件用MD5算法算一个值替换md5文件,用上面的方法就没法发觉篡改了。

   解决:双方约定一个密钥,并且信任“密钥只有双方知道”,门店在计算md5值的时候把文件的MD5值加上密钥再次进行md5运算,总部也是如此,由于我们相信恶意人士不知道密钥,因此它修改了文件,也无法生成正确的md5值。

   代码示例:

            FtpClient fc = new FtpClient(ftpAddr, ftpUserName, ftpPassword);
            try
            {
                fc.Upload(new FileInfo(textBoxX1.Text), deptNo + DateTime.Now.ToString("yyyyMMdd") + ".xls");
                //计算原文件的MD5值
                string oldMd5 = Helper.MD5Value(textBoxX1.Text);
                //计算加上密钥后的MD5值
                string newMd5 = Helper.GetMD5(oldMd5 + "flaredream");
                //将MD5值保存到本地磁盘上
                File.WriteAllText(@"E:\" + deptNo +
                    DateTime.Now.ToString("yyyyMMdd") + ".txt", newMd5);
                //把md5值文件上传到服务器
                fc.Upload(new FileInfo(@"E:\" + deptNo +
                    DateTime.Now.ToString("yyyyMMdd") + ".txt"), deptNo +
                    DateTime.Now.ToString("yyyyMMdd") + ".txt");
                MessageBox.Show("向FTP服务器上传文件成功~","操作成功",MessageBoxButtons.OK,MessageBoxIcon.Information);
            }
            catch(IOException ex)
            {
                throw new Exception("FTP服务器发生错误:"+ex.Message);
            }
            catch(Exception ex)
            {
                throw new Exception("系统出错~"+ex.Message);
            }

六、拼音检索与复合检索技术

  (1)拼音检索

  拼音检索两种实现方式:实时检索(速度慢);增加一个拼音字段(速度快,有冗余,必要的冗余是可以的)。怎样提高运行速度呢?用冗余,Dictionary、索引、冗余列、Cache等技术。

  具体如何实现?借助微软提供的第三方插件,ChnCharInfo.dll,参考其API文档,写了如下示例:

        private string GetPinYin(string name)
        {
            StringBuilder sb = new StringBuilder();
            foreach(char ch in name)
            {
                if (!ChineseChar.IsValidChar(ch))
                {
                    continue;
                }
                else
                {
                    ChineseChar cc = new ChineseChar(ch);
                    //暂时只考虑多音字的第一个,并且去掉音调
                    sb.Append(cc.Pinyins[0].Substring(0,cc.Pinyins[0].Length-1));
                }
            }
            return sb.ToString();
        }

  (2)复合检索

  多个条件组合查询方便数据定位。如何实现复合检索:动态设定SQL语句!!

  注意:虽然SQL语句也是动态拼接的,但是SQL语句的所有内容都是程序员自己写的,不存在客户输入介入的时机,所以拼SQL语句的过程没有注入漏洞攻击!某个条件不勾选的时候应该禁用控件!

  代码示例:

            List<string> listWhere = new List<string>();
            List<SqlParameter> listParameters = new List<SqlParameter>();

            if (cbxName.Checked)
            {
                listWhere.Add("Name like @name");
                listParameters.Add(new SqlParameter("name", "%" + txtName.Text.Trim() + "%"));
            }
            if (cbxMobilePhone.Checked)
            {
                listWhere.Add("MobilePhone like @mobile");
                listParameters.Add(new SqlParameter("mobile", "%" + txtMobile.Text.Trim() + "%"));
            }
            if (cbxCarNum.Checked)
            {
                listWhere.Add("CarNum like @carnum");
                listParameters.Add(new SqlParameter("carnum", "%" + txtCarNum.Text.Trim() + "%"));
            }

            string sql = "select * from T_Customers\n";
            if(listWhere.Count>0)
            {
                string strWhere = String.Join(" and ",listWhere.ToArray());
                sql += " where " + strWhere;
            }

            dgvData.DataSource = SqlHelper.ExecuteDataTable(sql,listParameters.ToArray());

七、树形结构应用

  树状结构在数据库中的存储,是重难点技术。在VS中实现树状结构最简单的就是利用TreeView控件!深入TreeView,我们会发现在选择项发生变化的时候在TextBox中显示当前选择项的值。AfterSelect事件。e中放的是发生事件的一些数据,比如鼠标点击的坐标。TreeNode的Tag,TreeNode中Text只能盛放显示的值,可以用Tag属性给节点关联一个对象。 Tag属性是Object类型的,因此可以关联任何的对象

  在程序中应用主要是根据数据库内容填充TreeView控件的节点,并根据用户操作添加一级节点、添加非一级节点、编辑节点、删除节点(需要使用递归删除,即先删除子节点,再删除根节点!)

  下面是示例代码:

  (1)遍历节点:

        private void btnTraverse_Click(object sender, EventArgs e)
        {
            txtNodes.Clear();//清除文本框内容
            foreach(TreeNode node in treeView1.Nodes)
            {
                DisplayNode(node);
            }
        }

        private void DisplayNode(TreeNode node)
        {
            txtNodes.AppendText(node.Text + "\r\n");
            if (node.Nodes.Count > 0)
            {
                foreach (TreeNode nextNode in node.Nodes)
                {
                    DisplayNode(nextNode);
                }
            }
        }

  (2)编辑节点:

        private void btnEdit_Click(object sender, EventArgs e)
        {
            Scripts script = treeView1.SelectedNode.Tag as Scripts;
            frmEditScripts newForm = new frmEditScripts();
            newForm.ScriptName = script.Name;
            newForm.ScriptBody = script.Body;

            if (newForm.ShowDialog() == DialogResult.OK)
            {
                script.Name = newForm.ScriptName;
                script.Body = newForm.ScriptBody;

                T_ScriptsBLL bll = new T_ScriptsBLL();
                if (bll.Update(script))
                {
                    treeView1.SelectedNode.Text = script.Name;
                    txtNodes.Text = script.Body;
                }
            }
        }

  (3)删除节点:

        private void btnDelete_Click(object sender, EventArgs e)
        {
            TreeNode node = treeView1.SelectedNode;
            if (node == null)
            {
                MessageBox.Show("您还没有选中一个节点~");
                return;
            }
            else
            {
                if (MessageBox.Show("确定要删除此节点?","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question)
                    ==DialogResult.Yes)
                {
                    node.Remove();
                    Scripts script = node.Tag as Scripts;
                    T_ScriptsBLL bll = new T_ScriptsBLL();
                    bll.DeleteAllNode((int)script.Id);
                }
            }
        }

     public IEnumerable<Scripts> GetByParentId(int parentId)
        {
            List<Scripts> listScripts = new List<Scripts>();
            DataTable dt = SqlHelper.ExecuteDataTable("select * from T_Scripts where [email protected]",
                new SqlParameter("@ParentId",parentId));

            foreach(DataRow row in dt.Rows)
            {
                Scripts script = ToModel(row);
                listScripts.Add(script);
            }

            return listScripts;
        }

        public void DeleteAllNode(int nodeId)
        {
            IEnumerable<Scripts> scripts = GetByParentId(nodeId);
            //先删除子节点再删除根节点
            foreach(Scripts script in scripts)
            {
                DeleteAllNode((int)script.Id);
            }

            Delete(nodeId);
        }

  (4)增加节点:分为一级节点和非一级节点

        private void btnAddOneLevelNode_Click(object sender, EventArgs e)
        {
            frmEditScripts form = new frmEditScripts();
            if (form.ShowDialog() != DialogResult.OK)
            {
                return;
            }
            Scripts model = new Scripts();
            model.Name = form.ScriptName;
            model.Body = form.ScriptBody;
            model.ParentId = 0;

            //AddNew返回的是新增数据的id
            int id = new T_ScriptsBLL().AddNew(model);
            //将新增的id赋值到对象上
            model.Id = id;

            //添加节点到界面上
            TreeNode treeNode = new TreeNode();
            treeNode.Text = model.Name;
            treeNode.Tag = model;

            treeView1.Nodes.Add(treeNode);
        }

        private void btnAddOtherLevelNode_Click(object sender, EventArgs e)
        {
            TreeNode selectedNode = treeView1.SelectedNode;
            if (selectedNode == null)
            {
                MessageBox.Show("没有节点被选中");
                return;
            }

            frmEditScripts form = new frmEditScripts();
            if (form.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            //获得选中节点(父节点)的模型对象
            Scripts parentModel = selectedNode.Tag as Scripts;
            Scripts model = new Scripts();
            model.Name = form.ScriptName;
            model.Body = form.ScriptBody;
            //将model的ParentId设置为父节点model的主键
            model.ParentId = parentModel.Id;
            model.Id = new T_ScriptsBLL().AddNew(model);

            //添加节点
            TreeNode treeNode = new TreeNode();
            treeNode.Text = model.Name;
            treeNode.Tag = model;

            selectedNode.Nodes.Add(treeNode);
            treeView1.SelectedNode.Text = model.Name;
        }

八、TTS(Text to Speech)应用

  TTS是Text To Speech的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话。包括中文语音处理和语音合成,利用中文韵律等相关知识对中文语句进行分词、词性判断、注音、数字符号转换,语音合成通过查询中文语音库得到语音。目前中文TTS系统,比较著名的有:IBMMicrosoft,Fujitsu,科大讯飞,捷通华声等研究的系统。目前比较关键的就是中文韵律处理、符号数字、多音字、构词方面有较多的问题,需要不断研究,使得中文语音合成的自然化程度较高。

  视频中讲解了一个用C#实现的一个简单的MyTTS,即在数据库中添加一张单词表,通过WindowsForm进行添加单词,然后录制单词为wav文件保存在指定文件夹中,并修改表中指定行的标志为true,还可以通过SoundPlayer来播放这个wav文件。

九、RDLC报表应用

  “报表=多样的格式+动态的数据”:人们利用计算机处理数据和界面设计的功能来生成、展示报表。实现报表的主要特点是数据动态化,格式多样化,并且实现报表数据和报表格式的完全分离

  RDLC->RDL仍然是Report Definition Language的缩写,那么C代表什么呢?C代表Client-side processing,凸显了它的客户端处理能力。合起来就是:Report Definition Language Client-side processing。

  RDLC文件其实就是一个XML文件,有很多结点和元素。ReportViewer是RDLC的浏览器,需要注意的是它的数据源必须是数据库、或对象。

  下图是RDLC的原理图:

  关于上图的解释如下:

  数据源:可以是传统数据库,也可以是XML文件
  Data Adapter 及 Connection 等,用来连接传统的数据库
  DataSet:用来存储数据,同时可以直接操作XML文件
  BindingSource:利用DateSet来填充BindingSource,这一步数据中转逻辑上有点多余,但是必不可少
  ReportDataSource:利用BindingSource来填充ReportDataSource
  ReportViewer:利用ReportDataSource填充的 数据 及 指定给它的RDLC报表文件 来显示报表

  RDLC有什么特点呢?

  简单易用的控件,特别是Table控件,非常方便字段在报表上的排列
  灵活的可定制性,用XML来描述一个报表相关的一切
  高度可编程性,在你的项目中,甚至不需要有一个报表文件,通过代码就可以实现报表生成、预览和打印等一系列操作;
  支持DrillThrough数据钻取功能;
  导出的Excel文件格式非常完美,而且并不需要安装Excel;
  数据源处理极其方便,开发人员可以自己接管数据库连接、取数,然后将数据结果赋值给RDLC的数据集即可。
  展示和数据分离,程序员更是可以编写一个RDLC设计器交有用户使用,这样用户就可以自行设计RDLC报表格式,程序员只负责定制数据接口即可。

时间: 2024-08-04 10:08:25

呼叫中心项目学习总结的相关文章

华为呼叫中心解决方案学习笔记一(方案概述)

解决方案概述 IPCC解决方案是华为公司为企业客户推出的端到端联络中心解决方案. 作为通信解决方案的全球领先者,华为一直以开放.合作.共赢的战略为指导,致力于为客户打造最优秀的多媒体联络中心平台,为您提供更前沿技术.更有效.更可靠的解决方案,共同创造新价值.华为掌握联络中心核心技术,提供端到端整体解决方案,保证系统的整体运维效率,减少风险,提升系统可靠性. 提供多种媒体接入手段,包括语音.视频.传真.Email.Web.数据协作等,通过智能路由平台,对多种媒体进行统一路由,将呼叫分配到最合适的座

华为呼叫中心解决方案学习笔记二(单呼叫中心组网)

一:单中心组网总结 二:单中心组网图

(桌面虚拟化最佳实践--呼叫中心系统优化之二)存储和服务器优化项目

VMware方案中母版盘优化 在具备SSD盘的局点,桌面母盘(replica盘)采用高性能SSD存储,以提高整个桌面池的使用性能. 一个母盘对应不超过64个虚拟机(即一个桌面池不超过64个虚拟机). 磁盘RAID优化 虚拟机母版盘.操作系统盘.linux文件服务器均采用RAID0+1技术,NAS文件服务器采用raid5,以提高磁盘读写性能. 存储LUN优化 按照安装指南,一个LUN按规划25~30个(该值如有变化,以最新的发布资料为准)虚拟机进行配置划分,以提高LUN的读写性能. 服务器优化 该

(桌面虚拟化最佳实践--呼叫中心系统优化之三)虚拟机模板优化项目

关闭系统还原 安装完操作系统后请首先关闭系统还原,路径:控制面板-系统-系统还原. 修改磁盘格式 参考安装指南,创建模板机时不要使用IDE磁盘,推荐SCSI格式, xp推荐使用LSI Logic并行格式,Win7推荐使用SAS格式. 安装操作系统补丁 安装最新的windows补丁程序. 虚拟机资源配置 在绝大部分情况下,建议虚拟机配置为1vCPU,CPU配置多了反而会增加调度开销,影响性能.为谨慎起见,可部署2批桌面,一批为1vCPU,一批为2vCPU,让员工试用,并分别收集两种场景下的用户体验

(桌面虚拟化最佳实践--呼叫中心系统优化之四)瘦终端优化项目与其他优化项目

减少鼠标刷新频率(仅适用于RDP协议) 此优化用于解决桌面访问时鼠标漂移和延迟的问题,原理是将RDP客户端的最小发送间隔改小. 1)在瘦终端上启动注册表编辑器,然后找到以下注册表子项: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Terminal Server Client 2)用鼠标右键单击Terminal Server Client,然后指向新建. 3)单击dword值,然后键入Min Send Interval.双击此条目,设置为10进制值10. 4)保存瘦终

我经历过的失败的产品和项目(五):没有前途的视频呼叫中心

背景 也是在3G大环境下,公司在视频领域尝试的一种业务形态. 大概就在10年的时候,三大运营商也都在做视频呼叫中心的业务评估,不过基本属于规范制定中,其中中联通走的比较快,而且他们的视频呼叫中心最终也上线了(但业务一直起不来),也有一些传统的语音呼叫中心厂家在尝试做这方面的工作.我们在经过一段时间的评估和考察之后,在2010年初的时候,决定和一个Avaya和思科呼叫中心的代理商合作,启动视频呼叫中心的项目,由我来领导这个项目组. 描述 产品比较明确,就是在Avaya和Cisco的语音呼叫中心的基

呼叫中心(一)

呼叫中心(Call Center)例如:公司服务系统,10086,110相关技术:计算机与电信集成技术(CTI Computer telecommunication integration)拓展技术简写:办公自动化OA(office Automation),客户关系管理CRM(Customer Relationship management),信息管理系统MIS(Management Information System),企业资源计划ERP(Enterprise Resources Plann

(桌面虚拟化最佳实践--呼叫中心系统优化之一)呼叫中心的特点

呼叫中心的特点 特点 快速部署桌面 集中部署和管理应用程序 保证桌面始终可用 通过集中式控制和管理保证了安全 降低成本,提高控制力 服务特点和需求 为什么呼叫中心需要桌面虚拟化?让我们来看看呼叫中心的服务特点和需求:呼叫中心往往都是人员密集工作空间狭小,每个坐席占地不到一个平方米,而就在这不到一个平方的地方,要摆下显示器.键盘.电话不说,还要摆下一个硕大的机箱.另外,在这高度密集的地区差不多每1000个坐席每年要耗费400多万的电费,一方面费用巨大,另一方面也不安全有很大的火灾隐患.而日常的维护

畅信达呼叫中心助力绿色生态农业发展

华盛绿能农业科技有限公司(以下简称“华盛绿能”)是一家绿色能源与生态农业高科技公司,专注于太阳能光伏绿色新能源的运营,绿色瓜果.有机蔬菜的生产,以“绿色.科技.高效”为主题,实现新能源.现代农业.生态旅游三大产业的有机结合,是全国最大的太阳能生态农业大棚项目. 为了加强公司的信息化管理,提高工作效率与服务质量,华盛绿能特别邀请呼叫中心领导品牌畅信达为其搭建呼叫中心系统.针对华盛绿能的产业战略及业务规划,畅信达基于自主研发的IP一体化融合通信平台MVB2000为其量身打造的呼叫中心系统,能够实现大