Sfoglia il codice sorgente

优化坐席工作报表,以及增加异常掉线次数

zhengbingbing 6 anni fa
parent
commit
84adc36a5e

+ 291 - 3
codegit/CallCenterApi/CallCenterApi.Interface/CallCenterApi.Interface/Controllers/report/ZuoXiWorkTotalController.cs

@@ -20,7 +20,7 @@ namespace CallCenterApi.Interface.Controllers.report
20 20
             
21 21
                 String[] str = { "部门", "坐席", "坐席工号", "呼入电话数", "坐席接通量", "呼损量"
22 22
                         ,"接通率","呼损率","平均排队时间","接听通话次数","通话分钟数","通话秒数"
23
-                        ,"平均接听通话秒数","平均振铃秒数","呼入占有率","用户评价","坐席登录次数"
23
+                        ,"平均接听通话秒数","平均振铃秒数","呼入占有率","用户评价","坐席登录次数","异常掉线次数"
24 24
                         ,"登录时长分钟数","工作时长分钟数","平均每天工作时长(小时)","平均操作分钟数"
25 25
                         ,"置忙次数","休息时长分钟数","平均每天休息时长(小时)"
26 26
                         ,"置忙平均休息分钟数","质检平均成绩"
@@ -36,7 +36,7 @@ namespace CallCenterApi.Interface.Controllers.report
36 36
             ActionResult res = NoToken("未知错误,请重新登录");
37 37
          
38 38
                 DataTable dtNew = new DataTable();
39
-                dtNew = getData(stime, endtime, dpt, dayss);
39
+                dtNew = getDataNew(stime, endtime, dpt, dayss);
40 40
                 #region
41 41
                 //#region
42 42
                 //DataColumn dc1 = new DataColumn("部门");
@@ -394,7 +394,7 @@ namespace CallCenterApi.Interface.Controllers.report
394 394
             if (Request.IsAuthenticated)
395 395
             {
396 396
                 NPOIHelper npoi = new NPOIHelper();
397
-                DataTable dt = getData(stime, endtime, dpt, dayss);
397
+                DataTable dt = getDataNew(stime, endtime, dpt, dayss);
398 398
                 if (npoi.ExportToExcel("坐席工作数据", dt) == "")
399 399
                 {
400 400
                     return Success("导出成功");
@@ -407,6 +407,293 @@ namespace CallCenterApi.Interface.Controllers.report
407 407
             return res;
408 408
         }
409 409
 
410
+        private DataTable getDataNew(string stime, string endtime, string dpt, string dayss)
411
+        {
412
+            DataTable dtNew = new DataTable();
413
+            #region
414
+            DataColumn dc1 = new DataColumn("部门");
415
+            DataColumn dc2 = new DataColumn("坐席");
416
+            DataColumn dc3 = new DataColumn("坐席工号");
417
+            DataColumn dc4 = new DataColumn("呼入电话数");
418
+            DataColumn dc5 = new DataColumn("坐席接通量");
419
+            DataColumn dc6 = new DataColumn("呼损量");
420
+            DataColumn dc7 = new DataColumn("接通率");
421
+            DataColumn dc8 = new DataColumn("呼损率");
422
+            DataColumn dc9 = new DataColumn("平均排队时间");
423
+            DataColumn dc10 = new DataColumn("接听通话次数");
424
+            DataColumn dc11 = new DataColumn("通话分钟数");
425
+            DataColumn dc12 = new DataColumn("通话秒数");
426
+            DataColumn dc13 = new DataColumn("平均接听通话秒数");
427
+            DataColumn dc14 = new DataColumn("平均振铃秒数");
428
+            DataColumn dc15 = new DataColumn("呼入占有率");
429
+            DataColumn dc16 = new DataColumn("用户评价");
430
+            DataColumn dc17 = new DataColumn("坐席登录次数");
431
+            DataColumn dc18 = new DataColumn("异常掉线次数");
432
+            DataColumn dc19 = new DataColumn("登录时长分钟数");
433
+            DataColumn dc20 = new DataColumn("工作时长分钟数");
434
+            DataColumn dc21 = new DataColumn("平均每天工作时长");
435
+            DataColumn dc22 = new DataColumn("平均操作分钟数");
436
+            DataColumn dc23 = new DataColumn("置忙次数");
437
+            DataColumn dc24 = new DataColumn("休息时长分钟数");
438
+            DataColumn dc25 = new DataColumn("平均每天休息时长");
439
+            DataColumn dc26 = new DataColumn("置忙平均休息分钟数");
440
+            DataColumn dc27 = new DataColumn("质检平均成绩");
441
+
442
+            dtNew.Columns.Add(dc1);
443
+            dtNew.Columns.Add(dc2);
444
+            dtNew.Columns.Add(dc3);
445
+            dtNew.Columns.Add(dc4);
446
+            dtNew.Columns.Add(dc5);
447
+            dtNew.Columns.Add(dc6);
448
+            dtNew.Columns.Add(dc7);
449
+            dtNew.Columns.Add(dc8);
450
+            dtNew.Columns.Add(dc9);
451
+            dtNew.Columns.Add(dc10);
452
+            dtNew.Columns.Add(dc11);
453
+            dtNew.Columns.Add(dc12);
454
+            dtNew.Columns.Add(dc13);
455
+            dtNew.Columns.Add(dc14);
456
+            dtNew.Columns.Add(dc15);
457
+            dtNew.Columns.Add(dc16);
458
+            dtNew.Columns.Add(dc17);
459
+            dtNew.Columns.Add(dc18);
460
+            dtNew.Columns.Add(dc19);
461
+            dtNew.Columns.Add(dc20);
462
+            dtNew.Columns.Add(dc21);
463
+            dtNew.Columns.Add(dc22);
464
+            dtNew.Columns.Add(dc23);
465
+            dtNew.Columns.Add(dc24);
466
+            dtNew.Columns.Add(dc25);
467
+            dtNew.Columns.Add(dc26);
468
+            dtNew.Columns.Add(dc27);
469
+            #endregion
470
+            int days = 30;
471
+            string sqltimeCallRecords = "";
472
+            string strsqlcall = "";string strsqltrunk = ""; string strsqlagent = "";
473
+
474
+            var datenow = DateTime.Now;
475
+            if (string.IsNullOrEmpty(stime) && stime.Trim() == "")
476
+                stime = datenow.ToString("yyyy-MM-01");
477
+            if (string.IsNullOrEmpty(endtime) && endtime.Trim() == "")
478
+                endtime = datenow.ToString("yyyy-MM-dd");
479
+            if (string.IsNullOrEmpty(dayss) && dayss.Trim() == "")
480
+            {
481
+                days = datenow.Day;
482
+            }
483
+
484
+            sqltimeCallRecords += " and datediff(day,TimeAlerting,'" + stime + "')<=0  and datediff(day,TimeAlerting,'" + endtime + "')>=0";
485
+            strsqlcall += " and datediff(day,BeginTime,'" + stime + "')<=0  and datediff(day,BeginTime,'" + endtime + "')>=0";
486
+            strsqltrunk += " and datediff(day,TimeCallIn,'" + stime + "')<=0  and datediff(day,TimeCallIn,'" + endtime + "')>=0";
487
+            strsqlagent += " and datediff(day,TimeLogin,'" + stime + "')<=0  and datediff(day,TimeLogin,'" + endtime + "')>=0";
488
+            
489
+            if (dayss != null && dayss.Trim() != "")
490
+            {
491
+                days = int.Parse(dayss.Trim());
492
+            }
493
+            
494
+            var sqluser = " F_DeleteFlag=0 and F_SeatFlag=1 and F_WorkNumber!=''";
495
+            if (dpt != null && dpt.Trim() != "")
496
+                sqluser += " and F_DeptId=" + dpt;
497
+            
498
+            //坐席
499
+            var userslist = new BLL.T_Sys_UserAccount().GetModelList(sqluser+" order by  F_WorkNumber asc");
500
+            //部门
501
+            var deptlist = new BLL.T_Sys_Department().GetModelList("F_ParentId!=0");
502
+            //呼入
503
+            DataTable dtTrunk = DbHelperSQL.Query("select AgentID,COUNT(*) as ct,SUM(DATEDIFF(Second,timewantagent,timeconnected)) as dd from rep_trunk_call_in WITH(NOLOCK) where  1=1" + strsqltrunk + " group by AgentID").Tables[0];
504
+
505
+            DataTable dtcall = DbHelperSQL.Query("select UserCode,CallType,CallState,MYD from T_Call_CallRecords WITH(NOLOCK) where 1=1 " + strsqlcall).Tables[0];
506
+            DataTable dtext = DbHelperSQL.Query("select CalleeAgentID,COUNT(*) as ct,SUM(PeriodTalking) as sc,SUM(PeriodAlerting) as pa from rep_ext_call_in WITH(NOLOCK) where 1=1 " + sqltimeCallRecords + " group by CalleeAgentID ").Tables[0];
507
+            //接通
508
+            DataTable dtCallEvey = DbHelperSQL.Query("select UserCode,COUNT(*) as ct,SUM(TalkLongTime) as sc from T_Call_CallRecords WITH(NOLOCK) where CallState=1 and isnull(UserCode,'')<>'' " + strsqlcall + " group by UserCode ").Tables[0];
509
+            //呼出
510
+            //登陆信息
511
+            DataTable dtAgent = DbHelperSQL.Query("select AgentID,COUNT(*) as dl,SUM(LoginTimes) as dlsc,SUM(reposenum) as zm,SUM(ReposeTimes) as xx from rep_agent_detail where 1=1 " + strsqlagent + " group by AgentID").Tables[0];
512
+            DataTable dtAgentdx = DbHelperSQL.Query("select AgentID,COUNT(*) as dl from rep_agent_detail where 1=1 and LogoutType=3 " + strsqlagent + " group by AgentID").Tables[0];
513
+            //评价
514
+            DataTable dtcallpj = DbHelperSQL.Query("select UserCode,count(*) from T_Call_CallRecords WITH(NOLOCK) where MYD is not null and myd<>0 and CallState=1 and isnull(UserCode,'')<>'' " + strsqlcall + " group by UserCode ").Tables[0];
515
+            //质检
516
+            DataTable dtzj = DbHelperSQL.Query("select UserCode,convert(int,SUM(f_qcscore)) as fs,COUNT(*) as fsct from T_Call_CallRecords WITH(NOLOCK) where F_QCState=1 and isnull(UserCode,'')<>'' " + strsqlcall + " group by UserCode ").Tables[0];
517
+            foreach (var item in userslist)
518
+            {
519
+                DataRow drNew = dtNew.NewRow();
520
+                drNew["坐席"] = item.F_UserName;
521
+                drNew["坐席工号"] = item.F_UserCode;
522
+                #region
523
+                int ijtcs = 0;//接听通话次数 
524
+                int ithms = 0;//通话秒数
525
+                int izlms = 0;//振铃秒数
526
+                int ipjjtms = 0;//平均接听秒数
527
+                int ipjzlms = 0;//平均振铃秒数
528
+                double ihrzyl = 0.00;//呼入占有率
529
+                int izxdlcs = 0;//坐席登录次数
530
+                int izxdxcs = 0;//坐席掉线次数
531
+                int idlsc = 0;//登录时长
532
+                int iWorktime = 0;//工作时长
533
+                int izmcs = 0;//置忙次数
534
+                int ixxsc = 0;//休息时长
535
+                int ipjczsc = 0;//平均操作时长
536
+                int ipjzmxxsc = 0;//平均置忙休息时长
537
+
538
+
539
+                int itrunkct = 0;//总数
540
+                int itrunkjj = 0;//总接听
541
+                int itrunkhs = 0;//呼损量
542
+                int itrunkpjsc = 0;//平均排队时间
543
+                double itrunkjtl = 0.00;//接通率
544
+                double itrunkhsl = 0.00;//互损率
545
+                double itrunkpjpd = 0.00;//平均排队
546
+                #endregion
547
+                #region 部门信息
548
+                string deptname = "";
549
+                var deptinfo = deptlist.Where(d => d.F_DeptId == item.F_DeptId).FirstOrDefault();
550
+                if (deptinfo != null)
551
+                    deptname = deptinfo.F_DeptName;
552
+                drNew["部门"] = deptname;
553
+                #endregion
554
+                #region 呼入数据
555
+                DataRow[] drTrunk = dtTrunk.Select(" AgentID='" + item.F_UserCode + "'");
556
+                DataRow[] drCallIn = dtcall.Select(" CallType=0 and UserCode='" + item.F_UserCode + "'");
557
+                DataRow[] drCallInJT = dtcall.Select(" CallType=0 and CallState=1 and UserCode='" + item.F_UserCode + "'");
558
+                if (drCallIn != null && drCallIn.Count() > 0)
559
+                    itrunkct = drCallIn.Count();
560
+                if (drCallInJT != null && drCallInJT.Count() > 0)
561
+                    itrunkjj = drCallInJT.Count();
562
+                if (drTrunk.Count() > 0 && drTrunk[0]["dd"].ToString() != "")
563
+                    itrunkpjsc = int.Parse(drTrunk[0]["dd"].ToString());
564
+
565
+                itrunkhs = itrunkct - itrunkjj;
566
+                if (itrunkct != 0)
567
+                {
568
+                    itrunkjtl = itrunkjj / double.Parse(itrunkct.ToString());
569
+                    itrunkhsl = itrunkhs / double.Parse(itrunkct.ToString());
570
+                    itrunkpjpd = itrunkpjsc / double.Parse(itrunkct.ToString());
571
+                }
572
+                else
573
+                {
574
+                    itrunkjtl = 0.00;
575
+                    itrunkhsl = 0.00;
576
+                    itrunkpjpd = 0.00;
577
+                }
578
+                drNew["呼入电话数"] = itrunkct;
579
+                drNew["坐席接通量"] = itrunkjj;
580
+                drNew["呼损量"] = itrunkhs;
581
+                drNew["接通率"] = (itrunkjtl * 100).ToString("0.00") + "%";
582
+                drNew["呼损率"] = (itrunkhsl * 100).ToString("0.00") + "%";
583
+                drNew["平均排队时间"] = itrunkpjpd.ToString("0.00");
584
+                #endregion                
585
+                #region 坐席接听数据
586
+                DataRow[] drExt = dtext.Select(" CalleeAgentID='" + item.F_UserCode + "'");
587
+                DataRow[] drCallEvey = dtCallEvey.Select(" usercode='" + item.F_UserCode + "'");
588
+                if (drCallEvey != null && drCallEvey.Count() > 0)
589
+                {
590
+                    if (drCallEvey[0]["ct"].ToString() != "")
591
+                    {
592
+                        ijtcs = int.Parse(drCallEvey[0]["ct"].ToString());//接听次数
593
+                    }
594
+                    if (drCallEvey[0]["sc"].ToString() != "")
595
+                    {
596
+                        ithms = int.Parse(drCallEvey[0]["sc"].ToString());//通话秒数
597
+                    }
598
+                }
599
+                if (drExt != null && drExt.Count() > 0)
600
+                {
601
+                    if (drExt[0]["pa"].ToString() != "")
602
+                    {
603
+                        izlms = int.Parse(drExt[0]["pa"].ToString());//振铃秒数
604
+                    }
605
+                }
606
+                drNew["接听通话次数"] = ijtcs.ToString();
607
+                //drNew["通话分钟数"] = (ithms / 60).ToString();
608
+                drNew["通话分钟数"] = CallCenter.Utility.DateTimeConvert.parseTimeSeconds(ithms, 0);
609
+                drNew["通话秒数"] = ithms.ToString();
610
+
611
+                if (ijtcs != 0)
612
+                {
613
+                    ipjjtms = ithms / ijtcs;//平均接通秒数
614
+                    ipjzlms = izlms / ijtcs;//平均振铃秒数
615
+                }
616
+                drNew["平均接听通话秒数"] = ipjjtms.ToString();
617
+                drNew["平均振铃秒数"] = ipjzlms.ToString();
618
+                #endregion                
619
+                #region 坐席登录次数
620
+                DataRow[] drAgent = dtAgent.Select(" AgentId='" + item.F_UserCode + "'");
621
+                DataRow[] drAgentdx = dtAgentdx.Select(" AgentId='" + item.F_UserCode + "'");
622
+                if (drAgent != null && drAgent.Count() > 0)
623
+                {
624
+                    if (drAgent[0]["dl"] != null && drAgent[0]["dl"].ToString() != "")
625
+                    {
626
+                        izxdlcs = int.Parse(drAgent[0]["dl"].ToString());//登录次数
627
+                    }
628
+                    if (drAgent[0]["dlsc"] != null && drAgent[0]["dlsc"].ToString() != "")
629
+                    {
630
+                        idlsc = int.Parse(drAgent[0]["dlsc"].ToString());//登录时长
631
+                    }
632
+                    if (drAgent[0]["zm"] != null && drAgent[0]["zm"].ToString() != "")
633
+                    {
634
+                        izmcs = int.Parse(drAgent[0]["zm"].ToString());//置忙次数
635
+                    }
636
+                    if (drAgent[0]["xx"] != null && drAgent[0]["xx"].ToString() != "")
637
+                    {
638
+                        ixxsc = int.Parse(drAgent[0]["xx"].ToString());//休息时长
639
+                    }
640
+                }
641
+                if (drAgentdx != null && drAgentdx.Count() > 0)
642
+                {
643
+                    if (drAgentdx[0]["dl"] != null && drAgentdx[0]["dl"].ToString() != "")
644
+                    {
645
+                        izxdxcs = int.Parse(drAgentdx[0]["dl"].ToString());//掉线次数
646
+                    }
647
+                }
648
+                iWorktime = idlsc - ixxsc;//工作时长
649
+                if (izxdlcs != 0)
650
+                {
651
+                    ipjczsc = iWorktime / izxdlcs;//平均操作秒数
652
+                }
653
+                if (izmcs != 0)
654
+                {
655
+                    ipjzmxxsc = ixxsc / izmcs;//置忙平均操作时长
656
+                }
657
+
658
+                //呼入占有率
659
+                if (iWorktime != 0)
660
+                {
661
+                    ihrzyl = ithms / Convert.ToDouble(iWorktime);
662
+                }
663
+                drNew["呼入占有率"] = (ihrzyl * 100).ToString("0.00") + "%";
664
+                drNew["坐席登录次数"] = izxdlcs.ToString();
665
+                drNew["异常掉线次数"] = izxdxcs.ToString(); 
666
+                drNew["登录时长分钟数"] = (idlsc / 60).ToString();
667
+                drNew["工作时长分钟数"] = (iWorktime / 60).ToString();
668
+                drNew["平均每天工作时长"] = Math.Round((double.Parse(iWorktime.ToString()) / 60 / 60 / days), 2).ToString();
669
+                drNew["平均操作分钟数"] = (ipjczsc / 60).ToString();
670
+                drNew["置忙次数"] = izmcs.ToString();
671
+                drNew["休息时长分钟数"] = (ixxsc / 60).ToString();
672
+                drNew["平均每天休息时长"] = Math.Round((double.Parse(ixxsc.ToString()) / 60 / 60 / days), 2).ToString();
673
+                drNew["置忙平均休息分钟数"] = (ipjzmxxsc / 60).ToString();
674
+                #endregion                
675
+                #region 用户评价
676
+                DataRow[] drmyd = dtcall.Select(" MYD is not null and myd<>0 and CallState=1 and usercode='" + item.F_UserCode + "' ");
677
+                int myd = drmyd != null ? drmyd.Count() : 0;
678
+                drNew["用户评价"] = myd.ToString();
679
+                #endregion
680
+                #region 质检部分
681
+                DataRow[] drZJ = dtzj.Select(" UserCode='" + item.F_UserCode + "'");
682
+                int zfs = 0;
683
+                if (drZJ != null && drZJ.Count() > 0)
684
+                {
685
+                    if (drZJ[0]["fs"].ToString() != "" && drZJ[0]["fsct"].ToString() != "")
686
+                    {
687
+                        zfs = Convert.ToInt32(drZJ[0]["fs"].ToString()) / int.Parse(drZJ[0]["fsct"].ToString());
688
+                    }
689
+                }
690
+                drNew["质检平均成绩"] = zfs.ToString();
691
+                #endregion
692
+                dtNew.Rows.Add(drNew);
693
+            }
694
+            return dtNew;
695
+        }
696
+        #region 20191204 zhengbingbing 优化前
410 697
         private DataTable getData(string stime, string endtime, string dpt, string dayss)
411 698
         {
412 699
             DataTable dtNew = new DataTable();
@@ -767,5 +1054,6 @@ namespace CallCenterApi.Interface.Controllers.report
767 1054
             }
768 1055
             return dtNew;
769 1056
         }
1057
+        #endregion
770 1058
     }
771 1059
 }