浏览代码

用户任务分发

maxiaoshan 3 年之前
父节点
当前提交
dd0786ef66

+ 3 - 0
src/front/front.go

@@ -65,6 +65,9 @@ type Front struct {
 
 	userTaskSave xweb.Mapper `xweb:"/front/user/task/save"` //用户任务分发
 	userTaskList xweb.Mapper `xweb:"/front/user/task/list"` //用户任务列表
+
+	groupTaskList xweb.Mapper `xweb:"/front/group/task/list"` //用户组任务列表
+
 }
 
 func (f *Front) Index() {

+ 110 - 55
src/front/project.go

@@ -179,7 +179,7 @@ func (f *Front) ProjectClear() {
 	defer qu.Catch()
 	if f.Method() == "POST" {
 		projectid := f.GetString("s_projectid") //项目id
-		project, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, projectid, map[string]interface{}{"s_status": 1})
+		project, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, projectid, map[string]interface{}{"s_status": 1, "s_sourceinfo": 1})
 		if project != nil && len(*project) > 0 {
 			if status := qu.ObjToString((*project)["s_status"]); status == "未开始" {
 				//TODO:调用数据质量评估接口
@@ -192,28 +192,31 @@ func (f *Front) ProjectClear() {
 			f.ServeJson("查询项目信息失败")
 			return
 		}
-		sourceinfo := f.GetString("s_sourceinfo")                                                                           //数据源表
-		noTagAllDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": false})                         //达标数据总量
-		noTagGiveDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": false, "b_isgivegroup": true}) //达标数据已分发量
-		noTagNoGiveDataNum := noTagAllDataNum - noTagGiveDataNum                                                            //达标待分发量
-		tagAllDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": true})                            //未达标数据总量
-		tagGiveDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": true, "b_isgivegroup": true})    //未达标数据已分发量
-		tagNoGiveDataNum := tagAllDataNum - tagGiveDataNum                                                                  //未达标待分发量
-		allGiveDataNum := noTagGiveDataNum + tagGiveDataNum                                                                 //总分发量
-		allNoGiveDataNum := noTagNoGiveDataNum + tagNoGiveDataNum                                                           //总待分发量
+
+		sourceinfo := qu.ObjToString((*project)["s_sourceinfo"])                                                       //数据源表
+		noTagAllDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": false})                    //达标数据总量
+		noTagGiveDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": false, "b_isgive": true}) //达标数据已分发量
+		noTagNoGiveDataNum := noTagAllDataNum - noTagGiveDataNum                                                       //达标待分发量
+		tagAllDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": true})                       //未达标数据总量
+		tagGiveDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": true, "b_isgive": true})    //未达标数据已分发量
+		tagNoGiveDataNum := tagAllDataNum - tagGiveDataNum                                                             //未达标待分发量
+		allGiveDataNum := noTagGiveDataNum + tagGiveDataNum                                                            //总分发量
+		allNoGiveDataNum := noTagNoGiveDataNum + tagNoGiveDataNum                                                      //总待分发量
 		allDataNum := allGiveDataNum + allNoGiveDataNum
 
-		f.ServeJson(map[string]interface{}{"allDataNum": allDataNum})
-		//f.T["allDataNum"] = allDataNum
-		//f.T["allGiveDataNum"] = allGiveDataNum
-		//f.T["allNoGiveDataNum"] = allNoGiveDataNum
-		//f.T["noTagAllDataNum"] = noTagAllDataNum
-		//f.T["noTagGiveDataNum"] = noTagGiveDataNum
-		//f.T["noTagNoGiveDataNum"] = noTagNoGiveDataNum
-		//f.T["tagAllDataNum"] = tagAllDataNum
-		//f.T["tagGiveDataNum"] = tagGiveDataNum
-		//f.T["tagNoGiveDataNum"] = tagNoGiveDataNum
-		//f.T["s_projectid"] = projectid
+		data := make(map[string]interface{})
+		data["allDataNum"] = allDataNum
+		data["allGiveDataNum"] = allGiveDataNum
+		data["allNoGiveDataNum"] = allNoGiveDataNum
+		data["noTagAllDataNum"] = noTagAllDataNum
+		data["noTagGiveDataNum"] = noTagGiveDataNum
+		data["noTagNoGiveDataNum"] = noTagNoGiveDataNum
+		data["tagAllDataNum"] = tagAllDataNum
+		data["tagGiveDataNum"] = tagGiveDataNum
+		data["tagNoGiveDataNum"] = tagNoGiveDataNum
+		data["s_projectid"] = projectid
+		qu.Debug(data)
+		f.ServeJson(data)
 	} else {
 		pid := f.GetString("pid")
 		f.T["s_projectid"] = pid
@@ -225,40 +228,74 @@ func (f *Front) ProjectClear() {
 // ProjectTaskList 用户组任务分发列表
 func (f *Front) ProjectTaskList() {
 	defer qu.Catch()
-	projectid := f.GetString("s_projectid") //项目id
-	status := f.GetString("s_status")       //任务状态
-	searchStr := f.GetString("search[value]")
-	search := strings.TrimSpace(searchStr)
-	start, _ := f.GetInteger("start")
-	limit, _ := f.GetInteger("length")
-	draw, _ := f.GetInteger("draw")
-	query := map[string]interface{}{ //查找用户组任务
-		"s_projectid": projectid,
-		"s_stype":     "group",
-	}
-	if status != "-1" {
-		query["s_status"] = status
-	}
-	if search != "" {
-		query["$or"] = []interface{}{
-			map[string]interface{}{"s_groupname": map[string]interface{}{"$regex": search}},
-		}
-	}
-	list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, nil, nil, false, start, limit)
-	count := util.Mgo.Count(util.TASKCOLLNAME, query)
-	for _, l := range *list {
-		if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
-			groupId := qu.ObjToString(l["s_groupid"])
-			giveNum := qu.IntAll(l["i_givenum"])
-			sourceinfo := qu.ObjToString(l["s_sourceinfo"])
-			tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_groupid": groupId, "b_istag": true})
-			progress := fmt.Sprint(math.Ceil(float64(tagNum)/float64(giveNum))) + "%"
-			l["s_progress"] = progress
-			//同步数据库
-			util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}})
-		}
-	}
-	f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
+	projectid := f.GetString("pid") //项目id
+	if f.Method() == "POST" {
+		status := f.GetString("s_status") //任务状态
+		searchStr := f.GetString("search[value]")
+		search := strings.TrimSpace(searchStr)
+		start, _ := f.GetInteger("start")
+		limit, _ := f.GetInteger("length")
+		draw, _ := f.GetInteger("draw")
+		query := map[string]interface{}{ //查找用户组任务
+			"s_projectid": projectid,
+			"s_stype":     "group",
+		}
+		if status != "-1" {
+			query["s_status"] = status
+		}
+		if search != "" {
+			query["$or"] = []interface{}{
+				map[string]interface{}{"s_groupname": map[string]interface{}{"$regex": search}},
+			}
+		}
+		list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, nil, nil, false, start, limit)
+		count := util.Mgo.Count(util.TASKCOLLNAME, query)
+		for _, l := range *list {
+			if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
+				groupId := qu.ObjToString(l["s_groupid"])
+				giveNum := qu.IntAll(l["i_givenum"])
+				sourceinfo := qu.ObjToString(l["s_sourceinfo"])
+				tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_groupid": groupId, "b_istag": true})
+				progress := fmt.Sprint(math.Ceil(float64(tagNum)/float64(giveNum))) + "%"
+				l["s_progress"] = progress
+				//同步数据库
+				util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}})
+			}
+		}
+		f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
+	} else {
+		project, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, projectid, map[string]interface{}{"s_status": 1, "s_sourceinfo": 1})
+		if project != nil && len(*project) > 0 {
+			if status := qu.ObjToString((*project)["s_status"]); status == "未开始" {
+				//TODO:调用数据质量评估接口
+				//点击清洗更新项目状态为进行中
+				b := util.Mgo.UpdateById(util.PROJECTCOLLNAME, projectid, map[string]interface{}{"$set": map[string]interface{}{"s_status": "进行中", "i_starttime": time.Now().Unix()}})
+				qu.Debug("Update Porject:"+projectid+"	Status Success:", b)
+			}
+		}
+		sourceinfo := qu.ObjToString((*project)["s_sourceinfo"])                                                       //数据源表
+		noTagAllDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": false})                    //达标数据总量
+		noTagGiveDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": false, "b_isgive": true}) //达标数据已分发量
+		noTagNoGiveDataNum := noTagAllDataNum - noTagGiveDataNum                                                       //达标待分发量
+		tagAllDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": true})                       //未达标数据总量
+		tagGiveDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": true, "b_isgive": true})    //未达标数据已分发量
+		tagNoGiveDataNum := tagAllDataNum - tagGiveDataNum                                                             //未达标待分发量
+		allGiveDataNum := noTagGiveDataNum + tagGiveDataNum                                                            //总分发量
+		allNoGiveDataNum := noTagNoGiveDataNum + tagNoGiveDataNum                                                      //总待分发量
+		allDataNum := allGiveDataNum + allNoGiveDataNum
+		f.T["s_projectid"] = projectid
+		f.T["allDataNum"] = allDataNum
+		f.T["noTagAllDataNum"] = noTagAllDataNum
+		f.T["noTagGiveDataNum"] = noTagGiveDataNum
+		f.T["noTagNoGiveDataNum"] = noTagNoGiveDataNum
+		f.T["tagAllDataNum"] = tagAllDataNum
+		f.T["tagGiveDataNum"] = tagGiveDataNum
+		f.T["tagNoGiveDataNum"] = tagNoGiveDataNum
+		f.T["allGiveDataNum"] = allGiveDataNum
+		f.T["allNoGiveDataNum"] = allNoGiveDataNum
+		_ = f.Render("project/project_clear.html", &f.T)
+	}
+
 }
 
 // ProjectTaskSave 用户组任务分发
