Project.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  1. <template>
  2. <section class="content">
  3. <div class="box box-info">
  4. <div
  5. class="box-body"
  6. v-loading.body="loading"
  7. v-loading.fullscreen="loading"
  8. element-loading-text="请稍后..."
  9. >
  10. <!-- 表单 -->
  11. <el-form inline :model="formSearch">
  12. <el-form-item label="项目名称">
  13. <el-input
  14. placeholder="请输入项目名称"
  15. v-model="formSearch.name"
  16. style="width: 180px"
  17. />
  18. </el-form-item>
  19. <el-form-item label="分析类型">
  20. <el-select
  21. v-model="formSearch.analyseType"
  22. :clearable="true"
  23. class="input"
  24. >
  25. <el-option label="单项分析" value="SINGLE"> </el-option>
  26. <el-option label="趋势分析" value="TREND"> </el-option>
  27. </el-select>
  28. </el-form-item>
  29. <el-form-item label="数据来源">
  30. <el-select
  31. v-model="formSearch.dataOrigin"
  32. :clearable="true"
  33. class="input"
  34. >
  35. <el-option label="同步" value="SYNC"> </el-option>
  36. <el-option label="导入" value="IMPORT"> </el-option>
  37. </el-select>
  38. </el-form-item>
  39. <el-form-item>
  40. <el-button
  41. size="small"
  42. type="primary"
  43. icon="el-icon-search"
  44. @click="handleSearchBtn"
  45. >
  46. 查询
  47. </el-button>
  48. </el-form-item>
  49. <el-form-item>
  50. <el-button
  51. size="small"
  52. type="primary"
  53. icon="el-icon-plus"
  54. @click="openAddDialog"
  55. >
  56. 新增
  57. </el-button>
  58. <el-button
  59. size="small"
  60. type="success"
  61. icon="el-icon-check"
  62. :disabled="noBatchSelected"
  63. @click="enable('')"
  64. >启用
  65. </el-button>
  66. <el-button
  67. size="small"
  68. type="danger"
  69. icon="el-icon-close"
  70. :disabled="noBatchSelected"
  71. @click="disable('')"
  72. >
  73. 禁用
  74. </el-button>
  75. </el-form-item>
  76. </el-form>
  77. <div class="block-seperator"></div>
  78. <!-- 页面列表 -->
  79. <el-table
  80. :data="tableData"
  81. border
  82. resizable
  83. stripe
  84. @selection-change="selectChange"
  85. style="width: 100%;"
  86. >
  87. <el-table-column type="selection" width="50"></el-table-column>
  88. <el-table-column width="50" label="ID">
  89. <span slot-scope="scope">{{ scope.row.id }}</span>
  90. </el-table-column>
  91. <el-table-column width="120" prop="name" label="项目名称">
  92. </el-table-column>
  93. <el-table-column width="100" prop="analyseTypeName" label="分析类型">
  94. </el-table-column>
  95. <el-table-column width="100" prop="dataOriginName" label="数据来源">
  96. </el-table-column>
  97. <el-table-column width="100" prop="sampleCount" label="样本数量">
  98. </el-table-column>
  99. <el-table-column width="100" prop="reportStatusName" label="项目状态">
  100. </el-table-column>
  101. <el-table-column prop="remarks" label="备注说明"> </el-table-column>
  102. <el-table-column width="50" label="状态">
  103. <span slot-scope="scope">
  104. <span v-if="scope.row.enable">
  105. <el-tooltip
  106. class="item"
  107. effect="dark"
  108. content="启用"
  109. placement="left"
  110. >
  111. <i class="el-icon-success" style="color:green;"></i>
  112. </el-tooltip>
  113. </span>
  114. <span v-else>
  115. <el-tooltip
  116. class="item"
  117. effect="dark"
  118. content="禁用"
  119. placement="left"
  120. >
  121. <i class="el-icon-error" style="color:red;"></i>
  122. </el-tooltip>
  123. </span>
  124. </span>
  125. </el-table-column>
  126. <el-table-column :context="_self" label="操作" width="270">
  127. <div slot-scope="scope">
  128. <el-button
  129. size="mini"
  130. type="primary"
  131. plain
  132. @click="openEdtDialog(scope.row)"
  133. >
  134. <i class="el-icon-edit"></i> 修改
  135. </el-button>
  136. <el-button
  137. size="mini"
  138. type="danger"
  139. plain
  140. @click="deleteProject(scope.row)"
  141. >
  142. <i class="el-icon-delete"></i> 删除
  143. </el-button>
  144. <el-button
  145. v-if="!scope.row.enable"
  146. size="mini"
  147. plain
  148. type="primary"
  149. icon="el-icon-check"
  150. @click="enable(scope.row)"
  151. >
  152. <i class="fa fa-check" aria-hidden="true"></i>启用
  153. </el-button>
  154. <el-button
  155. v-else-if="scope.row.enable"
  156. size="mini"
  157. type="danger"
  158. icon="el-icon-close"
  159. @click="disable(scope.row)"
  160. >
  161. <i class="fa fa-close" aria-hidden="true"></i>禁用
  162. </el-button>
  163. </div>
  164. </el-table-column>
  165. </el-table>
  166. <div class="page pull-right">
  167. <el-pagination
  168. v-if="paginationShow"
  169. @current-change="handleCurrentChange"
  170. :current-page="currentPage"
  171. :page-size="pageSize"
  172. :page-sizes="[10, 20, 50, 100, 200, 300]"
  173. @size-change="handleSizeChange"
  174. layout="total, sizes, prev, pager, next, jumper"
  175. :total="total"
  176. />
  177. </div>
  178. </div>
  179. <el-dialog
  180. :title="this.getTitle()"
  181. width="500px"
  182. :visible.sync="model"
  183. :close-on-click-modal="false"
  184. @close="closeModel"
  185. >
  186. <el-form
  187. :inline="true"
  188. :model="projectForm"
  189. ref="projectForm"
  190. :rules="rules"
  191. label-width="90px"
  192. :key="modelKey"
  193. class="editForm"
  194. >
  195. <el-row>
  196. <el-form-item label="项目名称" prop="name" class="form-item">
  197. <el-input
  198. class="pull-length"
  199. v-model="projectForm.name"
  200. maxlength="50"
  201. />
  202. </el-form-item>
  203. </el-row>
  204. <el-row>
  205. <el-form-item label="分析类型" prop="analyseType" class="form-item">
  206. <el-select
  207. v-model="projectForm.analyseType"
  208. :clearable="true"
  209. class="input"
  210. :disabled="this.isEdit()"
  211. >
  212. <el-option label="单项分析" value="SINGLE"> </el-option>
  213. <el-option label="趋势分析" value="TREND"> </el-option>
  214. </el-select>
  215. </el-form-item>
  216. </el-row>
  217. <el-row>
  218. <el-form-item label="数据来源" prop="dataOrigin" class="form-item">
  219. <el-select
  220. v-model="projectForm.dataOrigin"
  221. :clearable="true"
  222. class="input"
  223. :disabled="this.isEdit()"
  224. >
  225. <el-option label="同步" value="SYNC"> </el-option>
  226. <el-option label="导入" value="IMPORT"> </el-option>
  227. </el-select>
  228. </el-form-item>
  229. </el-row>
  230. <el-row v-if="projectForm.dataOrigin == 'IMPORT'">
  231. <el-form-item label="样本数量" prop="sampleCount" class="form-item">
  232. <el-input
  233. class="pull-length"
  234. v-model="projectForm.sampleCount"
  235. :disabled="this.isEdit()"
  236. maxlength="3"
  237. />
  238. </el-form-item>
  239. </el-row>
  240. <el-row v-if="projectForm.dataOrigin == 'SYNC'">
  241. <el-form-item label="选择考试" prop="examIds" class="form-item">
  242. <el-select
  243. class="input"
  244. ref="select"
  245. v-model="projectForm.examIds"
  246. clearable
  247. filterable
  248. multiple
  249. :loading="loading"
  250. :disabled="this.isEdit()"
  251. >
  252. <el-option
  253. v-for="item in this.examList"
  254. :value="item.id"
  255. :key="item.id"
  256. :label="item.name"
  257. >
  258. </el-option>
  259. </el-select>
  260. </el-form-item>
  261. </el-row>
  262. <el-row>
  263. <el-form-item label="备注说明" prop="remarks" class="form-item">
  264. <el-input
  265. class="pull-length"
  266. v-model="projectForm.remarks"
  267. maxlength="255"
  268. />
  269. </el-form-item>
  270. </el-row>
  271. <el-row class="pull-center">
  272. <el-button
  273. type="primary"
  274. @click="sub"
  275. :loading="this.projectForm.loading"
  276. >确定</el-button
  277. >
  278. <el-button @click="closeModel">取消</el-button>
  279. </el-row>
  280. </el-form>
  281. </el-dialog>
  282. </div>
  283. </section>
  284. </template>
  285. <script>
  286. import { REPORTS_API } from "@/constants/constants.js";
  287. import { mapState } from "vuex";
  288. export default {
  289. name: "Project",
  290. data() {
  291. return {
  292. examList: [],
  293. examSelectloading: false,
  294. loading: false,
  295. selectedIds: [],
  296. analyseTypeList: [
  297. {
  298. value: "SINGLE",
  299. label: "单项分析"
  300. },
  301. {
  302. value: "TREND",
  303. label: "趋势分析"
  304. }
  305. ],
  306. model: false,
  307. modelKey: Math.random(),
  308. paginationShow: false,
  309. formSearch: {
  310. analyseType: "",
  311. dataOrigin: "",
  312. name: ""
  313. },
  314. projectForm: {
  315. id: null,
  316. name: "",
  317. analyseType: "",
  318. dataOrigin: "",
  319. sampleCount: null,
  320. examIds: [],
  321. loading: false
  322. },
  323. tableData: [],
  324. currentPage: 1,
  325. pageSize: 10,
  326. total: 10,
  327. rules: {
  328. name: [
  329. { required: true, message: "请输入项目名称", trigger: "change" }
  330. ],
  331. analyseType: [
  332. { required: true, message: "请选择分析类型", trigger: "change" }
  333. ],
  334. dataOrigin: [
  335. { required: true, message: "请选择数据来源", trigger: "change" }
  336. ],
  337. sampleCount: [
  338. { required: true, message: "请输入样本数量", trigger: "change" },
  339. {
  340. pattern: /^[1-5]{1}$/,
  341. message: "样本数量必须为1-5的整数",
  342. trigger: "change"
  343. }
  344. ],
  345. examIds: [
  346. {
  347. required: true,
  348. type: "array",
  349. message: "请选择考试",
  350. trigger: "change"
  351. }
  352. ]
  353. }
  354. };
  355. },
  356. computed: {
  357. ...mapState({ user: state => state.user }),
  358. ids() {
  359. var ids = "";
  360. for (let id of this.selectedIds) {
  361. if (!ids) {
  362. ids += id;
  363. } else {
  364. ids += "," + id;
  365. }
  366. }
  367. return ids;
  368. },
  369. noBatchSelected() {
  370. return this.selectedIds.length === 0;
  371. },
  372. isSuperAdmin() {
  373. return this.user.roleList.some(role => role.roleCode == "SUPER_ADMIN");
  374. }
  375. },
  376. methods: {
  377. getStatus() {
  378. let doingIds = this.getDoingId();
  379. if (doingIds != "") {
  380. this.$httpWithoutBar
  381. .get(REPORTS_API + "/project/getProjectList?ids=" + doingIds)
  382. .then(response => {
  383. response.data.forEach(element => {
  384. this.tableData.forEach(e => {
  385. if (e.id == element.id) {
  386. e.reportStatus = element.reportStatus;
  387. e.reportStatusName = element.reportStatusName;
  388. }
  389. });
  390. });
  391. setTimeout(() => {
  392. this.getStatus();
  393. }, 5000);
  394. });
  395. }
  396. },
  397. getDoingId() {
  398. var tempData = [];
  399. this.tableData.forEach(element => {
  400. if (
  401. element.reportStatus == "WAITCOMPUTE" ||
  402. element.reportStatus == "COMPUTING"
  403. ) {
  404. tempData.push(element.id);
  405. }
  406. });
  407. return tempData.join(",");
  408. },
  409. deleteProject(row) {
  410. this.$confirm("确定删除?", "提示", {
  411. confirmButtonText: "确定",
  412. cancelButtonText: "取消",
  413. type: "warning"
  414. }).then(() => {
  415. var url = REPORTS_API + "/project/" + row.id;
  416. this.$httpWithMsg.delete(url).then(() => {
  417. this.$notify({
  418. type: "success",
  419. message: "删除成功!"
  420. });
  421. this.searchForm();
  422. });
  423. });
  424. },
  425. async examSearch() {
  426. this.$http.get(REPORTS_API + "/project/allExam").then(response => {
  427. this.examList = response.data;
  428. });
  429. },
  430. getTitle() {
  431. if (this.projectForm.id) {
  432. return "修改项目";
  433. } else {
  434. return "新增项目";
  435. }
  436. },
  437. isEdit() {
  438. if (this.projectForm.id) {
  439. return true;
  440. } else {
  441. return false;
  442. }
  443. },
  444. //禁用
  445. disable(row) {
  446. var ids = this.checkIds(row);
  447. if (!ids) return;
  448. this.$confirm("是否禁用所选项目?", "提示", {
  449. confirmButtonText: "确定",
  450. cancelButtonText: "取消",
  451. type: "warning"
  452. }).then(() => {
  453. var url = REPORTS_API + "/project/disable?ids=" + ids;
  454. this.$httpWithMsg.put(url).then(() => {
  455. this.$notify({
  456. type: "success",
  457. message: "禁用成功"
  458. });
  459. this.searchForm();
  460. });
  461. });
  462. },
  463. //启用
  464. enable(row) {
  465. var ids = this.checkIds(row);
  466. if (!ids) return;
  467. this.$confirm("是否启用所选项目?", "提示", {
  468. confirmButtonText: "确定",
  469. cancelButtonText: "取消",
  470. type: "warning"
  471. }).then(() => {
  472. var url = REPORTS_API + "/project/enable?ids=" + ids;
  473. this.$httpWithMsg.put(url).then(() => {
  474. this.$notify({
  475. type: "success",
  476. message: "启用成功"
  477. });
  478. this.searchForm();
  479. });
  480. });
  481. },
  482. checkIds(row) {
  483. if (row) {
  484. return row.id;
  485. } else {
  486. if (this.ids.length == 0) {
  487. this.$notify({
  488. type: "warning",
  489. message: "请选择项目"
  490. });
  491. return "";
  492. } else {
  493. return this.ids;
  494. }
  495. }
  496. },
  497. selectChange(row) {
  498. this.selectedIds = [];
  499. row.forEach(element => {
  500. this.selectedIds.push(element.id);
  501. });
  502. },
  503. openAddDialog() {
  504. this.projectForm = Object.assign({});
  505. this.modelKey = Math.random();
  506. this.model = true;
  507. },
  508. openEdtDialog(row) {
  509. this.modelKey = Math.random();
  510. this.projectForm = Object.assign({}, row);
  511. this.model = true;
  512. },
  513. async sub() {
  514. const res = await this.$refs.projectForm.validate();
  515. if (res === false) {
  516. return;
  517. }
  518. this.projectForm.loading = true;
  519. if (this.projectForm.id) {
  520. let url = REPORTS_API + "/project/update";
  521. this.$httpWithMsg
  522. .post(url, this.projectForm)
  523. .then(() => {
  524. this.$notify({
  525. type: "success",
  526. message: "修改成功!"
  527. });
  528. this.closeModel();
  529. this.searchForm();
  530. })
  531. .finally(() => (this.projectForm.loading = false));
  532. } else {
  533. let url = REPORTS_API + "/project/add";
  534. this.$httpWithMsg
  535. .post(url, this.projectForm)
  536. .then(() => {
  537. this.$notify({
  538. type: "success",
  539. message: "保存成功!"
  540. });
  541. this.closeModel();
  542. this.searchForm();
  543. })
  544. .finally(() => (this.projectForm.loading = false));
  545. }
  546. },
  547. closeModel() {
  548. this.model = false;
  549. this.$refs.projectForm.resetFields();
  550. this.modelKey = Math.random();
  551. },
  552. handleSearchBtn() {
  553. this.currentPage = 1;
  554. this.searchForm();
  555. },
  556. handleSizeChange(val) {
  557. this.pageSize = val;
  558. this.currentPage = 1;
  559. this.searchForm();
  560. },
  561. handleCurrentChange(val) {
  562. this.currentPage = val;
  563. this.searchForm();
  564. },
  565. //查询
  566. searchForm() {
  567. this.loading = true;
  568. var url =
  569. REPORTS_API + "/project/page/" + this.currentPage + "/" + this.pageSize;
  570. this.$httpWithMsg
  571. .get(url, { params: this.formSearch })
  572. .then(response => {
  573. this.tableData = response.data.list;
  574. this.total = response.data.total;
  575. this.loading = false;
  576. this.$nextTick(function() {
  577. this.paginationShow = true;
  578. });
  579. this.getStatus();
  580. })
  581. .finally(() => (this.loading = false));
  582. },
  583. init() {
  584. this.searchForm();
  585. this.examSearch();
  586. }
  587. },
  588. //初始化查询
  589. created() {
  590. this.init();
  591. }
  592. };
  593. </script>
  594. <style scoped>
  595. .page {
  596. margin-top: 10px;
  597. }
  598. .pull-length {
  599. width: 300px;
  600. }
  601. .pull-center {
  602. margin-top: 20px;
  603. }
  604. .editForm .el-form-item {
  605. margin-bottom: 12px;
  606. }
  607. </style>