Răsfoiți Sursa

新版爬虫维护任务展示

maxiaoshan 2 ani în urmă
părinte
comite
1b00267922

+ 3 - 0
src/front/luamove.go

@@ -83,6 +83,9 @@ func (lm *LuaMove) LuaMove() {
 			qu.Debug("query:", query, sort, count)
 			data, _ := u.MgoEB.Find("luamovevent", query, sort, nil, false, start, limit)
 			for _, d := range *data {
+				lua, _ := u.MgoEB.FindOneByField("luaconfig", map[string]interface{}{"code": d["code"]}, `{"modifytime":1,"event":1}`)
+				d["modifytime"] = (*lua)["modifytime"]
+				d["nowevent"] = (*lua)["event"]
 				d["encode"] = util.Se.Encode2Hex(qu.ObjToString(d["code"]))
 			}
 			lm.ServeJson(map[string]interface{}{

+ 1 - 0
src/front/spider.go

@@ -335,6 +335,7 @@ func (f *Front) SaveStep() {
 			common[4] = 1
 			param["param_common"] = common
 			param["channel"] = f.Base.SpiderChannel
+			param["href"] = f.Base.SpiderTargetChannelUrl
 			//向导模式
 			param["param_time"] = ptime
 			param["param_list"] = list

+ 2 - 0
src/main.go

@@ -5,6 +5,7 @@ import (
 	"front"
 	"quesManager"
 	"spider"
+	"task"
 	"vps"
 
 	//. "luaweb/task"
@@ -64,6 +65,7 @@ func init() {
 	xweb.AddAction(&front.Site{})
 	xweb.AddAction(&vps.Vps{})
 	xweb.AddAction(&taskManager.TaskM{})
+	xweb.AddAction(&task.Task{})
 	xweb.AddAction(&quesManager.QuesM{})
 	xweb.AddAction(&luaerrdata.ErrorData{})
 	xweb.AddAction(&luaerrdata.ErrorLua{})

+ 169 - 0
src/task/task.go

@@ -0,0 +1,169 @@
+package task
+
+import (
+	"fmt"
+	"github.com/go-xweb/xweb"
+	"mongodb"
+	qu "qfw/util"
+	"sort"
+	util "spiderutil"
+	"strconv"
+	"strings"
+	"time"
+	u "util"
+)
+
+type Task struct {
+	*xweb.Action
+	taskList xweb.Mapper `xweb:"/center/newtask/tasklist"`  //任务管理
+	taskEdit xweb.Mapper `xweb:"/center/newtask/edit/(.*)"` //编辑任务
+}
+
+func (t *Task) TaskList() {
+	auth := qu.IntAll(t.GetSession("auth"))
+	taskState, _ := t.GetInteger("taskState") //任务状态
+	event, _ := t.GetInteger("taskEvent")     //节点
+	stype, _ := t.GetInteger("taskStype")     //任务类型
+	userid := t.GetString("userid")
+	searchStr := t.GetString("search[value]")
+	//search := strings.Replace(searchStr, " ", "", -1)
+	search := strings.TrimSpace(searchStr)
+	draw, _ := t.GetInteger("draw")
+	start, _ := t.GetInteger("start")
+	limit, _ := t.GetInteger("length")
+	if auth == u.Role_Admin {
+		if t.Method() == "GET" {
+			events := []string{}
+			for k, _ := range util.Config.Uploadevents {
+				events = append(events, k)
+			}
+			sort.Strings(events)
+			t.T["events"] = events
+			t.T["modifyusers"] = getModifyUsers()
+			t.Render("newtask.html", &t.T)
+		} else {
+			query := queryCriteria(userid, taskState, event, stype)
+			if search != "" {
+				query["$or"] = []interface{}{
+					map[string]interface{}{"s_code": map[string]interface{}{"$regex": search}},
+					map[string]interface{}{"s_modify": map[string]interface{}{"$regex": search}},
+					map[string]interface{}{"s_site": map[string]interface{}{"$regex": search}},
+					map[string]interface{}{"s_channel": map[string]interface{}{"$regex": search}},
+				}
+			}
+			sort := `{"%s":%d}`
+			orderIndex := t.GetString("order[0][column]")
+			orderName := t.GetString(fmt.Sprintf("columns[%s][data]", orderIndex))
+			orderType := 1
+			if t.GetString("order[0][dir]") != "asc" {
+				orderType = -1
+			}
+			sort = fmt.Sprintf(sort, orderName, orderType)
+			if orderIndex == "9" { //按下载/下限排序时 先按完成时间排序
+				sorta := strings.Replace(sort, "{", "", -1)
+				sortb := strings.Replace(sorta, "}", "", -1)
+				//sort = `{"l_complete":1,` + sortb + `}`
+				sort = `{` + sortb + `,"l_complete":1}`
+			}
+			qu.Debug("query:", query, sort)
+			task, _ := u.MgoEB.Find("newtask", query, sort, nil, false, start, limit)
+			count := u.MgoEB.Count("newtask", query)
+			page := start / 10
+			if len(*task) > 0 {
+				for k, v := range *task {
+					v["num"] = k + 1 + page*10
+					v["encode"] = util.Se.Encode2Hex(fmt.Sprint(v["s_code"]))
+					//根据code查询luaconfig
+					lua, _ := u.MgoEB.FindOneByField("luaconfig", map[string]interface{}{"code": qu.ObjToString(v["s_code"])}, `{"href":1}`)
+					if len(*lua) > 0 {
+						v["href"] = (*lua)["href"]
+					} else {
+						v["href"] = "javascript:void(0)"
+					}
+
+				}
+			}
+			t.ServeJson(map[string]interface{}{"draw": draw, "data": task, "recordsFiltered": count, "recordsTotal": count})
+		}
+	} else {
+		t.Write("您没有导入任务的权限")
+	}
+}
+
+//编辑 查看任务
+func (t *Task) TaskEdit(ids string) error {
+	auth := qu.IntAll(t.GetSession("auth"))
+	id := strings.Split(ids, "__")[0]
+	param := strings.Split(ids, "__")[1]
+	if t.Method() == "GET" {
+		query := map[string]interface{}{
+			"_id": mongodb.StringTOBsonId(id),
+		}
+		task, _ := u.MgoEB.FindOne("newtask", query)
+		if task != nil && len(*task) > 0 {
+			(*task)["l_comeintime"] = time.Unix((*task)["l_comeintime"].(int64), 0).Format("2006-01-02 15:04:05")
+			(*task)["l_complete"] = time.Unix((*task)["l_complete"].(int64), 0).Format("2006-01-02 15:04:05")
+			if (*task)["a_mrecord"] != nil {
+				mrecord := qu.ObjArrToMapArr((*task)["a_mrecord"].([]interface{}))
+				if mrecord != nil && len(mrecord) > 0 {
+					for _, v := range mrecord {
+						v["l_mrecord_comeintime"] = time.Unix(qu.Int64All(v["l_mrecord_comeintime"]), 0).Format("2006-01-02 15:04:05")
+						v["l_mrecord_complete"] = time.Unix(qu.Int64All(v["l_mrecord_complete"]), 0).Format("2006-01-02 15:04:05")
+					}
+				}
+			}
+			if (*task)["a_check"] != nil {
+				check := qu.ObjArrToMapArr((*task)["a_check"].([]interface{}))
+				if check != nil && len(check) > 0 {
+					for _, v := range check {
+						v["l_check_checkTime"] = time.Unix(qu.Int64All(v["l_check_checkTime"]), 0).Format("2006-01-02 15:04:05")
+					}
+				}
+			}
+			t.T["encode"] = util.Se.Encode2Hex(fmt.Sprint((*task)["s_code"]))
+			t.T["id"] = id
+			t.T["task"] = *task
+			t.T["param"] = param
+			if t.GetSession(id) == "" || t.GetSession(id) == nil {
+				t.T["xgTime"] = time.Unix(time.Now().Unix(), 0).Format("2006-01-02 15:04:05")
+			} else {
+				t.T["xgTime"] = qu.ObjToString(t.GetSession(id))
+			}
+			t.DelSession(id)
+			if auth == u.Role_Admin {
+				return t.Render("taskedit.html", &t.T)
+			} else if auth == u.Role_Dev {
+				return t.Render("mytaskedit.html", &t.T)
+			} else if auth == u.Role_Examine {
+				return t.Render("auditedit.html", &t.T)
+			}
+		}
+	}
+	return nil
+}
+
+func getModifyUsers() []map[string]interface{} {
+	query := map[string]interface{}{
+		"i_auth":   1,
+		"i_delete": 0,
+	}
+	user, _ := u.MgoEB.Find("user", query, nil, nil, false, -1, -1)
+	return *user
+}
+
+func queryCriteria(userid string, taskState, event, stype int) (query map[string]interface{}) {
+	query = map[string]interface{}{}
+	if userid != "" && userid != "-1" {
+		query["s_modifyid"] = userid
+	}
+	if taskState >= 0 {
+		query["i_state"] = taskState
+	}
+	if event >= 0 {
+		query["i_event"] = event
+	}
+	if stype >= 0 {
+		query["s_type"] = strconv.Itoa(stype)
+	}
+	return
+}

+ 16 - 18
src/taskManager/taskManager.go

@@ -48,12 +48,10 @@ type TaskM struct {
 //session是否失效
 var SessionFailuer bool //检测每次登陆
 
-const role_admin, role_examine, role_dev = 3, 2, 1 //管理员,审核员,开发员
-
 //任务导入
 func (t *TaskM) Taskfile() {
 	auth := qu.IntAll(t.GetSession("auth"))
-	if auth != role_admin {
+	if auth != u.Role_Admin {
 		t.ServeJson("没有权限")
 		return
 	}
@@ -174,7 +172,7 @@ func (t *TaskM) ManagerTask() {
 	draw, _ := t.GetInteger("draw")
 	start, _ := t.GetInteger("start")
 	limit, _ := t.GetInteger("length")
-	if auth == role_admin {
+	if auth == u.Role_Admin {
 		if t.Method() == "GET" {
 			events := []string{}
 			for k, _ := range util.Config.Uploadevents {
@@ -275,7 +273,7 @@ func findLua(code string) []interface{} {
 //我的任务
 func (t *TaskM) Mytask() {
 	auth := qu.IntAll(t.GetSession("auth"))
-	if auth != role_dev {
+	if auth != u.Role_Dev {
 		t.ServeJson("没有权限")
 		return
 	}
@@ -452,7 +450,7 @@ func GetModifyUsers() []map[string]interface{} {
 //保存新建任务
 func (t *TaskM) SaveNewTask() {
 	auth := qu.IntAll(t.GetSession("auth"))
-	if auth != role_admin {
+	if auth != u.Role_Admin {
 		t.ServeJson("没有权限")
 		return
 	}
@@ -566,11 +564,11 @@ func (t *TaskM) EditTask(ids string) error {
 				t.T["xgTime"] = qu.ObjToString(t.GetSession(id))
 			}
 			t.DelSession(id)
-			if auth == role_admin {
+			if auth == u.Role_Admin {
 				return t.Render("taskedit.html", &t.T)
-			} else if auth == role_dev {
+			} else if auth == u.Role_Dev {
 				return t.Render("mytaskedit.html", &t.T)
-			} else if auth == role_examine {
+			} else if auth == u.Role_Examine {
 				return t.Render("auditedit.html", &t.T)
 			}
 		}
@@ -583,7 +581,7 @@ func (t *TaskM) Del() {
 	auth := qu.IntAll(t.GetSession("auth"))
 	id := t.GetString("id")
 	state := "no"
-	if auth != role_admin {
+	if auth != u.Role_Admin {
 		t.ServeJson("没有权限")
 		return
 	}
@@ -602,7 +600,7 @@ func (t *TaskM) Del() {
 //修改任务
 func (t *TaskM) UpdateTask() {
 	auth := qu.IntAll(t.GetSession("auth"))
-	if auth != role_admin {
+	if auth != u.Role_Admin {
 		t.ServeJson("没有权限")
 		return
 	}
@@ -702,7 +700,7 @@ func (t *TaskM) UpdateTaskState() {
 //保存记录
 func (t *TaskM) SaveRecord() {
 	auth := qu.IntAll(t.GetSession("auth"))
-	if auth != role_dev {
+	if auth != u.Role_Dev {
 		t.ServeJson("没有权限")
 		return
 	}
@@ -738,7 +736,7 @@ func (t *TaskM) SaveRecord() {
 //审核任务
 func (t *TaskM) Audit() {
 	auth := qu.IntAll(t.GetSession("auth"))
-	if auth != role_examine {
+	if auth != u.Role_Examine {
 		t.ServeJson("没有权限")
 		return
 	}
@@ -867,7 +865,7 @@ func (t *TaskM) AssignChangeTaskState() {
 	code := t.GetString("code")
 	reason := t.GetString("reason") //有分发描述追加到任务问题描述中
 	auth := qu.IntAll(t.GetSession("auth"))
-	if auth == role_admin {
+	if auth == u.Role_Admin {
 		//先根据code查有没有相关任务,再根据id修改任务状态
 		query := map[string]interface{}{
 			"s_code": code,
@@ -914,7 +912,7 @@ func (t *TaskM) CloseChangeTaskState() {
 	id := t.GetString("id")
 	code := t.GetString("code")
 	auth := qu.IntAll(t.GetSession("auth"))
-	if auth == role_admin {
+	if auth == u.Role_Admin {
 		//根据id关闭任务
 		query := map[string]interface{}{
 			"_id": mongodb.StringTOBsonId(id),
@@ -946,7 +944,7 @@ func (t *TaskM) BatchAssign() {
 	auth := qu.IntAll(t.GetSession("auth"))
 	query := map[string]interface{}{}
 	var existCode []string
-	if auth == role_admin {
+	if auth == u.Role_Admin {
 		for k, code := range codes {
 			query = map[string]interface{}{
 				"s_code": code,
@@ -986,7 +984,7 @@ func (t *TaskM) BatchClose() {
 	codes := strings.Split(t.GetString("codes"), ",")
 	auth := qu.IntAll(t.GetSession("auth"))
 	var falseCode []string
-	if auth == role_admin {
+	if auth == u.Role_Admin {
 		for k, id := range ids {
 			query := map[string]interface{}{
 				"_id": mongodb.StringTOBsonId(id),
@@ -1015,7 +1013,7 @@ func (t *TaskM) BatchClose() {
 func (t *TaskM) BatchDeal() {
 	ids := strings.Split(t.GetString("ids"), ",")
 	auth := qu.IntAll(t.GetSession("auth"))
-	if auth == role_admin {
+	if auth == u.Role_Admin {
 		update := map[string]interface{}{
 			"$set": map[string]interface{}{
 				"i_state":     2,

+ 2 - 0
src/util/util.go

@@ -13,6 +13,7 @@ import (
 	"github.com/yuin/gopher-lua"
 )
 
+const Role_Admin, Role_Examine, Role_Dev = 3, 2, 1 //管理员,审核员,开发员
 var (
 	//MgoE            *mgo.MongodbSim //编辑器87
 	MgoEB           *mgo.MongodbSim //编辑器163
@@ -83,6 +84,7 @@ var (
 		"bidtype":            true,
 	}
 	Bu = "_bu" //创建采历史爬虫后缀
+
 )
 
 func InitMgo() {

+ 1 - 0
src/web/templates/head.html

@@ -589,6 +589,7 @@
 			<li data="index_fbgl"><a href="/center/lualist.html"><i class="glyphicon glyphicon-credit-card"></i> <span>运行监控中心</span></a></li>
 		    <li data="index_pcdr"><a href="/center/importdata"><i class="glyphicon glyphicon-import"></i> <span>爬虫导入</span></a></li>
 		    <li data="index_pcqy"><a href="/center/luamove"><i class="glyphicon glyphicon-move"></i> <span>爬虫迁移管理</span></a></li>
+		  <li data="index_newrwgl"><a href="/center/newtask/tasklist"><i class="glyphicon glyphicon glyphicon-tasks"></i> <span>新版任务管理</span></a></li>
 		{{else if eq (session "auth") 2}}
 			<li data="index"><a href="/center"><i class="glyphicon glyphicon-eye-open"></i> <span>爬虫审核</span></a></li>
 			<li data="index_rwsh"><a href="/center/task/audit"><i class="glyphicon glyphicon glyphicon-tasks"></i> <span>任务审核</span></a></li>

+ 16 - 8
src/web/templates/luamovelist.html

@@ -27,10 +27,12 @@
 								<th>是否转移</th>
 								<th>历史节点</th>
 								<th>目标节点</th>
+								<th>当前节点</th>
 								<th>最大页</th>
 								<th>间隔(分)</th>
 								<th>下载量(comeintime)</th>
 								<th>下载量(publishtime)</th>
+								<th>维护时间</th>
 								<th>迁移状态</th>
 								<th class="hidden-xs">操作</th>
 							</tr>
@@ -54,7 +56,7 @@
       		},
 			"columnDefs": [
 				//{ "targets": 0 ,"bVisible": false}, //隐藏列
-			  { "orderable": false, "targets": [0,1,2,3,4,5,6,7,8,11,12] }, //设置列不可排序
+			  { "orderable": false, "targets": [0,1,2,3,4,5,6,7,8,9,12,13,14] }, //设置列不可排序
 				//更新节点
 			  {"targets":[6], createdCell: function (cell, cellData, rowData, rowIndex, colIndex) {
 				{{if gt (session "auth") 2}}
@@ -79,7 +81,7 @@
 			}},
 
 			],
-			"order": [[9,"asc"]], //默认排序列
+			"order": [[10,"asc"]], //默认排序列
 			"lengthChange":false,
 			"serverSide": true,
 			"searching": true,
@@ -104,17 +106,23 @@
 				}},
 				{"data": "fromevent",width:"30px"},
 				{"data": "toevent",width:"30px"},
+				{"data": "nowevent",width:"30px"},
 				{"data": "maxpage"},
 				{"data": "cycletime"},
 				{"data": "datanum"},
 				{"data": "ptimedatanum"},
+				{"data": "modifytime",render:function (val){
+						var dt = new Date()
+						dt.setTime(parseInt(val) * 1000);
+						return dt.format("yyyy-MM-dd hh:mm:ss");
+					}},
 				{"data": "state",render:function (val){
-					if(val == 0){
-						return "未处理"
-					}else{
-						return "已处理"
-					}
-				}},
+						if(val == 0){
+							return "未处理"
+						}else{
+							return "已处理"
+						}
+					}},
         		{"data": "_id",width:"91px",render:function(val,a,row){
 					var div=$("<div><div class=\"btn-group\"></div></div>")
 					if(row.state != 1){

+ 515 - 0
src/web/templates/newtask.html

@@ -0,0 +1,515 @@
+{{include "head.html"}}
+`<div class="modal fade" id="modal-assigntask" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+    <div class="modal-dialog">
+        <div class="modal-content">
+			<div class="modal-header">
+				<div class="modal-header">
+	                <button type="button" id="assign-close" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+					<!--<div class="edit-form">-->
+						<div class="edit-info">
+							<span class="glyphicon glyphicon-remove" id="code-assign" aria-hidden="true"></span>
+							<span class="info">爬虫分发<span>
+						</div>
+						<form class="form-horizontal" role="form">
+							<div class="form-group">
+							    <label for="modify" class="col-sm-2 control-label">问题描述:</label>
+							    <div class="col-sm-10">
+									<textarea class="form-control" id="reason"></textarea>
+							    </div>
+							</div>
+							<div class="form-group" id="assign-style">
+							    <div class="col-sm-offset-2 col-sm-10">
+							      	<input type="button" onclick="comfirm_disables()" class="btn btn-primary" value="确定">
+									<input type="button" onclick="disables_cancel()" class="btn btn-default" value="取消">
+							    </div>
+							</div>
+						</form>
+					<!--</div>	-->
+				</div>
+		 	</div>
+        </div><!-- /.modal-content -->
+    </div><!-- /.modal -->
+</div>
+
+<div class="content-wrapper">
+		<section class="content-header">
+		   <h1>
+		     任务列表
+		     <small>
+				<button class="btn btn-primary" onclick='tasks()'>
+					批量导入任务
+				</button>
+				<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">
+				</iframe>
+				
+				<button class="btn btn-primary createTask" onclick='createTask("")'>新建任务</button>
+				&nbsp;&nbsp;
+				<a class="btn btn-default btn-sm" id="batchAssign" onclick="batchAssign()">批量分发</a>
+				<a class="btn btn-default btn-sm" id="batchClose" onclick="batchClose()">批量关闭</a>
+			 </small>
+		   </h1>
+		   <ol class="breadcrumb">
+		     <li><a href="#"><i class="fa fa-dashboard"></i> 导入</a></li>
+		     <li class="active">列表</li>
+		   </ol>
+		 </section>
+		<section id="taskerrmsg" class="content hide" style="min-height:0px;">
+			<h5>错误信息:</h5>
+		</section>
+		<section class="content">
+			<div class="box">
+				<div class="box-body">
+					<table id="task" class="table table-bordered table-striped">
+						<thead>
+							<tr>
+								<th>网址</th>
+								<th><input type="checkbox" id="selrow" onclick="selectrow(this)"/></th>
+								<th>编号</th>
+								<th>网站名称</th>
+								<th>栏目名称</th>
+								<th>爬虫代码</th>
+								<th>状态</th>
+               					<th>类型</th>
+								<th>维护人</th>
+								<th>节点</th>
+								<th>次数</th>
+                				<th>来源</th>
+								<th>最迟完成时间</th>
+								<th class="hidden-xs">操作</th>
+							</tr>
+						</thead>
+						<tbody>
+							
+						</tbody>
+					</table>
+				</div>
+			</div>
+		</section>
+<script>
+  var assigncode = "";
+  var assignid = "";
+	$(function(){
+		window.setInterval(function(){
+			$.post("/center/task/getJumpMark",function(r){
+				if(r){
+					ttabletask.ajax.reload();
+				}
+			})
+		}, 3000); 
+		
+		taskConst = true;
+		setCookie("task","");
+		ttabletask = $('#task').DataTable({
+			"language": {
+               "url": "/js/dataTables.chinese.lang"
+           },
+			"ajax": {
+            	"url": "/center/newtask/tasklist",
+           		"type": "POST"
+				
+       		 },
+			"columnDefs": [
+				{ "targets": 0 ,"bVisible": false}, //隐藏列
+				{ "orderable": false, "targets": [0,1,2,3,4,5,6,7,8,13] } //设置列不可排序
+			],
+			"order": [[12,"desc"]], //默认排序列
+			"lengthChange":false,
+			"serverSide": true,
+			"searching": true,
+			"ordering": true,
+			"info": true,
+			"autoWidth": true,
+			"columns": [
+				{"data": "href"},
+				{"data": "_id",render:function(val,a,row){
+					return "<input type='checkbox' value='"+val+"' code='"+row.s_code+"' state='"+row.i_state+"'/>"
+				}},
+				{"data": "_id",render:function(val,a,row){
+					return row.num
+				}},
+	      		{"data": "s_site","width":"10%"},
+				{"data": "s_channel","width":"10%",render:function(val,a,row){
+					var href ="javascript:void(0)" ;
+					if(row["href"] != ""){
+						href = row["href"];
+					}
+					var vals="<a href='"+href+"' title='"+val+"' target='_blank'>"+val+"</a>"
+					return vals
+				}},
+				{"data": "s_code",render:function(val,a,row){	
+					// var	site = row["s_site"];
+					// var	chanel = row["s_channel"];
+					// 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;
+					// return "<a href='"+href+"' target='_blank' title='"+val+"'>"+val+"</a>"
+						return val;
+				}},
+				{"data": "i_state","width":"5%",render:function(val,a,row){
+						if (val == 0){
+							return "待确认"
+						}else if (val == 1){
+							return "待处理"
+						}else if (val == 2){
+							return "处理中"
+						}else if (val == 3){
+							return "待审核"
+						}else if (val == 4){
+							return "审核通过"
+						}else if (val == 5){
+							return "未通过"
+						}else if (val == 6){
+							return "关闭"
+						}
+					}},
+				{"data": "s_type","width":"7%",render:function(val,a,row){
+					if(val== "1"){
+						val="列表页异常"
+					}else if(val=="2"){
+						val="数据异常错误"
+					}else if(val=="4"){
+						val="采集频率异常"
+					}else if(val=="5"){
+						val="下载异常"
+					}else if(val=="6"){
+						val="数据异常警告"
+					}else if(val=="0"){
+						val="常规任务"
+					}
+					return val;
+				}},
+				{"data": "s_modify",},
+				{"data": "i_event",render:function(val,a,row){
+						if (val == undefined){
+							return "";
+						}
+						return val;
+					}},
+				{"data": "i_times"},
+				{"data": "s_source"},
+				{"data": "l_complete","width":"8%",render:function(val,a,row){
+					var dt = new Date()
+					dt.setTime(parseInt(val) * 1000);
+					return dt.format("yyyy-MM-dd hh:mm:ss");
+				}},
+				{"data": "_id","width":"9%",render:function(val,a,row){
+					var div=$("<div><div class=\"btn-group\"></div></div>")
+					var buttonWatch=$('<a type="button" target="_blank" class="btn btn-sm btn-success">编辑</a>');
+					var buttonClose=$('<a type="button" class="btn btn-sm btn-danger">关闭</a>');
+					var buttonTag=$('<a type="button" class="btn btn-sm btn-primary">标记</a>');
+					//var buttonDel=$('<a type="button" class="btn btn-sm btn-default">删除</a>');
+					buttonWatch.attr("href","/center/newtask/edit/"+row['_id']+"__0");
+					buttonClose.attr("onclick","closeTask('"+row['s_code']+"','"+row['i_state']+"','"+row['_id']+"')");
+					buttonTag.attr("onclick","tagTask('"+row['s_code']+"','"+row['i_state']+"','"+row['_id']+"','"+row['s_type']+"')");
+					div.find(".btn-group").append(buttonWatch);
+				    div.find(".btn-group").append(buttonClose);
+					if(row['i_state'] == "0"){
+						var buttonAssign=$('<a type="button" class="btn btn-sm btn-warning">分发</a>');
+						buttonAssign.attr("onclick","assignTask('"+row['s_code']+"','"+row['i_state']+"','"+row['_id']+"')");
+						div.find(".btn-group").append(buttonAssign);
+						div.find(".btn-group").append(buttonTag);//只有待确认的任务可以标记
+				 	}
+					return div.html();
+				}}
+			],
+			"fnDrawCallback": function(table) {
+			 	$("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>");
+			 	$('#dataTable-btn').click(function(e) {    
+				    var redirectpage=0
+					if($("#changePage").val() && $("#changePage").val() > 0) {    
+				        var redirectpage = $("#changePage").val() - 1;    
+				    }  
+					ttabletask.page(redirectpage).draw(false);      
+			    });    
+			},
+			"fnServerParams": function (e) {  
+				var taskState = $("#task_state").val();
+				var taskEvent = $("#task_event").val();
+				var taskStype = $("#task_stype").val();
+				var userid = $("#modifyuser").val();
+				//任务状态
+				if(taskState){
+					e.taskState = taskState;
+				}else{
+					e.taskState="-1";
+				}
+				//节点
+				if(taskEvent){
+					e.taskEvent = taskEvent;
+				}else{
+					e.taskEvent="-1";
+				}
+				//任务类型
+				if(taskStype){
+					e.taskStype = taskStype;
+				}else{
+					e.taskStype="-1";
+				}
+				//维护人
+				if(userid){
+					e.userid = userid;
+				}else{
+					e.userid="-1";
+				}
+      		}
+	  	});
+		common.setActive("index_newrwgl");
+		ttabletask.on('init.dt', function () {
+			var taskState="<option value='-1'>全部</option>"+
+				"<option value='0'>待确认</option>"+
+				"<option value='1'>待处理</option>"+
+				"<option value='2'>处理中</option>"+
+				"<option value='3'>待审核</option>"+
+				"<option value='4'>审核通过</option>"+
+				"<option value='5'>未通过</option>"+
+				"<option value='6'>关闭</option>";
+			var selectState="<div class='form-group'><label for='name'>任务状态:</label>"+
+				"<select id='task_state' onchange='checkclick(this.value)' class='form-control input-sm'>"+
+				taskState+
+				"</select></div>"
+				$("#task_filter").prepend("&nbsp;&nbsp;");
+				$("#task_filter").prepend(selectState);
+
+			var taskStype="<option value='-1'>全部</option>"+
+				"<option value='1'>列表页异常</option>"+
+				"<option value='2'>数据异常错误</option>"+
+				"<option value='4'>采集频率异常</option>"+
+				"<option value='5'>下载异常</option>"+
+				"<option value='6'>数据异常警告</option>"+
+				"<option value='0'>常规任务</option>";
+			var selectStype="<div class='form-group'><label for='name'>任务类型:</label>"+
+				"<select id='task_stype' onchange='checkclick(this.value)' class='form-control input-sm'>"+
+				taskStype+
+				"</select></div>"
+				$("#task_filter").prepend("&nbsp;&nbsp;");
+				$("#task_filter").prepend(selectStype);
+
+			var taskEvent="<option value='-1'>全部</option>"
+			var events={{.T.events}}
+			for(k in events){
+				taskEvent+="<option value='"+events[k]+"'>"+events[k]+"</option>"
+			}
+			var selectEvent="<div class='form-group'><label for='name'>节点:</label>"+
+				"<select id='task_event' onchange='checkclick(this.value)' class='form-control input-sm'>"+
+				taskEvent+
+			"</select></div>"
+			$("#task_filter").prepend("&nbsp;&nbsp;");
+      		$("#task_filter").prepend(selectEvent);
+
+      		var modifyuser="<option value='-1'>全部</option>"
+			var modifyusers={{.T.modifyusers}}
+			for(k in modifyusers){
+				modifyuser+="<option value='"+modifyusers[k]["_id"]+"'>"+modifyusers[k]["s_name"]+"</option>"
+			}
+			var selectModifyuser="<div class='form-group'><label for='name'>维护人:</label>"+
+				"<select id='modifyuser' onchange='checkclick(this.value)' class='form-control input-sm'>"+
+				modifyuser+
+			"</select></div>"
+			$("#task_filter").prepend("&nbsp;&nbsp;");
+			$("#task_filter").prepend(selectModifyuser);
+			//修改样式
+			$("#task_wrapper .col-sm-6").css({width:"100%"});
+		});
+		ttabletask.on('preXhr.dt', function ( e, settings, data ) {
+			$("[type=search]").keypress(function(){
+				setCookie("task",$("[type=search]").val());
+			})
+   		})
+	})
+	function checkclick(urgency){
+		ttabletask.ajax.reload();
+	}
+	
+	function tasks(){
+		var f=$("#taskfileframe").contents().find("input");
+		f.get(0).click();
+		f.change(function(){
+		  var val=$(this).val()?$(this).val():"";
+		  if(val.indexOf(".xlsx")<0){
+			showTip("文件格式非法",2000);
+		  }else{
+			$(this).parent().submit();
+			common.maskShow("正在导入数据");
+			var ret=setInterval(function(){
+				var f=$(window.frames[0].document).find("form");
+				if(f.length==0){
+					common.maskHide();
+					var errorInfo=$(window.frames[0].document).find("body").html();
+					$(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>");
+					
+					var r=window.confirm("导入完毕,是否查看错误信息");
+					if(r){
+						$("#taskerrmsg").removeClass("hide").append(errorInfo);
+						ttabletask.ajax.reload();
+					}else{
+						window.location.reload();
+					}
+					clearInterval(ret);
+				}
+			},500)
+		  }
+		})
+	}
+	function disables_cancel(){
+		$("#modal-assigntask").modal("hide");
+	}
+  
+  function comfirm_disables(){
+    if(assigncode== "" || assignid == ""){
+      showTip("分发失败", 1000);
+      return
+    }
+    var reasontext = $("#reason").val();
+    $.post("/center/task/assignChangeTaskState",{"code":assigncode,"id":assignid,"reason":reasontext},function(r){
+			if(r == "y"){
+        		$("#modal-assigntask").modal("hide");
+				showTip("分发成功", 1000);
+				$('#com-alert').on('hidden.bs.modal', function () {
+					ttabletask.ajax.reload();
+				})
+			}else if(r == "e"){
+				showTip("任务已存在", 1000);
+			}else if(r == "n"){
+				showTip("分发失败", 1000);
+			}else{
+				showTip("没有权限", 1000);
+			}	
+		});
+  }
+  
+	//分配任务
+	function assignTask(code,state,id){
+		if(state != "待确认"){
+			return;
+		}
+    assigncode = code;
+    assignid = id;
+    $("#modal-assigntask").modal("show");
+	}
+
+	//关闭任务
+	function closeTask(code,state,id){
+		if(state == "关闭"){
+			return
+		}	
+		showConfirm("确定关闭任务?",function(){
+			$.post("/center/task/closeChangeTaskState",{"id":id,"code":code},function(r){
+				if(r == "y"){
+					showTip("关闭成功", 1000);
+					$('#com-alert').on('hidden.bs.modal', function () {
+						ttabletask.ajax.reload();
+					})
+				}else if(r == "n"){
+					showTip("关闭失败", 1000);
+				}else{
+					showTip("没有权限", 1000);
+				}	
+			})
+		})
+	}
+
+	//标记任务
+	function tagTask(code,state,id,stype){
+	  if(state != "待确认" && state != "待处理" && state != "处理中"){
+		  alert("该任务不能被标记!")
+		  return
+	  }
+	  showConfirm("确定标记任务?",function(){
+		  $.post("/center/spider/tagcode",{"id":id,"code":code,"stype":stype},function(r){
+			  if(r == "y"){
+				  showTip("标记成功", 1000);
+				  $('#com-alert').on('hidden.bs.modal', function () {
+					  ttabletask.ajax.reload();
+				  })
+			  }else{
+				  showTip("标记失败", 1000);
+			  }
+		  })
+	  })
+	}
+
+	//批量分发
+	function batchAssign(){
+		var codes=[];
+		var ids=[];
+		var flag = true;
+		$("#task_wrapper td input[type=checkbox]").each(function(){
+			if($(this).prop("checked")){
+				var state = $(this).attr("state")
+				if(state == "关闭"){
+					flag = false;
+				}
+				ids.push($(this).val());
+				codes.push($(this).attr("code"));
+			}
+		});
+		if(!flag){
+			showTip("请选择未关闭的任务", 2000);
+			return
+		}
+		if(ids.length >0){
+			showConfirm("确定批量分发?", function() {
+				$.post("/center/task/batchAssign",{"codes":codes.join(","),"ids":ids.join(",")},function(r){
+					if(r == null){
+						showTip("批量分发成功", 1000);
+					}else{
+						showTip(r+";分发失败",30000);
+					}
+					$("#selrow").prop('checked',false);
+					$('#com-alert').on('hidden.bs.modal', function () {
+						ttabletask.ajax.reload();
+					})	
+				})
+			})
+		}else{
+			showTip("没有选择项", 1000);
+		}
+	}
+	//批量关闭
+	function batchClose(){
+		var ids=[]
+		var codes=[];
+		var flag = true;
+		$("#task_wrapper td input[type=checkbox]").each(function(){
+			if($(this).prop("checked")){
+				var state = $(this).attr("state")
+				if(state == "关闭"){
+					flag = false;
+				}
+				ids.push($(this).val());
+				codes.push($(this).attr("code"));
+			}
+		});
+		if(!flag){
+			showTip("请选择未关闭的任务", 2000);
+			return
+		}
+		if(ids.length >0){
+			showConfirm("确定批量关闭?", function() {
+				$.post("/center/task/batchClose",{"ids":ids.join(","),"codes":codes.join(",")},function(r){
+					if(r == null){
+						showTip("批量关闭成功", 1000);
+					}else{
+						showTip(r+";关闭失败",30000);
+					}
+					$("#selrow").prop('checked',false);
+					$('#com-alert').on('hidden.bs.modal', function () {
+						ttabletask.ajax.reload();
+					})	
+				})
+			})
+		}else{
+			showTip("没有选择项", 1000);
+		}
+	}
+
+	function selectrow(me){
+		var sel=$(me);
+		var isSelected=sel.prop('checked');
+		if(isSelected){
+			$("#task td input[type=checkbox]").prop("checked",true);
+		}else{
+			$("#task td input[type=checkbox]").prop("checked",false);
+		}
+	}
+</script>
+</div>
+{{include "bottom.html"}}

+ 18 - 19
src/web/templates/taskedit.html

@@ -252,28 +252,28 @@
 			var cheRemark = mrecord[k]["s_check_checkRemark"];
 			var cheUser = mrecord[k]["s_check_checkUser"];
 			var cheTime = mrecord[k]["l_check_checkTime"];
-			if(typeof(mreRemark) == "undefined"){
-				mreRemark = "";
-			}
-			if(typeof(mreStartTime) == "undefined"){
-				mreStartTime = "";
-			}
-			if(typeof(mreEndTime) == "undefined"){
-				mreEndTime = "";
-			}
-			if(typeof(cheRemark) == "undefined"){
-				cheRemark = "";
-			}
-			if(typeof(cheUser) == "undefined"){
-				cheUser = "";
-			}
-			if(typeof(cheTime) == "undefined"){
-				cheTime = "";
-			}
 			formHtmlStyle(mreRemark,rateremark,mreStartTime,mreEndTime,cheRemark,cheUser,cheTime);
 		}
 	})
 	function formHtmlStyle(mreRemark,rateremark,mreStartTime,mreEndTime,cheRemark,cheUser,cheTime){
+		if(typeof(mreRemark) == "undefined"){
+			mreRemark = "";
+		}
+		if(typeof(mreStartTime) == "undefined"){
+			mreStartTime = "";
+		}
+		if(typeof(mreEndTime) == "undefined"){
+			mreEndTime = "";
+		}
+		if(typeof(cheRemark) == "undefined"){
+			cheRemark = "";
+		}
+		if(typeof(cheUser) == "undefined"){
+			cheUser = "";
+		}
+		if(typeof(cheTime) == "undefined"){
+			cheTime = "";
+		}
 		formHtml = '<form class="form-horizontal">'
 				+'<div class="box box-primary box-color">'
 					+'<div class="box-header">'
@@ -343,7 +343,6 @@
 		var urgencyChange = "no"
 		var $urgency = $("input:radio[name='urgency']:checked").val();
 		var $modify = $(".task-edit #modify").val();
-		console.log( $(".task-edit #descript").val())
 		var $descript = $(".task-edit #descript").val().trim();
 		var $complete = $(".task-edit #complete").val();
 		//判断最迟完成时间是否改变