@@ -999,3 +1036,21 @@ func UpdateMarkColl(bidData, markData, tagInfoMap, baseInfoMap *map[string]inter
 		(*baseInfoMap)["i_ckdata"] = 1
 	}
 }
+
+func (f *Front) UserTaskList() {
+	qu.Catch()
+	if f.Method() == "POST" {
+
+	} else {
+		_ = f.Render("project/task_user_list.html")
+	}
+}
+
+func (f *Front) GroupTaskList() {
+	qu.Catch()
+	if f.Method() == "POST" {
+
+	} else {
+		_ = f.Render("project/task_group_list.html")
+	}
+}

+ 19 - 6
src/web/templates/project/project_clear.html

@@ -10,7 +10,7 @@
         </h1>
         <ol class="breadcrumb">
             <li><a href="/front/project"><i class="fa fa-dashboard"></i> 项目列表</a></li>
-            <li><a href="/front/project/clear?pid={{.T.s_projectid}}"><i class="fa fa-dashboard"></i> 项目清洗</a></li>
+            <li><a href="#"><i class="fa fa-dashboard"></i> 项目清洗</a></li>
         </ol>
     </section>
     <!-- Main content -->
@@ -26,13 +26,13 @@
                                 </h3>
                                 <div class="form-group" style="margin-left: 15px">
                                     <span class="form-inline panel-body">分发总量/数据总量(条):
