CaseDesignGM.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. <template>
  2. <div class="cd_body" style="overflow: auto">
  3. <div
  4. class="pb_content_body"
  5. style="
  6. background: #fff;
  7. padding: 0px 25px;
  8. box-sizing: border-box;
  9. width: 95%;
  10. margin: 10px auto 0;
  11. "
  12. >
  13. <div class="pb_head">
  14. <img
  15. src="../../assets/case.png"
  16. style="margin-right: 10px; width: 45px;"
  17. alt=""
  18. />
  19. <span>项目数据看板</span>
  20. </div>
  21. <div class="student_head">
  22. <div class="head_left">
  23. <span>筛选:</span>
  24. <el-select v-model="choose" @change="getData">
  25. <el-option label="默认排序" value=""> </el-option>
  26. <el-option label="学校名称" value="school"> </el-option>
  27. <el-option label="任务数量" value="task"> </el-option>
  28. <el-option label="评价" value="eval"> </el-option>
  29. <el-option label="工具" value="tool"> </el-option>
  30. <el-option label="字数" value="font"> </el-option>
  31. </el-select>
  32. <el-input
  33. v-model="search"
  34. class="student_input"
  35. placeholder="请输入教师名称或学校名称"
  36. @input="getData"
  37. ></el-input>
  38. </div>
  39. </div>
  40. </div>
  41. <div class="cd_table">
  42. <el-table
  43. ref="table"
  44. :data="tableData"
  45. border
  46. :fit="true"
  47. v-loading="isLoading"
  48. style="width: 100%"
  49. :header-cell-style="{ background: '#f1f1f1', fontSize: '17px' }"
  50. :row-class-name="tableRowClassName"
  51. class="table"
  52. >
  53. <el-table-column label="课程" min-width="15" align="center">
  54. <template slot-scope="scope">
  55. <div style="max-height: 180px; overflow: auto">
  56. <div
  57. v-for="(item, index) in scope.row.course"
  58. :key="index"
  59. class="cd_course"
  60. @click="jump(item.courseId)"
  61. >
  62. <el-tooltip :content="item.title">
  63. <span>{{ item.title }}</span>
  64. </el-tooltip>
  65. </div>
  66. </div>
  67. </template>
  68. </el-table-column>
  69. <el-table-column
  70. label="学校"
  71. prop="school"
  72. min-width="15"
  73. align="center"
  74. >
  75. </el-table-column>
  76. <el-table-column
  77. label="负责人"
  78. prop="username"
  79. min-width="15"
  80. align="center"
  81. >
  82. </el-table-column>
  83. <el-table-column
  84. label="更新时间"
  85. prop="time"
  86. min-width="15"
  87. align="center"
  88. >
  89. </el-table-column>
  90. <el-table-column label="总计" min-width="15" align="center">
  91. <template slot-scope="scope">
  92. <div class="cd_d_span">
  93. <div>
  94. <div>
  95. <span>{{ scope.row.jdz.taskC }}</span
  96. ><span>任务</span>
  97. </div>
  98. <div>
  99. <span>{{ scope.row.jdz.toolC }}</span
  100. ><span>工具</span>
  101. </div>
  102. <div>
  103. <span>{{ scope.row.jdz.evalC }}</span
  104. ><span>评价</span>
  105. </div>
  106. <div>
  107. <span>{{ scope.row.jdz.fontC }}</span
  108. ><span>字</span>
  109. </div>
  110. </div>
  111. </div>
  112. </template>
  113. </el-table-column>
  114. <el-table-column label="阶段1" min-width="15" align="center">
  115. <template slot-scope="scope">
  116. <div v-if="scope.row.jd1">
  117. <div class="cd_d_span">
  118. <div>
  119. <span>{{ scope.row.jd1.taskC }}</span
  120. ><span>任务</span>
  121. </div>
  122. <div>
  123. <span>{{ scope.row.jd1.toolC }}</span
  124. ><span>工具</span>
  125. </div>
  126. <div>
  127. <span>{{ scope.row.jd1.evalC }}</span
  128. ><span>评价</span>
  129. </div>
  130. <div>
  131. <span>{{ scope.row.jd1.fontC }}</span
  132. ><span>字</span>
  133. </div>
  134. </div>
  135. </div>
  136. <div v-else>—</div>
  137. </template>
  138. </el-table-column>
  139. <el-table-column label="阶段2" min-width="15" align="center">
  140. <template slot-scope="scope">
  141. <div v-if="scope.row.jd2">
  142. <div class="cd_d_span">
  143. <div>
  144. <span>{{ scope.row.jd2.taskC }}</span
  145. ><span>任务</span>
  146. </div>
  147. <div>
  148. <span>{{ scope.row.jd2.toolC }}</span
  149. ><span>工具</span>
  150. </div>
  151. <div>
  152. <span>{{ scope.row.jd2.evalC }}</span
  153. ><span>评价</span>
  154. </div>
  155. <div>
  156. <span>{{ scope.row.jd2.fontC }}</span
  157. ><span>字</span>
  158. </div>
  159. </div>
  160. </div>
  161. <div v-else>—</div>
  162. </template>
  163. </el-table-column>
  164. <el-table-column label="阶段3" min-width="15" align="center">
  165. <template slot-scope="scope">
  166. <div v-if="scope.row.jd3">
  167. <div class="cd_d_span">
  168. <div>
  169. <span>{{ scope.row.jd3.taskC }}</span
  170. ><span>任务</span>
  171. </div>
  172. <div>
  173. <span>{{ scope.row.jd3.toolC }}</span
  174. ><span>工具</span>
  175. </div>
  176. <div>
  177. <span>{{ scope.row.jd3.evalC }}</span
  178. ><span>评价</span>
  179. </div>
  180. <div>
  181. <span>{{ scope.row.jd3.fontC }}</span
  182. ><span>字</span>
  183. </div>
  184. </div>
  185. </div>
  186. <div v-else>—</div>
  187. </template>
  188. </el-table-column>
  189. <el-table-column label="阶段4" min-width="15" align="center">
  190. <template slot-scope="scope">
  191. <div v-if="scope.row.jd4">
  192. <div class="cd_d_span">
  193. <div>
  194. <span>{{ scope.row.jd4.taskC }}</span
  195. ><span>任务</span>
  196. </div>
  197. <div>
  198. <span>{{ scope.row.jd4.toolC }}</span
  199. ><span>工具</span>
  200. </div>
  201. <div>
  202. <span>{{ scope.row.jd4.evalC }}</span
  203. ><span>评价</span>
  204. </div>
  205. <div>
  206. <span>{{ scope.row.jd4.fontC }}</span
  207. ><span>字</span>
  208. </div>
  209. </div>
  210. </div>
  211. <div v-else>—</div>
  212. </template>
  213. </el-table-column>
  214. <el-table-column label="阶段5" min-width="15" align="center">
  215. <template slot-scope="scope">
  216. <div v-if="scope.row.jd5">
  217. <div class="cd_d_span">
  218. <div>
  219. <span>{{ scope.row.jd5.taskC }}</span
  220. ><span>任务</span>
  221. </div>
  222. <div>
  223. <span>{{ scope.row.jd5.toolC }}</span
  224. ><span>工具</span>
  225. </div>
  226. <div>
  227. <span>{{ scope.row.jd5.evalC }}</span
  228. ><span>评价</span>
  229. </div>
  230. <div>
  231. <span>{{ scope.row.jd5.fontC }}</span
  232. ><span>字</span>
  233. </div>
  234. </div>
  235. </div>
  236. <div v-else>—</div>
  237. </template>
  238. </el-table-column>
  239. <el-table-column label="阶段6" min-width="15" align="center">
  240. <template slot-scope="scope">
  241. <div v-if="scope.row.jd6">
  242. <div class="cd_d_span">
  243. <div>
  244. <span>{{ scope.row.jd6.taskC }}</span
  245. ><span>任务</span>
  246. </div>
  247. <div>
  248. <span>{{ scope.row.jd6.toolC }}</span
  249. ><span>工具</span>
  250. </div>
  251. <div>
  252. <span>{{ scope.row.jd6.evalC }}</span
  253. ><span>评价</span>
  254. </div>
  255. <div>
  256. <span>{{ scope.row.jd6.fontC }}</span
  257. ><span>字</span>
  258. </div>
  259. </div>
  260. </div>
  261. <div v-else>—</div>
  262. </template>
  263. </el-table-column>
  264. <el-table-column label="操作" min-width="15">
  265. <template slot-scope="scope">
  266. <!-- <div
  267. @click="getAll(scope.row)"
  268. >
  269. 查看全部
  270. </div> -->
  271. <el-button
  272. type="primary"
  273. size="small"
  274. style="background: rgb(147, 125, 223); border: none"
  275. @click="getAll(scope.row)"
  276. >查看详情</el-button
  277. >
  278. </template>
  279. </el-table-column>
  280. </el-table>
  281. </div>
  282. <el-dialog
  283. title="查看"
  284. :visible.sync="dialogVisible"
  285. :append-to-body="true"
  286. width="620px"
  287. :before-close="handleClose"
  288. class="dialog_diy"
  289. >
  290. <div v-if="dataArray.length">
  291. <div class="cd_d_jd2">
  292. <div class="cd_d_box">
  293. <span>教师:</span><span>{{ data.username }}</span>
  294. </div>
  295. <div class="cd_d_box">
  296. <span>学校:</span><span>{{ data.school }}</span>
  297. </div>
  298. </div>
  299. <div class="cd_d_jd">
  300. <div
  301. v-for="(item, index) in dataArray"
  302. :key="index"
  303. class="cd_d_jd_box"
  304. >
  305. <div class="cd_d_jd_name">{{ "阶段" + (index + 1) }}</div>
  306. <div class="cd_d_jd_content cd_d_span">
  307. <div>
  308. <span>{{ data[item].taskC }}</span
  309. ><span>任务</span>
  310. </div>
  311. <div>
  312. <span>{{ data[item].toolC }}</span
  313. ><span>工具</span>
  314. </div>
  315. <div>
  316. <span>{{ data[item].evalC }}</span
  317. ><span>评价</span>
  318. </div>
  319. <div>
  320. <span>{{ data[item].fontC }}</span
  321. ><span>字</span>
  322. </div>
  323. </div>
  324. </div>
  325. <div class="cd_d_jd_box">
  326. <div class="cd_d_jd_name">总计</div>
  327. <div class="cd_d_jd_content cd_d_span" style="background: #d4d4d4">
  328. <div>
  329. <span>{{ data["jdz"].taskC }}</span
  330. ><span>任务</span>
  331. </div>
  332. <div>
  333. <span>{{ data["jdz"].toolC }}</span
  334. ><span>工具</span>
  335. </div>
  336. <div>
  337. <span>{{ data["jdz"].evalC }}</span
  338. ><span>评价</span>
  339. </div>
  340. <div>
  341. <span>{{ data["jdz"].fontC }}</span
  342. ><span>字</span>
  343. </div>
  344. </div>
  345. </div>
  346. </div>
  347. </div>
  348. <span slot="footer" class="dialog-footer">
  349. <el-button @click="dialogVisible = false" class="cancelbtnGM"
  350. >关闭</el-button
  351. >
  352. </span>
  353. </el-dialog>
  354. </div>
  355. </template>
  356. <script>
  357. export default {
  358. data() {
  359. return {
  360. tableData: [],
  361. isLoading: false,
  362. org: this.$route.query.org,
  363. timer: null,
  364. dialogVisible: false,
  365. data: {},
  366. dataArray: [],
  367. choose: "",
  368. search: "",
  369. };
  370. },
  371. methods: {
  372. jump(cid) {
  373. window.parent.postMessage({ cid: cid, screenType: "3gm" }, "*");
  374. },
  375. handleClose(done) {
  376. done();
  377. },
  378. tableRowClassName({ row, rowIndex }) {
  379. if ((rowIndex + 1) % 2 === 0) {
  380. return "even_row";
  381. } else {
  382. return "";
  383. }
  384. },
  385. getData() {
  386. let params = {
  387. org: this.org,
  388. // this.org
  389. };
  390. this.ajax
  391. .get(this.$store.state.api + "selectCase", params)
  392. .then((res) => {
  393. this.isLoading = false;
  394. let _res = res.data[0];
  395. let _res2 = res.data[1];
  396. for (var i = 0; i < _res.length; i++) {
  397. let taskC = 0;
  398. let toolC = 0;
  399. let evalC = 0;
  400. let fontC = 0;
  401. let course = [];
  402. for (var j = 0; j < _res2.length; j++) {
  403. if (_res[i].userid == _res2[j].userid) {
  404. course.push({
  405. title: _res2[j].title,
  406. courseId: _res2[j].courseId,
  407. });
  408. var _chapter = JSON.parse(_res2[j].chapters);
  409. for (var k = 0; k < _chapter.length; k++) {
  410. let taskC2 = 0;
  411. let toolC2 = 0;
  412. let evalC2 = 0;
  413. let fontC2 = 0;
  414. fontC2 += _chapter[k].dyName.length;
  415. taskC2 = _chapter[k].chapterInfo[0].taskJson.length;
  416. let _tasks = _chapter[k].chapterInfo[0].taskJson;
  417. for (var task = 0; task < _tasks.length; task++) {
  418. if (_tasks[task].eList) {
  419. evalC2 += _tasks[task].eList.length;
  420. }
  421. if (_tasks[task].toolChoose[0].tool.length > 0) {
  422. toolC2 += _tasks[task].toolChoose.length;
  423. }
  424. fontC2 += _tasks[task].task.length;
  425. fontC2 += _tasks[task].taskDetail
  426. .replace(/<[^<>]+>/g, "")
  427. .replace(/&nbsp;/gi, "").length;
  428. let _tools = _tasks[task].toolChoose;
  429. for (var tool = 0; tool < _tools.length; tool++) {
  430. fontC2 += _tools[tool].toolDetail.length;
  431. }
  432. }
  433. if (_res[i]["jd" + (k + 1)]) {
  434. _res[i]["jd" + (k + 1)].taskC += taskC2;
  435. _res[i]["jd" + (k + 1)].toolC += toolC2;
  436. _res[i]["jd" + (k + 1)].evalC += evalC2;
  437. _res[i]["jd" + (k + 1)].fontC += fontC2;
  438. } else {
  439. _res[i]["jd" + (k + 1)] = {};
  440. _res[i]["jd" + (k + 1)].taskC = taskC2;
  441. _res[i]["jd" + (k + 1)].toolC = toolC2;
  442. _res[i]["jd" + (k + 1)].evalC = evalC2;
  443. _res[i]["jd" + (k + 1)].fontC = fontC2;
  444. }
  445. taskC += taskC2;
  446. toolC += toolC2;
  447. evalC += evalC2;
  448. fontC += fontC2;
  449. }
  450. }
  451. _res[i]["jdz"] = {};
  452. _res[i]["jdz"].taskC = taskC;
  453. _res[i]["jdz"].toolC = toolC;
  454. _res[i]["jdz"].evalC = evalC;
  455. _res[i]["jdz"].fontC = fontC;
  456. _res[i].course = course;
  457. }
  458. }
  459. if (this.search) {
  460. _res = _res.filter((a) => {
  461. return (
  462. a.school.indexOf(this.search) != -1 ||
  463. a.username.indexOf(this.search) != -1
  464. );
  465. });
  466. }
  467. if (this.choose == "school") {
  468. let array = _res.sort(function (a, b) {
  469. return a.school.localeCompare(b.school);
  470. });
  471. this.tableData = array;
  472. } else if (this.choose == "task") {
  473. let array = _res.sort(function (a, b) {
  474. // return a.jdz.taskC - b.jdz.taskC;
  475. return b.jdz.taskC - a.jdz.taskC;
  476. });
  477. this.tableData = array;
  478. } else if (this.choose == "font") {
  479. let array = _res.sort(function (a, b) {
  480. // return a.jdz.fontC - b.jdz.fontC;
  481. return b.jdz.fontC - a.jdz.fontC;
  482. });
  483. this.tableData = array;
  484. } else if (this.choose == "eval") {
  485. let array = _res.sort(function (a, b) {
  486. // return a.jdz.fontC - b.jdz.fontC;
  487. return b.jdz.evalC - a.jdz.evalC;
  488. });
  489. this.tableData = array;
  490. } else if (this.choose == "tool") {
  491. let array = _res.sort(function (a, b) {
  492. // return a.jdz.fontC - b.jdz.fontC;
  493. return b.jdz.toolC - a.jdz.toolC;
  494. });
  495. this.tableData = array;
  496. } else {
  497. this.tableData = _res;
  498. }
  499. })
  500. .catch((err) => {
  501. this.isLoading = false;
  502. console.error(err);
  503. });
  504. },
  505. getAll(res) {
  506. this.data = res;
  507. let a = Object.keys(res);
  508. a = a.filter((el) => {
  509. return el.indexOf("jd") != -1 && el != "jdz";
  510. });
  511. this.dataArray = a;
  512. this.dialogVisible = true;
  513. },
  514. },
  515. beforeDestroy() {
  516. clearInterval(this.timer);
  517. this.timer = null;
  518. },
  519. mounted() {
  520. this.isLoading = true;
  521. this.getData();
  522. this.timer = setInterval(() => {
  523. this.getData();
  524. }, 5000);
  525. },
  526. };
  527. </script>
  528. <style scoped>
  529. .student_input {
  530. width: 190px;
  531. font-size: 13px;
  532. padding: 0 10px;
  533. }
  534. .cd_body {
  535. height: 100%;
  536. width: 100%;
  537. }
  538. .pb_head {
  539. margin: 0 !important;
  540. width: 100% !important;
  541. display: flex;
  542. align-items: center;
  543. }
  544. .student_head {
  545. margin-top: 10px;
  546. padding-bottom: 10px;
  547. display: flex;
  548. justify-content: space-between;
  549. }
  550. .head_left {
  551. display: flex;
  552. align-items: center;
  553. }
  554. .cd_title span {
  555. font-size: 25px;
  556. font-weight: 700;
  557. }
  558. .cd_table {
  559. width: 95%;
  560. margin: 0 auto;
  561. padding: 0 0 10px;
  562. }
  563. .el-table >>> .even_row {
  564. background-color: #f1f1f1 !important;
  565. }
  566. .dialog_diy >>> .el-dialog {
  567. background: #fafafa;
  568. }
  569. .dialog_diy >>> .el-dialog__header {
  570. background: #454545 !important;
  571. padding: 15px 20px;
  572. }
  573. .dialog_diy >>> .el-dialog__body,
  574. .dialog_diy >>> .el-dialog__footer {
  575. background: rgb(184, 181, 202);
  576. }
  577. .dialog_diy >>> .el-dialog__body {
  578. padding: 30px 10px;
  579. }
  580. .dialog_diy >>> .el-dialog__title {
  581. color: #fff;
  582. }
  583. .dialog_diy >>> .el-dialog__headerbtn {
  584. top: 19px;
  585. }
  586. .dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
  587. color: #fff;
  588. }
  589. .dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
  590. color: #fff;
  591. }
  592. .cd_d_box {
  593. font-size: 16px;
  594. }
  595. .cd_d_box + .cd_d_box {
  596. margin-top: 10px;
  597. }
  598. .cd_d_jd {
  599. display: flex;
  600. flex-wrap: wrap;
  601. margin-top: 10px;
  602. background: #fff;
  603. padding: 10px 15px 25px;
  604. box-sizing: border-box;
  605. }
  606. .cd_d_jd2 {
  607. background: #fff;
  608. padding: 10px 15px;
  609. box-sizing: border-box;
  610. }
  611. .cd_d_jd_box {
  612. width: 100px;
  613. display: flex;
  614. flex-direction: column;
  615. align-items: center;
  616. /* background: #eee; */
  617. border-radius: 5px;
  618. margin: 10px 14px 0 0;
  619. }
  620. .cd_d_jd_box {
  621. }
  622. .cd_d_jd_content {
  623. width: 100px;
  624. display: flex;
  625. flex-direction: column;
  626. align-items: center;
  627. background: #eee;
  628. border-radius: 5px;
  629. padding: 5px 0;
  630. }
  631. .cd_d_jd_content div + div {
  632. margin-top: 5px;
  633. }
  634. .cd_d_jd_content div span + span {
  635. margin-left: 5px;
  636. }
  637. .cd_d_jd_name {
  638. margin-bottom: 5px;
  639. color: #222;
  640. }
  641. .cd_d_span div:nth-child(1) span:nth-child(1) {
  642. color: rgb(147, 125, 223);
  643. }
  644. .cd_d_span div:nth-child(2) span:nth-child(1) {
  645. color: #fe3987;
  646. }
  647. .cd_d_span div:nth-child(3) span:nth-child(1) {
  648. color: #10bb6e;
  649. }
  650. .cd_d_span div:nth-child(4) span:nth-child(1) {
  651. color: rgb(147, 125, 223);
  652. }
  653. .cd_d_span div span:nth-child(1) {
  654. margin-right: 5px;
  655. }
  656. .cd_course {
  657. cursor: pointer;
  658. width: 100%;
  659. display: flex;
  660. }
  661. .cd_course span {
  662. width: 100%;
  663. white-space: nowrap;
  664. overflow: hidden;
  665. text-overflow: ellipsis;
  666. }
  667. .table >>> .cell {
  668. padding: 0px 3px !important;
  669. }
  670. /* .table >>> .el-table .cell, .table >>> .el-table--border td:first-child .cell, .table >>> .el-table--border th:first-child .cell{
  671. padding: 0 3px;
  672. } */
  673. </style>