index.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. <template>
  2. <div class="app-container">
  3. <el-row :gutter="10">
  4. <!-- <el-col :span="4" :xs="24">
  5. <org-tree v-model="queryParams.orgId" @defaultOrg="getDefaultOrg" @checkChange="checkChange"
  6. @click="clickTreeNode"></org-tree>
  7. </el-col> -->
  8. <el-col :span="24" :xs="24">
  9. <div class="main-right-box">
  10. <div class="main-search-box">
  11. <el-form
  12. :model="queryParams"
  13. ref="queryForm"
  14. size="small"
  15. :inline="true"
  16. v-show="showSearch"
  17. >
  18. <el-form-item label="演练机构">
  19. <org-tree
  20. v-model="queryParams.orgId"
  21. @defaultOrg="getDefaultOrg"
  22. @checkChange="checkChange"
  23. @click="clickTreeNode"
  24. ></org-tree>
  25. </el-form-item>
  26. <el-form-item label="任务名称" prop="title">
  27. <el-input
  28. v-model="queryParams.title"
  29. placeholder="请输入关键字"
  30. clearable
  31. />
  32. </el-form-item>
  33. <el-form-item label="演练项目" prop="type">
  34. <el-select
  35. v-model="queryParams.type"
  36. placeholder="请选择演练项目"
  37. clearable
  38. >
  39. <el-option
  40. v-for="dict in dict.type.core_drill_type"
  41. :key="dict.value"
  42. :label="dict.label"
  43. :value="dict.value"
  44. />
  45. </el-select>
  46. </el-form-item>
  47. <el-form-item label="任务进度" prop="status">
  48. <el-select
  49. v-model="queryParams.status"
  50. placeholder="请选择任务进度"
  51. clearable
  52. >
  53. <el-option
  54. v-for="dict in getTaskStatus()"
  55. :key="dict.value"
  56. :label="dict.label"
  57. :value="parseInt(dict.value)"
  58. />
  59. </el-select>
  60. </el-form-item>
  61. <!-- <el-form-item label="任务时间" prop="rangen">
  62. <el-date-picker
  63. v-model="queryParams.range"
  64. type="daterange"
  65. value-format="yyyy-MM-dd"
  66. placeholder="请选择开始日期">
  67. </el-date-picker>
  68. </el-form-item> -->
  69. <el-form-item class="searchTitle" prop="rangen" label="任务时间">
  70. <DataRangePicker
  71. v-model="queryParams.range"
  72. key="daterange"
  73. type="daterange"
  74. :clearable="timeClearable"
  75. />
  76. </el-form-item>
  77. <!-- <el-form-item>
  78. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  79. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  80. </el-form-item> -->
  81. </el-form>
  82. <el-row :gutter="10" class="mb8">
  83. <el-col :span="1.5">
  84. <el-button
  85. type="primary"
  86. icon="el-icon-search"
  87. size="mini"
  88. @click="handleQuery"
  89. >搜索
  90. </el-button
  91. >
  92. </el-col>
  93. <el-col :span="1.5">
  94. <el-button
  95. type="primary"
  96. icon="el-icon-refresh"
  97. size="mini"
  98. @click="resetQuery"
  99. >重置
  100. </el-button
  101. >
  102. </el-col>
  103. <el-col :span="1.5">
  104. <el-button
  105. type="primary"
  106. icon="el-icon-plus"
  107. size="mini"
  108. @click="handleAddTask"
  109. >临时登记
  110. </el-button>
  111. </el-col>
  112. <el-col :span="1.5">
  113. <el-button
  114. type="primary"
  115. icon="el-icon-download"
  116. size="mini"
  117. @click="handleExport"
  118. >导出数据
  119. </el-button>
  120. </el-col>
  121. <right-toolbar
  122. :showSearch.sync="showSearch"
  123. @queryTable="getList"
  124. ></right-toolbar>
  125. </el-row>
  126. </div>
  127. <el-table
  128. border
  129. height="646"
  130. v-loading="loading"
  131. :data="eduTaskList"
  132. @selection-change="handleSelectionChange"
  133. >
  134. <el-table-column
  135. label="序号"
  136. type="index"
  137. align="center"
  138. width="60"
  139. />
  140. <el-table-column
  141. label="任务名称"
  142. align="left"
  143. header-align="center"
  144. prop="title"
  145. />
  146. <el-table-column
  147. label="演练机构"
  148. width="200"
  149. align="left"
  150. header-align="center"
  151. prop="orgName"
  152. />
  153. <!-- <el-table-column label="演练角色" align="center">
  154. <template slot-scope="scope">
  155. <template v-if="scope.row.taskRoleNameList ">
  156. <el-tag size="mini" type="success"
  157. v-for="(item, index) in (scope.row.taskRoleNameList || '').split(',')"
  158. :key="index">
  159. {{ item }}
  160. </el-tag>
  161. </template>
  162. </template>
  163. </el-table-column>-->
  164. <el-table-column
  165. label="演练项目"
  166. width="200"
  167. align="left"
  168. header-align="center"
  169. prop="type"
  170. >
  171. <template slot-scope="scope">
  172. <dict-tag
  173. :options="dict.type.core_drill_type"
  174. :value="scope.row.type"
  175. />
  176. </template>
  177. </el-table-column>
  178. <el-table-column
  179. label="任务进度"
  180. width="100"
  181. align="center"
  182. header-align="center"
  183. prop="status"
  184. >
  185. <template slot-scope="scope">
  186. <dict-tag
  187. :options="dict.type.drill_task_status"
  188. :value="scope.row.status"
  189. />
  190. </template>
  191. </el-table-column>
  192. <el-table-column label="任务时间" align="center" width="300">
  193. <template slot-scope="scope">
  194. {{
  195. scope.row.startDate
  196. ? dayjs(scope.row.startDate).format("YYYY年MM月DD日") +
  197. " ~ " +
  198. dayjs(scope.row.endDate).format("YYYY年MM月DD日")
  199. : ""
  200. }}
  201. </template>
  202. </el-table-column>
  203. <!-- <el-table-column label="开始日期" align="center" prop="startDate" width="180">
  204. </el-table-column>
  205. <el-table-column label="截止日期" align="center" prop="endDate" width="180">
  206. </el-table-column>
  207. <el-table-column label="指挥人" align="center" prop="hostName"/>
  208. <el-table-column label="演练地点" align="center" prop="drillSite"/>-->
  209. <!-- <el-table-column label="演练时间" align="center" width="300">
  210. <template slot-scope="scope">
  211. {{scope.row.drillStartTime? dayjs(scope.row.drillStartTime).format("YYYY-MM-DD HH:MM") +" ~ "+dayjs(scope.row.drillEndTime).format("YYYY-MM-DD HH:MM"):''}}
  212. </template>
  213. </el-table-column> -->
  214. <!-- <el-table-column label="评分" align="center" prop="commentScore"/>
  215. <el-table-column scoped-slot="comment" align="center" prop="comment" label="评语">
  216. <template slot-scope="scope">
  217. <div class="ellipsis" :title="scope.row.comment">{{ scope.row.comment }}</div>
  218. </template>
  219. </el-table-column>-->
  220. <el-table-column
  221. label="操作"
  222. align="left"
  223. header-align="center"
  224. class-name="small-padding fixed-width"
  225. width="380"
  226. >
  227. <template slot-scope="scope">
  228. <el-button
  229. size="mini"
  230. type="text"
  231. icon="el-icon-view"
  232. @click="handleDetail(scope.row.id)"
  233. v-hasPermi="['core:drillTask:query']"
  234. >详情
  235. </el-button>
  236. <el-button
  237. size="mini"
  238. type="text"
  239. icon="el-icon-document-add"
  240. v-if="canEvaluate(scope.row)"
  241. @click="handleEvaluate(scope.row.id)"
  242. v-hasPermi="['core:drillTask:evaluate']"
  243. >评价
  244. </el-button>
  245. <el-button
  246. size="mini"
  247. type="text"
  248. icon="el-icon-document-add"
  249. v-if="canPerform(scope.row)"
  250. @click="handleRecorded(scope.row.id)"
  251. v-hasPermi="['core:drillTask:edit']"
  252. >任务登记
  253. </el-button>
  254. <el-button
  255. size="mini"
  256. type="text"
  257. icon="el-icon-delete"
  258. v-if="canDelete(scope.row)"
  259. @click="handleDelete(scope.row.id)"
  260. v-hasPermi="['core:drillTask:remove']"
  261. >删除
  262. </el-button>
  263. <el-button
  264. size="mini"
  265. type="text"
  266. icon="el-icon-document"
  267. v-if="scope.row.pdfUrl"
  268. @click="onDown(scope.row.pdfUrl)"
  269. >演练登记簿
  270. </el-button>
  271. </template>
  272. </el-table-column>
  273. </el-table>
  274. <pagination
  275. v-show="total > 0"
  276. :total="total"
  277. :page.sync="queryParams.pageNum"
  278. :limit.sync="queryParams.pageSize"
  279. @pagination="getList"
  280. />
  281. </div>
  282. </el-col>
  283. </el-row>
  284. <dialog-info ref="infoDialog" @success="handleQuery(true)"></dialog-info>
  285. <dialog-perform
  286. ref="performDialog"
  287. @success="handleQuery(true)"
  288. ></dialog-perform>
  289. <dialog-new-task
  290. ref="newTaskDialog"
  291. @success="handleQuery(true)"
  292. ></dialog-new-task>
  293. <dialog-evaluate
  294. ref="evaluateDialog"
  295. @success="handleQuery(true)"
  296. ></dialog-evaluate>
  297. </div>
  298. </template>
  299. <script>
  300. import {listDrillTask, delDrillTask} from "@/api/core/drill/drillTask";
  301. import DataRangePicker from "@/components/dateTime/daterange.picker.vue";
  302. import OrgTree from "@/components/orgTree/orgQuerySelector.vue";
  303. import DialogInfo from "./dialog.info";
  304. import DialogPerform from "./dialog.perform";
  305. import DialogNewTask from "./dialog.newtask";
  306. import DialogEvaluate from "./dialog.evaluate";
  307. import dayjs from "dayjs";
  308. import {publishPlan} from "@/api/core/edu/plan";
  309. import {delDrillDictionary} from "@/api/core/drill/drillDictionary";
  310. import {delEduTask} from "@/api/core/edu/eduTask";
  311. export default {
  312. name: "EduTask",
  313. dicts: ["drill_task_status", "core_drill_type"],
  314. components: {
  315. DialogInfo,
  316. DialogPerform,
  317. DialogNewTask,
  318. DialogEvaluate,
  319. OrgTree,
  320. dayjs,
  321. DataRangePicker,
  322. },
  323. data() {
  324. return {
  325. // 遮罩层
  326. loading: true,
  327. // 选中数组
  328. ids: [],
  329. // 非单个停用
  330. single: true,
  331. // 非多个停用
  332. multiple: true,
  333. // 显示搜索条件
  334. showSearch: true,
  335. // 总条数
  336. total: 0,
  337. // 教育任务表格数据
  338. eduTaskList: [],
  339. timeClearable: true,
  340. // 弹出层标题
  341. title: "",
  342. // 是否显示弹出层
  343. open: false,
  344. // 查询参数
  345. queryParams: {
  346. pageNum: 1,
  347. pageSize: 10,
  348. checkSub: true,
  349. title: null,
  350. orgId: this.$store.getters.orgId,
  351. type: null,
  352. status: null,
  353. range: null,
  354. },
  355. // 表单参数
  356. form: {},
  357. // 表单校验
  358. rules: {
  359. orgId: [{required: true, message: "机构不能为空", trigger: "blur"}],
  360. },
  361. selectedOrgName: null,
  362. };
  363. },
  364. created() {
  365. this.getList();
  366. this.getTaskStatus();
  367. },
  368. computed: {
  369. },
  370. methods: {
  371. dayjs,
  372. /** 查询教育任务列表 */
  373. getList() {
  374. this.loading = true;
  375. listDrillTask(this.queryParams).then((response) => {
  376. this.eduTaskList = response.rows;
  377. this.total = response.total;
  378. this.loading = false;
  379. });
  380. },
  381. getTaskStatus() {
  382. if (this.$store.getters.orgType != 4) {
  383. return this.dict.type.drill_task_status;
  384. }
  385. let tempArray = [];
  386. this.dict.type.drill_task_status.forEach((x) => {
  387. if (Number(x.value) != 2) {
  388. tempArray.push(x);
  389. }
  390. });
  391. return tempArray;
  392. },
  393. // 取消按钮
  394. cancel() {
  395. this.open = false;
  396. this.reset();
  397. },
  398. // 表单重置
  399. reset() {
  400. this.form = {
  401. range: [],
  402. title: null,
  403. type: null,
  404. status: null,
  405. checkSub: true,
  406. };
  407. this.resetForm("form");
  408. },
  409. /** 搜索按钮操作 */
  410. handleQuery() {
  411. console.log('11111111111')
  412. this.queryParams.pageNum = 1;
  413. this.getList();
  414. },
  415. /** 重置按钮操作 */
  416. resetQuery() {
  417. this.clearQueryForm();
  418. this.handleQuery();
  419. },
  420. clearQueryForm() {
  421. this.queryParams.title = null;
  422. this.queryParams.type = null;
  423. this.queryParams.status = null;
  424. this.queryParams.range = [];
  425. },
  426. //单选框状态改变
  427. checkChange(state) {
  428. this.queryParams.checkSub = state;
  429. this.handleQuery();
  430. },
  431. getDefaultOrg(org) {
  432. this.queryParams.orgId = org.id;
  433. this.selectedOrgName = org.shortName;
  434. this.getList();
  435. },
  436. // 节点单击事件
  437. clickTreeNode(data) {
  438. this.queryParams.orgId = data.id;
  439. this.selectedOrgName = data.shortName;
  440. this.handleQuery();
  441. },
  442. // 多选框选中数据
  443. handleSelectionChange(selection) {
  444. this.ids = selection.map((item) => item.id);
  445. this.single = selection.length !== 1;
  446. this.multiple = !selection.length;
  447. },
  448. /** 新增按钮操作 */
  449. // handleAdd() {
  450. // this.reset();
  451. // this.open = true;
  452. // this.title = "添加教育任务";
  453. // },
  454. /** 修改按钮操作 */
  455. handleDetail(id) {
  456. this.$refs["infoDialog"].show(id, {});
  457. },
  458. /** 培训登记按钮操作 */
  459. handleRecorded(id) {
  460. this.$refs["performDialog"].show(id, {});
  461. },
  462. /** 删除按钮操作 */
  463. handleDelete(id) {
  464. this.$modal
  465. .confirm("删除后不可恢复,是否确认删除该任务?")
  466. .then(function () {
  467. return delDrillTask(id);
  468. })
  469. .then(() => {
  470. this.$modal.msgSuccess("删除成功");
  471. this.getList();
  472. })
  473. .catch(() => {
  474. });
  475. },
  476. /** 评价按钮操作 */
  477. handleEvaluate(id) {
  478. this.$refs["evaluateDialog"].show(id, {});
  479. },
  480. /** 导出按钮操作 */
  481. /*handleExport() {
  482. this.download('system/eduTask/export', {
  483. ...this.queryParams
  484. }, `eduTask_${new Date().getTime()}.xlsx`)
  485. },*/
  486. canEvaluate(row) {
  487. let roleId;
  488. if (row.orgType == 4) {
  489. roleId = 120;
  490. }
  491. if (row.orgType == 3) {
  492. roleId = 118;
  493. }
  494. if (row.orgType == 2 || row.orgType == 1) {
  495. roleId = 116;
  496. }
  497. //仅行社安全保卫管理人员进入且演练任务处于待评价状态才显示
  498. return (
  499. row.status == 2 && this.$store.getters.roleList.some((item) => item.roleId == roleId) && this.isNotOverOrUnStart(row)
  500. );
  501. },
  502. canPerform(row) {
  503. if (row.status != 0 && row.status != 5) return false;
  504. let isCur = row.orgId == this.$store.getters.orgId;
  505. let isOver = this.isNotOverOrUnStart(row);
  506. return isCur && isOver;
  507. /* let flag = 0;
  508. if (!row.taskRoleList) return false;
  509. row.taskRoleList.forEach((taskRole) => {
  510. this.$store.getters.roleList.forEach((role) => {
  511. if (taskRole.roleId == role.roleId) {
  512. flag = 1;
  513. }
  514. });
  515. });
  516. return (flag == 1) && isOver;*/
  517. },
  518. canDelete(row) {
  519. //仅行社安全保卫管理人员进入且演练任务处于待评价状态才显示
  520. return row.orgId == this.$store.getters.orgId && !row.planId;
  521. },
  522. isNotOverOrUnStart(row) {
  523. const currentTime = dayjs().startOf("day"); // 获取当前时间,并将时分秒部分设置为00时00分00秒
  524. const startDate = dayjs(row.startDate).startOf("day"); // 转换开始时间为 Moment.js 对象,并将时分秒部分设置为00时00分00秒
  525. const endDate = dayjs(row.endDate).startOf("day"); // 转换结束时间为 Moment.js 对象,并将时分秒部分设置为00时00分00秒
  526. // console.log("isOverOrUnStart", currentTime, startDate, endDate);
  527. return !(currentTime < startDate || currentTime > endDate);
  528. },
  529. async onDown(pdfUrl) {
  530. // const data = await this.$api.eduTraining.predown(id);
  531. window.open(pdfUrl);
  532. },
  533. handleAddTask(id) {
  534. this.$refs["newTaskDialog"].show(id, {});
  535. },
  536. handleExport() {
  537. this.download(
  538. "core/drill/task/export",
  539. {
  540. ...this.queryParams,
  541. },
  542. `${
  543. this.selectedOrgName
  544. }-${this.$tab.getCurrentTabName()}-${dayjs().format("YYYYMMDD")}.xlsx`
  545. );
  546. },
  547. },
  548. };
  549. </script>