-                                        <input type="text" class="form-control" readonly value="1000/5000">
+                                        <input type="text" class="form-control" readonly value="{{.T.allNoGiveDataNum}}/{{.T.allGiveDataNum}}">
                                     </span>
                                 </div>
                                 <div class="form-group" style="margin-left: 10px">
                                     <div class="col-xs-6" style="width: auto">
                                         <label class="form-inline">数据总量:
-                                        <input type="text" class="form-control" style="width: 80px" readonly value="0"></label>
+                                        <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.allGiveDataNum}}"></label>
                                         <label class="form-inline" style="margin-left: 20px">已分发:
                                         <input type="text" class="form-control" style="width: 80px" readonly value="0"></label>
                                         <label class="form-inline" style="margin-left: 20px">待分发:
@@ -154,9 +154,9 @@
                                             <input type="number" class="form-control"></label>
                                     </div>
                                     <div class="form-group" style="margin-left: 10px;">
-                                        <select class="selectpicker used" id="group-select"></select>
+                                        <select class="selectpicker" id="group-select"></select>
                                         <label class="control-label form-inline" style="margin-left: 20px">数据量(条):
-                                            <input type="number" class="form-control"></label>
+                                            <input type="number" class="form-control by-use"></label>
                                     </div>
                                 </div>
                             </div>
@@ -236,6 +236,7 @@
 <script>
     menuActive("project");
 
+    let projectid = {{ .T.s_projectid }}
     let groupList = []
 
     $(function () {
@@ -291,6 +292,14 @@
             ]
         });
 
