project_list.html 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  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. </ol>
  14. </section>
  15. <!-- Main content -->
  16. <section class="content">
  17. <div class="row">
  18. <div class="col-xs-12">
  19. <div class="box">
  20. <div class="box-body">
  21. <div class="form-group" style="margin-left: 20px">
  22. <a class="btn btn-sm btn-success h4" onclick="createPro()"><i
  23. class="fa fa-fw fa-plus fa-lg"></i>新建项目</a>
  24. </div>
  25. <div id="status-div" class="col-xs-1" style="width: auto;float: right">
  26. <label for="statusSelect">状态:
  27. <select class="form-control selectpicker" id="statusSelect">
  28. <option value="-1">全部</option>
  29. <option value="未开始">未开始</option>
  30. <option value="进行中">进行中</option>
  31. <option value="已完成">已完成</option>
  32. <option value="已关闭">已关闭</option>
  33. </select></label>
  34. </div>
  35. <table id="dataTable" class="table table-bordered table-hover">
  36. <thead>
  37. <tr>
  38. <th>序号</th>
  39. <th>项目名称</th>
  40. <th>公司名称</th>
  41. <th>部门名称</th>
  42. <th>规则名称</th>
  43. <th>售后人员</th>
  44. <th>数据量</th>
  45. <th>项目状态</th>
  46. <th>项目时间</th>
  47. <th>操作</th>
  48. </tr>
  49. </thead>
  50. </table>
  51. </div>
  52. <!-- /.box-body -->
  53. </div>
  54. <!-- /.box -->
  55. </div>
  56. </div>
  57. </section>
  58. </div>
  59. <div class="modal fade" id="modal-create-project" tabindex="-1" role="dialog" aria-hidden="true">
  60. <div class="modal-dialog" style="width: 50%">
  61. <div class="modal-content">
  62. <div class="modal-header">
  63. <div class="modal-header">
  64. <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
  65. <div class="edit-info">
  66. <span class="glyphicon glyphicon-alert" aria-hidden="true"></span>
  67. <span class="h4">新建项目</span>
  68. </div>
  69. <div class="edit-form">
  70. <hr>
  71. <div class="form-group">
  72. <label class="radio-inline">
  73. <input type="radio" name="stype" value="coll" checked>数据库导入
  74. </label>
  75. <label class="radio-inline">
  76. <input type="radio" name="stype" value="excel">Excel表导入
  77. </label>
  78. </div>
  79. <form id="model-form-project" class="form-horizontal" enctype="multipart/form-data">
  80. <div class="box-body">
  81. <div class="form-group">
  82. <label class="col-sm-3 control-label"><span style="color:red;">* </span>项目名称</label>
  83. <div class="col-sm-5">
  84. <input type="text" class="form-control" id="project-name" placeholder="项目名称" onblur="checkProName()">
  85. </div>
  86. </div>
  87. <div id="import-coll">
  88. <h5><i class="glyphicon glyphicon-bookmark"
  89. style="color: #00c4ff;margin-right: 6px"></i>数据来源</h5>
  90. <div class="form-group">
  91. <label class="col-sm-3 control-label"><span
  92. style="color:red;">* </span>数据库名</label>
  93. <div class="col-sm-5">
  94. <input type="text" class="form-control" id="db-name" value="jyqyfw"
  95. readonly>
  96. </div>
  97. </div>
  98. <div class="form-group">
  99. <label class="col-sm-3 control-label"><span
  100. style="color:red;">* </span>数据表名</label>
  101. <div class="col-sm-5">
  102. <input type="text" class="form-control" id="coll-name"
  103. value="usermail_history" readonly>
  104. </div>
  105. </div>
  106. <div class="form-group">
  107. <label class="col-sm-3 control-label"><span
  108. style="color:red;">* </span>数据导出ID</label>
  109. <div class="col-sm-6">
  110. <input type="text" class="form-control" id="data-id" placeholder="数据导出ID">
  111. </div>
  112. </div>
  113. </div>
  114. <div id="import-excel" style="display: none">
  115. <h5><i class="glyphicon glyphicon-bookmark"
  116. style="color: #00c4ff;margin-right: 6px"></i>数据信息</h5>
  117. <div class="form-group">
  118. <label class="col-sm-3 control-label"><span style="color:red;">* </span>公司名称</label>
  119. <ul class="dropdown-menu"> </ul>
  120. <div class="col-sm-6">
  121. <input type="text" class="form-control" id="company-name" autocomplete="off"
  122. data-provide="typeahead" placeholder="公司名称">
  123. </div>
  124. </div>
  125. <div class="form-group">
  126. <label class="col-sm-3 control-label">部门名称</label>
  127. <div class="col-sm-6">
  128. <input type="text" class="form-control" id="dpart-name" placeholder="部门名称">
  129. </div>
  130. </div>
  131. <div class="form-group">
  132. <label class="col-sm-3 control-label">规则名称</label>
  133. <div class="col-sm-6">
  134. <input type="text" class="form-control" id="rule-name" placeholder="规则名称">
  135. </div>
  136. </div>
  137. <div class="form-group">
  138. <label class="col-sm-3 control-label">选择文件</label>
  139. <div class="col-sm-6">
  140. <input type="file" name="file" id="uploadfile">
  141. </div>
  142. </div>
  143. </div>
  144. <h5><i class="glyphicon glyphicon-bookmark"
  145. style="color: #00c4ff;margin-right: 6px"></i>数据存储</h5>
  146. <div class="form-group">
  147. <label class="col-sm-3 control-label"><span style="color:red;">* </span>数据库名</label>
  148. <div class="col-sm-6">
  149. <input type="text" class="form-control" value="jyqykhfw" readonly>
  150. </div>
  151. </div>
  152. <div class="form-group">
  153. <label class="col-sm-3 control-label"><span style="color:red;">* </span>数据表名</label>
  154. <div class="col-sm-6">
  155. <input type="text" class="form-control" id="coll-save-name" placeholder="数据表名">
  156. </div>
  157. </div>
  158. </div>
  159. </form>
  160. </div>
  161. </div>
  162. </div>
  163. <div class="modal-footer">
  164. <input type="button" onclick="importData()" class="btn btn-primary" value="导入">
  165. <input type="button" onclick="cancelModel()" class="btn btn-default" value="取消">
  166. </div>
  167. </div>
  168. </div><!-- /.modal -->
  169. </div>
  170. <div class="modal fade" id="modal-edit-project" tabindex="-1" role="dialog" aria-hidden="true">
  171. <div class="modal-dialog" style="width: 50%">
  172. <div class="modal-content">
  173. <div class="modal-header">
  174. <div class="modal-header">
  175. <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
  176. <div class="edit-info">
  177. <span class="glyphicon glyphicon-alert" aria-hidden="true"></span>
  178. <span class="h4">编辑项目</span>
  179. </div>
  180. <div class="edit-form">
  181. <hr>
  182. <form class="form-horizontal" enctype="multipart/form-data">
  183. <div class="box-body">
  184. <div class="form-group">
  185. <label class="col-sm-3 control-label">公司名称</label>
  186. <div class="col-sm-5">
  187. <input type="text" class="form-control" id="company-edit-name" readonly>
  188. </div>
  189. </div>
  190. <div class="form-group">
  191. <label class="col-sm-3 control-label">部门名称</label>
  192. <div class="col-sm-5">
  193. <input type="text" class="form-control" id="dpart-edit-name">
  194. </div>
  195. </div>
  196. <div class="form-group">
  197. <label class="col-sm-3 control-label">规则名称</label>
  198. <div class="col-sm-5">
  199. <input type="text" class="form-control" id="rule-edit-name">
  200. </div>
  201. </div>
  202. <div class="form-group">
  203. <label class="col-sm-3 control-label">售后人员</label>
  204. <div class="col-sm-5">
  205. <input type="text" class="form-control" id="edit-person">
  206. </div>
  207. </div>
  208. <div class="form-group">
  209. <label class="col-sm-3 control-label">选择标注字段</label>
  210. <div class="col-sm-5">
  211. <select class="form-control selectpicker" multiple
  212. id="markFieldSelect"></select>
  213. </div>
  214. </div>
  215. </div>
  216. </form>
  217. </div>
  218. </div>
  219. </div>
  220. <div class="modal-footer">
  221. <input type="button" onclick="saveData()" class="btn btn-primary saveBtn" value="保存">
  222. <input type="button" onclick="cancelModel()" class="btn btn-default" value="取消">
  223. </div>
  224. </div>
  225. </div><!-- /.modal -->
  226. </div>
  227. <div class="modal fade" id="loadingModal" backdrop="static" keyboard="false">
  228. <div style="width: 200px;height:100px; z-index: 20000; position: absolute; text-align: center; left: 50%; top: 50%;margin-left:-100px;margin-top:-10px">
  229. <div class="progress progress-striped active"
  230. style="margin-bottom: 0;height:50px; text-align:center;line-height: 50px;font-size:large;">
  231. 数据加载中,请稍候......    
  232. </div>
  233. </div>
  234. </div>
  235. {{include "com/footer.html"}}
  236. <script>
  237. menuActive("project");
  238. let stype = "coll";
  239. let fields = {{ .T.fields }}
  240. let projectmap = {}
  241. //展示loading框
  242. showLoading = function (){
  243. $('#loadingModal').modal({backdrop: 'static', keyboard: false});
  244. }
  245. //隐藏掉loading框
  246. hideLoading = function (){
  247. $('#loadingModal').modal('hide');
  248. }
  249. $(function () {
  250. ttable = $('#dataTable').dataTable({
  251. "paging": true,
  252. "lengthChange": false,
  253. "searching": true,
  254. "ordering": false,
  255. "info": true,
  256. "autoWidth": false,
  257. "serverSide": true,
  258. "ajax": {
  259. "url": "/front/project",
  260. "type": "post"
  261. },
  262. "language": {
  263. "url": "/dist/js/dataTables.chinese.lang"
  264. },
  265. "fnDrawCallback": function () {
  266. $("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>");
  267. $('#dataTable-btn').click(function (e) {
  268. var redirectpage = 0
  269. if ($("#changePage").val() && $("#changePage").val() > 0) {
  270. var redirectpage = $("#changePage").val() - 1;
  271. }
  272. ttable.api().page(redirectpage).draw(false);
  273. });
  274. this.api().column(0).nodes().each(function (cell, i) {
  275. cell.innerHTML = i + 1;
  276. });
  277. },
  278. "columns": [
  279. {"data": null, width: "1%"},
  280. {"data": "s_name", width: "4%"},
  281. {"data": "s_entname", width: "5%"},
  282. {"data": "s_departname", width: "4%"},
  283. {"data": "s_rulename", width: "4%"},
  284. {"data": "s_personname", width: "3%", "defaultContent": ""},
  285. {"data": "i_importnum", width: "2%"},
  286. {"data": "s_status", width: "3%"},
  287. {
  288. "data": "_id", width: "5%", render: function (val, a, row) {
  289. let str = ""
  290. if (row['i_starttime'] === undefined) {
  291. str = "未开始"
  292. }else if (row['i_starttime'] && row['i_completetime'] === undefined) {
  293. let dt = new Date()
  294. dt.setTime(parseInt(row['i_starttime']) * 1000);
  295. str = dt.format("yyyy-MM-dd hh:mm:ss") + " - 未结束"
  296. }else {
  297. let dt = new Date()
  298. let ds = new Date()
  299. dt.setTime(parseInt(row['i_starttime']) * 1000);
  300. ds.setTime(parseInt(row["i_completetime"]) * 1000)
  301. str = dt.format("yyyy-MM-dd hh:mm:ss") + " - " + ds.format("yyyy-MM-dd hh:mm:ss")
  302. }
  303. return str
  304. }
  305. },
  306. {
  307. "data": "_id", width: "11%", render: function (val, a, row, pos) {
  308. tmp = '<div>' +
  309. '<a class="btn btn-sm btn-primary" onclick="editPro(\'' + pos.row + '\')">编辑</a>&nbsp;&nbsp;' +
  310. '<a class="btn btn-sm btn-primary" onclick="clearPro(\''+ pos.row +'\')">清洗</a>&nbsp;&nbsp;' +
  311. '<a class="btn btn-sm btn-primary" onclick="checkMethod(\'' + val + '\',\''+row.s_sourceinfo+'\',\'' + row.s_status + '\')">质检</a>&nbsp;&nbsp;' +
  312. // '<a class="btn btn-sm btn-primary" href="">质检结果</a>&nbsp;&nbsp;' +
  313. '<a class="btn btn-sm btn-primary" onclick="completePro(\'' + val + '\',\''+row.s_sourceinfo+'\',\'' + row.s_status + '\')">完成</a>&nbsp;&nbsp;' +
  314. '</div>';
  315. return tmp
  316. }
  317. }
  318. ],
  319. "initComplete": function () {
  320. $("#dataTable_filter").prepend($('#status-div'))
  321. },
  322. "fnServerParams": function (e) {
  323. e.s_status = $("#statusSelect option:selected").val()
  324. }
  325. })
  326. $('input[type=radio][name=stype]').change(function () {
  327. if (this.value === 'coll') {
  328. stype = "coll"
  329. $("#import-coll").attr("style", "display:block;")
  330. $("#import-excel").attr("style", "display:none;")
  331. } else if (this.value === 'excel') {
  332. stype = "excel"
  333. $("#import-coll").attr("style", "display:none;")
  334. $("#import-excel").attr("style", "display:block;")
  335. }
  336. });
  337. for (let i in fields) {
  338. let opt = document.createElement('option');
  339. opt.innerText = fields[i]["s_name"];
  340. opt.value = fields[i]["s_code"];
  341. $('#markFieldSelect')[0].appendChild(opt)
  342. }
  343. $("#markFieldSelect").selectpicker("refresh");
  344. $("#company-name").typeahead({
  345. source: function (query, process) {
  346. return $.ajax({
  347. url: '/front/project/getEntnameList',
  348. type: 'post',
  349. data: {'entname': query},
  350. success: function (result) {
  351. return process(result.entname);
  352. },
  353. });
  354. }
  355. });
  356. $('#statusSelect').on('changed.bs.select', function () {
  357. ttable.api().ajax.reload();
  358. })
  359. });
  360. function createPro() {
  361. $("#modal-create-project").modal('show')
  362. }
  363. function cancelModel() {
  364. document.getElementById("model-form-project").reset();
  365. $("#modal-create-project").modal('hide')
  366. $("#modal-edit-project").modal('hide')
  367. }
  368. function importData() {
  369. let sname = $('#project-name').val()
  370. let coll = $('#coll-save-name').val()
  371. if (sname === "") {
  372. alert("项目名称为必填项")
  373. return
  374. }
  375. if (coll === "") {
  376. alert("数据表名为必填项")
  377. return;
  378. }
  379. if (stype === "coll") {
  380. let dataid = $('#data-id').val()
  381. if (dataid === "") {
  382. alert("数据导出ID为必填项")
  383. return;
  384. }
  385. projectmap["s_name"] = sname
  386. projectmap["s_historyid"] = dataid
  387. projectmap["s_sourceinfo"] = coll
  388. if (projectmap["s_sourceinfo"] === "") {
  389. alert("数据表名为必填项")
  390. return;
  391. }
  392. projectmap["s_type"] = stype
  393. showLoading()
  394. $.ajax({
  395. url: "/front/project/save",
  396. type: 'POST',
  397. data: projectmap,
  398. success: function (r) {
  399. hideLoading()
  400. if (r.success) {
  401. $("#modal-create-project").modal('hide')
  402. let msg = r.msg + "<br>"+"导入数据:"+r.importnum+"条;成功:"+r.successnum+"条;失败:"+r.failnum+"条。"
  403. showMsg(msg, 1500);
  404. ttable.api().ajax.reload();
  405. } else {
  406. showMsg(r.msg, 2000)
  407. }
  408. }
  409. })
  410. } else if (stype === "excel") {
  411. let formData = new FormData();
  412. formData.append("s_name", sname)
  413. formData.append("s_sourceinfo", coll)
  414. formData.append("s_entname", $('#company-name').val())
  415. formData.append("s_departname", $('#dpart-name').val())
  416. formData.append("s_rulename", $('#rule-name').val())
  417. formData.append("s_type", stype)
  418. let file = $('#uploadfile')[0].files[0]
  419. if (file) {
  420. formData.append("xlsx", file)
  421. showLoading()
  422. $.ajax({
  423. url: "/front/project/save",
  424. type: 'POST',
  425. data: formData,
  426. cache: false,
  427. processData: false,
  428. contentType: false,
  429. success: function (r) {
  430. hideLoading()
  431. if (r.success) {
  432. $("#modal-create-project").modal('hide')
  433. let msg = r.msg + "<br>"+"导入数据:"+r.importnum+"条;成功:"+r.successnum+"条;失败:"+r.failnum+"条。"
  434. showMsg(msg, 1500);
  435. ttable.api().ajax.reload();
  436. } else {
  437. showMsg(r.msg, 2000);
  438. }
  439. }
  440. })
  441. } else {
  442. showTip("请选择上传文件");
  443. }
  444. }
  445. }
  446. function editPro(index) {
  447. projectmap = ttable.fnGetData()[index]
  448. console.log(projectmap.v_fields)
  449. $('#modal-edit-project').modal('show')
  450. $('#company-edit-name').val(projectmap["s_entname"])
  451. $('#rule-edit-name').val(projectmap["s_rulename"])
  452. $('#dpart-edit-name').val(projectmap["s_departname"])
  453. $('#edit-person').val(projectmap["s_personname"])
  454. $("#markFieldSelect").selectpicker("deselectAll");
  455. if (projectmap.v_fields !== undefined) {
  456. $('#markFieldSelect option').each(function(){
  457. let v = $(this).val()
  458. if (projectmap.v_fields[v] !== undefined) {
  459. $(this)[0].selected = true
  460. }
  461. })
  462. $("#markFieldSelect").selectpicker("refresh");
  463. }else {
  464. $("#markFieldSelect").selectpicker("deselectAll");
  465. }
  466. }
  467. function saveData() {
  468. stype = "edit"
  469. let s1 = JSON.stringify(projectmap)
  470. let tmp = projectmap
  471. tmp["s_departname"] = $('#dpart-edit-name').val()
  472. tmp["s_rulename"] = $('#rule-edit-name').val()
  473. tmp["s_personname"] = $('#edit-person').val()
  474. let fieldArr = $('#markFieldSelect').val();
  475. let m = {}
  476. if (fieldArr.length > 0) {
  477. for (const i in fields) {
  478. if (fieldArr.indexOf(fields[i]["s_code"]) > -1) {
  479. m[fields[i]["s_code"]] = fields[i]["s_name"]
  480. }
  481. }
  482. }
  483. tmp["v_fields"] = JSON.stringify(m)
  484. if (s1 === JSON.stringify(tmp)) {
  485. showTip("未做修改");
  486. } else {
  487. $.ajax({
  488. url: "/front/project/save",
  489. type: 'POST',
  490. data: {"s_type": stype, "s_departname": tmp["s_departname"], "s_personname": tmp["s_personname"],
  491. "s_rulename": tmp["s_rulename"], "v_fields": tmp["v_fields"], "s_name": tmp["s_name"]},
  492. success: function (r) {
  493. if (r.success) {
  494. showTip("保存成功", 500)
  495. cancelModel()
  496. ttable.api().ajax.reload();
  497. } else {
  498. showTip(r.msg);
  499. }
  500. }
  501. })
  502. }
  503. }
  504. function clearPro(val) {
  505. let tmp = ttable.fnGetData()[val]
  506. if (tmp["v_fields"] === undefined) {
  507. showTip("请设置标注字段")
  508. }else {
  509. showLoading()
  510. $.ajax({
  511. url: "/front/project/qualityAssessment",
  512. type: 'POST',
  513. data: {"pid": tmp["_id"]},
  514. success: function (r) {
  515. if (r.success) {
  516. hideLoading()
  517. window.location.href="/front/project/task/list?pid=" + tmp["_id"]
  518. } else {
  519. showTip(r.msg);
  520. }
  521. }
  522. })
  523. }
  524. }
  525. function completePro(pid, sourceinfo, status) {
  526. if (status === "进行中") {
  527. showConfirm("确认已经完成该项目任务?", function () {
  528. $.ajax({
  529. url: "/front/project/complete",
  530. type: 'POST',
  531. data: {"s_projectid": pid, "s_sourceinfo": sourceinfo, "s_status": status},
  532. success: function (r) {
  533. if (r.rep) {
  534. ttable.api().ajax.reload();
  535. } else {
  536. showMsg(r.msg);
  537. }
  538. }
  539. })
  540. })
  541. }else {
  542. showTip("操作不允许")
  543. }
  544. }
  545. function checkMethod(pid, sourceinfo, status) {
  546. if (status === "进行中") {
  547. window.location.href = "/front/user/check/data?pid=" + pid + "&s_sourceinfo" + sourceinfo
  548. }else {
  549. showTip("项目未分发任务")
  550. }
  551. }
  552. function checkProName() {
  553. let pname = $('#project-name').val()
  554. if (pname !== "") {
  555. $.ajax({
  556. url: "/front/project/isExists",
  557. type: "POST",
  558. data: {"s_name": pname},
  559. success: function (r) {
  560. if (r.exists) {
  561. alert("项目名称已经存在")
  562. }
  563. }
  564. })
  565. }
  566. }
  567. </script>