project_clear.html 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. {{include "com/inc.html"}}
  2. <!-- Main Header -->
  3. {{include "com/header.html"}}
  4. <!-- Left side column. 权限菜单 -->
  5. {{include "com/menu.html"}}
  6. <div class="content-wrapper">
  7. <section class="content-header">
  8. <h1>
  9. <small></small>
  10. </h1>
  11. <ol class="breadcrumb">
  12. <li><a href="/front/project"><i class="fa fa-dashboard"></i> 项目列表</a></li>
  13. <li><a href="#"><i class="fa fa-dashboard"></i> 项目清洗</a></li>
  14. </ol>
  15. </section>
  16. <!-- Main content -->
  17. <section class="content">
  18. <div class="row">
  19. <div class="col-xs-12">
  20. <div class="box">
  21. <div class="box-body">
  22. <div class="form-horizontal">
  23. <div class="box-body margin">
  24. <h4><i class="glyphicon glyphicon-exclamation-sign" style="margin-right: 6px"></i>数据情况</h4>
  25. <div class="form-group" style="margin-left: 15px">
  26. <span class="form-inline panel-body">分发总量/数据总量(条):
  27. <input type="text" class="form-control" readonly value="{{.T.allGiveDataNum}}/{{.T.allDataNum}}">
  28. </span>
  29. </div>
  30. <div class="form-group" style="margin-left: 10px">
  31. <div class="col-xs-3" style="width: auto">
  32. <label class="form-inline">数据总量:
  33. <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.allDataNum}}"></label>
  34. <label class="form-inline" style="margin-left: 5px">已分发:
  35. <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.allGiveDataNum}}"></label>
  36. <label class="form-inline" style="margin-left: 5px">待分发:
  37. <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.allNoGiveDataNum}}"></label>
  38. <label class="form-inline" style="margin-left: 5px">已标注:
  39. <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.allIsTagDataNum}}"></label>
  40. </div>
  41. <div class="col-xs-5 form-group">
  42. <label class="form-inline">&nbsp;操作:
  43. <input type="button" class="btn btn-sm btn-primary" onclick="" value="标注">
  44. <input type="button" class="btn btn-sm btn-primary" onclick="dispatchTask('all')" value="分发">
  45. <input type="button" class="btn btn-sm btn-primary" value="质检">
  46. <input type="button" class="btn btn-sm btn-primary" value="质检结果">
  47. </label>
  48. </div>
  49. </div>
  50. <div class="form-group" style="margin-left: 10px">
  51. <div class="col-xs-6" style="width: auto">
  52. <label class="form-inline">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;达标:
  53. <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.okAllDataNum}}"></label>
  54. <label class="form-inline" style="margin-left: 5px">已分发:
  55. <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.okIsGiveDataNum}}"></label>
  56. <label class="form-inline" style="margin-left: 5px">待分发:
  57. <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.okNotGiveDataNum}}"></label>
  58. <label class="form-inline" style="margin-left: 5px">已标注:
  59. <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.okIsTagDataNum}}"></label>
  60. </div>
  61. <div class="col-xs-5 form-group">
  62. <label class="form-inline">操作:
  63. <input type="button" class="btn btn-sm btn-primary" onclick="" value="标注">
  64. <input type="button" class="btn btn-sm btn-primary" onclick="dispatchTask('notag')" value="分发">
  65. <input type="button" class="btn btn-sm btn-primary" value="质检">
  66. <input type="button" class="btn btn-sm btn-primary" value="质检结果">
  67. </label>
  68. </div>
  69. </div>
  70. <div class="form-group" style="margin-left: 10px">
  71. <div class="col-xs-6" style="width: auto">
  72. <label class="form-inline">&nbsp;&nbsp;&nbsp;&nbsp;未达标:
  73. <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.IsNoOkAllDataNum}}"></label>
  74. <label class="form-inline" style="margin-left: 5px">已分发:
  75. <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.IsNoOkIsGiveDataNum}}"></label>
  76. <label class="form-inline" style="margin-left: 5px">待分发:
  77. <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.IsNotOkNotGiveDataNum}}"></label>
  78. <label class="form-inline" style="margin-left: 5px">已标注:
  79. <input type="text" class="form-control" style="width: 80px" readonly value="{{.T.IsNotOkIsTagDataNum}}"></label>
  80. </div>
  81. <div class="col-xs-5 form-group">
  82. <label class="form-inline">操作:
  83. <input type="button" class="btn btn-sm btn-primary" onclick="" value="标注">
  84. <input type="button" class="btn btn-sm btn-primary" onclick="dispatchTask('tag')" value="分发">
  85. <input type="button" class="btn btn-sm btn-primary" value="质检">
  86. <input type="button" class="btn btn-sm btn-primary" value="质检结果">
  87. </label>
  88. </div>
  89. </div>
  90. </div>
  91. </div>
  92. <div id="status-div" class="col-xs-1" style="width: auto;float:right;">
  93. <select class="form-control selectpicker" id="pushModelSelect">
  94. <option value=-1>全部</option>
  95. <option value=0>开启</option>
  96. <option value=1>关闭</option>
  97. </select>
  98. </div>
  99. <hr>
  100. <div class="form-horizontal">
  101. <div class="box-body margin">
  102. <h3><i class="glyphicon glyphicon-tasks" style="margin-right: 6px"></i>数据清洗任务列表
  103. </h3>
  104. <table id="dataTable" class="table table-bordered table-hover">
  105. <thead>
  106. <tr>
  107. <th>序号</th>
  108. <th>项目名称</th>
  109. <th>用户组名称</th>
  110. <th>负责人</th>
  111. <th>分发数据量</th>
  112. <th>任务状态</th>
  113. <th>完成进度</th>
  114. <th>任务时间</th>
  115. <th>操作</th>
  116. </tr>
  117. </thead>
  118. </table>
  119. </div>
  120. </div>
  121. </div>
  122. <!-- /.box-body -->
  123. </div>
  124. <!-- /.box -->
  125. </div>
  126. </div>
  127. </section>
  128. </div>
  129. <div class="modal fade" id="modal-create-task" tabindex="-1" role="dialog" aria-hidden="true">
  130. <div class="modal-dialog" style="width: 60%">
  131. <div class="modal-content">
  132. <div class="modal-header">
  133. <div class="modal-header">
  134. <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
  135. <div class="edit-info">
  136. <span class="glyphicon glyphicon-tasks" aria-hidden="true"></span>
  137. <span class="h3">新建任务</span>
  138. </div>
  139. <div class="edit-form">
  140. <form id="modal-form-task" class="form-horizontal">
  141. <div class="modal-body modal-task">
  142. <div class="form-group margin-bottom" style="margin-left: 15px">
  143. <label class="control-label form-inline h4">待分发数据总量(条):
  144. <span id="modal-num">0</span>
  145. </label>
  146. </div>
  147. <hr>
  148. <div></div>
  149. <div id="TaskDiv">
  150. <div id="itemDiv" class="form-group" style="margin-left: 10px;display: none">
  151. <select id="group-select-clone"></select>
  152. <label class="control-label form-inline" style="margin-left: 20px">数据量(条):
  153. <input type="number" class="form-control"></label>
  154. </div>
  155. <div class="form-group group-item" style="margin-left: 10px;">
  156. <select class="selectpicker" id="group-select"></select>
  157. <label class="control-label form-inline" style="margin-left: 20px">数据量(条):
  158. <input type="number" class="form-control"></label>
  159. <input type="button" class="btn btn-info btn-sm" onclick="addTaskSelect()" value="新增">
  160. </div>
  161. </div>
  162. </div>
  163. </form>
  164. </div>
  165. </div>
  166. </div>
  167. <div class="modal-footer">
  168. <input type="button" onclick="saveTask()" class="btn btn-primary" value="保存">
  169. <input type="button" onclick="cancelModel()" class="btn btn-default" value="取消">
  170. </div>
  171. </div>
  172. </div><!-- /.modal -->
  173. </div>
  174. {{include "com/footer.html"}}
  175. <script>
  176. menuActive("project");
  177. let projectid = {{ .T.s_projectid }}
  178. let groupList = []
  179. let tableData = []
  180. let stype = "" // 分发类型:所有数据:all 达标数据:notag 未达标:tag
  181. $(function () {
  182. ttable = $('#dataTable').dataTable({
  183. "paging": true,
  184. "lengthChange": false,
  185. "searching": true,
  186. "ordering": false,
  187. "info": true,
  188. "autoWidth": false,
  189. "language": {
  190. "url": "/dist/js/dataTables.chinese.lang"
  191. },
  192. "fnDrawCallback": function () {
  193. $("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>");
  194. $('#dataTable-btn').click(function (e) {
  195. var redirectpage = 0
  196. if ($("#changePage").val() && $("#changePage").val() > 0) {
  197. var redirectpage = $("#changePage").val() - 1;
  198. }
  199. ttable.page(redirectpage).draw(false);
  200. });
  201. this.api().column(0).nodes().each(function (cell, i) {
  202. cell.innerHTML = i + 1;
  203. });
  204. },
  205. "columns": [
  206. {"data": null, width: "1%"},
  207. {"data": "s_projectname", width: "5%"},
  208. {"data": "s_groupname", width: "4%"},
  209. {"data": "s_personname", width: "4%"},
  210. {"data": "i_givenum", width: "4%"},
  211. {"data": "s_status", width: "4%"},
  212. {"data": "s_progress", width: "4%"},
  213. {
  214. "data": "_id", width: "4%", render: function (val, a, row) {
  215. let str = ""
  216. if (row['i_starttime'] === undefined) {
  217. str = "未开始"
  218. }else if (row['i_starttime'] && row['i_completetime'] === undefined) {
  219. let dt = new Date()
  220. dt.setTime(parseInt(row['i_starttime']) * 1000);
  221. str = dt.format("yyyy-MM-dd hh:mm:ss") + " - 未结束"
  222. }else {
  223. let dt = new Date()
  224. let ds = new Date()
  225. dt.setTime(parseInt(row['i_starttime']) * 1000);
  226. ds.setTime(parseInt(row["i_completetime"]) * 1000)
  227. str = dt.format("yyyy-MM-dd hh:mm:ss") + " - " + ds.format("yyyy-MM-dd hh:mm:ss")
  228. }
  229. return str
  230. }
  231. },
  232. {
  233. "data": "_id", width: "11%", render: function (val, a, row, pos) {
  234. tmp = '<div>' +
  235. '<a class="btn btn-sm btn-primary" href="/front/user/task/list?grouptaskid=' + val + '&s_sourceinfo='+row.s_sourceinfo+'">查看</a>&nbsp;&nbsp;' +
  236. '<a class="btn btn-sm btn-warning" onclick="retrieveTask(\''+val+'\',\''+row.s_sourceinfo+'\',\''+row.s_status+'\')">收回</a>&nbsp;&nbsp;' +
  237. '<a class="btn btn-sm btn-info">质检</a>&nbsp;&nbsp;' +
  238. '<a class="btn btn-sm btn-info" onclick="repulseTask(\''+val+'\',\''+row.s_sourceinfo+'\',\''+row.s_status+'\')">打回</a>&nbsp;&nbsp;' +
  239. '<a class="btn btn-sm btn-default" onclick="closeTask(\'' + val + '\',\''+row.s_sourceinfo+'\',\'' + row.s_status + '\')">关闭</a>&nbsp;&nbsp;' +
  240. '</div>';
  241. return tmp
  242. }
  243. }
  244. ],
  245. "initComplete": function () {
  246. $("#dataTable_filter").append($('#status-div'))
  247. }
  248. });
  249. $.ajax({
  250. url: "/front/project/task/list",
  251. type: "POST",
  252. data: {"pid": projectid},
  253. success: function (r) {
  254. if (r.data.length > 0) {
  255. console.log(r.data)
  256. ttable.fnClearTable();
  257. ttable.fnAddData(r.data);
  258. }
  259. }
  260. })
  261. $.ajax({
  262. url: "/front/group/list",
  263. type: "POST",
  264. data: {},
  265. success: function (r) {
  266. if (r.rep) {
  267. groupList = r.data
  268. console.log(groupList)
  269. }
  270. }
  271. })
  272. });
  273. function dispatchTask(val) {
  274. console.log(val)
  275. stype = val
  276. if (stype === "all") {
  277. $('#modal-num').val({{.T.allGiveDataNum}})
  278. }else if (stype === "notag") {
  279. $('#modal-num').val({{.T.okNotGiveDataNum}})
  280. }else {
  281. $('#modal-num').val({{.T.IsNotOkNotGiveDataNum}})
  282. }
  283. $('#modal-create-task').modal('show')
  284. for (var i in groupList) {
  285. var opt = document.createElement('option');
  286. opt.innerText = groupList[i]["s_name"];
  287. opt.value = groupList[i]["_id"];
  288. $('#group-select')[0].appendChild(opt)
  289. }
  290. $("#group-select").selectpicker("refresh");
  291. }
  292. function cancelModel() {
  293. $('#TaskDiv .group-item.clone-template').remove()
  294. $("#modal-create-task").modal('hide')
  295. document.getElementById("modal-form-task").reset();
  296. }
  297. function addTaskSelect() {
  298. let tNode = $('#itemDiv').clone().addClass('group-item').addClass('clone-template').show()
  299. let st = $(tNode).find('select')
  300. $(st).addClass('selectpicker')
  301. for (var i in groupList) {
  302. var opt = document.createElement('option');
  303. opt.innerText = groupList[i]["s_name"];
  304. opt.value = groupList[i]["_id"];
  305. $(st)[0].appendChild(opt)
  306. }
  307. $(st).selectpicker("refresh");
  308. $('#TaskDiv').append($(tNode))
  309. }
  310. function saveTask() {
  311. let arr = []
  312. $('.group-item').each(function () {
  313. var selectId = $(this).find("select option:checked").val()
  314. var inputVal = $(this).find("input").val()
  315. let tmp = {}
  316. for (let v in groupList) {
  317. if (groupList[v]["_id"] === selectId) {
  318. tmp["s_groupid"] = selectId
  319. tmp["s_groupname"] = groupList[v]["s_name"]
  320. tmp["s_personname"] = groupList[v]["s_personname"]
  321. tmp["i_givenum"] = inputVal
  322. break
  323. }
  324. }
  325. arr.push(tmp)
  326. })
  327. console.log(arr)
  328. $.ajax({
  329. url: "/front/project/task/save",
  330. type: 'POST',
  331. data: {"s_projectid": projectid, "s_group": JSON.stringify(arr), "s_type": stype},
  332. success: function (r) {
  333. if (r.success) {
  334. location.reload()
  335. } else {
  336. showTip(r.msg);
  337. }
  338. }
  339. })
  340. }
  341. // 收回
  342. function retrieveTask(id, sourceinfo, status,givenum) {
  343. if (status === "未开始" || status === "进行中") {
  344. $.ajax({
  345. url: "/front/project/task/retrieve",
  346. type: 'POST',
  347. data: { "s_sourceinfo": sourceinfo, "taskid": id, "s_status": status,"i_givenum" :givenum},
  348. success: function (r) {
  349. if (r.success) {
  350. location.reload()
  351. } else {
  352. showTip(r.msg);
  353. }
  354. }
  355. })
  356. }else {
  357. showTip("操作不允许")
  358. }
  359. }
  360. // 打回
  361. function repulseTask(id, sourceinfo,status) {
  362. if (status === "已完成") {
  363. $.ajax({
  364. url: "/front/project/task/repulse",
  365. type: 'POST',
  366. data: {"s_sourceinfo": sourceinfo, "taskid": id, "s_tatus": status},
  367. success: function (r) {
  368. if (r.success) {
  369. location.reload()
  370. } else {
  371. showTip(r.msg);
  372. }
  373. }
  374. })
  375. }else {
  376. showTip("操作不允许")
  377. }
  378. }
  379. function closeTask(id, sourceinfo,status) {
  380. if (status === "未开始") {
  381. showConfirm("确认要关闭当前任务吗?", function () {
  382. $.ajax({
  383. url: "/front/project/task/close",
  384. type: 'POST',
  385. data: {"s_sourceinfo": sourceinfo, "s_status": status, "taskid": id},
  386. success: function (r) {
  387. if (r.success) {
  388. location.reload()
  389. } else {
  390. showTip(r.msg);
  391. }
  392. }
  393. })
  394. })
  395. }else {
  396. showTip("操作不允许")
  397. }
  398. }
  399. </script>