+        $.ajax({
+            url: "/front/project/clear/",
+            type: "POST",
+            data: {"s_projectid": projectid},
+            success: function (r) {
+                console.log(r)
+            }
+        })
         $.ajax({
             url: "/front/group/list",
             type: "POST",
@@ -369,11 +378,15 @@
     }
 
     function saveTask() {
-
         $('#TaskDiv select').each(function () {
             let ms = $(this).find("option:checked").val()
             console.log(ms)
         })
+
+        $('#TaskDiv input').each(function () {
+            let ms = $(this).val()
+            console.log(ms)
+        })
     }
 
 </script>

+ 245 - 0
src/web/templates/project/task_group_list.html

@@ -0,0 +1,245 @@
+{{include "com/inc.html"}}
+<!-- Main Header -->
+{{include "com/header.html"}}
+<!-- Left side column. 权限菜单 -->
+{{include "com/menu.html"}}
+<div class="content-wrapper">
+    <section class="content-header">
+        <h1>
+            <small></small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="#"><i class="fa fa-dashboard"></i> 任务列表</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <hr>
+                        <div class="form-horizontal">
+                            <div class="box-body margin">
+                                <table id="dataTable" class="table table-bordered table-hover">
+                                    <thead>
+                                    <tr>
+                                        <th></th>
+                                        <th>用户账号</th>
+                                        <th>项目名称</th>
+                                        <th>数据量</th>
+                                        <th>任务状态</th>
+                                        <th>完成进度</th>
+                                        <th>开始时间</th>
+                                        <th>完成时间</th>
+                                        <th>操作</th>
+                                    </tr>
+                                    </thead>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+{{include "com/footer.html"}}
+<script>
+    menuActive("group/task/list");
+
+    $(function () {
+        ttable = $('#dataTable').dataTable({
+            "paging": true,
+            "lengthChange": false,
+            "searching": true,
+            "ordering": false,
+            "info": true,
+            "autoWidth": false,
+            "serverSide": true,
+            "ajax": {
+                "url": "/front/group/task/list",
+                "type": "post",
+                "data": {"status": "-1"}
+            },
+            "language": {
+                "url": "/dist/js/dataTables.chinese.lang"
+            },
+            "fnDrawCallback": function () {
+                $("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;
+                    }
+                    ttable.page(redirectpage).draw(false);
+                });
+                this.api().column(0).nodes().each(function (cell, i) {
+                    cell.innerHTML = i + 1;
+                });
+            },
+            "columns": [
+                {"data": "", width: "1%"},
+                {"data": "s_personname", width: "5%"},
+                {"data": "s_projectname", width: "4%"},
+                {"data": "i_givenum", width: "4%"},
+                {"data": "", width: "4%"},
+                {"data": "", width: "4%"},
+                {"data": "", width: "4%"},
+                {"data": "", width: "4%"},
+                {
+                    "data": "_id", width: "11%", render: function (val, a, row, pos) {
+                        tmp = '<div>' +
+                            '<a class="btn btn-sm btn-primary" onclick="editPro(\'' + pos.row + '\')">收回</a>&nbsp;&nbsp;' +
+                            '<a class="btn btn-sm btn-warning" href="/front/project/clear?pid=' + val + '">质检</a>&nbsp;&nbsp;' +
+                            '<a class="btn btn-sm btn-info" onclick="del(\'' + val + '\')">关闭</a>&nbsp;&nbsp;' +
+                            '</div>';
+                        return tmp
+                    }
+                }
+            ]
+        });
+
+        $('input[type=radio][name=stype]').change(function () {
+            if (this.value === 'coll') {
+                stype = "coll"
+                $("#import-coll").attr("style", "display:block;")
+                $("#import-excel").attr("style", "display:none;")
+            } else if (this.value === 'excel') {
+                stype = "excel"
+                $("#import-coll").attr("style", "display:none;")
+                $("#import-excel").attr("style", "display:block;")
+            }
+        });
+    });
+
+
+    function del(id) {
+        showConfirm("确定删除该用户组?", function () {
+            $.ajax({
+                url: "",
+                type: 'POST',
+                data: {"id": id},
+                success: function (r) {
+                    if (r.rep) {
+                        ttable.ajax.reload();
+                    } else {
+                        showTip("状态修改失败");
+                    }
+                }
+            })
+        })
+    }
+
+    function createPro() {
+       $("#modal-create-project").modal('show')
+    }
+
+    function cancelModel() {
+        document.getElementById("model-form-project").reset();
+        $("#modal-create-project").modal('hide')
+        $("#modal-edit-project").modal('hide')
+    }
+
+    function importData() {
+        if (stype === "coll") {
+            projectmap["s_name"] = $('#project-name').val()
+            projectmap["s_sourceinfo"] = $('#coll-save-name').val()
+            projectmap["s_type"] = stype
+            projectmap["s_historyid"] = $('#data-id').val()
+            $.ajax({
+                url: "/front/project/save",
+                type: 'POST',
+                data: projectmap,
+                success: function (r) {
+                    if (r.success) {
+
+                        $("#modal-create-project").modal('hide')
+                        ttable.api().ajax.reload();
+                    } else {
+
+                    }
+                }
+            })
+        } else if (stype === "excel") {
+            let formData = new FormData();
+            formData.append("s_name", $('#project-name').val())
+            formData.append("s_sourceinfo", $('#coll-save-name').val())
+            formData.append("s_historyid", $('#data-id').val())
+            formData.append("s_entname", $('#company-name').val())
+            formData.append("s_departname", $('#dpart-name').val())
+            formData.append("s_rulename", $('#rule-name').val())
+            formData.append("s_type", stype)
+            let file = $('#uploadfile')[0].files[0]
+            if (file) {
+                formData.append("xlsx", file)
+                $.ajax({
+                    url: "/front/project/save",
+                    type: 'POST',
+                    data: formData,
+                    cache: false,
+                    processData: false,
+                    contentType: false,
+                    success: function (r) {
+                        if (r.rep) {
+                            $("#modal-create-project").modal('hide')
+                            ttable.api().ajax.reload();
+                        } else {
+                            showTip("状态修改失败");
+                        }
+                    }
+                })
+            } else {
+                showTip("请选择上传文件");
+            }
+        }
+    }
+
+    function editPro(index) {
+        projectmap = ttable.fnGetData()[index]
+        console.log(projectmap)
+        $('#modal-edit-project').modal('show')
+        $('#company-edit-name').val(projectmap["s_entname"])
+        $('#rule-edit-name').val(projectmap["s_rulename"])
+        $('#dpart-edit-name').val(projectmap["s_departname"])
+    }
+
+    function saveData() {
+        stype = "edit"
+        let tmp = projectmap
+        tmp["s_entname"] = $('#company-edit-name').val()
+        tmp["s_rulename"] = $('#rule-edit-name').val()
+        tmp["s_departname"] = $('#dpart-edit-name').val()
+
+        let fieldArr = $('#markFieldSelect').val();
+        let m = {}
+        if (fieldArr.length > 0) {
+            for (const i in fields) {
+                if (fieldArr.indexOf(fields[i]["s_code"]) > -1) {
+                    m[fields[i]["s_code"]] = fields[i]["s_name"]
+                }
+            }
+        }
+        tmp["v_field"] = m
+        if (tmp !== projectmap) {
+            $.ajax({
+                url: "/front/project/save",
+                type: 'POST',
+                data: projectmap,
+                success: function (r) {
+                    if (r.rep) {
+                        ttable.api().ajax.reload();
+                    } else {
+                        showTip("保存失败");
+                    }
+                }
+            })
+        } else {
+            showTip("未做修改");
+        }
+    }
+
+</script>

