assess_ranking.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  1. $(function () {
  2. // 道管中心选择变化
  3. $("#center-manager").change(function () {
  4. $("#fsList").empty();
  5. if (GV(this) != '') {
  6. getFsStationList(GV(this), function (options) {
  7. $("#fsList").append(options);
  8. });
  9. }
  10. })
  11. // end
  12. })
  13. function queryEmpClick() {
  14. //每次点击前清空表格数据
  15. $(".table-tbody").empty('');
  16. var start_date = $("#start-time").val();
  17. var end_date = $("#end-time").val();
  18. var start_score = $("#start-score").val();
  19. var end_score = $("#end-score").val();
  20. var flag = param_method(start_score, end_score);
  21. if (flag == false) {
  22. return;
  23. }
  24. if (start_date == '' || end_date == '') {
  25. tip("请选择起止日期");
  26. return;
  27. } else {
  28. start_date += " 23:00:00";
  29. end_date += " 23:00:00";
  30. }
  31. var startStr = start_date.replace(/-/g, '/');
  32. var endStr = end_date.replace(/-/g, '/');
  33. var start = new Date(startStr);
  34. //开始日期取前一天的23:00
  35. start.setDate(start.getDate() - 1);
  36. start_date = start.Format("yyyy-MM-dd HH:mm:ss");
  37. var end = new Date(endStr);
  38. if (start > end) {
  39. tip("开始时间不能比结束时间大");
  40. return;
  41. }
  42. var param = {
  43. "parent_dept_id": GV("#center-manager"),
  44. "dept_id": GV("#fsList"),
  45. "start_date": start_date,
  46. "end_date": end_date,
  47. }
  48. var url = "statistics/employee/order";
  49. getEmployeeInfosClick(url, param, start_score, end_score)
  50. }
  51. function initQueryEmp() {
  52. //默认初始化前一周查所有
  53. var endD = new Date();
  54. var now = new Date();
  55. var startD = new Date(now.getTime() - 7 * 24 * 3600 * 1000);
  56. var start_time = startD.getFullYear() + "-" + (startD.getMonth() + 1) + "-" + startD.getDate();
  57. var end_time = endD.getFullYear() + "-" + (endD.getMonth() + 1) + "-" + endD.getDate();
  58. var start_score = $("#start-score").val();
  59. var end_score = $("#end-score").val();
  60. setJobSelect("#jobSelect");
  61. //默认初始化时间页面回显
  62. $("#start-time").val(start_time);
  63. $("#end-time").val(end_time);
  64. var start_date = start_time + " 23:00:00";
  65. var end_date = end_time + " 23:00:00";
  66. var start = new Date(start_date);
  67. //开始日期取前一天的23:00
  68. start.setDate(start.getDate() - 1);
  69. start_date = start.Format("yyyy-MM-dd HH:mm:ss");
  70. var param = {
  71. "start_date": start_date,
  72. "end_date": end_date,
  73. }
  74. var url = "statistics/employee/order";
  75. getEmployeeInfosClick(url, param, start_score, end_score);
  76. }
  77. /**
  78. * click
  79. * @param {*} url
  80. * @param {*} param
  81. */
  82. function getEmployeeInfosClick(url, param, start_score, end_score) {
  83. post_common_service(url, param, function (data) {
  84. var strTbody = '';
  85. var count = 0;
  86. for (var i = 0; i < data.length; i++) {
  87. var score = 1000 - filterByZeroHandle(average(data[i]).toFixed(2), '0');
  88. var flag = judgeParamFilter(data, i, score, start_score, end_score)
  89. if (flag) {
  90. html = "<button id=\"user_" + data[i].user.id + "\" onClick='addTask(" + data[i].user.id + ",\"" + param.start_date + "\",\"" + param.end_date + "\")' class=\"btn\" style='margin-left: 10px;padding: 0px;border: 0;background: none;' type=\"button\"><i class=\"icon icon-plus-sign\"></i></button>"
  91. strTbody += "<tr><td width='4%;'>" + (count + 1) + "</td><td width='6%;'>" + data[i].user.fee_station_name + "</td>"
  92. + "<td width='6%;'>" + data[i].user.truename + "</td><td width='6%;'>" + data[i].user.position_name + "</td>"
  93. + "<td width='6%;'>" + data[i].user.workno + "</td><td width='4%;'>" + data[i].company_ranking + "</td>"
  94. + "<td width='4%;'>" + data[i].center_ranking + "</td><td width='4%;'>" + data[i].fee_station_ranking
  95. + "</td><td width='4%;'>" + getItemScore(data[i], '环境') + "</td>"
  96. + "<td width='4%;'>" + getItemScore(data[i], '仪容仪表') + "</td><td width='4%;'>" + getItemScore(data[i], '表情') + "</td>"
  97. + "<td width='4%;'>" + getItemScore(data[i], '动作') + "</td><td width='4%;'>" + getItemScore(data[i], '文明用语') + "</td>"
  98. + "<td width='4%;'>" + getItemScore(data[i], '工作纪律') + "</td><td width='4%'>" + getItemScore(data[i], '便民服务') + "</td><td width='4%;'>"
  99. + getItemScore(data[i], '安全管理') + "</td><td width='4%;'>" + data[i].check_all_score + "</td>"
  100. + "<td width='6%;'>" + filter(data[i].checked_num, '0') + (data[i].checked_num < 6 ? html : "") + "</td><td width='4%;'>" + filterSlash(filterByZeroHandle(average(data[i]).toFixed(2), '0'), filter(data[i].checked_num, '0')) + "</td>"
  101. + "<td width='4%;'>" + filterSlash(score, filter(data[i].checked_num, '0')) + "</td><td width='4%;'>" + "</td><td width='4%;'>" + "</td></tr>";
  102. count++;
  103. }
  104. }
  105. $(".table-tbody").append(strTbody);
  106. }, function (error) {
  107. return "";
  108. });
  109. }
  110. function addTask(userid, start_date, end_date) {
  111. //获取该人员排班
  112. var url = "teamClass/getUserClasss"
  113. var param = {
  114. "user_id": userid,
  115. "start_time": start_date,
  116. "end_time": end_date
  117. }
  118. post_common_service(url, param, function (data) {
  119. console.log(data)
  120. var tasklist = data.teamClasseList;
  121. var userclasslist = data.userClassCountList;
  122. var allheight = 600;
  123. var height = allheight - 150 - 45;
  124. var allwidth = 920;
  125. //计算日期
  126. var satrtday = new Date(start_date);
  127. var endday = new Date(end_date);
  128. var taskmap= new Map();
  129. var userClassmap= new Map();
  130. for(var i=0;i<tasklist.length;i++){
  131. var task = tasklist[i];
  132. if(!taskmap.get(task.work_date)){
  133. taskmap.put(task.work_date,[]);
  134. }
  135. var arr = taskmap.get(task.work_date);
  136. arr.push(task);
  137. taskmap.put(task.work_date,arr);
  138. }
  139. for(var i=0;i<userclasslist.length;i++){
  140. var usercount = userclasslist[i];
  141. var daytime = new Date(usercount.start_time)
  142. if(daytime.getHours()>=23){
  143. daytime = new Date(daytime.valueOf()+(1000 * 60 * 60 * 24))
  144. }
  145. var work_date = daytime.Format("yyyy-MM-dd")+" 00:00";
  146. if(!userClassmap.get(work_date)){
  147. userClassmap.put(work_date,[]);
  148. }
  149. var arr = userClassmap.get(work_date);
  150. arr.push(usercount);
  151. userClassmap.put(work_date,arr);
  152. }
  153. var days = (endday.valueOf() - satrtday.valueOf()) / (1000 * 60 * 60 * 24);
  154. var header = "<td></td>"
  155. var nighttd = "<td>夜班</td>"
  156. var middletd = "<td>中班</td>"
  157. var morningtd = "<td>早班</td>"
  158. for (var i = 1; i <= days; i++) {
  159. var daytime = new Date(satrtday.valueOf() + i * 1000 * 60 * 60 * 24 -1000 * 60 * 60 * 23);
  160. var workday = daytime.Format("yyyy-MM-dd HH:mm");
  161. var html1 = ""
  162. var html2 = ""
  163. var html3 = ""
  164. if(taskmap.get(workday)){
  165. var userclassarry = null;
  166. if(userClassmap.get(workday)){
  167. userclassarry = userClassmap.get(workday);
  168. }
  169. var arry = taskmap.get(workday);
  170. for(var j=0;j<arry.length;j++){
  171. var hasin = false;
  172. var tasktemp = arry[j];
  173. var hasmin = false;
  174. var taskfail = false;
  175. if(userclassarry!=null){
  176. var d = hasinList(tasktemp,userclassarry)
  177. hasin = d!=null
  178. if(hasin){
  179. if(d.check_status == 22){
  180. taskfail = true;
  181. }
  182. }
  183. }
  184. if((new Date(tasktemp.end_time)).valueOf() - (new Date(tasktemp.start_time)).valueOf()< 1000*60*15){
  185. hasmin = true;
  186. }
  187. var classname = "btn-primary";
  188. if(hasmin){
  189. classname = "btn-danger disabled";
  190. }
  191. if(hasin){
  192. classname = "btn-success disabled";
  193. }
  194. if(taskfail){
  195. classname = "btn-info disabled";
  196. }
  197. var teamid = tasktemp.class_id +"_"+ ( typeof(tasktemp.unregular_id)=="undefined"?"":tasktemp.unregular_id)
  198. var name = (new Date(tasktemp.start_time)).Format("HH:mm") + "--"+(new Date(tasktemp.end_time)).Format("HH:mm")
  199. if(tasktemp.class_type==1){
  200. html1+="<div class='row'><button class=\"btn "+classname+" classbtn\" id="+teamid+" data="+workday+" onclick='selectTeamClass(this)' type=\"button\">"+name+"</button></div>"
  201. // html1 +='<div class="row"><label class="btn '+classname+'"><input type="radio" name="options" id="option2">'+name+'</label></div>'
  202. continue;
  203. }
  204. if(tasktemp.class_type==2){
  205. html2+="<div class='row'><button class=\"btn "+classname+" classbtn\" id="+teamid+" data="+workday+" onclick='selectTeamClass(this)' type=\"button\">"+name+"</button></div>"
  206. continue;
  207. }
  208. if(tasktemp.class_type==3){
  209. html3+="<div class='row'><button class=\"btn "+classname+" classbtn\" id="+teamid+" data="+workday+" onclick='selectTeamClass(this)' type=\"button\">"+name+"</button></div>"
  210. continue;
  211. }
  212. }
  213. }
  214. if(userClassmap.get(workday)){
  215. var teamclassarry = null;
  216. if(taskmap.get(workday)){
  217. teamclassarry = taskmap.get(workday);
  218. }
  219. var arry = userClassmap.get(workday);
  220. for(var j=0;j<arry.length;j++){
  221. var hasin = false;
  222. var usercounttemp = arry[j];
  223. var taskfail = false;
  224. if(teamclassarry!=null){
  225. var d = hasinList(usercounttemp,teamclassarry)
  226. hasin = d!=null
  227. if(hasin){
  228. if(d.check_status == 22){
  229. taskfail = true;
  230. }
  231. }
  232. }
  233. var classname = "btn-warning disabled";
  234. if(hasin){
  235. continue;
  236. }
  237. if(taskfail){
  238. classname = "btn-important disabled";
  239. }
  240. var name = (new Date(usercounttemp.start_time)).Format("HH:mm") + "--"+(new Date(usercounttemp.end_time)).Format("HH:mm")
  241. if(usercounttemp.class_type==1){
  242. html1+="<div class='row'><button class=\"btn "+classname+" classbtn\" type=\"button\">"+name+"</button></div>"
  243. continue;
  244. }
  245. if(usercounttemp.class_type==2){
  246. html2+="<div class='row'><button class=\"btn "+classname+" classbtn\" type=\"button\">"+name+"</button></div>"
  247. continue;
  248. }
  249. if(usercounttemp.class_type==3){
  250. html3+="<div class='row'><button class=\"btn "+classname+" classbtn\" type=\"button\">"+name+"</button></div>"
  251. continue;
  252. }
  253. }
  254. }
  255. nighttd+="<td>" + (html3==""?"无":html3) + "</td>"
  256. middletd+="<td>" + (html1==""?"无":html1) + "</td>"
  257. morningtd+="<td>" + (html2==""?"无":html2) + "</td>"
  258. header += "<td>" + daytime.Format("dd") + "</td>"
  259. }
  260. var css = '<style lang="css">' +
  261. '.row{' +
  262. ' margin-right: 0px; ' +
  263. ' margin-left: 0px;' +
  264. '}' +
  265. '.selecttag{' +
  266. ' line-height:32px' +
  267. '}' +
  268. '.table td {' +
  269. ' vertical-align: middle;' +
  270. ' text-align: center;' +
  271. ' border-left: 1px solid #ddd;' +
  272. ' border-right: 1px solid #ddd;' +
  273. ' border-top: 1px solid #ddd;' +
  274. '}' +
  275. '.classbtn{' +
  276. ' font-size:10px;' +
  277. ' text-align: center;' +
  278. ' padding: 0;' +
  279. '}' +
  280. '.spanclass{' +
  281. ' width:10px;' +
  282. ' height: 10px;' +
  283. '}' +
  284. '</style>';
  285. var table1 = '<div class="row scrollbar" style="height:' + height + 'px;width:' + (allwidth - 21) + 'px;overflow:scroll;padding-top:10px;padding-bottom:10px"><table class="table" style="height:' + height + 'px;margin:0px">' +
  286. ' <tbody>' +
  287. ' <tr style="height:10px" >' +
  288. header +
  289. ' </tr>' +
  290. ' <tr class="danger">' +
  291. nighttd+
  292. ' </tr>' +
  293. ' <tr class="warning">' +
  294. morningtd+
  295. ' </tr>' +
  296. ' <tr class="active">' +
  297. middletd+
  298. ' </tr>' +
  299. ' </tbody>' +
  300. '</table></div>';
  301. var tips = '<div class="row" style="text-align: left;"><div class="spanclass col-xs-2 " style="background:#38B03F"/><div class="col-xs-10">排班已被稽查</div></div>'+
  302. '<div class="row" style="text-align: left;"><div class="spanclass col-xs-2 " style="background:#3280FC"/><div class="col-xs-10">排班未被稽查</div></div>'+
  303. '<div class="row" style="text-align: left;"><div class="spanclass col-xs-2 " style="background:#F1A325"/><div class="col-xs-10">已稽查但排班被删除</div></div>'+
  304. '<div class="row" style="text-align: left;"><div class="spanclass col-xs-2 " style="background:#EA644A"/><div class="col-xs-10">排班未满15分钟</div></div>'+
  305. '<div class="row" style="text-align: left;"><div class="spanclass col-xs-2 " style="background:#03B8CF"/><div class="col-xs-10">排班已稽查但任务无效</div></div>'+
  306. '<div class="row" style="text-align: left;"><div class="spanclass col-xs-2 " style="background:#BD7B46"/><div class="col-xs-10">已稽查但任务无效且排班已删除</div></div>';
  307. var selectdiv = '<div class="row" style="text-align: left;"><div class="col-xs-10">已选择的排班:</div></div>'+
  308. '<div class="row" style="text-align: left;"><div class="col-xs-2"/><div class="col-xs-10"><span id="selectedclass" style="font-size:10px"></span></div></div>';
  309. var optlist = "";
  310. var userlist = data.userList;
  311. for(var q=0;q<userlist.length;q++){
  312. var user = userlist[q];
  313. optlist+=' <option value="'+user.id+'">'+user.truename+'</option>'
  314. }
  315. var html = css + '<div class="row row_alert" style="padding-left:10px;padding-right:10px;">' + table1 + '</div><div class="row row_alert" style="bottom: 0;position: absolute;width: 100%;text-align: right;}">' +
  316. '<div class="col-xs-4">'+tips+'</div><div class="col-xs-3">'+selectdiv+'</div><div class="col-xs-3"><span class="selecttag" style="text-align: right;">请分配对应的稽查人员:</span></div><div class="col-xs-2 class="selecttag""><select data-placeholder="选择稽查员" id="selectusers" class="chosen-select form-control" >' +
  317. optlist+
  318. '</select></div><div class="row row_alert"><button class="btn btn-primary" style="margin:20px;margin-right:10px" onclick="creatTask()" type="button">生成任务</button></div></div>';
  319. layer.open({
  320. type: 1,
  321. title: "生成稽查任务",
  322. skin: 'layui-layer-rim', //加上边框
  323. area: [allwidth + 'px', allheight + 'px'], //宽高
  324. scrollbar: false,
  325. content: html
  326. });
  327. });
  328. }
  329. function selectTeamClass(obj){
  330. $("#selectedclass").html( $(obj).attr('data') +" "+ $(obj).html() +"的排班");
  331. $("#selectedclass").attr('data',obj.id);
  332. }
  333. function creatTask(){
  334. //获取classid
  335. var id = $("#selectedclass").attr('data');
  336. //获取userid
  337. var userid = $("#selectusers").val();
  338. if(id!=null && typeof(id)!="undefined"){
  339. var ids=id.split("_");
  340. var classid = ids[0];
  341. var unregular_id = ids[1];
  342. var url = task_server_url + "/task/add"
  343. if(unregular_id==null||unregular_id==""){
  344. url+='?classid='+classid+'&userid='+userid;
  345. }else{
  346. url+='?classid='+classid+'&unregularid='+unregular_id+'&userid='+userid;
  347. }
  348. get_common_service(url,'',function(data){
  349. tip("已生成",null)
  350. },function(error){
  351. tip(error,null)
  352. })
  353. }else{
  354. tip("未选择任务",null)
  355. }
  356. }
  357. function hasinList(task,list){
  358. var hasin = false;
  359. for(var p=0;p<list.length;p++){
  360. var userclasscount = list[p];
  361. if(typeof(task.unregular_id)=="undefined"){
  362. if(typeof(userclasscount.unregular_id)=="undefined"){
  363. if(task.class_id == userclasscount.class_id){
  364. return userclasscount;
  365. }else{
  366. continue;
  367. }
  368. }else{
  369. continue;
  370. }
  371. }else{
  372. if(typeof(userclasscount.unregular_id)=="undefined"){
  373. continue;
  374. }else{
  375. if(task.class_id == userclasscount.class_id && userclasscount.unregular_id==task.unregular_id){
  376. return userclasscount;
  377. }
  378. }
  379. }
  380. }
  381. return null;
  382. }
  383. /**
  384. * 对于受检次数为0,扣分和得分都为 /
  385. * @param {*} value , check_num 受此次数
  386. * @return value or /
  387. */
  388. function filterSlash(value, check_num) {
  389. if (check_num == 0) {
  390. return '/';
  391. } else {
  392. return value;
  393. }
  394. }
  395. function judgeParamFilter(data, i, score, start_score, end_score) {
  396. var flag1 = false;
  397. if (score >= parseFloat(start_score) && score <= parseFloat(end_score)) {
  398. flag1 = true;
  399. } else {
  400. flag1 = false;
  401. }
  402. var checkCount = $("#check_count").val();
  403. if (checkCount) {
  404. if (filter(data[i].checked_num, '0') == checkCount) {
  405. flag2 = true;
  406. } else {
  407. flag2 = false;
  408. }
  409. } else {
  410. flag2 = true;
  411. }
  412. var jobSelect = $("#jobSelect").val();
  413. if (jobSelect) {
  414. if (data[i].user.positionid == jobSelect) {
  415. flag3 = true;
  416. } else {
  417. flag3 = false;
  418. }
  419. } else {
  420. flag3 = true;
  421. }
  422. return flag1 & flag2 & flag3;
  423. }
  424. function average(obj) {
  425. if (filter(obj.checked_num, '0') == 0) {
  426. return 0;
  427. } else {
  428. return obj.check_all_score / filter(obj.checked_num, '1')
  429. }
  430. }
  431. /**
  432. * 过滤undefined
  433. * @param {*} value
  434. * @param {*} default_display_value
  435. */
  436. function filter(value, default_display_value) {
  437. if (value != '' && value != undefined) {
  438. return value;
  439. } else if (default_display_value != undefined) {
  440. return default_display_value;
  441. } else {
  442. return "";
  443. }
  444. }
  445. /**
  446. * 获取扣分详情
  447. * @param {*} obj
  448. * @param {*} check_item_name
  449. */
  450. function getItemScore(obj, check_item_name) {
  451. var names = obj.checked_socre_name;
  452. var scores = obj.checked_score;
  453. for (var i = 0; i < names.length; i++) {
  454. if (names[i].indexOf(check_item_name) > -1) {
  455. return scores[i];
  456. }
  457. }
  458. return 0;
  459. }
  460. /**
  461. * 过滤除数为0和保留二位小数时出现的0.00
  462. * @param {*} value
  463. * @param {*} default_display_value
  464. */
  465. function filterByZeroHandle(value, default_display_value) {
  466. if (isNaN(value)) {
  467. return default_display_value;
  468. } else {
  469. if ((value + '').endsWith('.00')) {
  470. return value.substring(0, value.length - 3);
  471. }
  472. return value;
  473. }
  474. }
  475. function exportExcel() {
  476. var dept_id = $("#fsList").val();
  477. var start_date = $("#start-time").val();
  478. var end_date = $("#end-time").val();
  479. var start_score = $("#start-score").val();
  480. var end_score = $("#end-score").val();
  481. var flag = param_method(start_score, end_score);
  482. if (flag == false) {
  483. return;
  484. }
  485. if (start_date == '' || end_date == '') {
  486. tip("请选择起止日期");
  487. return;
  488. } else {
  489. start_date += " 23:00:00";
  490. end_date += " 23:00:00";
  491. }
  492. if (!dept_id) dept_id = "";
  493. window.open(getserveraddr() + "/file/employee/order?dept_id=" + dept_id +
  494. "&start_date=" + start_date + "&end_date=" + end_date + "&start_score=" + start_score + "&end_score=" + end_score);
  495. }
  496. function param_method(start_score, end_score) {
  497. if (start_score == '' || end_score == '') {
  498. tip("请输入得分区间");
  499. return false;
  500. } else if (!(/^[0-9]*$/).test(start_score) || !(/^[0-9]*$/).test(end_score)) {
  501. tip("数字不合法!");
  502. return false;
  503. } else if (parseInt(start_score) > parseInt(end_score)) {
  504. tip("开始得分不能比结束得分大");
  505. return false;
  506. } else if (start_score < 0 || start_score > 1000 || end_score < 0 || end_score > 1000) {
  507. tip("得分只能在0-1000之间");
  508. return false;
  509. } else {
  510. return true;
  511. }
  512. }