鄂尔多斯-招源科技

CallPlanController.cs 76KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734
  1. using CallCenter.Utility;
  2. using CallCenter.Utility.Time;
  3. using CallCenterApi.DB;
  4. using CallCenterApi.Interface.Controllers.Base;
  5. using CallCenterApi.Interface.Models.Dto;
  6. using CallCenterApi.Interface.Models.Filter;
  7. using CallCenterApi.Interface.Models.Input;
  8. using CallCenterApi.Model;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Data;
  12. using System.IO;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Web;
  16. using System.Web.Mvc;
  17. namespace CallCenterApi.Interface.Controllers.callout
  18. {
  19. public class CallPlanController : BaseController
  20. {
  21. private readonly BLL.T_CTI_Task taskBLL = new BLL.T_CTI_Task();
  22. private readonly BLL.T_Call_TaskTelNum taskTellNumBLL = new BLL.T_Call_TaskTelNum();
  23. private readonly BLL.T_Sys_DictionaryValue dictValueBLL = new BLL.T_Sys_DictionaryValue();
  24. private readonly BLL.T_CTI_TaskAgent taskAgentBLL = new BLL.T_CTI_TaskAgent();
  25. private readonly BLL.T_Sys_UserAccount userAccount = new BLL.T_Sys_UserAccount();
  26. private readonly BLL.T_CTI_TaskRecord taskRecordBLL = new BLL.T_CTI_TaskRecord();
  27. private readonly BLL.CallResult callResultBLL = new BLL.CallResult();
  28. private readonly BLL.T_CTI_TaskDaily taskDailyBLL = new BLL.T_CTI_TaskDaily();
  29. private readonly BLL.T_CTI_TaskPhonePart taskPhonePartBLL = new BLL.T_CTI_TaskPhonePart();
  30. private readonly BLL.T_Sys_SeatGroup seatGroupBLL = new BLL.T_Sys_SeatGroup();
  31. private readonly BLL.T_Sys_SystemConfig systemConfigBLL = new BLL.T_Sys_SystemConfig();
  32. private readonly BLL.T_Call_PageField pageFieldBLL = new BLL.T_Call_PageField();
  33. private readonly BLL.T_Ask_PagerInfo pagerInfoBLL = new BLL.T_Ask_PagerInfo();
  34. private readonly BLL.T_Call_Answers ansBLL = new BLL.T_Call_Answers();
  35. private readonly BLL.T_Sys_Department departmentBLL = new BLL.T_Sys_Department();
  36. private readonly BLL.T_Ask_Question questionBLL = new BLL.T_Ask_Question();
  37. private readonly BLL.T_Ask_QuestionItems questionItemBLL = new BLL.T_Ask_QuestionItems();
  38. #region 外呼任务
  39. /// <summary>
  40. /// 获取列表
  41. /// </summary>
  42. /// <param name="filter"></param>
  43. /// <returns></returns>
  44. public ActionResult GetList(FilterCallPlan filter)
  45. {
  46. //if (!Request.IsAuthenticated)
  47. // return NoToken("未知错误,请重新登录");
  48. var sql = " and State>=0 and TaskType=" + filter.TaskType;
  49. if (!string.IsNullOrWhiteSpace(filter.Name))
  50. {
  51. sql += " and (TaskName like '%" + filter.Name.Trim() + "%' ) ";
  52. }
  53. var roleid = CurrentUser.UserData.F_RoleId;
  54. var deptid = CurrentUser.UserData.F_DeptId;
  55. var deptCode = CurrentUser.UserData.F_DeptCode;
  56. var usercode = CurrentUser.UserData.F_UserCode;
  57. if (roleid != 0)
  58. {
  59. if (roleid != 17)
  60. {
  61. if (deptCode.Replace("|0|1|", "").Length > 0)
  62. {
  63. sql += $" and DeptId in (select F_ParentId from T_Sys_Department where F_DeptId={deptid}) ";
  64. }
  65. }
  66. }
  67. var recordCount = 0;
  68. var dt = BLL.PagerBLL.GetListPager(
  69. "T_CTI_Task",
  70. "TaskID",
  71. "*",
  72. sql,
  73. "ORDER BY AddTime desc",
  74. filter.PageSize,
  75. filter.PageIndex,
  76. true,
  77. out recordCount);
  78. List<Model.T_CTI_Task> modelList = new BLL.T_CTI_Task().DataTableToList(dt);
  79. var list = new List<CallPlanDto>();
  80. //查询坐席组
  81. var agentGroupList = seatGroupBLL.DataTableToList(seatGroupBLL.GetList("").Tables[0]);
  82. //查询坐席
  83. var agentList = userAccount.DataTableToList(userAccount.GetList(" F_DeleteFlag=0 ").Tables[0]);
  84. //查询部门
  85. var deptList = departmentBLL.DataTableToList(departmentBLL.GetList(" F_State=1 ").Tables[0]);
  86. foreach (var model in modelList)
  87. {
  88. //计算数据
  89. string calledRate = "0";
  90. var allcount = model.y_HMCount ?? 0;
  91. float calledcount = model.y_HCCount ?? 0;
  92. calledRate = allcount == 0 ? "" : (calledcount / allcount * 100).ToString("f2") + "%";
  93. string connectedRate = "0";
  94. float connected = model.y_YJCount ?? 0;
  95. connectedRate = calledcount == 0 ? "0" : (connected / calledcount * 100).ToString("f2") + "%";
  96. var taskTellNumDt = taskTellNumBLL.GetList(" F_HCState=1 and F_YJState=1 and F_UserId>0 and F_TaskId=" + model.TaskID).Tables[0];
  97. float connectedAgentCount = taskTellNumDt?.Rows.Count ?? 0;
  98. var connectedAgentRate = "0";
  99. connectedAgentRate = connected == 0 ? "0" : (connectedAgentCount / connected * 100).ToString("f2") + "%";
  100. var agentGroupStr = model.AgentGroupId == -999 ? "不转坐席" : "";
  101. var agentGroup = agentGroupList.SingleOrDefault(x => x.F_ZXZID == model.AgentGroupId);
  102. var agentCount = agentList.Where(x => x.F_SeartGroupID == (agentGroup?.F_ZXZID ?? 0)).Count();
  103. var dept = deptList.SingleOrDefault(y => y.F_DeptId == model.DeptId);
  104. var deptParent = deptList.SingleOrDefault(y => y.F_DeptId == (dept?.F_ParentId ?? 0));
  105. list.Add(new CallPlanDto
  106. {
  107. id = model.TaskID,
  108. name = model.TaskName,
  109. tasktype = model.TaskType == 1 ? "点击外呼" : "自动外呼",
  110. deptname = $"{ deptParent?.F_DeptName ?? ""} - { dept?.F_DeptName ?? "" }",
  111. state = Enum.GetName(typeof(EnumTaskState), (model.State ?? -1)),
  112. addtime = Convert.ToDateTime(model.AddTime).ToString("yyyy-MM-dd HH:mm:ss"),
  113. addagent = agentList.SingleOrDefault(x => x.F_UserId == model.AddAgentId)?.F_UserName ?? "",
  114. talkid = model.y_TkModelId ?? 0,
  115. pre = model.Pre, //线路前缀
  116. concurrencytype = model.ConcurrencyType,
  117. concurrency = model.Concurrency,
  118. planstartdate = model.PlanStartDate.ToString("yyyy-MM-dd"),
  119. planenddate = model.PlanEndDate.ToString("yyyy-MM-dd"),
  120. starttime1 = model.StartTime1.ToString("HH:mm:ss"),
  121. endtime1 = model.EndTime1.ToString("HH:mm:ss"),
  122. starttime2 = model.StartTime2.ToString("HH:mm:ss"),
  123. endtime2 = model.EndTime2.ToString("HH:mm:ss"),
  124. agentgroup = agentGroup?.F_ZXZName ?? agentGroupStr,//坐席组
  125. agentgroupid = model.AgentGroupId,
  126. agentcount = agentCount,//坐席组人数
  127. allcount = model.y_HMCount ?? 0, //号码总数
  128. calledcount = model.y_HCCount ?? 0, //已呼个数
  129. calledrate = calledRate, //已完成百分比
  130. callleftcount = (int)(allcount - calledcount), //剩余个数
  131. connected = model.y_YJCount ?? 0, //总应答数
  132. connectedrate = connectedRate, //应答率
  133. connectedagentcount = (int)connectedAgentCount, //转坐席数
  134. connectedagentrate = connectedAgentRate, //转坐席率
  135. });
  136. }
  137. var obj = new
  138. {
  139. rows = list,
  140. total = recordCount
  141. };
  142. return Content(obj.ToJson());
  143. }
  144. /// <summary>
  145. /// 获取实体
  146. /// </summary>
  147. /// <param name="id"></param>
  148. /// <returns></returns>
  149. public ActionResult GetModel(int id)
  150. {
  151. //if (!Request.IsAuthenticated)
  152. // return NoToken("未知错误,请重新登录");
  153. var model = taskBLL.GetModel(id);
  154. if (model == null)
  155. return Error("预测外呼任务不存在");
  156. //计算数据
  157. string calledRate = "0";
  158. var allcount = model.y_HMCount ?? 0;
  159. float calledcount = model.y_HCCount ?? 0;
  160. calledRate = allcount == 0 ? "" : (calledcount / allcount * 100).ToString("f2") + "%";
  161. string connectedRate = "0";
  162. float connected = model.y_YJCount ?? 0;
  163. connectedRate = calledcount == 0 ? "0" : (connected / calledcount * 100).ToString("f2") + "%";
  164. var taskTellNumDt = taskTellNumBLL.GetList(" F_HCState=1 and F_YJState=1 and F_UserId>0 and F_TaskId=" + model.TaskID).Tables[0];
  165. float connectedAgentCount = taskTellNumDt?.Rows.Count ?? 0;
  166. var connectedAgentRate = "0";
  167. connectedAgentRate = connected == 0 ? "0" : (connectedAgentCount / connected * 100).ToString("f2") + "%";
  168. //查询坐席组
  169. var agentGroupList = seatGroupBLL.DataTableToList(seatGroupBLL.GetList("").Tables[0]);
  170. //查询坐席
  171. var agentList = userAccount.DataTableToList(userAccount.GetList(" F_DeleteFlag=0 ").Tables[0]);
  172. var agentGroupStr = model.AgentGroupId == -999 ? "不转坐席" : "";
  173. var agentGroup = agentGroupList.SingleOrDefault(x => x.F_ZXZID == model.AgentGroupId);
  174. var agentCount = agentList.Where(x => x.F_SeartGroupID == (agentGroup?.F_ZXZID ?? 0)).Count();
  175. return Success("获取成功", new CallPlanDto
  176. {
  177. id = model.TaskID,
  178. name = model.TaskName,
  179. tasktype = model.TaskType == 1 ? "点击外呼" : "自动外呼",
  180. state = "暂停",
  181. addtime = Convert.ToDateTime(model.AddTime).ToString("yyyy-MM-dd HH:mm:ss"),
  182. talkid = model.y_TkModelId ?? 0,
  183. pre = model.Pre, //线路前缀
  184. recordpathid = model.RecordFileId,
  185. concurrencytypestr = model.ConcurrencyType == 0 ? "并发数" : "并发速率",
  186. concurrencytype = model.ConcurrencyType,
  187. concurrency = model.Concurrency,
  188. planstartdate = model.PlanStartDate.ToString("yyyy-MM-dd"),
  189. planenddate = model.PlanEndDate.ToString("yyyy-MM-dd"),
  190. starttime1 = model.StartTime1.ToString("HH:mm"),
  191. endtime1 = model.EndTime1.ToString("HH:mm"),
  192. starttime2 = model.StartTime2.ToString("HH:mm"),
  193. endtime2 = model.EndTime2.ToString("HH:mm"),
  194. agentgroup = agentGroup?.F_ZXZName ?? agentGroupStr,//坐席组
  195. agentgroupid = model.AgentGroupId,
  196. agentcount = agentCount,//坐席组人数
  197. allcount = model.y_HMCount ?? 0, //号码总数
  198. calledcount = model.y_HCCount ?? 0, //已呼个数
  199. calledrate = calledRate, //已完成百分比
  200. callleftcount = (int)(allcount - calledcount), //剩余个数
  201. connected = model.y_YJCount ?? 0, //总应答数
  202. connectedrate = connectedRate, //应答率
  203. connectedagentcount = (int)connectedAgentCount, //转坐席数
  204. connectedagentrate = connectedAgentRate, //转坐席率
  205. });
  206. }
  207. [Authority]
  208. /// <summary>
  209. /// 添加/修改
  210. /// </summary>
  211. /// <param name="input"></param>
  212. /// <returns></returns>
  213. public ActionResult CreateOrUpdate(CallPlanInput input)
  214. {
  215. //if (!Request.IsAuthenticated)
  216. // return NoToken("未知错误,请重新登录");
  217. var model = new Model.T_CTI_Task();
  218. if (input.Id <= 0)
  219. {
  220. model.TaskName = input.Name;
  221. model.TaskType = input.Type;
  222. model.AgentGroupId = input.AgentGroupId;
  223. model.y_TkModelId = input.PagerId;
  224. model.Pre = input.Pre;
  225. if (input.ConcurrencyType == 0)
  226. {
  227. var num = 0;
  228. if (!int.TryParse(input.Concurrency.ToString(), out num))
  229. return Error("并发数必须为不小于1的整数");
  230. input.Concurrency = (int)input.Concurrency;
  231. }
  232. if (input.Concurrency < 1)
  233. return Error("输入的并发数和进号速率必须不小于1");
  234. model.ConcurrencyType = input.ConcurrencyType;
  235. model.Concurrency = input.ConcurrencyType == 0 ? (int)input.Concurrency : input.Concurrency;
  236. model.RecordFileId = input.RecordPathId;
  237. model.DeptId = input.DeptId <= 0 ? CurrentUser.UserData.F_DeptId : input.DeptId;
  238. model.AddAgentId = CurrentUser.UserData.F_UserId;
  239. model.y_HMCount = 0;
  240. model.y_HCCount = 0;
  241. model.y_YJCount = 0;
  242. model.y_HTCount = 0;
  243. model.TrunkGroupID = 0;
  244. model.CallType = 1;
  245. model.State = 2;
  246. model.AddTime = DateTime.Now;
  247. model.y_PSort = 2;
  248. model.y_SXH = 0;
  249. model.y_FPCount = 0;
  250. model.y_HSCount = 0;
  251. model.y_OkCount = 0;
  252. model.y_RFCount = 0;
  253. model.y_ConsCount = 0;
  254. model.y_InvlCount = 0;
  255. model.y_NoAnswerCount = 0;
  256. model.y_ShutDownCount = 0;
  257. model.PlanStartDate = input.PlanStartDate ?? DateTime.Now;
  258. model.PlanEndDate = input.PlanEndDate?.AddDays(1).AddSeconds(-1) ?? DateTime.Now;
  259. model.StartTime1 = input.StartTime1 ?? DateTime.Now;
  260. model.EndTime1 = input.EndTime1 ?? DateTime.Now;
  261. model.StartTime2 = input.StartTime2 ?? DateTime.Now;
  262. model.EndTime2 = input.EndTime2 ?? DateTime.Now;
  263. var taskId = taskBLL.Add(model);
  264. if (taskId > 0)
  265. {
  266. try
  267. {
  268. if (input.TempId > 0)
  269. {
  270. var fields = pageFieldBLL.DataTableToList(pageFieldBLL.GetList($" F_TaskId=0 and F_TempId={input.TempId}").Tables[0]);
  271. foreach (var item in fields)
  272. {
  273. pageFieldBLL.Add(new T_Call_PageField()
  274. {
  275. F_Name = item.F_Name,
  276. F_FeildId = item.F_FeildId,
  277. F_TaskId = (int)taskId,
  278. F_Sort = item.F_Sort,
  279. F_DBFieldlName = item.F_DBFieldlName
  280. });
  281. }
  282. }
  283. else
  284. {
  285. pageFieldBLL.UpdateByTaskId(taskId);
  286. }
  287. model.TaskID = taskId;
  288. DataTable dt = taskTellNumBLL.GetTableDesign();
  289. switch (input.ImportType)
  290. {
  291. case 1: //从文本文件导入
  292. var file = Request.Files[0];
  293. using (StreamReader sr = new StreamReader(file.InputStream))
  294. {
  295. String line;
  296. while ((line = sr.ReadLine()) != null)
  297. {
  298. var row = dt.NewRow();
  299. row["F_TaskId"] = model.TaskID;
  300. row["F_Phone"] = line.ToString();
  301. dt.Rows.Add(row);
  302. }
  303. }
  304. break;
  305. case 2: //从文本框中导入
  306. if (string.IsNullOrWhiteSpace(input.PhoneList))
  307. return Error("号码不可以为空");
  308. var arr = input.PhoneList.Split(new char[] { '\r', '\n', ',', ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
  309. foreach (var p in arr)
  310. {
  311. var row = dt.NewRow();
  312. row["F_TaskId"] = model.TaskID;
  313. row["F_Phone"] = p;
  314. dt.Rows.Add(row);
  315. }
  316. break;
  317. case 3: //从号码段导入
  318. if (string.IsNullOrWhiteSpace(input.PhoneStr))
  319. return Error("号码不可以为空");
  320. double phoneInt = 0;
  321. if (!double.TryParse(input.PhoneStr, out phoneInt))
  322. return Error("请输入正确的手机号码段");
  323. phoneInt = phoneInt * 10000;
  324. for (int i = 1; i < 10000; i++)
  325. {
  326. var row = dt.NewRow();
  327. row["F_TaskId"] = model.TaskID;
  328. row["F_Phone"] = phoneInt + i;
  329. dt.Rows.Add(row);
  330. }
  331. break;
  332. case 4: //从Excel中导入
  333. if (!string.IsNullOrWhiteSpace(input.SelectIds))
  334. {
  335. string[] strArr = input.SelectIds.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  336. var idArr = strArr.Select(x => Convert.ToInt32(x)).ToArray();
  337. var fieldList = pageFieldBLL.DataTableToList(pageFieldBLL.GetList($"F_ID in ({string.Join(",", idArr)})").Tables[0]);
  338. NPOIHelper npoi = new NPOIHelper();
  339. var dtExcel = npoi.ExcelToTable(input.FilePath, 0);
  340. for (int i = 0; i < dtExcel.Rows.Count; i++)
  341. {
  342. var row = dt.NewRow();
  343. for (int j = 0; j < dtExcel.Columns.Count; j++)
  344. {
  345. if (fieldList.Count < (j + 1))
  346. break;
  347. row["F_TaskId"] = model.TaskID;
  348. var field = fieldList.SingleOrDefault(x => x.F_Id == idArr[j]);
  349. row[field.F_DBFieldlName] = dtExcel.Rows[i][j];
  350. }
  351. dt.Rows.Add(row);
  352. }
  353. }
  354. break;
  355. }
  356. if (input.CheckFilter1)
  357. {
  358. PhoneNumFilter(dt);
  359. }
  360. if (input.CheckFilter2)
  361. {
  362. PhoneNumFilterMonth(dt);
  363. }
  364. taskTellNumBLL.SqlBulkCopy(dt);
  365. model.y_HMCount = dt.Rows.Count;
  366. if (taskBLL.Update(model))
  367. return Success("添加成功");
  368. return Error("添加失败");
  369. }
  370. catch (Exception e)
  371. {
  372. return Error(e.Message);
  373. }
  374. }
  375. return Error("添加失败");
  376. }
  377. model = taskBLL.GetModel(input.Id);
  378. if (model == null)
  379. return Error("当前外呼任务不存在");
  380. model.TaskName = input.Name;
  381. model.TaskType = input.Type;
  382. model.AgentGroupId = input.AgentGroupId;
  383. model.y_TkModelId = input.PagerId;
  384. //model.Pre = input.Pre;
  385. if (input.ConcurrencyType == 0)
  386. {
  387. var num = 0;
  388. if (!int.TryParse(input.Concurrency.ToString(), out num))
  389. return Error("并发数必须为不小于1的整数");
  390. input.Concurrency = (int)input.Concurrency;
  391. }
  392. if (input.Concurrency < 1)
  393. return Error("输入的并发数和进号速率必须不小于1");
  394. model.ConcurrencyType = input.ConcurrencyType;
  395. model.Concurrency = input.ConcurrencyType == 0 ? (int)input.Concurrency : input.Concurrency;
  396. model.PlanStartDate = input.PlanStartDate ?? DateTime.Now;
  397. model.PlanEndDate = input.PlanEndDate?.AddDays(1).AddSeconds(-1) ?? DateTime.Now;
  398. model.StartTime1 = input.StartTime1 ?? DateTime.Now;
  399. model.EndTime1 = input.EndTime1 ?? DateTime.Now;
  400. model.StartTime2 = input.StartTime2 ?? DateTime.Now;
  401. model.EndTime2 = input.EndTime2 ?? DateTime.Now;
  402. model.RecordFileId = input.RecordPathId;
  403. if (taskBLL.Update(model))
  404. return Success("修改成功");
  405. return Error("修改失败");
  406. }
  407. /// <summary>
  408. /// 更新状态
  409. /// </summary>
  410. /// <param name="id"></param>
  411. /// <param name="state"></param>
  412. /// <returns></returns>
  413. public ActionResult UpdateState(int[] ids, int state)
  414. {
  415. //if (!Request.IsAuthenticated)
  416. // return NoToken("未知错误,请重新登录");
  417. var sql = "";
  418. if (ids.Length > 0)
  419. {
  420. sql += " TaskID in (" + string.Join(",", ids) + ") ";
  421. }
  422. var model = taskBLL.GetList(sql).Tables[0];
  423. foreach (DataRow item in model.Rows)
  424. {
  425. if (Convert.ToInt32(item["State"]) == -1)
  426. return Error("选择的任务存在已删除状态,执行失败");
  427. }
  428. if (taskBLL.UpdateStateBatch(sql, state))
  429. return Success("修改成功");
  430. return Error("修改失败");
  431. }
  432. /// <summary>
  433. /// 更新并发数
  434. /// </summary>
  435. /// <param name="id"></param>
  436. /// <param name="concurrency"></param>
  437. /// <returns></returns>
  438. public ActionResult UpdateConcurrency(long id, float concurrency, int concurrencyType = 0)
  439. {
  440. //if (!Request.IsAuthenticated)
  441. // return NoToken("未知错误,请重新登录");
  442. var model = taskBLL.GetModel(id);
  443. if (model == null)
  444. return Error("该外呼任务不存在");
  445. if (concurrencyType == 0)
  446. {
  447. var num = 0;
  448. if (!int.TryParse(concurrency.ToString(), out num))
  449. return Error("并发数必须为不小于1的整数");
  450. concurrency = num;
  451. }
  452. if (concurrency < 1)
  453. return Error("输入的并发数和进号速率必须不小于1");
  454. model.ConcurrencyType = concurrencyType;
  455. model.Concurrency = concurrency;
  456. if (taskBLL.Update(model))
  457. return Success("修改成功");
  458. return Error("修改失败");
  459. }
  460. /// <summary>
  461. /// 清空号码
  462. /// </summary>
  463. /// <returns></returns>
  464. public ActionResult ClearPhone(long id)
  465. {
  466. //if (!Request.IsAuthenticated)
  467. // return NoToken("未知错误,请重新登录");
  468. var num = taskBLL.DeletePhoneByTaskId(id);
  469. if (num > 0)
  470. {
  471. var task = taskBLL.GetModel(id);
  472. return Success("删除成功");
  473. }
  474. return Error("删除失败");
  475. }
  476. /// <summary>
  477. /// 去除号码前缀
  478. /// </summary>
  479. /// <param name="callId"></param>
  480. /// <param name="tel"></param>
  481. /// <returns></returns>
  482. public ActionResult RemovePre(string callId, string tel)
  483. {
  484. //if (!Request.IsAuthenticated)
  485. // return NoToken("未知错误,请重新登录");
  486. var callResult = callResultBLL.GetModel(callId);
  487. if (callResult == null)
  488. return Error("通话记录未正常添加");
  489. var task = taskBLL.GetModel(callResult.TaskId);
  490. if (task == null)
  491. return Error("任务不存在");
  492. var len = task.Pre.Length;
  493. return Success("去除成功", tel.Substring(len));
  494. }
  495. /// <summary>
  496. /// 更新外呼任务状态
  497. /// </summary>
  498. /// <returns></returns>
  499. public ActionResult UpdateCallPlanState()
  500. {
  501. StringBuilder sb = new StringBuilder();
  502. var log = LogFactory.GetLogger(this.GetType().ToString());
  503. var list = taskBLL.DataTableToList(taskBLL.GetList(" state>=0 ").Tables[0]);
  504. foreach (var task in list)
  505. {
  506. if (task.PlanStartDate <= DateTime.Now && task.PlanEndDate > DateTime.Now)
  507. {
  508. if (task.State == 2)
  509. {
  510. if (task.PlanStartDate < DateTime.Now && DateTime.Now < task.StartTime1)
  511. {
  512. task.State = 0;
  513. if (!taskBLL.Update(task))
  514. return Error($"更新自动外呼任务状态为0=待处理失败,ID={task.TaskID},Name={task.TaskName}");
  515. log.Info($"更新自动外呼任务状态为0=待处理成功,ID={task.TaskID},Name={task.TaskName}");
  516. }
  517. }
  518. if (task.State == 0)
  519. {
  520. if ((DateTime.Now >= task.StartTime1 && DateTime.Now < task.EndTime1) || (DateTime.Now > task.StartTime2 && DateTime.Now < task.EndTime2))
  521. {
  522. task.State = 1;
  523. if (!taskBLL.Update(task))
  524. return Error($"更新自动外呼任务状态为1=处理中失败,ID={task.TaskID},Name={task.TaskName}");
  525. log.Info($"更新自动外呼任务状态为1=处理中成功,ID={task.TaskID},Name={task.TaskName}");
  526. }
  527. }
  528. if (task.State == 1)
  529. {
  530. if (task.PlanEndDate < DateTime.Now)
  531. {
  532. task.State = 0;
  533. if (!taskBLL.Update(task))
  534. return Error($"更新自动外呼任务状态为2=暂停失败,ID={task.TaskID},Name={task.TaskName}");
  535. log.Info($"更新自动外呼任务状态为2=暂停成功,ID={task.TaskID},Name={task.TaskName}");
  536. }
  537. }
  538. }
  539. }
  540. return Success("处理完成");
  541. }
  542. /// <summary>
  543. /// 获取号码
  544. /// </summary>
  545. /// <param name="id"></param>
  546. /// <param name="pageSize"></param>
  547. /// <param name="pageIndex"></param>
  548. /// <returns></returns>
  549. public ActionResult GetPhoneList(FilterCallPhone filter)
  550. {
  551. //if (!Request.IsAuthenticated)
  552. // return NoToken("未知错误,请重新登录");
  553. var model = taskBLL.GetModel(filter.Id);
  554. if (model == null)
  555. return Error("外呼任务不存在");
  556. var sql = "";
  557. if (filter.UserId > 0)
  558. {
  559. sql += $" and F_UserId={filter.UserId} ";
  560. }
  561. if (!string.IsNullOrWhiteSpace(filter.Phone))
  562. {
  563. sql += $" and F_Phone like '%{filter.Phone}%'";
  564. }
  565. if (filter.FPState > -1)
  566. {
  567. sql += $" and F_FPState={filter.FPState} ";
  568. }
  569. if (filter.HCState > -1)
  570. {
  571. sql += $" and F_HCState={filter.HCState} ";
  572. }
  573. if (filter.YJState > -1)
  574. {
  575. sql += $" and F_YJState={filter.YJState} ";
  576. }
  577. var field = "F_Id,t.TaskName,F_Phone,F_FPState,F_HCState,F_YJState,F_Username,tn.F_CreateTime,tn.F_LastCallTime";
  578. if (model.TaskType == 2)
  579. {
  580. field = " F_Phone,F_HCState,F_YJState,F_Username,tn.F_CreateTime,tn.F_LastCallTime";
  581. }
  582. var recordCount = 0;
  583. var dt = BLL.PagerBLL.GetListPager(
  584. " T_Call_TaskTelNum tn left join T_CTI_Task t on t.TaskID=tn.F_TaskId left join T_Call_CallRecords c on c.TaskType=9 and c.TaskPhoneID=tn.F_Id and c.TaskID=tn.F_TaskId ",
  585. " F_Id ",
  586. field,
  587. " and F_TaskId=" + filter.Id + sql,
  588. "ORDER BY F_Id desc",
  589. filter.PageSize,
  590. filter.PageIndex,
  591. true,
  592. out recordCount);
  593. List<Model.T_Call_TaskTelNum> modelList = new BLL.T_Call_TaskTelNum().DataTableToListForShow(dt);
  594. var obj = new
  595. {
  596. rows = modelList.Select(x => new
  597. {
  598. id = x.F_Id,
  599. taskname = x.TaskName,
  600. phone = x.F_Phone,
  601. agent = string.IsNullOrWhiteSpace(x.F_UserName) ? "" : x.F_UserName,
  602. isallot = x.F_FPState == null ? "" : (x.F_FPState > 0 ? "已分配" : "未分配"),
  603. iscalled = x.F_HCState > 0 ? "已呼叫" : "未呼叫",
  604. isconnected = x.F_YJState > 0 ? "已接通" : "未接通",
  605. createtime = x.F_CreateTime == null ? "" : Convert.ToDateTime(x.F_CreateTime).ToString("yyyy-MM-dd HH:mm:ss"),
  606. lastcalltime = x.F_LastCallTime == null ? "" : Convert.ToDateTime(x.F_LastCallTime).ToString("yyyy-MM-dd HH:mm:ss")
  607. }),
  608. total = recordCount
  609. };
  610. return Content(obj.ToJson());
  611. }
  612. /// <summary>
  613. /// 获取分配给当前登录坐席的号码
  614. /// </summary>
  615. /// <param name="filter"></param>
  616. /// <returns></returns>
  617. public ActionResult GetMyPhoneList(FilterCallPhone filter)
  618. {
  619. if (!Request.IsAuthenticated)
  620. return NoToken("未知错误,请重新登录");
  621. var sql = $" and t.State=1 and F_UserId={CurrentUser.UserData.F_UserId} ";
  622. if (filter.Id > 0)
  623. {
  624. var model = taskBLL.GetModel(filter.Id);
  625. sql += " and F_TaskId=" + filter.Id;
  626. if (model == null)
  627. return Error("外呼任务不存在");
  628. }
  629. if (!string.IsNullOrWhiteSpace(filter.Phone))
  630. {
  631. sql += $" and F_Phone like '%{filter.Phone}%'";
  632. }
  633. switch (filter.RequestType)
  634. {
  635. case 1://我的任务
  636. sql += $" and F_HCState=0 ";
  637. break;
  638. case 2://我的任务结果
  639. sql += $" and F_HCState=1 ";
  640. break;
  641. case 3://任务结果数据
  642. break;
  643. default:
  644. break;
  645. }
  646. if (filter.FPState > -1)
  647. {
  648. sql += $" and F_FPState={filter.FPState} ";
  649. }
  650. if (filter.HCState > -1)
  651. {
  652. sql += $" and F_HCState={filter.HCState} ";
  653. }
  654. if (filter.YJState > -1)
  655. {
  656. sql += $" and F_YJState={filter.YJState} ";
  657. }
  658. if (filter.YHFKID > -1)
  659. {
  660. sql += $" and F_YHFKID={filter.YHFKID} ";
  661. }
  662. if (filter.HJJGID > -1)
  663. {
  664. sql += $" and F_HJJGID={filter.HJJGID} ";
  665. }
  666. var field = "F_Id,t.TaskName,F_Phone,F_FPState,F_HCState,F_YJState,F_Username,tn.F_CreateTime,F_HJJGName,F_YHFKName,F_LastCallTime";
  667. var recordCount = 0;
  668. var dt = BLL.PagerBLL.GetListPager(
  669. " T_Call_TaskTelNum tn left join T_CTI_Task t on t.TaskID=tn.F_TaskId",
  670. " F_Id ",
  671. field,
  672. sql,
  673. "ORDER BY F_LastCallTime desc,F_ID DESC ",
  674. filter.PageSize,
  675. filter.PageIndex,
  676. true,
  677. out recordCount);
  678. List<Model.T_Call_TaskTelNum> modelList = new BLL.T_Call_TaskTelNum().DataTableToListForShow(dt);
  679. var obj = new
  680. {
  681. rows = modelList.Select(x => new
  682. {
  683. id = x.F_Id,
  684. taskname = x.TaskName,
  685. phone = x.F_Phone,
  686. agent = string.IsNullOrWhiteSpace(x.F_UserName) ? "" : x.F_UserName,
  687. isallot = x.F_FPState == null ? "" : (x.F_FPState > 0 ? "已分配" : "未分配"),
  688. iscalled = x.F_HCState > 0 ? "已呼叫" : "未呼叫",
  689. isconnected = x.F_YJState > 0 ? "已接通" : "未接通",
  690. hjjg = x.F_HJJGName,
  691. yhfk = x.F_YHFKName,
  692. createtime = Convert.ToDateTime(x.F_CreateTime).ToString("yyyy-MM-dd HH:mm:ss"),
  693. lastcalltime = x.F_LastCallTime == null ? "" : Convert.ToDateTime(x.F_LastCallTime).ToString("yyyy-MM-dd HH:mm:ss")
  694. }),
  695. total = recordCount
  696. };
  697. return Content(obj.ToJson());
  698. }
  699. /// <summary>
  700. /// 任务结果查询-自定义列表头
  701. /// </summary>
  702. /// <param name="filter"></param>
  703. /// <returns></returns>
  704. public ActionResult GetPhoneResultHead(FilterCallPhone filter)
  705. {
  706. var headList1 = new List<string>() { "序号", "外呼计划", "号码Id", "号码", "分配坐席", "呼叫状态", "接通状态", "呼叫结果", "结果反馈", "导入时间", "呼出时间" };
  707. //根据任务id查问卷
  708. var task = taskBLL.GetModel(filter.Id);
  709. if (task == null)
  710. return Error("该任务不存在");
  711. var headDt = DbHelperSQL.Query($"select Q.F_TITLE from T_Ask_Question Q LEFT JOIN T_Ask_PagerItems PIT ON PIT.F_QuestionId = Q.F_QuestionId LEFT JOIN T_Ask_PagerInfo PIN ON PIN.F_PagerId = PIT.F_PagerId LEFT JOIN T_CTI_Task T ON T.y_TkModelId = PIN.F_PagerId where T.TaskID ={task.TaskID} ORDER BY Q.F_SortModel").Tables[0];
  712. var headList2 = new List<string>();
  713. foreach (DataRow row in headDt.Rows)
  714. {
  715. headList2.Add(row["F_TITLE"]?.ToString() ?? "");
  716. }
  717. var headList = new List<string>();
  718. headList.AddRange(headList1);
  719. headList.AddRange(headList2);
  720. return Success("获取成功", new
  721. {
  722. headlist = headList
  723. });
  724. }
  725. /// <summary>
  726. /// 任务结果查询-自定义列数据
  727. /// </summary>
  728. /// <param name="filter"></param>
  729. /// <returns></returns>
  730. public ActionResult GetPhoneResult(FilterCallPhone filter)
  731. {
  732. var headList1 = new List<string>() { "序号", "外呼计划", "号码Id", "号码", "分配坐席", "呼叫状态", "接通状态", "呼叫结果", "结果反馈", "导入时间", "呼出时间" };
  733. //根据任务id查问卷
  734. var task = taskBLL.GetModel(filter.Id);
  735. if (task == null)
  736. return Error("该任务不存在");
  737. var headDt = DbHelperSQL.Query($"select Q.F_TITLE from T_Ask_Question Q LEFT JOIN T_Ask_PagerItems PIT ON PIT.F_QuestionId = Q.F_QuestionId LEFT JOIN T_Ask_PagerInfo PIN ON PIN.F_PagerId = PIT.F_PagerId LEFT JOIN T_CTI_Task T ON T.y_TkModelId = PIN.F_PagerId where T.TaskID ={task.TaskID} ORDER BY Q.F_SortModel").Tables[0];
  738. var headList2 = new List<string>();
  739. foreach (DataRow row in headDt.Rows)
  740. {
  741. headList2.Add(row["F_TITLE"]?.ToString() ?? "");
  742. }
  743. var headList = new List<string>();
  744. headList.AddRange(headList1);
  745. headList.AddRange(headList2);
  746. //查询数据
  747. //var sql = " 1=1 ";
  748. var sql = " ";
  749. if (filter.Id > 0)
  750. {
  751. var model = taskBLL.GetModel(filter.Id);
  752. sql += " and F_TaskId=" + filter.Id;
  753. if (model == null)
  754. return Error("外呼任务不存在");
  755. }
  756. if (!string.IsNullOrWhiteSpace(filter.Phone))
  757. {
  758. sql += $" and F_Phone like '%{filter.Phone}%'";
  759. }
  760. if (filter.FPState > -1)
  761. {
  762. sql += $" and F_FPState={filter.FPState} ";
  763. }
  764. if (filter.HCState > -1)
  765. {
  766. sql += $" and F_HCState={filter.HCState} ";
  767. }
  768. if (filter.YJState > -1)
  769. {
  770. sql += $" and F_YJState={filter.YJState} ";
  771. }
  772. if (filter.YHFKID > -1)
  773. {
  774. sql += $" and F_YHFKID={filter.YHFKID} ";
  775. }
  776. if (filter.HJJGID > -1)
  777. {
  778. sql += $" and F_HJJGID={filter.HJJGID} ";
  779. }
  780. var field = "F_Id,t.TaskName,F_Phone,F_FPState,F_HCState,F_YJState,F_Username,tn.F_CreateTime,F_HJJGName,F_YHFKName,tn.F_LastCallTime";
  781. var recordCount = 0;
  782. var dt = BLL.PagerBLL.GetListPager(
  783. " T_Call_TaskTelNum tn left join T_CTI_Task t on t.TaskID=tn.F_TaskId",
  784. " F_Id ",
  785. field,
  786. sql,
  787. "ORDER BY F_LastCallTime desc,F_ID DESC ",
  788. filter.PageSize,
  789. filter.PageIndex,
  790. true,
  791. out recordCount);
  792. List<Model.T_Call_TaskTelNum> modelList = new BLL.T_Call_TaskTelNum().DataTableToListForShow(dt);
  793. List<Model.T_Call_Answers> answerList = new List<T_Call_Answers>();
  794. if (modelList.Count > 0)
  795. {
  796. answerList = ansBLL.DataTableToListDTO(DbHelperSQL.Query($" select A.F_QID, A.F_CusTelID, A.F_Answer from T_Call_Answers A LEFT JOIN T_Ask_Question Q ON Q.F_QuestionId=A.F_QID where F_TaskID={ task.TaskID} AND F_CusTelID in ({ string.Join(", ", string.Join(", ", modelList.Select(x => x.F_Id).ToArray()))}) ORDER BY Q.F_SortModel ").Tables[0]);
  797. }
  798. var numList = modelList.Select(x => new
  799. {
  800. id = x.F_Id.ToString(),
  801. taskname = x.TaskName,
  802. phone = x.F_Phone,
  803. agent = string.IsNullOrWhiteSpace(x.F_UserName) ? "" : x.F_UserName,
  804. isallot = x.F_FPState == null ? "" : (x.F_FPState > 0 ? "已分配" : "未分配"),
  805. iscalled = x.F_HCState > 0 ? "已呼叫" : "未呼叫",
  806. isconnected = x.F_YJState > 0 ? "已接通" : "未接通",
  807. hjjg = x.F_HJJGName,
  808. yhfk = x.F_YHFKName,
  809. createtime = Convert.ToDateTime(x.F_CreateTime).ToString("yyyy-MM-dd HH:mm:ss"),
  810. lastcalltime = x.F_LastCallTime == null ? "" : Convert.ToDateTime(x.F_LastCallTime).ToString("yyyy-MM-dd HH:mm:ss")
  811. });
  812. var dataList = new List<List<string>>();
  813. foreach (var item in numList)
  814. {
  815. var answer = answerList.Where(x => (x.F_CusTelID?.ToString() ?? "") == item.id).GroupBy(x => x.F_QID).ToList();
  816. var itemList = new List<string>();
  817. itemList.AddRange(new string[] { item.id, item.taskname, item.phone, item.agent, item.isallot, item.iscalled, item.isconnected, item.hjjg, item.yhfk, item.createtime, item.lastcalltime });
  818. if (answer.Count() > 0)
  819. {
  820. foreach (var i in answer)
  821. {
  822. itemList.Add(string.Join(", ", i.Where(x => !string.IsNullOrWhiteSpace(x.F_Answer)).Select(x => x.F_Answer).Distinct()));
  823. }
  824. }
  825. else
  826. {
  827. for (int i = 0; i < headList2.Count; i++)
  828. {
  829. itemList.Add("");
  830. }
  831. }
  832. dataList.Add(itemList);
  833. }
  834. if (filter.IsExport)
  835. {
  836. NPOIHelper npoi = new NPOIHelper();
  837. var msg1 = npoi.ExportToExcel(DateTime.Now.ToString("yyyyMMdd") + task.TaskName + "导出任务结果查询报表", dataList, headList.ToArray());
  838. return !string.IsNullOrWhiteSpace(msg1) ? Error(msg1) : Success("导出成功");
  839. }
  840. List<Dictionary<string, string>> result = new List<Dictionary<string, string>>();
  841. for (int i = 0; i < dataList.Count(); i++)
  842. {
  843. Dictionary<string, string> dic = new Dictionary<string, string>();
  844. for (int j = 0; j < dataList[i].Count(); j++)
  845. {
  846. dic.Add("items" + j, dataList[i][j]);
  847. }
  848. result.Add(dic);
  849. }
  850. var obj = new
  851. {
  852. statusCode = 200,
  853. code = 0,
  854. msg = "",
  855. rows = result,
  856. total = recordCount
  857. };
  858. return Content(obj.ToJson(), "application/json");
  859. }
  860. /// <summary>
  861. /// 坐席自主获取号码(点击外呼分配号码)
  862. /// </summary>
  863. /// <param name="id">外呼任务ID</param>
  864. /// <param name="userId">坐席ID</param>
  865. /// <returns></returns>
  866. public ActionResult AllotPhoneList(int id, int count)
  867. {
  868. //if (!Request.IsAuthenticated)
  869. // return NoToken("未知错误,请重新登录");
  870. if (count <= 0)
  871. return Error("参数错误");
  872. if (id <= 0)
  873. return Error("请选择外呼任务");
  874. var model = taskBLL.GetModel(id);
  875. if (model == null)
  876. return Error("外呼任务不存在");
  877. var obj = DbHelperSQL.GetSingle($"SELECT Count(F_ID) FROM T_Call_TaskTelNum WHERE F_UserId={CurrentUser.UserData.F_UserId} and F_TaskId={model.TaskID} and F_FPState=1 and F_HCState=0 and F_AllotStatus>0 ");
  878. var sum = obj == null ? 0 : Convert.ToInt32(obj);
  879. if (sum > 0)
  880. return Error($"请先完成任务【{model.TaskName}】已获取号码的呼叫任务");
  881. var num = 50 - sum;
  882. if (num <= 0)
  883. return Error("已超出最多可获取数据条数,最多可获取数据为50条");
  884. num = Math.Abs(num);
  885. var res = DbHelperSQL.ExecuteSql($"UPDATE T_Call_TaskTelNum SET F_FPState=1,F_AllotStatus=1,F_UserId={CurrentUser.UserData.F_UserId},F_Username='{CurrentUser.UserData.F_UserName}' WHERE F_Id in(SELECT TOP({(count > num ? num : count)}) F_Id FROM T_Call_TaskTelNum WHERE F_TaskId={id} and F_FPState=0 and F_AllotStatus=0)");
  886. if (res > 0)
  887. return Success($"获取到{res}条可用号码");
  888. return Error("未获取到可用号码");
  889. }
  890. /// <summary>
  891. /// 取消分配
  892. /// </summary>
  893. /// <param name="ids"></param>
  894. /// <returns></returns>
  895. public ActionResult CancelPhone(int[] ids)
  896. {
  897. if (ids == null || ids.Length <= 0)
  898. return Error("请选择");
  899. var arr = string.Join(",", ids);
  900. var dt = DbHelperSQL.Query($"SELECT F_Id,F_FPState from T_Call_TaskTelNum where F_FPState=0 and F_ID in ({arr})");
  901. if (dt != null && dt.Tables.Count > 0 && dt.Tables[0].Rows.Count > 0)
  902. return Error("选中的选项中存在未分配的数据,无法取消");
  903. if (taskTellNumBLL.CancelFP(arr))
  904. return Success("取消成功");
  905. return Error("取消失败");
  906. }
  907. /// <summary>
  908. /// 获取坐席可进行呼叫的点击外呼任务
  909. /// </summary>
  910. /// <returns></returns>
  911. public ActionResult GetMyCallPlan()
  912. {
  913. var roleid = CurrentUser.UserData.F_RoleId;
  914. var deptid = CurrentUser.UserData.F_DeptId;
  915. var deptCode = CurrentUser.UserData.F_DeptCode;
  916. var usercode = CurrentUser.UserData.F_UserCode;
  917. StringBuilder sql = new StringBuilder();
  918. if (roleid != 0)
  919. {
  920. if (roleid != 17)
  921. {
  922. if (deptCode.Replace("|0|1|", "").Length > 0)
  923. {
  924. var deptDt = DbHelperSQL.Query($"with cte(F_DeptId,F_ParentId) as(select F_DeptId,F_ParentId from T_Sys_Department where F_DeptId={deptid} union all select dept.F_DeptId,dept.F_ParentId from T_Sys_Department dept inner join cte on dept.F_DeptId = cte.F_ParentId)select F_DeptId from cte").Tables[0];
  925. List<int> deptList = new List<int>();
  926. if (deptDt.Rows.Count > 0)
  927. {
  928. foreach (DataRow row in deptDt.Rows)
  929. {
  930. if (row["F_DeptId"] != DBNull.Value)
  931. {
  932. deptList.Add(Convert.ToInt32(row["F_DeptId"]));
  933. }
  934. }
  935. }
  936. if (deptList.Count > 0)
  937. {
  938. sql.Append($" and DeptId in ({string.Join(",", deptList)})");
  939. }
  940. }
  941. }
  942. }
  943. var taskList = taskBLL.DataTableToList(taskBLL.GetList("state=1 and tasktype=1 " + sql.ToString()).Tables[0]);
  944. return Success("获取成功", taskList.Select(x => new
  945. {
  946. id = x.TaskID,
  947. name = x.TaskName
  948. }));
  949. }
  950. /// <summary>
  951. /// 获取拨出号码的详细信息+自定义导入信息
  952. /// </summary>
  953. /// <param name="id"></param>
  954. /// <returns></returns>
  955. public ActionResult GetCallNumDetail(int id)
  956. {
  957. var taskId = DbHelperSQL.GetSingle($"SELECT F_TaskId FROM T_Call_TaskTelNum WHERE F_ID={id}");
  958. if (taskId == null || (int)taskId <= 0)
  959. return Error("外呼任务不存在");
  960. var task = taskBLL.GetModel((int)taskId);
  961. if (task == null)
  962. return Error("外呼任务不存在");
  963. var fieldList = pageFieldBLL.DataTableToList(pageFieldBLL.GetList($"F_TaskId={task.TaskID}").Tables[0]);
  964. StringBuilder sb = new StringBuilder();
  965. Dictionary<string, string> dicTitle = new Dictionary<string, string>();
  966. foreach (var item in fieldList)
  967. {
  968. sb.Append(item.F_DBFieldlName + ",");
  969. dicTitle.Add(item.F_DBFieldlName, item.F_Name);
  970. }
  971. Dictionary<string, string> dic = new Dictionary<string, string>();
  972. if (!string.IsNullOrWhiteSpace(sb.ToString()))
  973. {
  974. var callNum = DbHelperSQL.Query($"SELECT {sb.ToString().Trim(',')} FROM T_Call_TaskTelNum WHERE F_ID={id}").Tables[0];
  975. for (int j = 0; j < callNum.Columns.Count; j++)
  976. {
  977. dic.Add(callNum.Columns[j].ColumnName, callNum.Rows[0][j].ToString());
  978. }
  979. return Success("获取成功", new
  980. {
  981. detail = dic.Select(x => new
  982. {
  983. field = x.Key,
  984. text = dicTitle[x.Key],
  985. value = x.Value,
  986. }),
  987. pagerid = task.y_TkModelId ?? 0,
  988. taskid = task.TaskID,
  989. id = id
  990. });
  991. }
  992. else
  993. {
  994. var callNum = DbHelperSQL.Query($"SELECT F_Phone FROM T_Call_TaskTelNum WHERE F_ID={id}").Tables[0];
  995. for (int j = 0; j < callNum.Columns.Count; j++)
  996. {
  997. dic.Add(callNum.Columns[j].ColumnName, callNum.Rows[0][j].ToString());
  998. }
  999. return Success("获取成功", new
  1000. {
  1001. detail = dic.Select(x => new
  1002. {
  1003. field = x.Key,
  1004. text = "电话号码",
  1005. value = x.Value,
  1006. }),
  1007. pagerid = task.y_TkModelId ?? 0,
  1008. taskid = task.TaskID,
  1009. id = id
  1010. });
  1011. }
  1012. }
  1013. /// <summary>
  1014. /// 更新拨出号码的 呼叫状态
  1015. /// </summary>
  1016. /// <returns></returns>
  1017. public ActionResult UpdateCallState(int id)
  1018. {
  1019. var model = taskTellNumBLL.GetModel(id);
  1020. if (model == null)
  1021. return Error("该号码信息不存在");
  1022. if (taskTellNumBLL.UpdateHC(model.F_Id, 1, 0))
  1023. {
  1024. var task = taskBLL.GetModel(model.F_TaskId == null ? 0 : Convert.ToInt32(model.F_TaskId));
  1025. if (task != null)
  1026. {
  1027. var obj = DbHelperSQL.GetSingle($"select COUNT(1) AS HC from T_Call_TaskTelNum where F_TaskId={task.TaskID} AND F_HCState=1 ");
  1028. task.y_HCCount = obj != null ? Convert.ToInt32(obj) : 0;
  1029. if (taskBLL.Update(task))
  1030. return Success("更新成功");
  1031. return Error("更新失败");
  1032. }
  1033. }
  1034. return Error("更新失败");
  1035. }
  1036. #region 问卷回答
  1037. /// <summary>
  1038. ///
  1039. /// </summary>
  1040. /// <param name="taskid">任务ID</param>
  1041. /// <param name="custelid">客户电话ID</param>
  1042. /// <param name="cusid">客户档案ID</param>
  1043. /// <param name="ans">答案,数组形式["15_20_单选选项内容","17_25|36|58_复选选项内容1|选项内容2|选项内容3","30_0_问答题"]</param>
  1044. /// <param name="hjjgid">呼叫结果</param>
  1045. /// <param name="yhfkid">用户反馈</param>
  1046. /// <returns></returns>
  1047. public ActionResult Answers(CallNumberInput input)
  1048. {
  1049. if (input.Id <= 0)
  1050. return Error("提交失败,当前号码不存在");
  1051. var otnModel = taskTellNumBLL.GetModel(input.Id);
  1052. if (otnModel.F_HCState <= 0)
  1053. return Error("提交失败,号码未进行呼叫");
  1054. int cc = 0;
  1055. var ansModel = new Model.T_Call_Answers();
  1056. string askqids = "";
  1057. string ansids = "";
  1058. if (input.Ans != null)
  1059. {
  1060. //先删除 后添加
  1061. ansBLL.DeleteByTelid(input.Id, input.TaskId);
  1062. ansModel.F_TaskID = input.TaskId;
  1063. ansModel.F_CusTelID = input.Id;
  1064. //ansModel.F_CusID = cusid;
  1065. ansModel.F_OptBy = CurrentUser.UserData.F_UserId;
  1066. ansModel.F_OptByName = CurrentUser.UserData.F_UserName;
  1067. ansModel.F_OptOn = DateTime.Now;
  1068. foreach (var item in input.Ans)
  1069. {
  1070. var nn = 0;
  1071. var ii = item.Split('_');
  1072. ansModel.F_QID = int.Parse(ii[0]);
  1073. askqids += ii[0] + ",";
  1074. ansids += ii[1] + ",";
  1075. if (ii[1].IndexOf('|') > 0)
  1076. {
  1077. var iii = ii[1].Trim('|').Split('|');
  1078. var iia = ii[2].Trim('|').Split('|');
  1079. for (int i = 0; i < iii.Length; i++)
  1080. {
  1081. ansModel.F_QIID = int.Parse(iii[i]);
  1082. ansModel.F_Answer = iia[i];
  1083. if (ansBLL.Add(ansModel) > 0)
  1084. nn++;
  1085. }
  1086. if (nn == iii.Length)
  1087. cc++;
  1088. }
  1089. else
  1090. {
  1091. ansModel.F_QIID = int.Parse(ii[1]);
  1092. ansModel.F_Answer = ii[2];
  1093. if (ansBLL.Add(ansModel) > 0)
  1094. cc++;
  1095. }
  1096. }
  1097. }
  1098. if (otnModel != null)
  1099. {
  1100. otnModel.F_HJJGId = input.HJJG;
  1101. var hjconfig = new BLL.T_Sys_DictionaryValue().GetModel(input.HJJG);
  1102. if (hjconfig != null)
  1103. {
  1104. otnModel.F_HJJGName = hjconfig.F_Name;
  1105. if (hjconfig.F_Name == "正常接通")
  1106. {
  1107. otnModel.F_YJState = 1;
  1108. }
  1109. }
  1110. otnModel.F_YHFKID = input.YHFK;
  1111. var fkconfig = new BLL.T_Sys_DictionaryValue().GetModel(input.YHFK);
  1112. if (fkconfig != null)
  1113. otnModel.F_YHFKName = fkconfig.F_Name;
  1114. otnModel.F_AskRes = askqids;
  1115. otnModel.F_AskInfo = ansids;
  1116. otnModel.F_Remark = input.Remark ?? "";
  1117. taskTellNumBLL.Update(otnModel);
  1118. //记录日志
  1119. //planrecord(otnModel);
  1120. }
  1121. if (cc == (input.Ans?.Length ?? 0))
  1122. {
  1123. return Success("提交成功!taskid=" + input.TaskId + ",custelid=" + input.Id + ",操作人:" + CurrentUser.UserData.F_UserCode);
  1124. }
  1125. else
  1126. {
  1127. ansBLL.DeleteByTelid(input.Id, input.TaskId);
  1128. return Error("问卷答案提交失败!taskid=" + input.TaskId + ",custelid=" + input.Id + ",操作人:" + CurrentUser.UserData.F_UserCode);
  1129. }
  1130. }
  1131. #endregion
  1132. public ActionResult GetTaskTelInfo(int id = 0)
  1133. {
  1134. if (id <= 0)
  1135. return Error("参数不正确");
  1136. var model = taskTellNumBLL.GetModel(id);
  1137. var paperid = 0;
  1138. if (model != null)
  1139. {
  1140. var anslist = ansBLL.GetModelList(" F_TaskID=" + model.F_TaskId.Value + " and F_CusTelID=" + id + " ");
  1141. var tmodel = taskBLL.GetModel(model.F_TaskId.Value);
  1142. if (tmodel != null)
  1143. {
  1144. paperid = (int)tmodel.y_TkModelId.Value;
  1145. #region 获取问卷试题信息以及答案
  1146. var pmodel = pagerInfoBLL.GetModel(paperid);
  1147. if (pmodel != null)
  1148. {
  1149. var qlist = questionBLL.GetModelList(" F_DeleteFlag=0 and F_QuestionId in (select F_QuestionId from T_Ask_PagerItems where F_PagerId=" + paperid + ") order by F_QuestionId ");
  1150. var qilist = questionItemBLL.GetModelList(" F_QuestionId in (select F_QuestionId from T_Ask_PagerItems where F_PagerId=" + paperid + ") order by F_ItemId ");
  1151. var newmodel = new
  1152. {
  1153. F_Title = pmodel.F_Title,
  1154. F_Remark = pmodel.F_Remark,
  1155. F_Questions = qlist.Select(q =>
  1156. {
  1157. var answers = "";
  1158. var qalist = anslist.Where(al => al.F_QID.Value == q.F_QuestionId).ToList<Model.T_Call_Answers>();
  1159. if (qalist.Count > 0)
  1160. {
  1161. if (q.F_Type > 1)
  1162. {
  1163. foreach (var item in qalist)
  1164. {
  1165. answers += item.F_QIID + "|";
  1166. }
  1167. }
  1168. else
  1169. {
  1170. answers = qalist[0].F_Answer;
  1171. }
  1172. }
  1173. return new
  1174. {
  1175. quesid = q.F_QuestionId,
  1176. questitle = q.F_Title,
  1177. questype = q.F_Type,
  1178. quescontent = q.F_Content,
  1179. quesremark = q.F_Remark,
  1180. quesanswers = answers.Trim('|'),
  1181. quesitems = qilist.Where(qq => qq.F_QuestionId == q.F_QuestionId).Select(qi =>
  1182. {
  1183. return new
  1184. {
  1185. itemid = qi.F_ItemId,
  1186. itemname = qi.F_ItemName,
  1187. itemremark = qi.F_Remark,
  1188. };
  1189. })
  1190. };
  1191. })
  1192. };
  1193. return Success("获取详情成功", new
  1194. {
  1195. taskModel = model,
  1196. paperModel = newmodel
  1197. });
  1198. }
  1199. #endregion
  1200. return Success("获取详情成功", new
  1201. {
  1202. taskModel = model
  1203. });
  1204. }
  1205. }
  1206. return Error("获取详情失败");
  1207. }
  1208. #endregion
  1209. #region 导入导出号码
  1210. /// <summary>
  1211. /// 导入号码信息
  1212. /// </summary>
  1213. /// <param name="type">导入方式:1=Excel; 2=txt .......</param>
  1214. /// <returns></returns>
  1215. public ActionResult ImportData(ImportDataInput input)
  1216. {
  1217. if (Request.Files.Count <= 0)
  1218. return Error("请正确上传Excel文件");
  1219. var file = Request.Files[0];
  1220. if (!file.ContentType.Equals("application/vnd.ms-excel") && !file.ContentType.Equals("application/x-xls") && !file.ContentType.Equals("application/x-xlsx") && !file.ContentType.Equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") && !file.ContentType.Equals("application/octet-stream"))
  1221. return Error($"请正确上传Excel文件:file.ContentType={file.ContentType}");
  1222. var filePath = "";
  1223. NPOIHelper npoi = new NPOIHelper();
  1224. var dt = npoi.ExcelToTable(file, 0, out filePath);
  1225. var obj = dt.AsEnumerable().Take(10).CopyToDataTable();
  1226. var colCount = obj.Columns.Count;
  1227. var rowCount = obj.Rows.Count;
  1228. string[] headArr = new string[colCount];
  1229. for (int i = 0; i < colCount; i++)
  1230. {
  1231. headArr[i] = obj.Columns[i].ToString();
  1232. }
  1233. string[][] itemArr = new string[rowCount][];
  1234. itemArr[0] = new string[rowCount];
  1235. for (int i = 0; i < rowCount; i++)
  1236. {
  1237. var row = obj.Rows[i];
  1238. var itemArray = row.ItemArray;
  1239. itemArr[i] = new string[itemArray.Count()];
  1240. for (int j = 0; j < itemArray.Count(); j++)
  1241. {
  1242. itemArr[i][j] = itemArray[j].ToString();
  1243. }
  1244. }
  1245. return Success("上传成功", new
  1246. {
  1247. filepath = filePath,
  1248. heads = headArr,
  1249. items = itemArr
  1250. });
  1251. }
  1252. /// <summary>
  1253. /// 导出号码信息
  1254. /// </summary>
  1255. /// <returns></returns>
  1256. public ActionResult ExportData(long taskId, int type = 0)
  1257. {
  1258. //if (!Request.IsAuthenticated)
  1259. // return NoToken("未知错误,请重新登录");
  1260. NPOIHelper npoi = new NPOIHelper();
  1261. var task = taskBLL.GetModel(taskId);
  1262. if (task == null)
  1263. return Error("该外呼任务不存在");
  1264. switch (type)
  1265. {
  1266. case 1:
  1267. var dt1 = taskTellNumBLL.GetPhoneList(" F_TaskId=" + task.TaskID + " and F_HCState=1 and (F_YJState=0 or F_YJState is null) ").Tables[0];
  1268. var msg1 = npoi.ExportToExcel(DateTime.Now.ToString("yyyyMMdd") + task.TaskName + "导出未接通号码", dt1);
  1269. return !string.IsNullOrWhiteSpace(msg1) ? Error(msg1) : Success("导出成功");
  1270. case 2:
  1271. var dt2 = taskTellNumBLL.GetPhoneList(" F_TaskId=" + task.TaskID + " and F_HCState=1 and F_YJState=1 ").Tables[0];
  1272. var msg2 = npoi.ExportToExcel(DateTime.Now.ToString("yyyyMMdd") + task.TaskName + "导出已接通号码", dt2);
  1273. return !string.IsNullOrWhiteSpace(msg2) ? Error(msg2) : Success("导出成功");
  1274. }
  1275. return Error("参数错误");
  1276. }
  1277. #endregion
  1278. #region 自动放音
  1279. /// <summary>
  1280. /// 获取自动放音文件
  1281. /// </summary>
  1282. /// <returns></returns>
  1283. public ActionResult GetRecordDropList()
  1284. {
  1285. //if (!Request.IsAuthenticated)
  1286. // return NoToken("未知错误,请重新登录");
  1287. var list = taskRecordBLL.DataTableToList(taskRecordBLL.GetList("").Tables[0]).Select(x => new
  1288. {
  1289. id = x.Id,
  1290. name = x.Name,
  1291. });
  1292. return Success("成功", list.ToList());
  1293. }
  1294. /// <summary>
  1295. /// 获取自动放音文件
  1296. /// </summary>
  1297. /// <returns></returns>
  1298. public ActionResult GetRecordList(FilterTalkRecord filter)
  1299. {
  1300. //if (!Request.IsAuthenticated)
  1301. // return NoToken("未知错误,请重新登录");
  1302. var recordCount = 0;
  1303. var dt = BLL.PagerBLL.GetListPager(
  1304. "T_CTI_TaskRecord ",
  1305. "id",
  1306. "*",
  1307. "",
  1308. "ORDER BY id desc",
  1309. filter.PageSize,
  1310. filter.PageIndex,
  1311. true,
  1312. out recordCount);
  1313. var list = taskRecordBLL.DataTableToList(dt).Select(x => new
  1314. {
  1315. id = x.Id,
  1316. name = x.Name,
  1317. recordpath = x.RecordPath,
  1318. recordtime = x.RecordTime,
  1319. });
  1320. var obj = new
  1321. {
  1322. rows = list,
  1323. total = recordCount
  1324. };
  1325. return Content(obj.ToJson());
  1326. }
  1327. /// <summary>
  1328. /// 获取录音
  1329. /// </summary>
  1330. /// <param name="id"></param>
  1331. /// <returns></returns>
  1332. public ActionResult GetRecord(int id)
  1333. {
  1334. //if (!Request.IsAuthenticated)
  1335. // return NoToken("未知错误,请重新登录");
  1336. var x = taskRecordBLL.GetModel(id);
  1337. return Success("成功", new
  1338. {
  1339. id = x.Id,
  1340. name = x.Name,
  1341. recordpath = x.RecordPath,
  1342. recordtime = x.RecordTime,
  1343. remark = x.Remark
  1344. });
  1345. }
  1346. /// <summary>
  1347. /// 添加/更新自动放音
  1348. /// </summary>
  1349. /// <param name="input"></param>
  1350. /// <returns></returns>
  1351. public ActionResult CreateOrUpdateRecord(Model.T_CTI_TaskRecord input)
  1352. {
  1353. //if (!Request.IsAuthenticated)
  1354. // return NoToken("未知错误,请重新登录");
  1355. Model.T_CTI_TaskRecord model = new Model.T_CTI_TaskRecord();
  1356. if (input.Id <= 0)
  1357. {
  1358. var dir = Server.MapPath("~/UploadRecord/");
  1359. if (!Directory.Exists(dir))
  1360. {
  1361. Directory.CreateDirectory(dir);
  1362. }
  1363. var file = Request.Files[0];
  1364. if (file.ContentType != "audio/x-wav" && file.ContentType != "audio/wav")
  1365. return Error("上传录音格式必须为.wav");
  1366. var name = DateTime.Now.ToString("yyyyMMddHHmmss") + Guid.NewGuid().ToString("N").Substring(0, 10) + ".wav";
  1367. var path = dir + name;
  1368. Request.Files[0].SaveAs(path);
  1369. FileInfo fileInfo = new FileInfo(path);
  1370. var fileName = FileUp.UploadFile(fileInfo, "/", "120.194.141.197", "Administrator", "hykj@800100");
  1371. var sysConfig = systemConfigBLL.GetModel(40);
  1372. if (sysConfig == null)
  1373. return Error("自动放音录音路径查询失败");
  1374. model.Name = input.Name;
  1375. model.RecordPath = sysConfig.F_ParamValue + fileName;
  1376. //model.RecordTime = input.RecordTime;
  1377. model.Remark = input.Remark;
  1378. if (taskRecordBLL.Add(model) > 0)
  1379. return Success("添加成功");
  1380. return Error("添加失败");
  1381. }
  1382. return Success("添加失败");
  1383. }
  1384. #endregion
  1385. #region 话单查询
  1386. /// <summary>
  1387. /// 话务分析
  1388. /// </summary>
  1389. /// <returns></returns>
  1390. public ActionResult GetTalkAnalysis(DateTime? start, DateTime? end)
  1391. {
  1392. //if (!Request.IsAuthenticated)
  1393. // return NoToken("未知错误,请重新登录");
  1394. //var where = "";
  1395. //if (start != null && end != null)
  1396. //{
  1397. // where += " PlanStartDate<'" + start.ToString() + "' and PlanEndDate>";
  1398. //}
  1399. var fir = taskPhonePartBLL.DataTableToList(taskPhonePartBLL.GetList("").Tables[0]);
  1400. var sec = taskDailyBLL.DataTableToList(taskDailyBLL.GetList("").Tables[0]);
  1401. var thi = taskDailyBLL.DataTableToList(taskDailyBLL.GetList().Tables[0]);
  1402. var obj = new
  1403. {
  1404. fir = fir.Select(x => new
  1405. {
  1406. date = x.Date.ToString("yyyy-MM-dd"),
  1407. phonepart = x.PhonePart,
  1408. province = x.Province,
  1409. city = x.City,
  1410. connectedcount = x.CalledCount == 0 ? "" : (x.ConnectedCount / x.CalledCount * 100).ToString("f2") + "%",
  1411. connectedagentcount = x.ConnectedCount == 0 ? "" : (x.ConnectedAgentCount / x.ConnectedCount * 100).ToString("f2") + "%",
  1412. }),
  1413. sec = sec.Select(x => new
  1414. {
  1415. date = x.Date.ToString("yyyy-MM-dd"),
  1416. allcount = x.AllCount,
  1417. calledcount = x.CalledCount,
  1418. connectedcount = x.ConnectedCount,
  1419. connectedagentcount = x.ConnectedAgentCount,
  1420. connectedrate = x.CalledCount == 0 ? "" : (x.ConnectedCount / x.CalledCount * 100).ToString("f2") + "%",
  1421. connectedagentrate = x.ConnectedCount == 0 ? "" : (x.ConnectedAgentCount / x.ConnectedCount * 100).ToString("f2") + "%",
  1422. taskid = x.TaskId,
  1423. taskname = x.TaskName
  1424. }),
  1425. thi = thi.Select(x => new
  1426. {
  1427. date = x.Date.ToString("yyyy-MM-dd"),
  1428. allcount = x.AllCount,
  1429. calledcount = x.CalledCount,
  1430. connectedcount = x.ConnectedCount,
  1431. connectedagentcount = x.ConnectedAgentCount,
  1432. connectedrate = x.CalledCount == 0 ? "" : (x.ConnectedCount / x.CalledCount * 100).ToString("f2") + "%",
  1433. connectedagentrate = x.ConnectedCount == 0 ? "" : (x.ConnectedAgentCount / x.ConnectedCount * 100).ToString("f2") + "%",
  1434. taskid = x.TaskId,
  1435. taskname = x.TaskName
  1436. })
  1437. };
  1438. return Success("", obj);
  1439. }
  1440. /// <summary>
  1441. /// 获取通话记录列表
  1442. /// </summary>
  1443. /// <returns></returns>
  1444. //[Authority]
  1445. public ActionResult GetTalkRecords(FilterTalkRecord filter)
  1446. {
  1447. var sort = "ORDER BY startdate desc";
  1448. if (!string.IsNullOrWhiteSpace(filter.SortField))
  1449. {
  1450. var arr = filter.SortField.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  1451. EnumTalkRecordsSortField e;
  1452. if (!Enum.TryParse(arr[0], out e))
  1453. return Error("排序字段参数错误");
  1454. sort = "ORDER BY " + e.ToString() + " " + arr[1];
  1455. }
  1456. StringBuilder where = new StringBuilder();
  1457. if (!string.IsNullOrWhiteSpace(filter.UserCode))
  1458. {
  1459. where.Append(" and agentid=" + filter.UserCode);
  1460. }
  1461. if (!string.IsNullOrWhiteSpace(filter.Phone))
  1462. {
  1463. where.Append(" and callee like '%" + filter.Phone + "%'");
  1464. }
  1465. //全部=0
  1466. //未转坐席 = 1,
  1467. //被叫接通转坐席未接 = 2,
  1468. //转坐席且接通 = 3,
  1469. if (filter.CallType != 0)
  1470. {
  1471. EnumTalkRecordsCallType calltype;
  1472. if (!Enum.TryParse(filter.CallType.ToString(), out calltype))
  1473. return Error("通话类型字段参数错误");
  1474. where.Append(" and calltype=" + (int)calltype);
  1475. }
  1476. if (!string.IsNullOrWhiteSpace(filter.TalkTime))
  1477. {
  1478. var arr = filter.TalkTime.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  1479. if (arr.Length == 2)
  1480. {
  1481. if (arr[0] == "1")
  1482. {
  1483. where.Append(" and talktime>" + arr[1]);
  1484. }
  1485. else if (arr[0] == "2")
  1486. {
  1487. where.Append(" and talktime=" + arr[1]);
  1488. }
  1489. else if (arr[0] == "3")
  1490. {
  1491. where.Append(" and talktime<" + arr[1]);
  1492. }
  1493. else { }
  1494. }
  1495. }
  1496. if (filter.StartTime == null || filter.EndTime == null)
  1497. {
  1498. filter.StartTime = DateTools.FirstSecondOfOneDay(DateTime.Now);
  1499. filter.EndTime = DateTools.LastSecondOfOneDay(DateTime.Now);
  1500. }
  1501. where.Append(" and datediff(s,'" + filter.StartTime + "',StartDate)>=0 and datediff(s,EndDate,'" + filter.EndTime + "')>=0 ");
  1502. int recordCount = 0;
  1503. Model.PageData<Model.CallResult> pageModel = new Model.PageData<Model.CallResult>();
  1504. StringBuilder fields = new StringBuilder();
  1505. var dt = BLL.PagerBLL.GetListPager(
  1506. "V_AutoCallResult",
  1507. " ID ",
  1508. " ID,itemid,taskname, callee, agentid, username,startdate,enddate,getinagentdate,calltype,talktime,RecordPath",
  1509. where.ToString(),
  1510. sort,
  1511. filter.PageSize,
  1512. filter.PageIndex,
  1513. true,
  1514. out recordCount);
  1515. var config = new BLL.T_Sys_SystemConfig().GetModelList(" F_ParamCode='PlayPath' ").FirstOrDefault();
  1516. var callResultList = callResultBLL.DataTableToList(dt);
  1517. var list = new List<AutoCallRecordDto>();
  1518. callResultList.ForEach(x =>
  1519. {
  1520. var recordPath = "";
  1521. if (!string.IsNullOrWhiteSpace(x.RecordPath) && config != null && !string.IsNullOrEmpty(config.F_ParamValue))
  1522. {
  1523. var ym = config.F_ParamValue;
  1524. if (ym.Substring(ym.Length - 1) == "/")
  1525. {
  1526. ym = ym.Substring(0, ym.Length - 1);
  1527. }
  1528. recordPath = ym + x.RecordPath.Substring(x.RecordPath.IndexOf(':') + 1).Replace('\\', '/');
  1529. }
  1530. list.Add(new AutoCallRecordDto
  1531. {
  1532. id = x.Id,
  1533. taskid = x.TaskId,
  1534. callnumber = x.CallNumber,
  1535. usercode = x.Usercode == "0" ? "" : x.Usercode,
  1536. startdate = x.StartDate?.ToString("yyyy-MM-dd HH:mm:ss") ?? "",
  1537. getinagentdate = x.GetInAgentDate?.ToString("yyyy-MM-dd HH:mm:ss") ?? "",
  1538. enddate = x.EndDate?.ToString("yyyy-MM-dd HH:mm:ss") ?? "",
  1539. recordpath = recordPath,
  1540. username = x.Username,
  1541. calltype = Enum.Parse(typeof(EnumTalkRecordsCallType), x.CallType.ToString()).ToString(),
  1542. talktime = x.TalkTime > 0 ? x.TalkTime.ToString() : "0"
  1543. });
  1544. });
  1545. var obj = new
  1546. {
  1547. rows = list,
  1548. total = recordCount
  1549. };
  1550. return Content(obj.ToJson());
  1551. }
  1552. public ActionResult GetCallType()
  1553. {
  1554. Dictionary<string, string> dic = new Dictionary<string, string>();
  1555. foreach (int item in Enum.GetValues(typeof(EnumTalkRecordsCallType)))
  1556. {
  1557. dic.Add(((EnumTalkRecordsCallType)item).ToString(), item.ToString());
  1558. }
  1559. return Success("", dic.Select(x => new
  1560. {
  1561. text = x.Key,
  1562. value = x.Value
  1563. }));
  1564. }
  1565. #endregion
  1566. #region 过滤号码
  1567. #region 过滤号码-数据源
  1568. /// <summary>
  1569. /// 过滤号码
  1570. /// </summary>
  1571. /// <param name="dt"></param>
  1572. private DataTable PhoneNumFilter(DataTable dt)
  1573. {
  1574. var dtClone = dt.Copy();
  1575. foreach (DataRow row in dtClone.Rows)
  1576. {
  1577. var rows = dt.Select("[F_Phone]='" + row["F_Phone"] + "'");
  1578. if (rows.Length > 1)
  1579. {
  1580. for (int num = 0; num < rows.Count() - 1; num++)
  1581. {
  1582. dt.Rows.Remove(rows[num]);
  1583. }
  1584. }
  1585. }
  1586. return dt;
  1587. }
  1588. #endregion
  1589. #region 过滤号码-前三个月
  1590. private DataTable PhoneNumFilterMonth(DataTable dt, string phone = "F_Phone")
  1591. {
  1592. var taskTelNumDt = taskTellNumBLL.GetList(" datediff(mm,F_CreateTime,getdate())<=3 ").Tables[0];
  1593. foreach (DataRow row in taskTelNumDt.Rows)
  1594. {
  1595. var rows = dt.Select("[" + phone + "]='" + row["F_Phone"] + "'");
  1596. if (rows.Length > 1)
  1597. {
  1598. for (int num = 0; num < rows.Count() - 1; num++)
  1599. {
  1600. dt.Rows.Remove(rows[num]);
  1601. }
  1602. }
  1603. }
  1604. return dt;
  1605. }
  1606. #endregion
  1607. #endregion
  1608. }
  1609. }