+ 464 - 0
src/web/templates/project/task_list.html

@@ -0,0 +1,464 @@
+{{include "com/inc.html"}}
+<!-- Main Header -->
+{{include "com/header.html"}}
+<!-- Left side column. 权限菜单 -->
+{{include "com/menu.html"}}
+<div class="content-wrapper">
+    <section class="content-header">
+        <h1>
+            <small></small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="#"><i class="fa fa-dashboard"></i> 任务列表</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+
+                        <div class="form-horizontal">
+                            <div class="box-body margin">
+                                <h3><i class="glyphicon glyphicon-exclamation-sign" style="margin-right: 6px"></i>数据情况
+                                </h3>
+                                <div class="form-group" style="margin-left: 15px">
+                                    <span class="form-inline panel-body">分发总量/数据总量(条):
+                                        <input type="text" class="form-control" readonly value="{{.T.allNoGiveDataNum}}/{{.T.allGiveDataNum}}">
+                                    </span>
+                                </div>
+                                <div class="form-group" style="margin-left: 10px">
+                                    <div class="col-xs-6" style="width: auto">
+                                        <label class="form-inline">数据总量:
+                                            <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.allGiveDataNum}}"></label>
+                                        <label class="form-inline" style="margin-left: 20px">已分发:
+                                            <input type="text" class="form-control" style="width: 80px" readonly value="0"></label>
+                                        <label class="form-inline" style="margin-left: 20px">待分发:
+                                            <input type="text" class="form-control" style="width: 80px" readonly value="0"></label>
+                                        <label class="form-inline" style="margin-left: 20px">已标注:
+                                            <input type="text" class="form-control" style="width: 80px" readonly value="0"></label>
+                                    </div>
+                                    <div class="col-xs-6 form-group">
+                                        <label class="form-inline">操作:
+                                            <input type="button" class="btn btn-info" onclick="dispatchTak('0')" value="分发">
+                                            <input type="button" class="btn btn-primary" value="质检">
+                                            <input type="button" class="btn btn-success" value="质检结果">
+                                        </label>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <hr>
+                        <div class="form-horizontal">
+                            <div class="box-body margin">
+                                <h3><i class="glyphicon glyphicon-tasks" style="margin-right: 6px"></i>数据清洗任务列表
+                                </h3>
+
+                                <table id="dataTable" class="table table-bordered table-hover">
+                                    <thead>
+                                    <tr>
+                                        <th></th>
+                                        <th>用户账号</th>
+                                        <th>项目名称</th>
+                                        <th>数据量</th>
+                                        <th>任务状态</th>
+                                        <th>完成进度</th>
+                                        <th>开始时间</th>
+                                        <th>完成时间</th>
+                                        <th>操作</th>
+                                    </tr>
+                                    </thead>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+
+<div class="modal fade" id="modal-create-project" tabindex="-1" role="dialog" aria-hidden="true">
+    <div class="modal-dialog" style="width: 30%">
+        <div class="modal-content">
+            <div class="modal-header">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+                    <div class="edit-info">
+                        <span class="glyphicon glyphicon-alert" aria-hidden="true"></span>
+                        <span class="h4">新建项目</span>
+                    </div>
+                    <div class="edit-form">
+                        <hr>
+                        <div class="form-group">
+                            <label class="radio-inline">
+                                <input type="radio" name="stype" value="coll" checked>数据库导入
+                            </label>
+                            <label class="radio-inline">
+                                <input type="radio" name="stype" value="excel">Excel表导入
+                            </label>
+                        </div>
+                        <form id="model-form-project" class="form-horizontal" enctype="multipart/form-data">
+                            <div class="box-body">
+                                <div class="form-group margin-bottom">
+                                    <label class="col-sm-3 control-label"><span style="color:red;">* </span>项目名称</label>
+                                    <div class="col-sm-5">
+                                        <input type="text" class="form-control" id="project-name" placeholder="项目名称">
+                                    </div>
+                                </div>
+                                <div id="import-coll">
+                                    <h5><i class="glyphicon glyphicon-bookmark"
+                                           style="color: #00c4ff;margin-right: 6px"></i>数据来源</h5>
+                                    <div class="form-group">
+                                        <label class="col-sm-3 control-label"><span
+                                                style="color:red;">* </span>数据库名</label>
+                                        <div class="col-sm-5">
+                                            <input type="text" class="form-control" id="db-name" value="jyqyfw"
+                                                   readonly>
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-3 control-label"><span
+                                                style="color:red;">* </span>数据表名</label>
+                                        <div class="col-sm-5">
+                                            <input type="text" class="form-control" id="coll-name"
+                                                   value="usermail_history" readonly>
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-3 control-label"><span
+                                                style="color:red;">* </span>数据导出ID</label>
+                                        <div class="col-sm-6">
+                                            <input type="text" class="form-control" id="data-id" placeholder="数据导出ID">
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div id="import-excel" style="display: none">
+                                    <h5><i class="glyphicon glyphicon-bookmark"
+                                           style="color: #00c4ff;margin-right: 6px"></i>数据信息</h5>
+                                    <div class="form-group">
+                                        <label class="col-sm-3 control-label"><span
+                                                style="color:red;">* </span>公司名称</label>
+                                        <div class="col-sm-6">
+                                            <input type="text" class="form-control" id="company-name"
+                                                   placeholder="公司名称">
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-3 control-label">部门名称</label>
+                                        <div class="col-sm-6">
+                                            <input type="text" class="form-control" id="dpart-name" placeholder="部门名称">
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-3 control-label">规则名称</label>
+                                        <div class="col-sm-6">
+                                            <input type="text" class="form-control" id="rule-name" placeholder="规则名称">
+                                        </div>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="col-sm-3 control-label">选择文件</label>
+                                        <div class="col-sm-6">
+                                            <input type="file" name="file" id="uploadfile">
+                                        </div>
+                                    </div>
+                                </div>
+                                <h5><i class="glyphicon glyphicon-bookmark"
+                                       style="color: #00c4ff;margin-right: 6px"></i>数据存储</h5>
+                                <div class="form-group">
+                                    <label class="col-sm-3 control-label"><span style="color:red;">* </span>数据库名</label>
+                                    <div class="col-sm-6">
+                                        <input type="text" class="form-control" value="jyqykhfw" readonly>
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label class="col-sm-3 control-label"><span style="color:red;">* </span>数据表名</label>
+                                    <div class="col-sm-6">
+                                        <input type="text" class="form-control" id="coll-save-name" placeholder="数据表名">
+                                    </div>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <input type="button" onclick="importData()" class="btn btn-primary" value="导入">
+                <input type="button" onclick="cancelModel()" class="btn btn-default" value="取消">
+            </div>
+        </div>
+    </div><!-- /.modal -->
+</div>
+
+
+<div class="modal fade" id="modal-edit-project" tabindex="-1" role="dialog" aria-hidden="true">
+    <div class="modal-dialog" style="width: 30%">
+        <div class="modal-content">
+            <div class="modal-header">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+                    <div class="edit-info">
+                        <span class="glyphicon glyphicon-alert" aria-hidden="true"></span>
+                        <span class="h4">编辑项目</span>
+                    </div>
+                    <div class="edit-form">
+                        <hr>
+                        <form class="form-horizontal" enctype="multipart/form-data">
+                            <div class="box-body">
+                                <div class="form-group">
+                                    <label class="col-sm-3 control-label">公司名称</label>
+                                    <div class="col-sm-5">
+                                        <input type="text" class="form-control" id="company-edit-name" readonly>
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label class="col-sm-3 control-label">部门名称</label>
+                                    <div class="col-sm-5">
+                                        <input type="text" class="form-control" id="dpart-edit-name">
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label class="col-sm-3 control-label">规则名称</label>
+                                    <div class="col-sm-5">
+                                        <input type="text" class="form-control" id="rule-edit-name">
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label class="col-sm-3 control-label">售后人员</label>
+                                    <div class="col-sm-6">
+                                        <input type="text" class="form-control" id="edit-person">
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label class="col-sm-3 control-label">选择标注字段</label>
+                                    <div class="col-sm-6">
+                                        <select class="form-control selectpicker" multiple
+                                                id="markFieldSelect"></select>
+                                    </div>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <input type="button" onclick="saveData()" class="btn btn-primary saveBtn" value="保存">
+                <input type="button" onclick="cancelModel()" class="btn btn-default" value="取消">
+            </div>
+        </div>
+    </div><!-- /.modal -->
+</div>
+
+
+{{include "com/footer.html"}}
+<script>
+    menuActive("task/list");
+
+    let stype = "coll";
+    let fields = {{ .T.fields }}
+
+    $(function () {
+        ttable = $('#dataTable').dataTable({
+            "paging": true,
+            "lengthChange": false,
+            "searching": true,
+            "ordering": false,
+            "info": true,
+            "autoWidth": false,
+            "serverSide": true,
+            "ajax": {
+                "url": "",
+                "type": "post",
+                "data": {"status": "-1"}
+            },
+            "language": {
+                "url": "/dist/js/dataTables.chinese.lang"
+            },
+            "fnDrawCallback": function () {
+                $("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;
+                    }
+                    ttable.page(redirectpage).draw(false);
+                });
+                this.api().column(0).nodes().each(function (cell, i) {
+                    cell.innerHTML = i + 1;
+                });
+            },
+            "columns": [
+                {"data": "", width: "1%"},
+                {"data": "s_personname", width: "5%"},
+                {"data": "s_projectname", width: "4%"},
+                {"data": "i_givenum", width: "4%"},
+                {"data": "", width: "4%"},
+                {"data": "", width: "4%"},
+                {"data": "", width: "4%"},
+                {"data": "", width: "4%"},
+                {
+                    "data": "_id", width: "11%", render: function (val, a, row, pos) {
+                        tmp = '<div>' +
+                            '<a class="btn btn-sm btn-primary" onclick="editPro(\'' + pos.row + '\')">收回</a>&nbsp;&nbsp;' +
+                            '<a class="btn btn-sm btn-warning" href="/front/project/clear?pid=' + val + '">质检</a>&nbsp;&nbsp;' +
+                            '<a class="btn btn-sm btn-info" onclick="del(\'' + val + '\')">关闭</a>&nbsp;&nbsp;' +
+                            '</div>';
+                        return tmp
+                    }
+                }
+            ]
+        });
+
+        $('input[type=radio][name=stype]').change(function () {
+            if (this.value === 'coll') {
+                stype = "coll"
+                $("#import-coll").attr("style", "display:block;")
+                $("#import-excel").attr("style", "display:none;")
+            } else if (this.value === 'excel') {
+                stype = "excel"
+                $("#import-coll").attr("style", "display:none;")
+                $("#import-excel").attr("style", "display:block;")
+            }
+        });
+
+        for (var i in fields) {
+            var opt = document.createElement('option');
+            opt.innerText = fields[i]["s_name"];
+            opt.value = fields[i]["s_code"];
+            $('#markFieldSelect')[0].appendChild(opt)
+        }
+        $("#markFieldSelect").selectpicker("refresh");
+    });
+
+
+    function del(id) {
+        showConfirm("确定删除该用户组?", function () {
+            $.ajax({
+                url: "",
+                type: 'POST',
+                data: {"id": id},
+                success: function (r) {
+                    if (r.rep) {
+                        ttable.ajax.reload();
+                    } else {
+                        showTip("状态修改失败");
+                    }
+                }
+            })
+        })
+    }
+
+    function createPro() {
+       $("#modal-create-project").modal('show')
+    }
+
+    function cancelModel() {
+        document.getElementById("model-form-project").reset();
+        $("#modal-create-project").modal('hide')
+        $("#modal-edit-project").modal('hide')
+    }
+
+    function importData() {
+        if (stype === "coll") {
+            projectmap["s_name"] = $('#project-name').val()
+            projectmap["s_sourceinfo"] = $('#coll-save-name').val()
+            projectmap["s_type"] = stype
+            projectmap["s_historyid"] = $('#data-id').val()
+            $.ajax({
+                url: "/front/project/save",
+                type: 'POST',
+                data: projectmap,
+                success: function (r) {
+                    if (r.success) {
+
+                        $("#modal-create-project").modal('hide')
+                        ttable.api().ajax.reload();
+                    } else {
+
+                    }
+                }
+            })
+        } else if (stype === "excel") {
+            let formData = new FormData();
+            formData.append("s_name", $('#project-name').val())
+            formData.append("s_sourceinfo", $('#coll-save-name').val())
+            formData.append("s_historyid", $('#data-id').val())
+            formData.append("s_entname", $('#company-name').val())
+            formData.append("s_departname", $('#dpart-name').val())
+            formData.append("s_rulename", $('#rule-name').val())
+            formData.append("s_type", stype)
+            let file = $('#uploadfile')[0].files[0]
+            if (file) {
+                formData.append("xlsx", file)
+                $.ajax({
+                    url: "/front/project/save",
+                    type: 'POST',
+                    data: formData,
+                    cache: false,
+                    processData: false,
+                    contentType: false,
+                    success: function (r) {
+                        if (r.rep) {
+                            $("#modal-create-project").modal('hide')
+                            ttable.api().ajax.reload();
+                        } else {
+                            showTip("状态修改失败");
+                        }
+                    }
+                })
+            } else {
+                showTip("请选择上传文件");
+            }
+        }
+    }
+
+    function editPro(index) {
+        projectmap = ttable.fnGetData()[index]
+        console.log(projectmap)
+        $('#modal-edit-project').modal('show')
+        $('#company-edit-name').val(projectmap["s_entname"])
+        $('#rule-edit-name').val(projectmap["s_rulename"])
+        $('#dpart-edit-name').val(projectmap["s_departname"])
+    }
+
+    function saveData() {
+        stype = "edit"
+        let tmp = projectmap
+        tmp["s_entname"] = $('#company-edit-name').val()
+        tmp["s_rulename"] = $('#rule-edit-name').val()
+        tmp["s_departname"] = $('#dpart-edit-name').val()
+
+        let fieldArr = $('#markFieldSelect').val();
+        let m = {}
+        if (fieldArr.length > 0) {
+            for (const i in fields) {
+                if (fieldArr.indexOf(fields[i]["s_code"]) > -1) {
+                    m[fields[i]["s_code"]] = fields[i]["s_name"]
+                }
+            }
+        }
+        tmp["v_field"] = m
+        if (tmp !== projectmap) {
+            $.ajax({
+                url: "/front/project/save",
+                type: 'POST',
+                data: projectmap,
+                success: function (r) {
+                    if (r.rep) {
+                        ttable.api().ajax.reload();
+                    } else {
+                        showTip("保存失败");
+                    }
+                }
+            })
+        } else {
+            showTip("未做修改");
+        }
+    }
+
+</script>

