task.html 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. {{include "head.html"}}
  2. <div class="modal fade" id="modal-assigntask" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  3. <div class="modal-dialog">
  4. <div class="modal-content">
  5. <div class="modal-header">
  6. <div class="modal-header">
  7. <button type="button" id="assign-close" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
  8. <!--<div class="edit-form">-->
  9. <div class="edit-info">
  10. <span class="glyphicon glyphicon-remove code-assign" aria-hidden="true"></span>
  11. <span class="info">爬虫分发<span>
  12. </div>
  13. <form class="form-horizontal" role="form">
  14. <div class="form-group">
  15. <label for="modify" class="col-sm-2 control-label">问题描述:</label>
  16. <div class="col-sm-10">
  17. <textarea class="form-control" id="reason"></textarea>
  18. </div>
  19. </div>
  20. <div class="form-group">
  21. <div class="col-sm-offset-2 col-sm-10">
  22. <input type="button" onclick="comfirm_disables()" class="btn btn-primary" value="确定">
  23. <input type="button" onclick="disables_cancel()" class="btn btn-default" value="取消">
  24. </div>
  25. </div>
  26. </form>
  27. <!--</div> -->
  28. </div>
  29. </div>
  30. </div><!-- /.modal-content -->
  31. </div><!-- /.modal -->
  32. </div>
  33. <div class="content-wrapper">
  34. <section class="content-header">
  35. <h1>
  36. 日常任务列表
  37. <small>
  38. <button class="btn btn-primary" onclick='tasks()'>
  39. 批量导入任务
  40. </button>
  41. <iframe srcdoc="<form id='uploadform' method='post' enctype='multipart/form-data' action='/center/taskfile'><input type='file' name='xlsx' /></form>" height=0 scrolling=no class="hide" id="taskfileframe">
  42. </iframe>
  43. <button class="btn btn-primary createTask" onclick='createTask("")'>新建任务</button>
  44. &nbsp;&nbsp;
  45. <a class="btn btn-default btn-sm" id="batchAssign" onclick="batchAssign()">批量分发</a>
  46. <a class="btn btn-default btn-sm" id="batchClose" onclick="batchClose()">批量关闭</a>
  47. <a class="btn btn-default btn-sm" id="batchDeal" onclick="batchDeal()">批量处理</a>
  48. </small>
  49. </h1>
  50. <ol class="breadcrumb">
  51. <li><a href="#"><i class="fa fa-dashboard"></i> 导入</a></li>
  52. <li class="active">列表</li>
  53. </ol>
  54. </section>
  55. <section id="taskerrmsg" class="content hide" style="min-height:0px;">
  56. <h5>错误信息:</h5>
  57. </section>
  58. <section class="content">
  59. <div class="box">
  60. <div class="box-body">
  61. <table id="task" class="table table-bordered table-striped">
  62. <thead>
  63. <tr>
  64. <th>网址</th>
  65. <th><input type="checkbox" id="selrow" onclick="selectrow(this)"/></th>
  66. <th>编号</th>
  67. <th>网站名称</th>
  68. <th>栏目名称</th>
  69. <th>爬虫代码</th>
  70. <th>平台</th>
  71. <th>状态</th>
  72. <th>类型</th>
  73. <th>维护人</th>
  74. <!-- <th>紧急度</th>-->
  75. <th>节点</th>
  76. <th>次数</th>
  77. <!-- <th>频率次数</th>-->
  78. <th>来源</th>
  79. <th>7日下载量</th>
  80. <th>失败占比</th>
  81. <!-- <th>最迟完成时间</th>-->
  82. <!-- <th>挂起</th>-->
  83. <th class="hidden-xs">操作</th>
  84. </tr>
  85. </thead>
  86. <tbody>
  87. </tbody>
  88. </table>
  89. </div>
  90. </div>
  91. </section>
  92. <script>
  93. var assigncode = "";
  94. var assignid = "";
  95. $(function(){
  96. taskConst = true;
  97. setCookie("task","");
  98. ttabletask = $('#task').DataTable({
  99. "language": {
  100. "url": "/js/dataTables.chinese.lang"
  101. },
  102. "ajax": {
  103. "url": "/center/managerTask",
  104. "type": "POST"
  105. },
  106. "columnDefs": [
  107. { "targets": 0 ,"bVisible": false}, //隐藏列
  108. { "orderable": false, "targets": [0,1,2,3,4,5,6,7,8,9,10,15] } //设置列不可排序
  109. ],
  110. "order": [[14,"desc"]], //默认排序列
  111. "lengthChange":false,
  112. "serverSide": true,
  113. "searching": true,
  114. "ordering": true,
  115. "info": true,
  116. "autoWidth": false,
  117. "columns": [
  118. {"data": "href"},
  119. {"data": "_id",render:function(val,a,row){
  120. return "<input type='checkbox' value='"+val+"' code='"+row.s_code+"' state='"+row.i_state+"'/>"
  121. }},
  122. {"data": "_id",render:function(val,a,row){
  123. return row.num
  124. }},
  125. {"data": "s_site","width":"10%"},
  126. {"data": "s_channel","width":"10%",render:function(val,a,row){
  127. var href ="javascript:void(0)" ;
  128. if(row["href"] != ""){
  129. href = row["href"];
  130. }
  131. var vals="<a href='"+href+"' title='"+val+"' target='_blank'>"+val+"</a>"
  132. return vals
  133. }},
  134. {"data": "s_code",render:function(val,a,row){
  135. // var site = row["s_site"];
  136. // var chanel = row["s_channel"];
  137. // var href = "http://test.qmx.top:3000/dashboard/db/pa-chong-cai-ji-fen-jiao-ben-30ri-zou-shi-fen-xi?orgId=5&amp;var-spidercode="+val+"&amp;var-site="+site+"&amp;=var-channel="+chanel;
  138. // return "<a href='"+href+"' target='_blank' title='"+val+"'>"+val+"</a>"
  139. return val;
  140. }},
  141. {"data": "s_platform"},
  142. {"data": "i_state","width":"5%",render:function(val,a,row){
  143. if (val == 0){
  144. return "待确认"
  145. }else if (val == 1){
  146. return "待处理"
  147. }else if (val == 2){
  148. return "处理中"
  149. }else if (val == 3){
  150. return "待审核"
  151. }else if (val == 4){
  152. return "审核通过"
  153. }else if (val == 5){
  154. return "未通过"
  155. }else if (val == 6){
  156. return "关闭"
  157. }
  158. }},
  159. {"data": "s_type","width":"7%",render:function(val,a,row){
  160. if(val== "1"){
  161. val="列表页异常"
  162. }else if(val=="2"){
  163. val="数据异常错误"
  164. }else if(val=="3"){
  165. val="爬虫翻页异常"
  166. }else if(val=="4"){
  167. val="采集频率异常"
  168. }else if(val=="5"){
  169. val="下载异常"
  170. }else if(val=="6"){
  171. val="数据异常警告"
  172. }else if(val=="0"){
  173. val="常规任务"
  174. }
  175. return val;
  176. }},
  177. {"data": "s_modify"},
  178. {"data": "i_event"},
  179. {"data": "i_times"},
  180. {"data": "s_source"},
  181. {"data": "i_count"},
  182. {"data": "f_failrate"},
  183. // {"data": "l_complete","width":"8%",render:function(val,a,row){
  184. // var dt = new Date()
  185. // dt.setTime(parseInt(val) * 1000);
  186. // return dt.format("yyyy-MM-dd hh:mm:ss");
  187. // }},
  188. {"data": "_id","width":"10%",render:function(val,a,row){
  189. var div=$("<div><div class=\"btn-group\"></div></div>")
  190. var buttonWatch=$('<a type="button" target="_blank" class="btn btn-sm btn-primary">编辑</a>');
  191. var buttonClose=$('<a type="button" class="btn btn-sm btn-danger">关闭</a>');
  192. var buttonTag=$('<a type="button" class="btn btn-sm btn-warning">标记</a>');
  193. //var buttonDel=$('<a type="button" class="btn btn-sm btn-default">删除</a>');
  194. buttonWatch.attr("href","/center/task/edit/"+row['_id']+"__0");
  195. buttonClose.attr("onclick","closeTask('"+row['s_code']+"','"+row['i_state']+"','"+row['_id']+"')");
  196. buttonTag.attr("onclick","tagTask('"+row['s_code']+"','"+row['i_state']+"','"+row['_id']+"','"+row['s_type']+"')");
  197. div.find(".btn-group").append(buttonWatch);
  198. div.find(".btn-group").append(buttonClose);
  199. var buttonAssign=$('<a type="button" class="btn btn-sm btn-info">分发</a>');
  200. buttonAssign.attr("onclick","assignTask('"+row['s_code']+"','"+row['i_state']+"','"+row['_id']+"')");
  201. if(row['i_state'] == "0"){
  202. div.find(".btn-group").append(buttonAssign);
  203. div.find(".btn-group").append(buttonTag);
  204. }else if (row['i_state'] == "1"){
  205. div.find(".btn-group").append(buttonTag);
  206. }
  207. return div.html();
  208. }}
  209. ],
  210. "fnDrawCallback": function(table) {
  211. $("ul.pagination").prepend("&nbsp;&nbsp;&nbsp;转到第 <input type='text' id='changePage' style='width:20px;'> 页 <a type='text' href='javascript:void(0);' id='dataTable-btn' style='text-align:center'>GO</a>");
  212. $('#dataTable-btn').click(function(e) {
  213. var redirectpage=0
  214. if($("#changePage").val() && $("#changePage").val() > 0) {
  215. redirectpage = $("#changePage").val() - 1;
  216. }
  217. ttabletask.page(redirectpage).draw(false);
  218. });
  219. },
  220. "fnServerParams": function (e) {
  221. var taskState = $("#task_state").val();
  222. var taskEvent = $("#task_event").val();
  223. var taskStype = $("#task_stype").val();
  224. var userid = $("#modifyuser").val();
  225. var platform = $("#platform").val();
  226. //任务状态
  227. if(taskState){
  228. e.taskState = taskState;
  229. }else{
  230. e.taskState="-1";
  231. }
  232. //节点
  233. if(taskEvent){
  234. e.taskEvent = taskEvent;
  235. }else{
  236. e.taskEvent="-1";
  237. }
  238. //任务类型
  239. if(taskStype){
  240. e.taskStype = taskStype;
  241. }else{
  242. e.taskStype="-1";
  243. }
  244. //维护人
  245. if(userid){
  246. e.userid = userid;
  247. }else{
  248. e.userid="-1";
  249. }
  250. //平台
  251. if(platform){
  252. e.platform = platform;
  253. }else{
  254. e.platform="-1";
  255. }
  256. }
  257. });
  258. // common.setActive("index_rwgl");
  259. common.menuActive("managerTask");
  260. ttabletask.on('init.dt', function () {
  261. var taskState="<option value='-1'>全部</option>"+
  262. "<option value='0'>待确认</option>"+
  263. "<option value='1'>待处理</option>"+
  264. "<option value='2'>处理中</option>"+
  265. "<option value='3'>待审核</option>"+
  266. "<option value='4'>审核通过</option>"+
  267. "<option value='5'>未通过</option>"+
  268. "<option value='6'>关闭</option>";
  269. var selectState="<div class='form-group'><label for='name'>任务状态:</label>"+
  270. "<select id='task_state' onchange='checkclick(this.value)' class='form-control input-sm'>"+
  271. taskState+
  272. "</select></div>"
  273. $("#task_filter").prepend("&nbsp;&nbsp;");
  274. $("#task_filter").prepend(selectState);
  275. var taskStype="<option value='-1'>全部</option>"+
  276. "<option value='1'>列表页异常</option>"+
  277. "<option value='2'>数据异常错误</option>"+
  278. "<option value='3'>爬虫翻页异常</option>"+
  279. "<option value='4'>采集频率异常</option>"+
  280. "<option value='5'>下载异常</option>"+
  281. "<option value='6'>数据异常警告</option>"+
  282. "<option value='0'>常规任务</option>";
  283. var selectStype="<div class='form-group'><label for='name'>任务类型:</label>"+
  284. "<select id='task_stype' onchange='checkclick(this.value)' class='form-control input-sm'>"+
  285. taskStype+
  286. "</select></div>"
  287. $("#task_filter").prepend("&nbsp;&nbsp;");
  288. $("#task_filter").prepend(selectStype);
  289. var taskEvent="<option value='-1'>全部</option>"
  290. var events={{.T.events}}
  291. for(k in events){
  292. taskEvent+="<option value='"+events[k]+"'>"+events[k]+"</option>"
  293. }
  294. var selectEvent="<div class='form-group'><label for='name'>节点:</label>"+
  295. "<select id='task_event' onchange='checkclick(this.value)' class='form-control input-sm'>"+
  296. taskEvent+
  297. "</select></div>"
  298. $("#task_filter").prepend("&nbsp;&nbsp;");
  299. $("#task_filter").prepend(selectEvent);
  300. var modifyuser="<option value='-1'>全部</option>"
  301. var modifyusers={{.T.modifyusers}}
  302. for(k in modifyusers){
  303. modifyuser+="<option value='"+modifyusers[k]["_id"]+"'>"+modifyusers[k]["s_name"]+"</option>"
  304. }
  305. var selectModifyuser="<div class='form-group'><label for='name'>维护人:</label>"+
  306. "<select id='modifyuser' onchange='checkclick(this.value)' class='form-control input-sm'>"+
  307. modifyuser+
  308. "</select></div>"
  309. $("#task_filter").prepend("&nbsp;&nbsp;");
  310. $("#task_filter").prepend(selectModifyuser);
  311. //平台
  312. var platform="<option value='-1'>全部</option>"
  313. platform+="<option value='golua平台'>golua平台</option>";
  314. platform+="<option value='chrome'>chrome</option>";
  315. platform+="<option value='python'>python</option>";
  316. platform+="<option value='通用平台'>通用平台</option>";
  317. platform+="<option value='jschrome'>jschrome</option>";
  318. var selectPlatform="<div class='form-group'><label for='name'>平台:</label>"+
  319. "<select id='platform' onchange='checkclick(this.value)' class='form-control input-sm'>"+
  320. platform+
  321. "</select></div>"
  322. $("#task_filter").prepend("&nbsp;&nbsp;");
  323. $("#task_filter").prepend(selectPlatform);
  324. //修改样式
  325. $("#task_wrapper .col-sm-6").css({width:"100%"});
  326. });
  327. ttabletask.on('preXhr.dt', function ( e, settings, data ) {
  328. $("[type=search]").keypress(function(){
  329. setCookie("task",$("[type=search]").val());
  330. })
  331. })
  332. })
  333. function createComboxPendState(code,id){
  334. return "<select onchange='changeCodePendState(this.value,\""+code+"\",\""+id+"\")' class='form-control input-sm'>"+
  335. "<option value=1>是</option>"+
  336. "<option value=0>否</option>"+
  337. "</select>"
  338. };
  339. function changeCodePendState(pendstate,code,id){
  340. $.ajax({
  341. url:"/center/spider/updatePendState",
  342. type:"post",
  343. data:{
  344. "pendstate":pendstate,
  345. "id":id,
  346. "code":code,
  347. "stype":"task"
  348. },
  349. success:function(r){
  350. if(!r || !r.success){
  351. showTip("修改失败", 1000, function() {});
  352. }
  353. ttabletask.ajax.reload();
  354. }
  355. })
  356. }
  357. function checkclick(urgency){
  358. ttabletask.ajax.reload();
  359. }
  360. function tasks(){
  361. var f=$("#taskfileframe").contents().find("input");
  362. f.get(0).click();
  363. f.change(function(){
  364. var val=$(this).val()?$(this).val():"";
  365. if(val.indexOf(".xlsx")<0){
  366. showTip("文件格式非法",2000);
  367. }else{
  368. $(this).parent().submit();
  369. common.maskShow("正在导入数据");
  370. var ret=setInterval(function(){
  371. var f=$(window.frames[0].document).find("form");
  372. if(f.length==0){
  373. common.maskHide();
  374. var errorInfo=$(window.frames[0].document).find("body").html();
  375. $(window.frames[0].document).find("body").append("<form id='uploadform' method='post' enctype='multipart/form-data' action='/center/taskfile'><input type='file' name='xlsx' /></form>");
  376. var r=window.confirm("导入完毕,是否查看错误信息");
  377. if(r){
  378. $("#taskerrmsg").removeClass("hide").append(errorInfo);
  379. ttabletask.ajax.reload();
  380. }else{
  381. window.location.reload();
  382. }
  383. clearInterval(ret);
  384. }
  385. },500)
  386. }
  387. })
  388. }
  389. function disables_cancel(){
  390. $("#modal-assigntask").modal("hide");
  391. }
  392. function comfirm_disables(){
  393. if(assigncode== "" || assignid == ""){
  394. showTip("分发失败", 1000);
  395. return
  396. }
  397. var reasontext = $("#reason").val();
  398. $.post("/center/task/assignChangeTaskState",{"code":assigncode,"id":assignid,"reason":reasontext},function(r){
  399. if(r == "y"){
  400. $("#modal-assigntask").modal("hide");
  401. showTip("分发成功", 1000);
  402. $('#com-alert').on('hidden.bs.modal', function () {
  403. ttabletask.ajax.reload();
  404. })
  405. }else if(r == "e"){
  406. showTip("任务已存在", 1000);
  407. }else if(r == "n"){
  408. showTip("分发失败", 1000);
  409. }else{
  410. showTip("没有权限", 1000);
  411. }
  412. });
  413. }
  414. //分发任务
  415. function assignTask(code,state,id){
  416. if(state != "0"){
  417. return;
  418. }
  419. assigncode = code;
  420. assignid = id;
  421. $("#modal-assigntask").modal("show");
  422. }
  423. //关闭任务
  424. function closeTask(code,state,id){
  425. if(state == "6"){
  426. return
  427. }
  428. showConfirm("确定关闭任务?",function(){
  429. $.post("/center/task/closeChangeTaskState",{"id":id,"code":code},function(r){
  430. if(r == "y"){
  431. showTip("关闭成功", 1000);
  432. $('#com-alert').on('hidden.bs.modal', function () {
  433. ttabletask.ajax.reload();
  434. })
  435. }else if(r == "n"){
  436. showTip("关闭失败", 1000);
  437. }else{
  438. showTip("没有权限", 1000);
  439. }
  440. })
  441. })
  442. }
  443. //标记任务
  444. function tagTask(code,state,id,stype){
  445. if(state != 0 && state != 1){
  446. alert("该任务不能被标记!")
  447. return
  448. }
  449. showConfirm("确定标记任务?",function(){
  450. $.post("/center/spider/tagcode",{"id":id,"code":code,"stype":stype},function(r){
  451. if(r == "y"){
  452. showTip("标记成功", 1000);
  453. $('#com-alert').on('hidden.bs.modal', function () {
  454. ttabletask.ajax.reload();
  455. })
  456. }else{
  457. showTip("标记失败", 1000);
  458. }
  459. })
  460. })
  461. }
  462. //批量分发
  463. function batchAssign(){
  464. var codes=[];
  465. var ids=[];
  466. var flag = true;
  467. $("#task_wrapper td input[type=checkbox]").each(function(){
  468. if($(this).prop("checked")){
  469. var state = $(this).attr("state")
  470. if(state == "6"){
  471. flag = false;
  472. }
  473. ids.push($(this).val());
  474. codes.push($(this).attr("code"));
  475. }
  476. });
  477. if(!flag){
  478. showTip("请选择未关闭的任务", 2000);
  479. return
  480. }
  481. if(ids.length >0){
  482. showConfirm("确定批量分发?", function() {
  483. $.post("/center/task/batchAssign",{"codes":codes.join(","),"ids":ids.join(",")},function(r){
  484. if(r == null){
  485. showTip("批量分发成功", 1000);
  486. }else{
  487. showTip(r+";分发失败",30000);
  488. }
  489. $("#selrow").prop('checked',false);
  490. $('#com-alert').on('hidden.bs.modal', function () {
  491. ttabletask.ajax.reload();
  492. })
  493. })
  494. })
  495. }else{
  496. showTip("没有选择项", 1000);
  497. }
  498. }
  499. //批量关闭
  500. function batchClose(){
  501. var ids=[]
  502. var codes=[];
  503. var flag = true;
  504. $("#task_wrapper td input[type=checkbox]").each(function(){
  505. if($(this).prop("checked")){
  506. var state = $(this).attr("state")
  507. if(state == "6"){
  508. flag = false;
  509. }
  510. ids.push($(this).val());
  511. codes.push($(this).attr("code"));
  512. }
  513. });
  514. if(!flag){
  515. showTip("请选择未关闭的任务", 2000);
  516. return
  517. }
  518. if(ids.length >0){
  519. showConfirm("确定批量关闭?", function() {
  520. $.post("/center/task/batchClose",{"ids":ids.join(","),"codes":codes.join(",")},function(r){
  521. if(r == null){
  522. showTip("批量关闭成功", 1000);
  523. }else{
  524. showTip(r+";关闭失败",30000);
  525. }
  526. $("#selrow").prop('checked',false);
  527. $('#com-alert').on('hidden.bs.modal', function () {
  528. ttabletask.ajax.reload();
  529. })
  530. })
  531. })
  532. }else{
  533. showTip("没有选择项", 1000);
  534. }
  535. }
  536. //批量处理
  537. function batchDeal(){
  538. var ids=[]
  539. // var codes=[];
  540. $("#task_wrapper td input[type=checkbox]").each(function(){
  541. if($(this).prop("checked")){
  542. var state = $(this).attr("state")
  543. if(state == "1"){
  544. ids.push($(this).val());
  545. // codes.push($(this).attr("code"));
  546. }
  547. }
  548. });
  549. if(ids.length >0){
  550. showConfirm("确定批量处理?", function() {
  551. $.post("/center/task/batchDeal",{"ids":ids.join(",")},function(r){
  552. showTip(r, 1000);
  553. $("#selrow").prop('checked',false);
  554. $('#com-alert').on('hidden.bs.modal', function () {
  555. ttabletask.ajax.reload();
  556. })
  557. })
  558. })
  559. }else{
  560. showTip("没有选择正确项", 1000);
  561. }
  562. }
  563. function selectrow(me){
  564. var sel=$(me);
  565. var isSelected=sel.prop('checked');
  566. if(isSelected){
  567. $("#task td input[type=checkbox]").prop("checked",true);
  568. }else{
  569. $("#task td input[type=checkbox]").prop("checked",false);
  570. }
  571. }
  572. </script>
  573. </div>
  574. {{include "bottom.html"}}