鄂尔多斯-招源科技

QCManageController.cs 47KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100
  1. using CallCenter.Utility;
  2. using CallCenter.Utility.Time;
  3. using CallCenterApi.DB;
  4. using CallCenterApi.Interface.Controllers.Base;
  5. using CallCenterApi.Interface.Models.Filter;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Data;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Web;
  12. using System.Web.Mvc;
  13. namespace CallCenterApi.Interface.Controllers.quality
  14. {
  15. public class QCManageController : BaseController
  16. {
  17. private readonly BLL.T_Sys_UserAccount userBLL = new BLL.T_Sys_UserAccount();
  18. private readonly BLL.CallResult callResultBLL = new BLL.CallResult();
  19. private readonly BLL.T_Sys_Department deptBLL = new BLL.T_Sys_Department();
  20. #region 非自动外呼质检
  21. //获取未质检列表
  22. public ActionResult GetList()
  23. {
  24. ActionResult res = NoToken("未知错误,请重新登录");
  25. string sql = " 1=1 ";
  26. DataTable dt = new DataTable();
  27. string phone = HttpUtility.UrlDecode(RequestString.GetQueryString("phone"));
  28. string usercode = HttpUtility.UrlDecode(RequestString.GetQueryString("usercode"));
  29. string calltype = HttpUtility.UrlDecode(RequestString.GetQueryString("calltype"));
  30. //string starttime = HttpUtility.UrlDecode(RequestString.GetQueryString("starttime"));
  31. //string endtime = HttpUtility.UrlDecode(RequestString.GetQueryString("endtime"));
  32. string starttime = DateTime.Now.ToString("yyyy-MM-hh ") + " 00:00:01";
  33. string endtime = DateTime.Now.ToString("yyyy-MM-hh ") + " 23:59:59";
  34. string startl = HttpUtility.UrlDecode(RequestString.GetQueryString("startl"));
  35. string endl = HttpUtility.UrlDecode(RequestString.GetQueryString("endl"));
  36. string optid = HttpUtility.UrlDecode(RequestString.GetQueryString("optid"));
  37. string strpageindex = RequestString.GetQueryString("page");
  38. int pageindex = 1;
  39. string strpagesize = RequestString.GetQueryString("pagesize");
  40. int pagesize = 10;
  41. var roleId = CurrentUser.UserData.F_RoleId;
  42. var deptId = CurrentUser.UserData.F_DeptId;
  43. var deptCode = CurrentUser.UserData.F_DeptCode;
  44. var currentUsercode = CurrentUser.UserData.F_UserCode;
  45. if (roleId != 0)
  46. {
  47. if (roleId != 17)
  48. {
  49. if (deptCode.Replace("|0|1|", "").Length > 0)
  50. {
  51. if (roleId == 36 || roleId == 38 || roleId == 40)
  52. {
  53. sql += $" and UserCode='{currentUsercode}'";
  54. }
  55. else
  56. {
  57. sql += $" and UserCode in (SELECT F_UserCode FROM T_Sys_UserAccount WHERE F_DeptId={deptId})";
  58. }
  59. }
  60. else
  61. {
  62. if (roleId != 53 && roleId != 54)
  63. {
  64. sql += $" and UserCode in (SELECT F_UserCode FROM T_Sys_UserAccount WHERE F_DeptId={deptId})";
  65. }
  66. }
  67. }
  68. }
  69. sql += " and CallState='1' and F_QCState<>1 ";
  70. if (phone.Trim() != "")
  71. {
  72. sql += " and CallNumber='" + phone + "'";
  73. }
  74. if (usercode.Trim() != "")
  75. {
  76. sql += " and UserCode='" + usercode + "'";
  77. }
  78. if (calltype.Trim() != "")
  79. {
  80. sql += " and CallType='" + calltype + "'";
  81. }
  82. //if (starttime.Trim() == "" && endtime.Trim() == "")
  83. //{
  84. // sql += " and DATEDIFF(week, BeginTime,getdate())=1 ";//默认显示上周记录
  85. //}
  86. //else
  87. //{
  88. if (starttime.Trim() != "")
  89. {
  90. sql += " and BeginTime>='" + starttime + "'";
  91. }
  92. if (endtime.Trim() != "")
  93. {
  94. sql += " and BeginTime<='" + endtime + "'";
  95. }
  96. //}
  97. if (startl.Trim() != "")
  98. {
  99. sql += " and TalkLongTime>=" + startl + " ";
  100. }
  101. if (endl.Trim() != "")
  102. {
  103. sql += " and TalkLongTime<=" + endl + " ";
  104. }
  105. if (strpageindex.Trim() != "")
  106. {
  107. pageindex = Convert.ToInt32(strpageindex);
  108. }
  109. if (strpagesize.Trim() != "")
  110. {
  111. pagesize = Convert.ToInt32(strpagesize);
  112. }
  113. List<Model.T_Call_CallRecords_QC> Plist = new BLL.T_Call_CallRecords_QC().GetModelList(sql);//.GetListV1(sql);
  114. List<Model.T_Call_CallRecordsLD> ldList = new BLL.T_Call_CallRecordsLD().GetModelList("");
  115. List<Model.T_Sys_UserAccount> userList = userBLL.DataTableToList(userBLL.GetList("").Tables[0]);
  116. List<Model.T_Sys_Department> deptList = deptBLL.DataTableToList(deptBLL.GetList("").Tables[0]);
  117. Model.PageData<object> pageData = new Model.PageData<object>();
  118. var list = Plist.Select(d =>
  119. {
  120. int lc = ldList.Where(l => l.F_CallRecordsID == d.CallRecordsId && l.F_OptID == int.Parse(optid) && l.F_IsListen == true).Count();
  121. int dc = ldList.Where(l => l.F_CallRecordsID == d.CallRecordsId && l.F_OptID == int.Parse(optid) && l.F_IsDownload == true).Count();
  122. string path = string.IsNullOrWhiteSpace(d.FilePath) ? "" : d.FilePath;
  123. var config = new BLL.T_Sys_SystemConfig().GetModelList(" F_ParamCode='PlayPath' ").FirstOrDefault();
  124. var configbak = new BLL.T_Sys_SystemConfig().GetModelList(" F_ParamCode='PlayPathBak' ").FirstOrDefault(); //备份录音服务器地址
  125. //if (path != "" && config != null && !string.IsNullOrEmpty(config.F_ParamValue))
  126. //{
  127. // var ym = config.F_ParamValue;
  128. // if (ym.Substring(ym.Length - 1) == "/")
  129. // {
  130. // ym = ym.Substring(0, ym.Length - 1);
  131. // }
  132. // d.FilePath = ym + path.Substring(path.IndexOf(':') + 1).Replace('\\', '/');
  133. //}
  134. //2018-05-16 lihai 判断录音是否存在
  135. //特别备注说明:所有备份录音都放到luyin文件夹下,所以FilePath录音目前需要处理
  136. if (path != "")
  137. {
  138. //文件路径
  139. var pathfile = path.Substring(path.IndexOf(':') + 1).Replace('\\', '/');
  140. if (config != null && !string.IsNullOrEmpty(config.F_ParamValue))
  141. {
  142. var ym = config.F_ParamValue;
  143. if (ym.Substring(ym.Length - 1) == "/")
  144. {
  145. ym = ym.Substring(0, ym.Length - 1);
  146. }
  147. d.FilePath = ym + pathfile;
  148. }
  149. //判断是否录音存在,不存在用备份录音路径
  150. bool isfile = FileExistsHelper.RemoteFileExists(d.FilePath);
  151. if (!isfile)
  152. {
  153. //处理备份录音路径,record,和luyin文件都要过滤掉,配置文件加上ip+luyin
  154. pathfile = pathfile.Replace("Record", "luyin");
  155. if (configbak != null && !string.IsNullOrEmpty(configbak.F_ParamValue))
  156. {
  157. var ymbak = configbak.F_ParamValue;
  158. if (ymbak.Substring(ymbak.Length - 1) == "/")
  159. {
  160. ymbak = ymbak.Substring(0, ymbak.Length - 1);
  161. }
  162. d.FilePath = ymbak + pathfile;
  163. }
  164. }
  165. }
  166. var user = userList.SingleOrDefault(x => x.F_UserCode == d.UserCode);
  167. var dept = deptList.SingleOrDefault(x => x.F_DeptId == (user?.F_DeptId ?? 0));
  168. var deptParent = deptList.SingleOrDefault(x => x.F_DeptId == (dept?.F_ParentId ?? 0));
  169. return new
  170. {
  171. _callnumber = d.CallNumber,
  172. _filepath = d.FilePath,
  173. _f_qcstate = d.F_QCState,
  174. _f_qcscore = d.F_QCScore,
  175. _f_qcquestion = d.F_QCQuestion,
  176. _f_qcadvise = d.F_QCAdvise,
  177. _calltype = d.CallType,
  178. _callstate = d.CallState,
  179. _usercode = d.UserCode,
  180. _username = user?.F_UserName ?? "",
  181. _company = deptParent?.F_DeptName ?? "",
  182. _deptname = d.F_DeptName,
  183. _talkstarttime = d.TalkStartTime,
  184. _talkendtime = d.TalkEndTime,
  185. _talklongtime = d.TalkLongTime,
  186. _businesstype = d.BusinessType,
  187. _f_qclc = lc,
  188. _f_qcdc = dc,
  189. _callrecordsid = d.CallRecordsId,
  190. _callid = d.CallId
  191. };
  192. }).ToList<object>();
  193. //pageData.Rows = list.Skip((pageindex - 1) * pagesize).Take(pagesize).ToList();
  194. //pageData.Total = list.Count;
  195. var obj = new
  196. {
  197. rows = list.Skip((pageindex - 1) * pagesize).Take(pagesize).ToList(),
  198. total = list.Count
  199. };
  200. res = Content(obj.ToJson());
  201. //if (pageData.Total > 0)
  202. //{
  203. // res = Success("未质检列表加载成功", pageData);
  204. //}
  205. //else
  206. //{
  207. // res = Error("未质检列表暂无数据");
  208. //}
  209. return res;
  210. }
  211. //获取已质检列表
  212. public ActionResult GetYZJList()
  213. {
  214. ActionResult res = NoToken("未知错误,请重新登录");
  215. string sql = " 1=1 ";
  216. DataTable dt = new DataTable();
  217. string phone = HttpUtility.UrlDecode(RequestString.GetQueryString("phone"));
  218. string usercode = HttpUtility.UrlDecode(RequestString.GetQueryString("usercode"));
  219. string calltype = HttpUtility.UrlDecode(RequestString.GetQueryString("calltype"));
  220. //string starttime = HttpUtility.UrlDecode(RequestString.GetQueryString("starttime"));
  221. //string endtime = HttpUtility.UrlDecode(RequestString.GetQueryString("endtime"));
  222. string startl = HttpUtility.UrlDecode(RequestString.GetQueryString("startl"));
  223. string endl = HttpUtility.UrlDecode(RequestString.GetQueryString("endl"));
  224. string optid = HttpUtility.UrlDecode(RequestString.GetQueryString("optid"));
  225. string starttime = DateTime.Now.ToString("yyyy-MM-hh ") + " 00:00:01";
  226. string endtime = DateTime.Now.ToString("yyyy-MM-hh ") + " 23:59:59";
  227. string strpageindex = RequestString.GetQueryString("page");
  228. int pageindex = 1;
  229. string strpagesize = RequestString.GetQueryString("pagesize");
  230. int pagesize = 10;
  231. var roleId = CurrentUser.UserData.F_RoleId;
  232. var deptId = CurrentUser.UserData.F_DeptId;
  233. var deptCode = CurrentUser.UserData.F_DeptCode;
  234. var currentUsercode = CurrentUser.UserData.F_UserCode;
  235. if (roleId != 0)
  236. {
  237. if (roleId != 17)
  238. {
  239. if (deptCode.Replace("|0|1|", "").Length > 0)
  240. {
  241. if (roleId == 36 || roleId == 38 || roleId == 40)
  242. {
  243. sql += $" and UserCode='{currentUsercode}'";
  244. }
  245. else
  246. {
  247. sql += $" and UserCode in (SELECT F_UserCode FROM T_Sys_UserAccount WHERE F_DeptId={deptId})";
  248. }
  249. }
  250. else
  251. {
  252. if (roleId != 53 && roleId != 54)
  253. {
  254. sql += $" and UserCode in (SELECT F_UserCode FROM T_Sys_UserAccount WHERE F_DeptId={deptId})";
  255. }
  256. }
  257. }
  258. }
  259. //已接通,已质检
  260. sql += " and CallState='1' and F_QCState=1 ";
  261. if (phone.Trim() != "")
  262. {
  263. sql += " and CallNumber='" + phone + "'";
  264. }
  265. if (usercode.Trim() != "")
  266. {
  267. sql += " and UserCode='" + usercode + "'";
  268. }
  269. if (calltype.Trim() != "")
  270. {
  271. sql += " and CallType='" + calltype + "'";
  272. }
  273. if (starttime.Trim() != "")
  274. {
  275. sql += " and BeginTime>='" + starttime + "'";
  276. }
  277. if (endtime.Trim() != "")
  278. {
  279. sql += " and BeginTime<='" + endtime + "'";
  280. }
  281. if (startl.Trim() != "")
  282. {
  283. sql += " and TalkLongTime>=" + startl + " ";
  284. }
  285. if (endl.Trim() != "")
  286. {
  287. sql += " and TalkLongTime<=" + endl + " ";
  288. }
  289. if (strpageindex.Trim() != "")
  290. {
  291. pageindex = Convert.ToInt32(strpageindex);
  292. }
  293. if (strpagesize.Trim() != "")
  294. {
  295. pagesize = Convert.ToInt32(strpagesize);
  296. }
  297. List<Model.T_Call_CallRecords_QC> Plist = new BLL.T_Call_CallRecords_QC().GetModelList(sql);//.GetListV1(sql);
  298. List<Model.T_Call_CallRecordsLD> ldList = new BLL.T_Call_CallRecordsLD().GetModelList("");
  299. List<Model.T_Sys_UserAccount> userList = userBLL.DataTableToList(userBLL.GetList("").Tables[0]);
  300. List<Model.T_Sys_Department> deptList = deptBLL.DataTableToList(deptBLL.GetList("").Tables[0]);
  301. Model.PageData<object> pageData = new Model.PageData<object>();
  302. var list = Plist.Select(d =>
  303. {
  304. int lc = ldList.Where(l => l.F_CallRecordsID == d.CallRecordsId && l.F_OptID == int.Parse(optid) && l.F_IsListen == true).Count();
  305. int dc = ldList.Where(l => l.F_CallRecordsID == d.CallRecordsId && l.F_OptID == int.Parse(optid) && l.F_IsDownload == true).Count();
  306. string path = string.IsNullOrWhiteSpace(d.FilePath) ? "" : d.FilePath;
  307. var config = new BLL.T_Sys_SystemConfig().GetModelList(" F_ParamCode='PlayPath' ").FirstOrDefault();
  308. var configbak = new BLL.T_Sys_SystemConfig().GetModelList(" F_ParamCode='PlayPathBak' ").FirstOrDefault(); //备份录音服务器地址
  309. //if (path != "" && config != null && !string.IsNullOrEmpty(config.F_ParamValue))
  310. //{
  311. // var ym = config.F_ParamValue;
  312. // if (ym.Substring(ym.Length - 1) == "/")
  313. // {
  314. // ym = ym.Substring(0, ym.Length - 1);
  315. // }
  316. // d.FilePath = ym + path.Substring(path.IndexOf(':') + 1).Replace('\\', '/');
  317. //}
  318. //2018-05-16 lihai 判断录音是否存在
  319. //特别备注说明:所有备份录音都放到luyin文件夹下,所以FilePath录音目前需要处理
  320. if (path != "")
  321. {
  322. //文件路径
  323. var pathfile = path.Substring(path.IndexOf(':') + 1).Replace('\\', '/');
  324. if (config != null && !string.IsNullOrEmpty(config.F_ParamValue))
  325. {
  326. var ym = config.F_ParamValue;
  327. if (ym.Substring(ym.Length - 1) == "/")
  328. {
  329. ym = ym.Substring(0, ym.Length - 1);
  330. }
  331. d.FilePath = ym + pathfile;
  332. }
  333. //判断是否录音存在,不存在用备份录音路径
  334. bool isfile = FileExistsHelper.RemoteFileExists(d.FilePath);
  335. if (!isfile)
  336. {
  337. //处理备份录音路径,record,和luyin文件都要过滤掉,配置文件加上ip+luyin
  338. pathfile = pathfile.Replace("Record", "luyin");
  339. if (configbak != null && !string.IsNullOrEmpty(configbak.F_ParamValue))
  340. {
  341. var ymbak = configbak.F_ParamValue;
  342. if (ymbak.Substring(ymbak.Length - 1) == "/")
  343. {
  344. ymbak = ymbak.Substring(0, ymbak.Length - 1);
  345. }
  346. d.FilePath = ymbak + pathfile;
  347. }
  348. }
  349. }
  350. var user = userList.SingleOrDefault(x => x.F_UserCode == d.UserCode);
  351. var dept = deptList.SingleOrDefault(x => x.F_DeptId == user.F_DeptId);
  352. var deptParent = deptList.SingleOrDefault(x => x.F_DeptId == dept.F_ParentId);
  353. return new
  354. {
  355. _callnumber = d.CallNumber,
  356. _filepath = d.FilePath,
  357. _f_qcstate = d.F_QCState,
  358. _f_qcscore = d.F_QCScore,
  359. _f_qcquestion = d.F_QCQuestion,
  360. _f_qcadvise = d.F_QCAdvise,
  361. _calltype = d.CallType,
  362. _callstate = d.CallState,
  363. _usercode = d.UserCode,
  364. _username = user?.F_UserName ?? "",
  365. _talkstarttime = d.TalkStartTime,
  366. _talkendtime = d.TalkEndTime,
  367. _talklongtime = d.TalkLongTime,
  368. _businesstype = d.BusinessType,
  369. _f_qclc = lc,
  370. _f_qcdc = dc,
  371. _callrecordsid = d.CallRecordsId,
  372. _deptname = d.F_DeptName,
  373. _company = deptParent?.F_DeptName ?? "",
  374. _callid = d.CallId
  375. };
  376. }).ToList<object>();
  377. var obj = new
  378. {
  379. rows = list.Skip((pageindex - 1) * pagesize).Take(pagesize).ToList(),
  380. total = list.Count
  381. };
  382. res = Content(obj.ToJson());
  383. //pageData.Rows = list.Skip((pageindex - 1) * pagesize).Take(pagesize).ToList();
  384. //pageData.Total = list.Count;
  385. //if (pageData.Total > 0)
  386. //{
  387. // res = Success("已质检列表加载成功", pageData);
  388. //}
  389. //else
  390. //{
  391. // res = Error("已质检列表暂无数据");
  392. //}
  393. return res;
  394. }
  395. //获取质检详情
  396. public ActionResult GetIndexList(string id)
  397. {
  398. ActionResult res = NoToken("未知错误,请重新登录");
  399. DataTable dt = new DataTable();
  400. DataTable dtindex = new DataTable();
  401. DataTable dtres = new DataTable();
  402. dt = new BLL.T_QC_IndexCategory().GetList(" F_DeleteFlag=0 order by F_Sort ,F_CategoryId").Tables[0];
  403. dtindex = new BLL.T_QC_IndexBase().GetList(" F_DeleteFlag=0 order by F_Sort ,F_CategoryId").Tables[0];
  404. dtres = new BLL.T_QC_IndexRes().GetList(" CallRecordsId=" + id + " ").Tables[0];
  405. int i = 0;
  406. int m = 0;
  407. int indexcount = 0;
  408. int allscore = 0;
  409. int childscore = 0;
  410. int childpf = 0;
  411. int allpf = 0;
  412. List<Model.QCModel> qclist = new List<Model.QCModel>();
  413. object obj = null;
  414. foreach (DataRow dr in dt.Select("F_ParentId=0"))
  415. {
  416. Model.QCModel qcml = new Model.QCModel();
  417. List<Model.QCModel> qcclist = new List<Model.QCModel>();
  418. i = 0;
  419. indexcount = 0;
  420. childscore = 0;
  421. childpf = 0;
  422. string categoryid = dr["F_CategoryId"].ToString().Trim();
  423. qcml.Qcid = categoryid;
  424. qcml.Qcname = dr["F_CategoryName"].ToString().Trim();
  425. obj = DbHelperSQL.GetSingle("select count(*) from T_QC_IndexBase where F_CategoryId in(select F_CategoryId from T_QC_IndexCategory where F_ParentId=" + dr["F_CategoryId"] + ")");
  426. qcml.Rowspan = obj.ToString();
  427. foreach (DataRow childdr in dt.Select("F_ParentId=" + categoryid + ""))
  428. {
  429. Model.QCModel qcmlc = new Model.QCModel();
  430. List<Model.QCModel> qccrlist = new List<Model.QCModel>();
  431. m = 0;
  432. #region 子分类
  433. string childcategoryid = childdr["F_CategoryId"].ToString().Trim();
  434. DataRow[] arrchild = dtindex.Select("F_CategoryId=" + childcategoryid + "");
  435. indexcount += arrchild.Length;
  436. //加载项
  437. qcmlc.Qcid = categoryid + "-" + childcategoryid;
  438. qcmlc.Qcname = childdr["F_CategoryName"].ToString().Trim();
  439. obj = DbHelperSQL.GetSingle("select count(*) from T_QC_IndexBase where F_CategoryId=" + childdr["F_CategoryId"]);
  440. qcmlc.Rowspan = obj.ToString();
  441. #endregion
  442. foreach (DataRow indexdr in arrchild)
  443. {
  444. Model.QCModel qcmlcr = new Model.QCModel();
  445. string indexid = indexdr["F_IndexId"].ToString().Trim();
  446. string pf = "0";
  447. try
  448. {
  449. //分类分数合计
  450. childscore += Convert.ToInt32(indexdr["F_Score"].ToString().Trim());
  451. //总计合计
  452. allscore += Convert.ToInt32(indexdr["F_Score"].ToString().Trim());
  453. }
  454. catch
  455. { }
  456. try
  457. {
  458. pf = dtres.Select("F_IndexId=" + indexid + "")[0]["F_QCScore"].ToString().Trim();
  459. childpf += Convert.ToInt32(pf);//分类评分合计
  460. allpf += Convert.ToInt32(pf);//评分总计
  461. }
  462. catch
  463. {
  464. }
  465. #region 指标
  466. //加载指标
  467. qcmlcr.Qcid = categoryid + "-" + childcategoryid + "-" + indexid;
  468. qcmlcr.Qcname = indexdr["F_Title"].ToString().Trim();
  469. qcmlcr.Qcscore = indexdr["F_Score"].ToString().Trim();
  470. qcmlcr.Qcpf = pf;
  471. qcmlcr.Rowspan = "0";
  472. qcmlcr.Colspan = "0";
  473. #endregion
  474. m++;
  475. qccrlist.Add(qcmlcr);
  476. }
  477. i++;
  478. qcmlc.Qclist = qccrlist;
  479. qcclist.Add(qcmlc);
  480. }
  481. //合计
  482. qcml.Qcscore = childscore.ToString().Trim();
  483. qcml.Qcpf = childpf.ToString().Trim();
  484. qcml.Qclist = qcclist;
  485. qcml.Colspan = "2";
  486. qclist.Add(qcml);
  487. }
  488. Model.QCModel qcmlhj = new Model.QCModel();
  489. qcmlhj.Qcid = "0";
  490. qcmlhj.Qcname = "总计";
  491. qcmlhj.Qcscore = allscore.ToString().Trim();
  492. qcmlhj.Qcpf = allpf.ToString().Trim();
  493. qcmlhj.Qclist = qclist;
  494. qcmlhj.Colspan = "3";
  495. res = Success("质检部分加载成功", qcmlhj);
  496. dtres.Clear();
  497. dtres.Dispose();
  498. dtindex.Clear();
  499. dtindex.Dispose();
  500. dt.Clear();
  501. dt.Dispose();
  502. return res;
  503. }
  504. //保存质检得分
  505. public ActionResult SaveData(string id, string xmlinfo)
  506. {
  507. ActionResult res = NoToken("未知错误,请重新登录");
  508. DataTable dt = new DataTable();
  509. //string id = HttpUtility.UrlDecode(RequestString.GetQueryString("id"));
  510. //string userid = HttpUtility.UrlDecode(RequestString.GetQueryString("userid"));
  511. //string username = HttpUtility.UrlDecode(RequestString.GetQueryString("username"));
  512. //string xmlinfo = HttpUtility.UrlDecode(RequestString.GetQueryString("xmlinfo"));
  513. //string question = HttpUtility.UrlDecode(RequestString.GetQueryString("question"));
  514. //string advise = HttpUtility.UrlDecode(RequestString.GetQueryString("advise"));
  515. dt = new BLL.T_QC_IndexRes().GetList(" CallRecordsId=" + id + " ").Tables[0];
  516. int allscore = 0;
  517. foreach (string scoreinfo in xmlinfo.Trim(';').Split(';'))
  518. {
  519. //判断存在该指标评估则修改,无则添加
  520. string idsss = scoreinfo.Split(':')[0];
  521. string indexid = idsss.Split('-')[2];
  522. if (dt.Select(" F_IndexId=" + indexid + " ").Length > 0)
  523. {
  524. Model.T_QC_IndexRes model = new Model.T_QC_IndexRes();
  525. model.F_Id = Convert.ToInt32(dt.Select(" F_IndexId=" + indexid + " ")[0]["F_Id"].ToString());
  526. model.CallRecordsId = Convert.ToInt32(id);
  527. try
  528. {
  529. model.F_IndexId = Convert.ToInt32(indexid);
  530. }
  531. catch
  532. { }
  533. try
  534. {
  535. model.F_QCScore = Convert.ToInt32(scoreinfo.Split(':')[1]);
  536. allscore += Convert.ToInt32(scoreinfo.Split(':')[1]);
  537. }
  538. catch
  539. { }
  540. new BLL.T_QC_IndexRes().Update(model);
  541. }
  542. else
  543. {
  544. Model.T_QC_IndexRes model = new Model.T_QC_IndexRes();
  545. model.CallRecordsId = Convert.ToInt32(id);
  546. try
  547. {
  548. model.F_IndexId = Convert.ToInt32(indexid);
  549. }
  550. catch
  551. { }
  552. try
  553. {
  554. model.F_QCScore = Convert.ToInt32(scoreinfo.Split(':')[1]);
  555. allscore += Convert.ToInt32(scoreinfo.Split(':')[1]);
  556. }
  557. catch
  558. { }
  559. new BLL.T_QC_IndexRes().Add(model);
  560. }
  561. }
  562. Model.T_Call_CallRecords_QC callmodel = new Model.T_Call_CallRecords_QC();
  563. callmodel.CallRecordsId = Convert.ToInt32(id);
  564. callmodel.F_QCState = 1;
  565. callmodel.F_QCScore = allscore;
  566. callmodel.F_QCUserId = CurrentUser.UserData.F_UserId;
  567. callmodel.F_QCUserName = CurrentUser.UserData.F_UserName;
  568. callmodel.F_QCTime = DateTime.Now;
  569. callmodel.F_QCIsSelect = 0;
  570. callmodel.F_QCRemark = "";
  571. //callmodel.F_QCQuestion = question;
  572. //callmodel.F_QCAdvise = advise;
  573. if (new BLL.T_Call_CallRecords_QC().UpdateQC(callmodel))
  574. {
  575. res = Success("保存成功");
  576. }
  577. else
  578. {
  579. res = Error("保存质检评分信息失败");
  580. }
  581. dt.Clear();
  582. dt.Dispose();
  583. return res;
  584. }
  585. //添加日志
  586. public ActionResult AddLogs()
  587. {
  588. ActionResult res = NoToken("未知错误,请重新登录");
  589. string id = HttpUtility.UrlDecode(RequestString.GetQueryString("id"));
  590. //string optid = HttpUtility.UrlDecode(RequestString.GetQueryString("optid"));
  591. //string optby = HttpUtility.UrlDecode(RequestString.GetQueryString("optby"));
  592. string type = HttpUtility.UrlDecode(RequestString.GetQueryString("type"));
  593. bool r = addldlog(int.Parse(id), CurrentUser.UserData.F_UserId, CurrentUser.UserData.F_UserName, int.Parse(type));
  594. if (r)
  595. {
  596. res = Success("添加日志成功");
  597. }
  598. else
  599. {
  600. res = Error("添加日志失败");
  601. }
  602. return res;
  603. }
  604. private bool addldlog(int id, int optid, string optby, int type)
  605. {
  606. bool res = false;
  607. try
  608. {
  609. Model.T_Call_CallRecordsLD ldmodel = new Model.T_Call_CallRecordsLD();
  610. ldmodel.F_CallRecordsID = id;
  611. if (type == 0)
  612. ldmodel.F_IsListen = true;
  613. else if (type == 1)
  614. ldmodel.F_IsDownload = true;
  615. ldmodel.F_OptID = optid;
  616. ldmodel.F_OptBy = optby;
  617. ldmodel.F_OptDate = DateTime.Now;
  618. res = new BLL.T_Call_CallRecordsLD().Add(ldmodel) > 1;
  619. }
  620. catch (Exception ex)
  621. {
  622. }
  623. return res;
  624. }
  625. #endregion
  626. #region 自动外呼质检—号码质检
  627. /// <summary>
  628. /// 未质检列表
  629. /// </summary>
  630. /// <returns></returns>
  631. public ActionResult GetAutoCallList(FilterTalkRecord filter)
  632. {
  633. var sort = "ORDER BY startdate desc";
  634. if (!string.IsNullOrWhiteSpace(filter.SortField))
  635. {
  636. var arr = filter.SortField.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  637. EnumTalkRecordsSortField e;
  638. if (!Enum.TryParse(arr[0], out e))
  639. return Error("排序字段参数错误");
  640. sort = "ORDER BY " + e.ToString() + " " + arr[1];
  641. }
  642. StringBuilder where = new StringBuilder();
  643. if (!string.IsNullOrWhiteSpace(filter.UserCode))
  644. {
  645. where.Append(" and agentid=" + filter.UserCode);
  646. }
  647. if (!string.IsNullOrWhiteSpace(filter.Phone))
  648. {
  649. where.Append(" and callee like '%" + filter.Phone + "%'");
  650. }
  651. if (!string.IsNullOrWhiteSpace(filter.TalkTime))
  652. {
  653. var arr = filter.TalkTime.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  654. if (arr.Length == 2)
  655. {
  656. if (arr[0] == "1")
  657. {
  658. where.Append(" and talktime>" + arr[1]);
  659. }
  660. else if (arr[0] == "2")
  661. {
  662. where.Append(" and talktime=" + arr[1]);
  663. }
  664. else if (arr[0] == "3")
  665. {
  666. where.Append(" and talktime<" + arr[1]);
  667. }
  668. else { }
  669. }
  670. }
  671. if (filter.StartTime == null || filter.EndTime == null)
  672. {
  673. filter.StartTime = DateTools.FirstSecondOfOneDay(DateTime.Now);
  674. filter.EndTime = DateTools.LastSecondOfOneDay(DateTime.Now);
  675. }
  676. //qcstate=1 = 已质检; qcstate=0 =未质检
  677. //qcstate 全部=0;未转坐席 = 1; 被叫接通转坐席未接 = 2; 转坐席且接通 = 3,
  678. where.Append(" and qcstate=0 and calltype in (2,3) and datediff(s,'" + filter.StartTime + "',StartDate)>=0 and datediff(s,EndDate,'" + filter.EndTime + "')>=0 ");
  679. int recordCount = 0;
  680. Model.PageData<Model.CallResult> pageModel = new Model.PageData<Model.CallResult>();
  681. StringBuilder fields = new StringBuilder();
  682. var dt = BLL.PagerBLL.GetListPager(
  683. "V_AutoCallResult",
  684. "Id",
  685. "id,itemid,taskname, callee, agentid, username,startdate,enddate,getinagentdate,calltype,talktime,RecordPath, QCState, QCScore, QCRemark, QCUserId, QCUserName,QCTime",
  686. where.ToString(),
  687. sort,
  688. filter.PageSize,
  689. filter.PageIndex,
  690. true,
  691. out recordCount);
  692. var config = new BLL.T_Sys_SystemConfig().GetModelList(" F_ParamCode='PlayPath' ").FirstOrDefault();
  693. var callResultList = callResultBLL.DataTableToListQC(dt);
  694. var obj = new
  695. {
  696. rows = callResultList.Select(x => new
  697. {
  698. id = x.Id,
  699. taskid = x.TaskId,
  700. callnumber = x.CallNumber,
  701. usercode = x.Usercode == "0" ? "" : x.Usercode,
  702. startdate = x.StartDate?.ToString("yyyy-MM-dd HH:mm:ss") ?? "",
  703. getinagentdate = x.GetInAgentDate?.ToString("yyyy-MM-dd HH:mm:ss") ?? "",
  704. enddate = x.EndDate?.ToString("yyyy-MM-dd HH:mm:ss") ?? "",
  705. username = x.Username,
  706. calltype = Enum.Parse(typeof(EnumTalkRecordsCallType), x.CallType.ToString()).ToString(),
  707. talktime = x.TalkTime > 0 ? x.TalkTime.ToString() : "0",
  708. qcstate = x.QCState == 0 ? "未质检" : "已质检",
  709. qcscore = x.QCScore,
  710. qcremark = x.QCRemark ?? "",
  711. qcuserid = x.QCUserId?.ToString() ?? "",
  712. qcusername = x.QCUserName ?? "",
  713. qctime = x.QCTime?.ToString("yyyy-MM-dd HH:mm:ss") ?? ""
  714. }),
  715. total = recordCount
  716. };
  717. return Content(obj.ToJson());
  718. }
  719. /// <summary>
  720. /// 已质检列表
  721. /// </summary>
  722. /// <returns></returns>
  723. public ActionResult GetAutoCallYZJList(FilterTalkRecord filter)
  724. {
  725. var sort = "ORDER BY startdate desc";
  726. if (!string.IsNullOrWhiteSpace(filter.SortField))
  727. {
  728. var arr = filter.SortField.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  729. EnumTalkRecordsSortField e;
  730. if (!Enum.TryParse(arr[0], out e))
  731. return Error("排序字段参数错误");
  732. sort = "ORDER BY " + e.ToString() + " " + arr[1];
  733. }
  734. StringBuilder where = new StringBuilder();
  735. if (!string.IsNullOrWhiteSpace(filter.UserCode))
  736. {
  737. where.Append(" and agentid=" + filter.UserCode);
  738. }
  739. if (!string.IsNullOrWhiteSpace(filter.Phone))
  740. {
  741. where.Append(" and callee like '%" + filter.Phone + "%'");
  742. }
  743. if (!string.IsNullOrWhiteSpace(filter.TalkTime))
  744. {
  745. var arr = filter.TalkTime.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  746. if (arr.Length == 2)
  747. {
  748. if (arr[0] == "1")
  749. {
  750. where.Append(" and talktime>" + arr[1]);
  751. }
  752. else if (arr[0] == "2")
  753. {
  754. where.Append(" and talktime=" + arr[1]);
  755. }
  756. else if (arr[0] == "3")
  757. {
  758. where.Append(" and talktime<" + arr[1]);
  759. }
  760. else { }
  761. }
  762. }
  763. if (filter.StartTime == null || filter.EndTime == null)
  764. {
  765. filter.StartTime = DateTools.FirstSecondOfOneDay(DateTime.Now);
  766. filter.EndTime = DateTools.LastSecondOfOneDay(DateTime.Now);
  767. }
  768. //qcstate=1 = 已质检; qcstate=0 =未质检
  769. //calltype 全部=0;未转坐席 = 1; 被叫接通转坐席未接 = 2; 转坐席且接通 = 3,
  770. where.Append(" and qcstate=1 and calltype in (2,3) and datediff(s,'" + filter.StartTime + "',StartDate)>=0 and datediff(s,EndDate,'" + filter.EndTime + "')>=0 ");
  771. int recordCount = 0;
  772. Model.PageData<Model.CallResult> pageModel = new Model.PageData<Model.CallResult>();
  773. StringBuilder fields = new StringBuilder();
  774. var dt = BLL.PagerBLL.GetListPager(
  775. "V_AutoCallResult",
  776. "Id",
  777. "id,itemid,taskname, callee, agentid, username,startdate,enddate,getinagentdate,calltype,talktime,RecordPath, QCState, QCScore, QCRemark, QCUserId, QCUserName,QCTime",
  778. where.ToString(),
  779. sort,
  780. filter.PageSize,
  781. filter.PageIndex,
  782. true,
  783. out recordCount);
  784. var config = new BLL.T_Sys_SystemConfig().GetModelList(" F_ParamCode='PlayPath' ").FirstOrDefault();
  785. var callResultList = callResultBLL.DataTableToListQC(dt);
  786. var obj = new
  787. {
  788. rows = callResultList.Select(x => new
  789. {
  790. id = x.Id,
  791. taskid = x.TaskId,
  792. callnumber = x.CallNumber,
  793. usercode = x.Usercode == "0" ? "" : x.Usercode,
  794. startdate = x.StartDate?.ToString("yyyy-MM-dd HH:mm:ss") ?? "",
  795. getinagentdate = x.GetInAgentDate?.ToString("yyyy-MM-dd HH:mm:ss") ?? "",
  796. enddate = x.EndDate?.ToString("yyyy-MM-dd HH:mm:ss") ?? "",
  797. username = x.Username,
  798. calltype = Enum.Parse(typeof(EnumTalkRecordsCallType), x.CallType.ToString()).ToString(),
  799. talktime = x.TalkTime > 0 ? x.TalkTime.ToString() : "0",
  800. qcstate = x.QCState == 0 ? "未质检" : "已质检",
  801. qcscore = x.QCScore,
  802. qcremark = x.QCRemark ?? "",
  803. qcuserid = x.QCUserId?.ToString() ?? "",
  804. qcusername = x.QCUserName ?? "",
  805. qctime = x.QCTime?.ToString("yyyy-MM-dd HH:mm:ss") ?? ""
  806. }),
  807. total = recordCount
  808. };
  809. return Content(obj.ToJson());
  810. }
  811. /// <summary>
  812. /// 获取质检详情
  813. /// </summary>
  814. /// <param name="id"></param>
  815. /// <returns></returns>
  816. public ActionResult GetQCDetail(string id)
  817. {
  818. DataTable dt = new DataTable();
  819. DataTable dtindex = new DataTable();
  820. DataTable dtres = new DataTable();
  821. try
  822. {
  823. dt = new BLL.T_QC_IndexCategory().GetList(" F_DeleteFlag=0 order by F_Sort ,F_CategoryId").Tables[0];
  824. dtindex = new BLL.T_QC_IndexBase().GetList(" F_DeleteFlag=0 order by F_Sort ,F_CategoryId").Tables[0];
  825. dtres = new BLL.T_QC_IndexRes().GetList(" CallRecordsId=" + id + " ").Tables[0];
  826. int i = 0;
  827. int m = 0;
  828. int indexcount = 0;
  829. int allscore = 0;
  830. int childscore = 0;
  831. int childpf = 0;
  832. int allpf = 0;
  833. List<Model.QCModel> qclist = new List<Model.QCModel>();
  834. object obj = null;
  835. foreach (DataRow dr in dt.Select("F_ParentId=0"))
  836. {
  837. Model.QCModel qcml = new Model.QCModel();
  838. List<Model.QCModel> qcclist = new List<Model.QCModel>();
  839. i = 0;
  840. indexcount = 0;
  841. childscore = 0;
  842. childpf = 0;
  843. string categoryid = dr["F_CategoryId"].ToString().Trim();
  844. qcml.Qcid = categoryid;
  845. qcml.Qcname = dr["F_CategoryName"].ToString().Trim();
  846. obj = DbHelperSQL.GetSingle("select count(*) from T_QC_IndexBase where F_CategoryId in(select F_CategoryId from T_QC_IndexCategory where F_ParentId=" + dr["F_CategoryId"] + ")");
  847. qcml.Rowspan = obj.ToString();
  848. foreach (DataRow childdr in dt.Select("F_ParentId=" + categoryid + ""))
  849. {
  850. Model.QCModel qcmlc = new Model.QCModel();
  851. List<Model.QCModel> qccrlist = new List<Model.QCModel>();
  852. m = 0;
  853. #region 子分类
  854. string childcategoryid = childdr["F_CategoryId"].ToString().Trim();
  855. DataRow[] arrchild = dtindex.Select("F_CategoryId=" + childcategoryid + "");
  856. indexcount += arrchild.Length;
  857. //加载项
  858. qcmlc.Qcid = categoryid + "-" + childcategoryid;
  859. qcmlc.Qcname = childdr["F_CategoryName"].ToString().Trim();
  860. obj = DbHelperSQL.GetSingle("select count(*) from T_QC_IndexBase where F_CategoryId=" + childdr["F_CategoryId"]);
  861. qcmlc.Rowspan = obj.ToString();
  862. #endregion
  863. foreach (DataRow indexdr in arrchild)
  864. {
  865. Model.QCModel qcmlcr = new Model.QCModel();
  866. string indexid = indexdr["F_IndexId"].ToString().Trim();
  867. string pf = "0";
  868. try
  869. {
  870. //分类分数合计
  871. childscore += Convert.ToInt32(indexdr["F_Score"].ToString().Trim());
  872. //总计合计
  873. allscore += Convert.ToInt32(indexdr["F_Score"].ToString().Trim());
  874. }
  875. catch
  876. { }
  877. try
  878. {
  879. pf = dtres.Select("F_IndexId=" + indexid + "")[0]["F_QCScore"].ToString().Trim();
  880. childpf += Convert.ToInt32(pf);//分类评分合计
  881. allpf += Convert.ToInt32(pf);//评分总计
  882. }
  883. catch
  884. {
  885. }
  886. #region 指标
  887. //加载指标
  888. qcmlcr.Qcid = categoryid + "-" + childcategoryid + "-" + indexid;
  889. qcmlcr.Qcname = indexdr["F_Title"].ToString().Trim();
  890. qcmlcr.Qcscore = indexdr["F_Score"].ToString().Trim();
  891. qcmlcr.Qcpf = pf;
  892. qcmlcr.Rowspan = "0";
  893. qcmlcr.Colspan = "0";
  894. #endregion
  895. m++;
  896. qccrlist.Add(qcmlcr);
  897. }
  898. i++;
  899. qcmlc.Qclist = qccrlist;
  900. qcclist.Add(qcmlc);
  901. }
  902. //合计
  903. qcml.Qcscore = childscore.ToString().Trim();
  904. qcml.Qcpf = childpf.ToString().Trim();
  905. qcml.Qclist = qcclist;
  906. qcml.Colspan = "2";
  907. qclist.Add(qcml);
  908. }
  909. Model.QCModel qcmlhj = new Model.QCModel();
  910. qcmlhj.Qcid = "0";
  911. qcmlhj.Qcname = "总计";
  912. qcmlhj.Qcscore = allscore.ToString().Trim();
  913. qcmlhj.Qcpf = allpf.ToString().Trim();
  914. qcmlhj.Qclist = qclist;
  915. qcmlhj.Colspan = "3";
  916. return Success("质检部分加载成功", qcmlhj);
  917. }
  918. catch (Exception ex)
  919. {
  920. return Error("获取质检详情异常,错误:" + ex.ToString());
  921. }
  922. finally
  923. {
  924. dtres.Clear();
  925. dtres.Dispose();
  926. dtindex.Clear();
  927. dtindex.Dispose();
  928. dt.Clear();
  929. dt.Dispose();
  930. }
  931. }
  932. /// <summary>
  933. /// 保存质检详情
  934. /// </summary>
  935. /// <param name="id"></param>
  936. /// <param name="xmlinfo"></param>
  937. /// <returns></returns>
  938. public ActionResult SaveQCDetail(string id, string xmlinfo)
  939. {
  940. DataTable dt = new BLL.T_QC_IndexResAutoCall().GetList(" CallRecordsId=" + id + " ").Tables[0];
  941. int allscore = 0;
  942. foreach (string scoreinfo in xmlinfo.Trim(';').Split(';'))
  943. {
  944. //判断存在该指标评估则修改,无则添加
  945. string idsss = scoreinfo.Split(':')[0];
  946. string indexid = idsss.Split('-')[2];
  947. if (dt.Select(" F_IndexId=" + indexid + " ").Length > 0)
  948. {
  949. Model.T_QC_IndexResAutoCall model = new Model.T_QC_IndexResAutoCall();
  950. model.F_Id = Convert.ToInt32(dt.Select(" F_IndexId=" + indexid + " ")[0]["F_Id"].ToString());
  951. model.CallRecordsId = Convert.ToInt32(id);
  952. try
  953. {
  954. model.F_IndexId = Convert.ToInt32(indexid);
  955. }
  956. catch
  957. { }
  958. try
  959. {
  960. model.F_QCScore = Convert.ToInt32(scoreinfo.Split(':')[1]);
  961. allscore += Convert.ToInt32(scoreinfo.Split(':')[1]);
  962. }
  963. catch
  964. { }
  965. new BLL.T_QC_IndexResAutoCall().Update(model);
  966. }
  967. else
  968. {
  969. Model.T_QC_IndexResAutoCall model = new Model.T_QC_IndexResAutoCall();
  970. model.CallRecordsId = Convert.ToInt32(id);
  971. try
  972. {
  973. model.F_IndexId = Convert.ToInt32(indexid);
  974. }
  975. catch
  976. { }
  977. try
  978. {
  979. model.F_QCScore = Convert.ToInt32(scoreinfo.Split(':')[1]);
  980. allscore += Convert.ToInt32(scoreinfo.Split(':')[1]);
  981. }
  982. catch
  983. { }
  984. new BLL.T_QC_IndexResAutoCall().Add(model);
  985. }
  986. }
  987. Model.CallResult callmodel = new Model.CallResult();
  988. callmodel.Id = Convert.ToInt32(id);
  989. callmodel.QCState = 1;
  990. callmodel.QCScore = allscore;
  991. callmodel.QCUserId = CurrentUser.UserData.F_UserId;
  992. callmodel.QCUserCode = CurrentUser.UserData.F_UserCode;
  993. callmodel.QCUserName = CurrentUser.UserData.F_UserName;
  994. callmodel.QCTime = DateTime.Now;
  995. callmodel.QCRemark = "";
  996. //callmodel.F_QCIsSelect = 0;
  997. //callmodel.F_QCQuestion = question;
  998. //callmodel.F_QCAdvise = advise;
  999. if (new BLL.CallResult().UpdateQC(callmodel))
  1000. return Error("保存质检评分信息失败");
  1001. dt.Clear();
  1002. dt.Dispose();
  1003. return Success("保存成功");
  1004. }
  1005. #endregion
  1006. }
  1007. }