+ 191 - 0
src/web/templates/project/task_user_list.html

@@ -0,0 +1,191 @@
+{{include "com/inc.html"}}
+<!-- Main Header -->
+{{include "com/header.html"}}
+<!-- Left side column. 权限菜单 -->
+{{include "com/menu.html"}}
+<div class="content-wrapper">
+    <section class="content-header">
+        <h1>
+            <small></small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="#"><i class="fa fa-dashboard"></i> 任务列表</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <hr>
+                        <div class="form-horizontal">
+                            <div class="box-body margin">
+                                <table id="dataTable" class="table table-bordered table-hover">
+                                    <thead>
+                                    <tr>
+                                        <th></th>
+                                        <th>用户账号</th>
+                                        <th>项目名称</th>
+                                        <th>数据量</th>
+                                        <th>任务状态</th>
+                                        <th>完成进度</th>
+                                        <th>开始时间</th>
+                                        <th>完成时间</th>
+                                        <th>操作</th>
+                                    </tr>
+                                    </thead>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+{{include "com/footer.html"}}
+<script>
+    menuActive("user/task/list");
+
+    $(function () {
+        ttable = $('#dataTable').dataTable({
+            "paging": true,
+            "lengthChange": false,
+            "searching": true,
+            "ordering": false,
+            "info": true,
+            "autoWidth": false,
+            "serverSide": true,
+            "ajax": {
+                "url": "/front/user/task/list",
+                "type": "post",
+                "data": {"status": "-1"}
+            },
+            "language": {
+                "url": "/dist/js/dataTables.chinese.lang"
+            },
+            "fnDrawCallback": function () {
+                $("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;
+                    }
+                    ttable.page(redirectpage).draw(false);
+                });
+                this.api().column(0).nodes().each(function (cell, i) {
+                    cell.innerHTML = i + 1;
+                });
+            },
+            "columns": [
+                {"data": "", width: "1%"},
+                {"data": "s_personname", width: "5%"},
+                {"data": "s_projectname", width: "4%"},
+                {"data": "i_givenum", width: "4%"},
+                {"data": "", width: "4%"},
+                {"data": "", width: "4%"},
+                {"data": "", width: "4%"},
+                {"data": "", width: "4%"},
+                {
+                    "data": "_id", width: "11%", render: function (val, a, row, pos) {
+                        tmp = '<div>' +
+                            '<a class="btn btn-sm btn-primary" onclick="editPro(\'' + pos.row + '\')">收回</a>&nbsp;&nbsp;' +
+                            '<a class="btn btn-sm btn-warning" href="/front/project/clear?pid=' + val + '">质检</a>&nbsp;&nbsp;' +
+                            '<a class="btn btn-sm btn-info" onclick="del(\'' + val + '\')">关闭</a>&nbsp;&nbsp;' +
+                            '</div>';
+                        return tmp
+                    }
+                }
+            ]
+        });
+
+        $('input[type=radio][name=stype]').change(function () {
+            if (this.value === 'coll') {
+                stype = "coll"
+                $("#import-coll").attr("style", "display:block;")
+                $("#import-excel").attr("style", "display:none;")
+            } else if (this.value === 'excel') {
+                stype = "excel"
+                $("#import-coll").attr("style", "display:none;")
+                $("#import-excel").attr("style", "display:block;")
+            }
+        });
+    });
+
+
+    function del(id) {
+        showConfirm("确定删除该用户组?", function () {
+            $.ajax({
+                url: "",
+                type: 'POST',
+                data: {"id": id},
+                success: function (r) {
+                    if (r.rep) {
+                        ttable.ajax.reload();
+                    } else {
+                        showTip("状态修改失败");
+                    }
+                }
+            })
+        })
+    }
+
+    function createPro() {
+       $("#modal-create-project").modal('show')
+    }
+
+    function cancelModel() {
+        document.getElementById("model-form-project").reset();
+        $("#modal-create-project").modal('hide')
+        $("#modal-edit-project").modal('hide')
+    }
+
+    function editPro(index) {
+        projectmap = ttable.fnGetData()[index]
+        console.log(projectmap)
+        $('#modal-edit-project').modal('show')
+        $('#company-edit-name').val(projectmap["s_entname"])
+        $('#rule-edit-name').val(projectmap["s_rulename"])
+        $('#dpart-edit-name').val(projectmap["s_departname"])
+    }
+
+    function saveData() {
+        stype = "edit"
+        let tmp = projectmap
+        tmp["s_entname"] = $('#company-edit-name').val()
+        tmp["s_rulename"] = $('#rule-edit-name').val()
+        tmp["s_departname"] = $('#dpart-edit-name').val()
+
+        let fieldArr = $('#markFieldSelect').val();
+        let m = {}
+        if (fieldArr.length > 0) {
+            for (const i in fields) {
+                if (fieldArr.indexOf(fields[i]["s_code"]) > -1) {
+                    m[fields[i]["s_code"]] = fields[i]["s_name"]
+                }
+            }
+        }
+        tmp["v_field"] = m
+        if (tmp !== projectmap) {
+            $.ajax({
+                url: "/front/project/save",
+                type: 'POST',
+                data: projectmap,
+                success: function (r) {
+                    if (r.rep) {
+                        ttable.api().ajax.reload();
+                    } else {
+                        showTip("保存失败");
+                    }
+                }
+            })
+        } else {
+            showTip("未做修改");
+        }
+    }
+
+</script>