| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Linq;
- using System.Text;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- namespace HySoft.BaseCallCenter.Web.reportmanage
- {
- public partial class callratereport : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!this.IsPostBack)
- {
- }
- }
- #region 日报表
- /// <summary>
- /// 生成表格的标题和统计字段
- /// </summary>
- /// <param name="TableTitle">表格的标题</param>
- /// <param name="TableHead">表格统计字段</param>
- /// <returns></returns>
- public StringBuilder CreateTableTitleAndHead(string TableTitle, string BeginTime, string EndTime, params object[] TableHead)
- {
- StringBuilder html = new StringBuilder();
- html.Append("<h1 style='font-size: 18px;font-weight: bold;color: #333333;text-align:center;width:100%;'><b>" + TableTitle + "</b></h1>");
- html.Append("<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" align='center'>");
- html.Append("<tr style=\"text-align: center;\">");
- for (int i = 0; i < TableHead.Length; i++)
- {
- //标题第一行
- html.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #D5EDFE;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + TableHead[i] + "</td>");
- }
- html.Append("</tr>");
- GetTabelData(html, BeginTime, EndTime);
- html.Append("</table>");
- return html;
- }
- /// <summary>
- /// 获取需要统计的数据
- /// </summary>
- /// <param name="BeginTime"></param>
- /// <param name="EndTime"></param>
- /// <returns></returns>
- public Dictionary<string, JTL> GetStatistical(string BeginTime, string EndTime)
- {
- if (ViewState["rateData"] != null)
- {
- return (Dictionary<string, JTL>)ViewState["rateData"];
- }
- DateTime beginTime;
- DateTime endTime;
- string sql = "";
- Dictionary<string, JTL> myDic = new Dictionary<string, JTL>();
- JTL model = null;
- double callinRate = 0, calloutRate = 0;
- //int days = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
- int days = 7;
- if (BeginTime != "")
- beginTime = DateTime.Parse(BeginTime);
- else
- beginTime = DateTime.Parse(DateTime.Now.AddDays(-days).ToShortDateString());
- if (EndTime != "")
- endTime = DateTime.Parse(EndTime + " 23:59:59");
- else
- endTime = DateTime.Parse(DateTime.Now.ToShortDateString() + " 23:59:59");
- sql += " and DATEDIFF(d,BeginTime,'" + beginTime.ToString("yyyy-MM-dd HH:mm:ss") + "')<=0";
- sql += " and DATEDIFF(d,BeginTime,'" + endTime.ToString("yyyy-MM-dd HH:mm:ss") + "')>=0";
- DataTable dt = new BLL.T_Call_CallRecords().GetList("1=1 " + sql).Tables[0]; //BusinessType=0代表ivr中选择了转人工,calltype=1代表呼入
- for (DateTime t = beginTime; t <= endTime; t = t.AddDays(1))
- {
- string key = t.ToString("{yyyyMMdd}");
- int callincount = dt.Select("begintime >='" + t.ToString() + "' and begintime<'" + t.AddDays(1).ToString() + "' and CallType=0").Length;
- int callinCCount = dt.Select("begintime >='" + t.ToString() + "' and begintime<'" + t.AddDays(1).ToString() + "' and CallType=0 and CallState=1").Length;
- int calloutCount = dt.Select("begintime >='" + t.ToString() + "' and begintime<'" + t.AddDays(1).ToString() + "' and CallType=1 ").Length;
- int calloutCCount = dt.Select("begintime >='" + t.ToString() + "' and begintime<'" + t.AddDays(1).ToString() + "' and CallType=1 and CallState=1 ").Length;
- if (callincount != 0)
- {
- callinRate = double.Parse((callinCCount * 100).ToString()) / callincount;
-
- }
- else
- {
- callinRate = 0;
- }
- if (calloutCount != 0)
- {
- calloutRate = double.Parse((calloutCCount * 100).ToString()) / calloutCount;
- }
- else
- {
- calloutRate = 0;
- }
- if (!myDic.ContainsKey(key))
- {
- model = new JTL();
- model.CallinCount = callincount;
- model.CallinCCount = callinCCount;
- model.CallinRate = callinRate;
- model.CalloutCount = calloutCount;
- model.CalloutCCount = calloutCCount;
- model.CalloutRate = calloutRate;
- myDic.Add(key, model);
- }
- }
- ViewState["rateData"] = myDic;
- return myDic;
- }
- /// <summary>
- /// 获取表格统计数据
- /// </summary>
- /// <param name="SB"></param>
- /// <param name="BeginTime"></param>
- /// <param name="EndTime"></param>
- public void GetTabelData(StringBuilder SB, string BeginTime, string EndTime)
- {
- int CallinCount = 0, CallinCCount = 0, CalloutCount = 0, CalloutCCount = 0;
- double CallinRate = 0, CalloutRate = 0;
- foreach (var item in GetStatistical(BeginTime, EndTime))
- {
- SB.Append("<tr style=\"text-align: center;\" onmouseover=\"this.style.backgroundColor='#F6F6F6'\" onmouseout=\"this.style.backgroundColor='#ffffff'\">");
- SB.Append("<td class=\"formtabletitle1\" style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + item.Key.TrimStart('{').TrimEnd('}') + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + (item.Value).CallinCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + (item.Value).CallinCCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + (item.Value).CallinRate.ToString("F2") + "%</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + (item.Value).CalloutCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + (item.Value).CalloutCCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + (item.Value).CalloutRate.ToString("F2") + "%</td>");
- SB.Append("</tr>");
- CallinCount += item.Value.CallinCount;
- CallinCCount += item.Value.CallinCCount;
- CalloutCount += item.Value.CalloutCount;
- CalloutCCount += item.Value.CalloutCCount;
- }
- if (CallinCount != 0)
- {
- CallinRate = double.Parse((CallinCCount * 100).ToString()) / CallinCount;
- }
- else
- {
- CallinRate = 0;
- }
- if (CalloutCCount != 0)
- {
- CalloutRate = double.Parse((CalloutCount * 100).ToString()) / CalloutCCount;
- }
- else
- {
- CalloutRate = 0;
- }
- SB.Append("<tr style=\"text-align: center;\" onmouseover=\"this.style.backgroundColor='#F6F6F6'\" onmouseout=\"this.style.backgroundColor='#ffffff'\">");
- SB.Append("<td class=\"formtabletitle1\" style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">总计</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + CallinCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + CallinCCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + CallinRate.ToString("F2") + "%</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + CalloutCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + CalloutCCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + CalloutRate.ToString("F2") + "%</td>");
- SB.Append("</tr>");
- }
- #endregion
- #region 时段报表
- /// <summary>
- /// 生成表格的标题和统计字段
- /// </summary>
- /// <param name="TableTitle">表格的标题</param>
- /// <param name="TableHead">表格统计字段</param>
- /// <returns></returns>
- public StringBuilder CreateTableTitleAndHead1(string TableTitle, string daytime, string type, params object[] TableHead)
- {
- StringBuilder html = new StringBuilder();
- html.Append("<h1 style='font-size: 18px;font-weight: bold;color: #333333;text-align:center;width:100%;'><b>" + TableTitle + "</b></h1>");
- html.Append("<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" align='center'>");
- html.Append("<tr style=\"text-align: center;\">");
- for (int i = 0; i < TableHead.Length; i++)
- {
- //标题第一行
- html.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #D5EDFE;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + TableHead[i] + "</td>");
- }
- html.Append("</tr>");
- GetTabelData1(html, daytime, type);
- html.Append("</table>");
- return html;
- }
- /// <summary>
- /// 获取需要统计的数据
- /// </summary>
- /// <param name="BeginTime"></param>
- /// <param name="EndTime"></param>
- /// <returns></returns>
- public Dictionary<string, JTL> GetStatistical1(string daytime, string type)
- {
- if (ViewState["rateData1"] != null)
- {
- return (Dictionary<string, JTL>)ViewState["rateData1"];
- }
- DateTime beginTime;
- DateTime endTime;
- string sql = "";
- Dictionary<string, JTL> myDic = new Dictionary<string, JTL>();
- JTL model = null;
- double callinRate = 0, calloutRate = 0;
- //int days = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
- int min = 60; int ii = 12;
- if (type == "1")
- {
- min = 30;
- ii = 24;
- }
- if (daytime != "")
- beginTime = DateTime.Parse(daytime + " 00:00:01");
- else
- beginTime = DateTime.Parse(DateTime.Now.ToShortDateString() + " 00:00:01");
- sql += " and DATEDIFF(d,BeginTime,'" + beginTime.ToString("yyyy-MM-dd") + "')=0";
- DataTable dt = new BLL.T_Call_CallRecords().GetList("1=1 " + sql).Tables[0];
- for (DateTime t = DateTime.Parse(daytime + " 00:00:01"); t <= DateTime.Parse(daytime + " 23:59:59"); t = t.AddMinutes(min))
- {
- string key = t.AddSeconds(-1).ToString("HH:mm:ss") + "-" + t.AddMinutes(min).AddSeconds(-2).ToString("HH:mm:ss");
- int callincount = dt.Select("begintime >='" + t.AddSeconds(-1).ToString("yyyy-MM-dd HH:mm:ss") + "' and begintime<'" + t.AddMinutes(min).AddSeconds(-2).ToString("yyyy-MM-dd HH:mm:ss") + "' and CallType=0").Length;
- int callinCCount = dt.Select("begintime >='" + t.AddSeconds(-1).ToString("yyyy-MM-dd HH:mm:ss") + "' and begintime<'" + t.AddMinutes(min).AddSeconds(-2).ToString("yyyy-MM-dd HH:mm:ss") + "' and CallType=0 and CallState=1").Length;
- int calloutCount = dt.Select("begintime >='" + t.AddSeconds(-1).ToString("yyyy-MM-dd HH:mm:ss") + "' and begintime<'" + t.AddMinutes(min).AddSeconds(-2).ToString("yyyy-MM-dd HH:mm:ss") + "' and CallType=1 ").Length;
- int calloutCCount = dt.Select("begintime >='" + t.AddSeconds(-1).ToString("yyyy-MM-dd HH:mm:ss") + "' and begintime<'" + t.AddMinutes(min).AddSeconds(-2).ToString("yyyy-MM-dd HH:mm:ss") + "' and CallType=1 and CallState=1 ").Length;
- if (callincount != 0)
- {
- callinRate = double.Parse((callinCCount * 100).ToString()) / callincount;
- }
- else
- {
- callinRate = 0;
- }
- if (calloutCount != 0)
- {
- calloutRate = double.Parse((calloutCCount * 100).ToString()) / calloutCount;
- }
- else
- {
- calloutRate = 0;
- }
- if (!myDic.ContainsKey(key))
- {
- model = new JTL();
- model.CallinCount = callincount;
- model.CallinCCount = callinCCount;
- model.CallinRate = callinRate;
- model.CalloutCount = calloutCount;
- model.CalloutCCount = calloutCCount;
- model.CalloutRate = calloutRate;
- myDic.Add(key, model);
- }
- }
- ViewState["rateData1"] = myDic;
- return myDic;
- }
- /// <summary>
- /// 获取表格统计数据
- /// </summary>
- /// <param name="SB"></param>
- /// <param name="BeginTime"></param>
- /// <param name="EndTime"></param>
- public void GetTabelData1(StringBuilder SB, string daytime,string type)
- {
- int CallinCount = 0, CallinCCount = 0, CalloutCount = 0, CalloutCCount = 0;
- double CallinRate = 0, CalloutRate = 0;
- foreach (var item in GetStatistical1(daytime,type))
- {
- SB.Append("<tr style=\"text-align: center;\" onmouseover=\"this.style.backgroundColor='#F6F6F6'\" onmouseout=\"this.style.backgroundColor='#ffffff'\">");
- SB.Append("<td class=\"formtabletitle1\" style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + item.Key.TrimStart('{').TrimEnd('}') + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + (item.Value).CallinCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + (item.Value).CallinCCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + (item.Value).CallinRate.ToString("F2") + "%</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + (item.Value).CalloutCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + (item.Value).CalloutCCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + (item.Value).CalloutRate.ToString("F2") + "%</td>");
- SB.Append("</tr>");
- CallinCount += item.Value.CallinCount;
- CallinCCount += item.Value.CallinCCount;
- CalloutCount += item.Value.CalloutCount;
- CalloutCCount += item.Value.CalloutCCount;
- }
- if (CallinCount != 0)
- {
- CallinRate = double.Parse((CallinCCount * 100).ToString()) / CallinCount;
- }
- else
- {
- CallinRate = 0;
- }
- if (CalloutCCount != 0)
- {
- CalloutRate = double.Parse((CalloutCount * 100).ToString()) / CalloutCCount;
- }
- else
- {
- CalloutRate = 0;
- }
- SB.Append("<tr style=\"text-align: center;\" onmouseover=\"this.style.backgroundColor='#F6F6F6'\" onmouseout=\"this.style.backgroundColor='#ffffff'\">");
- SB.Append("<td class=\"formtabletitle1\" style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">总计</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + CallinCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + CallinCCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + CallinRate.ToString("F2") + "%</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + CalloutCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + CalloutCCount + "</td>");
- SB.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + CalloutRate.ToString("F2") + "%</td>");
- SB.Append("</tr>");
- }
- #endregion
- }
- /// <summary>
- /// 接通率统计辅助类
- /// </summary>
- [Serializable]
- public class JTL
- {
- public int CallinCount
- {
- get;
- set;
- }
- public int CallinCCount
- {
- get;
- set;
- }
- public double CallinRate
- {
- get;
- set;
- }
- public int CalloutCount
- {
- get;
- set;
- }
- public int CalloutCCount
- {
- get;
- set;
- }
- public double CalloutRate
- {
- get;
- set;
- }
- }
- }
|